UNPKG

cerceis-lib

Version:

Contains list of quality of life functions that is written in TypeScript and es6

1 lines 238 kB
{"version":3,"sources":["../src/constant/constant.ts","../src/delay/delay.ts","../src/generate/index.ts","../src/is/is.ts","../src/array/index.ts","../src/number/index.ts","../src/object/index.ts","../src/string/index.ts","../src/time/index.ts","../src/fromvector/fromVector.ts","../src/gacha/index.ts","../src/generate/generate.ts","../src/kmeans/kMeans.ts","../src/genetic/genetic.ts","../src/logger/index.ts","../src/obfuscator/obfuscator.ts","../src/sha256/constants.ts","../src/sha256/sha256.ts","../src/validator/locales/en.ts","../src/validator/locales/ja.ts","../src/validator/index.ts"],"sourcesContent":["\nconst gemStones = [\n \"Alexandrite\",\n \"Alexandrite Cats Eye\",\n \"Almandine Garnet\",\n \"Amber\",\n \"Amethyst\",\n \"Amethyst Cabochon\",\n \"Ametrine\",\n \"Ammolite\",\n \"Andalusite\",\n \"Andesine\",\n \"Andesine Labradorite\",\n \"Angel Skin Coral\",\n \"Apatite\",\n \"Apatite Cat's Eye\",\n \"Aquamarine\",\n \"Australian Opal\",\n \"Aventurine\",\n \"Azurite\",\n \"Basra Pearls\",\n \"Beryl\",\n \"Bicolor Sapphire\",\n \"Bixbite\",\n \"Black Onyx\",\n \"Black Opal\",\n \"Black Pearls\",\n \"Black Spinel\",\n \"Black Tourmaline\",\n \"Blizzard Stone\",\n \"Bloodstone\",\n \"Blue Fluorite\",\n \"Blue Moonstone\",\n \"Blue Opal\",\n \"Blue Sapphire\",\n \"Blue Spinel\",\n \"Blue Topaz\",\n \"Blue Tourmaline/Indicolite Tourmaline\",\n \"Blue Zircon\",\n \"Boulder Opal\",\n \"Brazilian Emerald\",\n \"Brown Moonstone\",\n \"Brown Zircon\",\n \"Burmese Ruby\",\n \"Burmese Sapphire\",\n \"Carnelian\",\n \"Cats Eye\",\n \"Cats Eye Moonstone\",\n \"Cats Eye Opal\",\n \"Cats Eye Quartz\",\n \"Ceylon Blue Sapphire \",\n \"Chrome Diopside\",\n \"Chrome Tourmaline\",\n \"Chrysoberyl\",\n \"Chrysoberyl Cat’s Eye\",\n \"Chrysocolla\",\n \"Citrine (Sunela)\",\n \"Clinohumite\",\n \"Colombian Emerald\",\n \"Color Change Fluorite\",\n \"Color Change Sapphire\",\n \"Cornflower Blue Sapphire\",\n \"Cubic Zirconia\",\n \"Cultured Pearls\",\n \"Danburite\",\n \"Demantoid Garnet\",\n \"Diopside\",\n \"Emerald (Panna)\",\n \"Ethiopian Emerald\",\n \"Ethiopian Opal\",\n \"Fire Agate\",\n \"Fire Opal\",\n \"Fluorite\",\n \"Freshwater Pearls\",\n \"Garnet\",\n \"Glass Filled Ruby\",\n \"Golden Sapphire\",\n \"Golden Topaz\",\n \"Goshenite\",\n \"Grandidierite\",\n \"Green Amethyst\",\n \"Green Apatite\",\n \"Green Garnet\",\n \"Green Kyanite\",\n \"Green Sapphire\",\n \"Green Tanzanite\",\n \"Green Tourmaline\",\n \"Grey Sapphire\",\n \"Heliodor\",\n \"Hessonite\",\n \"Imperial Topaz\",\n \"Indian Emerald\",\n \"Indian Ruby\",\n \"Indraneelam\",\n \"Insignificant Oil Emerald\",\n \"Iolite\",\n \"Iranian Turquoise\",\n \"Jade\",\n \"Jade Nephrite\",\n \"Jadeite\",\n \"Japanese Red Coral\",\n \"Jasper\",\n \"Kashmir Blue Sapphire\",\n \"Keshi Pearls\",\n \"Khooni Neelam\",\n \"Kunzite\",\n \"Kyanite\",\n \"Labradorite \",\n \"Lapis Lazuli\",\n \"Lavender Quartz\",\n \"Lemon Quartz\",\n \"London Blue Topaz\",\n \"Malachite\",\n \"Mandarin Garnet\",\n \"Mexican Fire Opal\",\n \"Mocha Scapolite\",\n \"Mogok Ruby \",\n \"Moldavite\",\n \"Monazite\",\n \"Moonstone\",\n \"Morganite\",\n \"Moss Agate\",\n \"Mozambique Ruby\",\n \"Natural Pearls\",\n \"Navratna\",\n \"Neon Apatite\",\n \"No Oil Emerald\",\n \"Obsidian\",\n \"Onyx\",\n \"Opal\",\n \"Opal Doublet\",\n \"Orange Kyanite\",\n \"Orange Sapphire\",\n \"Orthoclase\",\n \"Padparadscha Sapphire\",\n \"Pakistan Emerald/Swat Emerald\",\n \"Panjshir Emerald\",\n \"Paraiba Tourmaline\",\n \"Peach Morganite\",\n \"Peach Sapphire\",\n \"Peacock Tanzanite\",\n \"Pearl\",\n \"Peridot\",\n \"Persian Turquoise\",\n \"Petalite\",\n \"Petrified Wood\",\n \"Pigeon Blood Ruby\",\n \"Pink Coral\",\n \"Pink Fluorite\",\n \"Pink Morganite\",\n \"Pink Opal\",\n \"Pink Sapphire\",\n \"Pink Spinel\",\n \"Pink Topaz\",\n \"Pink Tourmaline\",\n \"Pitambari Neelam\",\n \"Prehnite\",\n \"Purple Garnet\",\n \"Purple Sapphire\",\n \"Rainbow Fluorite\",\n \"Rainbow Moonstone\",\n \"Red Coral\",\n \"Red Spinel\",\n \"Red Tourmaline\",\n \"Red Zircon\",\n \"Rhodochrosite\",\n \"Rhodonite \",\n \"Rose Quartz\",\n \"Royal Blue Sapphire\",\n \"Rubellite\",\n \"Ruby (Manik)\",\n \"Ruby Cabochon\",\n \"Russian Alexandrite\",\n \"Russian Emerald\",\n \"Rutilated Quartz\",\n \"Sang-E-Maryam\",\n \"Sapphire\",\n \"Schorl Tourmaline\",\n \"Serpentine\",\n \"Sillimanite Cats Eye\",\n \"Sky Blue Topaz\",\n \"Smoky Quartz\",\n \"Sodalite\",\n \"South Sea Pearls\",\n \"Spectrolite\",\n \"Spessartite\",\n \"Sphalerite\",\n \"Spinel\",\n \"Sri Lanka Moonstone\",\n \"Star Garnet\",\n \"Star Ruby\",\n \"Star Sapphire\",\n \"Sunstone\",\n \"Swiss Blue Topaz\",\n \"Taaffeite\",\n \"Tahitian Pearls\",\n \"Tanzania Ruby\",\n \"Tanzanite\",\n \"Teal Sapphire\",\n \"Tibetian Turquoise \",\n \"Tiger Eye\",\n \"Titanite\",\n \"Topaz\",\n \"Tourmaline\",\n \"Trapiche Emerald\",\n \"Tsavorite\",\n \"Turquoise\",\n \"Violet Sapphire\",\n \"Vivid Green Emerald\",\n \"Watermelon Tourmaline\",\n \"White Coral\",\n \"White Opal\",\n \"White Sapphire\",\n \"White Topaz\",\n \"White Zircon\",\n \"Yellow Beryl\",\n \"Yellow Fluorite\",\n \"Yellow Sapphire\",\n \"Yellow Topaz\",\n \"Yellow Zircon\",\n \"Zambian Emerald\",\n \"Zircon\",\n \"Zultanite\",\n]\n\nconst colors = [\n \"Baker-Miller pink\",\n \"Bright yellow\",\n \"Amber\",\n \"Atomic tangerine\",\n \"Bisque\",\n \"Candy apple red\",\n \"Baby powder\",\n \"Coquelicot\",\n \"Blanched almond\",\n \"Brilliant rose\",\n \"Bittersweet\",\n \"Cadmium yellow\",\n \"Canary yellow\",\n \"Carnation pink\",\n \"Canary\",\n \"Cherry blossom pink\",\n \"Coral\",\n \"Chinese yellow\",\n \"Chrome yellow\",\n \"Cyber yellow\",\n \"Deep pink\",\n \"Aureolin\",\n \"Banana Mania\",\n \"Cotton candy\",\n \"Cream\",\n \"Cosmic latte\",\n \"Cornsilk\",\n \"Dark orange\",\n \"Deep saffron\",\n \"Floral white\",\n \"Fiery rose\",\n \"French pink\",\n \"Fuchsia\",\n \"French fuchsia\",\n \"Antique white\",\n \"Blond\",\n \"Brink pink\",\n \"Apricot\",\n \"Corn\",\n \"Coral pink\",\n \"Cultured\",\n \"Cameo pink\",\n \"Champagne\",\n \"Flickr Pink\",\n \"Deep champagne\",\n \"Congo pink\",\n \"Champagne pink\",\n \"Baby pink\",\n \"Beige\",\n \"French rose\",\n \"Cyclamen\",\n \"Azure\",\n \"Alice blue\",\n \"Fashion fuchsia\",\n \"Almond\",\n \"Eggshell\",\n \"Dutch white\",\n \"Amaranth pink\",\n \"Buff\",\n \"Desert sand\",\n \"Cadmium orange\",\n \"Arylide yellow\",\n \"Fire opal\",\n \"Alabaster\",\n \"Carrot orange\",\n \"Flax\",\n \"Burnt sienna\",\n \"Cadmium red\",\n \"Dark salmon\",\n \"Flame\",\n \"Bone\",\n \"Amaranth\",\n \"Frostbite\",\n \"Fulvous\",\n \"Charm pink\",\n \"Candy pink\",\n \"Fawn\",\n \"Citrine\",\n \"Cinnabar\",\n \"CG red\",\n \"Crimson\",\n \"Earth yellow\",\n \"China pink\",\n \"Blush\",\n \"Chartreuse\",\n \"Burlywood\",\n \"Cerise\",\n \"Barbie Pink\",\n \"Fandango pink\",\n \"Deep cerise\",\n \"Chocolate\",\n \"Bright lilac\",\n \"Dogwood rose\",\n \"Carmine\",\n \"Copper\",\n \"Amaranth red\",\n \"French mauve\",\n \"Cocoa brown\",\n \"Arctic lime\",\n \"Fire engine red\",\n \"Cedar Chest\",\n \"Camel\",\n \"Burnt orange\",\n \"French raspberry\",\n \"Aero blue\",\n \"Bitter lemon\",\n \"Cinnamon Satin\",\n \"Bright maroon\",\n \"Desert\",\n \"Fuchsia purple\",\n \"English vermillion\",\n \"Antique brass\",\n \"Bronze\",\n \"Electric lime\",\n \"Fuchsia rose\",\n \"Brick red\",\n \"Alloy orange\",\n \"Copper red\",\n \"Cardinal\",\n \"Bitter lime\",\n \"English lavender\",\n \"Celeste\",\n \"Dark khaki\",\n \"Fallow\",\n \"Ecru\",\n \"Bittersweet shimmer\",\n \"Beau blue\",\n \"Black Shadows\",\n \"Electric purple\",\n \"Byzantine\",\n \"Columbia Blue\",\n \"Dark goldenrod\",\n \"Deep chestnut\",\n \"Carnelian\",\n \"African violet\",\n \"Fandango\",\n \"Ash gray\",\n \"Copper penny\",\n \"Auburn\",\n \"Celadon\",\n \"Acid green\",\n \"Amaranth purple\",\n \"Brown sugar\",\n \"Blue bell\",\n \"Firebrick\",\n \"Chinese red\",\n \"English red\",\n \"Café au lait\",\n \"Cadet blue\",\n \"Blizzard blue\",\n \"China rose\",\n \"French beige\",\n \"Blast-off bronze\",\n \"Flirt\",\n \"Android green\",\n \"Cambridge blue\",\n \"Baby blue eyes\",\n \"Cinereous\",\n \"Drab\",\n \"Citron\",\n \"Beaver\",\n \"Cadet grey\",\n \"Burnished brown\",\n \"Big dip o’ruby\",\n \"French lime\",\n \"Amethyst\",\n \"Copper rose\",\n \"Eton blue\",\n \"Bistre brown\",\n \"Dark orchid\",\n \"Dark violet\",\n \"Artichoke\",\n \"Chestnut\",\n \"Antique fuchsia\",\n \"Dark sea green\",\n \"Baby blue\",\n \"Cool grey\",\n \"Dark magenta\",\n \"Cordovan\",\n \"Dark sky blue\",\n \"Apple green\",\n \"Brown\",\n \"Asparagus\",\n \"Brandy\",\n \"Electric violet\",\n \"Blue-violet\",\n \"Burnt umber\",\n \"Dark red\",\n \"French violet\",\n \"French lilac\",\n \"Fuzzy Wuzzy\",\n \"Antique ruby\",\n \"Battleship grey\",\n \"Chinese violet\",\n \"Aero\",\n \"Coyote brown\",\n \"Byzantium\",\n \"Aquamarine\",\n \"French bistre\",\n \"Burgundy\",\n \"Deep taupe\",\n \"Falu red\",\n \"Barn red\",\n \"Claret\",\n \"French sky blue\",\n \"Electric blue\",\n \"Bole\",\n \"Coffee\",\n \"Air superiority blue\",\n \"Bud green\",\n \"Catawba\",\n \"Cornflower blue\",\n \"Electric indigo\",\n \"Eminence\",\n \"Blue-gray\",\n \"Field drab\",\n \"Blood red\",\n \"Cerulean frost\",\n \"Dim gray\",\n \"Bright green\",\n \"Dark blue-gray\",\n \"Cyber grape\",\n \"Caput mortuum\",\n \"Eggplant\",\n \"Dark byzantium\",\n \"Antique bronze\",\n \"Forest green\",\n \"Dark brown\",\n \"Avocado\",\n \"Blue jeans\",\n \"Dark electric blue\",\n \"Dark liver\",\n \"Café noir\",\n \"Emerald\",\n \"Carolina blue\",\n \"Cadet\",\n \"English violet\",\n \"Dark olive green\",\n \"Black coral\",\n \"Blue yonder\",\n \"Ebony\",\n \"Davy's grey\",\n \"Army green\",\n \"Feldgrau\",\n \"Fern green\",\n \"Dark moss green\",\n \"Dark lava\",\n \"Deep Space Sparkle\",\n \"Dark slate blue\",\n \"Black bean\",\n \"Bistre\",\n \"Black olive\",\n \"Bluetiful\",\n \"B'dazzled blue\",\n \"Charcoal\",\n \"Cerulean blue\",\n \"Cosmic cobalt\",\n \"Celadon green\",\n \"Black coffee\",\n \"Amazon\",\n \"Dark sienna\",\n \"Blue\",\n \"Dark slate gray\",\n \"Dark cornflower blue\",\n \"Bleu de France\",\n \"Dark purple\",\n \"Celtic blue\",\n \"Charleston green\",\n \"Dodger blue\",\n \"Blue-green\",\n \"Denim\",\n \"Eerie black\",\n \"Denim blue\",\n \"Flickr Blue\",\n \"Black chocolate\",\n \"English green\",\n \"Brunswick green\",\n \"Cerulean\",\n \"Fluorescent blue\",\n \"Bright navy blue\",\n \"Dark jungle green\",\n \"Dark spring green\",\n \"Egyptian blue\",\n \"Blue sapphire\",\n \"Dark pastel green\",\n \"Absolute Zero\",\n \"Black\",\n \"Cadmium green\",\n \"British racing green\",\n \"Cobalt blue\",\n \"Bottle green\",\n \"Castleton green\",\n \"Aqua\",\n \"Ao\",\n \"Capri\",\n \"Caribbean green\",\n \"CG blue\",\n \"Celadon blue\",\n \"Cyan\",\n \"Dark green\",\n \"Dark cyan\",\n \"Gamboge\",\n \"Dark turquoise\",\n \"Gainsboro\",\n \"Deep jungle green\",\n \"French blue\",\n \"Duke blue\",\n \"Deep sky blue\",\n \"Dartmouth green\",\n \"Erin\",\n \"Electric green\",\n \"Glossy grape\",\n \"Glaucous\",\n \"Ghost white\",\n \"Generic viridian\",\n \"GO green\",\n \"Gold Fusion\",\n \"Gold\",\n \"Green\",\n \"Golden poppy\",\n \"Gray\",\n \"Goldenrod\",\n \"Granite gray\",\n \"Golden yellow\",\n \"Golden brown\",\n \"Granny Smith apple\",\n \"Green-cyan\",\n \"Green-blue\",\n \"Grullo\",\n \"Green Sheen\",\n \"Green-yellow\",\n \"Green Lizard\",\n \"Harlequin\",\n \"Hansa yellow\",\n \"Han purple\",\n \"Han blue\",\n \"Gunmetal\",\n \"Heliotrope\",\n \"Heliotrope gray\",\n \"Harvest gold\",\n \"Hollywood cerise\",\n \"Heat Wave\",\n \"Hot pink\",\n \"Hot magenta\",\n \"Honeydew\",\n \"Honolulu blue\",\n \"Hooker's green\",\n \"Iceberg\",\n \"Illuminating emerald\",\n \"Icterine\",\n \"Imperial red\",\n \"Hunter green\",\n \"Independence\",\n \"Indian yellow\",\n \"India green\",\n \"Inchworm\",\n \"Indian red\",\n \"Indigo dye\",\n \"Indigo\",\n \"International orange\",\n \"International Klein Blue\",\n \"International orange (Golden Gate\",\n \"Iris\",\n \"Ivory\",\n \"Jade\",\n \"Keppel\",\n \"Jungle green\",\n \"Jasmine\",\n \"Kelly green\",\n \"Jet\",\n \"Irresistible\",\n \"Italian sky blue\",\n \"Isabelline\",\n \"Jazzberry jam\",\n \"June bud\",\n \"Jonquil\",\n \"Key lime\",\n \"Khaki (X11)\",\n \"Kobe\",\n \"Khaki\",\n \"Kobi\",\n \"Lapis lazuli\",\n \"Laurel green\",\n \"Lavender blush\",\n \"KSU purple\",\n \"Kobicha\",\n \"Languid lavender\",\n \"Lemon curry\",\n \"Kombu green\",\n \"Lava\",\n \"Lavender\",\n \"Laser lemon\",\n \"Lemon\",\n \"Lavender blue\",\n \"Lavender gray\",\n \"Lawn green\",\n \"Lemon chiffon\",\n \"Lemon yellow\",\n \"Lemon glacier\",\n \"Lemon meringue\",\n \"Light cornflower blue\",\n \"Light gray\",\n \"Light salmon\",\n \"Liberty\",\n \"Light coral\",\n \"Light blue\",\n \"Light yellow\",\n \"Light French beige\",\n \"Light goldenrod yellow\",\n \"Light cyan\",\n \"Light green\",\n \"Light sea green\",\n \"Light orange\",\n \"Light pink\",\n \"Light periwinkle\",\n \"Light steel blue\",\n \"Light sky blue\",\n \"Light slate gray\",\n \"Lilac\",\n \"Lilac Luster\",\n \"Little boy blue\",\n \"Linen\",\n \"Lime\",\n \"Lincoln green\",\n \"Liver\",\n \"Liseran purple\",\n \"Lion\",\n \"Lime green\",\n \"Lime (web)\",\n \"Liver chestnut\",\n \"Livid\",\n \"Macaroni and Cheese\",\n \"Madder Lake\",\n \"Magenta\",\n \"Mahogany\",\n \"Magenta haze\",\n \"Magic mint\",\n \"Magnolia\",\n \"Malachite\",\n \"Maize\",\n \"Majorelle blue\",\n \"Manatee\",\n \"Maroon\",\n \"Mardi Gras\",\n \"Mantis\",\n \"Mango\",\n \"Mandarin\",\n \"Mango Tango\",\n \"Mauve\",\n \"Marigold\",\n \"Maximum blue purple\",\n \"Medium aquamarine\",\n \"Maximum red purple\",\n \"Maximum blue\",\n \"Maximum blue green\",\n \"Medium orchid\",\n \"Mauve taupe\",\n \"Mauvelous\",\n \"Maximum red\",\n \"Maximum green\",\n \"Maximum purple\",\n \"Maximum green yellow\",\n \"Maximum yellow\",\n \"Maya blue\",\n \"May green\",\n \"Maximum yellow red\",\n \"Medium candy apple red\",\n \"Medium carmine\",\n \"Medium blue\",\n \"Medium champagne\",\n \"Medium slate blue\",\n \"Medium sea green\",\n \"Medium purple\",\n \"Medium spring green\",\n \"Medium turquoise\",\n \"Mellow apricot\",\n \"Mellow yellow\",\n \"Melon\",\n \"Medium violet-red\",\n \"Metallic gold\",\n \"Metallic Seaweed\",\n \"Metallic Sunburst\",\n \"Middle blue\",\n \"Middle blue green\",\n \"Mexican pink\",\n \"Middle blue purple\",\n \"Middle green\",\n \"Middle grey\",\n \"Middle purple\",\n \"Middle green yellow\",\n \"Middle yellow\",\n \"Middle red purple\",\n \"Middle red\",\n \"Midnight\",\n \"Middle yellow red\",\n \"Midnight blue\",\n \"Mimi pink\",\n \"Mindaro\",\n \"Mikado yellow\",\n \"Midnight green\",\n \"Mint cream\",\n \"Mint green\",\n \"Mint\",\n \"Minion yellow\",\n \"Ming\",\n \"Morning blue\",\n \"Mode beige\",\n \"Misty moss\",\n \"Moss green\",\n \"Misty rose\",\n \"Mountain Meadow\",\n \"Mountbatten pink\",\n \"Mulberry\",\n \"MSU green\",\n \"Mystic maroon\",\n \"Mystic\",\n \"Mustard\",\n \"Nadeshiko pink\",\n \"Myrtle green\",\n \"Navajo white\",\n \"Navy blue\",\n \"Naples yellow\",\n \"Neon blue\",\n \"Neon green\",\n \"Non-photo blue\",\n \"New York pink\",\n \"Nyanza\",\n \"Nickel\",\n \"Ocean Blue\",\n \"Ochre\",\n \"Ocean green\",\n \"Old gold\",\n \"Old burgundy\",\n \"Old lace\",\n \"Old silver\",\n \"Old rose\",\n \"Old lavender\",\n \"Olive\",\n \"Old mauve\",\n \"Olive Drab\",\n \"Olive green\",\n \"Olivine\",\n \"Orange\",\n \"Olive Drab #7\",\n \"Onyx\",\n \"Opal\",\n \"Opera mauve\",\n \"Orange-red\",\n \"Orange peel\",\n \"Orange-yellow\",\n \"Orchid pink\",\n \"Orange soda\",\n \"Orchid\",\n \"Oxford blue\",\n \"Outrageous Orange\",\n \"Outer space\",\n \"Oxblood\",\n \"Pale aqua\",\n \"Pacific blue\",\n \"Pakistan green\",\n \"OU Crimson red\",\n \"Palatinate purple\",\n \"Pale spring bud\",\n \"Pale pink\",\n \"Pale silver\",\n \"Pale purple\",\n \"Pale cerulean\",\n \"Paolo Veronese green\",\n \"Pansy purple\",\n \"Paradise pink\",\n \"Paris Green\",\n \"Papaya whip\",\n \"Pastel pink\",\n \"Peach\",\n \"Payne's grey\",\n \"Patriarch\",\n \"Peach puff\",\n \"Pear\",\n \"Pearly purple\",\n \"Periwinkle\",\n \"Permanent Geranium Lake\",\n \"Persian green\",\n \"Persian orange\",\n \"Persian indigo\",\n \"Persian blue\",\n \"Pine green\",\n \"Persian plum\",\n \"Persian rose\",\n \"Persian red\",\n \"Pewter Blue\",\n \"Persian pink\",\n \"Phlox\",\n \"Persimmon\",\n \"Phthalo green\",\n \"Picotee blue\",\n \"Pink\",\n \"Phthalo blue\",\n \"Pictorial carmine\",\n \"Piggy pink\",\n \"Pine tree\",\n \"Pistachio\",\n \"Prussian blue\",\n \"Pink Sherbet\",\n \"Pink flamingo\",\n \"Powder blue\",\n \"Pink lavender\",\n \"Pink lace\",\n \"Platinum\",\n \"Plum\",\n \"Polished Pine\",\n \"Plump Purple\",\n \"Prune\",\n \"Portland Orange\",\n \"Psychedelic purple\",\n \"Princeton orange\",\n \"Pomp and Power\",\n \"Popstar\",\n \"Puce\",\n \"Pullman Brown\",\n \"Pumpkin\",\n \"Purple pizzazz\",\n \"Purple navy\",\n \"Purple\",\n \"Purple Plum\",\n \"Purpureus\",\n \"Purple mountain majesty\",\n \"Queen pink\",\n \"Raspberry glace\",\n \"Raisin black\",\n \"Quick Silver\",\n \"Quinacridone magenta\",\n \"Queen blue\",\n \"Radical Red\",\n \"Raspberry\",\n \"Rajah\",\n \"Razzle dazzle rose\",\n \"Raspberry rose\",\n \"Rebecca Purple\",\n \"Raw Sienna\",\n \"Red\",\n \"Raw umber\",\n \"Razzmatazz\",\n \"Razzmic Berry\",\n \"Red-orange\",\n \"Red-violet\",\n \"Red Salsa\",\n \"Red-purple\",\n \"Redwood\",\n \"Resolution blue\",\n \"Rhythm\",\n \"Rich black\",\n \"Rose pink\",\n \"Rose bonbon\",\n \"Rose\",\n \"Rose ebony\",\n \"Roman silver\",\n \"Robin egg blue\",\n \"Rose Dust\",\n \"Rifle green\",\n \"Rocket metallic\",\n \"Rose quartz\",\n \"Rose madder\",\n \"Rose red\",\n \"Rose taupe\",\n \"Russet\",\n \"Rubine red\",\n \"Ruber\",\n \"Royal yellow\",\n \"Russian green\",\n \"Royal blue\",\n \"Rufous\",\n \"Rosso corsa\",\n \"Rose vale\",\n \"Rosewood\",\n \"Rosy brown\",\n \"Royal purple\",\n \"Ruby\",\n \"Ruby red\",\n \"Rusty red\",\n \"Sacramento State green\",\n \"Russian violet\",\n \"Rust\",\n \"Saddle brown\",\n \"Saffron\",\n \"Sage\",\n \"Safety yellow\",\n \"Safety orange\",\n \"Sand dune\",\n \"Sapphire\",\n \"Salmon pink\",\n \"Salmon\",\n \"Salmon Magistrate\",\n \"St. Patrick's blue\",\n \"Sand\",\n \"Sap green\",\n \"Sapphire blue\",\n \"Scarlet\",\n \"Schauss pink\",\n \"Sandy brown\",\n \"Satin sheen gold\",\n \"School bus yellow\",\n \"Shocking pink\",\n \"Sea green\",\n \"Shadow blue\",\n \"Seashell\",\n \"Silver\",\n \"Screamin' Green\",\n \"Seal brown\",\n \"Shamrock green\",\n \"Shadow\",\n \"Sepia\",\n \"Selective yellow\",\n \"Shiny Shamrock\",\n \"Shimmering Blush\",\n \"Sheen green\",\n \"Sienna\",\n \"Sinopia\",\n \"Sizzling Red\",\n \"Silver chalice\",\n \"Silver sand\",\n \"Silver pink\",\n \"Sky magenta\",\n \"Skobeloff\",\n \"Sizzling Sunrise\",\n \"Sky blue\",\n \"Smoky black\",\n \"Slimy green\",\n \"Slate gray\",\n \"Slate blue\",\n \"Smitten\",\n \"Spanish bistre\",\n \"Solid pink\",\n \"Sonic silver\",\n \"Space cadet\",\n \"Snow\",\n \"Spanish orange\",\n \"Spanish blue\",\n \"Spanish carmine\",\n \"Spanish gray\",\n \"Spanish green\",\n \"Spanish pink\",\n \"Spanish sky blue\",\n \"Spring green\",\n \"Steel pink\",\n \"Steel Teal\",\n \"Straw\",\n \"Spanish red\",\n \"Spring bud\",\n \"Spring Frost\",\n \"Spanish viridian\",\n \"Spanish violet\",\n \"Steel blue\",\n \"Star command blue\",\n \"Stil de grain yellow\",\n \"Sunglow\",\n \"Sunray\",\n \"Sugar Plum\",\n \"Super pink\",\n \"Sunset\",\n \"Tango pink\",\n \"Tan\",\n \"Tangerine\",\n \"Taupe\",\n \"Tart Orange\",\n \"Tea rose\",\n \"Sweet Brown\",\n \"Taupe gray\",\n \"Tea green\",\n \"Tenné\",\n \"Telemagenta\",\n \"Teal\",\n \"Teal blue\",\n \"Tiffany Blue\",\n \"Tomato\",\n \"Tuscan\",\n \"Tumbleweed\",\n \"Thistle\",\n \"Tickle Me Pink\",\n \"Thulian pink\",\n \"Terra cotta\",\n \"Timberwolf\",\n \"Tropical rain forest\",\n \"Titanium yellow\",\n \"True Blue\",\n \"Turquoise\",\n \"Trypan Blue\",\n \"Tufts blue\",\n \"Turquoise blue\",\n \"Tuscan brown\",\n \"Turtle green\",\n \"Tuscan red\",\n \"Turquoise green\",\n \"Tuscany\",\n \"Ultra pink\",\n \"Unmellow yellow\",\n \"USAFA blue\",\n \"UA blue\",\n \"Twilight lavender\",\n \"Tuscan tan\",\n \"Tyrian purple\",\n \"Ultramarine\",\n \"UA red\",\n \"Ultramarine blue\",\n \"Ultra red\",\n \"Van Dyke brown\",\n \"Unbleached silk\",\n \"Umber\",\n \"United Nations blue\",\n \"Upsdell red\",\n \"UP Forest green\",\n \"Uranian blue\",\n \"UP maroon\",\n \"Vanilla\",\n \"Venetian red\",\n \"Violet\",\n \"Vanilla ice\",\n \"Verdigris\",\n \"Vermilion\",\n \"Veronica\",\n \"Vegas gold\",\n \"Vivid burgundy\",\n \"Viridian green\",\n \"Violet-blue\",\n \"Violet-red\",\n \"Vivid sky blue\",\n \"Viridian\",\n \"Volt\",\n \"Xanthic\",\n \"Wine dregs\",\n \"Wild orchid\",\n \"Wheat\",\n \"Warm black\",\n \"Vivid violet\",\n \"Vivid tangerine\",\n \"White\",\n \"Wild blue yonder\",\n \"Wild Strawberry\",\n \"Wild watermelon\",\n \"Windsor tan\",\n \"Wine\",\n \"Winter Sky\",\n \"Wintergreen Dream\",\n \"Wisteria\",\n \"Xanadu\",\n \"Wood brown\",\n \"Xiketic\",\n \"Yellow\",\n \"Yale Blue\",\n \"Zomp\",\n \"YInMn Blue\",\n \"Zaffre\",\n \"Yellow-green\",\n \"Yellow Sunshine\",\n \"Yellow Orange\",\n]\n\n\nexport const Constant = {\n gemStones: gemStones,\n colors: colors,\n}\n\n","/**\n * An async delay. Ex) await delay(1000);\n * @param ms Delay duration in milisecond\n */\nexport const Delay = (ms: number): Promise<void> => {\n return new Promise((resolve)=>{\n setTimeout(()=>{\n resolve();\n }, ms);\n })\n}","import type { AlphabateOptions } from './types';\n\ninterface GenerateArrayOptions {\n min?: number;\n max?: number;\n}\n\nexport const Generate = {\n /**\n * Generate a random alphanumeric string of a given length.\n * @param len Length of the string (default 4).\n */\n alphanum(len: number = 4): string {\n const chars = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n let result = \"\";\n for (let i = 0; i < len; i++)\n result += chars[Math.floor(Math.random() * chars.length)];\n return result;\n },\n /**\n * Generate a MongoDB-style ObjectId.\n */\n objectId(): string {\n return (\n (Date.now() / 1000 | 0).toString(16) +\n \"xxxxxxxxxxxxxxxx\".replace(/x/g, () => (Math.random() * 16 | 0).toString(16))\n );\n },\n /**\n * Generate a random integer in [min, max). Includes min, excludes max.\n */\n int(min: number, max: number): number {\n return Math.floor(Math.random() * (max - min)) + min;\n },\n /**\n * Generate a random float in [min, max).\n */\n random(min: number, max: number): number {\n return Math.random() * (max - min) + min;\n },\n /**\n * Generate an array of random integers.\n * @param len Length of the array.\n * @param ops min/max bounds for each integer (default min=0, max=11).\n */\n array(len: number, ops: GenerateArrayOptions = {}): number[] {\n const { min = 0, max = 11 } = ops;\n return Array.from({ length: len }, () => this.int(min, max));\n },\n /**\n * Generate a random alphabetic string.\n * @param len Length of the string (default 5).\n * @param options lowercase/uppercase toggles.\n */\n alphabate(len: number = 5, options: AlphabateOptions = {}): string {\n const op: AlphabateOptions = { lowercase: true, uppercase: true, ...options };\n const lower = \"abcdefghijklmnopqrstuvwxyz\";\n const upper = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n const pool = (op.lowercase ? lower : \"\") + (op.uppercase ? upper : \"\");\n let result = \"\";\n for (let i = 0; i < len; i++)\n result += pool[Math.floor(Math.random() * pool.length)];\n return result;\n },\n /** @returns Current date as \"YYYY-MM-DD\" */\n currentDate(): string {\n const t = new Date();\n return `${t.getFullYear()}-${t.getMonth() + 1}-${t.getDate()}`;\n },\n /** @returns Current time as \"HH:mm:ss\" */\n currentTime(): string {\n const t = new Date();\n return [t.getHours(), t.getMinutes(), t.getSeconds()]\n .map((v) => String(v).padStart(2, \"0\"))\n .join(\":\");\n },\n /** @returns Current datetime as \"YYYY-MM-DD HH:mm:ss\" */\n currentDateTime(): string {\n const t = new Date();\n const time = [t.getHours(), t.getMinutes(), t.getSeconds()]\n .map((v) => String(v).padStart(2, \"0\"))\n .join(\":\");\n return `${t.getFullYear()}-${t.getMonth() + 1}-${t.getDate()} ${time}`;\n },\n /**\n * Generate a list of date strings matching specified days of the week.\n * @param f From date \"YYYY-MM-DD\"\n * @param t To date \"YYYY-MM-DD\"\n * @param days Day indices 0–6 (Sunday=0, Saturday=6)\n */\n listOfDateOfDays(f: string, t: string, days: number[]): string[] {\n const to = new Date(t).toISOString();\n const cursor = new Date(f);\n const rs: string[] = [];\n while (cursor.toISOString() <= to) {\n if (days.includes(cursor.getDay()))\n rs.push(cursor.toISOString().slice(0, 10));\n cursor.setDate(cursor.getDate() + 1);\n }\n return rs;\n },\n /**\n * Fast RFC4122 v4 UUID generator.\n * @author Jeff Ward (jcward.com) — MIT license\n */\n uuidv4(): string {\n const lut: string[] = [];\n for (let i = 0; i < 256; i++) lut[i] = (i < 16 ? \"0\" : \"\") + i.toString(16);\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n return (\n lut[d0 & 0xff] + lut[d0 >> 8 & 0xff] + lut[d0 >> 16 & 0xff] + lut[d0 >> 24 & 0xff] + \"-\" +\n lut[d1 & 0xff] + lut[d1 >> 8 & 0xff] + \"-\" +\n lut[d1 >> 16 & 0x0f | 0x40] + lut[d1 >> 24 & 0xff] + \"-\" +\n lut[d2 & 0x3f | 0x80] + lut[d2 >> 8 & 0xff] + \"-\" +\n lut[d2 >> 16 & 0xff] + lut[d2 >> 24 & 0xff] +\n lut[d3 & 0xff] + lut[d3 >> 8 & 0xff] + lut[d3 >> 16 & 0xff] + lut[d3 >> 24 & 0xff]\n );\n },\n};\n","export const Is = {\n object: ( x: any ): boolean => Object.prototype.toString.call(x) === \"[object Object]\",\n emptyObject: ( x: Object ): boolean =>{\n if(!Is.object(x)) return false;\n for(let i in x) return false;\n return true;\n },\n string:(x: any): boolean => (typeof x === 'string' || x instanceof String),\n emptyString:(x: any) =>{\n if(!Is.string(x)) return false;\n for(let i in x) return false;\n return true;\n },\n number: (x: any): boolean => Object.prototype.toString.call(x) === \"[object Number]\",\n boolean: ( x: any ): boolean => Object.prototype.toString.call(x) === \"[object Boolean]\",\n array:(x:any): boolean => Array.isArray(x),\n null:(x: any): boolean => x === null,\n undefined:(x: undefined): boolean => x === undefined,\n falseValue:(x: any): boolean =>{\n let emptyCount: number = 0;\n if(Is.emptyString(x))emptyCount++;\n if(Is.number(x) && x === 0)emptyCount++;\n if(Is.null(x)) emptyCount++;\n if(Is.undefined(x)) emptyCount++;\n if(Is.boolean(x) && x === false) emptyCount++;\n return emptyCount > 0 ? true: false;\n },\n email:(x: string): boolean =>{\n if(!x) return false;\n if(!/.+@.+\\..+/.test(x)) return false;\n return true;\n },\n alphanumeric:(x: string): boolean => {\n if(!x) return false;\n const alphanumeric = /^[0-9a-zA-Z]+$/;\n if(!alphanumeric.test(x)) return false;\n return true;\n },\n UUIDv4:(x: string): boolean => {\n\t\tif(!x) return false;\n const uuidv4 = /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i;\n if(!uuidv4.test(x)) return false;\n return true;\n\t},\n\tsameAs: (x: any, y: any): boolean => {\n if(x === y) return true;\n return false;\n\t},\n noSpecials:(\n x: string,\n space: boolean = true, //true = allow space\n extendJpn: boolean | null = false\n ): boolean => {\n if(!x) return true;\n let format = /[`!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?~]/;\n if(!space) format = /[ `!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?~]/;\n if(extendJpn) format = /[`!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?~`!@#$%^&*()_+ー=「」『』;’:”\|、。<>・?〜]/;\n if(!space && extendJpn) format = /[ `!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?~ `!@#$%^&*()_+ー=「」『』;’:”\|、。<>・?〜]/;\n if(format.test(x)) return false;\n return true;\n },\n aFunction(x: any): boolean {\n return Object.prototype.toString.call(x) == '[object Function]';\n }\n}","export const FromArray = {\n /**\n * Returns one or more random elements from an array.\n * @param arr Input array.\n * @param noOfResult Number of results to return (default 1).\n * @param returnIndex Return index positions instead of values.\n */\n getRandom<T>(arr: T[], noOfResult: number = 1, returnIndex: boolean = false): T[] | number[] {\n if (!Array.isArray(arr)) throw new Error(\"Input must be an array\");\n if (returnIndex) {\n const result: number[] = [];\n for (let i = 0; i < noOfResult; i++)\n result.push(Math.floor(Math.random() * arr.length));\n return result;\n }\n const result: T[] = [];\n for (let i = 0; i < noOfResult; i++)\n result.push(arr[Math.floor(Math.random() * arr.length)]);\n return result;\n },\n /**\n * Find and return the largest N numbers.\n * @param numbers Array of numbers.\n * @param n Number of results to return (default 1).\n * @param returnIndex Return indices instead of values.\n */\n getLargest(numbers: number[], n: number = 1, returnIndex: boolean = false): number[] {\n const results: number[] = [];\n if (returnIndex) {\n const indexed = numbers.map((v, i) => ({ v, i })).sort((a, b) => b.v - a.v);\n for (let i = 0; i < n && i < indexed.length; i++) results.push(indexed[i].i);\n } else {\n const sorted = [...numbers].sort((a, b) => b - a);\n for (let i = 0; i < n && i < sorted.length; i++) results.push(sorted[i]);\n }\n return results;\n },\n /**\n * Find and return the smallest N numbers.\n * @param numbers Array of numbers.\n * @param n Number of results to return (default 1).\n * @param returnIndex Return indices instead of values.\n */\n getSmallest(numbers: number[], n: number = 1, returnIndex: boolean = false): number[] {\n const results: number[] = [];\n if (returnIndex) {\n const indexed = numbers.map((v, i) => ({ v, i })).sort((a, b) => a.v - b.v);\n for (let i = 0; i < n && i < indexed.length; i++) results.push(indexed[i].i);\n } else {\n const sorted = [...numbers].sort((a, b) => a - b);\n for (let i = 0; i < n && i < sorted.length; i++) results.push(sorted[i]);\n }\n return results;\n },\n /**\n * Return the intersection of two arrays.\n * @param arrA Array A.\n * @param arrB Array B.\n * @param duplicated Include duplicate matches.\n */\n getIntersect<T>(arrA: T[], arrB: T[], duplicated: boolean = false): T[] {\n const seen = new Map<string, number>();\n const result: T[] = [];\n for (const item of arrA) seen.set(String(item), 1);\n for (const item of arrB) {\n const key = String(item);\n if (seen.has(key)) {\n if (!duplicated && seen.get(key) === 1) {\n result.push(item);\n seen.set(key, 2);\n } else if (duplicated) {\n result.push(item);\n }\n }\n }\n return result;\n },\n /**\n * Randomly shuffle an array in-place (Fisher-Yates).\n * @param arr Array to shuffle.\n */\n shuffle<T>(arr: T[]): T[] {\n let currentIndex = arr.length;\n while (currentIndex !== 0) {\n const randomIndex = Math.floor(Math.random() * currentIndex);\n currentIndex--;\n [arr[currentIndex], arr[randomIndex]] = [arr[randomIndex], arr[currentIndex]];\n }\n return arr;\n },\n /**\n * The Thanos snap — removes roughly half the elements randomly.\n * Mutates the original array.\n * @param arr Input array.\n */\n thanosSnap<T>(arr: T[]): T[] {\n const targetLen = arr.length % 2 === 0 ? arr.length / 2 : (arr.length - 1) / 2;\n while (arr.length !== targetLen)\n arr.splice(Math.floor(Math.random() * arr.length), 1);\n return arr;\n },\n /**\n * Convert a 2D array ([[key, value], ...]) into an object.\n * @param arr Input 2D array.\n */\n toObject<V>(arr: [string | number, V][]): Record<string | number, V> {\n const obj: Record<string | number, V> = {};\n for (const [k, v] of arr) obj[k] = v;\n return obj;\n },\n /**\n * Split an array into groups by ratio.\n * ex) [1,2,3,4] split [1,3] → {1:[1], 2:[2,3,4]}\n * Remainder goes into \"extra\" if it doesn't fit.\n * @param arr Array to split.\n * @param ratio Ratio to split into.\n */\n splitInto<T>(arr: T[], ratio: number[]): Record<string, T[]> {\n if (ratio.length === 0) return { 1: arr };\n const filtered = ratio.filter((r) => r !== 0 && !isNaN(r));\n const unitLen = Math.floor((1 / filtered.reduce((a, b) => a + b)) * arr.length);\n const rs: Record<string, T[]> = {};\n let group = 1;\n let offset = 0;\n for (const r of ratio) {\n const len = r * unitLen;\n rs[group] = arr.slice(offset, offset + len);\n offset += rs[group].length;\n group++;\n }\n if (offset < arr.length) rs[\"extra\"] = arr.slice(offset);\n return rs;\n },\n /**\n * Log array elements to console, optionally limited to a range.\n * @param arr Array to log.\n * @param from Starting index (inclusive), default 0.\n * @param to Ending index (exclusive), default arr.length.\n */\n log<T>(arr: T[], from: number = 0, to: number = arr.length): void {\n for (let i = from; i < to; i++) console.log(arr[i]);\n },\n};\n","export const FromNum = {\n /**\n * A generic roll. Anything larger than 100 will be true,\n * lesser than 0 will be false.\n * @param percentage 0~100\n * @returns Fail(false)/Success(true)\n */\n roll(percentage: number): boolean {\n const fixed = percentage / 100;\n if (fixed >= Math.random()) return true;\n return false;\n },\n /**\n * Dice roll for your typical TRPG game.\n * Ex) FromNum.diceRoll(3).D(20) = Roll 3 D20 Dice.\n * Ex) FromNum.diceRoll(1).D(6) = Roll 1 D6 Dice.\n * @param num Number of dice to roll\n */\n diceRoll(num: number) {\n const _roll = (sides: number): number => Math.floor(Math.random() * sides) + 1;\n return {\n /**\n * @param diceType Type of dice (e.g. 6, 10, 20).\n * @returns number[]\n */\n D: (diceType: number): number[] => {\n const rs: number[] = [];\n for (let i = 0; i < num; i++) rs.push(_roll(diceType));\n return rs;\n },\n };\n },\n /**\n * Scale number down to 0 ~ 1.\n * @param x Input number\n * @param min Min number\n * @param max Max number\n */\n minMaxScale(x: number, min: number, max: number): number {\n return (x - min) / (max - min);\n },\n /**\n * Return scaled down number back to normal.\n * @param x Input number\n * @param min Min number\n * @param max Max number\n */\n unMinMaxScale(x: number, min: number, max: number): number {\n return (x * (max - min)) + min;\n },\n /**\n * Return the sum of the values.\n * @param nums Array of numbers\n */\n sum(nums: number[]): number {\n return nums.reduce((a, b) => a + b);\n },\n /**\n * SoftMax / normalized exponential function.\n * Returns a probability distribution of K possible outcomes.\n * @param input Array of numbers\n */\n softMax(input: number[]): number[] {\n if (input.length === 0) return [];\n const total = input.reduce((a, b) => a + Math.exp(b), 0);\n return input.map((n) => Math.exp(n) / total);\n },\n /**\n * Return the arithmetic mean of a list of numbers.\n * @param input Array of numbers\n */\n mean(input: number[]): number {\n if (input.length === 0) return 0;\n return input.reduce((a, b) => a + b, 0) / input.length;\n },\n /**\n * Convert numeric values into Roman Numeral string.\n * @param number Input number.\n */\n toRomanNumeral(number: number): string {\n const strMap: Record<string, number> = {\n M: 1000, CM: 900, D: 500, CD: 400,\n C: 100, XC: 90, L: 50, XL: 40,\n X: 10, IX: 9, V: 5, IV: 4, I: 1,\n };\n let input = number;\n let rs = \"\";\n for (const n in strMap) {\n const tmp = Math.floor(input / strMap[n]);\n for (let i = 0; i < tmp; i++) rs += n;\n input -= tmp * strMap[n];\n }\n return rs;\n },\n /**\n * Sigmoid function — bounded, differentiable, defined for all real inputs.\n * @param x number or number[]\n */\n sigmoid(x: number | number[]): number | number[] {\n const _f = (_x: number) => 1 / (1 + Math.exp(-_x));\n if (Array.isArray(x)) return x.map((n) => _f(n));\n return _f(x);\n },\n /**\n * ReLU (Rectified Linear Unit) — f(x) = max(0, x).\n * Outputs input directly if positive, otherwise zero.\n * @param xs number[]\n */\n relu(xs: number[]): number[] {\n return xs.map((x) => Math.max(0, x));\n },\n /**\n * Softplus — smooth version of ReLU. f(x) = log(1 + exp(x))\n * @param xs number[]\n */\n softPlus(xs: number[]): number[] {\n return xs.map((x) => Math.log(1 + Math.exp(x)));\n },\n /**\n * Round number to nearest specified multiple.\n * @param n Number to round\n * @param r Multiple to round to\n */\n toNearest(n: number, r: number): number {\n return Math.round(n / r) * r;\n },\n /**\n * Convert number into a short readable string.\n * Does not round when truncating decimals.\n * @param n Input number\n * @param decimal Default = 2, number of decimal places to retain.\n * @param maxLen Default = 3, maximum digit length (overwrites decimal).\n */\n toShortReadable(n: number, decimal: number = 2, maxLen: number = 3): string {\n const symbols: Record<string, number> = { \"\": 0, k: 1_000, m: 1_000_000 };\n let symbol = \"\";\n for (const s in symbols) {\n if (symbols[s] > n) break;\n symbol = s;\n }\n if (symbol === \"\") return `${n}`;\n const divided = (n / symbols[symbol]).toFixed(decimal).split(\"\");\n while (divided.length > maxLen + 1) divided.pop(); // +1 for \".\"\n while (divided.at(-1) === \"0\") divided.pop(); // trim trailing zeros\n if (divided.at(-1) === \".\") divided.pop(); // trim trailing dot\n return `${divided.join(\"\")}${symbol}`;\n },\n};\n","type PlainObject = Record<string, unknown>;\n\nconst _isObj = (x: unknown): x is PlainObject =>\n Object.prototype.toString.call(x) === \"[object Object]\";\n\nconst _isNumber = (x: unknown): x is number =>\n Object.prototype.toString.call(x) === \"[object Number]\";\n\nexport const FromObject = {\n /**\n * Convert an object into a 2D array ([[key, value], ...]).\n * @param inputObj Input object.\n */\n ObjectToArray(inputObj: Record<string | number, unknown>): [string, unknown][] {\n return Object.keys(inputObj).map((key) => [key, inputObj[key]]);\n },\n /**\n * Flatten a multi-level object into a single level.\n * Duplicate keys are given a generated ID when overwriteKey is false.\n * @param obj Object to flatten.\n * @param overwriteKey Overwrite duplicate keys (default false).\n */\n flatten(obj: object, overwriteKey: boolean = false): Record<string, unknown> {\n if (Object.keys(obj).length === 0) return {};\n const rs: Record<string, unknown> = {};\n const genId = (): string =>\n (Date.now() / 1000 | 0).toString(16) +\n \"xxxxxxxxxxxxxxxx\".replace(/x/g, () => (Math.random() * 16 | 0).toString(16));\n\n const recurse = (o: object): void => {\n for (const key in o) {\n const val = (o as Record<string, unknown>)[key];\n if (_isObj(val)) {\n recurse(val);\n } else if (key in rs && !overwriteKey) {\n rs[genId()] = val;\n } else {\n rs[key] = val;\n }\n }\n };\n recurse(obj);\n return rs;\n },\n /**\n * Find and return the deepest nested object.\n * Returns the first deepest object found; or all if multi = true.\n * @param obj Input object.\n * @param multi Return all objects at the deepest level.\n */\n getDeepest(obj: object, multi: boolean = false): object | object[] {\n if (Object.keys(obj).length === 0) return {};\n let deepest = 0;\n let rs: object = {};\n const rsMulti: Record<number, object[]> = {};\n\n const recurse = (o: object, depth: number = 0): void => {\n depth++;\n if (depth > deepest) {\n deepest = depth;\n rs = o;\n if (multi) rsMulti[depth] = [o];\n } else if (depth === deepest && multi) {\n if (!rsMulti[depth]) rsMulti[depth] = [];\n rsMulti[depth].push(o);\n }\n for (const key in o) {\n const val = (o as Record<string, unknown>)[key];\n if (_isObj(val)) recurse(val, depth);\n }\n };\n recurse(obj);\n return multi ? (rsMulti[deepest] ?? []) : rs;\n },\n /**\n * Sum all numeric values in an object (supports single-level nesting via field).\n * @param obj Input object.\n * @param field Target field when values are nested objects.\n */\n sumAll(obj: object, field: string = \"\"): number {\n let sum = 0;\n for (const prop in obj) {\n const raw = (obj as Record<string, unknown>)[prop];\n const t = field !== \"\" ? (raw as Record<string, unknown>)[field] : raw;\n if (!_isNumber(t)) throw new Error(`Value of property \"${prop}\" is not a number.`);\n sum += t;\n }\n return sum;\n },\n /**\n * Find the maximum numeric value in an object.\n * @param obj Input object.\n * @param field Target field when values are nested objects.\n */\n max(obj: object, field: string = \"\"): number {\n let max = -Infinity;\n for (const prop in obj) {\n const raw = (obj as Record<string, unknown>)[prop];\n const t = field !== \"\" ? (raw as Record<string, unknown>)[field] : raw;\n if (!_isNumber(t)) throw new Error(`Value of property \"${prop}\" is not a number.`);\n if (t > max) max = t;\n }\n return max;\n },\n /**\n * Find the minimum numeric value in an object.\n * @param obj Input object.\n * @param field Target field when values are nested objects.\n */\n min(obj: object, field: string = \"\"): number | null {\n let min: number | null = null;\n for (const prop in obj) {\n const raw = (obj as Record<string, unknown>)[prop];\n const t = field !== \"\" ? (raw as Record<string, unknown>)[field] : raw;\n if (!_isNumber(t)) throw new Error(`Value of property \"${prop}\" is not a number.`);\n if (min === null || t < min) min = t;\n }\n return min;\n },\n};\n","export const FromString = {\n /**\n * Copy string to clipboard.\n * Only works in browser environments — silently does nothing in Node.js.\n * @param textToCopy Text to copy.\n */\n copyToClipboard(textToCopy: string): void {\n if (typeof navigator === \"undefined\") return;\n navigator.clipboard.writeText(textToCopy);\n },\n /**\n * Replace the first N characters with the given string.\n * Does not mutate — returns a new string.\n * @param n First N characters to replace (starts from 1)\n * @param w Replacement string (must have length === n)\n * @param str Input string\n */\n replaceFirst(n: number, w: string, str: string): string {\n try {\n if (n !== w.length) throw \"Length of replacement and target slot must be equal.\";\n return `${w}${str.slice(n)}`;\n } catch (err) {\n console.log(`FromString.replaceFirst: ${err}`);\n return \"\";\n }\n },\n /**\n * Replace the last N characters with the given string.\n * Does not mutate — returns a new string.\n * @param n Last N characters to replace (starts from 1)\n * @param w Replacement string (must have length === n)\n * @param str Input string\n */\n replaceLast(n: number, w: string, str: string): string {\n try {\n if (n !== w.length) throw \"Length of replacement and target slot must be equal.\";\n return `${str.slice(0, str.length - n)}${w}`;\n } catch (err) {\n console.log(`FromString.replaceLast: ${err}`);\n return \"\";\n }\n },\n /**\n * Parse an HTTP cookie string into a key/value object.\n * @param cookie Raw cookie string\n */\n parseCookies(cookie: string): Record<string, string> {\n const list: Record<string, string> = {};\n cookie.split(\";\").forEach((part) => {\n const parts = part.split(\"