code: public static Delay exponential(long lower, long upper, TimeUnit unit, int powersOf) {
  
          LettuceAssert.isTrue(lower >= 0, "Lower boundary must be greater or equal to 0");
          LettuceAssert.isTrue(upper > lower, "Upper boundary must be greater than the lower boundary");
          LettuceAssert.isTrue(powersOf > 1, "PowersOf must be greater than 1");
          LettuceAssert.notNull(unit, "TimeUnit must not be null");
  
          return exponential(Duration.ofNanos(unit.toNanos(lower)), Duration.ofNanos(unit.toNanos(upper)), powersOf, unit);
      }
docs: Creates a new {@link ExponentialDelay} on with custom boundaries and factor (eg. with upper 9000, lower 0, powerOf 10: 1,
  10, 100, 1000, 9000, 9000, 9000, ...).
  
  @param lower the lower boundary, must be non-negative
  @param upper the upper boundary, must be greater than the lower boundary
  @param unit the unit of the delay.
  @param powersOf the base for exponential growth (eg. powers of 2, powers of 10, etc...), must be non-negative and greater
  than 1
  @return a created {@link ExponentialDelay}.