pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 19.9 kB
Source Map (JSON)
{"version":3,"file":"CanvasFilterSystem.mjs","sources":["../../../../src/rendering/renderers/canvas/CanvasFilterSystem.ts"],"sourcesContent":["import { extensions, ExtensionType } from '../../../extensions/Extensions';\nimport { Bounds } from '../../../scene/container/bounds/Bounds';\nimport { getGlobalRenderableBounds } from '../../../scene/container/bounds/getRenderableBounds';\nimport { getPo2TextureFromSource } from '../../../scene/text/utils/getPo2TextureFromSource';\nimport { CanvasPool } from '../shared/texture/CanvasPool';\nimport { canvasUtils } from './utils/canvasUtils';\n\nimport type { ICanvasRenderingContext2D } from '../../../environment/canvas/ICanvasRenderingContext2D';\nimport type { Filter } from '../../../filters/Filter';\nimport type { FilterInstruction } from '../../../filters/FilterSystem';\nimport type { Container } from '../../../scene/container/Container';\nimport type { System } from '../shared/system/System';\nimport type { Texture } from '../shared/texture/Texture';\n\n/**\n * Interface for filters that can supply a CSS filter string for Canvas2D.\n * @category filters\n * @advanced\n */\nexport interface CanvasFilterCapable\n{\n /** Returns CSS filter string (e.g., 'blur(5px)') or null if not supported */\n getCanvasFilterString(): string | null;\n}\n\n/**\n * Check if a filter supports Canvas2D rendering.\n * @param filter - The filter to check\n * @returns True if the filter implements getCanvasFilterString()\n * @internal\n */\nexport function isCanvasFilterCapable(filter: Filter): filter is Filter & CanvasFilterCapable\n{\n return typeof (filter as unknown as CanvasFilterCapable).getCanvasFilterString === 'function';\n}\n\n/**\n * Internal data stored per filter stack entry.\n * @internal\n */\nclass CanvasFilterFrame\n{\n public skip = false;\n public useClip = false;\n public filters: Filter[] = null;\n public container: Container = null;\n public bounds = new Bounds();\n public cssFilterString = '';\n}\n\n/**\n * Canvas2D filter system that applies compatible filters using CSS filter strings.\n * Unsupported filters are skipped with a warn-once message.\n * @category rendering\n * @advanced\n */\nexport class CanvasFilterSystem implements System\n{\n /** @ignore */\n public static extension = {\n type: [ExtensionType.CanvasSystem],\n name: 'filter',\n } as const;\n\n /** The renderer this system is attached to */\n public readonly renderer: {\n canvasContext: {\n activeContext: ICanvasRenderingContext2D;\n activeResolution: number;\n };\n };\n\n private _filterStack: CanvasFilterFrame[] = [];\n private _filterStackIndex = 0;\n private _savedStates: { filter: string; alphaMultiplier: number }[] = [];\n private _alphaMultiplier = 1;\n private _warnedFilterTypes = new Set<string>();\n\n /**\n * @param renderer - The Canvas renderer\n * @param renderer.canvasContext\n * @param renderer.canvasContext.activeContext\n * @param renderer.canvasContext.activeResolution\n */\n constructor(renderer: {\n canvasContext: {\n activeContext: ICanvasRenderingContext2D;\n activeResolution: number;\n };\n })\n {\n this.renderer = renderer;\n }\n\n /**\n * Push a filter instruction onto the stack.\n * Called when entering a filtered container.\n * @param instruction - The filter instruction from FilterPipe\n */\n public push(instruction: FilterInstruction): void\n {\n const filterFrame = this._pushFilterFrame();\n const filters = instruction.filterEffect.filters as Filter[];\n\n filterFrame.skip = false;\n filterFrame.useClip = false;\n filterFrame.filters = filters;\n filterFrame.container = instruction.container;\n filterFrame.cssFilterString = '';\n\n if (filters.every((filter) => !filter.enabled))\n {\n filterFrame.skip = true;\n\n return;\n }\n\n const cssFilters: string[] = [];\n const alphaMultiplier = 1;\n\n for (const filter of filters)\n {\n if (!filter.enabled) continue;\n\n if (!isCanvasFilterCapable(filter))\n {\n this._warnUnsupportedFilter(filter);\n\n continue;\n }\n\n const cssString = filter.getCanvasFilterString();\n\n if (cssString === null)\n {\n this._warnUnsupportedFilter(filter);\n\n continue;\n }\n\n if (cssString)\n {\n cssFilters.push(cssString);\n }\n }\n\n if (cssFilters.length === 0 && alphaMultiplier === 1)\n {\n filterFrame.skip = true;\n\n return;\n }\n\n filterFrame.cssFilterString = cssFilters.join(' ');\n\n this._calculateFilterArea(instruction, filterFrame.bounds);\n filterFrame.useClip = !!instruction.filterEffect.filterArea;\n\n const context = this.renderer.canvasContext.activeContext;\n const previousFilter = context.filter || 'none';\n\n this._savedStates.push({ filter: previousFilter, alphaMultiplier: this._alphaMultiplier });\n\n if (filterFrame.useClip\n && Number.isFinite(filterFrame.bounds.width)\n && Number.isFinite(filterFrame.bounds.height)\n && filterFrame.bounds.width > 0\n && filterFrame.bounds.height > 0)\n {\n const resolution = this.renderer.canvasContext.activeResolution || 1;\n\n context.save();\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.beginPath();\n context.rect(\n filterFrame.bounds.x * resolution,\n filterFrame.bounds.y * resolution,\n filterFrame.bounds.width * resolution,\n filterFrame.bounds.height * resolution\n );\n context.clip();\n }\n else\n {\n filterFrame.useClip = false;\n }\n\n if (alphaMultiplier !== 1)\n {\n this._alphaMultiplier *= alphaMultiplier;\n }\n\n if (filterFrame.cssFilterString)\n {\n context.filter = previousFilter !== 'none'\n ? `${previousFilter} ${filterFrame.cssFilterString}`\n : filterFrame.cssFilterString;\n }\n }\n\n /** Pop a filter from the stack. Called when exiting a filtered container. */\n public pop(): void\n {\n const filterFrame = this._popFilterFrame();\n\n if (filterFrame.skip)\n {\n return;\n }\n\n const savedState = this._savedStates.pop();\n\n if (!savedState)\n {\n return;\n }\n\n const context = this.renderer.canvasContext.activeContext;\n\n if (filterFrame.useClip)\n {\n context.restore();\n }\n else\n {\n context.filter = savedState.filter;\n }\n\n this._alphaMultiplier = savedState.alphaMultiplier;\n }\n\n /**\n * Applies supported filters to a texture and returns a new texture.\n * Unsupported filters are skipped with a warn-once message.\n * @param params - The parameters for applying filters.\n * @param params.texture\n * @param params.filters\n * @returns The resulting texture after filters are applied.\n */\n public generateFilteredTexture({ texture, filters }: { texture: Texture; filters: Filter[] }): Texture\n {\n if (!filters?.length || filters.every((filter) => !filter.enabled))\n {\n return texture;\n }\n\n const cssFilters: string[] = [];\n const alphaMultiplier = 1;\n\n for (const filter of filters)\n {\n if (!filter.enabled) continue;\n\n if (!isCanvasFilterCapable(filter))\n {\n this._warnUnsupportedFilter(filter);\n\n continue;\n }\n\n const cssString = filter.getCanvasFilterString();\n\n if (cssString === null)\n {\n this._warnUnsupportedFilter(filter);\n\n continue;\n }\n\n if (cssString)\n {\n cssFilters.push(cssString);\n }\n }\n\n if (cssFilters.length === 0 && alphaMultiplier === 1)\n {\n return texture;\n }\n\n const source = canvasUtils.getCanvasSource(texture);\n\n if (!source)\n {\n return texture;\n }\n\n const frame = texture.frame;\n const resolution = texture.source._resolution ?? texture.source.resolution ?? 1;\n const width = frame.width;\n const height = frame.height;\n\n const canvasAndContext = CanvasPool.getOptimalCanvasAndContext(width, height, resolution);\n const { canvas, context } = canvasAndContext;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.clearRect(0, 0, canvas.width, canvas.height);\n\n if (cssFilters.length)\n {\n context.filter = cssFilters.join(' ');\n }\n\n if (alphaMultiplier !== 1)\n {\n context.globalAlpha = alphaMultiplier;\n }\n\n const sx = frame.x * resolution;\n const sy = frame.y * resolution;\n const sw = width * resolution;\n const sh = height * resolution;\n\n context.drawImage(\n source,\n sx,\n sy,\n sw,\n sh,\n 0,\n 0,\n sw,\n sh\n );\n\n context.filter = 'none';\n context.globalAlpha = 1;\n\n return getPo2TextureFromSource(canvas, width, height, resolution);\n }\n\n /**\n * Calculate the filter area bounds.\n * @param instruction - Filter instruction\n * @param bounds - Bounds object to populate\n */\n private _calculateFilterArea(instruction: FilterInstruction, bounds: Bounds): void\n {\n if (instruction.renderables)\n {\n getGlobalRenderableBounds(instruction.renderables, bounds);\n }\n else if (instruction.filterEffect.filterArea)\n {\n bounds.clear();\n bounds.addRect(instruction.filterEffect.filterArea);\n bounds.applyMatrix(instruction.container.worldTransform);\n }\n else\n {\n instruction.container.getFastGlobalBounds(true, bounds);\n }\n\n if (instruction.container)\n {\n const renderGroup = instruction.container.renderGroup || instruction.container.parentRenderGroup;\n const filterFrameTransform = renderGroup?.cacheToLocalTransform;\n\n if (filterFrameTransform)\n {\n bounds.applyMatrix(filterFrameTransform);\n }\n }\n }\n\n private _warnUnsupportedFilter(filter: Filter): void\n {\n const filterName = filter?.constructor?.name || 'Filter';\n\n if (this._warnedFilterTypes.has(filterName))\n {\n return;\n }\n\n this._warnedFilterTypes.add(filterName);\n console.warn(\n `CanvasRenderer: filter \"${filterName}\" is not supported in Canvas2D and will be skipped.`\n );\n }\n\n public get alphaMultiplier(): number\n {\n return this._alphaMultiplier;\n }\n\n private _pushFilterFrame(): CanvasFilterFrame\n {\n let filterFrame = this._filterStack[this._filterStackIndex];\n\n if (!filterFrame)\n {\n filterFrame = this._filterStack[this._filterStackIndex] = new CanvasFilterFrame();\n }\n\n this._filterStackIndex++;\n\n return filterFrame;\n }\n\n private _popFilterFrame(): CanvasFilterFrame\n {\n if (this._filterStackIndex <= 0)\n {\n return this._filterStack[0];\n }\n\n this._filterStackIndex--;\n\n return this._filterStack[this._filterStackIndex];\n }\n\n /** Destroys the system */\n public destroy(): void\n {\n this._filterStack = null;\n this._savedStates = null;\n this._warnedFilterTypes = null;\n this._alphaMultiplier = 1;\n }\n}\n\nextensions.add(CanvasFilterSystem);\n"],"names":[],"mappings":";;;;;;;;AA+BO,SAAS,sBAAsB,MAAA,EACtC;AACI,EAAA,OAAO,OAAQ,OAA0C,qBAAA,KAA0B,UAAA;AACvF;AAMA,MAAM,iBAAA,CACN;AAAA,EADA,WAAA,GAAA;AAEI,IAAA,IAAA,CAAO,IAAA,GAAO,KAAA;AACd,IAAA,IAAA,CAAO,OAAA,GAAU,KAAA;AACjB,IAAA,IAAA,CAAO,OAAA,GAAoB,IAAA;AAC3B,IAAA,IAAA,CAAO,SAAA,GAAuB,IAAA;AAC9B,IAAA,IAAA,CAAO,MAAA,GAAS,IAAI,MAAA,EAAO;AAC3B,IAAA,IAAA,CAAO,eAAA,GAAkB,EAAA;AAAA,EAAA;AAC7B;AAQO,MAAM,kBAAA,CACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BI,YAAY,QAAA,EAMZ;AAlBA,IAAA,IAAA,CAAQ,eAAoC,EAAC;AAC7C,IAAA,IAAA,CAAQ,iBAAA,GAAoB,CAAA;AAC5B,IAAA,IAAA,CAAQ,eAA8D,EAAC;AACvE,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAC3B,IAAA,IAAA,CAAQ,kBAAA,uBAAyB,GAAA,EAAY;AAezC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAK,WAAA,EACZ;AACI,IAAA,MAAM,WAAA,GAAc,KAAK,gBAAA,EAAiB;AAC1C,IAAA,MAAM,OAAA,GAAU,YAAY,YAAA,CAAa,OAAA;AAEzC,IAAA,WAAA,CAAY,IAAA,GAAO,KAAA;AACnB,IAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,IAAA,WAAA,CAAY,OAAA,GAAU,OAAA;AACtB,IAAA,WAAA,CAAY,YAAY,WAAA,CAAY,SAAA;AACpC,IAAA,WAAA,CAAY,eAAA,GAAkB,EAAA;AAE9B,IAAA,IAAI,QAAQ,KAAA,CAAM,CAAC,WAAW,CAAC,MAAA,CAAO,OAAO,CAAA,EAC7C;AACI,MAAA,WAAA,CAAY,IAAA,GAAO,IAAA;AAEnB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,eAAA,GAAkB,CAAA;AAExB,IAAA,KAAA,MAAW,UAAU,OAAA,EACrB;AACI,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAErB,MAAA,IAAI,CAAC,qBAAA,CAAsB,MAAM,CAAA,EACjC;AACI,QAAA,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAElC,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,SAAA,GAAY,OAAO,qBAAA,EAAsB;AAE/C,MAAA,IAAI,cAAc,IAAA,EAClB;AACI,QAAA,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAElC,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,SAAA,EACJ;AACI,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAC7B;AAAA,IACJ;AAEA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,eAAA,KAAoB,CAAA,EACnD;AACI,MAAA,WAAA,CAAY,IAAA,GAAO,IAAA;AAEnB,MAAA;AAAA,IACJ;AAEA,IAAA,WAAA,CAAY,eAAA,GAAkB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAEjD,IAAA,IAAA,CAAK,oBAAA,CAAqB,WAAA,EAAa,WAAA,CAAY,MAAM,CAAA;AACzD,IAAA,WAAA,CAAY,OAAA,GAAU,CAAC,CAAC,WAAA,CAAY,YAAA,CAAa,UAAA;AAEjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,aAAA;AAC5C,IAAA,MAAM,cAAA,GAAiB,QAAQ,MAAA,IAAU,MAAA;AAEzC,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,EAAE,MAAA,EAAQ,gBAAgB,eAAA,EAAiB,IAAA,CAAK,kBAAkB,CAAA;AAEzF,IAAA,IAAI,WAAA,CAAY,WACT,MAAA,CAAO,QAAA,CAAS,YAAY,MAAA,CAAO,KAAK,KACxC,MAAA,CAAO,QAAA,CAAS,YAAY,MAAA,CAAO,MAAM,KACzC,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA,IAC3B,WAAA,CAAY,MAAA,CAAO,MAAA,GAAS,CAAA,EACnC;AACI,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,gBAAA,IAAoB,CAAA;AAEnE,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,OAAA,CAAQ,aAAa,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACrC,MAAA,OAAA,CAAQ,SAAA,EAAU;AAClB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACJ,WAAA,CAAY,OAAO,CAAA,GAAI,UAAA;AAAA,QACvB,WAAA,CAAY,OAAO,CAAA,GAAI,UAAA;AAAA,QACvB,WAAA,CAAY,OAAO,KAAA,GAAQ,UAAA;AAAA,QAC3B,WAAA,CAAY,OAAO,MAAA,GAAS;AAAA,OAChC;AACA,MAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,IACjB,CAAA,MAEA;AACI,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,oBAAoB,CAAA,EACxB;AACI,MAAA,IAAA,CAAK,gBAAA,IAAoB,eAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,YAAY,eAAA,EAChB;AACI,MAAA,OAAA,CAAQ,MAAA,GAAS,mBAAmB,MAAA,GAC9B,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,WAAA,CAAY,eAAe,CAAA,CAAA,GAChD,WAAA,CAAY,eAAA;AAAA,IACtB;AAAA,EACJ;AAAA;AAAA,EAGO,GAAA,GACP;AACI,IAAA,MAAM,WAAA,GAAc,KAAK,eAAA,EAAgB;AAEzC,IAAA,IAAI,YAAY,IAAA,EAChB;AACI,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,GAAA,EAAI;AAEzC,IAAA,IAAI,CAAC,UAAA,EACL;AACI,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,aAAA;AAE5C,IAAA,IAAI,YAAY,OAAA,EAChB;AACI,MAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,IACpB,CAAA,MAEA;AACI,MAAA,OAAA,CAAQ,SAAS,UAAA,CAAW,MAAA;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,mBAAmB,UAAA,CAAW,eAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,uBAAA,CAAwB,EAAE,OAAA,EAAS,OAAA,EAAQ,EAClD;AACI,IAAA,IAAI,CAAC,OAAA,EAAS,MAAA,IAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAA,KAAW,CAAC,MAAA,CAAO,OAAO,CAAA,EACjE;AACI,MAAA,OAAO,OAAA;AAAA,IACX;AAEA,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,eAAA,GAAkB,CAAA;AAExB,IAAA,KAAA,MAAW,UAAU,OAAA,EACrB;AACI,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAErB,MAAA,IAAI,CAAC,qBAAA,CAAsB,MAAM,CAAA,EACjC;AACI,QAAA,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAElC,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,SAAA,GAAY,OAAO,qBAAA,EAAsB;AAE/C,MAAA,IAAI,cAAc,IAAA,EAClB;AACI,QAAA,IAAA,CAAK,uBAAuB,MAAM,CAAA;AAElC,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,SAAA,EACJ;AACI,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAC7B;AAAA,IACJ;AAEA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,eAAA,KAAoB,CAAA,EACnD;AACI,MAAA,OAAO,OAAA;AAAA,IACX;AAEA,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,eAAA,CAAgB,OAAO,CAAA;AAElD,IAAA,IAAI,CAAC,MAAA,EACL;AACI,MAAA,OAAO,OAAA;AAAA,IACX;AAEA,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,MAAM,aAAa,OAAA,CAAQ,MAAA,CAAO,WAAA,IAAe,OAAA,CAAQ,OAAO,UAAA,IAAc,CAAA;AAC9E,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AAErB,IAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,0BAAA,CAA2B,KAAA,EAAO,QAAQ,UAAU,CAAA;AACxF,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,gBAAA;AAE5B,IAAA,OAAA,CAAQ,aAAa,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,UAAU,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAEnD,IAAA,IAAI,WAAW,MAAA,EACf;AACI,MAAA,OAAA,CAAQ,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,oBAAoB,CAAA,EACxB;AACI,MAAA,OAAA,CAAQ,WAAA,GAAc,eAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,EAAA,GAAK,MAAM,CAAA,GAAI,UAAA;AACrB,IAAA,MAAM,EAAA,GAAK,MAAM,CAAA,GAAI,UAAA;AACrB,IAAA,MAAM,KAAK,KAAA,GAAQ,UAAA;AACnB,IAAA,MAAM,KAAK,MAAA,GAAS,UAAA;AAEpB,IAAA,OAAA,CAAQ,SAAA;AAAA,MACJ,MAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA;AAAA,MACA,EAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA;AAAA,MACA,EAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA;AAEtB,IAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,UAAU,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAA,CAAqB,aAAgC,MAAA,EAC7D;AACI,IAAA,IAAI,YAAY,WAAA,EAChB;AACI,MAAA,yBAAA,CAA0B,WAAA,CAAY,aAAa,MAAM,CAAA;AAAA,IAC7D,CAAA,MAAA,IACS,WAAA,CAAY,YAAA,CAAa,UAAA,EAClC;AACI,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,YAAA,CAAa,UAAU,CAAA;AAClD,MAAA,MAAA,CAAO,WAAA,CAAY,WAAA,CAAY,SAAA,CAAU,cAAc,CAAA;AAAA,IAC3D,CAAA,MAEA;AACI,MAAA,WAAA,CAAY,SAAA,CAAU,mBAAA,CAAoB,IAAA,EAAM,MAAM,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,YAAY,SAAA,EAChB;AACI,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,SAAA,CAAU,WAAA,IAAe,YAAY,SAAA,CAAU,iBAAA;AAC/E,MAAA,MAAM,uBAAuB,WAAA,EAAa,qBAAA;AAE1C,MAAA,IAAI,oBAAA,EACJ;AACI,QAAA,MAAA,CAAO,YAAY,oBAAoB,CAAA;AAAA,MAC3C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,uBAAuB,MAAA,EAC/B;AACI,IAAA,MAAM,UAAA,GAAa,MAAA,EAAQ,WAAA,EAAa,IAAA,IAAQ,QAAA;AAEhD,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,UAAU,CAAA,EAC1C;AACI,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAI,UAAU,CAAA;AACtC,IAAA,OAAA,CAAQ,IAAA;AAAA,MACJ,2BAA2B,UAAU,CAAA,mDAAA;AAAA,KACzC;AAAA,EACJ;AAAA,EAEA,IAAW,eAAA,GACX;AACI,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAAA,EAEQ,gBAAA,GACR;AACI,IAAA,IAAI,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,iBAAiB,CAAA;AAE1D,IAAA,IAAI,CAAC,WAAA,EACL;AACI,MAAA,WAAA,GAAc,KAAK,YAAA,CAAa,IAAA,CAAK,iBAAiB,CAAA,GAAI,IAAI,iBAAA,EAAkB;AAAA,IACpF;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAA;AAEL,IAAA,OAAO,WAAA;AAAA,EACX;AAAA,EAEQ,eAAA,GACR;AACI,IAAA,IAAI,IAAA,CAAK,qBAAqB,CAAA,EAC9B;AACI,MAAA,OAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAA,CAAK,iBAAA,EAAA;AAEL,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACnD;AAAA;AAAA,EAGO,OAAA,GACP;AACI,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAAA,EAC5B;AACJ;AAAA;AA3Wa,kBAAA,CAGK,SAAA,GAAY;AAAA,EACtB,IAAA,EAAM,CAAC,aAAA,CAAc,YAAY,CAAA;AAAA,EACjC,IAAA,EAAM;AACV,CAAA;AAuWJ,UAAA,CAAW,IAAI,kBAAkB,CAAA;;;;"}