// Path: lib/src/main/java/tk/zielony/randomdata/DataContext.java
// public class DataContext {
// 
//     private static final String LOCALE = "locale";
//     public static final String NAME = "name";
// 
//     protected final List<Map<String, Object>> stack = new ArrayList<>();
// 
//     void save() {
//         HashMap<String, Object> contextData = (HashMap<String, Object>) stack.get(stack.size() - 1);
//         HashMap<String, Object> clone = (HashMap<String, Object>) contextData.clone();
//         stack.add(clone);
//     }
// 
//     public DataContext() {
//         stack.add(new HashMap<>());
//     }
// 
//     void restore() {
//         stack.remove(stack.size() - 1);
//     }
// 
//     public <Type> Type get(String key) {
//         return (Type) stack.get(stack.size() - 1).get(key);
//     }
// 
//     public <Type> void set(String key, Type value) {
//         stack.get(stack.size() - 1).put(key, value);
//     }
// }
// 
// Path: lib/src/main/java/tk/zielony/randomdata/GeneratorWithDuplicates.java
// public abstract class GeneratorWithDuplicates<Type> extends Generator<Type> {
//     private Random random = new Random();
//     private int total;
//     private boolean preventDuplicates;
// 
//     private List<Integer> used, free;
// 
//     public GeneratorWithDuplicates(int total) {
//         this.total = total;
//         preventDuplicates = true;
//         used = new ArrayList<>();
//         free = new ArrayList<>();
//         reset();
//     }
// 
//     public GeneratorWithDuplicates(int total, boolean preventDuplicates) {
//         this.total = total;
//         this.preventDuplicates = preventDuplicates;
//         if (preventDuplicates) {
//             used = new ArrayList<>();
//             free = new ArrayList<>();
//             reset();
//         }
//     }
// 
//     protected int nextIndex() {
//         int index;
//         if (preventDuplicates) {
//             if (free.isEmpty()) {
//                 List<Integer> swap = free;
//                 free = used;
//                 used = swap;
//             }
//             index = free.get(random.nextInt(free.size()));
//             used.add(index);
//         } else {
//             index = random.nextInt(total);
//         }
//         return index;
//     }
// 
//     @Override
//     public void reset() {
//         if (!preventDuplicates)
//             return;
//         for (int i = 0; i < total; i++)
//             free.add(i);
//     }
// }
// 
// Path: lib/src/main/java/tk/zielony/randomdata/Matcher.java
// public interface Matcher {
//     boolean matches(Target target);
// }


import tk.zielony.randomdata.DataContext;
import tk.zielony.randomdata.GeneratorWithDuplicates;
import tk.zielony.randomdata.Matcher;
package tk.zielony.randomdata.food;


public class StringFruitGenerator extends GeneratorWithDuplicates<String> {
    private static String[] fruits = {"Apple", "Apricot", "Avocado", "Banana", "Bilberry", "Blackberry", "Blackcurrant", "Blueberry",
            "Boysenberry", "Currant", "Cherry", "Cherimoya", "Cloudberry", "Coconut", "Cranberry", "Cucumber", "Custard apple",
            "Damson", "Date", "Dragonfruit", "Durian", "Elderberry", "Feijoa", "Fig", "Goji berry", "Gooseberry", "Grape",
            "Raisin", "Grapefruit", "Guava", "Honeyberry", "Huckleberry", "Jabuticaba", "Jackfruit", "Jambul",
            "Jujube", "Juniper berry", "Kiwifruit", "Kumquat", "Lemon", "Lime", "Loquat", "Longan", "Lychee", "Mango",
            "Marionberry", "Melon", "Cantaloupe", "Honeydew", "Watermelon", "Miracle fruit", "Mulberry", "Nectarine",
            "Nance", "Olive", "Orange", "Blood orange", "Clementine", "Mandarine", "Tangerine", "Papaya", "Passionfruit",
            "Peach", "Pear", "Persimmon", "Physalis", "Plantain", "Plum", "Prune", "Pineapple", "Plumcot",
            "Pomegranate", "Pomelo", "Purple mangosteen", "Quince", "Raspberry", "Salmonberry", "Rambutan", "Redcurrant",
            "Salal berry", "Salak", "Satsuma", "Soursop", "Star fruit", "Solanum quitoense", "Strawberry", "Tamarillo",
            "Tamarind", "Ugli fruit", "Yuzu"};

    public StringFruitGenerator() {
        super(fruits.length);
    }

    public StringFruitGenerator(boolean preventDuplicates) {
        super(fruits.length, preventDuplicates);
    }

