// Path: jrand-core/src/main/java/me/xdrop/jrand/Generator.java
// public abstract class Generator<T> {
// 
//     private Rand randGen;
// 
//     public Generator() {
//         this.randGen = new Rand();
//     }
// 
//     public Rand random() {
//         return this.randGen;
//     }
// 
//     public abstract T gen();
// 
//     public String repeat(int times) {
//         StringBuilder sb = new StringBuilder();
//         while (times-- > 0) {
//             sb.append(gen());
//         }
//         return sb.toString();
//     }
// 
//     public String genString() {
//         return gen().toString();
//     }
// 
//     public List<T> genMany(int num) {
//         List<T> many = new ArrayList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return many;
//     }
// 
//     public List<T> genManyUnique(int num) {
//         List<T> many = new LinkedList<>();
//         Set<T> present = new HashSet<>();
// 
// 
//         for (int n = 0; n < num; n++) {
//             T gen;
//             do {
//                 gen = gen();
//             } while (present.contains(gen));
//             many.add(gen);
//             present.add(gen);
//         }
// 
//         return many;
//     }
// 
//     public Set<T> genManyAsSet(int num) {
//         List<T> many = new LinkedList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return new HashSet<>(many);
//     }
// 
// }
// 
// Path: jrand-core/src/main/java/me/xdrop/jrand/generators/basics/DecimalGenerator.java
// @Facade(accessor = "decimal")
// public class DecimalGenerator extends Generator<String> {
// 
//     protected Range<Double> range;
//     protected int digits;
//     protected boolean roundUp;
//     protected DoubleGenerator dbl;
// 
//     public DecimalGenerator() {
//         this.roundUp = true;
//         this.dbl = new DoubleGenerator();
//         this.range = Range.from(100.0);
//     }
// 
//     /**
//      * Set the minimum value (inclusive)
//      *
//      * @param min The minimum value
//      * @return The same generator
//      */
//     public DecimalGenerator min(double min) {
//         dbl.min(min);
//         return this;
//     }
// 
//     /**
//      * Sets the maximum value (inclusive)
//      *
//      * @param max The maximum value
//      * @return The same generator
//      */
//     public DecimalGenerator max(double max) {
//         dbl.max(max);
//         return this;
//     }
// 
//     /**
//      * Set a min/max range
//      *
//      * @param min Minimum value to be returned (inclusive)
//      * @param max Maximum value to be returned (inclusive)
//      * @return The same generator
//      */
//     public DecimalGenerator range(double min, double max) {
//         dbl.range(min, max);
//         return this;
//     }
// 
//     /**
//      * Set a min/max range
//      * @param range The range
//      * @return The same generator
//      */
//     public DecimalGenerator range(Range<Double> range) {
//         dbl.range(range);
//         return this;
//     }
// 
//     /**
//      * Sets the number of digits to return
//      *
//      * @param digits Number of digits
//      * @return The same generator
//      */
//     public DecimalGenerator digits(int digits) {
//         this.digits = digits;
//         return this;
//     }
// 
//     /**
//      * Set whether to round up or down
//      *
//      * @param roundUp True for round up, false for round down
//      * @return The same generator
//      */
//     public DecimalGenerator roundUp(boolean roundUp) {
//         this.roundUp = roundUp;
//         return this;
//     }
// 
//     /**
//      * Generate a {@link BigDecimal} as opposed to a String
//      *
//      * @return Return the value as BigDecimal
//      */
//     public BigDecimal genAsDecimal() {
//         double rand = dbl.gen();
//         BigDecimal decimal;
//         if (digits != 0) {
//             if (roundUp) {
//                 decimal = BigDecimal.valueOf(rand).setScale(digits, BigDecimal.ROUND_UP);
//             } else {
//                 decimal = BigDecimal.valueOf(rand).setScale(digits, BigDecimal.ROUND_DOWN);
//             }
//         } else {
//             decimal = BigDecimal.valueOf(rand);
//         }
// 
//         return decimal;
//     }
// 
//     @Override
//     public String gen() {
//         return genAsDecimal().toString();
//     }
// }
// 
// Path: jrand-core/src/main/java/me/xdrop/jrand/model/Range.java
// public class Range<T extends Number> {
//     private T min;
//     private T max;
// 
//     public static <T extends Number> Range<T> from(T min, T max) {
//         return new Range<>(min, max);
//     }
// 
//     public static <T extends Number> Range<T> from(T fixed) {
//         return new Range<>(fixed, fixed);
//     }
// 
//     private Range(T min, T max) {
//         this.min = min;
//         this.max = max;
//     }
// 
//     public boolean isSingle() {
//         return min.equals(max);
//     }
// 
//     public T getMin() {
//         return min;
//     }
// 
//     public T getMax() {
//         return max;
//     }
// 
//     public Range<T> newMin(T min) {
//         return new Range<>(min, max);
//     }
// 
//     public Range<T> newMax(T max) {
//         return new Range<>(min, max);
//     }
// }


import me.xdrop.jrand.Generator;
import me.xdrop.jrand.annotation.Facade;
import me.xdrop.jrand.generators.basics.DecimalGenerator;
import me.xdrop.jrand.model.Range;
package me.xdrop.jrand.generators.location;


