{"version":3,"file":"Loader.js","sources":["../../../src/assets/loader/Loader.ts"],"sourcesContent":["import { warn } from '../../utils/logging/warn';\nimport { path } from '../../utils/path';\nimport { type ProgressCallback } from '../Assets';\nimport { convertToList } from '../utils/convertToList';\nimport { isSingleItem } from '../utils/isSingleItem';\n\nimport type { ResolvedAsset } from '../types';\nimport type { LoaderParser } from './parsers/LoaderParser';\nimport type { PromiseAndParser } from './types';\n\n/**\n * Options for loading assets with the Loader\n * @example\n * ```ts\n * await Assets.load(['file1.png', 'file2.png'], {\n *   onProgress: (progress) => console.log(`Progress: ${progress * 100}%`),\n *   onError: (error, url) => console.error(`Error loading ${url}: ${error.message}`),\n *   strategy: 'retry', // 'throw' | 'skip' | 'retry'\n *   retryCount: 5, // Number of retry attempts if strategy is 'retry'\n *   retryDelay: 500, // Delay in ms between retries\n * });\n * ```\n * @category assets\n * @standard\n */\nexport interface LoadOptions\n{\n    /**\n     * Callback for progress updates during loading\n     * @param progress - A number between 0 and 1 indicating the load progress\n     * @example\n     * ```ts\n     * const options: LoadOptions = {\n     *   onProgress: (progress) => {\n     *     console.log(`Loading progress: ${progress * 100}%`);\n     *   },\n     * };\n     * await Assets.load('image.png', options);\n     * ```\n     */\n    onProgress?: (progress: number) => void;\n    /**\n     * Callback for handling errors during loading\n     * @param error - The error that occurred\n     * @param url - The URL of the asset that failed to load\n     * @example\n     * ```ts\n     * const options: LoadOptions = {\n     *   onError: (error, url) => {\n     *     console.error(`Failed to load ${url}: ${error.message}`);\n     *   },\n     * };\n     * await Assets.load('missing-file.png', options);\n     * ```\n     */\n    onError?: (error: Error, url: string | ResolvedAsset) => void;\n    /**\n     * Strategy to handle load failures\n     * - 'throw': Immediately throw an error and stop loading (default)\n     * - 'skip': Skip the failed asset and continue loading others\n     * - 'retry': Retry loading the asset a specified number of times\n     * @default 'throw'\n     * @example\n     * ```ts\n     * const options: LoadOptions = {\n     *   strategy: 'skip',\n     * };\n     * await Assets.load('sometimes-fails.png', options);\n     * ```\n     */\n    strategy?: 'throw' | 'skip' | 'retry';\n    /**\n     * Number of retry attempts if strategy is 'retry'\n     * @default 3\n     * @example\n     * ```ts\n     * const options: LoadOptions = {\n     *   strategy: 'retry',\n     *   retryCount: 5, // Retry up to 5 times\n     * };\n     * await Assets.load('unstable-asset.png', options);\n     * ```\n     */\n    retryCount?: number;\n    /**\n     * Delay in milliseconds between retry attempts\n     * @default 250\n     * @example\n     * ```ts\n     * const options: LoadOptions = {\n     *   strategy: 'retry',\n     *   retryDelay: 1000, // Wait 1 second between retries\n     * };\n     * await Assets.load('sometimes-fails.png', options);\n     * ```\n     */\n    retryDelay?: number;\n}\n\n/**\n * The Loader is responsible for loading all assets, such as images, spritesheets, audio files, etc.\n * It does not do anything clever with URLs - it just loads stuff!\n * Behind the scenes all things are cached using promises. This means it's impossible to load an asset more than once.\n * Through the use of LoaderParsers, the loader can understand how to load any kind of file!\n *\n * It is not intended that this class is created by developers - its part of the Asset class\n * This is the second major system of PixiJS' main Assets class\n * @category assets\n * @advanced\n */\nexport class Loader\n{\n    /**\n     * Default options for loading assets\n     * @example\n     * ```ts\n     * // Change default load options globally\n     * Loader.defaultOptions = {\n     *   strategy: 'skip', // Change default strategy to 'skip'\n     *   retryCount: 5,   // Change default retry count to 5\n     *   retryDelay: 500, // Change default retry delay to 500ms\n     * };\n     * ```\n     */\n    public static defaultOptions: LoadOptions = {\n        onProgress: undefined,\n        onError: undefined,\n        strategy: 'throw',\n        retryCount: 3,\n        retryDelay: 250,\n    };\n    /**\n     * Options for loading assets with the loader.\n     * These options will be used as defaults for all load calls made with this loader instance.\n     * They can be overridden by passing options directly to the load method.\n     * @example\n     * ```ts\n     * // Create a loader with custom default options\n     * const loader = new Loader();\n     * loader.loadOptions = {\n     *   strategy: 'skip', // Default strategy to 'skip'\n     *   retryCount: 5,   // Default retry count to 5\n     *   retryDelay: 500, // Default retry delay to 500ms\n     * };\n     *\n     * // This load call will use the loader's default options\n     * await loader.load('image1.png');\n     */\n    public loadOptions: LoadOptions = { ...Loader.defaultOptions };\n    private readonly _parsers: LoaderParser[] = [];\n    private _parserHash: Record<string, LoaderParser>;\n\n    private _parsersValidated = false;\n\n    /**\n     * All loader parsers registered\n     * @type {assets.LoaderParser[]}\n     */\n    public parsers = new Proxy(this._parsers, {\n        set: (target, key, value) =>\n        {\n            this._parsersValidated = false;\n\n            target[key as any as number] = value;\n\n            return true;\n        }\n    });\n\n    /** Cache loading promises that ae currently active */\n    public promiseCache: Record<string, PromiseAndParser> = {};\n\n    /** function used for testing */\n    public reset(): void\n    {\n        this._parsersValidated = false;\n        this.promiseCache = {};\n    }\n\n    /**\n     * Used internally to generate a promise for the asset to be loaded.\n     * @param url - The URL to be loaded\n     * @param data - any custom additional information relevant to the asset being loaded\n     * @returns - a promise that will resolve to an Asset for example a Texture of a JSON object\n     */\n    private _getLoadPromiseAndParser(url: string, data?: ResolvedAsset): PromiseAndParser\n    {\n        const result: PromiseAndParser = {\n            promise: null,\n            parser: null\n        };\n\n        result.promise = (async () =>\n        {\n            let asset = null;\n\n            let parser: LoaderParser = null;\n\n            // first check to see if the user has specified a parser\n            if (data.parser || data.loadParser)\n            {\n                // they have? lovely, lets use it\n                parser = this._parserHash[data.parser || data.loadParser];\n\n                // #if _DEBUG\n                if (data.loadParser)\n                {\n                    warn(\n                        `[Assets] \"loadParser\" is deprecated, use \"parser\" instead for ${url}`\n                    );\n                }\n                // #endif\n\n                if (!parser)\n                {\n                    // #if _DEBUG\n                    warn(\n                        `[Assets] specified load parser \"${data.parser || data.loadParser}\" not found while loading ${url}`\n                    );\n                    // #endif\n                }\n            }\n\n            // no parser specified, so lets try and find one using the tests\n            if (!parser)\n            {\n                for (let i = 0; i < this.parsers.length; i++)\n                {\n                    const parserX = this.parsers[i];\n\n                    if (parserX.load && parserX.test?.(url, data, this))\n                    {\n                        parser = parserX;\n                        break;\n                    }\n                }\n\n                if (!parser)\n                {\n                    // #if _DEBUG\n                    // eslint-disable-next-line max-len\n                    warn(`[Assets] ${url} could not be loaded as we don't know how to parse it, ensure the correct parser has been added`);\n                    // #endif\n\n                    return null;\n                }\n            }\n\n            asset = await parser.load(url, data, this);\n            result.parser = parser;\n\n            for (let i = 0; i < this.parsers.length; i++)\n            {\n                const parser = this.parsers[i];\n\n                if (parser.parse)\n                {\n                    if (parser.parse && await parser.testParse?.(asset, data, this))\n                    {\n                        // transform the asset..\n                        asset = await parser.parse(asset, data, this) || asset;\n\n                        result.parser = parser;\n                    }\n                }\n            }\n\n            return asset;\n        })();\n\n        return result;\n    }\n\n    /**\n     * Loads one or more assets using the parsers added to the Loader.\n     * @example\n     * // Single asset:\n     * const asset = await Loader.load('cool.png');\n     * console.log(asset);\n     *\n     * // Multiple assets:\n     * const assets = await Loader.load(['cool.png', 'cooler.png']);\n     * console.log(assets);\n     * @param assetsToLoadIn - urls that you want to load, or a single one!\n     * @param onProgress - For multiple asset loading only, an optional function that is called\n     * when progress on asset loading is made. The function is passed a single parameter, `progress`,\n     * which represents the percentage (0.0 - 1.0) of the assets loaded. Do not use this function\n     * to detect when assets are complete and available, instead use the Promise returned by this function.\n     */\n    public async load<T = any>(\n        assetsToLoadIn: string | ResolvedAsset,\n        onProgress?: ProgressCallback | LoadOptions,\n    ): Promise<T>;\n    public async load<T = any>(\n        assetsToLoadIn: string[] | ResolvedAsset[],\n        onProgress?: ProgressCallback | LoadOptions,\n    ): Promise<Record<string, T>>;\n    public async load<T = any>(\n        assetsToLoadIn: string | string[] | ResolvedAsset | ResolvedAsset[],\n        onProgressOrOptions?: ProgressCallback | LoadOptions,\n    ): Promise<T | Record<string, T>>\n    {\n        if (!this._parsersValidated)\n        {\n            this._validateParsers();\n        }\n\n        const options: LoadOptions = typeof onProgressOrOptions === 'function'\n            ? { ...Loader.defaultOptions, ...this.loadOptions, onProgress: onProgressOrOptions }\n            : { ...Loader.defaultOptions, ...this.loadOptions, ...(onProgressOrOptions || {}) };\n        const { onProgress, onError, strategy, retryCount, retryDelay } = options;\n\n        let count = 0;\n\n        const assets: Record<string, Promise<any>> = {};\n\n        const singleAsset = isSingleItem(assetsToLoadIn);\n\n        const assetsToLoad = convertToList<ResolvedAsset>(assetsToLoadIn, (item) => ({\n            alias: [item],\n            src: item,\n            data: {}\n        }));\n\n        const total = assetsToLoad.reduce((sum, asset) => sum + (asset.progressSize || 1), 0);\n\n        const promises: Promise<void>[] = assetsToLoad.map(async (asset: ResolvedAsset) =>\n        {\n            const url = path.toAbsolute(asset.src);\n\n            if (assets[asset.src]) return;\n\n            await this._loadAssetWithRetry(url, asset, { onProgress, onError, strategy, retryCount, retryDelay }, assets);\n\n            count += (asset.progressSize || 1);\n            if (onProgress) onProgress(count / total);\n        });\n\n        await Promise.all(promises);\n\n        return singleAsset ? assets[assetsToLoad[0].src] : assets;\n    }\n\n    /**\n     * Unloads one or more assets. Any unloaded assets will be destroyed, freeing up memory for your app.\n     * The parser that created the asset, will be the one that unloads it.\n     * @example\n     * // Single asset:\n     * const asset = await Loader.load('cool.png');\n     *\n     * await Loader.unload('cool.png');\n     *\n     * console.log(asset.destroyed); // true\n     * @param assetsToUnloadIn - urls that you want to unload, or a single one!\n     */\n    public async unload(\n        assetsToUnloadIn: string | string[] | ResolvedAsset | ResolvedAsset[],\n    ): Promise<void>\n    {\n        const assetsToUnload = convertToList<ResolvedAsset>(assetsToUnloadIn, (item) => ({\n            alias: [item],\n            src: item,\n        }));\n\n        const promises: Promise<void>[] = assetsToUnload.map(async (asset: ResolvedAsset) =>\n        {\n            const url = path.toAbsolute(asset.src);\n\n            const loadPromise = this.promiseCache[url];\n\n            if (loadPromise)\n            {\n                const loadedAsset = await loadPromise.promise;\n\n                delete this.promiseCache[url];\n\n                await loadPromise.parser?.unload?.(loadedAsset, asset, this);\n            }\n        });\n\n        await Promise.all(promises);\n    }\n\n    /** validates our parsers, right now it only checks for name conflicts but we can add more here as required! */\n    private _validateParsers()\n    {\n        this._parsersValidated = true;\n\n        this._parserHash = this._parsers\n            .filter((parser) => parser.name || parser.id)\n            .reduce((hash, parser) =>\n            {\n                if (!parser.name && !parser.id)\n                {\n                    // #if _DEBUG\n                    warn(`[Assets] parser should have an id`);\n                    // #endif\n                }\n                else if (hash[parser.name] || hash[parser.id])\n                {\n                    // #if _DEBUG\n                    warn(`[Assets] parser id conflict \"${parser.id}\"`);\n                    // #endif\n                }\n\n                // add both name and id to the hash\n                hash[parser.name] = parser;\n                if (parser.id) hash[parser.id] = parser;\n\n                return hash;\n            }, {} as Record<string, LoaderParser>);\n    }\n\n    private async _loadAssetWithRetry(\n        url: string,\n        asset: ResolvedAsset,\n        options: LoadOptions,\n        assets: Record<string, Promise<any>>\n    )\n    {\n        let attempt = 0;\n        const { onError, strategy, retryCount, retryDelay } = options;\n        const wait = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n        while (true)\n        {\n            try\n            {\n                if (!this.promiseCache[url])\n                {\n                    this.promiseCache[url] = this._getLoadPromiseAndParser(url, asset);\n                }\n\n                assets[asset.src] = await this.promiseCache[url].promise;\n\n                return;\n            }\n            catch (e)\n            {\n                // clear cache for a new attempt\n                delete this.promiseCache[url];\n                delete assets[asset.src];\n\n                attempt++;\n\n                const isLast = strategy !== 'retry' || attempt > retryCount;\n\n                if (strategy === 'retry' && !isLast)\n                {\n                    if (onError) onError(e as Error, asset);\n                    await wait(retryDelay);\n                    continue;\n                }\n\n                if (strategy === 'skip')\n                {\n                    if (onError) onError(e as Error, asset);\n\n                    return;\n                }\n\n                // strategy 'throw' or exhausted 'retry'\n                if (onError) onError(e as Error, asset);\n                const error = new Error(`[Loader.load] Failed to load ${url}.\\n${e}`);\n\n                if (e instanceof Error && e.stack)\n                {\n                    error.stack = e.stack;\n                }\n                throw error;\n            }\n        }\n    }\n}\n"],"names":["warn","parser","isSingleItem","convertToList","path"],"mappings":";;;;;;;;AA8GO,MAAM,OAAA,GAAN,MAAM,OACb,CAAA;AAAA,EADO,WAAA,GAAA;AAsCH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAO,WAA2B,GAAA,EAAE,GAAG,OAAA,CAAO,cAAe,EAAA,CAAA;AAC7D,IAAA,IAAA,CAAiB,WAA2B,EAAC,CAAA;AAG7C,IAAA,IAAA,CAAQ,iBAAoB,GAAA,KAAA,CAAA;AAM5B;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAO,OAAU,GAAA,IAAI,KAAM,CAAA,IAAA,CAAK,QAAU,EAAA;AAAA,MACtC,GAAK,EAAA,CAAC,MAAQ,EAAA,GAAA,EAAK,KACnB,KAAA;AACI,QAAA,IAAA,CAAK,iBAAoB,GAAA,KAAA,CAAA;AAEzB,QAAA,MAAA,CAAO,GAAoB,CAAI,GAAA,KAAA,CAAA;AAE/B,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAAA,KACH,CAAA,CAAA;AAGD;AAAA,IAAA,IAAA,CAAO,eAAiD,EAAC,CAAA;AAAA,GAAA;AAAA;AAAA,EAGlD,KACP,GAAA;AACI,IAAA,IAAA,CAAK,iBAAoB,GAAA,KAAA,CAAA;AACzB,IAAA,IAAA,CAAK,eAAe,EAAC,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,wBAAA,CAAyB,KAAa,IAC9C,EAAA;AACI,IAAA,MAAM,MAA2B,GAAA;AAAA,MAC7B,OAAS,EAAA,IAAA;AAAA,MACT,MAAQ,EAAA,IAAA;AAAA,KACZ,CAAA;AAEA,IAAA,MAAA,CAAO,WAAW,YAClB;AACI,MAAA,IAAI,KAAQ,GAAA,IAAA,CAAA;AAEZ,MAAA,IAAI,MAAuB,GAAA,IAAA,CAAA;AAG3B,MAAI,IAAA,IAAA,CAAK,MAAU,IAAA,IAAA,CAAK,UACxB,EAAA;AAEI,QAAA,MAAA,GAAS,IAAK,CAAA,WAAA,CAAY,IAAK,CAAA,MAAA,IAAU,KAAK,UAAU,CAAA,CAAA;AAGxD,QAAA,IAAI,KAAK,UACT,EAAA;AACI,UAAAA,SAAA;AAAA,YACI,iEAAiE,GAAG,CAAA,CAAA;AAAA,WACxE,CAAA;AAAA,SACJ;AAGA,QAAA,IAAI,CAAC,MACL,EAAA;AAEI,UAAAA,SAAA;AAAA,YACI,mCAAmC,IAAK,CAAA,MAAA,IAAU,IAAK,CAAA,UAAU,6BAA6B,GAAG,CAAA,CAAA;AAAA,WACrG,CAAA;AAAA,SAEJ;AAAA,OACJ;AAGA,MAAA,IAAI,CAAC,MACL,EAAA;AACI,QAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,OAAA,CAAQ,QAAQ,CACzC,EAAA,EAAA;AACI,UAAM,MAAA,OAAA,GAAU,IAAK,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AAE9B,UAAA,IAAI,QAAQ,IAAQ,IAAA,OAAA,CAAQ,OAAO,GAAK,EAAA,IAAA,EAAM,IAAI,CAClD,EAAA;AACI,YAAS,MAAA,GAAA,OAAA,CAAA;AACT,YAAA,MAAA;AAAA,WACJ;AAAA,SACJ;AAEA,QAAA,IAAI,CAAC,MACL,EAAA;AAGI,UAAKA,SAAA,CAAA,CAAA,SAAA,EAAY,GAAG,CAAiG,+FAAA,CAAA,CAAA,CAAA;AAGrH,UAAO,OAAA,IAAA,CAAA;AAAA,SACX;AAAA,OACJ;AAEA,MAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAK,CAAA,GAAA,EAAK,MAAM,IAAI,CAAA,CAAA;AACzC,MAAA,MAAA,CAAO,MAAS,GAAA,MAAA,CAAA;AAEhB,MAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAK,CAAA,OAAA,CAAQ,QAAQ,CACzC,EAAA,EAAA;AACI,QAAMC,MAAAA,OAAAA,GAAS,IAAK,CAAA,OAAA,CAAQ,CAAC,CAAA,CAAA;AAE7B,QAAA,IAAIA,QAAO,KACX,EAAA;AACI,UAAIA,IAAAA,OAAAA,CAAO,SAAS,MAAMA,OAAAA,CAAO,YAAY,KAAO,EAAA,IAAA,EAAM,IAAI,CAC9D,EAAA;AAEI,YAAA,KAAA,GAAQ,MAAMA,OAAO,CAAA,KAAA,CAAM,KAAO,EAAA,IAAA,EAAM,IAAI,CAAK,IAAA,KAAA,CAAA;AAEjD,YAAA,MAAA,CAAO,MAASA,GAAAA,OAAAA,CAAAA;AAAA,WACpB;AAAA,SACJ;AAAA,OACJ;AAEA,MAAO,OAAA,KAAA,CAAA;AAAA,KACR,GAAA,CAAA;AAEH,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAAA,EA0BA,MAAa,IACT,CAAA,cAAA,EACA,mBAEJ,EAAA;AACI,IAAI,IAAA,CAAC,KAAK,iBACV,EAAA;AACI,MAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,KAC1B;AAEA,IAAM,MAAA,OAAA,GAAuB,OAAO,mBAAA,KAAwB,UACtD,GAAA,EAAE,GAAG,OAAO,CAAA,cAAA,EAAgB,GAAG,IAAA,CAAK,WAAa,EAAA,UAAA,EAAY,qBAC7D,GAAA,EAAE,GAAG,OAAA,CAAO,cAAgB,EAAA,GAAG,KAAK,WAAa,EAAA,GAAI,mBAAuB,IAAA,EAAI,EAAA,CAAA;AACtF,IAAA,MAAM,EAAE,UAAY,EAAA,OAAA,EAAS,QAAU,EAAA,UAAA,EAAY,YAAe,GAAA,OAAA,CAAA;AAElE,IAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AAEZ,IAAA,MAAM,SAAuC,EAAC,CAAA;AAE9C,IAAM,MAAA,WAAA,GAAcC,0BAAa,cAAc,CAAA,CAAA;AAE/C,IAAA,MAAM,YAAe,GAAAC,2BAAA,CAA6B,cAAgB,EAAA,CAAC,IAAU,MAAA;AAAA,MACzE,KAAA,EAAO,CAAC,IAAI,CAAA;AAAA,MACZ,GAAK,EAAA,IAAA;AAAA,MACL,MAAM,EAAC;AAAA,KACT,CAAA,CAAA,CAAA;AAEF,IAAM,MAAA,KAAA,GAAQ,YAAa,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,UAAU,GAAO,IAAA,KAAA,CAAM,YAAgB,IAAA,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAEpF,IAAA,MAAM,QAA4B,GAAA,YAAA,CAAa,GAAI,CAAA,OAAO,KAC1D,KAAA;AACI,MAAA,MAAM,GAAM,GAAAC,SAAA,CAAK,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAErC,MAAI,IAAA,MAAA,CAAO,MAAM,GAAG,CAAA;AAAG,QAAA,OAAA;AAEvB,MAAM,MAAA,IAAA,CAAK,mBAAoB,CAAA,GAAA,EAAK,KAAO,EAAA,EAAE,UAAY,EAAA,OAAA,EAAS,QAAU,EAAA,UAAA,EAAY,UAAW,EAAA,EAAG,MAAM,CAAA,CAAA;AAE5G,MAAA,KAAA,IAAU,MAAM,YAAgB,IAAA,CAAA,CAAA;AAChC,MAAI,IAAA,UAAA;AAAY,QAAA,UAAA,CAAW,QAAQ,KAAK,CAAA,CAAA;AAAA,KAC3C,CAAA,CAAA;AAED,IAAM,MAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA,CAAA;AAE1B,IAAA,OAAO,cAAc,MAAO,CAAA,YAAA,CAAa,CAAC,CAAA,CAAE,GAAG,CAAI,GAAA,MAAA,CAAA;AAAA,GACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAa,OACT,gBAEJ,EAAA;AACI,IAAA,MAAM,cAAiB,GAAAD,2BAAA,CAA6B,gBAAkB,EAAA,CAAC,IAAU,MAAA;AAAA,MAC7E,KAAA,EAAO,CAAC,IAAI,CAAA;AAAA,MACZ,GAAK,EAAA,IAAA;AAAA,KACP,CAAA,CAAA,CAAA;AAEF,IAAA,MAAM,QAA4B,GAAA,cAAA,CAAe,GAAI,CAAA,OAAO,KAC5D,KAAA;AACI,MAAA,MAAM,GAAM,GAAAC,SAAA,CAAK,UAAW,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAErC,MAAM,MAAA,WAAA,GAAc,IAAK,CAAA,YAAA,CAAa,GAAG,CAAA,CAAA;AAEzC,MAAA,IAAI,WACJ,EAAA;AACI,QAAM,MAAA,WAAA,GAAc,MAAM,WAAY,CAAA,OAAA,CAAA;AAEtC,QAAO,OAAA,IAAA,CAAK,aAAa,GAAG,CAAA,CAAA;AAE5B,QAAA,MAAM,WAAY,CAAA,MAAA,EAAQ,MAAS,GAAA,WAAA,EAAa,OAAO,IAAI,CAAA,CAAA;AAAA,OAC/D;AAAA,KACH,CAAA,CAAA;AAED,IAAM,MAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA,CAAA;AAAA,GAC9B;AAAA;AAAA,EAGQ,gBACR,GAAA;AACI,IAAA,IAAA,CAAK,iBAAoB,GAAA,IAAA,CAAA;AAEzB,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAK,QACnB,CAAA,MAAA,CAAO,CAAC,MAAW,KAAA,MAAA,CAAO,IAAQ,IAAA,MAAA,CAAO,EAAE,CAAA,CAC3C,MAAO,CAAA,CAAC,MAAM,MACf,KAAA;AACI,MAAA,IAAI,CAAC,MAAA,CAAO,IAAQ,IAAA,CAAC,OAAO,EAC5B,EAAA;AAEI,QAAAJ,SAAA,CAAK,CAAmC,iCAAA,CAAA,CAAA,CAAA;AAAA,OAE5C,MAAA,IACS,KAAK,MAAO,CAAA,IAAI,KAAK,IAAK,CAAA,MAAA,CAAO,EAAE,CAC5C,EAAA;AAEI,QAAKA,SAAA,CAAA,CAAA,6BAAA,EAAgC,MAAO,CAAA,EAAE,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,OAErD;AAGA,MAAK,IAAA,CAAA,MAAA,CAAO,IAAI,CAAI,GAAA,MAAA,CAAA;AACpB,MAAA,IAAI,MAAO,CAAA,EAAA;AAAI,QAAK,IAAA,CAAA,MAAA,CAAO,EAAE,CAAI,GAAA,MAAA,CAAA;AAEjC,MAAO,OAAA,IAAA,CAAA;AAAA,KACX,EAAG,EAAkC,CAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,MAAc,mBAAA,CACV,GACA,EAAA,KAAA,EACA,SACA,MAEJ,EAAA;AACI,IAAA,IAAI,OAAU,GAAA,CAAA,CAAA;AACd,IAAA,MAAM,EAAE,OAAA,EAAS,QAAU,EAAA,UAAA,EAAY,YAAe,GAAA,OAAA,CAAA;AACtD,IAAM,MAAA,IAAA,GAAO,CAAC,EAAA,KAAe,IAAI,OAAA,CAAQ,CAAC,CAAM,KAAA,UAAA,CAAW,CAAG,EAAA,EAAE,CAAC,CAAA,CAAA;AAEjE,IAAA,OAAO,IACP,EAAA;AACI,MACA,IAAA;AACI,QAAA,IAAI,CAAC,IAAA,CAAK,YAAa,CAAA,GAAG,CAC1B,EAAA;AACI,UAAA,IAAA,CAAK,aAAa,GAAG,CAAA,GAAI,IAAK,CAAA,wBAAA,CAAyB,KAAK,KAAK,CAAA,CAAA;AAAA,SACrE;AAEA,QAAA,MAAA,CAAO,MAAM,GAAG,CAAA,GAAI,MAAM,IAAK,CAAA,YAAA,CAAa,GAAG,CAAE,CAAA,OAAA,CAAA;AAEjD,QAAA,OAAA;AAAA,eAEG,CACP,EAAA;AAEI,QAAO,OAAA,IAAA,CAAK,aAAa,GAAG,CAAA,CAAA;AAC5B,QAAO,OAAA,MAAA,CAAO,MAAM,GAAG,CAAA,CAAA;AAEvB,QAAA,OAAA,EAAA,CAAA;AAEA,QAAM,MAAA,MAAA,GAAS,QAAa,KAAA,OAAA,IAAW,OAAU,GAAA,UAAA,CAAA;AAEjD,QAAI,IAAA,QAAA,KAAa,OAAW,IAAA,CAAC,MAC7B,EAAA;AACI,UAAI,IAAA,OAAA;AAAS,YAAA,OAAA,CAAQ,GAAY,KAAK,CAAA,CAAA;AACtC,UAAA,MAAM,KAAK,UAAU,CAAA,CAAA;AACrB,UAAA,SAAA;AAAA,SACJ;AAEA,QAAA,IAAI,aAAa,MACjB,EAAA;AACI,UAAI,IAAA,OAAA;AAAS,YAAA,OAAA,CAAQ,GAAY,KAAK,CAAA,CAAA;AAEtC,UAAA,OAAA;AAAA,SACJ;AAGA,QAAI,IAAA,OAAA;AAAS,UAAA,OAAA,CAAQ,GAAY,KAAK,CAAA,CAAA;AACtC,QAAA,MAAM,KAAQ,GAAA,IAAI,KAAM,CAAA,CAAA,6BAAA,EAAgC,GAAG,CAAA;AAAA,EAAM,CAAC,CAAE,CAAA,CAAA,CAAA;AAEpE,QAAI,IAAA,CAAA,YAAa,KAAS,IAAA,CAAA,CAAE,KAC5B,EAAA;AACI,UAAA,KAAA,CAAM,QAAQ,CAAE,CAAA,KAAA,CAAA;AAAA,SACpB;AACA,QAAM,MAAA,KAAA,CAAA;AAAA,OACV;AAAA,KACJ;AAAA,GACJ;AACJ,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA3Wa,OAAA,CAcK,cAA8B,GAAA;AAAA,EACxC,UAAY,EAAA,KAAA,CAAA;AAAA,EACZ,OAAS,EAAA,KAAA,CAAA;AAAA,EACT,QAAU,EAAA,OAAA;AAAA,EACV,UAAY,EAAA,CAAA;AAAA,EACZ,UAAY,EAAA,GAAA;AAChB,CAAA,CAAA;AApBG,IAAM,MAAN,GAAA;;;;"}