    @Override
// Path: lib/src/main/java/tk/zielony/randomdata/DataContext.java
// public class DataContext {
// 
//     private static final String LOCALE = "locale";
//     public static final String NAME = "name";
// 
//     protected final List<Map<String, Object>> stack = new ArrayList<>();
// 
//     void save() {
//         HashMap<String, Object> contextData = (HashMap<String, Object>) stack.get(stack.size() - 1);
//         HashMap<String, Object> clone = (HashMap<String, Object>) contextData.clone();
//         stack.add(clone);
//     }
// 
//     public DataContext() {
//         stack.add(new HashMap<>());
//     }
// 
//     void restore() {
//         stack.remove(stack.size() - 1);
//     }
// 
//     public <Type> Type get(String key) {
//         return (Type) stack.get(stack.size() - 1).get(key);
//     }
// 
//     public <Type> void set(String key, Type value) {
//         stack.get(stack.size() - 1).put(key, value);
//     }
// }
// 
// Path: lib/src/main/java/tk/zielony/randomdata/GeneratorWithDuplicates.java
// public abstract class GeneratorWithDuplicates<Type> extends Generator<Type> {
//     private Random random = new Random();
//     private int total;
//     private boolean preventDuplicates;
// 
//     private List<Integer> used, free;
// 
//     public GeneratorWithDuplicates(int total) {
//         this.total = total;
//         preventDuplicates = true;
//         used = new ArrayList<>();
//         free = new ArrayList<>();
//         reset();
//     }
// 
//     public GeneratorWithDuplicates(int total, boolean preventDuplicates) {
//         this.total = total;
//         this.preventDuplicates = preventDuplicates;
//         if (preventDuplicates) {
//             used = new ArrayList<>();
//             free = new ArrayList<>();
//             reset();
//         }
//     }
// 
//     protected int nextIndex() {
//         int index;
//         if (preventDuplicates) {
//             if (free.isEmpty()) {
//                 List<Integer> swap = free;
//                 free = used;
//                 used = swap;
//             }
//             index = free.get(random.nextInt(free.size()));
//             used.add(index);
//         } else {
//             index = random.nextInt(total);
//         }
//         return index;
//     }
// 
//     @Override
//     public void reset() {
//         if (!preventDuplicates)
//             return;
//         for (int i = 0; i < total; i++)
//             free.add(i);
//     }
// }
// 
// Path: lib/src/main/java/tk/zielony/randomdata/Matcher.java
// public interface Matcher {
//     boolean matches(Target target);
// }


// Path: lib/src/main/java/tk/zielony/randomdata/food/StringFruitGenerator.java
import tk.zielony.randomdata.DataContext;
import tk.zielony.randomdata.GeneratorWithDuplicates;
import tk.zielony.randomdata.Matcher;

package tk.zielony.randomdata.food;


public class StringFruitGenerator extends GeneratorWithDuplicates<String> {
    private static String[] fruits = {"Apple", "Apricot", "Avocado", "Banana", "Bilberry", "Blackberry", "Blackcurrant", "Blueberry",
            "Boysenberry", "Currant", "Cherry", "Cherimoya", "Cloudberry", "Coconut", "Cranberry", "Cucumber", "Custard apple",
            "Damson", "Date", "Dragonfruit", "Durian", "Elderberry", "Feijoa", "Fig", "Goji berry", "Gooseberry", "Grape",
            "Raisin", "Grapefruit", "Guava", "Honeyberry", "Huckleberry", "Jabuticaba", "Jackfruit", "Jambul",
            "Jujube", "Juniper berry", "Kiwifruit", "Kumquat", "Lemon", "Lime", "Loquat", "Longan", "Lychee", "Mango",
            "Marionberry", "Melon", "Cantaloupe", "Honeydew", "Watermelon", "Miracle fruit", "Mulberry", "Nectarine",
            "Nance", "Olive", "Orange", "Blood orange", "Clementine", "Mandarine", "Tangerine", "Papaya", "Passionfruit",
            "Peach", "Pear", "Persimmon", "Physalis", "Plantain", "Plum", "Prune", "Pineapple", "Plumcot",
            "Pomegranate", "Pomelo", "Purple mangosteen", "Quince", "Raspberry", "Salmonberry", "Rambutan", "Redcurrant",
            "Salal berry", "Salak", "Satsuma", "Soursop", "Star fruit", "Solanum quitoense", "Strawberry", "Tamarillo",
            "Tamarind", "Ugli fruit", "Yuzu"};

    public StringFruitGenerator() {
        super(fruits.length);
    }

    public StringFruitGenerator(boolean preventDuplicates) {
        super(fruits.length, preventDuplicates);
    }

    @Override
    protected Matcher getDefaultMatcher() {