@react-three-dom/playwright 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1272 -152
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +565 -74
- package/dist/index.d.ts +565 -74
- package/dist/index.js +1266 -153
- package/dist/index.js.map +1 -1
- package/package.json +11 -9
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/waiters.ts","../src/interactions.ts","../src/fixtures.ts","../src/assertions.ts"],"names":["base","baseExpect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Page } from '@playwright/test';\n\n// ---------------------------------------------------------------------------\n// waitForSceneReady — wait until the scene object count stabilises\n// ---------------------------------------------------------------------------\n\nexport interface WaitForSceneReadyOptions {\n /** How many consecutive stable polls are required. Default: 3 */\n stableChecks?: number;\n /** Interval between polls in ms. Default: 100 */\n pollIntervalMs?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is available and the scene's object count\n * has stabilised (no additions or removals) over several consecutive checks.\n */\nexport async function waitForSceneReady(\n page: Page,\n options: WaitForSceneReadyOptions = {},\n): Promise<void> {\n const {\n stableChecks = 3,\n pollIntervalMs = 100,\n timeout = 10_000,\n } = options;\n\n const deadline = Date.now() + timeout;\n\n // First, wait for __R3F_DOM__ to exist\n await page.waitForFunction(() => typeof window.__R3F_DOM__ !== 'undefined', undefined, {\n timeout,\n });\n\n let lastCount = -1;\n let stableRuns = 0;\n\n while (Date.now() < deadline) {\n const count = await page.evaluate(() => window.__R3F_DOM__!.getCount());\n\n if (count === lastCount && count > 0) {\n stableRuns++;\n if (stableRuns >= stableChecks) return;\n } else {\n stableRuns = 0;\n }\n\n lastCount = count;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n throw new Error(\n `waitForSceneReady timed out after ${timeout}ms. Last count: ${lastCount}, stable runs: ${stableRuns}/${stableChecks}`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForObject — wait for bridge + a specific object (when count never stabilizes)\n// ---------------------------------------------------------------------------\n\nexport interface WaitForObjectOptions {\n /** Time to wait for the bridge to appear. Default: 30_000 */\n bridgeTimeout?: number;\n /** Time to wait for the object to appear after bridge is ready. Default: 40_000 */\n objectTimeout?: number;\n /** Poll interval in ms. Default: 200 */\n pollIntervalMs?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is available and an object with the given\n * testId or uuid exists in the scene.\n *\n * Use this instead of `waitForSceneReady` when the scene object count never\n * stabilizes (e.g. continuous loading, animations adding/removing objects,\n * or GLTF/models loading asynchronously).\n */\nexport async function waitForObject(\n page: Page,\n idOrUuid: string,\n options: WaitForObjectOptions = {},\n): Promise<void> {\n const {\n bridgeTimeout = 30_000,\n objectTimeout = 40_000,\n pollIntervalMs = 200,\n } = options;\n\n await page.waitForFunction(() => typeof window.__R3F_DOM__ !== 'undefined', undefined, {\n timeout: bridgeTimeout,\n });\n\n const deadline = Date.now() + objectTimeout;\n while (Date.now() < deadline) {\n const found = await page.evaluate(\n (id) => {\n const api = window.__R3F_DOM__;\n if (!api) return false;\n return (api.getByTestId(id) ?? api.getByUuid(id)) !== null;\n },\n idOrUuid,\n );\n if (found) return;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n throw new Error(\n `waitForObject(\"${idOrUuid}\") timed out after ${objectTimeout}ms. Is the object rendered with userData.testId or this uuid?`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForIdle — wait until no property changes for N consecutive frames\n// ---------------------------------------------------------------------------\n\nexport interface WaitForIdleOptions {\n /** Number of consecutive idle frames required. Default: 10 */\n idleFrames?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering animations or interactions.\n *\n * This works by taking successive snapshots and comparing them. When the\n * JSON representation is unchanged for `idleFrames` consecutive rAF\n * callbacks, the scene is considered idle.\n */\nexport async function waitForIdle(\n page: Page,\n options: WaitForIdleOptions = {},\n): Promise<void> {\n const {\n idleFrames = 10,\n timeout = 10_000,\n } = options;\n\n const settled = await page.evaluate(\n ([frames, timeoutMs]) => {\n return new Promise<boolean>((resolve) => {\n const deadline = Date.now() + timeoutMs;\n let lastJson = '';\n let stableCount = 0;\n\n function check() {\n if (Date.now() > deadline) {\n resolve(false);\n return;\n }\n\n const snap = window.__R3F_DOM__?.snapshot();\n const json = snap ? JSON.stringify(snap.tree) : '';\n\n if (json === lastJson && json !== '') {\n stableCount++;\n if (stableCount >= frames) {\n resolve(true);\n return;\n }\n } else {\n stableCount = 0;\n }\n\n lastJson = json;\n requestAnimationFrame(check);\n }\n\n requestAnimationFrame(check);\n });\n },\n [idleFrames, timeout] as const,\n );\n\n if (!settled) {\n throw new Error(`waitForIdle timed out after ${timeout}ms`);\n }\n}\n","import type { Page } from '@playwright/test';\n\n// ---------------------------------------------------------------------------\n// Interaction helpers — thin wrappers around page.evaluate calls to\n// window.__R3F_DOM__ interaction methods.\n// ---------------------------------------------------------------------------\n\nfunction ensureBridge(page: Page): Page {\n // The bridge is guaranteed to exist after waitForSceneReady.\n // If users skip that, the evaluate calls will throw a clear error.\n return page;\n}\n\n/** Click a 3D object by its testId or uuid. */\nexport async function click(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.click(id);\n }, idOrUuid);\n}\n\n/** Double-click a 3D object by its testId or uuid. */\nexport async function doubleClick(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.doubleClick(id);\n }, idOrUuid);\n}\n\n/** Right-click / context-menu a 3D object by its testId or uuid. */\nexport async function contextMenu(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.contextMenu(id);\n }, idOrUuid);\n}\n\n/** Hover over a 3D object by its testId or uuid. */\nexport async function hover(page: Page, idOrUuid: string): Promise<void> {\n ensureBridge(page);\n await page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.hover(id);\n }, idOrUuid);\n}\n\n/** Drag a 3D object by its testId or uuid with a given world-space delta. */\nexport async function drag(\n page: Page,\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n): Promise<void> {\n ensureBridge(page);\n await page.evaluate(\n ([id, d]) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.drag(id, d);\n },\n [idOrUuid, delta] as const,\n );\n}\n\n/** Dispatch a wheel/scroll event on a 3D object. */\nexport async function wheel(\n page: Page,\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n): Promise<void> {\n ensureBridge(page);\n await page.evaluate(\n ([id, opts]) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.wheel(id, opts);\n },\n [idOrUuid, options] as const,\n );\n}\n\n/** Click empty space to trigger onPointerMissed handlers. */\nexport async function pointerMiss(page: Page): Promise<void> {\n ensureBridge(page);\n await page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found. Is <ThreeDom> mounted?');\n api.pointerMiss();\n });\n}\n","import { test as base } from '@playwright/test';\nimport type { Page } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection, SceneSnapshot } from './types';\nimport { waitForSceneReady, waitForIdle, waitForObject } from './waiters';\nimport type {\n WaitForSceneReadyOptions,\n WaitForIdleOptions,\n WaitForObjectOptions,\n} from './waiters';\nimport * as interactions from './interactions';\n\n// ---------------------------------------------------------------------------\n// R3FFixture — the main API object provided to Playwright tests\n// ---------------------------------------------------------------------------\n\nexport class R3FFixture {\n constructor(private readonly _page: Page) {}\n\n /** The underlying Playwright Page. */\n get page(): Page {\n return this._page;\n }\n\n // -----------------------------------------------------------------------\n // Queries\n // -----------------------------------------------------------------------\n\n /** Get object metadata by testId or uuid. Returns null if not found. */\n async getObject(idOrUuid: string): Promise<ObjectMetadata | null> {\n return this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.getByTestId(id) ?? api.getByUuid(id) ?? null;\n }, idOrUuid);\n }\n\n /** Get heavy inspection data (Tier 2) by testId or uuid. */\n async inspect(idOrUuid: string): Promise<ObjectInspection | null> {\n return this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.inspect(id);\n }, idOrUuid);\n }\n\n /** Take a full scene snapshot. */\n async snapshot(): Promise<SceneSnapshot | null> {\n return this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n return api ? api.snapshot() : null;\n });\n }\n\n /** Get the total number of tracked objects. */\n async getCount(): Promise<number> {\n return this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n return api ? api.getCount() : 0;\n });\n }\n\n // -----------------------------------------------------------------------\n // Interactions\n // -----------------------------------------------------------------------\n\n /** Click a 3D object by testId or uuid. */\n async click(idOrUuid: string): Promise<void> {\n return interactions.click(this._page, idOrUuid);\n }\n\n /** Double-click a 3D object by testId or uuid. */\n async doubleClick(idOrUuid: string): Promise<void> {\n return interactions.doubleClick(this._page, idOrUuid);\n }\n\n /** Right-click / context-menu a 3D object by testId or uuid. */\n async contextMenu(idOrUuid: string): Promise<void> {\n return interactions.contextMenu(this._page, idOrUuid);\n }\n\n /** Hover over a 3D object by testId or uuid. */\n async hover(idOrUuid: string): Promise<void> {\n return interactions.hover(this._page, idOrUuid);\n }\n\n /** Drag a 3D object with a world-space delta vector. */\n async drag(\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n ): Promise<void> {\n return interactions.drag(this._page, idOrUuid, delta);\n }\n\n /** Dispatch a wheel/scroll event on a 3D object. */\n async wheel(\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n ): Promise<void> {\n return interactions.wheel(this._page, idOrUuid, options);\n }\n\n /** Click empty space to trigger onPointerMissed handlers. */\n async pointerMiss(): Promise<void> {\n return interactions.pointerMiss(this._page);\n }\n\n // -----------------------------------------------------------------------\n // Waiters\n // -----------------------------------------------------------------------\n\n /**\n * Wait until the scene is ready — `window.__R3F_DOM__` is available and\n * the object count has stabilised across several consecutive checks.\n */\n async waitForSceneReady(options?: WaitForSceneReadyOptions): Promise<void> {\n return waitForSceneReady(this._page, options);\n }\n\n /**\n * Wait until the bridge is available and an object with the given testId or\n * uuid exists. Use this instead of waitForSceneReady when the scene count\n * never stabilizes (e.g. async model loading, continuous animations).\n */\n async waitForObject(\n idOrUuid: string,\n options?: WaitForObjectOptions,\n ): Promise<void> {\n return waitForObject(this._page, idOrUuid, options);\n }\n\n /**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering interactions or animations.\n */\n async waitForIdle(options?: WaitForIdleOptions): Promise<void> {\n return waitForIdle(this._page, options);\n }\n\n // -----------------------------------------------------------------------\n // Selection (for inspector integration)\n // -----------------------------------------------------------------------\n\n /** Select a 3D object by testId or uuid (highlights in scene). */\n async select(idOrUuid: string): Promise<void> {\n await this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found');\n api.select(id);\n }, idOrUuid);\n }\n\n /** Clear the current selection. */\n async clearSelection(): Promise<void> {\n await this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (api) api.clearSelection();\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// test.extend — add the `r3f` fixture to Playwright's test runner\n// ---------------------------------------------------------------------------\n\nexport const test = base.extend<{ r3f: R3FFixture }>({\n r3f: async ({ page }, use) => {\n const fixture = new R3FFixture(page);\n await use(fixture);\n },\n});\n","import { expect as baseExpect } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection } from './types';\n\n// ---------------------------------------------------------------------------\n// Custom Playwright expect matchers for 3D scene testing\n// ---------------------------------------------------------------------------\n\n/**\n * Extend Playwright's `expect` with 3D-native matchers.\n *\n * Usage:\n * ```ts\n * import { test, expect } from '@react-three-dom/playwright';\n *\n * test('chair exists', async ({ page, r3f }) => {\n * await r3f.waitForSceneReady();\n * await expect(r3f).toExist('chair-primary');\n * });\n * ```\n */\nexport const expect = baseExpect.extend({\n // -----------------------------------------------------------------------\n // toExist — verify an object with the given testId/uuid exists in the scene\n // -----------------------------------------------------------------------\n async toExist(r3f: R3FMatcherReceiver, idOrUuid: string) {\n const meta = await r3f.getObject(idOrUuid);\n const pass = meta !== null;\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT exist in the scene, but it does`\n : `Expected object \"${idOrUuid}\" to exist in the scene, but it was not found`,\n name: 'toExist',\n expected: idOrUuid,\n actual: meta,\n };\n },\n\n // -----------------------------------------------------------------------\n // toBeVisible — verify an object is visible (object.visible === true)\n // -----------------------------------------------------------------------\n async toBeVisible(r3f: R3FMatcherReceiver, idOrUuid: string) {\n const meta = await r3f.getObject(idOrUuid);\n if (!meta) {\n return {\n pass: false,\n message: () => `Expected object \"${idOrUuid}\" to be visible, but it was not found in the scene`,\n name: 'toBeVisible',\n };\n }\n\n const pass = meta.visible;\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT be visible, but it is`\n : `Expected object \"${idOrUuid}\" to be visible, but visible=${meta.visible}`,\n name: 'toBeVisible',\n expected: true,\n actual: meta.visible,\n };\n },\n\n // -----------------------------------------------------------------------\n // toBeInFrustum — verify an object's bounding box intersects the camera\n // frustum (i.e. it is potentially on-screen). Uses inspect() for bounds.\n // -----------------------------------------------------------------------\n async toBeInFrustum(r3f: R3FMatcherReceiver, idOrUuid: string) {\n const inspection = await r3f.inspect(idOrUuid);\n if (!inspection) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to be in frustum, but it was not found in the scene`,\n name: 'toBeInFrustum',\n };\n }\n\n // If the bridge can project it to screen, it's in the frustum.\n // We check by verifying bounds exist and are finite.\n const { bounds } = inspection;\n const isFinite = (v: number[]) => v.every(Number.isFinite);\n const pass = isFinite(bounds.min) && isFinite(bounds.max);\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT be in the camera frustum`\n : `Expected object \"${idOrUuid}\" to be in the camera frustum, but its bounds are invalid`,\n name: 'toBeInFrustum',\n expected: 'finite bounds',\n actual: bounds,\n };\n },\n\n // -----------------------------------------------------------------------\n // toHavePosition — verify object position within tolerance\n // -----------------------------------------------------------------------\n async toHavePosition(\n r3f: R3FMatcherReceiver,\n idOrUuid: string,\n expected: [number, number, number],\n tolerance = 0.01,\n ) {\n const meta = await r3f.getObject(idOrUuid);\n if (!meta) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to have position [${expected}], but it was not found`,\n name: 'toHavePosition',\n };\n }\n\n const [ex, ey, ez] = expected;\n const [ax, ay, az] = meta.position;\n const dx = Math.abs(ax - ex);\n const dy = Math.abs(ay - ey);\n const dz = Math.abs(az - ez);\n const pass = dx <= tolerance && dy <= tolerance && dz <= tolerance;\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT be at position [${expected}] (±${tolerance})`\n : `Expected object \"${idOrUuid}\" to be at position [${expected}] (±${tolerance}), but it is at [${meta.position}] (delta: [${dx.toFixed(4)}, ${dy.toFixed(4)}, ${dz.toFixed(4)}])`,\n name: 'toHavePosition',\n expected,\n actual: meta.position,\n };\n },\n\n // -----------------------------------------------------------------------\n // toHaveBounds — verify object bounding box (world-space)\n // -----------------------------------------------------------------------\n async toHaveBounds(\n r3f: R3FMatcherReceiver,\n idOrUuid: string,\n expected: { min: [number, number, number]; max: [number, number, number] },\n tolerance = 0.1,\n ) {\n const inspection = await r3f.inspect(idOrUuid);\n if (!inspection) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to have specific bounds, but it was not found`,\n name: 'toHaveBounds',\n };\n }\n\n const { bounds } = inspection;\n const withinTolerance = (a: number[], b: number[]) =>\n a.every((v, i) => Math.abs(v - b[i]) <= tolerance);\n const pass = withinTolerance(bounds.min, expected.min) && withinTolerance(bounds.max, expected.max);\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT have bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}`\n : `Expected object \"${idOrUuid}\" to have bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}, but got min:${JSON.stringify(bounds.min)} max:${JSON.stringify(bounds.max)}`,\n name: 'toHaveBounds',\n expected,\n actual: bounds,\n };\n },\n\n // -----------------------------------------------------------------------\n // toHaveInstanceCount — verify InstancedMesh instance count\n // -----------------------------------------------------------------------\n async toHaveInstanceCount(r3f: R3FMatcherReceiver, idOrUuid: string, expectedCount: number) {\n const meta = await r3f.getObject(idOrUuid);\n if (!meta) {\n return {\n pass: false,\n message: () =>\n `Expected object \"${idOrUuid}\" to have instance count ${expectedCount}, but it was not found`,\n name: 'toHaveInstanceCount',\n };\n }\n\n const actual = meta.instanceCount ?? 0;\n const pass = actual === expectedCount;\n\n return {\n pass,\n message: () =>\n pass\n ? `Expected object \"${idOrUuid}\" to NOT have instance count ${expectedCount}`\n : `Expected object \"${idOrUuid}\" to have instance count ${expectedCount}, but it has ${actual}`,\n name: 'toHaveInstanceCount',\n expected: expectedCount,\n actual,\n };\n },\n});\n\n// ---------------------------------------------------------------------------\n// Helper type — the R3FFixture object that matchers receive\n// ---------------------------------------------------------------------------\n\ninterface R3FMatcherReceiver {\n getObject(idOrUuid: string): Promise<ObjectMetadata | null>;\n inspect(idOrUuid: string): Promise<ObjectInspection | null>;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/waiters.ts","../src/interactions.ts","../src/fixtures.ts","../src/assertions.ts","../src/pathGenerators.ts"],"names":["base","baseExpect"],"mappings":";;;;;;;AAiBA,eAAe,kBAAA,CAAmB,MAAY,OAAA,EAAgC;AAC5E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,GAAA;AAEf,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM;AACtC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,QAAQ,KAAA,EAAe;AAC1C,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,OAAO,GAAA,CAAI,MAAA;AAAA,QACX,KAAA,EAAO,IAAI,MAAA,IAAU,IAAA;AAAA,QACrB,KAAA,EAAO,IAAI,QAAA;AAAS,OACtB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA,EAAO;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,MAAA,IAAU,CAAC,KAAA,CAAM,KAAA,IAAS,MAAM,KAAA,EAAO;AAE/C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gDAAA,EAAmD,MAAM,KAAK;AAAA,4GAAA;AAAA,OAGhE;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM;AAC3C,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,EAAE,QAAQ,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK;AAC5D,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAM,KAAA,EAAO,IAAI,MAAA,EAAQ,KAAA,EAAO,GAAA,CAAI,MAAA,IAAU,IAAA,EAAK;AAAA,EACtE,CAAC,CAAA;AAED,EAAA,IAAI,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,KAAA,EAAO;AACzC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,gDAAA,EAAmD,WAAW,KAAK;AAAA,wDAAA;AAAA,KAErE;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,qCAAqC,OAAO,CAAA;AAAA,eAAA,EAC1B,UAAA,CAAW,MAAM,CAAA,SAAA,EAAY,UAAA,CAAW,KAAK,CAAA;AAAA,4DAAA;AAAA,GAEjE;AACF;AAsBA,eAAsB,iBAAA,CACpB,IAAA,EACA,OAAA,GAAoC,EAAC,EACtB;AACf,EAAA,MAAM;AAAA,IACJ,YAAA,GAAe,CAAA;AAAA,IACf,cAAA,GAAiB,GAAA;AAAA,IACjB,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAG9B,EAAA,MAAM,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAEtC,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM,MAAA,CAAO,WAAA,CAAa,UAAU,CAAA;AAEtE,IAAA,IAAI,KAAA,KAAU,SAAA,IAAa,KAAA,GAAQ,CAAA,EAAG;AACpC,MAAA,UAAA,EAAA;AACA,MAAA,IAAI,cAAc,YAAA,EAAc;AAAA,IAClC,CAAA,MAAO;AACL,MAAA,UAAA,GAAa,CAAA;AAAA,IACf;AAEA,IAAA,SAAA,GAAY,KAAA;AACZ,IAAA,MAAM,IAAA,CAAK,eAAe,cAAc,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,qCAAqC,OAAO,CAAA,gBAAA,EAAmB,SAAS,CAAA,eAAA,EAAkB,UAAU,IAAI,YAAY,CAAA;AAAA,GACtH;AACF;AAyBA,eAAsB,aAAA,CACpB,IAAA,EACA,QAAA,EACA,OAAA,GAAgC,EAAC,EAClB;AACf,EAAA,MAAM;AAAA,IACJ,aAAA,GAAgB,GAAA;AAAA,IAChB,aAAA,GAAgB,GAAA;AAAA,IAChB,cAAA,GAAiB;AAAA,GACnB,GAAI,OAAA;AAGJ,EAAA,MAAM,kBAAA,CAAmB,MAAM,aAAa,CAAA;AAE5C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,aAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA;AAAA,MACvB,CAAC,EAAA,KAAO;AACN,QAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,QAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,CAAI,QAAQ,OAAO,KAAA;AAChC,QAAA,OAAA,CAAQ,IAAI,WAAA,CAAY,EAAE,KAAK,GAAA,CAAI,SAAA,CAAU,EAAE,CAAA,MAAO,IAAA;AAAA,MACxD,CAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,MAAM,IAAA,CAAK,eAAe,cAAc,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM;AAC5C,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK;AAC5E,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,IAAA;AAAA,MACd,OAAO,GAAA,CAAI,MAAA;AAAA,MACX,KAAA,EAAO,IAAI,QAAA,EAAS;AAAA,MACpB,KAAA,EAAO,IAAI,MAAA,IAAU;AAAA,KACvB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,eAAA,EAAkB,QAAQ,CAAA,mBAAA,EAAsB,aAAa,CAAA,YAAA,EAClD,WAAA,CAAY,YAAA,GAAe,QAAA,GAAW,SAAS,CAAA,SAAA,EAChD,WAAA,CAAY,KAAK,CAAA,eAAA,EACX,YAAY,KAAK,CAAA,CAAA,IAChC,WAAA,CAAY,KAAA,GAAQ,CAAA,SAAA,EAAY,WAAA,CAAY,KAAK,CAAA,CAAA,GAAK,EAAA,CAAA,GAAM,CAAA,+CAAA,EACb,QAAQ,CAAA,WAAA,EAAc,QAAQ,CAAA,EAAA;AAAA,GAChF;AACF;AAuBA,eAAsB,WAAA,CACpB,IAAA,EACA,OAAA,GAA8B,EAAC,EAChB;AACf,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,EAAA;AAAA,IACb,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAGJ,EAAA,MAAM,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA;AAAA,IACzB,CAAC,CAAC,MAAA,EAAQ,SAAS,CAAA,KAAM;AACvB,MAAA,OAAO,IAAI,OAAA,CAA0B,CAAC,OAAA,KAAY;AAChD,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,QAAA,IAAI,QAAA,GAAW,EAAA;AACf,QAAA,IAAI,WAAA,GAAc,CAAA;AAElB,QAAA,SAAS,KAAA,GAAQ;AACf,UAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AACzB,YAAA,OAAA,CAAQ,KAAK,CAAA;AACb,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,UAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,CAAI,MAAA,EAAQ;AAEvB,YAAA,IAAI,GAAA,IAAO,IAAI,MAAA,EAAQ;AACrB,cAAA,OAAA,CAAQ,CAAA,cAAA,EAAiB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACrC,cAAA;AAAA,YACF;AACA,YAAA,qBAAA,CAAsB,KAAK,CAAA;AAC3B,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAErC,UAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,EAAA,EAAI;AACpC,YAAA,WAAA,EAAA;AACA,YAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,cAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,cAAA;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,WAAA,GAAc,CAAA;AAAA,UAChB;AAEA,UAAA,QAAA,GAAW,IAAA;AACX,UAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,QAC7B;AAEA,QAAA,qBAAA,CAAsB,KAAK,CAAA;AAAA,MAC7B,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,YAAY,OAAO;AAAA,GACtB;AAEA,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAE,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,EAC5D;AACF;AA6DA,eAAsB,gBAAA,CACpB,IAAA,EACA,OAAA,GAAmC,EAAC,EACH;AACjC,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA,GAAiB,GAAA;AAAA,IACjB,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAGJ,EAAA,MAAM,aAAA,GAA0B,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM;AACxD,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,SAAS,QAAQ,IAAA,EAAgF;AAC/F,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA;AACpB,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,OAAA,CAAQ,KAAoB,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAK,IAA2F,CAAA;AACxG,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAG9B,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAA,CAAK,eAAe,cAAc,CAAA;AAExC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA;AAAA,MACxB,CAAC,CAAC,UAAA,EAAY,UAAA,EAAY,UAAU,CAAA,KAAM;AACxC,QAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,QAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,QAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,QAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,UAAU,CAAA;AAChC,QAAA,MAAM,aASD,EAAC;AAEN,QAAA,SAAS,KAAK,IAAA,EAUX;AACD,UAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAEzB,YAAA,MAAM,SAAA,GAAY,CAAC,UAAA,IAAc,IAAA,CAAK,IAAA,KAAS,UAAA;AAC/C,YAAA,MAAM,YAAY,CAAC,UAAA,IAAc,IAAA,CAAK,IAAA,CAAK,SAAS,UAAU,CAAA;AAC9D,YAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,cAAA,UAAA,CAAW,IAAA,CAAK;AAAA,gBACd,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,QAAQ,IAAA,CAAK,MAAA;AAAA,gBACb,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf,OAAO,IAAA,CAAK;AAAA,eACb,CAAA;AAAA,YACH;AAAA,UACF;AACA,UAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,YAAA,IAAA,CAAK,KAAoB,CAAA;AAAA,UAC3B;AAAA,QACF;AAEA,QAAA,IAAA,CAAK,KAAK,IAA6C,CAAA;AAEvD,QAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,QAAA,OAAO;AAAA,UACL,UAAA;AAAA,UACA,UAAU,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,UACtC,OAAO,UAAA,CAAW;AAAA,SACpB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,IAAA,IAAQ,IAAA,EAAM,YAAA,IAAgB,MAAM,aAAa;AAAA,KACpD;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,IAAA,GAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,IAC1B,YAAA,GAAe,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA,CAAA,GAAM;AAAA,GACpD,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAE3B,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,iCAAA,EAAoC,OAAO,CAAA,2BAAA,EACjB,UAAA,GAAa,CAAA,UAAA,EAAa,UAAU,CAAA,CAAA,GAAK,EAAE,CAAA,eAAA,EACrD,aAAA,CAAc,MAAM,CAAA,SAAA;AAAA,GACtC;AACF;;;AChcA,IAAM,yBAAA,GAA4B,GAAA;AAClC,IAAM,iBAAA,GAAoB,GAAA;AAO1B,eAAe,iBAAA,CACb,IAAA,EACA,QAAA,EACA,OAAA,GAAU,yBAAA,EACK;AACf,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAE9B,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA;AAAA,MACvB,CAAC,EAAA,KAAO;AACN,QAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,QAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,QAAQ,SAAA,EAAmB;AAC9C,QAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACf,UAAA,OAAO;AAAA,YACL,MAAA,EAAQ,WAAA;AAAA,YACR,KAAA,EAAO,IAAI,MAAA,IAAU;AAAA,WACvB;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAA,CAAS,IAAI,WAAA,CAAY,EAAE,KAAK,GAAA,CAAI,SAAA,CAAU,EAAE,CAAA,MAAO,IAAA;AAC7D,QAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAkB,KAAA,EAAM;AAAA,MAC3C,CAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,IAAW,KAAA,CAAM,KAAA,EAAO;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,WAAA,IAAe,KAAA,CAAM,KAAA,EAAO;AAC/C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gDAAA,EAAmD,MAAM,KAAK;AAAA,+BAAA,EAC5B,QAAQ,CAAA,EAAA;AAAA,OAC5C;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,eAAe,iBAAiB,CAAA;AAAA,EAC7C;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA;AAAA,IAC5B,CAAC,EAAA,KAAO;AACN,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,OAAO,KAAA,EAAM;AACpF,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,OAAO,GAAA,CAAI,MAAA;AAAA,QACX,KAAA,EAAO,IAAI,QAAA,EAAS;AAAA,QACpB,KAAA,EAAO,IAAI,MAAA,IAAU,IAAA;AAAA,QACrB,KAAA,EAAA,CAAQ,IAAI,WAAA,CAAY,EAAE,KAAK,GAAA,CAAI,SAAA,CAAU,EAAE,CAAA,MAAO;AAAA,OACxD;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,+CAA+C,OAAO,CAAA;AAAA,4DAAA;AAAA,KAExD;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,CAAA,4CAAA,EAA+C,OAAO,CAAA,YAAA,EAAe,QAAQ,CAAA;AAAA,cAAA,EAC5D,UAAA,CAAW,KAAK,CAAA,cAAA,EAAiB,UAAA,CAAW,KAAK,CAAA,CAAA,IACjE,UAAA,CAAW,KAAA,GAAQ,CAAA,QAAA,EAAW,UAAA,CAAW,KAAK,CAAA,CAAA,GAAK,EAAA,CAAA,GAAM,CAAA;AAAA,uCAAA,EAChB,QAAQ,cAAc,QAAQ,CAAA,EAAA;AAAA,GAC1E;AACF;AAMA,eAAe,iBAAA,CACb,IAAA,EACA,OAAA,GAAU,yBAAA,EACK;AACf,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAE9B,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,QAAA,CAAS,MAAM;AACtC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,QAAQ,KAAA,EAAe;AAC1C,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,IAAA;AAAA,QACR,OAAO,GAAA,CAAI,MAAA;AAAA,QACX,KAAA,EAAO,IAAI,MAAA,IAAU;AAAA,OACvB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA,EAAO;AAEjC,IAAA,IAAI,MAAM,MAAA,IAAU,CAAC,KAAA,CAAM,KAAA,IAAS,MAAM,KAAA,EAAO;AAC/C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,gDAAA,EAAmD,MAAM,KAAK,CAAA;AAAA,OAChE;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,eAAe,iBAAiB,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,+CAA+C,OAAO,CAAA;AAAA,4DAAA;AAAA,GAExD;AACF;AAOA,eAAsB,KAAA,CAAM,IAAA,EAAY,QAAA,EAAkB,OAAA,EAAiC;AACzF,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC/C,EAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,EAAA,KAAO;AAC1B,IAAA,MAAA,CAAO,WAAA,CAAa,MAAM,EAAE,CAAA;AAAA,EAC9B,GAAG,QAAQ,CAAA;AACb;AAGA,eAAsB,WAAA,CAAY,IAAA,EAAY,QAAA,EAAkB,OAAA,EAAiC;AAC/F,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC/C,EAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,EAAA,KAAO;AAC1B,IAAA,MAAA,CAAO,WAAA,CAAa,YAAY,EAAE,CAAA;AAAA,EACpC,GAAG,QAAQ,CAAA;AACb;AAGA,eAAsB,WAAA,CAAY,IAAA,EAAY,QAAA,EAAkB,OAAA,EAAiC;AAC/F,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC/C,EAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,EAAA,KAAO;AAC1B,IAAA,MAAA,CAAO,WAAA,CAAa,YAAY,EAAE,CAAA;AAAA,EACpC,GAAG,QAAQ,CAAA;AACb;AAGA,eAAsB,KAAA,CAAM,IAAA,EAAY,QAAA,EAAkB,OAAA,EAAiC;AACzF,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC/C,EAAA,MAAM,IAAA,CAAK,QAAA,CAAS,CAAC,EAAA,KAAO;AAC1B,IAAA,MAAA,CAAO,WAAA,CAAa,MAAM,EAAE,CAAA;AAAA,EAC9B,GAAG,QAAQ,CAAA;AACb;AAGA,eAAsB,IAAA,CACpB,IAAA,EACA,QAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC/C,EAAA,MAAM,IAAA,CAAK,QAAA;AAAA,IACT,OAAO,CAAC,EAAA,EAAI,CAAC,CAAA,KAAM;AACjB,MAAA,MAAM,MAAA,CAAO,WAAA,CAAa,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA;AAAA,IACtC,CAAA;AAAA,IACA,CAAC,UAAU,KAAK;AAAA,GAClB;AACF;AAGA,eAAsB,KAAA,CACpB,IAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AAC/C,EAAA,MAAM,IAAA,CAAK,QAAA;AAAA,IACT,CAAC,CAAC,EAAA,EAAI,IAAI,CAAA,KAAM;AACd,MAAA,MAAA,CAAO,WAAA,CAAa,KAAA,CAAM,EAAA,EAAI,IAAI,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,CAAC,UAAU,OAAO;AAAA,GACpB;AACF;AAOA,eAAsB,WAAA,CAAY,MAAY,OAAA,EAAiC;AAC7E,EAAA,MAAM,iBAAA,CAAkB,MAAM,OAAO,CAAA;AACrC,EAAA,MAAM,IAAA,CAAK,SAAS,MAAM;AACxB,IAAA,MAAA,CAAO,YAAa,WAAA,EAAY;AAAA,EAClC,CAAC,CAAA;AACH;AAGA,eAAsB,gBAAA,CACpB,IAAA,EACA,MAAA,EACA,OAAA,EACA,OAAA,EACqD;AACrD,EAAA,MAAM,iBAAA,CAAkB,MAAM,OAAO,CAAA;AACrC,EAAA,OAAO,IAAA,CAAK,QAAA;AAAA,IACV,OAAO,CAAC,GAAA,EAAK,IAAI,CAAA,KAAM;AACrB,MAAA,OAAO,MAAA,CAAO,WAAA,CAAa,QAAA,CAAS,GAAA,EAAK,QAAQ,MAAS,CAAA;AAAA,IAC5D,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,IAAW,IAAI;AAAA,GAC1B;AACF;;;ACxMO,IAAM,aAAN,MAAiB;AAAA,EAGtB,WAAA,CACmB,OACjB,IAAA,EACA;AAFiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAHnB,IAAA,IAAA,CAAQ,sBAAA,GAAyB,KAAA;AAM/B,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,IAAA,GAAa;AACf,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,WAAA,GAA6B;AACjC,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM;AAC9B,MAAA,MAAA,CAAO,iBAAA,GAAoB,IAAA;AAAA,IAC7B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,sBAAA,EAAwB;AACjC,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAQ;AAChC,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AAChC,QAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,QAAA,EAAkD;AAChE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,EAAA,KAAO;AACjC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,OAAO,IAAI,WAAA,CAAY,EAAE,KAAK,GAAA,CAAI,SAAA,CAAU,EAAE,CAAA,IAAK,IAAA;AAAA,IACrD,GAAG,QAAQ,CAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,QAAQ,QAAA,EAAoD;AAChE,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,EAAA,KAAO;AACjC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,OAAO,GAAA,CAAI,QAAQ,EAAE,CAAA;AAAA,IACvB,GAAG,QAAQ,CAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,QAAA,GAA0C;AAC9C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM;AAC/B,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,OAAO,GAAA,GAAM,GAAA,CAAI,QAAA,EAAS,GAAI,IAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,QAAA,GAA4B;AAChC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM;AAC/B,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,OAAO,GAAA,GAAM,GAAA,CAAI,QAAA,EAAS,GAAI,CAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,IAAA,EAAyC;AACvD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,KAAM;AAChC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,OAAO,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,CAAC,IAAI,EAAC;AAAA,IACnC,GAAG,IAAI,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CAAc,GAAA,EAAa,KAAA,EAA4C;AAC3E,IAAA,OAAO,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,EAAE,CAAA,EAAG,GAAE,KAAM;AACvC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,OAAO,MAAM,GAAA,CAAI,aAAA,CAAc,CAAA,EAAG,CAAC,IAAI,EAAC;AAAA,IAC1C,GAAG,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,IAAA,EAA+B;AAClD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,KAAM;AAChC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,OAAO,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA,GAAI,CAAA;AAAA,IACvC,GAAG,IAAI,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,WAAW,GAAA,EAA+D;AAC9E,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,MAAA,KAAW;AACrC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,MAAM,SAA+B,EAAC;AACtC,QAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,MAAA,CAAO,EAAE,CAAA,GAAI,IAAA;AACtC,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAI,WAAW,MAAM,CAAA;AAAA,IAC9B,GAAG,GAAG,CAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,QAAA,GAA0B;AAC9B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,QAAA,EAAS;AACjC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAA,CAAQ,IAAI,qEAAqE,CAAA;AACjF,MAAA;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,sBAAA,EAA2B,KAAK,WAAW,CAAA;AAAA,EAAe,KAAK;AAAA,CAAI,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,KAAA,CAAM,QAAA,EAAkB,OAAA,EAAiC;AAC7D,IAAA,OAAoB,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,CAAY,QAAA,EAAkB,OAAA,EAAiC;AACnE,IAAA,OAAoB,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,CAAY,QAAA,EAAkB,OAAA,EAAiC;AACnE,IAAA,OAAoB,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CAAM,QAAA,EAAkB,OAAA,EAAiC;AAC7D,IAAA,OAAoB,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAA,CACJ,QAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,IAAA,OAAoB,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,OAAO,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CACJ,QAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,IAAA,OAAoB,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,SAAS,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,OAAA,EAAiC;AACjD,IAAA,OAAoB,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,QAAA,CACJ,MAAA,EACA,OAAA,EACA,OAAA,EACqD;AACrD,IAAA,OAAoB,gBAAA,CAAiB,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,SAAS,OAAO,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,kBAAkB,OAAA,EAAmD;AACzE,IAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CACJ,QAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,OAAA,EAA6C;AAC7D,IAAA,OAAO,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,iBAAiB,OAAA,EAAoE;AACzF,IAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,QAAA,EAAiC;AAC5C,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,CAAC,EAAA,KAAO;AAChC,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAC5D,MAAA,GAAA,CAAI,OAAO,EAAE,CAAA;AAAA,IACf,GAAG,QAAQ,CAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAM,cAAA,GAAgC;AACpC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,MAAM;AAC9B,MAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,MAAA,IAAI,GAAA,MAAS,cAAA,EAAe;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH;AACF;AAMA,SAAS,eAAA,CAAgB,IAAA,EAAoB,MAAA,GAAS,EAAA,EAAI,SAAS,IAAA,EAAc;AAC/E,EAAA,MAAM,SAAA,GAAY,MAAA,KAAW,EAAA,GAAK,EAAA,GAAK,SAAS,eAAA,GAAQ,eAAA;AACxD,EAAA,MAAM,cAAc,MAAA,KAAW,EAAA,GAAK,EAAA,GAAK,MAAA,IAAU,SAAS,KAAA,GAAQ,UAAA,CAAA;AAGpE,EAAA,IAAI,QAAQ,IAAA,CAAK,IAAA;AACjB,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,KAAA,IAAS,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA,CAAA,CAAA;AACtC,EAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,CAAA,UAAA,EAAa,KAAK,MAAM,CAAA,CAAA,CAAA;AAClD,EAAA,KAAA,IAAS,IAAA,CAAK,UAAU,UAAA,GAAa,SAAA;AAErC,EAAA,IAAI,MAAA,GAAS,MAAA,GAAS,SAAA,GAAY,KAAA,GAAQ,IAAA;AAE1C,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA;AAC1C,IAAA,MAAA,IAAU,eAAA,CAAgB,KAAA,EAAO,WAAA,EAAa,IAAI,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,IAAM,IAAA,GAAOA,YAAK,MAAA,CAA4B;AAAA,EACnD,GAAA,EAAK,OAAO,EAAE,IAAA,IAAQ,GAAA,KAAQ;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,IAAI,CAAA;AACnC,IAAA,MAAM,IAAI,OAAO,CAAA;AAAA,EACnB;AACF,CAAC;AAUM,SAAS,cAAc,OAAA,EAA6B;AACzD,EAAA,OAAOA,YAAK,MAAA,CAA4B;AAAA,IACtC,GAAA,EAAK,OAAO,EAAE,IAAA,IAAQ,GAAA,KAAQ;AAC5B,MAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,EAAM,OAAO,CAAA;AAC5C,MAAA,MAAM,IAAI,OAAO,CAAA;AAAA,IACnB;AAAA,GACD,CAAA;AACH;ACnXA,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,gBAAA,GAAmB,GAAA;AAMzB,eAAe,gBAAgB,IAAA,EAA6B;AAC1D,EAAA,OAAO,IAAA,CAAK,SAAS,MAAM;AACzB,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,OAAO,GAAA,GAAM,GAAA,CAAI,QAAA,EAAS,GAAI,CAAA;AAAA,EAChC,CAAC,CAAA;AACH;AAEA,eAAe,gBAAA,CAAiB,MAAY,IAAA,EAA+B;AACzE,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,KAAM;AAC1B,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,OAAO,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA,GAAI,CAAA;AAAA,EACvC,GAAG,IAAI,CAAA;AACT;AAEA,eAAe,oBAAoB,IAAA,EAA6B;AAC9D,EAAA,OAAO,IAAA,CAAK,SAAS,MAAM;AACzB,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AACjB,IAAA,MAAM,MAAA,GAAS,GAAA;AACf,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,EAAS;AAC7B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,SAAS,KAAK,IAAA,EAA6C;AACzD,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AACvC,MAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,aAAA,EAAe,KAAA,IAAS,IAAA,CAAK,aAAA;AAC9C,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,QAAA,IAAA,CAAK,KAAoB,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,IAAwD,CAAA;AAClE,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACH;AAMA,eAAe,SAAA,CAAU,MAAY,EAAA,EAA4C;AAC/E,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,KAAM;AAC1B,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO,IAAI,WAAA,CAAY,CAAC,KAAK,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,IAAK,IAAA;AAAA,EACnD,GAAG,EAAE,CAAA;AACP;AAEA,eAAe,SAAA,CAAU,MAAY,EAAA,EAA8C;AACjF,EAAA,OAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,KAAM;AAC1B,IAAA,MAAM,MAAM,MAAA,CAAO,WAAA;AACnB,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,EACtB,GAAG,EAAE,CAAA;AACP;AAeA,SAAS,QAAA,CAAS,GAAkC,GAAA,EAAa;AAC/D,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,KAAM,QAAA,GAAW,EAAE,SAAA,EAAW,CAAA,EAAE,GAAK,CAAA,IAAK,EAAC;AAC5D,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,EAAE,OAAA,IAAW,eAAA;AAAA,IACtB,QAAA,EAAU,EAAE,QAAA,IAAY,gBAAA;AAAA,IACxB,SAAA,EAAW,EAAE,SAAA,IAAa;AAAA,GAC5B;AACF;AAEA,SAAS,QAAA,CAAS,IAAA,EAAc,EAAA,EAAY,MAAA,EAAgB,OAAA,EAAiB;AAC3E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,SAAS,MAAM,CAAA,iBAAA,EAAoB,EAAE,CAAA,EAAA,EAAK,MAAM,kCAAkC,OAAO,CAAA,GAAA,CAAA;AAAA,IACzF;AAAA,GACF;AACF;AAMO,IAAM,MAAA,GAASC,cAAW,MAAA,CAAO;AAAA;AAAA;AAAA,EAKtC,MAAM,OAAA,CAAQ,GAAA,EAAyB,EAAA,EAAY,IAAA,EAAuB;AACxE,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,OAAO,IAAA,KAAS,IAAA;AAAA,MAClB,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,MAAM,OAAO,IAAA,KAAS,IAAA;AACtB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,iBAAA,EAAoB,EAAE,CAAA,2BAAA,CAAA,GACtB,CAAA,iBAAA,EAAoB,EAAE,CAAA,yCAAA,EAA4C,OAAO,CAAA,GAAA,CAAA;AAAA,MAC7E,IAAA,EAAM,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ;AAAA,KACzC;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,GAAA,EAAyB,EAAA,EAAY,IAAA,EAAuB;AAC5E,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,OAAO,MAAM,OAAA,IAAW,KAAA;AAAA,MAC1B,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,SAAS,aAAA,EAAe,EAAA,EAAI,iBAAiB,OAAO,CAAA;AACtE,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,MAAM,CAAA,CAAE,OAAA;AAAA,MACR,OAAA,EAAS,MAAM,CAAA,CAAE,OAAA,GACb,CAAA,UAAA,EAAa,EAAE,CAAA,8BAAA,CAAA,GACf,CAAA,UAAA,EAAa,EAAE,CAAA,6BAAA,EAAgC,CAAA,CAAE,OAAO,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAC/E,IAAA,EAAM,aAAA;AAAA,MAAe,QAAA,EAAU,IAAA;AAAA,MAAM,QAAQ,CAAA,CAAE;AAAA,KACjD;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,cAAA,CAAe,GAAA,EAAyB,EAAA,EAAY,UAAoC,OAAA,EAA6B;AACzH,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,WAAU,GAAI,QAAA,CAAS,SAAS,IAAI,CAAA;AAC/D,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI,KAAA,GAAkC,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9C,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AACrI,QAAA,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,IAAK,SAAS,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,kBAAkB,EAAA,EAAI,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AAC1F,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,gBAAA,EAAmB,QAAQ,CAAA,OAAA,EAAO,SAAS,CAAA,CAAA,CAAA,GAC1D,CAAA,UAAA,EAAa,EAAE,CAAA,MAAA,EAAS,QAAQ,CAAA,OAAA,EAAO,SAAS,CAAA,QAAA,EAAW,CAAA,CAAE,QAAQ,CAAA,WAAA,EAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,cAAc,OAAO,CAAA,GAAA,CAAA;AAAA,MACnI,IAAA,EAAM,gBAAA;AAAA,MAAkB,QAAA;AAAA,MAAU,QAAQ,CAAA,CAAE;AAAA,KAC9C;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,cAAA,CAAe,GAAA,EAAyB,EAAA,EAAY,UAAoC,OAAA,EAA6B;AACzH,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,WAAU,GAAI,QAAA,CAAS,SAAS,IAAI,CAAA;AAC/D,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI,KAAA,GAAkC,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9C,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AACrI,QAAA,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,IAAK,SAAS,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,kBAAkB,EAAA,EAAI,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AAC1F,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,wBAAA,EAA2B,QAAQ,CAAA,OAAA,EAAO,SAAS,CAAA,CAAA,CAAA,GAClE,CAAA,UAAA,EAAa,EAAE,CAAA,YAAA,EAAe,QAAQ,CAAA,OAAA,EAAO,SAAS,CAAA,QAAA,EAAW,CAAA,CAAE,QAAQ,CAAA,WAAA,EAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,cAAc,OAAO,CAAA,GAAA,CAAA;AAAA,MACzI,IAAA,EAAM,gBAAA;AAAA,MAAkB,QAAA;AAAA,MAAU,QAAQ,CAAA,CAAE;AAAA,KAC9C;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,GAAA,EAAyB,EAAA,EAAY,UAAoC,OAAA,EAA6B;AACtH,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,WAAU,GAAI,QAAA,CAAS,SAAS,IAAI,CAAA;AAC/D,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI,KAAA,GAAkC,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9C,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAC5H,QAAA,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,IAAK,SAAS,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,eAAe,EAAA,EAAI,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACpF,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,qBAAA,EAAwB,QAAQ,CAAA,OAAA,EAAO,SAAS,CAAA,CAAA,CAAA,GAC/D,CAAA,UAAA,EAAa,EAAE,CAAA,SAAA,EAAY,QAAQ,CAAA,OAAA,EAAO,SAAS,CAAA,QAAA,EAAW,CAAA,CAAE,KAAK,CAAA,WAAA,EAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,cAAc,OAAO,CAAA,GAAA,CAAA;AAAA,MACnI,IAAA,EAAM,aAAA;AAAA,MAAe,QAAA;AAAA,MAAU,QAAQ,CAAA,CAAE;AAAA,KAC3C;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,GAAA,EAAyB,EAAA,EAAY,cAAsB,IAAA,EAAuB;AACjG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAA,GAAO,KAAK,IAAA,KAAS,YAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,cAAc,EAAA,EAAI,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACtF,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,uBAAuB,YAAY,CAAA,CAAA,CAAA,GAClD,CAAA,UAAA,EAAa,EAAE,WAAW,YAAY,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,aAAa,OAAO,CAAA,GAAA,CAAA;AAAA,MAC/E,IAAA,EAAM,YAAA;AAAA,MAAc,QAAA,EAAU,YAAA;AAAA,MAAc,QAAQ,CAAA,CAAE;AAAA,KACxD;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,UAAA,CAAW,GAAA,EAAyB,EAAA,EAAY,cAAsB,IAAA,EAAuB;AACjG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAA,GAAO,KAAK,IAAA,KAAS,YAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,cAAc,EAAA,EAAI,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACtF,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,uBAAuB,YAAY,CAAA,CAAA,CAAA,GAClD,CAAA,UAAA,EAAa,EAAE,WAAW,YAAY,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,aAAa,OAAO,CAAA,GAAA,CAAA;AAAA,MAC/E,IAAA,EAAM,YAAA;AAAA,MAAc,QAAA,EAAU,YAAA;AAAA,MAAc,QAAQ,CAAA,CAAE;AAAA,KACxD;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,kBAAA,CAAmB,GAAA,EAAyB,EAAA,EAAY,aAAqB,IAAA,EAAuB;AACxG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAA,GAAO,KAAK,YAAA,KAAiB,WAAA;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,sBAAsB,EAAA,EAAI,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACjG,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,2BAA2B,WAAW,CAAA,CAAA,CAAA,GACrD,CAAA,UAAA,EAAa,EAAE,eAAe,WAAW,CAAA,QAAA,EAAW,EAAE,YAAA,IAAgB,MAAM,aAAa,OAAO,CAAA,GAAA,CAAA;AAAA,MACpG,IAAA,EAAM,oBAAA;AAAA,MAAsB,QAAA,EAAU,WAAA;AAAA,MAAa,QAAQ,CAAA,CAAE;AAAA,KAC/D;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,kBAAA,CAAmB,GAAA,EAAyB,EAAA,EAAY,aAAqB,IAAA,EAAuB;AACxG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAA,GAAO,KAAK,YAAA,KAAiB,WAAA;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,sBAAsB,EAAA,EAAI,CAAA,kBAAA,EAAqB,WAAW,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AACjG,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,2BAA2B,WAAW,CAAA,CAAA,CAAA,GACrD,CAAA,UAAA,EAAa,EAAE,eAAe,WAAW,CAAA,QAAA,EAAW,EAAE,YAAA,IAAgB,MAAM,aAAa,OAAO,CAAA,GAAA,CAAA;AAAA,MACpG,IAAA,EAAM,oBAAA;AAAA,MAAsB,QAAA,EAAU,WAAA;AAAA,MAAa,QAAQ,CAAA,CAAE;AAAA,KAC/D;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,gBAAA,CAAiB,GAAA,EAAyB,EAAA,EAAY,eAAuB,IAAA,EAAuB;AACxG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,MAAA,GAAS,KAAK,aAAA,CAAc,MAAA;AAC5B,QAAA,OAAO,MAAA,KAAW,aAAA;AAAA,MACpB,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,oBAAoB,EAAA,EAAI,CAAA,QAAA,EAAW,aAAa,CAAA,SAAA,CAAA,EAAa,OAAO,CAAA;AAC/F,IAAA,MAAM,OAAO,MAAA,KAAW,aAAA;AACxB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,cAAA,EAAiB,aAAa,CAAA,SAAA,CAAA,GAC7C,CAAA,UAAA,EAAa,EAAE,CAAA,EAAA,EAAK,aAAa,CAAA,eAAA,EAAkB,MAAM,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAChF,IAAA,EAAM,kBAAA;AAAA,MAAoB,QAAA,EAAU,aAAA;AAAA,MAAe;AAAA,KACrD;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,YAAA,CAAa,GAAA,EAAyB,EAAA,EAAY,gBAAwB,IAAA,EAAuB;AACrG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,UAAA,GAAoC,IAAA;AACxC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,IAAA,EAAM,UAAA,EAAY,OAAO,KAAA;AAC9B,QAAA,UAAA,GAAa,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,KAAK,UAAU,CAAA;AACtD,QAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AACxB,QAAA,IAAA,GAAO,WAAW,IAAA,KAAS,cAAA,IAAkB,WAAW,MAAA,KAAW,cAAA,IAAkB,WAAW,IAAA,KAAS,cAAA;AACzG,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,gBAAgB,EAAA,EAAI,CAAA,gBAAA,EAAmB,cAAc,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AAC5F,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,MAAM,EAAA,GAAK,UAAA;AACX,IAAA,MAAM,WAAA,GAAc,EAAA,EAAI,MAAA,IAAU,EAAA,EAAI,QAAQ,CAAA,CAAE,UAAA;AAChD,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,sBAAA,EAAyB,cAAc,CAAA,CAAA,CAAA,GACtD,CAAA,UAAA,EAAa,EAAE,CAAA,UAAA,EAAa,cAAc,CAAA,QAAA,EAAW,WAAW,aAAa,OAAO,CAAA,GAAA,CAAA;AAAA,MACxF,IAAA,EAAM,cAAA;AAAA,MAAgB,QAAA,EAAU,cAAA;AAAA,MAAgB,MAAA,EAAQ;AAAA,KAC1D;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,mBAAA,CAAoB,GAAA,EAAyB,EAAA,EAAY,eAAuB,IAAA,EAAuB;AAC3G,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,MAAA,GAAS,MAAM,aAAA,IAAiB,CAAA;AAChC,QAAA,OAAO,MAAA,KAAW,aAAA;AAAA,MACpB,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,uBAAuB,EAAA,EAAI,CAAA,uBAAA,EAA0B,aAAa,CAAA,CAAA,EAAI,OAAO,CAAA;AACxG,IAAA,MAAM,OAAO,MAAA,KAAW,aAAA;AACxB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,6BAAA,EAAgC,aAAa,CAAA,CAAA,GAC5D,CAAA,UAAA,EAAa,EAAE,CAAA,iBAAA,EAAoB,aAAa,CAAA,MAAA,EAAS,MAAM,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MACtF,IAAA,EAAM,qBAAA;AAAA,MAAuB,QAAA,EAAU,aAAA;AAAA,MAAe;AAAA,KACxD;AAAA,EACF,CAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,GAAA,EAAyB,EAAA,EAAY,IAAA,EAAuB;AAC9E,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,MAAM,MAAM,CAAC,CAAA,KAAgB,CAAA,CAAE,KAAA,CAAM,OAAO,QAAQ,CAAA;AACpD,QAAA,IAAA,GAAO,GAAA,CAAI,KAAK,MAAA,CAAO,GAAG,KAAK,GAAA,CAAI,IAAA,CAAK,OAAO,GAAG,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,SAAS,eAAA,EAAiB,EAAA,EAAI,oBAAoB,OAAO,CAAA;AAC3E,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,iCAAA,CAAA,GACf,CAAA,UAAA,EAAa,EAAE,CAAA,6CAAA,EAAgD,OAAO,CAAA,GAAA,CAAA;AAAA,MAC1E,IAAA,EAAM,eAAA;AAAA,MAAiB,QAAA,EAAU,eAAA;AAAA,MAAiB,QAAQ,CAAA,CAAE;AAAA,KAC9D;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,YAAA,CACJ,GAAA,EAAyB,EAAA,EACzB,UACA,OAAA,EACA;AACA,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,WAAU,GAAI,QAAA,CAAS,SAAS,GAAG,CAAA;AAC9D,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,MAAM,IAAI,CAAC,CAAA,EAAa,CAAA,KAAgB,CAAA,CAAE,MAAM,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,KAAK,SAAS,CAAA;AACzF,QAAA,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,QAAA,CAAS,GAAG,CAAA;AAC1E,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,SAAS,cAAA,EAAgB,EAAA,EAAI,2BAA2B,OAAO,CAAA;AACjF,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,yBAAA,EAA4B,IAAA,CAAK,UAAU,QAAA,CAAS,GAAG,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,UAAU,QAAA,CAAS,GAAG,CAAC,CAAA,CAAA,GAC3G,CAAA,UAAA,EAAa,EAAE,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAA,CAAU,SAAS,GAAG,CAAC,QAAQ,IAAA,CAAK,SAAA,CAAU,SAAS,GAAG,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,GAAG,CAAC,QAAQ,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,CAAO,GAAG,CAAC,CAAA,SAAA,EAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MACnM,IAAA,EAAM,cAAA;AAAA,MAAgB,QAAA;AAAA,MAAU,QAAQ,CAAA,CAAE;AAAA,KAC5C;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,WAAA,CAAY,GAAA,EAAyB,EAAA,EAAY,eAAuB,IAAA,EAAuB;AACnG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,UAAA,CAAW,GAAG,CAAA,GAAI,aAAA,CAAc,WAAA,EAAY,GAAI,CAAA,CAAA,EAAI,aAAA,CAAc,WAAA,EAAa,CAAA,CAAA;AAC1G,IAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,OAAO,KAAA;AACnC,QAAA,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,WAAA,EAAY;AACzC,QAAA,IAAA,GAAO,MAAA,KAAW,IAAA;AAClB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,eAAe,EAAA,EAAI,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA,CAAA,EAAK,OAAO,CAAA;AAChF,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,wBAAwB,IAAI,CAAA,CAAA,CAAA,GAC3C,CAAA,UAAA,EAAa,EAAE,YAAY,IAAI,CAAA,QAAA,EAAW,MAAA,IAAU,UAAU,aAAa,OAAO,CAAA,GAAA,CAAA;AAAA,MACtF,IAAA,EAAM,aAAA;AAAA,MAAe,QAAA,EAAU,IAAA;AAAA,MAAM;AAAA,KACvC;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,aAAA,CAAc,GAAA,EAAyB,EAAA,EAAY,iBAAyB,OAAA,EAA6B;AAC7G,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,WAAU,GAAI,QAAA,CAAS,SAAS,IAAI,CAAA;AAC/D,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,KAAA;AAC5B,QAAA,MAAA,GAAS,KAAK,QAAA,CAAS,OAAA;AACvB,QAAA,IAAA,GAAO,WAAW,KAAA,CAAA,IAAa,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,eAAe,CAAA,IAAK,SAAA;AACrE,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,iBAAiB,EAAA,EAAI,CAAA,gBAAA,EAAmB,eAAe,CAAA,CAAA,EAAI,OAAO,CAAA;AAC7F,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,sBAAA,EAAyB,eAAe,SAAM,SAAS,CAAA,CAAA,CAAA,GACtE,aAAa,EAAE,CAAA,UAAA,EAAa,eAAe,CAAA,MAAA,EAAM,SAAS,UAAU,MAAA,IAAU,aAAa,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAClH,IAAA,EAAM,eAAA;AAAA,MAAiB,QAAA,EAAU,eAAA;AAAA,MAAiB;AAAA,KACpD;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,eAAA,CAAgB,GAAA,EAAyB,EAAA,EAAY,IAAA,EAAuB;AAChF,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,KAAA;AAC5B,QAAA,IAAA,GAAO,IAAA,CAAK,SAAS,WAAA,KAAgB,IAAA;AACrC,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,SAAS,iBAAA,EAAmB,EAAA,EAAI,qBAAqB,OAAO,CAAA;AAC9E,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,uBAAA,CAAA,GACf,CAAA,UAAA,EAAa,EAAE,CAAA,wBAAA,EAA2B,CAAA,CAAE,QAAA,EAAU,WAAA,IAAe,aAAa,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MACzG,IAAA,EAAM,iBAAA;AAAA,MAAmB,QAAA,EAAU,IAAA;AAAA,MAAM,MAAA,EAAQ,EAAE,QAAA,EAAU;AAAA,KAC/D;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,iBAAA,CAAkB,GAAA,EAAyB,EAAA,EAAY,eAAuB,IAAA,EAAuB;AACzG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,MAAA,GAAS,MAAM,WAAA,IAAe,CAAA;AAC9B,QAAA,OAAO,MAAA,KAAW,aAAA;AAAA,MACpB,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,qBAAqB,EAAA,EAAI,CAAA,QAAA,EAAW,aAAa,CAAA,SAAA,CAAA,EAAa,OAAO,CAAA;AAChG,IAAA,MAAM,OAAO,MAAA,KAAW,aAAA;AACxB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,cAAA,EAAiB,aAAa,CAAA,SAAA,CAAA,GAC7C,CAAA,UAAA,EAAa,EAAE,CAAA,EAAA,EAAK,aAAa,CAAA,eAAA,EAAkB,MAAM,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAChF,IAAA,EAAM,mBAAA;AAAA,MAAqB,QAAA,EAAU,aAAA;AAAA,MAAe;AAAA,KACtD;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,mBAAA,CAAoB,GAAA,EAAyB,EAAA,EAAY,eAAuB,IAAA,EAAuB;AAC3G,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,MAAA,GAAS,MAAM,aAAA,IAAiB,CAAA;AAChC,QAAA,OAAO,MAAA,KAAW,aAAA;AAAA,MACpB,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,uBAAuB,EAAA,EAAI,CAAA,QAAA,EAAW,aAAa,CAAA,UAAA,CAAA,EAAc,OAAO,CAAA;AACnG,IAAA,MAAM,OAAO,MAAA,KAAW,aAAA;AACxB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,IAAA,GACX,CAAA,UAAA,EAAa,EAAE,CAAA,cAAA,EAAiB,aAAa,CAAA,UAAA,CAAA,GAC7C,CAAA,UAAA,EAAa,EAAE,CAAA,EAAA,EAAK,aAAa,CAAA,gBAAA,EAAmB,MAAM,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MACjF,IAAA,EAAM,qBAAA;AAAA,MAAuB,QAAA,EAAU,aAAA;AAAA,MAAe;AAAA,KACxD;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,cAAA,CAAe,GAAA,EAAyB,EAAA,EAAY,GAAA,EAAa,eAAyB,IAAA,EAAuB;AACrH,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,QAAA,IAAI,EAAE,GAAA,IAAO,IAAA,CAAK,QAAA,CAAA,EAAW,OAAO,KAAA;AACpC,QAAA,IAAI,kBAAkB,KAAA,CAAA,EAAW;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,OAAO,IAAA;AAAA,QAAM;AAC7D,QAAA,MAAA,GAAS,IAAA,CAAK,SAAS,GAAG,CAAA;AAC1B,QAAA,IAAA,GAAO,KAAK,SAAA,CAAU,MAAM,CAAA,KAAM,IAAA,CAAK,UAAU,aAAa,CAAA;AAC9D,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,MAAM,OAAO,QAAA,CAAS,kBAAkB,EAAA,EAAI,CAAA,iBAAA,EAAoB,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA;AACnF,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,UAAA,OAAO,IAAA,GACH,CAAA,UAAA,EAAa,EAAE,CAAA,4BAAA,EAA+B,GAAG,CAAA,CAAA,CAAA,GACjD,CAAA,UAAA,EAAa,EAAE,CAAA,wBAAA,EAA2B,GAAG,CAAA,uBAAA,EAA0B,OAAO,CAAA,GAAA,CAAA;AAAA,QACpF;AACA,QAAA,OAAO,IAAA,GACH,CAAA,UAAA,EAAa,EAAE,CAAA,uBAAA,EAA0B,GAAG,CAAA,GAAA,EAAM,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA,CAAA,GAC/E,CAAA,UAAA,EAAa,EAAE,cAAc,GAAG,CAAA,GAAA,EAAM,IAAA,CAAK,SAAA,CAAU,aAAa,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,SAAA,EAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAC3H,CAAA;AAAA,MACA,IAAA,EAAM,gBAAA;AAAA,MAAkB,QAAA,EAAU,aAAA,IAAiB,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,CAAA;AAAA,MAAK;AAAA,KACrE;AAAA,EACF,CAAA;AAAA;AAAA,EAGA,MAAM,gBAAA,CAAiB,GAAA,EAAyB,EAAA,EAAY,cAAuB,IAAA,EAAuB;AACxG,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,eAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,gBAAA;AACnC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,IAAA,GAAgC,IAAA;AACpC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,IAAA,GAAO,MAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,OAAO,KAAA;AACjC,QAAA,MAAA,GAAS,KAAK,QAAA,CAAS,GAAA;AACvB,QAAA,IAAI,CAAC,YAAA,EAAc;AAAE,UAAA,IAAA,GAAO,IAAA;AAAM,UAAA,OAAO,IAAA;AAAA,QAAM;AAC/C,QAAA,IAAA,GAAO,MAAA,KAAW,YAAA;AAClB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,SAAS,kBAAA,EAAoB,EAAA,EAAI,yBAAyB,OAAO,CAAA;AACnF,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAS,MAAM;AACb,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAO,OACH,CAAA,UAAA,EAAa,EAAE,gCACf,CAAA,UAAA,EAAa,EAAE,mDAAmD,OAAO,CAAA,GAAA,CAAA;AAAA,QAC/E;AACA,QAAA,OAAO,IAAA,GACH,CAAA,UAAA,EAAa,EAAE,CAAA,mBAAA,EAAsB,YAAY,CAAA,CAAA,CAAA,GACjD,CAAA,UAAA,EAAa,EAAE,CAAA,OAAA,EAAU,YAAY,CAAA,QAAA,EAAW,MAAA,IAAU,MAAM,aAAa,OAAO,CAAA,GAAA,CAAA;AAAA,MAC1F,CAAA;AAAA,MACA,IAAA,EAAM,kBAAA;AAAA,MAAoB,UAAU,YAAA,IAAgB,SAAA;AAAA,MAAW;AAAA,KACjE;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,iBAAA,CACJ,GAAA,EACA,QAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,eAAA;AACpC,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,gBAAA;AACtC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,MAAA,GAAS,MAAM,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AACvC,QAAA,IAAA,GAAO,MAAA,KAAW,QAAA;AAClB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,GACI,CAAA,2BAAA,EAA8B,QAAQ,CAAA,qBAAA,CAAA,GACtC,CAAA,uBAAA,EAA0B,QAAQ,CAAA,cAAA,EAAiB,MAAM,CAAA,SAAA,EAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAClF,IAAA,EAAM,mBAAA;AAAA,MAAqB,QAAA;AAAA,MAAU;AAAA,KACvC;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,4BAAA,CACJ,GAAA,EACA,GAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,eAAA;AACpC,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,gBAAA;AACtC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,MAAA,GAAS,MAAM,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AACvC,QAAA,IAAA,GAAO,MAAA,GAAS,GAAA;AAChB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,GACI,CAAA,+BAAA,EAAkC,GAAG,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,GAChE,CAAA,iCAAA,EAAoC,GAAG,CAAA,cAAA,EAAiB,MAAM,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MACvF,IAAA,EAAM,8BAAA;AAAA,MAAgC,QAAA,EAAU,KAAK,GAAG,CAAA,CAAA;AAAA,MAAI;AAAA,KAC9D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,CACJ,GAAA,EACA,IAAA,EACA,UACA,OAAA,EACA;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,eAAA;AACpC,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,gBAAA;AACtC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,MAAA,GAAS,MAAM,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAC9C,QAAA,IAAA,GAAO,MAAA,KAAW,QAAA;AAClB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,GACI,CAAA,2BAAA,EAA8B,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAA,sBAAA,CAAA,GAC/C,CAAA,SAAA,EAAY,QAAQ,CAAA,EAAA,EAAK,IAAI,CAAA,eAAA,EAAkB,MAAM,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAC9E,IAAA,EAAM,mBAAA;AAAA,MAAqB,QAAA;AAAA,MAAU;AAAA,KACvC;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,wBAAA,CACJ,GAAA,EACA,QAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,eAAA;AACpC,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,gBAAA;AACtC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,MAAA,GAAS,MAAM,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAA,GAAO,MAAA,KAAW,QAAA;AAClB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,GACI,CAAA,2BAAA,EAA8B,QAAQ,CAAA,6BAAA,CAAA,GACtC,CAAA,SAAA,EAAY,QAAQ,CAAA,sBAAA,EAAyB,MAAM,CAAA,SAAA,EAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAC5E,IAAA,EAAM,0BAAA;AAAA,MAA4B,QAAA;AAAA,MAAU;AAAA,KAC9C;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,gCAAA,CACJ,GAAA,EACA,GAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,eAAA;AACpC,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,gBAAA;AACtC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAMA,aAAA,CAAW,KAAK,YAAY;AAChC,QAAA,MAAA,GAAS,MAAM,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA;AAC3C,QAAA,IAAA,GAAO,MAAA,GAAS,GAAA;AAChB,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,EAAG,EAAE,OAAA,EAAS,SAAA,EAAW,CAAC,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAC,KAAK,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAAQ;AAChB,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAA,EAAS,MACP,IAAA,GACI,CAAA,gCAAA,EAAmC,GAAG,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA,GACnE,CAAA,kCAAA,EAAqC,GAAG,CAAA,gBAAA,EAAmB,MAAM,YAAY,OAAO,CAAA,GAAA,CAAA;AAAA,MAC1F,IAAA,EAAM,kCAAA;AAAA,MAAoC,QAAA,EAAU,KAAK,GAAG,CAAA,CAAA;AAAA,MAAI;AAAA,KAClE;AAAA,EACF;AACF,CAAC;;;ACv0BM,SAAS,SACd,KAAA,EACA,GAAA,EACA,KAAA,GAAQ,EAAA,EACR,WAAW,GAAA,EACE;AACb,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,MAAM,aAAa,KAAA,GAAQ,CAAA;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,UAAA,EAAY,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAI,CAAA,GAAI,UAAA;AACd,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,GAAG,KAAA,CAAM,CAAA,GAAA,CAAK,GAAA,CAAI,CAAA,GAAI,MAAM,CAAA,IAAK,CAAA;AAAA,MACjC,GAAG,KAAA,CAAM,CAAA,GAAA,CAAK,GAAA,CAAI,CAAA,GAAI,MAAM,CAAA,IAAK,CAAA;AAAA,MACjC;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,UACd,KAAA,EACA,OAAA,EACA,KACA,KAAA,GAAQ,EAAA,EACR,WAAW,GAAA,EACE;AACb,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,IAAI,CAAA,GAAI,KAAA;AACd,IAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,CAAA,EAAG,IAAA,GAAO,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,CAAA;AAAA,MAClE,CAAA,EAAG,IAAA,GAAO,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,CAAA;AAAA,MAClE;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,SACd,OAAA,EACA,WAAA,EACA,aAAA,GAAgB,CAAA,EAChB,WAAW,GAAA,EACE;AACb,EAAA,MAAM,WAAW,EAAE,CAAA,EAAG,YAAY,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,EAAE;AAClD,EAAA,MAAM,aAAa,EAAE,CAAA,EAAG,QAAQ,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAE;AACpD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAC,SAAS,QAAQ,CAAA;AAAA,IAClB,CAAC,UAAU,WAAW,CAAA;AAAA,IACtB,CAAC,aAAa,UAAU,CAAA;AAAA,IACxB,CAAC,YAAY,OAAO;AAAA,GACtB;AAEA,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,CAAA,IAAK,KAAA,EAAO;AAC9B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,aAAA,EAAe,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,IAAI,CAAA,GAAI,aAAA;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAG,IAAA,CAAK,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,IAAK,CAAA;AAAA,QAC9B,GAAG,IAAA,CAAK,CAAA,GAAA,CAAK,EAAA,CAAG,CAAA,GAAI,KAAK,CAAA,IAAK,CAAA;AAAA,QAC9B;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,QAAA,EAAU,CAAA;AACpD,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,WACd,MAAA,EACA,OAAA,EACA,SACA,KAAA,GAAQ,EAAA,EACR,WAAW,GAAA,EACE;AACb,EAAA,MAAM,KAAK,OAAA,IAAW,OAAA;AACtB,EAAA,MAAM,SAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,KAAA,EAAO,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,KAAA,GAAS,CAAA,GAAI,KAAA,GAAS,IAAA,CAAK,EAAA,GAAK,CAAA;AACtC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,GAAG,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,OAAA;AAAA,MAChC,GAAG,MAAA,CAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA;AAAA,MAChC;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["import type { Page } from '@playwright/test';\nimport type { ObjectMetadata } from './types';\n\n// ---------------------------------------------------------------------------\n// Shared: waitForReadyBridge — wait until __R3F_DOM__._ready === true\n// ---------------------------------------------------------------------------\n\n/**\n * Wait until the `window.__R3F_DOM__` bridge exists AND `_ready === true`.\n *\n * Fails fast with a rich diagnostic if the bridge is present but\n * `_ready === false` and `_error` is set (i.e. ThreeDom setup crashed).\n * This prevents all waiters from silently timing out when the bridge is\n * in an error state — the developer gets an immediate, actionable message.\n *\n * @internal Used by all public waiter functions.\n */\nasync function waitForReadyBridge(page: Page, timeout: number): Promise<void> {\n const deadline = Date.now() + timeout;\n const pollMs = 100;\n\n while (Date.now() < deadline) {\n const state = await page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) return { exists: false as const };\n return {\n exists: true as const,\n ready: api._ready,\n error: api._error ?? null,\n count: api.getCount(),\n };\n });\n\n if (state.exists && state.ready) {\n return; // Bridge is ready\n }\n\n if (state.exists && !state.ready && state.error) {\n // Bridge exists but failed — fail fast with diagnostic\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${state.error}\\n` +\n `The <ThreeDom> component mounted but threw during setup. ` +\n `Check the browser console for the full stack trace.`,\n );\n }\n\n // Bridge doesn't exist yet, or exists but not ready (still initializing)\n await page.waitForTimeout(pollMs);\n }\n\n // Final check before throwing\n const finalState = await page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) return { exists: false, ready: false, error: null };\n return { exists: true, ready: api._ready, error: api._error ?? null };\n });\n\n if (finalState.exists && finalState.error) {\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${finalState.error}\\n` +\n `The <ThreeDom> component mounted but threw during setup.`,\n );\n }\n\n throw new Error(\n `[react-three-dom] Timed out after ${timeout}ms waiting for the bridge to be ready.\\n` +\n `Bridge exists: ${finalState.exists}, ready: ${finalState.ready}.\\n` +\n `Ensure <ThreeDom> is mounted inside your <Canvas> component.`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForSceneReady — wait until the scene object count stabilises\n// ---------------------------------------------------------------------------\n\nexport interface WaitForSceneReadyOptions {\n /** How many consecutive stable polls are required. Default: 3 */\n stableChecks?: number;\n /** Interval between polls in ms. Default: 100 */\n pollIntervalMs?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is available, `_ready === true`, and the\n * scene's object count has stabilised over several consecutive checks.\n *\n * If the bridge exists but `_ready` is false and `_error` is set, this\n * fails immediately with a rich diagnostic message instead of timing out.\n */\nexport async function waitForSceneReady(\n page: Page,\n options: WaitForSceneReadyOptions = {},\n): Promise<void> {\n const {\n stableChecks = 3,\n pollIntervalMs = 100,\n timeout = 10_000,\n } = options;\n\n const deadline = Date.now() + timeout;\n\n // Wait for the bridge to exist AND be ready (or have an error)\n await waitForReadyBridge(page, timeout);\n\n let lastCount = -1;\n let stableRuns = 0;\n\n while (Date.now() < deadline) {\n const count = await page.evaluate(() => window.__R3F_DOM__!.getCount());\n\n if (count === lastCount && count > 0) {\n stableRuns++;\n if (stableRuns >= stableChecks) return;\n } else {\n stableRuns = 0;\n }\n\n lastCount = count;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n throw new Error(\n `waitForSceneReady timed out after ${timeout}ms. Last count: ${lastCount}, stable runs: ${stableRuns}/${stableChecks}`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForObject — wait for bridge + a specific object (when count never stabilizes)\n// ---------------------------------------------------------------------------\n\nexport interface WaitForObjectOptions {\n /** Time to wait for the bridge to appear. Default: 30_000 */\n bridgeTimeout?: number;\n /** Time to wait for the object to appear after bridge is ready. Default: 40_000 */\n objectTimeout?: number;\n /** Poll interval in ms. Default: 200 */\n pollIntervalMs?: number;\n}\n\n/**\n * Wait until `window.__R3F_DOM__` is ready and an object with the given\n * testId or uuid exists in the scene.\n *\n * Use this instead of `waitForSceneReady` when the scene object count never\n * stabilizes (e.g. continuous loading, animations adding/removing objects,\n * or GLTF/models loading asynchronously).\n *\n * Fails fast if the bridge reports `_ready: false` with an `_error`.\n */\nexport async function waitForObject(\n page: Page,\n idOrUuid: string,\n options: WaitForObjectOptions = {},\n): Promise<void> {\n const {\n bridgeTimeout = 30_000,\n objectTimeout = 40_000,\n pollIntervalMs = 200,\n } = options;\n\n // Wait for bridge to be ready (with _ready === true), fail fast on _error\n await waitForReadyBridge(page, bridgeTimeout);\n\n const deadline = Date.now() + objectTimeout;\n while (Date.now() < deadline) {\n const found = await page.evaluate(\n (id) => {\n const api = window.__R3F_DOM__;\n if (!api || !api._ready) return false;\n return (api.getByTestId(id) ?? api.getByUuid(id)) !== null;\n },\n idOrUuid,\n );\n if (found) return;\n await page.waitForTimeout(pollIntervalMs);\n }\n\n // Build diagnostic — check if the bridge is alive but the object simply doesn't exist\n const diagnostics = await page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) return { bridgeExists: false, ready: false, count: 0, error: null };\n return {\n bridgeExists: true,\n ready: api._ready,\n count: api.getCount(),\n error: api._error ?? null,\n };\n });\n\n throw new Error(\n `waitForObject(\"${idOrUuid}\") timed out after ${objectTimeout}ms. ` +\n `Bridge: ${diagnostics.bridgeExists ? 'exists' : 'missing'}, ` +\n `ready: ${diagnostics.ready}, ` +\n `objectCount: ${diagnostics.count}` +\n (diagnostics.error ? `, error: ${diagnostics.error}` : '') + '. ' +\n `Is the object rendered with userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\"?`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// waitForIdle — wait until no property changes for N consecutive frames\n// ---------------------------------------------------------------------------\n\nexport interface WaitForIdleOptions {\n /** Number of consecutive idle frames required. Default: 10 */\n idleFrames?: number;\n /** Overall timeout in ms. Default: 10_000 */\n timeout?: number;\n}\n\n/**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering animations or interactions.\n *\n * This works by taking successive snapshots and comparing them. When the\n * JSON representation is unchanged for `idleFrames` consecutive rAF\n * callbacks, the scene is considered idle.\n *\n * Checks `_ready === true` before starting. Fails fast if `_error` is set.\n */\nexport async function waitForIdle(\n page: Page,\n options: WaitForIdleOptions = {},\n): Promise<void> {\n const {\n idleFrames = 10,\n timeout = 10_000,\n } = options;\n\n // Ensure bridge is ready before polling for idle\n await waitForReadyBridge(page, timeout);\n\n const settled = await page.evaluate(\n ([frames, timeoutMs]) => {\n return new Promise<boolean | string>((resolve) => {\n const deadline = Date.now() + timeoutMs;\n let lastJson = '';\n let stableCount = 0;\n\n function check() {\n if (Date.now() > deadline) {\n resolve(false);\n return;\n }\n\n const api = window.__R3F_DOM__;\n if (!api || !api._ready) {\n // Bridge disappeared or became un-ready (e.g. unmount/remount)\n if (api && api._error) {\n resolve(`Bridge error: ${api._error}`);\n return;\n }\n requestAnimationFrame(check);\n return;\n }\n\n const snap = api.snapshot();\n const json = JSON.stringify(snap.tree);\n\n if (json === lastJson && json !== '') {\n stableCount++;\n if (stableCount >= frames) {\n resolve(true);\n return;\n }\n } else {\n stableCount = 0;\n }\n\n lastJson = json;\n requestAnimationFrame(check);\n }\n\n requestAnimationFrame(check);\n });\n },\n [idleFrames, timeout] as const,\n );\n\n if (typeof settled === 'string') {\n throw new Error(`waitForIdle failed: ${settled}`);\n }\n if (!settled) {\n throw new Error(`waitForIdle timed out after ${timeout}ms`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// waitForNewObject — wait until a new object appears in the scene\n// ---------------------------------------------------------------------------\n\nexport interface WaitForNewObjectOptions {\n /**\n * Only consider new objects of this Three.js type (e.g. \"Mesh\", \"Line\").\n * If not set, any new object type qualifies.\n */\n type?: string;\n\n /**\n * If provided, the new object's name must contain this substring.\n * Useful for apps that name objects predictably (e.g. \"stroke-\", \"wall-\").\n */\n nameContains?: string;\n\n /**\n * Poll interval in ms. Default: 100\n */\n pollIntervalMs?: number;\n\n /**\n * Overall timeout in ms. Default: 10_000\n */\n timeout?: number;\n}\n\n/** Result returned when new objects are detected. */\nexport interface WaitForNewObjectResult {\n /** Metadata of all newly added objects (matching the filter). */\n newObjects: ObjectMetadata[];\n /** UUIDs of the newly added objects. */\n newUuids: string[];\n /** Total number of new objects detected. */\n count: number;\n}\n\n/**\n * Wait until one or more new objects appear in the scene that were not present\n * at the time this function was called.\n *\n * This is designed for drawing/annotation apps where user interactions\n * (like `drawPath`) create new Three.js objects asynchronously.\n *\n * @param page Playwright Page instance\n * @param options Filter and timing options\n * @returns Metadata of the newly added object(s)\n * @throws If no new objects appear within the timeout\n *\n * @example\n * ```typescript\n * // Draw a stroke, then wait for the new Line object\n * const before = await r3f.getCount();\n * await r3f.drawPath(points);\n * const result = await waitForNewObject(page, { type: 'Line' });\n * expect(result.count).toBe(1);\n * ```\n */\nexport async function waitForNewObject(\n page: Page,\n options: WaitForNewObjectOptions = {},\n): Promise<WaitForNewObjectResult> {\n const {\n type,\n nameContains,\n pollIntervalMs = 100,\n timeout = 10_000,\n } = options;\n\n // 1. Capture the current set of UUIDs (baseline)\n const baselineUuids: string[] = await page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) return [];\n const snap = api.snapshot();\n const uuids: string[] = [];\n function collect(node: { uuid: string; children: Array<{ uuid: string; children: unknown[] }> }) {\n uuids.push(node.uuid);\n for (const child of node.children) {\n collect(child as typeof node);\n }\n }\n collect(snap.tree as unknown as { uuid: string; children: Array<{ uuid: string; children: unknown[] }> });\n return uuids;\n });\n\n const deadline = Date.now() + timeout;\n\n // 2. Poll until new objects appear\n while (Date.now() < deadline) {\n await page.waitForTimeout(pollIntervalMs);\n\n const result = await page.evaluate(\n ([filterType, filterName, knownUuids]) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n\n const snap = api.snapshot();\n const known = new Set(knownUuids);\n const newObjects: Array<{\n uuid: string;\n name: string;\n type: string;\n visible: boolean;\n testId?: string;\n position: [number, number, number];\n rotation: [number, number, number];\n scale: [number, number, number];\n }> = [];\n\n function scan(node: {\n uuid: string;\n name: string;\n type: string;\n visible: boolean;\n testId?: string;\n position: [number, number, number];\n rotation: [number, number, number];\n scale: [number, number, number];\n children: unknown[];\n }) {\n if (!known.has(node.uuid)) {\n // New object — check filters\n const typeMatch = !filterType || node.type === filterType;\n const nameMatch = !filterName || node.name.includes(filterName);\n if (typeMatch && nameMatch) {\n newObjects.push({\n uuid: node.uuid,\n name: node.name,\n type: node.type,\n visible: node.visible,\n testId: node.testId,\n position: node.position,\n rotation: node.rotation,\n scale: node.scale,\n });\n }\n }\n for (const child of node.children) {\n scan(child as typeof node);\n }\n }\n\n scan(snap.tree as unknown as Parameters<typeof scan>[0]);\n\n if (newObjects.length === 0) return null;\n\n return {\n newObjects,\n newUuids: newObjects.map((o) => o.uuid),\n count: newObjects.length,\n };\n },\n [type ?? null, nameContains ?? null, baselineUuids] as const,\n );\n\n if (result) {\n return result as WaitForNewObjectResult;\n }\n }\n\n // 3. Timeout — build a descriptive error\n const filterDesc = [\n type ? `type=\"${type}\"` : null,\n nameContains ? `nameContains=\"${nameContains}\"` : null,\n ].filter(Boolean).join(', ');\n\n throw new Error(\n `waitForNewObject timed out after ${timeout}ms. ` +\n `No new objects appeared${filterDesc ? ` matching ${filterDesc}` : ''}. ` +\n `Baseline had ${baselineUuids.length} objects.`,\n );\n}\n","import type { Page } from '@playwright/test';\n\n// ---------------------------------------------------------------------------\n// Interaction helpers — thin wrappers around page.evaluate calls to\n// window.__R3F_DOM__ interaction methods.\n//\n// All object-targeted interactions auto-wait for:\n// 1. The bridge to be ready (_ready === true)\n// 2. The target object to exist (by testId or uuid)\n// This mirrors Playwright's built-in auto-waiting on locators.\n// ---------------------------------------------------------------------------\n\n/** Default timeout for auto-waiting (ms). */\nconst DEFAULT_AUTO_WAIT_TIMEOUT = 5_000;\nconst AUTO_WAIT_POLL_MS = 100;\n\n/**\n * Auto-wait for bridge readiness AND a specific object to exist.\n * Replaces the old no-op `ensureBridge`. Throws descriptive errors\n * if bridge initialization failed or the object never appears.\n */\nasync function autoWaitForObject(\n page: Page,\n idOrUuid: string,\n timeout = DEFAULT_AUTO_WAIT_TIMEOUT,\n): Promise<void> {\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const state = await page.evaluate(\n (id) => {\n const api = window.__R3F_DOM__;\n if (!api) return { bridge: 'missing' as const };\n if (!api._ready) {\n return {\n bridge: 'not-ready' as const,\n error: api._error ?? null,\n };\n }\n const found = (api.getByTestId(id) ?? api.getByUuid(id)) !== null;\n return { bridge: 'ready' as const, found };\n },\n idOrUuid,\n );\n\n if (state.bridge === 'ready' && state.found) {\n return; // Good to go\n }\n\n if (state.bridge === 'not-ready' && state.error) {\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${state.error}\\n` +\n `Cannot perform interaction on \"${idOrUuid}\".`,\n );\n }\n\n await page.waitForTimeout(AUTO_WAIT_POLL_MS);\n }\n\n // Final diagnostic\n const finalState = await page.evaluate(\n (id) => {\n const api = window.__R3F_DOM__;\n if (!api) return { bridge: false, ready: false, count: 0, error: null, found: false };\n return {\n bridge: true,\n ready: api._ready,\n count: api.getCount(),\n error: api._error ?? null,\n found: (api.getByTestId(id) ?? api.getByUuid(id)) !== null,\n };\n },\n idOrUuid,\n );\n\n if (!finalState.bridge) {\n throw new Error(\n `[react-three-dom] Auto-wait timed out after ${timeout}ms: bridge not found.\\n` +\n `Ensure <ThreeDom> is mounted inside your <Canvas> component.`,\n );\n }\n\n throw new Error(\n `[react-three-dom] Auto-wait timed out after ${timeout}ms: object \"${idOrUuid}\" not found.\\n` +\n `Bridge: ready=${finalState.ready}, objectCount=${finalState.count}` +\n (finalState.error ? `, error=${finalState.error}` : '') + '.\\n' +\n `Ensure the object has userData.testId=\"${idOrUuid}\" or uuid=\"${idOrUuid}\".`,\n );\n}\n\n/**\n * Auto-wait for bridge readiness only (no specific object).\n * Used by non-object interactions like pointerMiss and drawPath.\n */\nasync function autoWaitForBridge(\n page: Page,\n timeout = DEFAULT_AUTO_WAIT_TIMEOUT,\n): Promise<void> {\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n const state = await page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) return { exists: false as const };\n return {\n exists: true as const,\n ready: api._ready,\n error: api._error ?? null,\n };\n });\n\n if (state.exists && state.ready) return;\n\n if (state.exists && !state.ready && state.error) {\n throw new Error(\n `[react-three-dom] Bridge initialization failed: ${state.error}`,\n );\n }\n\n await page.waitForTimeout(AUTO_WAIT_POLL_MS);\n }\n\n throw new Error(\n `[react-three-dom] Auto-wait timed out after ${timeout}ms: bridge not ready.\\n` +\n `Ensure <ThreeDom> is mounted inside your <Canvas> component.`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Object-targeted interactions (auto-wait for object)\n// ---------------------------------------------------------------------------\n\n/** Click a 3D object by its testId or uuid. Auto-waits for the object. */\nexport async function click(page: Page, idOrUuid: string, timeout?: number): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout);\n await page.evaluate((id) => {\n window.__R3F_DOM__!.click(id);\n }, idOrUuid);\n}\n\n/** Double-click a 3D object by its testId or uuid. Auto-waits for the object. */\nexport async function doubleClick(page: Page, idOrUuid: string, timeout?: number): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout);\n await page.evaluate((id) => {\n window.__R3F_DOM__!.doubleClick(id);\n }, idOrUuid);\n}\n\n/** Right-click / context-menu a 3D object. Auto-waits for the object. */\nexport async function contextMenu(page: Page, idOrUuid: string, timeout?: number): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout);\n await page.evaluate((id) => {\n window.__R3F_DOM__!.contextMenu(id);\n }, idOrUuid);\n}\n\n/** Hover over a 3D object. Auto-waits for the object. */\nexport async function hover(page: Page, idOrUuid: string, timeout?: number): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout);\n await page.evaluate((id) => {\n window.__R3F_DOM__!.hover(id);\n }, idOrUuid);\n}\n\n/** Drag a 3D object with a world-space delta. Auto-waits for the object. */\nexport async function drag(\n page: Page,\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n timeout?: number,\n): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout);\n await page.evaluate(\n async ([id, d]) => {\n await window.__R3F_DOM__!.drag(id, d);\n },\n [idOrUuid, delta] as const,\n );\n}\n\n/** Dispatch a wheel/scroll event on a 3D object. Auto-waits for the object. */\nexport async function wheel(\n page: Page,\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n timeout?: number,\n): Promise<void> {\n await autoWaitForObject(page, idOrUuid, timeout);\n await page.evaluate(\n ([id, opts]) => {\n window.__R3F_DOM__!.wheel(id, opts);\n },\n [idOrUuid, options] as const,\n );\n}\n\n// ---------------------------------------------------------------------------\n// Non-object interactions (auto-wait for bridge only)\n// ---------------------------------------------------------------------------\n\n/** Click empty space to trigger onPointerMissed handlers. Auto-waits for bridge. */\nexport async function pointerMiss(page: Page, timeout?: number): Promise<void> {\n await autoWaitForBridge(page, timeout);\n await page.evaluate(() => {\n window.__R3F_DOM__!.pointerMiss();\n });\n}\n\n/** Draw a freeform path on the canvas. Auto-waits for bridge. */\nexport async function drawPathOnCanvas(\n page: Page,\n points: Array<{ x: number; y: number; pressure?: number }>,\n options?: { stepDelayMs?: number; pointerType?: 'mouse' | 'pen' | 'touch'; clickAtEnd?: boolean },\n timeout?: number,\n): Promise<{ eventCount: number; pointCount: number }> {\n await autoWaitForBridge(page, timeout);\n return page.evaluate(\n async ([pts, opts]) => {\n return window.__R3F_DOM__!.drawPath(pts, opts ?? undefined);\n },\n [points, options ?? null] as const,\n );\n}\n","import { test as base } from '@playwright/test';\nimport type { Page } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection, SceneSnapshot, SnapshotNode } from './types';\nimport { waitForSceneReady, waitForIdle, waitForObject, waitForNewObject } from './waiters';\nimport type { WaitForNewObjectOptions, WaitForNewObjectResult } from './waiters';\nimport type {\n WaitForSceneReadyOptions,\n WaitForIdleOptions,\n WaitForObjectOptions,\n} from './waiters';\nimport * as interactions from './interactions';\n\n// ---------------------------------------------------------------------------\n// R3FFixture — the main API object provided to Playwright tests\n// ---------------------------------------------------------------------------\n\n/** Options for R3FFixture constructor. */\nexport interface R3FFixtureOptions {\n /** Auto-enable debug logging (forwards browser [r3f-dom:*] logs to test terminal). */\n debug?: boolean;\n}\n\nexport class R3FFixture {\n private _debugListenerAttached = false;\n\n constructor(\n private readonly _page: Page,\n opts?: R3FFixtureOptions,\n ) {\n if (opts?.debug) {\n this._attachDebugListener();\n }\n }\n\n /** The underlying Playwright Page. */\n get page(): Page {\n return this._page;\n }\n\n // -----------------------------------------------------------------------\n // Debug logging\n // -----------------------------------------------------------------------\n\n /**\n * Enable debug logging. Turns on `window.__R3F_DOM_DEBUG__` in the browser\n * and forwards all `[r3f-dom:*]` console messages to the Node.js test terminal.\n *\n * Call before `page.goto()` to capture setup logs, or after to capture\n * interaction logs.\n */\n async enableDebug(): Promise<void> {\n this._attachDebugListener();\n await this._page.evaluate(() => {\n window.__R3F_DOM_DEBUG__ = true;\n });\n }\n\n private _attachDebugListener(): void {\n if (this._debugListenerAttached) return;\n this._debugListenerAttached = true;\n this._page.on('console', (msg) => {\n const text = msg.text();\n if (text.startsWith('[r3f-dom:')) {\n console.log(text);\n }\n });\n }\n\n // -----------------------------------------------------------------------\n // Queries\n // -----------------------------------------------------------------------\n\n /** Get object metadata by testId or uuid. Returns null if not found. */\n async getObject(idOrUuid: string): Promise<ObjectMetadata | null> {\n return this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.getByTestId(id) ?? api.getByUuid(id) ?? null;\n }, idOrUuid);\n }\n\n /** Get heavy inspection data (Tier 2) by testId or uuid. */\n async inspect(idOrUuid: string): Promise<ObjectInspection | null> {\n return this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.inspect(id);\n }, idOrUuid);\n }\n\n /** Take a full scene snapshot. */\n async snapshot(): Promise<SceneSnapshot | null> {\n return this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n return api ? api.snapshot() : null;\n });\n }\n\n /** Get the total number of tracked objects. */\n async getCount(): Promise<number> {\n return this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n return api ? api.getCount() : 0;\n });\n }\n\n /**\n * Get all objects of a given Three.js type (e.g. \"Mesh\", \"Group\", \"Line\").\n * Useful for BIM/CAD apps to find all walls, doors, etc. by object type.\n */\n async getByType(type: string): Promise<ObjectMetadata[]> {\n return this._page.evaluate((t) => {\n const api = window.__R3F_DOM__;\n return api ? api.getByType(t) : [];\n }, type);\n }\n\n /**\n * Get objects that have a specific userData key (and optionally matching value).\n * Useful for BIM/CAD apps where objects are tagged with metadata like\n * `userData.category = \"wall\"` or `userData.floorId = 2`.\n */\n async getByUserData(key: string, value?: unknown): Promise<ObjectMetadata[]> {\n return this._page.evaluate(({ k, v }) => {\n const api = window.__R3F_DOM__;\n return api ? api.getByUserData(k, v) : [];\n }, { k: key, v: value });\n }\n\n /**\n * Count objects of a given Three.js type.\n * More efficient than `getByType(type).then(arr => arr.length)`.\n */\n async getCountByType(type: string): Promise<number> {\n return this._page.evaluate((t) => {\n const api = window.__R3F_DOM__;\n return api ? api.getCountByType(t) : 0;\n }, type);\n }\n\n /**\n * Batch lookup: get metadata for multiple objects by testId or uuid in a\n * single browser round-trip. Returns a record from id to metadata (or null).\n *\n * Much more efficient than calling `getObject()` in a loop for BIM/CAD\n * scenes with many objects.\n *\n * @example\n * ```typescript\n * const results = await r3f.getObjects(['wall-1', 'door-2', 'window-3']);\n * expect(results['wall-1']).not.toBeNull();\n * expect(results['door-2']?.type).toBe('Mesh');\n * ```\n */\n async getObjects(ids: string[]): Promise<Record<string, ObjectMetadata | null>> {\n return this._page.evaluate((idList) => {\n const api = window.__R3F_DOM__;\n if (!api) {\n const result: Record<string, null> = {};\n for (const id of idList) result[id] = null;\n return result;\n }\n return api.getObjects(idList);\n }, ids);\n }\n\n /**\n * Log the scene tree to the test terminal for debugging.\n *\n * Prints a human-readable tree like:\n * ```\n * Scene \"root\"\n * ├─ Mesh \"chair-primary\" [testId: chair-primary] visible\n * │ └─ BoxGeometry\n * ├─ DirectionalLight \"sun-light\" [testId: sun-light] visible\n * └─ Group \"furniture\"\n * ├─ Mesh \"table-top\" [testId: table-top] visible\n * └─ Mesh \"vase\" [testId: vase] visible\n * ```\n */\n async logScene(): Promise<void> {\n const snap = await this.snapshot();\n if (!snap) {\n console.log('[r3f-dom] logScene: no scene snapshot available (bridge not ready?)');\n return;\n }\n const lines = formatSceneTree(snap.tree);\n console.log(`\\n[r3f-dom] Scene tree (${snap.objectCount} objects):\\n${lines}\\n`);\n }\n\n // -----------------------------------------------------------------------\n // Interactions\n // -----------------------------------------------------------------------\n\n /**\n * Click a 3D object by testId or uuid.\n * Auto-waits for the bridge and the object to exist before clicking.\n * @param timeout Optional auto-wait timeout in ms. Default: 5000\n */\n async click(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.click(this._page, idOrUuid, timeout);\n }\n\n /**\n * Double-click a 3D object by testId or uuid.\n * Auto-waits for the object to exist.\n */\n async doubleClick(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.doubleClick(this._page, idOrUuid, timeout);\n }\n\n /**\n * Right-click / context-menu a 3D object by testId or uuid.\n * Auto-waits for the object to exist.\n */\n async contextMenu(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.contextMenu(this._page, idOrUuid, timeout);\n }\n\n /**\n * Hover over a 3D object by testId or uuid.\n * Auto-waits for the object to exist.\n */\n async hover(idOrUuid: string, timeout?: number): Promise<void> {\n return interactions.hover(this._page, idOrUuid, timeout);\n }\n\n /**\n * Drag a 3D object with a world-space delta vector.\n * Auto-waits for the object to exist.\n */\n async drag(\n idOrUuid: string,\n delta: { x: number; y: number; z: number },\n timeout?: number,\n ): Promise<void> {\n return interactions.drag(this._page, idOrUuid, delta, timeout);\n }\n\n /**\n * Dispatch a wheel/scroll event on a 3D object.\n * Auto-waits for the object to exist.\n */\n async wheel(\n idOrUuid: string,\n options?: { deltaY?: number; deltaX?: number },\n timeout?: number,\n ): Promise<void> {\n return interactions.wheel(this._page, idOrUuid, options, timeout);\n }\n\n /**\n * Click empty space to trigger onPointerMissed handlers.\n * Auto-waits for the bridge to be ready.\n */\n async pointerMiss(timeout?: number): Promise<void> {\n return interactions.pointerMiss(this._page, timeout);\n }\n\n /**\n * Draw a freeform path on the canvas. Dispatches pointerdown → N × pointermove → pointerup.\n * Designed for canvas drawing/annotation/whiteboard apps.\n * Auto-waits for the bridge to be ready.\n *\n * @param points Array of screen-space points (min 2). { x, y } in CSS pixels relative to canvas.\n * @param options Drawing options (stepDelayMs, pointerType, clickAtEnd)\n * @param timeout Optional auto-wait timeout in ms. Default: 5000\n * @returns { eventCount, pointCount }\n */\n async drawPath(\n points: Array<{ x: number; y: number; pressure?: number }>,\n options?: { stepDelayMs?: number; pointerType?: 'mouse' | 'pen' | 'touch'; clickAtEnd?: boolean },\n timeout?: number,\n ): Promise<{ eventCount: number; pointCount: number }> {\n return interactions.drawPathOnCanvas(this._page, points, options, timeout);\n }\n\n // -----------------------------------------------------------------------\n // Waiters\n // -----------------------------------------------------------------------\n\n /**\n * Wait until the scene is ready — `window.__R3F_DOM__` is available and\n * the object count has stabilised across several consecutive checks.\n */\n async waitForSceneReady(options?: WaitForSceneReadyOptions): Promise<void> {\n return waitForSceneReady(this._page, options);\n }\n\n /**\n * Wait until the bridge is available and an object with the given testId or\n * uuid exists. Use this instead of waitForSceneReady when the scene count\n * never stabilizes (e.g. async model loading, continuous animations).\n */\n async waitForObject(\n idOrUuid: string,\n options?: WaitForObjectOptions,\n ): Promise<void> {\n return waitForObject(this._page, idOrUuid, options);\n }\n\n /**\n * Wait until no object properties have changed for a number of consecutive\n * animation frames. Useful after triggering interactions or animations.\n */\n async waitForIdle(options?: WaitForIdleOptions): Promise<void> {\n return waitForIdle(this._page, options);\n }\n\n /**\n * Wait until one or more new objects appear in the scene that were not\n * present when this call was made. Perfect for drawing apps where\n * `drawPath()` creates new geometry asynchronously.\n *\n * @param options Filter by type, nameContains, timeout, pollInterval\n * @returns Metadata of the newly added object(s)\n */\n async waitForNewObject(options?: WaitForNewObjectOptions): Promise<WaitForNewObjectResult> {\n return waitForNewObject(this._page, options);\n }\n\n // -----------------------------------------------------------------------\n // Selection (for inspector integration)\n // -----------------------------------------------------------------------\n\n /** Select a 3D object by testId or uuid (highlights in scene). */\n async select(idOrUuid: string): Promise<void> {\n await this._page.evaluate((id) => {\n const api = window.__R3F_DOM__;\n if (!api) throw new Error('react-three-dom bridge not found');\n api.select(id);\n }, idOrUuid);\n }\n\n /** Clear the current selection. */\n async clearSelection(): Promise<void> {\n await this._page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (api) api.clearSelection();\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Scene tree formatter — used by logScene()\n// ---------------------------------------------------------------------------\n\nfunction formatSceneTree(node: SnapshotNode, prefix = '', isLast = true): string {\n const connector = prefix === '' ? '' : isLast ? '└─ ' : '├─ ';\n const childPrefix = prefix === '' ? '' : prefix + (isLast ? ' ' : '│ ');\n\n // Build the label: \"Type \"name\" [testId: x] visible/hidden\"\n let label = node.type;\n if (node.name) label += ` \"${node.name}\"`;\n if (node.testId) label += ` [testId: ${node.testId}]`;\n label += node.visible ? ' visible' : ' HIDDEN';\n\n let result = prefix + connector + label + '\\n';\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const last = i === node.children.length - 1;\n result += formatSceneTree(child, childPrefix, last);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// test.extend — add the `r3f` fixture to Playwright's test runner\n// ---------------------------------------------------------------------------\n\nexport const test = base.extend<{ r3f: R3FFixture }>({\n r3f: async ({ page }, use) => {\n const fixture = new R3FFixture(page);\n await use(fixture);\n },\n});\n\n/**\n * Create a custom test.extend with debug enabled for all tests:\n *\n * ```typescript\n * import { createR3FTest } from '@react-three-dom/playwright';\n * export const test = createR3FTest({ debug: true });\n * ```\n */\nexport function createR3FTest(options?: R3FFixtureOptions) {\n return base.extend<{ r3f: R3FFixture }>({\n r3f: async ({ page }, use) => {\n const fixture = new R3FFixture(page, options);\n await use(fixture);\n },\n });\n}\n","import { expect as baseExpect } from '@playwright/test';\nimport type { Page } from '@playwright/test';\nimport type { ObjectMetadata, ObjectInspection } from './types';\n\n// ---------------------------------------------------------------------------\n// Custom Playwright expect matchers for 3D scene testing\n//\n// Every matcher auto-retries until the assertion passes or the timeout\n// expires, matching Playwright's built-in assertion behaviour.\n//\n// All 26 matchers:\n// Tier 1 (metadata): toExist, toBeVisible, toHavePosition, toHaveRotation,\n// toHaveScale, toHaveType, toHaveName, toHaveGeometryType,\n// toHaveMaterialType, toHaveChildCount, toHaveParent,\n// toHaveInstanceCount\n// Tier 2 (inspection): toBeInFrustum, toHaveBounds, toHaveColor,\n// toHaveOpacity, toBeTransparent, toHaveVertexCount,\n// toHaveTriangleCount, toHaveUserData, toHaveMapTexture\n// Scene-level: toHaveObjectCount, toHaveObjectCountGreaterThan,\n// toHaveCountByType, toHaveTotalTriangleCount,\n// toHaveTotalTriangleCountLessThan\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TIMEOUT = 5_000;\nconst DEFAULT_INTERVAL = 100;\n\n// ---------------------------------------------------------------------------\n// Scene-level helpers\n// ---------------------------------------------------------------------------\n\nasync function fetchSceneCount(page: Page): Promise<number> {\n return page.evaluate(() => {\n const api = window.__R3F_DOM__;\n return api ? api.getCount() : 0;\n });\n}\n\nasync function fetchCountByType(page: Page, type: string): Promise<number> {\n return page.evaluate((t) => {\n const api = window.__R3F_DOM__;\n return api ? api.getCountByType(t) : 0;\n }, type);\n}\n\nasync function fetchTotalTriangles(page: Page): Promise<number> {\n return page.evaluate(() => {\n const api = window.__R3F_DOM__;\n if (!api) return 0;\n const bridge = api; // capture for nested function\n const snap = bridge.snapshot();\n let total = 0;\n function walk(node: { uuid: string; children: unknown[] }) {\n const meta = bridge.getByUuid(node.uuid);\n if (meta && meta.triangleCount) total += meta.triangleCount;\n for (const child of node.children) {\n walk(child as typeof node);\n }\n }\n walk(snap.tree as unknown as { uuid: string; children: unknown[] });\n return total;\n });\n}\n\n// ---------------------------------------------------------------------------\n// Object-level helpers\n// ---------------------------------------------------------------------------\n\nasync function fetchMeta(page: Page, id: string): Promise<ObjectMetadata | null> {\n return page.evaluate((i) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.getByTestId(i) ?? api.getByUuid(i) ?? null;\n }, id);\n}\n\nasync function fetchInsp(page: Page, id: string): Promise<ObjectInspection | null> {\n return page.evaluate((i) => {\n const api = window.__R3F_DOM__;\n if (!api) return null;\n return api.inspect(i);\n }, id);\n}\n\ninterface R3FMatcherReceiver {\n page: Page;\n getObject(idOrUuid: string): Promise<ObjectMetadata | null>;\n inspect(idOrUuid: string): Promise<ObjectInspection | null>;\n}\n\ninterface MatcherOptions {\n timeout?: number;\n interval?: number;\n}\n\ntype Vec3Opts = MatcherOptions & { tolerance?: number };\n\nfunction parseTol(v: number | Vec3Opts | undefined, def: number) {\n const o = typeof v === 'number' ? { tolerance: v } : (v ?? {});\n return {\n timeout: o.timeout ?? DEFAULT_TIMEOUT,\n interval: o.interval ?? DEFAULT_INTERVAL,\n tolerance: o.tolerance ?? def,\n };\n}\n\nfunction notFound(name: string, id: string, detail: string, timeout: number) {\n return {\n pass: false,\n message: () => `Expected object \"${id}\" ${detail}, but it was not found (waited ${timeout}ms)`,\n name,\n };\n}\n\n// ===========================================================================\n// Matchers\n// ===========================================================================\n\nexport const expect = baseExpect.extend({\n\n // ========================= TIER 1 — Metadata ============================\n\n // --- toExist ---\n async toExist(r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n return meta !== null;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n const pass = meta !== null;\n return {\n pass,\n message: () => pass\n ? `Expected object \"${id}\" to NOT exist, but it does`\n : `Expected object \"${id}\" to exist, but it was not found (waited ${timeout}ms)`,\n name: 'toExist', expected: id, actual: meta,\n };\n },\n\n // --- toBeVisible ---\n async toBeVisible(r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n return meta?.visible ?? false;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toBeVisible', id, 'to be visible', timeout);\n const m = meta as ObjectMetadata;\n return {\n pass: m.visible,\n message: () => m.visible\n ? `Expected \"${id}\" to NOT be visible, but it is`\n : `Expected \"${id}\" to be visible, but visible=${m.visible} (waited ${timeout}ms)`,\n name: 'toBeVisible', expected: true, actual: m.visible,\n };\n },\n\n // --- toHavePosition ---\n async toHavePosition(r3f: R3FMatcherReceiver, id: string, expected: [number, number, number], tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n let delta: [number, number, number] = [0, 0, 0];\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n delta = [Math.abs(meta.position[0] - expected[0]), Math.abs(meta.position[1] - expected[1]), Math.abs(meta.position[2] - expected[2])];\n pass = delta.every(d => d <= tolerance);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHavePosition', id, `to have position [${expected}]`, timeout);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT be at [${expected}] (±${tolerance})`\n : `Expected \"${id}\" at [${expected}] (±${tolerance}), got [${m.position}] (Δ [${delta.map(d => d.toFixed(4))}]) (waited ${timeout}ms)`,\n name: 'toHavePosition', expected, actual: m.position,\n };\n },\n\n // --- toHaveRotation ---\n async toHaveRotation(r3f: R3FMatcherReceiver, id: string, expected: [number, number, number], tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n let delta: [number, number, number] = [0, 0, 0];\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n delta = [Math.abs(meta.rotation[0] - expected[0]), Math.abs(meta.rotation[1] - expected[1]), Math.abs(meta.rotation[2] - expected[2])];\n pass = delta.every(d => d <= tolerance);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveRotation', id, `to have rotation [${expected}]`, timeout);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have rotation [${expected}] (±${tolerance})`\n : `Expected \"${id}\" rotation [${expected}] (±${tolerance}), got [${m.rotation}] (Δ [${delta.map(d => d.toFixed(4))}]) (waited ${timeout}ms)`,\n name: 'toHaveRotation', expected, actual: m.rotation,\n };\n },\n\n // --- toHaveScale ---\n async toHaveScale(r3f: R3FMatcherReceiver, id: string, expected: [number, number, number], tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n let delta: [number, number, number] = [0, 0, 0];\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n delta = [Math.abs(meta.scale[0] - expected[0]), Math.abs(meta.scale[1] - expected[1]), Math.abs(meta.scale[2] - expected[2])];\n pass = delta.every(d => d <= tolerance);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveScale', id, `to have scale [${expected}]`, timeout);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have scale [${expected}] (±${tolerance})`\n : `Expected \"${id}\" scale [${expected}] (±${tolerance}), got [${m.scale}] (Δ [${delta.map(d => d.toFixed(4))}]) (waited ${timeout}ms)`,\n name: 'toHaveScale', expected, actual: m.scale,\n };\n },\n\n // --- toHaveType ---\n async toHaveType(r3f: R3FMatcherReceiver, id: string, expectedType: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n pass = meta.type === expectedType;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveType', id, `to have type \"${expectedType}\"`, timeout);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have type \"${expectedType}\"`\n : `Expected \"${id}\" type \"${expectedType}\", got \"${m.type}\" (waited ${timeout}ms)`,\n name: 'toHaveType', expected: expectedType, actual: m.type,\n };\n },\n\n // --- toHaveName ---\n async toHaveName(r3f: R3FMatcherReceiver, id: string, expectedName: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n pass = meta.name === expectedName;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveName', id, `to have name \"${expectedName}\"`, timeout);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have name \"${expectedName}\"`\n : `Expected \"${id}\" name \"${expectedName}\", got \"${m.name}\" (waited ${timeout}ms)`,\n name: 'toHaveName', expected: expectedName, actual: m.name,\n };\n },\n\n // --- toHaveGeometryType ---\n async toHaveGeometryType(r3f: R3FMatcherReceiver, id: string, expectedGeo: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n pass = meta.geometryType === expectedGeo;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveGeometryType', id, `to have geometry \"${expectedGeo}\"`, timeout);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have geometry \"${expectedGeo}\"`\n : `Expected \"${id}\" geometry \"${expectedGeo}\", got \"${m.geometryType ?? 'none'}\" (waited ${timeout}ms)`,\n name: 'toHaveGeometryType', expected: expectedGeo, actual: m.geometryType,\n };\n },\n\n // --- toHaveMaterialType ---\n async toHaveMaterialType(r3f: R3FMatcherReceiver, id: string, expectedMat: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n pass = meta.materialType === expectedMat;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveMaterialType', id, `to have material \"${expectedMat}\"`, timeout);\n const m = meta as ObjectMetadata;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have material \"${expectedMat}\"`\n : `Expected \"${id}\" material \"${expectedMat}\", got \"${m.materialType ?? 'none'}\" (waited ${timeout}ms)`,\n name: 'toHaveMaterialType', expected: expectedMat, actual: m.materialType,\n };\n },\n\n // --- toHaveChildCount ---\n async toHaveChildCount(r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta) return false;\n actual = meta.childrenUuids.length;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveChildCount', id, `to have ${expectedCount} children`, timeout);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have ${expectedCount} children`\n : `Expected \"${id}\" ${expectedCount} children, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveChildCount', expected: expectedCount, actual,\n };\n },\n\n // --- toHaveParent ---\n async toHaveParent(r3f: R3FMatcherReceiver, id: string, expectedParent: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let parentMeta: ObjectMetadata | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n if (!meta?.parentUuid) return false;\n parentMeta = await fetchMeta(r3f.page, meta.parentUuid);\n if (!parentMeta) return false;\n pass = parentMeta.uuid === expectedParent || parentMeta.testId === expectedParent || parentMeta.name === expectedParent;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveParent', id, `to have parent \"${expectedParent}\"`, timeout);\n const m = meta as ObjectMetadata;\n const pm = parentMeta as ObjectMetadata | null;\n const parentLabel = pm?.testId ?? pm?.name ?? m.parentUuid;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have parent \"${expectedParent}\"`\n : `Expected \"${id}\" parent \"${expectedParent}\", got \"${parentLabel}\" (waited ${timeout}ms)`,\n name: 'toHaveParent', expected: expectedParent, actual: parentLabel,\n };\n },\n\n // --- toHaveInstanceCount ---\n async toHaveInstanceCount(r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n actual = meta?.instanceCount ?? 0;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveInstanceCount', id, `to have instance count ${expectedCount}`, timeout);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have instance count ${expectedCount}`\n : `Expected \"${id}\" instance count ${expectedCount}, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveInstanceCount', expected: expectedCount, actual,\n };\n },\n\n // ========================= TIER 2 — Inspection ==========================\n\n // --- toBeInFrustum ---\n async toBeInFrustum(r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id);\n if (!insp) return false;\n const fin = (v: number[]) => v.every(Number.isFinite);\n pass = fin(insp.bounds.min) && fin(insp.bounds.max);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFound('toBeInFrustum', id, 'to be in frustum', timeout);\n const i = insp as ObjectInspection;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT be in the camera frustum`\n : `Expected \"${id}\" in frustum, but bounds are invalid (waited ${timeout}ms)`,\n name: 'toBeInFrustum', expected: 'finite bounds', actual: i.bounds,\n };\n },\n\n // --- toHaveBounds ---\n async toHaveBounds(\n r3f: R3FMatcherReceiver, id: string,\n expected: { min: [number, number, number]; max: [number, number, number] },\n tolOpts?: number | Vec3Opts,\n ) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.1);\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id);\n if (!insp) return false;\n const w = (a: number[], b: number[]) => a.every((v, j) => Math.abs(v - b[j]) <= tolerance);\n pass = w(insp.bounds.min, expected.min) && w(insp.bounds.max, expected.max);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFound('toHaveBounds', id, 'to have specific bounds', timeout);\n const i = insp as ObjectInspection;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}`\n : `Expected \"${id}\" bounds min:${JSON.stringify(expected.min)} max:${JSON.stringify(expected.max)}, got min:${JSON.stringify(i.bounds.min)} max:${JSON.stringify(i.bounds.max)} (waited ${timeout}ms)`,\n name: 'toHaveBounds', expected, actual: i.bounds,\n };\n },\n\n // --- toHaveColor ---\n async toHaveColor(r3f: R3FMatcherReceiver, id: string, expectedColor: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n const norm = expectedColor.startsWith('#') ? expectedColor.toLowerCase() : `#${expectedColor.toLowerCase()}`;\n let insp: ObjectInspection | null = null;\n let actual: string | undefined;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id);\n if (!insp?.material?.color) return false;\n actual = insp.material.color.toLowerCase();\n pass = actual === norm;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFound('toHaveColor', id, `to have color \"${norm}\"`, timeout);\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have color \"${norm}\"`\n : `Expected \"${id}\" color \"${norm}\", got \"${actual ?? 'no color'}\" (waited ${timeout}ms)`,\n name: 'toHaveColor', expected: norm, actual,\n };\n },\n\n // --- toHaveOpacity ---\n async toHaveOpacity(r3f: R3FMatcherReceiver, id: string, expectedOpacity: number, tolOpts?: number | Vec3Opts) {\n const { timeout, interval, tolerance } = parseTol(tolOpts, 0.01);\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let actual: number | undefined;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id);\n if (!insp?.material) return false;\n actual = insp.material.opacity;\n pass = actual !== undefined && Math.abs(actual - expectedOpacity) <= tolerance;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFound('toHaveOpacity', id, `to have opacity ${expectedOpacity}`, timeout);\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have opacity ${expectedOpacity} (±${tolerance})`\n : `Expected \"${id}\" opacity ${expectedOpacity} (±${tolerance}), got ${actual ?? 'no material'} (waited ${timeout}ms)`,\n name: 'toHaveOpacity', expected: expectedOpacity, actual,\n };\n },\n\n // --- toBeTransparent ---\n async toBeTransparent(r3f: R3FMatcherReceiver, id: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id);\n if (!insp?.material) return false;\n pass = insp.material.transparent === true;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFound('toBeTransparent', id, 'to be transparent', timeout);\n const i = insp as ObjectInspection;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT be transparent`\n : `Expected \"${id}\" transparent=true, got ${i.material?.transparent ?? 'no material'} (waited ${timeout}ms)`,\n name: 'toBeTransparent', expected: true, actual: i.material?.transparent,\n };\n },\n\n // --- toHaveVertexCount ---\n async toHaveVertexCount(r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n actual = meta?.vertexCount ?? 0;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveVertexCount', id, `to have ${expectedCount} vertices`, timeout);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have ${expectedCount} vertices`\n : `Expected \"${id}\" ${expectedCount} vertices, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveVertexCount', expected: expectedCount, actual,\n };\n },\n\n // --- toHaveTriangleCount ---\n async toHaveTriangleCount(r3f: R3FMatcherReceiver, id: string, expectedCount: number, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let meta: ObjectMetadata | null = null;\n let actual = 0;\n try {\n await baseExpect.poll(async () => {\n meta = await fetchMeta(r3f.page, id);\n actual = meta?.triangleCount ?? 0;\n return actual === expectedCount;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!meta) return notFound('toHaveTriangleCount', id, `to have ${expectedCount} triangles`, timeout);\n const pass = actual === expectedCount;\n return {\n pass,\n message: () => pass\n ? `Expected \"${id}\" to NOT have ${expectedCount} triangles`\n : `Expected \"${id}\" ${expectedCount} triangles, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveTriangleCount', expected: expectedCount, actual,\n };\n },\n\n // --- toHaveUserData ---\n async toHaveUserData(r3f: R3FMatcherReceiver, id: string, key: string, expectedValue?: unknown, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let actual: unknown;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id);\n if (!insp) return false;\n if (!(key in insp.userData)) return false;\n if (expectedValue === undefined) { pass = true; return true; }\n actual = insp.userData[key];\n pass = JSON.stringify(actual) === JSON.stringify(expectedValue);\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFound('toHaveUserData', id, `to have userData.${key}`, timeout);\n return {\n pass,\n message: () => {\n if (expectedValue === undefined) {\n return pass\n ? `Expected \"${id}\" to NOT have userData key \"${key}\"`\n : `Expected \"${id}\" to have userData key \"${key}\", but missing (waited ${timeout}ms)`;\n }\n return pass\n ? `Expected \"${id}\" to NOT have userData.${key} = ${JSON.stringify(expectedValue)}`\n : `Expected \"${id}\" userData.${key} = ${JSON.stringify(expectedValue)}, got ${JSON.stringify(actual)} (waited ${timeout}ms)`;\n },\n name: 'toHaveUserData', expected: expectedValue ?? `key \"${key}\"`, actual,\n };\n },\n\n // --- toHaveMapTexture ---\n async toHaveMapTexture(r3f: R3FMatcherReceiver, id: string, expectedName?: string, opts?: MatcherOptions) {\n const timeout = opts?.timeout ?? DEFAULT_TIMEOUT;\n const interval = opts?.interval ?? DEFAULT_INTERVAL;\n const isNot = this.isNot;\n let insp: ObjectInspection | null = null;\n let actual: string | undefined;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n insp = await fetchInsp(r3f.page, id);\n if (!insp?.material?.map) return false;\n actual = insp.material.map;\n if (!expectedName) { pass = true; return true; }\n pass = actual === expectedName;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n if (!insp) return notFound('toHaveMapTexture', id, 'to have a map texture', timeout);\n return {\n pass,\n message: () => {\n if (!expectedName) {\n return pass\n ? `Expected \"${id}\" to NOT have a map texture`\n : `Expected \"${id}\" to have a map texture, but none found (waited ${timeout}ms)`;\n }\n return pass\n ? `Expected \"${id}\" to NOT have map \"${expectedName}\"`\n : `Expected \"${id}\" map \"${expectedName}\", got \"${actual ?? 'none'}\" (waited ${timeout}ms)`;\n },\n name: 'toHaveMapTexture', expected: expectedName ?? 'any map', actual,\n };\n },\n\n // =========================================================================\n // Scene-level matchers (no object ID — operate on the whole scene)\n // =========================================================================\n\n /**\n * Assert the total number of objects in the scene.\n * Auto-retries until the count matches or timeout.\n *\n * @example expect(r3f).toHaveObjectCount(42);\n * @example expect(r3f).toHaveObjectCount(42, { timeout: 10_000 });\n */\n async toHaveObjectCount(\n r3f: R3FMatcherReceiver,\n expected: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchSceneCount(r3f.page);\n pass = actual === expected;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to NOT have ${expected} objects, but it does`\n : `Expected scene to have ${expected} objects, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveObjectCount', expected, actual,\n };\n },\n\n /**\n * Assert the total number of objects is at least `min`.\n * Useful for BIM scenes where the exact count may vary slightly.\n *\n * @example expect(r3f).toHaveObjectCountGreaterThan(10);\n */\n async toHaveObjectCountGreaterThan(\n r3f: R3FMatcherReceiver,\n min: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchSceneCount(r3f.page);\n pass = actual > min;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to have at most ${min} objects, but has ${actual}`\n : `Expected scene to have more than ${min} objects, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveObjectCountGreaterThan', expected: `> ${min}`, actual,\n };\n },\n\n /**\n * Assert the count of objects of a specific Three.js type.\n * Auto-retries until the count matches or timeout.\n *\n * @example expect(r3f).toHaveCountByType('Mesh', 5);\n * @example expect(r3f).toHaveCountByType('Line', 10, { timeout: 10_000 });\n */\n async toHaveCountByType(\n r3f: R3FMatcherReceiver,\n type: string,\n expected: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchCountByType(r3f.page, type);\n pass = actual === expected;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to NOT have ${expected} \"${type}\" objects, but it does`\n : `Expected ${expected} \"${type}\" objects, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveCountByType', expected, actual,\n };\n },\n\n /**\n * Assert the total triangle count across all meshes in the scene.\n * Use as a performance budget guard — fail if the scene exceeds a threshold.\n *\n * @example expect(r3f).toHaveTotalTriangleCount(50000);\n * @example expect(r3f).not.toHaveTotalTriangleCountGreaterThan(100000); // budget guard\n */\n async toHaveTotalTriangleCount(\n r3f: R3FMatcherReceiver,\n expected: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchTotalTriangles(r3f.page);\n pass = actual === expected;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to NOT have ${expected} total triangles, but it does`\n : `Expected ${expected} total triangles, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveTotalTriangleCount', expected, actual,\n };\n },\n\n /**\n * Assert the total triangle count is at most `max`.\n * Perfect as a performance budget guard to prevent scene bloat.\n *\n * @example expect(r3f).toHaveTotalTriangleCountLessThan(100_000);\n */\n async toHaveTotalTriangleCountLessThan(\n r3f: R3FMatcherReceiver,\n max: number,\n options?: MatcherOptions,\n ) {\n const isNot = this.isNot;\n const timeout = options?.timeout ?? DEFAULT_TIMEOUT;\n const interval = options?.interval ?? DEFAULT_INTERVAL;\n let actual = -1;\n let pass = false;\n try {\n await baseExpect.poll(async () => {\n actual = await fetchTotalTriangles(r3f.page);\n pass = actual < max;\n return pass;\n }, { timeout, intervals: [interval] }).toBe(!isNot);\n } catch { /* */ }\n return {\n pass,\n message: () =>\n pass\n ? `Expected scene to have at least ${max} triangles, but has ${actual}`\n : `Expected scene to have fewer than ${max} triangles, got ${actual} (waited ${timeout}ms)`,\n name: 'toHaveTotalTriangleCountLessThan', expected: `< ${max}`, actual,\n };\n },\n});\n","// ---------------------------------------------------------------------------\n// Path generators for drawPath — pure geometry utilities\n//\n// These generate arrays of screen-space points that can be passed to\n// r3f.drawPath(). Identical to the functions in @react-three-dom/core\n// but duplicated here to avoid a runtime dependency on the core package.\n// ---------------------------------------------------------------------------\n\n/** A 2D screen-space point in CSS pixels, relative to the canvas top-left. */\nexport interface DrawPoint {\n /** X coordinate in CSS pixels from canvas left edge. */\n x: number;\n /** Y coordinate in CSS pixels from canvas top edge. */\n y: number;\n /** Optional pressure (0–1). Default: 0.5 */\n pressure?: number;\n}\n\n/**\n * Generate points along a straight line.\n *\n * @param start Start point\n * @param end End point\n * @param steps Intermediate points (excluding start/end). Default: 10\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function linePath(\n start: { x: number; y: number },\n end: { x: number; y: number },\n steps = 10,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n const totalSteps = steps + 1;\n for (let i = 0; i <= totalSteps; i++) {\n const t = i / totalSteps;\n points.push({\n x: start.x + (end.x - start.x) * t,\n y: start.y + (end.y - start.y) * t,\n pressure,\n });\n }\n return points;\n}\n\n/**\n * Generate points along a quadratic bezier curve.\n *\n * @param start Start point\n * @param control Control point\n * @param end End point\n * @param steps Number of steps. Default: 20\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function curvePath(\n start: { x: number; y: number },\n control: { x: number; y: number },\n end: { x: number; y: number },\n steps = 20,\n pressure = 0.5,\n): DrawPoint[] {\n const points: DrawPoint[] = [];\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const invT = 1 - t;\n points.push({\n x: invT * invT * start.x + 2 * invT * t * control.x + t * t * end.x,\n y: invT * invT * start.y + 2 * invT * t * control.y + t * t * end.y,\n pressure,\n });\n }\n return points;\n}\n\n/**\n * Generate points forming a rectangle.\n *\n * @param topLeft Top-left corner\n * @param bottomRight Bottom-right corner\n * @param pointsPerSide Points per side. Default: 5\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function rectPath(\n topLeft: { x: number; y: number },\n bottomRight: { x: number; y: number },\n pointsPerSide = 5,\n pressure = 0.5,\n): DrawPoint[] {\n const topRight = { x: bottomRight.x, y: topLeft.y };\n const bottomLeft = { x: topLeft.x, y: bottomRight.y };\n const sides = [\n [topLeft, topRight],\n [topRight, bottomRight],\n [bottomRight, bottomLeft],\n [bottomLeft, topLeft],\n ] as const;\n\n const points: DrawPoint[] = [];\n for (const [from, to] of sides) {\n for (let i = 0; i < pointsPerSide; i++) {\n const t = i / pointsPerSide;\n points.push({\n x: from.x + (to.x - from.x) * t,\n y: from.y + (to.y - from.y) * t,\n pressure,\n });\n }\n }\n points.push({ x: topLeft.x, y: topLeft.y, pressure });\n return points;\n}\n\n/**\n * Generate points forming a circle/ellipse.\n *\n * @param center Center point\n * @param radiusX Horizontal radius in CSS pixels\n * @param radiusY Vertical radius. Default: same as radiusX\n * @param steps Number of points. Default: 36\n * @param pressure Uniform pressure. Default: 0.5\n */\nexport function circlePath(\n center: { x: number; y: number },\n radiusX: number,\n radiusY?: number,\n steps = 36,\n pressure = 0.5,\n): DrawPoint[] {\n const ry = radiusY ?? radiusX;\n const points: DrawPoint[] = [];\n for (let i = 0; i <= steps; i++) {\n const angle = (i / steps) * Math.PI * 2;\n points.push({\n x: center.x + Math.cos(angle) * radiusX,\n y: center.y + Math.sin(angle) * ry,\n pressure,\n });\n }\n return points;\n}\n"]}
|