@Facade(accessor = "latitude")
public class LatitudeGenerator extends Generator<String> {
    protected Range<Double> range;
    protected int decimals;
    protected DecimalGenerator decimal;

// Path: jrand-core/src/main/java/me/xdrop/jrand/Generator.java
// public abstract class Generator<T> {
// 
//     private Rand randGen;
// 
//     public Generator() {
//         this.randGen = new Rand();
//     }
// 
//     public Rand random() {
//         return this.randGen;
//     }
// 
//     public abstract T gen();
// 
//     public String repeat(int times) {
//         StringBuilder sb = new StringBuilder();
//         while (times-- > 0) {
//             sb.append(gen());
//         }
//         return sb.toString();
//     }
// 
//     public String genString() {
//         return gen().toString();
//     }
// 
//     public List<T> genMany(int num) {
//         List<T> many = new ArrayList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return many;
//     }
// 
//     public List<T> genManyUnique(int num) {
//         List<T> many = new LinkedList<>();
//         Set<T> present = new HashSet<>();
// 
// 
//         for (int n = 0; n < num; n++) {
//             T gen;
//             do {
//                 gen = gen();
//             } while (present.contains(gen));
//             many.add(gen);
//             present.add(gen);
//         }
// 
//         return many;
//     }
// 
//     public Set<T> genManyAsSet(int num) {
//         List<T> many = new LinkedList<>();
//         for (int n = 0; n < num; n++) {
//             many.add(gen());
//         }
//         return new HashSet<>(many);
//     }
// 
// }
// 
// Path: jrand-core/src/main/java/me/xdrop/jrand/generators/basics/DecimalGenerator.java
// @Facade(accessor = "decimal")
// public class DecimalGenerator extends Generator<String> {
// 
//     protected Range<Double> range;
//     protected int digits;
//     protected boolean roundUp;
//     protected DoubleGenerator dbl;
// 
//     public DecimalGenerator() {
//         this.roundUp = true;
//         this.dbl = new DoubleGenerator();
//         this.range = Range.from(100.0);
//     }
// 
//     /**
//      * Set the minimum value (inclusive)
//      *
//      * @param min The minimum value
//      * @return The same generator
//      */
//     public DecimalGenerator min(double min) {
//         dbl.min(min);
//         return this;
//     }
// 
//     /**
//      * Sets the maximum value (inclusive)
//      *
//      * @param max The maximum value
//      * @return The same generator
//      */
//     public DecimalGenerator max(double max) {
//         dbl.max(max);
//         return this;
//     }
// 
//     /**
//      * Set a min/max range
//      *
//      * @param min Minimum value to be returned (inclusive)
//      * @param max Maximum value to be returned (inclusive)
//      * @return The same generator
//      */
//     public DecimalGenerator range(double min, double max) {
//         dbl.range(min, max);
//         return this;
//     }
// 
//     /**
//      * Set a min/max range
//      * @param range The range
//      * @return The same generator
//      */
//     public DecimalGenerator range(Range<Double> range) {
//         dbl.range(range);
//         return this;
//     }
// 
//     /**
//      * Sets the number of digits to return
//      *
//      * @param digits Number of digits
//      * @return The same generator
//      */
//     public DecimalGenerator digits(int digits) {
//         this.digits = digits;
//         return this;
//     }
// 
//     /**
//      * Set whether to round up or down
//      *
//      * @param roundUp True for round up, false for round down
//      * @return The same generator
//      */
//     public DecimalGenerator roundUp(boolean roundUp) {
//         this.roundUp = roundUp;
//         return this;
//     }
// 
//     /**
//      * Generate a {@link BigDecimal} as opposed to a String
//      *
//      * @return Return the value as BigDecimal
//      */
//     public BigDecimal genAsDecimal() {
//         double rand = dbl.gen();
//         BigDecimal decimal;
//         if (digits != 0) {
//             if (roundUp) {
//                 decimal = BigDecimal.valueOf(rand).setScale(digits, BigDecimal.ROUND_UP);
//             } else {
//                 decimal = BigDecimal.valueOf(rand).setScale(digits, BigDecimal.ROUND_DOWN);
//             }
//         } else {
//             decimal = BigDecimal.valueOf(rand);
//         }
// 
//         return decimal;
//     }
// 
//     @Override
//     public String gen() {
//         return genAsDecimal().toString();
//     }
// }
// 
// Path: jrand-core/src/main/java/me/xdrop/jrand/model/Range.java
// public class Range<T extends Number> {
//     private T min;
//     private T max;
// 
//     public static <T extends Number> Range<T> from(T min, T max) {
//         return new Range<>(min, max);
//     }
// 
//     public static <T extends Number> Range<T> from(T fixed) {
//         return new Range<>(fixed, fixed);
//     }
// 
//     private Range(T min, T max) {
//         this.min = min;
//         this.max = max;
//     }
// 
//     public boolean isSingle() {
//         return min.equals(max);
//     }
// 
//     public T getMin() {
//         return min;
//     }
// 
//     public T getMax() {
//         return max;
//     }
// 
//     public Range<T> newMin(T min) {
//         return new Range<>(min, max);
//     }
// 
//     public Range<T> newMax(T max) {
//         return new Range<>(min, max);
//     }
// }


// Path: jrand-core/src/main/java/me/xdrop/jrand/generators/location/LatitudeGenerator.java
import me.xdrop.jrand.Generator;
import me.xdrop.jrand.annotation.Facade;
import me.xdrop.jrand.generators.basics.DecimalGenerator;
import me.xdrop.jrand.model.Range;

package me.xdrop.jrand.generators.location;


@Facade(accessor = "latitude")
public class LatitudeGenerator extends Generator<String> {
    protected Range<Double> range;
    protected int decimals;
    protected DecimalGenerator decimal;

    public LatitudeGenerator() {