{ "version": 3, "sources": ["../../../sim/dex.ts"], "sourcesContent": ["/**\r\n * Dex\r\n * Pokemon Showdown - http://pokemonshowdown.com/\r\n *\r\n * Handles getting data about pokemon, items, etc. Also contains some useful\r\n * helper functions for using dex data.\r\n *\r\n * By default, nothing is loaded until you call Dex.mod(mod) or\r\n * Dex.forFormat(format).\r\n *\r\n * You may choose to preload some things:\r\n * - Dex.includeMods() ~10ms\r\n * This will preload `Dex.dexes`, giving you a list of possible mods.\r\n * - Dex.includeFormats() ~30ms\r\n * As above, but will also preload `Dex.formats.all()`.\r\n * - Dex.includeData() ~500ms\r\n * As above, but will also preload all of Dex.data for Gen 8, so\r\n * functions like `Dex.species.get`, etc will be instantly usable.\r\n * - Dex.includeModData() ~1500ms\r\n * As above, but will also preload `Dex.dexes[...].data` for all mods.\r\n *\r\n * Note that preloading is never necessary. All the data will be\r\n * automatically preloaded when needed, preloading will just spend time\r\n * now so you don't need to spend time later.\r\n *\r\n * @license MIT\r\n */\r\n\r\nimport * as path from 'path';\r\n\r\nimport * as Data from './dex-data';\r\nimport {Condition, DexConditions} from './dex-conditions';\r\nimport {DataMove, DexMoves} from './dex-moves';\r\nimport {Item, DexItems} from './dex-items';\r\nimport {Ability, DexAbilities} from './dex-abilities';\r\nimport {Species, DexSpecies} from './dex-species';\r\nimport {Format, DexFormats} from './dex-formats';\r\nimport { Utils } from '../lib';\r\nimport * as CobblemonCache from './cobblemon-cache';\r\n\r\nconst BASE_MOD = 'gen9' as ID;\r\n// to account for Sucrase\r\nconst DATA_PATH = '../data';///pokemon-showdown/.data-dist';//__dirname.endsWith('.sim-dist') ? `../.data-dist` : `../data`;\r\nconst DATA_DIR = DATA_PATH;//path.resolve(__dirname, DATA_PATH);\r\nconst MODS_DIR = DATA_PATH + '/mods';//path.resolve(DATA_DIR, './mods');\r\n\r\nconst dexes: {[mod: string]: ModdedDex} = Object.create(null);\r\n\r\ntype DataType =\r\n\t'Abilities' | 'Rulesets' | 'FormatsData' | 'Items' | 'Learnsets' | 'Moves' |\r\n\t'Natures' | 'Pokedex' | 'Scripts' | 'Conditions' | 'TypeChart';\r\nconst DATA_TYPES: (DataType | 'Aliases')[] = [\r\n\t'Abilities', 'Rulesets', 'FormatsData', 'Items', 'Learnsets', 'Moves',\r\n\t'Natures', 'Pokedex', 'Scripts', 'Conditions', 'TypeChart',\r\n];\r\n\r\nconst DATA_FILES = {\r\n\tAbilities: 'abilities',\r\n\tAliases: 'aliases',\r\n\tRulesets: 'rulesets',\r\n\tFormatsData: 'formats-data',\r\n\tItems: 'items',\r\n\tLearnsets: 'learnsets',\r\n\tMoves: 'moves',\r\n\tNatures: 'natures',\r\n\tPokedex: 'pokedex',\r\n\tScripts: 'scripts',\r\n\tConditions: 'conditions',\r\n\tTypeChart: 'typechart',\r\n};\r\n\r\ninterface DexTable {\r\n\t[key: string]: T;\r\n}\r\n\r\ninterface DexTableData {\r\n\tAbilities: DexTable;\r\n\tAliases: {[id: string]: string};\r\n\tRulesets: DexTable;\r\n\tFormatsData: DexTable;\r\n\tItems: DexTable;\r\n\tLearnsets: DexTable;\r\n\tMoves: DexTable;\r\n\tNatures: DexTable;\r\n\tPokedex: DexTable;\r\n\tScripts: DexTable;\r\n\tConditions: DexTable;\r\n\tTypeChart: DexTable;\r\n}\r\ninterface TextTableData {\r\n\tAbilities: DexTable;\r\n\tItems: DexTable;\r\n\tMoves: DexTable;\r\n\tPokedex: DexTable;\r\n\tDefault: DexTable;\r\n}\r\n\r\nexport const toID = Data.toID;\r\n\r\nexport class ModdedDex {\r\n\treadonly Data = Data;\r\n\treadonly Condition = Condition;\r\n\treadonly Ability = Ability;\r\n\treadonly Item = Item;\r\n\treadonly Move = DataMove;\r\n\treadonly Species = Species;\r\n\treadonly Format = Format;\r\n\treadonly ModdedDex = ModdedDex;\r\n\r\n\treadonly name = \"[ModdedDex]\";\r\n\treadonly isBase: boolean;\r\n\treadonly currentMod: string;\r\n\treadonly dataDir: string;\r\n\r\n\treadonly toID = Data.toID;\r\n\r\n\tgen = 0;\r\n\tparentMod = '';\r\n\tmodsLoaded = false;\r\n\r\n\tdataCache: DexTableData | null;\r\n\ttextCache: TextTableData | null;\r\n\r\n\tdeepClone = Utils.deepClone;\r\n\r\n\treadonly formats: DexFormats;\r\n\treadonly abilities: DexAbilities;\r\n\treadonly items: DexItems;\r\n\treadonly moves: DexMoves;\r\n\treadonly species: DexSpecies;\r\n\treadonly conditions: DexConditions;\r\n\treadonly natures: Data.DexNatures;\r\n\treadonly types: Data.DexTypes;\r\n\treadonly stats: Data.DexStats;\r\n\r\n\tconstructor(mod = 'base') {\r\n\t\tthis.isBase = (mod === 'base');\r\n\t\tthis.currentMod = mod;\r\n\t\tthis.dataDir = (this.isBase ? DATA_DIR : MODS_DIR + '/' + this.currentMod);\r\n\r\n\t\tthis.dataCache = null;\r\n\t\tthis.textCache = null;\r\n\r\n\t\tthis.formats = new DexFormats(this);\r\n\t\tthis.abilities = new DexAbilities(this);\r\n\t\tthis.items = new DexItems(this);\r\n\t\tthis.moves = new DexMoves(this);\r\n\t\tthis.species = new DexSpecies(this);\r\n\t\tthis.conditions = new DexConditions(this);\r\n\t\tthis.natures = new Data.DexNatures(this);\r\n\t\tthis.types = new Data.DexTypes(this);\r\n\t\tthis.stats = new Data.DexStats(this);\r\n\t}\r\n\r\n\tget data(): DexTableData {\r\n\t\treturn this.loadData();\r\n\t}\r\n\r\n\tget dexes(): {[mod: string]: ModdedDex} {\r\n\t\tthis.includeMods();\r\n\t\treturn dexes;\r\n\t}\r\n\r\n\tmod(mod: string | undefined): ModdedDex {\r\n\t\tif (!dexes['base'].modsLoaded) dexes['base'].includeMods();\r\n\t\treturn dexes[mod || 'base'];\r\n\t}\r\n\r\n\tforGen(gen: number) {\r\n\t\tif (!gen) return this;\r\n\t\treturn this.mod(`gen${gen}`);\r\n\t}\r\n\r\n\tforFormat(format: Format | string): ModdedDex {\r\n\t\tif (!this.modsLoaded) this.includeMods();\r\n\t\tconst mod = this.formats.get(format).mod;\r\n\t\treturn dexes[mod || BASE_MOD].includeData();\r\n\t}\r\n\r\n\tmodData(dataType: DataType, id: string) {\r\n\t\tif (this.isBase) return this.data[dataType][id];\r\n\t\tif (this.data[dataType][id] !== dexes[this.parentMod].data[dataType][id]) return this.data[dataType][id];\r\n\t\treturn (this.data[dataType][id] = Utils.deepClone(this.data[dataType][id]));\r\n\t}\r\n\r\n\teffectToString() {\r\n\t\treturn this.name;\r\n\t}\r\n\r\n\t/**\r\n\t * Sanitizes a username or Pokemon nickname\r\n\t *\r\n\t * Returns the passed name, sanitized for safe use as a name in the PS\r\n\t * protocol.\r\n\t *\r\n\t * Such a string must uphold these guarantees:\r\n\t * - must not contain any ASCII whitespace character other than a space\r\n\t * - must not start or end with a space character\r\n\t * - must not contain any of: | , [ ]\r\n\t * - must not be the empty string\r\n\t * - must not contain Unicode RTL control characters\r\n\t *\r\n\t * If no such string can be found, returns the empty string. Calling\r\n\t * functions are expected to check for that condition and deal with it\r\n\t * accordingly.\r\n\t *\r\n\t * getName also enforces that there are not multiple consecutive space\r\n\t * characters in the name, although this is not strictly necessary for\r\n\t * safety.\r\n\t */\r\n\tgetName(name: any): string {\r\n\t\tif (typeof name !== 'string' && typeof name !== 'number') return '';\r\n\t\tname = ('' + name).replace(/[|\\s[\\],\\u202e]+/g, ' ').trim();\r\n\t\tif (name.length > 18) name = name.substr(0, 18).trim();\r\n\r\n\t\t// remove zalgo\r\n\t\tname = name.replace(\r\n\t\t\t/[\\u0300-\\u036f\\u0483-\\u0489\\u0610-\\u0615\\u064B-\\u065F\\u0670\\u06D6-\\u06DC\\u06DF-\\u06ED\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E]{3,}/g,\r\n\t\t\t''\r\n\t\t);\r\n\t\tname = name.replace(/[\\u239b-\\u23b9]/g, '');\r\n\r\n\t\treturn name;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns false if the target is immune; true otherwise.\r\n\t * Also checks immunity to some statuses.\r\n\t */\r\n\tgetImmunity(\r\n\t\tsource: {type: string} | string,\r\n\t\ttarget: {getTypes: () => string[]} | {types: string[]} | string[] | string\r\n\t): boolean {\r\n\t\tconst sourceType: string = typeof source !== 'string' ? source.type : source;\r\n\t\t// @ts-ignore\r\n\t\tconst targetTyping: string[] | string = target.getTypes?.() || target.types || target;\r\n\t\tif (Array.isArray(targetTyping)) {\r\n\t\t\tfor (const type of targetTyping) {\r\n\t\t\t\tif (!this.getImmunity(sourceType, type)) return false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tconst typeData = this.types.get(targetTyping);\r\n\t\tif (typeData && typeData.damageTaken[sourceType] === 3) return false;\r\n\t\treturn true;\r\n\t}\r\n\r\n\tgetEffectiveness(\r\n\t\tsource: {type: string} | string,\r\n\t\ttarget: {getTypes: () => string[]} | {types: string[]} | string[] | string\r\n\t): number {\r\n\t\tconst sourceType: string = typeof source !== 'string' ? source.type : source;\r\n\t\t// @ts-ignore\r\n\t\tconst targetTyping: string[] | string = target.getTypes?.() || target.types || target;\r\n\t\tlet totalTypeMod = 0;\r\n\t\tif (Array.isArray(targetTyping)) {\r\n\t\t\tfor (const type of targetTyping) {\r\n\t\t\t\ttotalTypeMod += this.getEffectiveness(sourceType, type);\r\n\t\t\t}\r\n\t\t\treturn totalTypeMod;\r\n\t\t}\r\n\t\tconst typeData = this.types.get(targetTyping);\r\n\t\tif (!typeData) return 0;\r\n\t\tswitch (typeData.damageTaken[sourceType]) {\r\n\t\tcase 1: return 1; // super-effective\r\n\t\tcase 2: return -1; // resist\r\n\t\t// in case of weird situations like Gravity, immunity is handled elsewhere\r\n\t\tdefault: return 0;\r\n\t\t}\r\n\t}\r\n\r\n\tgetDescs(table: keyof TextTableData, id: ID, dataEntry: AnyObject) {\r\n\t\tif (dataEntry.shortDesc) {\r\n\t\t\treturn {\r\n\t\t\t\tdesc: dataEntry.desc,\r\n\t\t\t\tshortDesc: dataEntry.shortDesc,\r\n\t\t\t};\r\n\t\t}\r\n\t\tconst entry = this.loadTextData()[table][id];\r\n\t\tif (!entry) return null;\r\n\t\tconst descs = {\r\n\t\t\tdesc: '',\r\n\t\t\tshortDesc: '',\r\n\t\t};\r\n\t\tfor (let i = this.gen; i < dexes['base'].gen; i++) {\r\n\t\t\tconst curDesc = entry[`gen${i}` as keyof typeof entry]?.desc;\r\n\t\t\tconst curShortDesc = entry[`gen${i}` as keyof typeof entry]?.shortDesc;\r\n\t\t\tif (!descs.desc && curDesc) {\r\n\t\t\t\tdescs.desc = curDesc;\r\n\t\t\t}\r\n\t\t\tif (!descs.shortDesc && curShortDesc) {\r\n\t\t\t\tdescs.shortDesc = curShortDesc;\r\n\t\t\t}\r\n\t\t\tif (descs.desc && descs.shortDesc) break;\r\n\t\t}\r\n\t\tif (!descs.shortDesc) descs.shortDesc = entry.shortDesc || '';\r\n\t\tif (!descs.desc) descs.desc = entry.desc || descs.shortDesc;\r\n\t\treturn descs;\r\n\t}\r\n\r\n\t/**\r\n\t * Ensure we're working on a copy of a move (and make a copy if we aren't)\r\n\t *\r\n\t * Remember: \"ensure\" - by default, it won't make a copy of a copy:\r\n\t * moveCopy === Dex.getActiveMove(moveCopy)\r\n\t *\r\n\t * If you really want to, use:\r\n\t * moveCopyCopy = Dex.getActiveMove(moveCopy.id)\r\n\t */\r\n\tgetActiveMove(move: Move | string): ActiveMove {\r\n\t\tif (move && typeof (move as ActiveMove).hit === 'number') return move as ActiveMove;\r\n\t\tmove = this.moves.get(move);\r\n\t\tconst moveCopy: ActiveMove = this.deepClone(move);\r\n\t\tmoveCopy.hit = 0;\r\n\t\treturn moveCopy;\r\n\t}\r\n\r\n\tgetHiddenPower(ivs: AnyObject) {\r\n\t\tconst hpTypes = [\r\n\t\t\t'Fighting', 'Flying', 'Poison', 'Ground', 'Rock', 'Bug', 'Ghost', 'Steel',\r\n\t\t\t'Fire', 'Water', 'Grass', 'Electric', 'Psychic', 'Ice', 'Dragon', 'Dark',\r\n\t\t];\r\n\t\tconst tr = this.trunc;\r\n\t\tconst stats = {hp: 31, atk: 31, def: 31, spe: 31, spa: 31, spd: 31};\r\n\t\tif (this.gen <= 2) {\r\n\t\t\t// Gen 2 specific Hidden Power check. IVs are still treated 0-31 so we get them 0-15\r\n\t\t\tconst atkDV = tr(ivs.atk / 2);\r\n\t\t\tconst defDV = tr(ivs.def / 2);\r\n\t\t\tconst speDV = tr(ivs.spe / 2);\r\n\t\t\tconst spcDV = tr(ivs.spa / 2);\r\n\t\t\treturn {\r\n\t\t\t\ttype: hpTypes[4 * (atkDV % 4) + (defDV % 4)],\r\n\t\t\t\tpower: tr(\r\n\t\t\t\t\t(5 * ((spcDV >> 3) + (2 * (speDV >> 3)) + (4 * (defDV >> 3)) + (8 * (atkDV >> 3))) + (spcDV % 4)) / 2 + 31\r\n\t\t\t\t),\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\t// Hidden Power check for Gen 3 onwards\r\n\t\t\tlet hpTypeX = 0;\r\n\t\t\tlet hpPowerX = 0;\r\n\t\t\tlet i = 1;\r\n\t\t\tfor (const s in stats) {\r\n\t\t\t\thpTypeX += i * (ivs[s] % 2);\r\n\t\t\t\thpPowerX += i * (tr(ivs[s] / 2) % 2);\r\n\t\t\t\ti *= 2;\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\ttype: hpTypes[tr(hpTypeX * 15 / 63)],\r\n\t\t\t\t// After Gen 6, Hidden Power is always 60 base power\r\n\t\t\t\tpower: (this.gen && this.gen < 6) ? tr(hpPowerX * 40 / 63) + 30 : 60,\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Truncate a number into an unsigned 32-bit integer, for\r\n\t * compatibility with the cartridge games' math systems.\r\n\t */\r\n\ttrunc(num: number, bits = 0) {\r\n\t\tif (bits) return (num >>> 0) % (2 ** bits);\r\n\t\treturn num >>> 0;\r\n\t}\r\n\r\n\tdataSearch(\r\n\t\ttarget: string, searchIn?: ('Pokedex' | 'Moves' | 'Abilities' | 'Items' | 'Natures')[] | null, isInexact?: boolean\r\n\t): AnyObject[] | null {\r\n\t\tif (!target) return null;\r\n\r\n\t\tsearchIn = searchIn || ['Pokedex', 'Moves', 'Abilities', 'Items', 'Natures'];\r\n\r\n\t\tconst searchObjects = {\r\n\t\t\tPokedex: 'species', Moves: 'moves', Abilities: 'abilities', Items: 'items', Natures: 'natures',\r\n\t\t} as const;\r\n\t\tconst searchTypes = {\r\n\t\t\tPokedex: 'pokemon', Moves: 'move', Abilities: 'ability', Items: 'item', Natures: 'nature',\r\n\t\t} as const;\r\n\t\tlet searchResults: AnyObject[] | null = [];\r\n\t\tfor (const table of searchIn) {\r\n\t\t\tconst res: AnyObject = this[searchObjects[table]].get(target);\r\n\t\t\tif (res.exists && res.gen <= this.gen) {\r\n\t\t\t\tsearchResults.push({\r\n\t\t\t\t\tisInexact,\r\n\t\t\t\t\tsearchType: searchTypes[table],\r\n\t\t\t\t\tname: res.name,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (searchResults.length) return searchResults;\r\n\t\tif (isInexact) return null; // prevent infinite loop\r\n\r\n\t\tconst cmpTarget = toID(target);\r\n\t\tlet maxLd = 3;\r\n\t\tif (cmpTarget.length <= 1) {\r\n\t\t\treturn null;\r\n\t\t} else if (cmpTarget.length <= 4) {\r\n\t\t\tmaxLd = 1;\r\n\t\t} else if (cmpTarget.length <= 6) {\r\n\t\t\tmaxLd = 2;\r\n\t\t}\r\n\t\tsearchResults = null;\r\n\t\tfor (const table of [...searchIn, 'Aliases'] as DataType[]) {\r\n\t\t\tconst searchObj = this.data[table];\r\n\t\t\tif (!searchObj) continue;\r\n\r\n\t\t\tfor (const j in searchObj) {\r\n\t\t\t\tconst ld = Utils.levenshtein(cmpTarget, j, maxLd);\r\n\t\t\t\tif (ld <= maxLd) {\r\n\t\t\t\t\tconst word = (searchObj[j] as DexTable).name || (searchObj[j] as DexTable).species || j;\r\n\t\t\t\t\tconst results = this.dataSearch(word, searchIn, word);\r\n\t\t\t\t\tif (results) {\r\n\t\t\t\t\t\tsearchResults = results;\r\n\t\t\t\t\t\tmaxLd = ld;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn searchResults;\r\n\t}\r\n\r\n\tloadDataFile(basePath: string, dataType: DataType | 'Aliases'): AnyObject {\r\n\t\ttry {\r\n\t\t\tconst filePath = basePath + DATA_FILES[dataType];\r\n\t\t\tconst dataObject = require(filePath);\r\n\t\t\tif (!dataObject || typeof dataObject !== 'object') {\r\n\t\t\t\tthrow new TypeError(`${filePath}, if it exists, must export a non-null object`);\r\n\t\t\t}\r\n\t\t\tif (dataObject[dataType]?.constructor?.name !== 'Object') {\r\n\t\t\t\tthrow new TypeError(`${filePath}, if it exists, must export an object whose '${dataType}' property is an Object`);\r\n\t\t\t}\r\n\t\t\treturn dataObject[dataType];\r\n\t\t} catch (e: any) {\r\n\t\t// This gives a different error using the graalJS require function so just ignore it\r\n// \t\t\tif (e.code !== 'MODULE_NOT_FOUND' && e.code !== 'ENOENT') {\r\n// \t\t\t\tthrow e;\r\n// \t\t\t}\r\n\t\t}\r\n\t\treturn {};\r\n\t}\r\n\r\n\tloadTextFile(\r\n\t\tname: string, exportName: string\r\n\t): DexTable {\r\n\t\treturn require(`${DATA_DIR}/text/${name}`)[exportName];\r\n\t}\r\n\r\n\tincludeMods(): this {\r\n\t\tconst all_mods = [\r\n\t\t\t 'fullpotential',\r\n\t\t\t 'gen1',\r\n\t\t\t 'gen1jpn',\r\n\t\t\t 'gen1stadium',\r\n\t\t\t 'gen2',\r\n\t\t\t 'gen2stadium2',\r\n\t\t\t 'gen3',\r\n\t\t\t 'gen4',\r\n\t\t\t 'gen4pt',\r\n\t\t\t 'gen5',\r\n\t\t\t 'gen5bw1',\r\n\t\t\t 'gen6',\r\n\t\t\t 'gen6xy',\r\n\t\t\t 'gen7',\r\n\t\t\t 'gen7letsgo',\r\n\t\t\t 'gen7sm',\r\n\t\t\t 'gen8',\r\n\t\t\t 'gen8bdsp',\r\n\t\t\t 'gen8dlc1',\r\n\t\t\t 'gen8joltemons',\r\n\t\t\t 'gen8linked',\r\n\t\t\t 'gennext',\r\n\t\t\t 'mixandmega',\r\n\t\t\t 'partnersincrime',\r\n\t\t\t 'pokebilities',\r\n\t\t\t 'potd',\r\n\t\t\t 'sharedpower',\r\n\t\t\t 'ssb',\r\n\t\t\t 'thecardgame',\r\n\t\t\t 'trademarked',\r\n\t\t\t CobblemonCache.MOD_ID\r\n \t];\r\n\t\tif (!this.isBase) throw new Error(`This must be called on the base Dex`);\r\n\t\tif (this.modsLoaded) return this;\r\n\r\n\t for (let mod of all_mods) {\r\n\t\t \tdexes[mod] = new ModdedDex(mod);\r\n\t }\r\n\t\tthis.modsLoaded = true;\r\n\r\n\t\treturn this;\r\n\t}\r\n\r\n\tincludeModData(): this {\r\n\t\tfor (const mod in this.dexes) {\r\n\t\t\tdexes[mod].includeData();\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\r\n\tincludeData(): this {\r\n\t\tthis.loadData();\r\n\t\treturn this;\r\n\t}\r\n\r\n\tloadTextData() {\r\n\t\tif (dexes['base'].textCache) return dexes['base'].textCache;\r\n\t\tdexes['base'].textCache = {\r\n\t\t\tPokedex: this.loadTextFile('pokedex', 'PokedexText') as DexTable,\r\n\t\t\tMoves: this.loadTextFile('moves', 'MovesText') as DexTable,\r\n\t\t\tAbilities: this.loadTextFile('abilities', 'AbilitiesText') as DexTable,\r\n\t\t\tItems: this.loadTextFile('items', 'ItemsText') as DexTable,\r\n\t\t\tDefault: this.loadTextFile('default', 'DefaultText') as DexTable,\r\n\t\t};\r\n\t\treturn dexes['base'].textCache;\r\n\t}\r\n\r\n\tloadData(): DexTableData {\r\n\t\tif (this.dataCache) return this.dataCache;\r\n\t\tdexes['base'].includeMods();\r\n\t\tconst dataCache: {[k in keyof DexTableData]?: any} = {};\r\n\r\n\t\tconst basePath = this.dataDir + '/';\r\n\r\n\t\tconst Scripts = this.loadDataFile(basePath, 'Scripts');\r\n\t\tthis.parentMod = this.isBase ? '' : (Scripts.inherit || 'base');\r\n\r\n\t\tlet parentDex;\r\n\t\tif (this.parentMod) {\r\n\t\t\tparentDex = dexes[this.parentMod];\r\n\t\t\tif (!parentDex || parentDex === this) {\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t`Unable to load ${this.currentMod}. 'inherit' in scripts.ts should specify a parent mod from which to inherit data, or must be not specified.`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!parentDex) {\r\n\t\t\t// Formats are inherited by mods and used by Rulesets\r\n\t\t\tthis.includeFormats();\r\n\t\t}\r\n\t\tfor (const dataType of DATA_TYPES.concat('Aliases')) {\r\n\t\t\tconst BattleData = this.loadDataFile(basePath, dataType);\r\n\t\t\tif (BattleData !== dataCache[dataType]) dataCache[dataType] = Object.assign(BattleData, dataCache[dataType]);\r\n\t\t\tif (dataType === 'Rulesets' && !parentDex) {\r\n\t\t\t\tfor (const format of this.formats.all()) {\r\n\t\t\t\t\tBattleData[format.id] = {...format, ruleTable: null};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (parentDex) {\r\n\t\t\tfor (const dataType of DATA_TYPES) {\r\n\t\t\t\tconst parentTypedData: DexTable = parentDex.data[dataType];\r\n\t\t\t\tconst childTypedData: DexTable = dataCache[dataType] || (dataCache[dataType] = {});\r\n\t\t\t\tfor (const entryId in parentTypedData) {\r\n\t\t\t\t\tif (childTypedData[entryId] === null) {\r\n\t\t\t\t\t\t// null means don't inherit\r\n\t\t\t\t\t\tdelete childTypedData[entryId];\r\n\t\t\t\t\t} else if (!(entryId in childTypedData)) {\r\n\t\t\t\t\t\t// If it doesn't exist it's inherited from the parent data\r\n\t\t\t\t\t\tif (dataType === 'Pokedex') {\r\n\t\t\t\t\t\t\t// Pokedex entries can be modified too many different ways\r\n\t\t\t\t\t\t\t// e.g. inheriting different formats-data/learnsets\r\n\t\t\t\t\t\t\tchildTypedData[entryId] = this.deepClone(parentTypedData[entryId]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tchildTypedData[entryId] = parentTypedData[entryId];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (childTypedData[entryId] && childTypedData[entryId].inherit) {\r\n\t\t\t\t\t\t// {inherit: true} can be used to modify only parts of the parent data,\r\n\t\t\t\t\t\t// instead of overwriting entirely\r\n\t\t\t\t\t\tdelete childTypedData[entryId].inherit;\r\n\r\n\t\t\t\t\t\t// Merge parent into children entry, preserving existing childs' properties.\r\n\t\t\t\t\t\tfor (const key in parentTypedData[entryId]) {\r\n\t\t\t\t\t\t\tif (key in childTypedData[entryId]) continue;\r\n\t\t\t\t\t\t\tchildTypedData[entryId][key] = parentTypedData[entryId][key];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdataCache['Aliases'] = parentDex.data['Aliases'];\r\n\t\t}\r\n\r\n\t\t// Flag the generation. Required for team validator.\r\n\t\tthis.gen = dataCache.Scripts.gen;\r\n\t\tif (!this.gen) throw new Error(`Mod ${this.currentMod} needs a generation number in scripts.js`);\r\n\t\tthis.dataCache = dataCache as DexTableData;\r\n\r\n\t\t// Execute initialization script.\r\n\t\tif (Scripts.init) Scripts.init.call(this);\r\n\r\n\t\treturn this.dataCache;\r\n\t}\r\n\r\n\tincludeFormats(): this {\r\n\t\tthis.formats.load();\r\n\t\treturn this;\r\n\t}\r\n}\r\n\r\ndexes['base'] = new ModdedDex();\r\n\r\n// \"gen9\" is an alias for the current base data\r\ndexes[BASE_MOD] = dexes['base'];\r\n\r\nexport const Dex = dexes['base'];\r\nexport namespace Dex {\r\n\texport type Species = import('./dex-species').Species;\r\n\texport type Item = import('./dex-items').Item;\r\n\texport type Move = import('./dex-moves').Move;\r\n\texport type Ability = import('./dex-abilities').Ability;\r\n\r\n\texport type HitEffect = import('./dex-moves').HitEffect;\r\n\texport type SecondaryEffect = import('./dex-moves').SecondaryEffect;\r\n\texport type RuleTable = import('./dex-formats').RuleTable;\r\n}\r\n\r\nexport default Dex;\r\n"], "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BA,WAAsB;AACtB,4BAAuC;AACvC,uBAAiC;AACjC,uBAA6B;AAC7B,2BAAoC;AACpC,yBAAkC;AAClC,yBAAiC;AACjC,iBAAsB;AACtB,qBAAgC;AAtChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwCA,MAAM,WAAW;AAEjB,MAAM,YAAY;AAClB,MAAM,WAAW;AACjB,MAAM,WAAW,YAAY;AAE7B,MAAM,QAAoC,uBAAO,OAAO,IAAI;AAK5D,MAAM,aAAuC;AAAA,EAC5C;AAAA,EAAa;AAAA,EAAY;AAAA,EAAe;AAAA,EAAS;AAAA,EAAa;AAAA,EAC9D;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAc;AAChD;AAEA,MAAM,aAAa;AAAA,EAClB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,aAAa;AAAA,EACb,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AACZ;AA4BO,MAAM,OAAO,KAAK;AAElB,MAAM,UAAU;AAAA,EAoCtB,YAAY,MAAM,QAAQ;AAnC1B,SAAS,OAAO;AAChB,SAAS,YAAY;AACrB,SAAS,UAAU;AACnB,SAAS,OAAO;AAChB,SAAS,OAAO;AAChB,SAAS,UAAU;AACnB,SAAS,SAAS;AAClB,SAAS,YAAY;AAErB,SAAS,OAAO;AAKhB,SAAS,OAAO,KAAK;AAErB,eAAM;AACN,qBAAY;AACZ,sBAAa;AAKb,qBAAY,iBAAM;AAajB,SAAK,SAAU,QAAQ;AACvB,SAAK,aAAa;AAClB,SAAK,UAAW,KAAK,SAAS,WAAW,WAAW,MAAM,KAAK;AAE/D,SAAK,YAAY;AACjB,SAAK,YAAY;AAEjB,SAAK,UAAU,IAAI,8BAAW,IAAI;AAClC,SAAK,YAAY,IAAI,kCAAa,IAAI;AACtC,SAAK,QAAQ,IAAI,0BAAS,IAAI;AAC9B,SAAK,QAAQ,IAAI,0BAAS,IAAI;AAC9B,SAAK,UAAU,IAAI,8BAAW,IAAI;AAClC,SAAK,aAAa,IAAI,oCAAc,IAAI;AACxC,SAAK,UAAU,IAAI,KAAK,WAAW,IAAI;AACvC,SAAK,QAAQ,IAAI,KAAK,SAAS,IAAI;AACnC,SAAK,QAAQ,IAAI,KAAK,SAAS,IAAI;AAAA,EACpC;AAAA,EAEA,IAAI,OAAqB;AACxB,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA,EAEA,IAAI,QAAoC;AACvC,SAAK,YAAY;AACjB,WAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAoC;AACvC,QAAI,CAAC,MAAM,MAAM,EAAE;AAAY,YAAM,MAAM,EAAE,YAAY;AACzD,WAAO,MAAM,OAAO,MAAM;AAAA,EAC3B;AAAA,EAEA,OAAO,KAAa;AACnB,QAAI,CAAC;AAAK,aAAO;AACjB,WAAO,KAAK,IAAI,MAAM,KAAK;AAAA,EAC5B;AAAA,EAEA,UAAU,QAAoC;AAC7C,QAAI,CAAC,KAAK;AAAY,WAAK,YAAY;AACvC,UAAM,MAAM,KAAK,QAAQ,IAAI,MAAM,EAAE;AACrC,WAAO,MAAM,OAAO,QAAQ,EAAE,YAAY;AAAA,EAC3C;AAAA,EAEA,QAAQ,UAAoB,IAAY;AACvC,QAAI,KAAK;AAAQ,aAAO,KAAK,KAAK,QAAQ,EAAE,EAAE;AAC9C,QAAI,KAAK,KAAK,QAAQ,EAAE,EAAE,MAAM,MAAM,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,EAAE;AAAG,aAAO,KAAK,KAAK,QAAQ,EAAE,EAAE;AACvG,WAAQ,KAAK,KAAK,QAAQ,EAAE,EAAE,IAAI,iBAAM,UAAU,KAAK,KAAK,QAAQ,EAAE,EAAE,CAAC;AAAA,EAC1E;AAAA,EAEA,iBAAiB;AAChB,WAAO,KAAK;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,QAAQ,MAAmB;AAC1B,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS;AAAU,aAAO;AACjE,YAAQ,KAAK,MAAM,QAAQ,qBAAqB,GAAG,EAAE,KAAK;AAC1D,QAAI,KAAK,SAAS;AAAI,aAAO,KAAK,OAAO,GAAG,EAAE,EAAE,KAAK;AAGrD,WAAO,KAAK;AAAA,MACX;AAAA,MACA;AAAA,IACD;AACA,WAAO,KAAK,QAAQ,oBAAoB,EAAE;AAE1C,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YACC,QACA,QACU;AACV,UAAM,aAAqB,OAAO,WAAW,WAAW,OAAO,OAAO;AAEtE,UAAM,eAAkC,OAAO,WAAW,KAAK,OAAO,SAAS;AAC/E,QAAI,MAAM,QAAQ,YAAY,GAAG;AAChC,iBAAW,QAAQ,cAAc;AAChC,YAAI,CAAC,KAAK,YAAY,YAAY,IAAI;AAAG,iBAAO;AAAA,MACjD;AACA,aAAO;AAAA,IACR;AACA,UAAM,WAAW,KAAK,MAAM,IAAI,YAAY;AAC5C,QAAI,YAAY,SAAS,YAAY,UAAU,MAAM;AAAG,aAAO;AAC/D,WAAO;AAAA,EACR;AAAA,EAEA,iBACC,QACA,QACS;AACT,UAAM,aAAqB,OAAO,WAAW,WAAW,OAAO,OAAO;AAEtE,UAAM,eAAkC,OAAO,WAAW,KAAK,OAAO,SAAS;AAC/E,QAAI,eAAe;AACnB,QAAI,MAAM,QAAQ,YAAY,GAAG;AAChC,iBAAW,QAAQ,cAAc;AAChC,wBAAgB,KAAK,iBAAiB,YAAY,IAAI;AAAA,MACvD;AACA,aAAO;AAAA,IACR;AACA,UAAM,WAAW,KAAK,MAAM,IAAI,YAAY;AAC5C,QAAI,CAAC;AAAU,aAAO;AACtB,YAAQ,SAAS,YAAY,UAAU,GAAG;AAAA,MAC1C,KAAK;AAAG,eAAO;AAAA,MACf,KAAK;AAAG,eAAO;AAAA,MAEf;AAAS,eAAO;AAAA,IAChB;AAAA,EACD;AAAA,EAEA,SAAS,OAA4B,IAAQ,WAAsB;AAClE,QAAI,UAAU,WAAW;AACxB,aAAO;AAAA,QACN,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU;AAAA,MACtB;AAAA,IACD;AACA,UAAM,QAAQ,KAAK,aAAa,EAAE,KAAK,EAAE,EAAE;AAC3C,QAAI,CAAC;AAAO,aAAO;AACnB,UAAM,QAAQ;AAAA,MACb,MAAM;AAAA,MACN,WAAW;AAAA,IACZ;AACA,aAAS,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,EAAE,KAAK,KAAK;AAClD,YAAM,UAAU,MAAM,MAAM,GAAyB,GAAG;AACxD,YAAM,eAAe,MAAM,MAAM,GAAyB,GAAG;AAC7D,UAAI,CAAC,MAAM,QAAQ,SAAS;AAC3B,cAAM,OAAO;AAAA,MACd;AACA,UAAI,CAAC,MAAM,aAAa,cAAc;AACrC,cAAM,YAAY;AAAA,MACnB;AACA,UAAI,MAAM,QAAQ,MAAM;AAAW;AAAA,IACpC;AACA,QAAI,CAAC,MAAM;AAAW,YAAM,YAAY,MAAM,aAAa;AAC3D,QAAI,CAAC,MAAM;AAAM,YAAM,OAAO,MAAM,QAAQ,MAAM;AAClD,WAAO;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,cAAc,MAAiC;AAC9C,QAAI,QAAQ,OAAQ,KAAoB,QAAQ;AAAU,aAAO;AACjE,WAAO,KAAK,MAAM,IAAI,IAAI;AAC1B,UAAM,WAAuB,KAAK,UAAU,IAAI;AAChD,aAAS,MAAM;AACf,WAAO;AAAA,EACR;AAAA,EAEA,eAAe,KAAgB;AAC9B,UAAM,UAAU;AAAA,MACf;AAAA,MAAY;AAAA,MAAU;AAAA,MAAU;AAAA,MAAU;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAS;AAAA,MAClE;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAS;AAAA,MAAY;AAAA,MAAW;AAAA,MAAO;AAAA,MAAU;AAAA,IACnE;AACA,UAAM,KAAK,KAAK;AAChB,UAAM,QAAQ,EAAC,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,GAAE;AAClE,QAAI,KAAK,OAAO,GAAG;AAElB,YAAM,QAAQ,GAAG,IAAI,MAAM,CAAC;AAC5B,YAAM,QAAQ,GAAG,IAAI,MAAM,CAAC;AAC5B,YAAM,QAAQ,GAAG,IAAI,MAAM,CAAC;AAC5B,YAAM,QAAQ,GAAG,IAAI,MAAM,CAAC;AAC5B,aAAO;AAAA,QACN,MAAM,QAAQ,KAAK,QAAQ,KAAM,QAAQ,CAAE;AAAA,QAC3C,OAAO;AAAA,WACL,MAAM,SAAS,KAAM,KAAK,SAAS,KAAO,KAAK,SAAS,KAAO,KAAK,SAAS,MAAQ,QAAQ,KAAM,IAAI;AAAA,QACzG;AAAA,MACD;AAAA,IACD,OAAO;AAEN,UAAI,UAAU;AACd,UAAI,WAAW;AACf,UAAI,IAAI;AACR,iBAAW,KAAK,OAAO;AACtB,mBAAW,KAAK,IAAI,CAAC,IAAI;AACzB,oBAAY,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI;AAClC,aAAK;AAAA,MACN;AACA,aAAO;AAAA,QACN,MAAM,QAAQ,GAAG,UAAU,KAAK,EAAE,CAAC;AAAA;AAAA,QAEnC,OAAQ,KAAK,OAAO,KAAK,MAAM,IAAK,GAAG,WAAW,KAAK,EAAE,IAAI,KAAK;AAAA,MACnE;AAAA,IACD;AAAA,EACD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAa,OAAO,GAAG;AAC5B,QAAI;AAAM,cAAQ,QAAQ,KAAM,KAAK;AACrC,WAAO,QAAQ;AAAA,EAChB;AAAA,EAEA,WACC,QAAgB,UAA+E,WAC1E;AACrB,QAAI,CAAC;AAAQ,aAAO;AAEpB,eAAW,YAAY,CAAC,WAAW,SAAS,aAAa,SAAS,SAAS;AAE3E,UAAM,gBAAgB;AAAA,MACrB,SAAS;AAAA,MAAW,OAAO;AAAA,MAAS,WAAW;AAAA,MAAa,OAAO;AAAA,MAAS,SAAS;AAAA,IACtF;AACA,UAAM,cAAc;AAAA,MACnB,SAAS;AAAA,MAAW,OAAO;AAAA,MAAQ,WAAW;AAAA,MAAW,OAAO;AAAA,MAAQ,SAAS;AAAA,IAClF;AACA,QAAI,gBAAoC,CAAC;AACzC,eAAW,SAAS,UAAU;AAC7B,YAAM,MAAiB,KAAK,cAAc,KAAK,CAAC,EAAE,IAAI,MAAM;AAC5D,UAAI,IAAI,UAAU,IAAI,OAAO,KAAK,KAAK;AACtC,sBAAc,KAAK;AAAA,UAClB;AAAA,UACA,YAAY,YAAY,KAAK;AAAA,UAC7B,MAAM,IAAI;AAAA,QACX,CAAC;AAAA,MACF;AAAA,IACD;AACA,QAAI,cAAc;AAAQ,aAAO;AACjC,QAAI;AAAW,aAAO;AAEtB,UAAM,YAAY,KAAK,MAAM;AAC7B,QAAI,QAAQ;AACZ,QAAI,UAAU,UAAU,GAAG;AAC1B,aAAO;AAAA,IACR,WAAW,UAAU,UAAU,GAAG;AACjC,cAAQ;AAAA,IACT,WAAW,UAAU,UAAU,GAAG;AACjC,cAAQ;AAAA,IACT;AACA,oBAAgB;AAChB,eAAW,SAAS,CAAC,GAAG,UAAU,SAAS,GAAiB;AAC3D,YAAM,YAAY,KAAK,KAAK,KAAK;AACjC,UAAI,CAAC;AAAW;AAEhB,iBAAW,KAAK,WAAW;AAC1B,cAAM,KAAK,iBAAM,YAAY,WAAW,GAAG,KAAK;AAChD,YAAI,MAAM,OAAO;AAChB,gBAAM,OAAQ,UAAU,CAAC,EAAoB,QAAS,UAAU,CAAC,EAAoB,WAAW;AAChG,gBAAM,UAAU,KAAK,WAAW,MAAM,UAAU,IAAI;AACpD,cAAI,SAAS;AACZ,4BAAgB;AAChB,oBAAQ;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,aAAa,UAAkB,UAA2C;AACzE,QAAI;AACH,YAAM,WAAW,WAAW,WAAW,QAAQ;AAC/C,YAAM,aAAa,QAAQ,QAAQ;AACnC,UAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AAClD,cAAM,IAAI,UAAU,GAAG,uDAAuD;AAAA,MAC/E;AACA,UAAI,WAAW,QAAQ,GAAG,aAAa,SAAS,UAAU;AACzD,cAAM,IAAI,UAAU,GAAG,wDAAwD,iCAAiC;AAAA,MACjH;AACA,aAAO,WAAW,QAAQ;AAAA,IAC3B,SAAS,GAAP;AAAA,IAKF;AACA,WAAO,CAAC;AAAA,EACT;AAAA,EAEA,aACC,MAAc,YAC4D;AAC1E,WAAO,QAAQ,GAAG,iBAAiB,MAAM,EAAE,UAAU;AAAA,EACtD;AAAA,EAEA,cAAoB;AACnB,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACX;AACN,QAAI,CAAC,KAAK;AAAQ,YAAM,IAAI,MAAM,qCAAqC;AACvE,QAAI,KAAK;AAAY,aAAO;AAE1B,aAAS,OAAO,UAAU;AAC1B,YAAM,GAAG,IAAI,IAAI,UAAU,GAAG;AAAA,IAC9B;AACF,SAAK,aAAa;AAElB,WAAO;AAAA,EACR;AAAA,EAEA,iBAAuB;AACtB,eAAW,OAAO,KAAK,OAAO;AAC7B,YAAM,GAAG,EAAE,YAAY;AAAA,IACxB;AACA,WAAO;AAAA,EACR;AAAA,EAEA,cAAoB;AACnB,SAAK,SAAS;AACd,WAAO;AAAA,EACR;AAAA,EAEA,eAAe;AACd,QAAI,MAAM,MAAM,EAAE;AAAW,aAAO,MAAM,MAAM,EAAE;AAClD,UAAM,MAAM,EAAE,YAAY;AAAA,MACzB,SAAS,KAAK,aAAa,WAAW,aAAa;AAAA,MACnD,OAAO,KAAK,aAAa,SAAS,WAAW;AAAA,MAC7C,WAAW,KAAK,aAAa,aAAa,eAAe;AAAA,MACzD,OAAO,KAAK,aAAa,SAAS,WAAW;AAAA,MAC7C,SAAS,KAAK,aAAa,WAAW,aAAa;AAAA,IACpD;AACA,WAAO,MAAM,MAAM,EAAE;AAAA,EACtB;AAAA,EAEA,WAAyB;AACxB,QAAI,KAAK;AAAW,aAAO,KAAK;AAChC,UAAM,MAAM,EAAE,YAAY;AAC1B,UAAM,YAA+C,CAAC;AAEtD,UAAM,WAAW,KAAK,UAAU;AAEhC,UAAM,UAAU,KAAK,aAAa,UAAU,SAAS;AACrD,SAAK,YAAY,KAAK,SAAS,KAAM,QAAQ,WAAW;AAExD,QAAI;AACJ,QAAI,KAAK,WAAW;AACnB,kBAAY,MAAM,KAAK,SAAS;AAChC,UAAI,CAAC,aAAa,cAAc,MAAM;AACrC,cAAM,IAAI;AAAA,UACT,kBAAkB,KAAK;AAAA,QACxB;AAAA,MACD;AAAA,IACD;AAEA,QAAI,CAAC,WAAW;AAEf,WAAK,eAAe;AAAA,IACrB;AACA,eAAW,YAAY,WAAW,OAAO,SAAS,GAAG;AACpD,YAAM,aAAa,KAAK,aAAa,UAAU,QAAQ;AACvD,UAAI,eAAe,UAAU,QAAQ;AAAG,kBAAU,QAAQ,IAAI,OAAO,OAAO,YAAY,UAAU,QAAQ,CAAC;AAC3G,UAAI,aAAa,cAAc,CAAC,WAAW;AAC1C,mBAAW,UAAU,KAAK,QAAQ,IAAI,GAAG;AACxC,qBAAW,OAAO,EAAE,IAAI,EAAC,GAAG,QAAQ,WAAW,KAAI;AAAA,QACpD;AAAA,MACD;AAAA,IACD;AACA,QAAI,WAAW;AACd,iBAAW,YAAY,YAAY;AAClC,cAAM,kBAAiC,UAAU,KAAK,QAAQ;AAC9D,cAAM,iBAAgC,UAAU,QAAQ,MAAM,UAAU,QAAQ,IAAI,CAAC;AACrF,mBAAW,WAAW,iBAAiB;AACtC,cAAI,eAAe,OAAO,MAAM,MAAM;AAErC,mBAAO,eAAe,OAAO;AAAA,UAC9B,WAAW,EAAE,WAAW,iBAAiB;AAExC,gBAAI,aAAa,WAAW;AAG3B,6BAAe,OAAO,IAAI,KAAK,UAAU,gBAAgB,OAAO,CAAC;AAAA,YAClE,OAAO;AACN,6BAAe,OAAO,IAAI,gBAAgB,OAAO;AAAA,YAClD;AAAA,UACD,WAAW,eAAe,OAAO,KAAK,eAAe,OAAO,EAAE,SAAS;AAGtE,mBAAO,eAAe,OAAO,EAAE;AAG/B,uBAAW,OAAO,gBAAgB,OAAO,GAAG;AAC3C,kBAAI,OAAO,eAAe,OAAO;AAAG;AACpC,6BAAe,OAAO,EAAE,GAAG,IAAI,gBAAgB,OAAO,EAAE,GAAG;AAAA,YAC5D;AAAA,UACD;AAAA,QACD;AAAA,MACD;AACA,gBAAU,SAAS,IAAI,UAAU,KAAK,SAAS;AAAA,IAChD;AAGA,SAAK,MAAM,UAAU,QAAQ;AAC7B,QAAI,CAAC,KAAK;AAAK,YAAM,IAAI,MAAM,OAAO,KAAK,oDAAoD;AAC/F,SAAK,YAAY;AAGjB,QAAI,QAAQ;AAAM,cAAQ,KAAK,KAAK,IAAI;AAExC,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,iBAAuB;AACtB,SAAK,QAAQ,KAAK;AAClB,WAAO;AAAA,EACR;AACD;AAEA,MAAM,MAAM,IAAI,IAAI,UAAU;AAG9B,MAAM,QAAQ,IAAI,MAAM,MAAM;AAEvB,MAAM,MAAM,MAAM,MAAM;AAY/B,IAAO,cAAQ;", "names": [] }