@strapi/data-transfer
Version:
Data transfer capabilities for Strapi
1 lines • 41.5 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../../../src/strapi/providers/remote-source/index.ts"],"sourcesContent":["import { createHash, type Hash } from 'crypto';\nimport { PassThrough, Readable, Writable } from 'stream';\nimport type { Struct, Utils } from '@strapi/types';\nimport { WebSocket } from 'ws';\nimport { castArray } from 'lodash/fp';\n\nimport type {\n IAsset,\n IMetadata,\n ISourceProvider,\n ISourceProviderTransferResults,\n MaybePromise,\n Protocol,\n ProviderType,\n StageTotalsEstimate,\n TransferStage,\n} from '../../../../types';\nimport type { IDiagnosticReporter } from '../../../utils/diagnostic';\nimport { Client, Server, Auth } from '../../../../types/remote/protocol';\nimport { ProviderTransferError, ProviderValidationError } from '../../../errors/providers';\nimport { TRANSFER_PATH } from '../../remote/constants';\nimport { decodeTransferAssetStreamItem } from '../../../utils/transfer-asset-chunk';\nimport { write } from '../../../utils/writable-async-write';\nimport { ILocalStrapiSourceProviderOptions } from '../local-source';\nimport {\n createDispatcher,\n connectToWebsocket,\n trimTrailingSlash,\n type RetryMessageOptions,\n} from '../utils';\n\n/**\n * Pull server answers `assets` step `start` only after `estimateAssetTotals` (DB stream; remote sizes from DB when complete, else HTTP like `createAssetsStream`).\n * That can exceed the default dispatcher wait (~30s between resends, a few minutes total). This message\n * uses a longer window so large libraries do not fail with `Request timed out` before totals are returned.\n */\nconst ASSETS_START_RETRY_OVERRIDES: Partial<RetryMessageOptions> = {\n retryMessageTimeout: 120_000,\n retryMessageMaxRetries: 30,\n};\n\nexport interface IRemoteStrapiSourceProviderOptions extends ILocalStrapiSourceProviderOptions {\n url: URL; // the url of the remote Strapi admin\n auth?: Auth.ITransferTokenAuth;\n retryMessageOptions?: {\n retryMessageTimeout: number; // milliseconds to wait for a response from a message\n retryMessageMaxRetries: number; // max number of retries for a message before aborting transfer\n };\n /** Max ms without forward progress on an asset (new remote chunk accepted or chunk fully handed to the asset stream). */\n streamTimeout?: number;\n /** Require per-asset checksum verification for transferred asset bytes. */\n verifyChecksums?: boolean;\n}\n\ntype QueueableAction = Protocol.Client.TransferAssetFlow &\n ({ action: 'stream' } | { action: 'end' });\n\nclass RemoteStrapiSourceProvider implements ISourceProvider {\n name = 'source::remote-strapi';\n\n type: ProviderType = 'source';\n\n options: IRemoteStrapiSourceProviderOptions;\n\n ws: WebSocket | null;\n\n dispatcher: ReturnType<typeof createDispatcher> | null;\n\n defaultOptions: Partial<IRemoteStrapiSourceProviderOptions> = {\n // Large files + JSON/WS backpressure can go minutes between *messages* while bytes still drain locally\n streamTimeout: 300_000,\n };\n\n constructor(options: IRemoteStrapiSourceProviderOptions) {\n this.options = {\n ...this.defaultOptions,\n ...options,\n };\n this.#checksumsEnabled = this.options.verifyChecksums === true;\n\n this.ws = null;\n this.dispatcher = null;\n }\n\n results?: ISourceProviderTransferResults | undefined;\n\n #diagnostics?: IDiagnosticReporter;\n\n #pullAssetStreamWireSampleLogged = false;\n\n #checksumsEnabled = false;\n\n /** Set from pull server `start` response for `assets` when present (for engine `getStageTotals`). */\n #cachedAssetsTotals?: StageTotalsEstimate;\n\n async #createStageReadStream(stage: Exclude<TransferStage, 'schemas'>) {\n if (stage === 'assets') {\n this.#cachedAssetsTotals = undefined;\n }\n\n const startResult = await this.#startStep(stage);\n\n if (startResult instanceof Error) {\n throw startResult;\n }\n\n const { id: processID, totals } = startResult as {\n id: string;\n totals?: StageTotalsEstimate;\n };\n\n if (stage === 'assets' && totals && (totals.totalBytes != null || totals.totalCount != null)) {\n this.#cachedAssetsTotals = totals;\n }\n\n // Default object-mode HWM (~16 chunks). Do not await `drain` on manual `push` while `pipe()`\n // is attached — drain/`readableLength` races reliably deadlock after a few 1MiB asset frames.\n // Backpressure for pull assets is enforced by the Writable below (`highWaterMark: 1`).\n const stream = new PassThrough({ objectMode: true });\n\n const listener = async (raw: Buffer) => {\n const parsed = JSON.parse(raw.toString());\n // If not a message related to our transfer process, ignore it\n if (!parsed.uuid || parsed?.data?.type !== 'transfer' || parsed?.data?.id !== processID) {\n this.ws?.once('message', listener);\n return;\n }\n\n const { uuid, data: message } = parsed;\n const { ended, error, data } = message;\n\n if (error) {\n await this.#respond(uuid);\n stream.destroy(error);\n return;\n }\n\n if (ended) {\n await this.#respond(uuid);\n await this.#endStep(stage);\n\n stream.end();\n return;\n }\n\n for (const item of castArray(data)) {\n stream.push(item as Parameters<PassThrough['push']>[0]);\n }\n\n this.ws?.once('message', listener);\n\n await this.#respond(uuid);\n };\n\n this.ws?.once('message', listener);\n\n return stream;\n }\n\n createEntitiesReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('entities');\n }\n\n createLinksReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('links');\n }\n\n async createAssetsReadStream(): Promise<Readable> {\n // Create the streams used to transfer the assets\n const stream = await this.#createStageReadStream('assets');\n const pass = new PassThrough({ objectMode: true });\n\n // Init the asset map\n const assets: {\n // TODO: could we include filename in this for improved logging?\n [assetID: string]: IAsset & {\n stream: PassThrough;\n queue: Array<QueueableAction>;\n status: 'ok' | 'closed' | 'errored';\n timeout?: NodeJS.Timeout;\n checksumHash?: Hash;\n };\n } = {};\n\n // Watch for stalled assets: no remote chunks and no completed writes to the asset stream for streamTimeout ms\n const resetTimeout = (assetID: string) => {\n if (!assets[assetID]) {\n return;\n }\n if (assets[assetID].timeout) {\n clearTimeout(assets[assetID].timeout);\n }\n assets[assetID].timeout = setTimeout(() => {\n if (!assets[assetID]) {\n return;\n }\n this.#reportInfo(`Asset ${assetID} transfer stalled, aborting.`);\n assets[assetID].status = 'errored';\n assets[assetID].stream.destroy(new Error(`Asset ${assetID} transfer timed out`));\n }, this.options.streamTimeout);\n };\n\n const clearStallTimeoutForAsset = (assetID: string) => {\n const entry = assets[assetID];\n if (entry?.timeout) {\n clearTimeout(entry.timeout);\n entry.timeout = undefined;\n }\n };\n\n const clearAllStallTimeouts = () => {\n for (const id of Object.keys(assets)) {\n clearStallTimeoutForAsset(id);\n }\n };\n\n /**\n * Serialize asset batch handling: `Readable.on('data', async …)` does not apply backpressure,\n * so we pipe through a Writable with highWaterMark 1 so only one batch is in flight.\n */\n const processAssetPayload = async (payload: Protocol.Client.TransferAssetFlow[]) => {\n for (const item of payload) {\n const { action, assetID } = item;\n\n if (action === 'start') {\n if (assets[assetID]) {\n throw new Error(`Asset ${assetID} already started`);\n }\n\n this.#reportInfo(`Asset ${assetID} starting`);\n assets[assetID] = {\n ...item.data,\n stream: new PassThrough(),\n status: 'ok',\n queue: [],\n ...(this.#checksumsEnabled ? { checksumHash: createHash('sha256') } : {}),\n };\n\n resetTimeout(assetID);\n\n await write(pass, assets[assetID]);\n } else if (action === 'stream' || action === 'end') {\n if (!assets[assetID]) {\n throw new Error(`No id matching ${assetID} for stream action`);\n }\n\n if (action === 'stream') {\n if (!this.#pullAssetStreamWireSampleLogged) {\n this.#pullAssetStreamWireSampleLogged = true;\n const { data } = item;\n // Same legacy shape `decodeTransferAssetStreamData` accepts after JSON.parse (proof, not frame-size guess).\n const legacyBufferJson =\n data &&\n typeof data === 'object' &&\n !Buffer.isBuffer(data) &&\n (data as { type?: string }).type === 'Buffer' &&\n (Array.isArray((data as { data?: unknown }).data) ||\n ArrayBuffer.isView((data as { data?: unknown }).data));\n if (legacyBufferJson) {\n this.#reportWarning(\n '[Data transfer][pull] Remote is using legacy Buffer JSON for asset chunks (each byte as a JSON number). That uses much more memory during JSON.parse than base64. Upgrade the remote Strapi to a version that sends base64 asset chunks, or out-of-memory errors may still happen on large files.'\n );\n }\n }\n resetTimeout(assetID);\n } else {\n clearTimeout(assets[assetID].timeout);\n }\n\n if (assets[assetID].status === 'closed') {\n throw new Error(`Asset ${assetID} is closed`);\n }\n\n assets[assetID].queue.push(item);\n }\n }\n\n for (const assetID in assets) {\n if (Object.prototype.hasOwnProperty.call(assets, assetID)) {\n const asset = assets[assetID];\n if (asset.queue?.length > 0) {\n await processQueue(assetID);\n }\n }\n }\n };\n\n const processor = new Writable({\n objectMode: true,\n highWaterMark: 1,\n write(payload: Protocol.Client.TransferAssetFlow[], _encoding, callback) {\n processAssetPayload(payload).then(\n () => {\n callback();\n },\n (err: Error) => {\n clearAllStallTimeouts();\n stream.destroy(err);\n callback(err);\n }\n );\n },\n final(callback) {\n pass.end();\n callback();\n },\n });\n\n processor.on('error', (err) => {\n clearAllStallTimeouts();\n pass.destroy(err);\n });\n\n stream.on('error', (err) => {\n clearAllStallTimeouts();\n processor.destroy(err);\n pass.destroy(err);\n });\n\n stream.once('end', () => {\n clearAllStallTimeouts();\n });\n\n stream.pipe(processor);\n\n /**\n * Start processing the queue for a given assetID\n *\n * Even though this is a loop that attempts to process the entire queue, it is safe to call this more than once\n * for the same asset id because the queue is shared globally, the items are shifted off, and immediately written\n */\n const processQueue = async (id: string) => {\n if (!assets[id]) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n const { status: currentStatus } = asset;\n\n if (['closed', 'errored'].includes(currentStatus)) {\n throw new Error(\n `Failed to write asset chunk for \"${id}\". The asset is currently \"${currentStatus}\"`\n );\n }\n\n while (asset.queue.length > 0) {\n const data = asset.queue.shift();\n\n if (!data) {\n throw new Error(`Invalid chunk found for ${id}`);\n }\n\n try {\n // if this is an end chunk, close the asset stream\n if (data.action === 'end') {\n this.#reportInfo(`Ending asset stream for ${id}`);\n await closeAssetStream(id, data.checksum);\n break; // Exit the loop after closing the stream\n }\n\n // Save the current chunk\n await writeChunkToStream(id, data);\n } catch (error) {\n if (!assets[id]) {\n throw new Error(`No id matching ${id} for writeAssetChunk`);\n }\n clearStallTimeoutForAsset(id);\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Unexpected error while processing asset chunk for \"${id}\"`);\n }\n }\n };\n\n /**\n * Writes a chunk of data to the asset's stream.\n *\n * Only check if the targeted asset exists, no other validation is done.\n */\n const writeChunkToStream = async (id: string, item: QueueableAction) => {\n const asset = assets[id];\n\n if (!asset) {\n throw new Error(`Failed to write asset chunk for \"${id}\". Asset not found.`);\n }\n\n if (item.action !== 'stream') {\n throw new Error(`Expected stream queue item for \"${id}\"`);\n }\n const chunk = decodeTransferAssetStreamItem(item);\n asset.checksumHash?.update(chunk);\n\n await write(asset.stream, chunk);\n // Count slow draining as progress so backpressure on large chunks does not trip the stall timer\n resetTimeout(id);\n };\n\n /**\n * Closes the asset stream associated with the given ID.\n *\n * It deletes the stream for the asset upon successful closure.\n */\n const closeAssetStream = async (\n id: string,\n checksum?: { algorithm: 'sha256'; value: string }\n ) => {\n if (!assets[id]) {\n throw new Error(`Failed to close asset \"${id}\". Asset not found.`);\n }\n\n const asset = assets[id];\n // The queue processes stream chunks before `end`; the last `writeChunkToStream` calls\n // `resetTimeout` after the `end` chunk already cleared the timer — clear again before closing.\n clearStallTimeoutForAsset(id);\n\n if (this.#checksumsEnabled) {\n if (!checksum) {\n throw new ProviderTransferError(\n `Asset ${id} is missing checksum in transfer end payload`\n );\n }\n if (checksum.algorithm !== 'sha256') {\n throw new ProviderTransferError(\n `Asset ${id} checksum algorithm \"${checksum.algorithm}\" is not supported`\n );\n }\n const actual = asset.checksumHash?.digest('hex');\n if (!actual || actual !== checksum.value) {\n throw new ProviderTransferError(\n `Checksum mismatch for asset \"${id}\" (expected ${checksum.value}, got ${actual ?? 'none'})`\n );\n }\n }\n asset.status = 'closed';\n\n await new Promise<void>((resolve, reject) => {\n const { stream } = asset;\n\n stream\n .on('close', () => {\n delete assets[id];\n resolve();\n })\n .on('error', (e) => {\n delete assets[id];\n reject(new Error(`Failed to close asset \"${id}\". Asset stream error: ${e.toString()}`));\n })\n .end();\n });\n };\n\n return pass;\n }\n\n createConfigurationReadStream(): MaybePromise<Readable> {\n return this.#createStageReadStream('configuration');\n }\n\n async getMetadata(): Promise<IMetadata | null> {\n const metadata = await this.dispatcher?.dispatchTransferAction<IMetadata>('getMetadata');\n\n return metadata ?? null;\n }\n\n assertValidProtocol(url: URL) {\n const validProtocols = ['https:', 'http:'];\n\n if (!validProtocols.includes(url.protocol)) {\n throw new ProviderValidationError(`Invalid protocol \"${url.protocol}\"`, {\n check: 'url',\n details: {\n protocol: url.protocol,\n validProtocols,\n },\n });\n }\n }\n\n async initTransfer(): Promise<string> {\n const wantsChecksums = this.options.verifyChecksums === true;\n const query = this.dispatcher?.dispatchCommand({\n command: 'init',\n ...(wantsChecksums ? { params: { transfer: 'pull', checksums: true } } : {}),\n });\n\n const res = (await query) as\n | (Server.Payload<Server.InitMessage> & { checksums?: boolean })\n | null;\n\n if (!res?.transferID) {\n throw new ProviderTransferError('Init failed, invalid response from the server');\n }\n this.#checksumsEnabled = wantsChecksums && res.checksums === true;\n if (wantsChecksums && res.checksums !== true) {\n this.#reportWarning(\n '[Data transfer][pull] Checksums were requested but the remote does not support checksum negotiation; continuing without checksum validation.'\n );\n }\n\n return res.transferID;\n }\n\n #reportInfo(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'info',\n });\n }\n\n /** Reports a warning diagnostic (`kind: 'warning'`). Consumers (e.g. CLI) choose log levels and routing. */\n #reportWarning(message: string) {\n this.#diagnostics?.report({\n details: {\n createdAt: new Date(),\n message,\n origin: 'remote-source-provider',\n },\n kind: 'warning',\n });\n }\n\n async bootstrap(diagnostics?: IDiagnosticReporter): Promise<void> {\n this.#diagnostics = diagnostics;\n const { url, auth } = this.options;\n let ws: WebSocket;\n this.assertValidProtocol(url);\n const wsProtocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n const wsUrl = `${wsProtocol}//${url.host}${trimTrailingSlash(\n url.pathname\n )}${TRANSFER_PATH}/pull`;\n\n this.#pullAssetStreamWireSampleLogged = false;\n\n this.#reportInfo('establishing websocket connection');\n // No auth defined, trying public access for transfer\n if (!auth) {\n ws = await connectToWebsocket(wsUrl, undefined, this.#diagnostics);\n }\n\n // Common token auth, this should be the main auth method\n else if (auth.type === 'token') {\n const headers = { Authorization: `Bearer ${auth.token}` };\n ws = await connectToWebsocket(wsUrl, { headers }, this.#diagnostics);\n }\n\n // Invalid auth method provided\n else {\n throw new ProviderValidationError('Auth method not available', {\n check: 'auth.type',\n details: {\n auth: auth.type,\n },\n });\n }\n\n this.#reportInfo('established websocket connection');\n this.ws = ws;\n const { retryMessageOptions } = this.options;\n\n this.#reportInfo('creating dispatcher');\n this.dispatcher = createDispatcher(this.ws, retryMessageOptions, (message: string) =>\n this.#reportInfo(message)\n );\n this.#reportInfo('created dispatcher');\n\n this.#reportInfo('initialize transfer');\n const transferID = await this.initTransfer();\n this.#reportInfo(`initialized transfer ${transferID}`);\n\n this.dispatcher.setTransferProperties({ id: transferID, kind: 'pull' });\n await this.dispatcher.dispatchTransferAction('bootstrap');\n }\n\n async close() {\n await this.dispatcher?.dispatchTransferAction('close');\n\n await new Promise<void>((resolve) => {\n const { ws } = this;\n\n if (!ws || ws.CLOSED) {\n resolve();\n return;\n }\n\n ws.on('close', () => resolve()).close();\n });\n }\n\n async getSchemas() {\n const schemas =\n await this.dispatcher?.dispatchTransferAction<Utils.String.Dict<Struct.Schema>>('getSchemas');\n\n return schemas ?? null;\n }\n\n async getStageTotals(stage: TransferStage): Promise<StageTotalsEstimate | null> {\n if (stage !== 'assets') {\n return null;\n }\n const cached = this.#cachedAssetsTotals;\n return cached ?? null;\n }\n\n async #startStep<T extends Client.TransferPullStep>(step: T) {\n try {\n return await this.dispatcher?.dispatchTransferStep(\n { action: 'start', step },\n step === 'assets' ? { retryOverrides: ASSETS_START_RETRY_OVERRIDES } : undefined\n );\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n }\n\n async #respond(uuid: string) {\n return new Promise((resolve, reject) => {\n this.ws?.send(JSON.stringify({ uuid }), (e) => {\n if (e) {\n reject(e);\n } else {\n resolve(e);\n }\n });\n });\n }\n\n async #endStep<T extends Client.TransferPullStep>(step: T) {\n try {\n await this.dispatcher?.dispatchTransferStep({ action: 'end', step });\n } catch (e) {\n if (e instanceof Error) {\n return e;\n }\n\n if (typeof e === 'string') {\n return new ProviderTransferError(e);\n }\n\n return new ProviderTransferError('Unexpected error');\n }\n\n return null;\n }\n}\n\nexport const createRemoteStrapiSourceProvider = (options: IRemoteStrapiSourceProviderOptions) => {\n return new RemoteStrapiSourceProvider(options);\n};\n"],"names":["ASSETS_START_RETRY_OVERRIDES","retryMessageTimeout","retryMessageMaxRetries","RemoteStrapiSourceProvider","createEntitiesReadStream","createLinksReadStream","createAssetsReadStream","stream","pass","PassThrough","objectMode","assets","resetTimeout","assetID","timeout","clearTimeout","setTimeout","status","destroy","Error","options","streamTimeout","clearStallTimeoutForAsset","entry","undefined","clearAllStallTimeouts","id","Object","keys","processAssetPayload","payload","item","action","data","queue","checksumHash","createHash","write","legacyBufferJson","Buffer","isBuffer","type","Array","isArray","ArrayBuffer","isView","push","prototype","hasOwnProperty","call","asset","length","processQueue","processor","Writable","highWaterMark","_encoding","callback","then","err","final","end","on","once","pipe","currentStatus","includes","shift","closeAssetStream","checksum","writeChunkToStream","error","chunk","decodeTransferAssetStreamItem","update","ProviderTransferError","algorithm","actual","digest","value","Promise","resolve","reject","e","toString","createConfigurationReadStream","getMetadata","metadata","dispatcher","dispatchTransferAction","assertValidProtocol","url","validProtocols","protocol","ProviderValidationError","check","details","initTransfer","wantsChecksums","verifyChecksums","query","dispatchCommand","command","params","transfer","checksums","res","transferID","bootstrap","diagnostics","auth","ws","wsProtocol","wsUrl","host","trimTrailingSlash","pathname","TRANSFER_PATH","connectToWebsocket","headers","Authorization","token","retryMessageOptions","createDispatcher","message","setTransferProperties","kind","close","CLOSED","getSchemas","schemas","getStageTotals","stage","cached","name","defaultOptions","startResult","processID","totals","totalBytes","totalCount","listener","raw","parsed","JSON","parse","uuid","ended","castArray","report","createdAt","Date","origin","step","dispatchTransferStep","retryOverrides","send","stringify","createRemoteStrapiSourceProvider"],"mappings":";;;;;;;;;;;;;;;;;;;AA+BA;;;;AAIC,IACD,MAAMA,4BAAAA,GAA6D;IACjEC,mBAAAA,EAAqB,MAAA;IACrBC,sBAAAA,EAAwB;AAC1B,CAAA;IA+CE,YAAA,iBAAA,8BAAA,CAAA,cAAA,CAAA,EAEA,gCAAA,iBAAA,8BAAA,CAAA,kCAAA,CAAA,EAEA,iBAAA,iBAAA,8BAAA,CAAA,mBAAA,CAAA,wGAGA,mBAAA,iBAAA,8BAAA,CAAA,qBAAA,CAAA,EAEM,sBAAA,iBAAA,8BAAA,CAAA,wBAAA,CAAA,EAwZN,WAAA,iBAAA,8BAAA,CAAA,aAAA,CAAA,+GAYA,cAAA,iBAAA,8BAAA,CAAA,gBAAA,CAAA,EA6FM,UAAA,iBAAA,8BAAA,CAAA,YAAA,CAAA,EAmBA,QAAA,iBAAA,8BAAA,CAAA,UAAA,CAAA,EAYA,QAAA,iBAAA,8BAAA,CAAA,UAAA,CAAA;AAtkBR,MAAMC,0BAAAA,CAAAA;IAsGJC,wBAAAA,GAAmD;AACjD,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,sBAAA,CAAA,CAAA,sBAAA,CAAA,CAAuB,UAAA,CAAA;AACrC,IAAA;IAEAC,qBAAAA,GAAgD;AAC9C,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,sBAAA,CAAA,CAAA,sBAAA,CAAA,CAAuB,OAAA,CAAA;AACrC,IAAA;AAEA,IAAA,MAAMC,sBAAAA,GAA4C;;AAEhD,QAAA,MAAMC,SAAS,MAAM,+BAAA,CAAA,IAAI,EAAC,wBAAA,sBAAA,CAAA,CAAuB,QAAA,CAAA;QACjD,MAAMC,IAAAA,GAAO,IAAIC,WAAAA,CAAY;YAAEC,UAAAA,EAAY;AAAK,SAAA,CAAA;;AAGhD,QAAA,MAAMC,SASF,EAAC;;AAGL,QAAA,MAAMC,eAAe,CAACC,OAAAA,GAAAA;AACpB,YAAA,IAAI,CAACF,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACpB,gBAAA;AACF,YAAA;AACA,YAAA,IAAIF,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,EAAE;AAC3BC,gBAAAA,YAAAA,CAAaJ,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,CAAA;AACtC,YAAA;AACAH,YAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,GAAGE,UAAAA,CAAW,IAAA;AACnC,gBAAA,IAAI,CAACL,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACpB,oBAAA;AACF,gBAAA;gBACA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,CAAC,MAAM,EAAEA,OAAAA,CAAQ,4BAA4B,CAAC,CAAA;AAC/DF,gBAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACI,MAAM,GAAG,SAAA;AACzBN,gBAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACN,MAAM,CAACW,OAAO,CAAC,IAAIC,KAAAA,CAAM,CAAC,MAAM,EAAEN,OAAAA,CAAQ,mBAAmB,CAAC,CAAA,CAAA;AAChF,YAAA,CAAA,EAAG,IAAI,CAACO,OAAO,CAACC,aAAa,CAAA;AAC/B,QAAA,CAAA;AAEA,QAAA,MAAMC,4BAA4B,CAACT,OAAAA,GAAAA;YACjC,MAAMU,KAAAA,GAAQZ,MAAM,CAACE,OAAAA,CAAQ;AAC7B,YAAA,IAAIU,OAAOT,OAAAA,EAAS;AAClBC,gBAAAA,YAAAA,CAAaQ,MAAMT,OAAO,CAAA;AAC1BS,gBAAAA,KAAAA,CAAMT,OAAO,GAAGU,SAAAA;AAClB,YAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAMC,qBAAAA,GAAwB,IAAA;AAC5B,YAAA,KAAK,MAAMC,EAAAA,IAAMC,MAAAA,CAAOC,IAAI,CAACjB,MAAAA,CAAAA,CAAS;gBACpCW,yBAAAA,CAA0BI,EAAAA,CAAAA;AAC5B,YAAA;AACF,QAAA,CAAA;AAEA;;;QAIA,MAAMG,sBAAsB,OAAOC,OAAAA,GAAAA;YACjC,KAAK,MAAMC,QAAQD,OAAAA,CAAS;AAC1B,gBAAA,MAAM,EAAEE,MAAM,EAAEnB,OAAO,EAAE,GAAGkB,IAAAA;AAE5B,gBAAA,IAAIC,WAAW,OAAA,EAAS;oBACtB,IAAIrB,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACnB,wBAAA,MAAM,IAAIM,KAAAA,CAAM,CAAC,MAAM,EAAEN,OAAAA,CAAQ,gBAAgB,CAAC,CAAA;AACpD,oBAAA;oBAEA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,CAAC,MAAM,EAAEA,OAAAA,CAAQ,SAAS,CAAC,CAAA;oBAC5CF,MAAM,CAACE,QAAQ,GAAG;AAChB,wBAAA,GAAGkB,KAAKE,IAAI;AACZ1B,wBAAAA,MAAAA,EAAQ,IAAIE,WAAAA,EAAAA;wBACZQ,MAAAA,EAAQ,IAAA;AACRiB,wBAAAA,KAAAA,EAAO,EAAE;AACT,wBAAA,GAAI,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoB;AAAEC,4BAAAA,YAAAA,EAAcC,UAAAA,CAAW,QAAA;AAAU,yBAAA,GAAI;AACxE,qBAAA;oBAEAxB,YAAAA,CAAaC,OAAAA,CAAAA;AAEb,oBAAA,MAAMwB,KAAAA,CAAM7B,IAAAA,EAAMG,MAAM,CAACE,OAAAA,CAAQ,CAAA;AACnC,gBAAA,CAAA,MAAO,IAAImB,MAAAA,KAAW,QAAA,IAAYA,MAAAA,KAAW,KAAA,EAAO;AAClD,oBAAA,IAAI,CAACrB,MAAM,CAACE,OAAAA,CAAQ,EAAE;AACpB,wBAAA,MAAM,IAAIM,KAAAA,CAAM,CAAC,eAAe,EAAEN,OAAAA,CAAQ,kBAAkB,CAAC,CAAA;AAC/D,oBAAA;AAEA,oBAAA,IAAImB,WAAW,QAAA,EAAU;AACvB,wBAAA,IAAI,CAAC,+BAAA,CAAA,IAAI,EAAC,kCAAA,gCAAA,CAAA,EAAkC;4BAC1C,+BAAA,CAAA,IAAI,EAAC,gCAAA,CAAA,CAAA,gCAAA,CAAA,GAAmC,IAAA;4BACxC,MAAM,EAAEC,IAAI,EAAE,GAAGF,IAAAA;;AAEjB,4BAAA,MAAMO,gBAAAA,GACJL,IAAAA,IACA,OAAOA,IAAAA,KAAS,QAAA,IAChB,CAACM,MAAAA,CAAOC,QAAQ,CAACP,IAAAA,CAAAA,IACjB,IAACA,CAA2BQ,IAAI,KAAK,QAAA,KACpCC,KAAAA,CAAMC,OAAO,CAAEV,IAAAA,CAA4BA,IAAI,CAAA,IAC9CW,WAAAA,CAAYC,MAAM,CAAC,IAACZ,CAA4BA,IAAI,CAAA,CAAA;AACxD,4BAAA,IAAIK,gBAAAA,EAAkB;gCACpB,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CACH,mSAAA,CAAA;AAEJ,4BAAA;AACF,wBAAA;wBACA1B,YAAAA,CAAaC,OAAAA,CAAAA;oBACf,CAAA,MAAO;AACLE,wBAAAA,YAAAA,CAAaJ,MAAM,CAACE,OAAAA,CAAQ,CAACC,OAAO,CAAA;AACtC,oBAAA;AAEA,oBAAA,IAAIH,MAAM,CAACE,OAAAA,CAAQ,CAACI,MAAM,KAAK,QAAA,EAAU;AACvC,wBAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,MAAM,EAAEN,OAAAA,CAAQ,UAAU,CAAC,CAAA;AAC9C,oBAAA;AAEAF,oBAAAA,MAAM,CAACE,OAAAA,CAAQ,CAACqB,KAAK,CAACY,IAAI,CAACf,IAAAA,CAAAA;AAC7B,gBAAA;AACF,YAAA;YAEA,IAAK,MAAMlB,WAAWF,MAAAA,CAAQ;gBAC5B,IAAIgB,MAAAA,CAAOoB,SAAS,CAACC,cAAc,CAACC,IAAI,CAACtC,QAAQE,OAAAA,CAAAA,EAAU;oBACzD,MAAMqC,KAAAA,GAAQvC,MAAM,CAACE,OAAAA,CAAQ;AAC7B,oBAAA,IAAIqC,KAAAA,CAAMhB,KAAK,EAAEiB,MAAAA,GAAS,CAAA,EAAG;AAC3B,wBAAA,MAAMC,YAAAA,CAAavC,OAAAA,CAAAA;AACrB,oBAAA;AACF,gBAAA;AACF,YAAA;AACF,QAAA,CAAA;QAEA,MAAMwC,SAAAA,GAAY,IAAIC,QAAAA,CAAS;YAC7B5C,UAAAA,EAAY,IAAA;YACZ6C,aAAAA,EAAe,CAAA;AACflB,YAAAA,KAAAA,CAAAA,CAAMP,OAA4C,EAAE0B,SAAS,EAAEC,QAAQ,EAAA;gBACrE5B,mBAAAA,CAAoBC,OAAAA,CAAAA,CAAS4B,IAAI,CAC/B,IAAA;AACED,oBAAAA,QAAAA,EAAAA;AACF,gBAAA,CAAA,EACA,CAACE,GAAAA,GAAAA;AACClC,oBAAAA,qBAAAA,EAAAA;AACAlB,oBAAAA,MAAAA,CAAOW,OAAO,CAACyC,GAAAA,CAAAA;oBACfF,QAAAA,CAASE,GAAAA,CAAAA;AACX,gBAAA,CAAA,CAAA;AAEJ,YAAA,CAAA;AACAC,YAAAA,KAAAA,CAAAA,CAAMH,QAAQ,EAAA;AACZjD,gBAAAA,IAAAA,CAAKqD,GAAG,EAAA;AACRJ,gBAAAA,QAAAA,EAAAA;AACF,YAAA;AACF,SAAA,CAAA;QAEAJ,SAAAA,CAAUS,EAAE,CAAC,OAAA,EAAS,CAACH,GAAAA,GAAAA;AACrBlC,YAAAA,qBAAAA,EAAAA;AACAjB,YAAAA,IAAAA,CAAKU,OAAO,CAACyC,GAAAA,CAAAA;AACf,QAAA,CAAA,CAAA;QAEApD,MAAAA,CAAOuD,EAAE,CAAC,OAAA,EAAS,CAACH,GAAAA,GAAAA;AAClBlC,YAAAA,qBAAAA,EAAAA;AACA4B,YAAAA,SAAAA,CAAUnC,OAAO,CAACyC,GAAAA,CAAAA;AAClBnD,YAAAA,IAAAA,CAAKU,OAAO,CAACyC,GAAAA,CAAAA;AACf,QAAA,CAAA,CAAA;QAEApD,MAAAA,CAAOwD,IAAI,CAAC,KAAA,EAAO,IAAA;AACjBtC,YAAAA,qBAAAA,EAAAA;AACF,QAAA,CAAA,CAAA;AAEAlB,QAAAA,MAAAA,CAAOyD,IAAI,CAACX,SAAAA,CAAAA;AAEZ;;;;;QAMA,MAAMD,eAAe,OAAO1B,EAAAA,GAAAA;AAC1B,YAAA,IAAI,CAACf,MAAM,CAACe,EAAAA,CAAG,EAAE;AACf,gBAAA,MAAM,IAAIP,KAAAA,CAAM,CAAC,iCAAiC,EAAEO,EAAAA,CAAG,mBAAmB,CAAC,CAAA;AAC7E,YAAA;YAEA,MAAMwB,KAAAA,GAAQvC,MAAM,CAACe,EAAAA,CAAG;AACxB,YAAA,MAAM,EAAET,MAAAA,EAAQgD,aAAa,EAAE,GAAGf,KAAAA;YAElC,IAAI;AAAC,gBAAA,QAAA;AAAU,gBAAA;aAAU,CAACgB,QAAQ,CAACD,aAAAA,CAAAA,EAAgB;gBACjD,MAAM,IAAI9C,KAAAA,CACR,CAAC,iCAAiC,EAAEO,GAAG,2BAA2B,EAAEuC,aAAAA,CAAc,CAAC,CAAC,CAAA;AAExF,YAAA;AAEA,YAAA,MAAOf,KAAAA,CAAMhB,KAAK,CAACiB,MAAM,GAAG,CAAA,CAAG;AAC7B,gBAAA,MAAMlB,IAAAA,GAAOiB,KAAAA,CAAMhB,KAAK,CAACiC,KAAK,EAAA;AAE9B,gBAAA,IAAI,CAAClC,IAAAA,EAAM;AACT,oBAAA,MAAM,IAAId,KAAAA,CAAM,CAAC,wBAAwB,EAAEO,EAAAA,CAAAA,CAAI,CAAA;AACjD,gBAAA;gBAEA,IAAI;;oBAEF,IAAIO,IAAAA,CAAKD,MAAM,KAAK,KAAA,EAAO;AACzB,wBAAA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,aAAY,CAAC,wBAAwB,EAAEN,EAAAA,CAAAA,CAAI,CAAA;wBAChD,MAAM0C,gBAAAA,CAAiB1C,EAAAA,EAAIO,IAAAA,CAAKoC,QAAQ,CAAA;AACxC,wBAAA,MAAA;AACF,oBAAA;;AAGA,oBAAA,MAAMC,mBAAmB5C,EAAAA,EAAIO,IAAAA,CAAAA;AAC/B,gBAAA,CAAA,CAAE,OAAOsC,KAAAA,EAAO;AACd,oBAAA,IAAI,CAAC5D,MAAM,CAACe,EAAAA,CAAG,EAAE;AACf,wBAAA,MAAM,IAAIP,KAAAA,CAAM,CAAC,eAAe,EAAEO,EAAAA,CAAG,oBAAoB,CAAC,CAAA;AAC5D,oBAAA;oBACAJ,yBAAAA,CAA0BI,EAAAA,CAAAA;AAC1B,oBAAA,IAAI6C,iBAAiBpD,KAAAA,EAAO;wBAC1B,MAAMoD,KAAAA;AACR,oBAAA;AACA,oBAAA,MAAM,IAAIpD,KAAAA,CAAM,CAAC,mDAAmD,EAAEO,EAAAA,CAAG,CAAC,CAAC,CAAA;AAC7E,gBAAA;AACF,YAAA;AACF,QAAA,CAAA;AAEA;;;;QAKA,MAAM4C,kBAAAA,GAAqB,OAAO5C,EAAAA,EAAYK,IAAAA,GAAAA;YAC5C,MAAMmB,KAAAA,GAAQvC,MAAM,CAACe,EAAAA,CAAG;AAExB,YAAA,IAAI,CAACwB,KAAAA,EAAO;AACV,gBAAA,MAAM,IAAI/B,KAAAA,CAAM,CAAC,iCAAiC,EAAEO,EAAAA,CAAG,mBAAmB,CAAC,CAAA;AAC7E,YAAA;YAEA,IAAIK,IAAAA,CAAKC,MAAM,KAAK,QAAA,EAAU;AAC5B,gBAAA,MAAM,IAAIb,KAAAA,CAAM,CAAC,gCAAgC,EAAEO,EAAAA,CAAG,CAAC,CAAC,CAAA;AAC1D,YAAA;AACA,YAAA,MAAM8C,QAAQC,6BAAAA,CAA8B1C,IAAAA,CAAAA;YAC5CmB,KAAAA,CAAMf,YAAY,EAAEuC,MAAAA,CAAOF,KAAAA,CAAAA;YAE3B,MAAMnC,KAAAA,CAAMa,KAAAA,CAAM3C,MAAM,EAAEiE,KAAAA,CAAAA;;YAE1B5D,YAAAA,CAAac,EAAAA,CAAAA;AACf,QAAA,CAAA;AAEA;;;;QAKA,MAAM0C,gBAAAA,GAAmB,OACvB1C,EAAAA,EACA2C,QAAAA,GAAAA;AAEA,YAAA,IAAI,CAAC1D,MAAM,CAACe,EAAAA,CAAG,EAAE;AACf,gBAAA,MAAM,IAAIP,KAAAA,CAAM,CAAC,uBAAuB,EAAEO,EAAAA,CAAG,mBAAmB,CAAC,CAAA;AACnE,YAAA;YAEA,MAAMwB,KAAAA,GAAQvC,MAAM,CAACe,EAAAA,CAAG;;;YAGxBJ,yBAAAA,CAA0BI,EAAAA,CAAAA;AAE1B,YAAA,IAAI,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA,EAAmB;AAC1B,gBAAA,IAAI,CAAC2C,QAAAA,EAAU;AACb,oBAAA,MAAM,IAAIM,qBAAAA,CACR,CAAC,MAAM,EAAEjD,EAAAA,CAAG,4CAA4C,CAAC,CAAA;AAE7D,gBAAA;gBACA,IAAI2C,QAAAA,CAASO,SAAS,KAAK,QAAA,EAAU;AACnC,oBAAA,MAAM,IAAID,qBAAAA,CACR,CAAC,MAAM,EAAEjD,EAAAA,CAAG,qBAAqB,EAAE2C,QAAAA,CAASO,SAAS,CAAC,kBAAkB,CAAC,CAAA;AAE7E,gBAAA;AACA,gBAAA,MAAMC,MAAAA,GAAS3B,KAAAA,CAAMf,YAAY,EAAE2C,MAAAA,CAAO,KAAA,CAAA;AAC1C,gBAAA,IAAI,CAACD,MAAAA,IAAUA,MAAAA,KAAWR,QAAAA,CAASU,KAAK,EAAE;AACxC,oBAAA,MAAM,IAAIJ,qBAAAA,CACR,CAAC,6BAA6B,EAAEjD,GAAG,YAAY,EAAE2C,QAAAA,CAASU,KAAK,CAAC,MAAM,EAAEF,MAAAA,IAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAE/F,gBAAA;AACF,YAAA;AACA3B,YAAAA,KAAAA,CAAMjC,MAAM,GAAG,QAAA;YAEf,MAAM,IAAI+D,OAAAA,CAAc,CAACC,OAAAA,EAASC,MAAAA,GAAAA;gBAChC,MAAM,EAAE3E,MAAM,EAAE,GAAG2C,KAAAA;gBAEnB3C,MAAAA,CACGuD,EAAE,CAAC,OAAA,EAAS,IAAA;oBACX,OAAOnD,MAAM,CAACe,EAAAA,CAAG;AACjBuD,oBAAAA,OAAAA,EAAAA;gBACF,CAAA,CAAA,CACCnB,EAAE,CAAC,OAAA,EAAS,CAACqB,CAAAA,GAAAA;oBACZ,OAAOxE,MAAM,CAACe,EAAAA,CAAG;oBACjBwD,MAAAA,CAAO,IAAI/D,KAAAA,CAAM,CAAC,uBAAuB,EAAEO,GAAG,uBAAuB,EAAEyD,CAAAA,CAAEC,QAAQ,EAAA,CAAA,CAAI,CAAA,CAAA;AACvF,gBAAA,CAAA,CAAA,CACCvB,GAAG,EAAA;AACR,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;QAEA,OAAOrD,IAAAA;AACT,IAAA;IAEA6E,6BAAAA,GAAwD;AACtD,QAAA,OAAO,+BAAA,CAAA,IAAI,EAAC,sBAAA,CAAA,CAAA,sBAAA,CAAA,CAAuB,eAAA,CAAA;AACrC,IAAA;AAEA,IAAA,MAAMC,WAAAA,GAAyC;AAC7C,QAAA,MAAMC,WAAW,MAAM,IAAI,CAACC,UAAU,EAAEC,sBAAAA,CAAkC,aAAA,CAAA;AAE1E,QAAA,OAAOF,QAAAA,IAAY,IAAA;AACrB,IAAA;AAEAG,IAAAA,mBAAAA,CAAoBC,GAAQ,EAAE;AAC5B,QAAA,MAAMC,cAAAA,GAAiB;AAAC,YAAA,QAAA;AAAU,YAAA;AAAQ,SAAA;AAE1C,QAAA,IAAI,CAACA,cAAAA,CAAe1B,QAAQ,CAACyB,GAAAA,CAAIE,QAAQ,CAAA,EAAG;YAC1C,MAAM,IAAIC,uBAAAA,CAAwB,CAAC,kBAAkB,EAAEH,IAAIE,QAAQ,CAAC,CAAC,CAAC,EAAE;gBACtEE,KAAAA,EAAO,KAAA;gBACPC,OAAAA,EAAS;AACPH,oBAAAA,QAAAA,EAAUF,IAAIE,QAAQ;AACtBD,oBAAAA;AACF;AACF,aAAA,CAAA;AACF,QAAA;AACF,IAAA;AAEA,IAAA,MAAMK,YAAAA,GAAgC;AACpC,QAAA,MAAMC,iBAAiB,IAAI,CAAC9E,OAAO,CAAC+E,eAAe,KAAK,IAAA;AACxD,QAAA,MAAMC,KAAAA,GAAQ,IAAI,CAACZ,UAAU,EAAEa,eAAAA,CAAgB;YAC7CC,OAAAA,EAAS,MAAA;AACT,YAAA,GAAIJ,cAAAA,GAAiB;gBAAEK,MAAAA,EAAQ;oBAAEC,QAAAA,EAAU,MAAA;oBAAQC,SAAAA,EAAW;AAAK;AAAE,aAAA,GAAI;AAC3E,SAAA,CAAA;AAEA,QAAA,MAAMC,MAAO,MAAMN,KAAAA;QAInB,IAAI,CAACM,KAAKC,UAAAA,EAAY;AACpB,YAAA,MAAM,IAAIhC,qBAAAA,CAAsB,+CAAA,CAAA;AAClC,QAAA;AACA,QAAA,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,qBAAoBuB,cAAAA,IAAkBQ,GAAAA,CAAID,SAAS,KAAK,IAAA;AAC7D,QAAA,IAAIP,cAAAA,IAAkBQ,GAAAA,CAAID,SAAS,KAAK,IAAA,EAAM;YAC5C,+BAAA,CAAA,IAAI,EAAC,cAAA,CAAA,CAAA,cAAA,CAAA,CACH,8IAAA,CAAA;AAEJ,QAAA;AAEA,QAAA,OAAOC,IAAIC,UAAU;AACvB,IAAA;IAyBA,MAAMC,SAAAA,CAAUC,WAAiC,EAAiB;QAChE,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,GAAeA,WAAAA;QACpB,MAAM,EAAElB,GAAG,EAAEmB,IAAI,EAAE,GAAG,IAAI,CAAC1F,OAAO;QAClC,IAAI2F,EAAAA;QACJ,IAAI,CAACrB,mBAAmB,CAACC,GAAAA,CAAAA;AACzB,QAAA,MAAMqB,UAAAA,GAAarB,GAAAA,CAAIE,QAAQ,KAAK,WAAW,MAAA,GAAS,KAAA;AACxD,QAAA,MAAMoB,KAAAA,GAAQ,CAAA,EAAGD,UAAAA,CAAW,EAAE,EAAErB,GAAAA,CAAIuB,IAAI,CAAA,EAAGC,iBAAAA,CACzCxB,GAAAA,CAAIyB,QAAQ,CAAA,CAAA,EACVC,aAAAA,CAAc,KAAK,CAAC;QAExB,+BAAA,CAAA,IAAI,EAAC,gCAAA,CAAA,CAAA,gCAAA,CAAA,GAAmC,KAAA;QAExC,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,mCAAA,CAAA;;AAEjB,QAAA,IAAI,CAACP,IAAAA,EAAM;AACTC,YAAAA,EAAAA,GAAK,MAAMO,kBAAAA,CAAmBL,KAAAA,EAAOzF,WAAW,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACvD,QAAA,CAAA,MAGK,IAAIsF,IAAAA,CAAKrE,IAAI,KAAK,OAAA,EAAS;AAC9B,YAAA,MAAM8E,OAAAA,GAAU;AAAEC,gBAAAA,aAAAA,EAAe,CAAC,OAAO,EAAEV,IAAAA,CAAKW,KAAK,CAAA;AAAG,aAAA;YACxDV,EAAAA,GAAK,MAAMO,mBAAmBL,KAAAA,EAAO;AAAEM,gBAAAA;aAAQ,EAAG,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,CAAA;QACzD,CAAA,MAGK;YACH,MAAM,IAAIzB,wBAAwB,2BAAA,EAA6B;gBAC7DC,KAAAA,EAAO,WAAA;gBACPC,OAAAA,EAAS;AACPc,oBAAAA,IAAAA,EAAMA,KAAKrE;AACb;AACF,aAAA,CAAA;AACF,QAAA;QAEA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,kCAAA,CAAA;QACjB,IAAI,CAACsE,EAAE,GAAGA,EAAAA;AACV,QAAA,MAAM,EAAEW,mBAAmB,EAAE,GAAG,IAAI,CAACtG,OAAO;QAE5C,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qBAAA,CAAA;AACjB,QAAA,IAAI,CAACoE,UAAU,GAAGmC,gBAAAA,CAAiB,IAAI,CAACZ,EAAE,EAAEW,mBAAAA,EAAqB,CAACE,OAAAA,GAChE,+BAAA,CAAA,IAAI,EAAC,aAAA,WAAA,CAAA,CAAYA,OAAAA,CAAAA,CAAAA;QAEnB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,oBAAA,CAAA;QAEjB,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,WAAA,CAAA,CAAY,qBAAA,CAAA;AACjB,QAAA,MAAMjB,UAAAA,GAAa,MAAM,IAAI,CAACV,YAAY,EAAA;AAC1C,QAAA,+BAAA,CAAA,IAAI,EAAC,WAAA,CAAA,CAAA,aAAY,CAAC,qBAAqB,EAAEU,UAAAA,CAAAA,CAAY,CAAA;AAErD,QAAA,IAAI,CAACnB,UAAU,CAACqC,qBAAqB,CAAC;YAAEnG,EAAAA,EAAIiF,UAAAA;YAAYmB,IAAAA,EAAM;AAAO,SAAA,CAAA;AACrE,QAAA,MAAM,IAAI,CAACtC,UAAU,CAACC,sBAAsB,CAAC,WAAA,CAAA;AAC/C,IAAA;AAEA,IAAA,MAAMsC,KAAAA,GAAQ;AACZ,QAAA,MAAM,IAAI,CAACvC,UAAU,EAAEC,sBAAAA,CAAuB,OAAA,CAAA;QAE9C,MAAM,IAAIT,QAAc,CAACC,OAAAA,GAAAA;AACvB,YAAA,MAAM,EAAE8B,EAAE,EAAE,GAAG,IAAI;AAEnB,YAAA,IAAI,CAACA,EAAAA,IAAMA,EAAAA,CAAGiB,MAAM,EAAE;AACpB/C,gBAAAA,OAAAA,EAAAA;AACA,gBAAA;AACF,YAAA;AAEA8B,YAAAA,EAAAA,CAAGjD,EAAE,CAAC,OAAA,EAAS,IAAMmB,WAAW8C,KAAK,EAAA;AACvC,QAAA,CAAA,CAAA;AACF,IAAA;AAEA,IAAA,MAAME,UAAAA,GAAa;AACjB,QAAA,MAAMC,UACJ,MAAM,IAAI,CAAC1C,UAAU,EAAEC,sBAAAA,CAAyD,YAAA,CAAA;AAElF,QAAA,OAAOyC,OAAAA,IAAW,IAAA;AACpB,IAAA;IAEA,MAAMC,cAAAA,CAAeC,KAAoB,EAAuC;AAC9E,QAAA,IAAIA,UAAU,QAAA,EAAU;YACtB,OAAO,IAAA;AACT,QAAA;AACA,QAAA,MAAMC,MAAAA,GAAS,+BAAA,CAAA,IAAI,EAAC,mBAAA,CAAA,CAAA,mBAAA,CAAA;AACpB,QAAA,OAAOA,MAAAA,IAAU,IAAA;AACnB,IAAA;AArhBA,IAAA,WAAA,CAAYjH,OAA2C,CAAE;QAsBzD,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,sBAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAwZA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QAYA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAA;AAAA,YAAA,KAAA,EAAA;;QA6FA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,UAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAmBA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,QAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAYA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAM,QAAA,EAAA;AAAN,YAAA,KAAA,EAAA;;QAziBA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,YAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,gCAAA,EAAA;;mBAAA;;QAEA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,iBAAA,EAAA;;mBAAA;;QAGA,MAAA,CAAA,cAAA,CAAA,IAAA,EAAA,mBAAA,EAAA;;mBAAA;;aAnCAkH,IAAAA,GAAO,uBAAA;aAEP7F,IAAAA,GAAqB,QAAA;aAQrB8F,cAAAA,GAA8D;;YAE5DlH,aAAAA,EAAe;AACjB,SAAA;AAiBA,QAAA,+BAAA,CAAA,IAAA,EAAA,gCAAA,CAAA,CAAA,gCAAA,CAAA,GAAmC,KAAA;AAEnC,QAAA,+BAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoB,KAAA;QAhBlB,IAAI,CAACD,OAAO,GAAG;YACb,GAAG,IAAI,CAACmH,cAAc;AACtB,YAAA,GAAGnH;AACL,SAAA;QACA,+BAAA,CAAA,IAAI,EAAC,iBAAA,CAAA,CAAA,iBAAA,CAAA,GAAoB,IAAI,CAACA,OAAO,CAAC+E,eAAe,KAAK,IAAA;QAE1D,IAAI,CAACY,EAAE,GAAG,IAAA;QACV,IAAI,CAACvB,UAAU,GAAG,IAAA;AACpB,IAAA;AA8jBF;AAjjBE,eAAA,sBAA6B4C,KAAwC,EAAA;AACnE,IAAA,IAAIA,UAAU,QAAA,EAAU;QACtB,+BAAA,CAAA,IAAI,EAAC,mBAAA,CAAA,CAAA,mBAAA,CAAA,GAAsB5G,SAAAA;AAC7B,IAAA;AAEA,IAAA,MAAMgH,cAAc,MAAM,+BAAA,CAAA,IAAI,EAAC,YAAA,UAAA,CAAA,CAAWJ,KAAAA,CAAAA;AAE1C,IAAA,IAAII,uBAAuBrH,KAAAA,EAAO;QAChC,MAAMqH,WAAAA;AACR,IAAA;AAEA,IAAA,MAAM,EAAE9G,EAAAA,EAAI+G,SAAS,EAAEC,MAAM,EAAE,GAAGF,WAAAA;AAKlC,IAAA,IAAIJ,KAAAA,KAAU,QAAA,IAAYM,MAAAA,KAAWA,MAAAA,CAAOC,UAAU,IAAI,IAAA,IAAQD,MAAAA,CAAOE,UAAU,IAAI,IAAG,CAAA,EAAI;QAC5F,+BAAA,CAAA,IAAI,EAAC,mBAAA,CAAA,CAAA,mBAAA,CAAA,GAAsBF,MAAAA;AAC7B,IAAA;;;;IAKA,MAAMnI,MAAAA,GAAS,IAAIE,WAAAA,CAAY;QAAEC,UAAAA,EAAY;AAAK,KAAA,CAAA;AAElD,IAAA,MAAMmI,WAAW,OAAOC,GAAAA,GAAAA;AACtB,QAAA,MAAMC,MAAAA,GAASC,IAAAA,CAAKC,KAAK,CAACH,IAAI1D,QAAQ,EAAA,CAAA;;QAEtC,IAAI,CAAC2D,MAAAA,CAAOG,IAAI,IAAIH,MAAAA,EAAQ9G,IAAAA,EAAMQ,IAAAA,KAAS,UAAA,IAAcsG,MAAAA,EAAQ9G,IAAAA,EAAMP,EAAAA,KAAO+G,SAAAA,EAAW;AACvF,YAAA,IAAI,CAAC1B,EAAE,EAAEhD,IAAAA,CAAK,SAAA,EAAW8E,QAAAA,CAAAA;AACzB,YAAA;AACF,QAAA;AAEA,QAAA,MAAM,EAAEK,IAAI,EAAEjH,IAAAA,EAAM2F,OAAO,EAAE,GAAGmB,MAAAA;AAChC,QAAA,MAAM,EAAEI,KAAK,EAAE5E,KAAK,EAAEtC,IAAI,EAAE,GAAG2F,OAAAA;AAE/B,QAAA,IAAIrD,KAAAA,EAAO;AACT,YAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAAS2E,IAAAA,CAAAA;AACpB3I,YAAAA,MAAAA,CAAOW,OAAO,CAACqD,KAAAA,CAAAA;AACf,YAAA;AACF,QAAA;AAEA,QAAA,IAAI4E,KAAAA,EAAO;AACT,YAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAASD,IAAAA,CAAAA;AACpB,YAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAASd,KAAAA,CAAAA;AAEpB7H,YAAAA,MAAAA,CAAOsD,GAAG,EAAA;AACV,YAAA;AACF,QAAA;QAEA,KAAK,MAAM9B,IAAAA,IAAQqH,SAAAA,CAAUnH,IAAAA,CAAAA,CAAO;AAClC1B,YAAAA,MAAAA,CAAOuC,IAAI,CAACf,IAAAA,CAAAA;AACd,QAAA;AAEA,QAAA,IAAI,CAACgF,EAAE,EAAEhD,IAAAA,CAAK,SAAA,EAAW8E,QAAAA,CAAAA;AAEzB,QAAA,MAAM,+BAAA,CAAA,IAAI,EAAC,QAAA,CAAA,CAAA,QAAA,CAAA,CAASK,IAAAA,CAAAA;AACtB,IAAA,CAAA;AAEA,IAAA,IAAI,CAACnC,EAAE,EAAEhD,IAAAA,CAAK,SAAA,EAAW8E,QAAAA,CAAAA;IAEzB,OAAOtI,MAAAA;AACT;AA0VA,SAAA,WAAYqH,OAAe,EAAA;AACzB,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAcyB,MAAAA,CAAO;QACxBrD,OAAAA,EAAS;AACPsD,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACf3B,YAAAA,OAAAA;YACA4B,MAAAA,EAAQ;AACV,SAAA;QACA1B,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAGA,SAAA,cAAeF,OAAe,EAAA;AAC5B,IAAA,+BAAA,CAAA,IAAI,EAAC,YAAA,CAAA,CAAA,YAAA,CAAA,EAAcyB,MAAAA,CAAO;QACxBrD,OAAAA,EAAS;AACPsD,YAAAA,SAAAA,EAAW,IAAIC,IAAAA,EAAAA;AACf3B,YAAAA,OAAAA;YACA4B,MAAAA,EAAQ;AACV,SAAA;QACA1B,IAAAA,EAAM;AACR,KAAA,CAAA;AACF;AAoFA,eAAA,UAAoD2B,IAAO,EAAA;IACzD,IAAI;AACF,QAAA,OAAO,MAAM,IAAI,CAACjE,UAAU,EAAEkE,oBAAAA,CAC5B;YAAE1H,MAAAA,EAAQ,OAAA;AAASyH,YAAAA;AAAK,SAAA,EACxBA,SAAS,QAAA,GAAW;YAAEE,cAAAA,EAAgB3J;SAA6B,GAAIwB,SAAAA,CAAAA;AAE3E,IAAA,CAAA,CAAE,OAAO2D,CAAAA,EAAG;AACV,QAAA,IAAIA,aAAahE,KAAAA,EAAO;YACtB,OAAOgE,CAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,MAAM,QAAA,EAAU;AACzB,YAAA,OAAO,IAAIR,qBAAAA,CAAsBQ,CAAAA,CAAAA;AACnC,QAAA;AAEA,QAAA,OAAO,IAAIR,qBAAAA,CAAsB,kBAAA,CAAA;AACnC,IAAA;AACF;AAEA,eAAA,QAAeuE,IAAY,EAAA;IACzB,OAAO,IAAIlE,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;AAC3B,QAAA,IAAI,CAAC6B,EAAE,EAAE6C,IAAAA,CAAKZ,IAAAA,CAAKa,SAAS,CAAC;AAAEX,YAAAA;AAAK,SAAA,CAAA,EAAI,CAAC/D,CAAAA,GAAAA;AACvC,YAAA,IAAIA,CAAAA,EAAG;gBACLD,MAAAA,CAAOC,CAAAA,CAAAA;YACT,CAAA,MAAO;gBACLF,OAAAA,CAAQE,CAAAA,CAAAA;AACV,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA,CAAA;AACF;AAEA,eAAA,QAAkDsE,IAAO,EAAA;IACvD,IAAI;AACF,QAAA,MAAM,IAAI,CAACjE,UAAU,EAAEkE,oBAAAA,CAAqB;YAAE1H,MAAAA,EAAQ,KAAA;AAAOyH,YAAAA;AAAK,SAAA,CAAA;AACpE,IAAA,CAAA,CAAE,OAAOtE,CAAAA,EAAG;AACV,QAAA,IAAIA,aAAahE,KAAAA,EAAO;YACtB,OAAOgE,CAAAA;AACT,QAAA;QAEA,IAAI,OAAOA,MAAM,QAAA,EAAU;AACzB,YAAA,OAAO,IAAIR,qBAAAA,CAAsBQ,CAAAA,CAAAA;AACnC,QAAA;AAEA,QAAA,OAAO,IAAIR,qBAAAA,CAAsB,kBAAA,CAAA;AACnC,IAAA;IAEA,OAAO,IAAA;AACT;AAGK,MAAMmF,mCAAmC,CAAC1I,OAAAA,GAAAA;AAC/C,IAAA,OAAO,IAAIjB,0BAAAA,CAA2BiB,OAAAA,CAAAA;AACxC;;;;"}