@extable/core 0.3.3 → 0.3.4
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/core.css +1 -0
- package/dist/index +5328 -0
- package/dist/index.css +1 -1
- package/dist/index.js +1696 -2643
- package/dist/index.js.map +1 -1
- package/dist/index.map +1 -0
- package/dist/numberIO-CmW6eOR7.js +978 -0
- package/dist/numberIO-CmW6eOR7.js.map +1 -0
- package/dist/ssr/htmlBuilder.d.ts +11 -0
- package/dist/ssr/index +338 -0
- package/dist/ssr/index.d.ts +2 -0
- package/dist/ssr/index.js +480 -0
- package/dist/ssr/index.js.map +1 -0
- package/dist/ssr/index.map +1 -0
- package/dist/ssr/nodeShims.d.ts +14 -0
- package/dist/ssr/renderer.d.ts +27 -0
- package/dist/ssr/styleSerializer.d.ts +10 -0
- package/package.json +10 -4
- package/src/styles.css +885 -0
- package/style.css +1 -0
package/dist/index.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index","sources":["../src/commandQueue.ts","../src/address.ts","../src/lockManager.ts","../../sequence/dist/index.js","../src/fillHandle.ts","../src/renderers.ts","../src/selectionManager.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import type { Command } from \"./types\";\n\ntype CommandGroup = { batchId: string | null; commands: Command[] };\nexport type CommandGroupSnapshot = { batchId: string | null; commands: Command[] };\n\nfunction getBatchId(cmd: Command) {\n const p = cmd.payload as Record<string, unknown> | null | undefined;\n if (!p) return null;\n const id = p.batchId;\n return typeof id === \"string\" && id.length ? id : null;\n}\n\nexport class CommandQueue {\n private applied: CommandGroup[] = [];\n private undone: CommandGroup[] = [];\n private cap: number;\n\n constructor(cap = 100) {\n this.cap = cap;\n }\n\n enqueue(command: Command) {\n const batchId = getBatchId(command);\n const last = this.applied.at(-1);\n if (batchId && last && last.batchId === batchId) {\n last.commands.push(command);\n } else {\n this.applied.push({ batchId, commands: [command] });\n }\n while (this.applied.length > this.cap) this.applied.shift();\n this.undone = [];\n }\n\n canUndo() {\n return this.applied.length > 0;\n }\n\n canRedo() {\n return this.undone.length > 0;\n }\n\n listApplied() {\n const out: Command[] = [];\n for (const group of this.applied) out.push(...group.commands);\n return out;\n }\n\n listUndoGroups(): CommandGroupSnapshot[] {\n // Return top = next undo.\n return this.applied\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n listRedoGroups(): CommandGroupSnapshot[] {\n // Return top = next redo.\n return this.undone\n .slice()\n .reverse()\n .map((g) => ({ batchId: g.batchId, commands: g.commands.slice() }));\n }\n\n undo() {\n const group = this.applied.pop();\n if (group) this.undone.push(group);\n return group?.commands ?? null;\n }\n\n redo() {\n const group = this.undone.pop();\n if (group) this.applied.push(group);\n return group?.commands ?? null;\n }\n\n clear() {\n this.applied = [];\n this.undone = [];\n }\n}\n","import type { DataModel } from \"./dataModel\";\nimport type { CellAddress } from \"./types\";\n\nexport type ResolvedCellTarget = {\n rowId: string;\n colKey: string;\n rowIndex: number;\n colIndex: number;\n};\n\nexport function resolveCellAddress(dataModel: DataModel, address: CellAddress): ResolvedCellTarget | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n\n const resolveByIndex = (rowIndex: number, colIndex: number): ResolvedCellTarget | null => {\n if (!Number.isInteger(rowIndex) || !Number.isInteger(colIndex)) return null;\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n if (colIndex < 0 || colIndex >= schema.columns.length) return null;\n const row = rows[rowIndex]!;\n const col = schema.columns[colIndex]!;\n return { rowId: row.id, colKey: col.key, rowIndex, colIndex };\n };\n\n const resolveByKeys = (rowId: string, colKey: string): ResolvedCellTarget | null => {\n const rowIndex = dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (colIndex < 0) return null;\n return { rowId, colKey, rowIndex, colIndex };\n };\n\n if (\"rowId\" in address && \"colKey\" in address) {\n return resolveByKeys(address.rowId, address.colKey);\n }\n if (\"rowIndex\" in address && \"colIndex\" in address) {\n return resolveByIndex(address.rowIndex, address.colIndex);\n }\n if (\"rowId\" in address && \"colIndex\" in address) {\n const rowIndex = dataModel.getRowIndex(address.rowId);\n if (rowIndex < 0) return null;\n return resolveByIndex(rowIndex, address.colIndex);\n }\n if (\"rowIndex\" in address && \"colKey\" in address) {\n const colIndex = schema.columns.findIndex((c) => c.key === address.colKey);\n if (colIndex < 0) return null;\n return resolveByIndex(address.rowIndex, colIndex);\n }\n\n return null;\n}\n","import type { LockMode, ServerAdapter, UserInfo } from './types';\n\nexport class LockManager {\n private lockedRows = new Set<string>();\n private mode: LockMode = 'none';\n private server?: ServerAdapter;\n private user?: UserInfo;\n\n constructor(mode: LockMode, server?: ServerAdapter, user?: UserInfo) {\n this.mode = mode;\n this.server = server;\n this.user = user;\n }\n\n setMode(mode: LockMode) {\n this.mode = mode;\n }\n\n setUser(user?: UserInfo) {\n this.user = user;\n }\n\n async selectRow(rowId: string) {\n if (this.mode !== 'row') return;\n if (this.lockedRows.has(rowId)) return;\n this.lockedRows.add(rowId);\n if (this.server && this.user) {\n try {\n await this.server.lockRow(rowId, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('lockRow failed', e);\n }\n }\n }\n\n async unlockOnMove(currentRowId?: string) {\n if (this.mode !== 'row') return;\n if (!currentRowId) return;\n await this.unlockRows([currentRowId]);\n }\n\n async unlockOnCommit(keepRowId?: string) {\n if (this.mode !== 'row') return;\n const toUnlock: string[] = [];\n for (const id of this.lockedRows) {\n if (id !== keepRowId) toUnlock.push(id);\n }\n if (toUnlock.length) {\n await this.unlockRows(toUnlock);\n }\n }\n\n async unlockRows(rowIds: string[]) {\n for (const id of rowIds) this.lockedRows.delete(id);\n if (this.server && this.user) {\n try {\n await this.server.unlockRows(rowIds, this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn('unlockRows failed', e);\n }\n }\n }\n\n getLockedRows() {\n return new Set(this.lockedRows);\n }\n}\n","const g = (e) => e.trim().normalize(\"NFKC\").toLowerCase().replace(/\\s+/g, \" \"), V = (e) => {\n const t = [];\n if (e)\n for (const n of e) {\n const s = n.trim();\n !s || t.includes(s) || t.push(s);\n }\n return t.length === 0 ? t.push(\"en\") : t.includes(\"en\") || t.push(\"en\"), t;\n}, J = (e, t) => {\n const n = e.items.indexOf(t);\n if (n !== -1)\n return n;\n if (!e.aliases)\n return null;\n const s = e.aliases[t];\n if (!s)\n return null;\n const r = e.items.indexOf(s);\n return r === -1 ? null : r;\n}, R = (e, t) => {\n const n = g(t);\n if (g(e.id).includes(n))\n return !0;\n for (const s of e.items)\n if (g(s).includes(n))\n return !0;\n return e.aliases ? Object.keys(e.aliases).some(\n (s) => g(s).includes(n)\n ) : !1;\n}, D = (e, t) => {\n if (e.langs.length === 0)\n return 0;\n let n = Number.POSITIVE_INFINITY;\n for (const s of e.langs) {\n const r = t.indexOf(s);\n r !== -1 && r < n && (n = r);\n }\n return n;\n}, K = (e, t) => !e.langs || e.langs.length === 0 ? !0 : e.langs.some((n) => t.includes(n));\nclass z {\n constructor(t) {\n this.lists = [], this.matchers = [], this.langs = V(t?.langs);\n }\n register(t) {\n const n = this.lists.findIndex((s) => s.id === t.id);\n n === -1 ? this.lists.push(t) : this.lists[n] = t;\n }\n registerMatch(t) {\n const n = this.matchers.findIndex((s) => s.id === t.id);\n n === -1 ? this.matchers.push(t) : this.matchers[n] = t;\n }\n unregister(t) {\n this.lists = this.lists.filter((n) => n.id !== t), this.matchers = this.matchers.filter((n) => n.id !== t);\n }\n list(t) {\n let n = [...this.lists];\n if (t?.enabledIds && t.enabledIds.length > 0) {\n const r = new Set(t.enabledIds);\n n = n.filter((o) => r.has(o.id));\n }\n const s = t?.queryText;\n return s && (n = n.filter((r) => R(r, s))), n;\n }\n match(t, n) {\n if (t.length === 0)\n return null;\n let s = null, r = Number.NEGATIVE_INFINITY;\n const o = n?.enabledIds ? new Set(n.enabledIds) : null;\n for (const i of this.matchers) {\n if (o && !o.has(i.id) || !K(i, this.langs))\n continue;\n const a = i.match(t);\n if (!a)\n continue;\n const l = a.score;\n Number.isFinite(l) && l > r && (r = l, s = {\n kind: \"matcher\",\n matcher: i,\n step: a.step ?? 1,\n state: a.state\n });\n }\n const u = this.list(n).map((i) => ({ list: i, rank: D(i, this.langs) })).filter((i) => Number.isFinite(i.rank)).sort((i, a) => i.rank - a.rank);\n for (const { list: i, rank: a } of u) {\n const l = [];\n let c = !1;\n for (const P of t) {\n const k = J(i, P);\n if (k === null) {\n c = !0;\n break;\n }\n l.push(k);\n }\n if (c)\n continue;\n const f = this.inferStep(i, l);\n if (f === null)\n continue;\n const d = 10 - a;\n d > r && (r = d, s = {\n kind: \"list\",\n list: i,\n startIndex: l[l.length - 1] ?? 0,\n step: f\n });\n }\n return s;\n }\n inferStep(t, n) {\n if (n.length < 2)\n return 1;\n const s = t.items.length, r = this.stepBetween(t.mode, s, n[0], n[1]);\n if (r === null)\n return null;\n for (let o = 2; o < n.length; o += 1) {\n const u = this.nextIndex(t.mode, s, n[o - 1], r);\n if (u === null || u !== n[o])\n return null;\n }\n return r;\n }\n stepBetween(t, n, s, r) {\n if (t === \"cycle\")\n return (r - s + n) % n;\n const o = r - s;\n return o < 0 ? null : o;\n }\n nextIndex(t, n, s, r) {\n if (t === \"cycle\")\n return (s + r) % n;\n const o = s + r;\n return o >= n ? null : o;\n }\n}\nconst B = {\n id: \"weekdays-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"]\n}, G = {\n id: \"weekdays-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"],\n aliases: {\n Tues: \"Tue\",\n Thur: \"Thu\",\n Thurs: \"Thu\"\n }\n}, H = {\n id: \"weekdays-ja-long\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜日\", \"火曜日\", \"水曜日\", \"木曜日\", \"金曜日\", \"土曜日\", \"日曜日\"]\n}, U = {\n id: \"weekdays-ja-short\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月曜\", \"火曜\", \"水曜\", \"木曜\", \"金曜\", \"土曜\", \"日曜\"]\n}, Y = {\n id: \"weekdays-ja-single\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"月\", \"火\", \"水\", \"木\", \"金\", \"土\", \"日\"]\n}, q = {\n id: \"months-en-long\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\"\n ]\n}, X = {\n id: \"months-en-short\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n aliases: {\n Sept: \"Sep\"\n }\n}, Q = {\n id: \"months-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"1月\", \"2月\", \"3月\", \"4月\", \"5月\", \"6月\", \"7月\", \"8月\", \"9月\", \"10月\", \"11月\", \"12月\"]\n}, Z = {\n id: \"months-ja-traditional\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"睦月\", \"如月\", \"弥生\", \"卯月\", \"皐月\", \"水無月\", \"文月\", \"葉月\", \"長月\", \"神無月\", \"霜月\", \"師走\"]\n}, _ = {\n id: \"quarters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"]\n}, ee = {\n id: \"quarters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"第1四半期\", \"第2四半期\", \"第3四半期\", \"第4四半期\"]\n}, te = {\n id: \"zodiac-animals-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"子\", \"丑\", \"寅\", \"卯\", \"辰\", \"巳\", \"午\", \"未\", \"申\", \"酉\", \"戌\", \"亥\"]\n}, ne = {\n id: \"zodiac-signs-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Aries\",\n \"Taurus\",\n \"Gemini\",\n \"Cancer\",\n \"Leo\",\n \"Virgo\",\n \"Libra\",\n \"Scorpio\",\n \"Sagittarius\",\n \"Capricorn\",\n \"Aquarius\",\n \"Pisces\"\n ]\n}, se = {\n id: \"zodiac-signs-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"牡羊座\", \"牡牛座\", \"双子座\", \"蟹座\", \"獅子座\", \"乙女座\", \"天秤座\", \"蠍座\", \"射手座\", \"山羊座\", \"水瓶座\", \"魚座\"],\n aliases: {\n さそり座: \"蠍座\"\n }\n}, re = {\n id: \"directions-16-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"North\",\n \"North-Northeast\",\n \"Northeast\",\n \"East-Northeast\",\n \"East\",\n \"East-Southeast\",\n \"Southeast\",\n \"South-Southeast\",\n \"South\",\n \"South-Southwest\",\n \"Southwest\",\n \"West-Southwest\",\n \"West\",\n \"West-Northwest\",\n \"Northwest\",\n \"North-Northwest\"\n ]\n}, ie = {\n id: \"directions-16-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"北\",\n \"北北東\",\n \"北東\",\n \"東北東\",\n \"東\",\n \"東南東\",\n \"南東\",\n \"南南東\",\n \"南\",\n \"南南西\",\n \"南西\",\n \"西南西\",\n \"西\",\n \"西北西\",\n \"北西\",\n \"北北西\"\n ]\n}, oe = {\n id: \"ampm-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"AM\", \"PM\"],\n aliases: {\n \"A.M.\": \"AM\",\n \"P.M.\": \"PM\"\n }\n}, ae = {\n id: \"ampm-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"午前\", \"午後\"]\n}, ue = {\n id: \"seasons-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Spring\", \"Summer\", \"Autumn\", \"Winter\"],\n aliases: {\n Fall: \"Autumn\"\n }\n}, le = {\n id: \"seasons-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"春\", \"夏\", \"秋\", \"冬\"]\n}, ce = {\n id: \"solfege-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"ド\", \"レ\", \"ミ\", \"ファ\", \"ソ\", \"ラ\", \"シ\"]\n}, fe = {\n id: \"solfege-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\"Do\", \"Re\", \"Mi\", \"Fa\", \"Sol\", \"La\", \"Ti\"],\n aliases: {\n So: \"Sol\",\n Si: \"Ti\"\n }\n}, de = {\n id: \"greek-letters-en\",\n mode: \"cycle\",\n langs: [\"en\"],\n items: [\n \"Alpha\",\n \"Beta\",\n \"Gamma\",\n \"Delta\",\n \"Epsilon\",\n \"Zeta\",\n \"Eta\",\n \"Theta\",\n \"Iota\",\n \"Kappa\",\n \"Lambda\",\n \"Mu\",\n \"Nu\",\n \"Xi\",\n \"Omicron\",\n \"Pi\",\n \"Rho\",\n \"Sigma\",\n \"Tau\",\n \"Upsilon\",\n \"Phi\",\n \"Chi\",\n \"Psi\",\n \"Omega\"\n ]\n}, me = {\n id: \"greek-letters-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\n \"アルファ\",\n \"ベータ\",\n \"ガンマ\",\n \"デルタ\",\n \"イプシロン\",\n \"ゼータ\",\n \"イータ\",\n \"シータ\",\n \"イオタ\",\n \"カッパ\",\n \"ラムダ\",\n \"ミュー\",\n \"ニュー\",\n \"クサイ\",\n \"オミクロン\",\n \"パイ\",\n \"ロー\",\n \"シグマ\",\n \"タウ\",\n \"ウプシロン\",\n \"ファイ\",\n \"カイ\",\n \"プサイ\",\n \"オメガ\"\n ]\n}, he = {\n id: \"greek-letters-symbols\",\n mode: \"cycle\",\n langs: [\"en\", \"ja\"],\n items: [\n \"α\",\n \"β\",\n \"γ\",\n \"δ\",\n \"ε\",\n \"ζ\",\n \"η\",\n \"θ\",\n \"ι\",\n \"κ\",\n \"λ\",\n \"μ\",\n \"ν\",\n \"ξ\",\n \"ο\",\n \"π\",\n \"ρ\",\n \"σ\",\n \"τ\",\n \"υ\",\n \"φ\",\n \"χ\",\n \"ψ\",\n \"ω\"\n ],\n aliases: {\n ς: \"σ\"\n }\n}, ge = {\n id: \"rokuyo-ja\",\n mode: \"cycle\",\n langs: [\"ja\"],\n items: [\"先勝\", \"友引\", \"先負\", \"仏滅\", \"大安\", \"赤口\"]\n}, pe = {\n id: \"heavenly-stems-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"甲\", \"乙\", \"丙\", \"丁\", \"戊\", \"己\", \"庚\", \"辛\", \"壬\", \"癸\"]\n}, xe = {\n id: \"planets-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\"Mercury\", \"Venus\", \"Earth\", \"Mars\", \"Jupiter\", \"Saturn\", \"Uranus\", \"Neptune\"]\n}, ye = {\n id: \"planets-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"水星\", \"金星\", \"地球\", \"火星\", \"木星\", \"土星\", \"天王星\", \"海王星\"]\n}, be = {\n id: \"kuji-in-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"臨\", \"兵\", \"闘\", \"者\", \"皆\", \"陣\", \"烈\", \"在\", \"前\"]\n}, Se = {\n id: \"eight-virtues-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\"仁\", \"義\", \"礼\", \"智\", \"忠\", \"信\", \"孝\", \"悌\"]\n}, je = {\n id: \"element-symbols\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"H\",\n \"He\",\n \"Li\",\n \"Be\",\n \"B\",\n \"C\",\n \"N\",\n \"O\",\n \"F\",\n \"Ne\",\n \"Na\",\n \"Mg\",\n \"Al\",\n \"Si\",\n \"P\",\n \"S\",\n \"Cl\",\n \"Ar\",\n \"K\",\n \"Ca\",\n \"Sc\",\n \"Ti\",\n \"V\",\n \"Cr\",\n \"Mn\",\n \"Fe\",\n \"Co\",\n \"Ni\",\n \"Cu\",\n \"Zn\",\n \"Ga\",\n \"Ge\",\n \"As\",\n \"Se\",\n \"Br\",\n \"Kr\",\n \"Rb\",\n \"Sr\",\n \"Y\",\n \"Zr\",\n \"Nb\",\n \"Mo\",\n \"Tc\",\n \"Ru\",\n \"Rh\",\n \"Pd\",\n \"Ag\",\n \"Cd\",\n \"In\",\n \"Sn\",\n \"Sb\",\n \"Te\",\n \"I\",\n \"Xe\",\n \"Cs\",\n \"Ba\",\n \"La\",\n \"Ce\",\n \"Pr\",\n \"Nd\",\n \"Pm\",\n \"Sm\",\n \"Eu\",\n \"Gd\",\n \"Tb\",\n \"Dy\",\n \"Ho\",\n \"Er\",\n \"Tm\",\n \"Yb\",\n \"Lu\",\n \"Hf\",\n \"Ta\",\n \"W\",\n \"Re\",\n \"Os\",\n \"Ir\",\n \"Pt\",\n \"Au\",\n \"Hg\",\n \"Tl\",\n \"Pb\",\n \"Bi\",\n \"Po\",\n \"At\",\n \"Rn\",\n \"Fr\",\n \"Ra\",\n \"Ac\",\n \"Th\",\n \"Pa\",\n \"U\",\n \"Np\",\n \"Pu\",\n \"Am\",\n \"Cm\",\n \"Bk\",\n \"Cf\",\n \"Es\",\n \"Fm\",\n \"Md\",\n \"No\",\n \"Lr\",\n \"Rf\",\n \"Db\",\n \"Sg\",\n \"Bh\",\n \"Hs\",\n \"Mt\",\n \"Ds\",\n \"Rg\",\n \"Cn\",\n \"Nh\",\n \"Fl\",\n \"Mc\",\n \"Lv\",\n \"Ts\",\n \"Og\"\n ]\n}, ke = {\n id: \"element-names-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"水素\",\n \"ヘリウム\",\n \"リチウム\",\n \"ベリリウム\",\n \"ホウ素\",\n \"炭素\",\n \"窒素\",\n \"酸素\",\n \"フッ素\",\n \"ネオン\",\n \"ナトリウム\",\n \"マグネシウム\",\n \"アルミニウム\",\n \"ケイ素\",\n \"リン\",\n \"硫黄\",\n \"塩素\",\n \"アルゴン\",\n \"カリウム\",\n \"カルシウム\",\n \"スカンジウム\",\n \"チタン\",\n \"バナジウム\",\n \"クロム\",\n \"マンガン\",\n \"鉄\",\n \"コバルト\",\n \"ニッケル\",\n \"銅\",\n \"亜鉛\",\n \"ガリウム\",\n \"ゲルマニウム\",\n \"ヒ素\",\n \"セレン\",\n \"臭素\",\n \"クリプトン\",\n \"ルビジウム\",\n \"ストロンチウム\",\n \"イットリウム\",\n \"ジルコニウム\",\n \"ニオブ\",\n \"モリブデン\",\n \"テクネチウム\",\n \"ルテニウム\",\n \"ロジウム\",\n \"パラジウム\",\n \"銀\",\n \"カドミウム\",\n \"インジウム\",\n \"スズ\",\n \"アンチモン\",\n \"テルル\",\n \"ヨウ素\",\n \"キセノン\",\n \"セシウム\",\n \"バリウム\",\n \"ランタン\",\n \"セリウム\",\n \"プラセオジム\",\n \"ネオジム\",\n \"プロメチウム\",\n \"サマリウム\",\n \"ユウロピウム\",\n \"ガドリニウム\",\n \"テルビウム\",\n \"ジスプロシウム\",\n \"ホルミウム\",\n \"エルビウム\",\n \"ツリウム\",\n \"イッテルビウム\",\n \"ルテチウム\",\n \"ハフニウム\",\n \"タンタル\",\n \"タングステン\",\n \"レニウム\",\n \"オスミウム\",\n \"イリジウム\",\n \"白金\",\n \"金\",\n \"水銀\",\n \"タリウム\",\n \"鉛\",\n \"ビスマス\",\n \"ポロニウム\",\n \"アスタチン\",\n \"ラドン\",\n \"フランシウム\",\n \"ラジウム\",\n \"アクチニウム\",\n \"トリウム\",\n \"プロトアクチニウム\",\n \"ウラン\",\n \"ネプツニウム\",\n \"プルトニウム\",\n \"アメリシウム\",\n \"キュリウム\",\n \"バークリウム\",\n \"カリホルニウム\",\n \"アインスタイニウム\",\n \"フェルミウム\",\n \"メンデレビウム\",\n \"ノーベリウム\",\n \"ローレンシウム\",\n \"ラザホージウム\",\n \"ドブニウム\",\n \"シーボーギウム\",\n \"ボーリウム\",\n \"ハッシウム\",\n \"マイトネリウム\",\n \"ダームスタチウム\",\n \"レントゲニウム\",\n \"コペルニシウム\",\n \"ニホニウム\",\n \"フレロビウム\",\n \"モスコビウム\",\n \"リバモリウム\",\n \"テネシン\",\n \"オガネソン\"\n ]\n}, we = {\n id: \"shoguns-kamakura-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"源頼朝\",\n \"源頼家\",\n \"源実朝\",\n \"九条頼経\",\n \"九条頼嗣\",\n \"宗尊親王\",\n \"惟康親王\",\n \"久明親王\",\n \"守邦親王\"\n ]\n}, Ne = {\n id: \"shoguns-ashikaga-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"足利尊氏\",\n \"足利義詮\",\n \"足利義満\",\n \"足利義持\",\n \"足利義量\",\n \"足利義教\",\n \"足利義勝\",\n \"足利義政\",\n \"足利義尚\",\n \"足利義稙\",\n \"足利義澄\",\n \"足利義晴\",\n \"足利義輝\",\n \"足利義栄\",\n \"足利義昭\"\n ]\n}, Ie = {\n id: \"shoguns-ashikaga-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"尊氏\",\n \"義詮\",\n \"義満\",\n \"義持\",\n \"義量\",\n \"義教\",\n \"義勝\",\n \"義政\",\n \"義尚\",\n \"義稙\",\n \"義澄\",\n \"義晴\",\n \"義輝\",\n \"義栄\",\n \"義昭\"\n ]\n}, Te = {\n id: \"shoguns-tokugawa-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"徳川家康\",\n \"徳川秀忠\",\n \"徳川家光\",\n \"徳川家綱\",\n \"徳川綱吉\",\n \"徳川家宣\",\n \"徳川家継\",\n \"徳川吉宗\",\n \"徳川家重\",\n \"徳川家治\",\n \"徳川家斉\",\n \"徳川家慶\",\n \"徳川家定\",\n \"徳川家茂\",\n \"徳川慶喜\"\n ]\n}, Me = {\n id: \"shoguns-tokugawa-given-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: [\n \"家康\",\n \"秀忠\",\n \"家光\",\n \"家綱\",\n \"綱吉\",\n \"家宣\",\n \"家継\",\n \"吉宗\",\n \"家重\",\n \"家治\",\n \"家斉\",\n \"家慶\",\n \"家定\",\n \"家茂\",\n \"慶喜\"\n ]\n}, T = [\n \"北海道\",\n \"青森県\",\n \"岩手県\",\n \"宮城県\",\n \"秋田県\",\n \"山形県\",\n \"福島県\",\n \"茨城県\",\n \"栃木県\",\n \"群馬県\",\n \"埼玉県\",\n \"千葉県\",\n \"東京都\",\n \"神奈川県\",\n \"新潟県\",\n \"富山県\",\n \"石川県\",\n \"福井県\",\n \"山梨県\",\n \"長野県\",\n \"岐阜県\",\n \"静岡県\",\n \"愛知県\",\n \"三重県\",\n \"滋賀県\",\n \"京都府\",\n \"大阪府\",\n \"兵庫県\",\n \"奈良県\",\n \"和歌山県\",\n \"鳥取県\",\n \"島根県\",\n \"岡山県\",\n \"広島県\",\n \"山口県\",\n \"徳島県\",\n \"香川県\",\n \"愛媛県\",\n \"高知県\",\n \"福岡県\",\n \"佐賀県\",\n \"長崎県\",\n \"熊本県\",\n \"大分県\",\n \"宮崎県\",\n \"鹿児島県\",\n \"沖縄県\"\n], Ae = T.reduce(\n (e, t) => {\n if (t === \"北海道\")\n return e;\n if (/[都府県]$/.test(t)) {\n const n = t.slice(0, -1);\n e[n] = t;\n }\n return e;\n },\n {}\n), ve = {\n id: \"prefectures-ja\",\n mode: \"finite\",\n langs: [\"ja\"],\n items: T,\n aliases: Ae\n}, Le = {\n id: \"us-states-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"Alabama\",\n \"Alaska\",\n \"Arizona\",\n \"Arkansas\",\n \"California\",\n \"Colorado\",\n \"Connecticut\",\n \"Delaware\",\n \"Florida\",\n \"Georgia\",\n \"Hawaii\",\n \"Idaho\",\n \"Illinois\",\n \"Indiana\",\n \"Iowa\",\n \"Kansas\",\n \"Kentucky\",\n \"Louisiana\",\n \"Maine\",\n \"Maryland\",\n \"Massachusetts\",\n \"Michigan\",\n \"Minnesota\",\n \"Mississippi\",\n \"Missouri\",\n \"Montana\",\n \"Nebraska\",\n \"Nevada\",\n \"New Hampshire\",\n \"New Jersey\",\n \"New Mexico\",\n \"New York\",\n \"North Carolina\",\n \"North Dakota\",\n \"Ohio\",\n \"Oklahoma\",\n \"Oregon\",\n \"Pennsylvania\",\n \"Rhode Island\",\n \"South Carolina\",\n \"South Dakota\",\n \"Tennessee\",\n \"Texas\",\n \"Utah\",\n \"Vermont\",\n \"Virginia\",\n \"Washington\",\n \"West Virginia\",\n \"Wisconsin\",\n \"Wyoming\"\n ]\n}, Ee = {\n id: \"us-states-abbrev-en\",\n mode: \"finite\",\n langs: [\"en\"],\n items: [\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\"\n ]\n}, We = {\n id: \"windows-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Windows 1.0\",\n \"Windows 2.0\",\n \"Windows 2.1\",\n \"Windows 3.0\",\n \"Windows 3.1\",\n \"Windows 3.11\",\n \"Windows 95\",\n \"Windows 98\",\n \"Windows 98 SE\",\n \"Windows Me\",\n \"Windows XP\",\n \"Windows Vista\",\n \"Windows 7\",\n \"Windows 8\",\n \"Windows 8.1\",\n \"Windows 10\",\n \"Windows 11\"\n ]\n}, Ce = {\n id: \"macos-versions\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"Cheetah\",\n \"Puma\",\n \"Jaguar\",\n \"Panther\",\n \"Tiger\",\n \"Leopard\",\n \"Snow Leopard\",\n \"Lion\",\n \"Mountain Lion\",\n \"Mavericks\",\n \"Yosemite\",\n \"El Capitan\",\n \"Sierra\",\n \"High Sierra\",\n \"Mojave\",\n \"Catalina\",\n \"Big Sur\",\n \"Monterey\",\n \"Ventura\",\n \"Sonoma\",\n \"Sequoia\",\n \"Tahoe\"\n ]\n}, Oe = {\n id: \"debian-codenames\",\n mode: \"finite\",\n langs: [\"ja\", \"en\"],\n items: [\n \"buzz\",\n \"rex\",\n \"bo\",\n \"hamm\",\n \"slink\",\n \"potato\",\n \"woody\",\n \"sarge\",\n \"etch\",\n \"lenny\",\n \"squeeze\",\n \"wheezy\",\n \"jessie\",\n \"stretch\",\n \"buster\",\n \"bullseye\",\n \"bookworm\",\n \"trixie\"\n ]\n}, $e = [\n B,\n G,\n H,\n U,\n Y,\n q,\n X,\n Q,\n Z,\n _,\n ee,\n te,\n ne,\n se,\n re,\n ie,\n oe,\n ae,\n ue,\n le,\n ce,\n fe,\n de,\n me,\n he,\n ge,\n pe,\n xe,\n ye,\n be,\n Se,\n je,\n ke,\n we,\n Ne,\n Ie,\n Te,\n Me,\n ve,\n Le,\n Ee,\n We,\n Ce,\n Oe\n], p = (e) => {\n const t = e % 100;\n if (t >= 11 && t <= 13) return \"th\";\n const n = e % 10;\n return n === 1 ? \"st\" : n === 2 ? \"nd\" : n === 3 ? \"rd\" : \"th\";\n}, x = {\n 1: \"first\",\n 2: \"second\",\n 3: \"third\",\n 4: \"fourth\",\n 5: \"fifth\",\n 6: \"sixth\",\n 7: \"seventh\",\n 8: \"eighth\",\n 9: \"ninth\",\n 10: \"tenth\",\n 11: \"eleventh\",\n 12: \"twelfth\",\n 13: \"thirteenth\",\n 14: \"fourteenth\",\n 15: \"fifteenth\",\n 16: \"sixteenth\",\n 17: \"seventeenth\",\n 18: \"eighteenth\",\n 19: \"nineteenth\"\n}, y = {\n 20: \"twentieth\",\n 30: \"thirtieth\",\n 40: \"fortieth\",\n 50: \"fiftieth\",\n 60: \"sixtieth\",\n 70: \"seventieth\",\n 80: \"eightieth\",\n 90: \"ninetieth\"\n}, M = {\n 20: \"twenty\",\n 30: \"thirty\",\n 40: \"forty\",\n 50: \"fifty\",\n 60: \"sixty\",\n 70: \"seventy\",\n 80: \"eighty\",\n 90: \"ninety\"\n}, w = Object.fromEntries(\n Object.entries(x).map(([e, t]) => [t, Number(e)])\n), Fe = Object.fromEntries(\n Object.entries(y).map(([e, t]) => [t, Number(e)])\n), Pe = Object.fromEntries(\n Object.entries(M).map(([e, t]) => [t, Number(e)])\n), A = (e) => {\n const t = e.trim().toLowerCase();\n if (!t) return null;\n const n = w[t] ?? Fe[t];\n if (n) return n;\n const s = t.split(/[-\\s]+/);\n if (s.length !== 2) return null;\n const r = Pe[s[0] ?? \"\"], o = w[s[1] ?? \"\"];\n return !r || !o ? null : r + o;\n}, v = (e) => {\n if (!Number.isFinite(e) || e <= 0 || Math.floor(e) !== e) return null;\n if (e <= 19) return x[e] ?? null;\n if (e < 100) {\n if (y[e]) return y[e] ?? null;\n const t = Math.floor(e / 10) * 10, n = e % 10, s = M[t], r = x[n];\n return !s || !r ? null : `${s}-${r}`;\n }\n return null;\n}, N = (e) => {\n const t = /^(\\d+)(st|nd|rd|th)$/i.exec(e);\n if (t) {\n const s = Number(t[1]);\n if (!Number.isFinite(s) || s <= 0) return null;\n const r = t[2]?.toLowerCase();\n return p(s) !== r ? null : { value: s, format: \"numeric\" };\n }\n const n = A(e);\n return n !== null ? { value: n, format: \"word\" } : null;\n}, Ve = {\n id: \"ordinal-en\",\n langs: [\"en\"],\n match(e) {\n if (e.length < 2) return null;\n const t = e.map((o) => N(o));\n if (t.some((o) => o === null)) return null;\n const n = t[0].format;\n if (t.some((o) => o?.format !== n)) return null;\n const s = t.map((o) => o.value), r = s[1] - s[0];\n for (let o = 2; o < s.length; o += 1)\n if (s[o] - s[o - 1] !== r) return null;\n return { score: 80, step: r, state: { format: n } };\n },\n createIterator(e, t) {\n const n = N(e[e.length - 1] ?? \"\"), s = t.state?.format ?? \"numeric\";\n let r = n?.value ?? 0;\n return {\n next() {\n if (r += t.step, r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (s === \"word\") {\n const o = v(r);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n return { value: `${r}${p(r)}`, done: !1 };\n }\n };\n }\n}, Je = (e) => {\n for (const t of $e)\n e.register(t);\n}, Re = (e) => {\n e.registerMatch(Ve);\n}, De = (e) => {\n const t = e ?? [\"en\", \"ja\"], n = new z({ langs: t });\n return Je(n), Re(n), n;\n}, Ke = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n};\nclass m {\n constructor(...t) {\n const n = t;\n this.seed = n, this.kind = n.length === 1 ? \"copy\" : \"seed-repeat\", this.iterator = Ke(n);\n }\n static fromSeed(t, n, s) {\n const r = new m(...t);\n return r.kind = n, r.iterator = s, r;\n }\n next() {\n return this.iterator.next();\n }\n [Symbol.iterator]() {\n return this;\n }\n}\nconst L = 1e-9, ze = 100, Be = (e) => ({\n next() {\n return { value: e, done: !1 };\n }\n}), I = (e) => {\n let t = 0;\n return {\n next() {\n if (e.length === 0)\n return { value: void 0, done: !0 };\n const n = e[t % e.length];\n return t += 1, { value: n, done: !1 };\n }\n };\n}, Ge = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e + t * n, done: !1 };\n }\n };\n}, He = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: new Date(e.getTime() + t * n), done: !1 };\n }\n };\n}, Ue = (e, t) => {\n let n = 0;\n return {\n next() {\n return n += 1, { value: e * t ** n, done: !1 };\n }\n };\n}, Ye = (e, t) => {\n if (e.kind === \"matcher\")\n return e.matcher.createIterator(t, { step: e.step, state: e.state });\n const { list: n, startIndex: s, step: r } = e, o = n.items.length;\n let u = s;\n return {\n next() {\n if (n.mode === \"finite\") {\n const i = u + r;\n return i >= o ? { value: void 0, done: !0 } : (u = i, { value: n.items[u], done: !1 });\n }\n return u = (u + r) % o, { value: n.items[u], done: !1 };\n }\n };\n}, qe = (e) => e.every((t) => typeof t == \"number\" && Number.isFinite(t)), Xe = (e) => e.every((t) => t instanceof Date && !Number.isNaN(t.getTime())), Qe = (e) => e.every((t) => typeof t == \"string\"), Ze = (e) => {\n const t = /^(.*?)(-?\\d+)([^0-9]*)$/.exec(e);\n if (!t)\n return null;\n const n = t[1] ?? \"\", s = t[2] ?? \"\", r = t[3] ?? \"\", o = Number(s);\n if (!Number.isFinite(o))\n return null;\n const u = s.replace(\"-\", \"\").length;\n return { prefix: n, num: o, width: u, suffix: r };\n}, _e = (e) => {\n const t = /^(.*?)(\\d+)(st|nd|rd|th)([^0-9]*)$/i.exec(e);\n if (t) {\n const r = Number(t[2]);\n if (!Number.isFinite(r) || r <= 0) return null;\n const o = t[3]?.toLowerCase();\n return p(r) !== o ? null : {\n prefix: t[1] ?? \"\",\n num: r,\n suffix: t[4] ?? \"\",\n format: \"numeric\"\n };\n }\n const n = /^(.*?)([A-Za-z-]+)([^A-Za-z]*)$/.exec(e);\n if (!n) return null;\n const s = A(n[2] ?? \"\");\n return s === null ? null : {\n prefix: n[1] ?? \"\",\n num: s,\n suffix: n[3] ?? \"\",\n format: \"word\"\n };\n}, et = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s;\n if (r <= 0 || !Number.isFinite(r))\n return { value: void 0, done: !0 };\n if (e.format === \"word\") {\n const o = v(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n return {\n value: `${e.prefix}${r}${p(r)}${e.suffix}`,\n done: !1\n };\n }\n };\n}, tt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = r < 0 ? \"-\" : \"\", u = Math.abs(r).toString().padStart(e.width, \"0\");\n return { value: `${e.prefix}${o}${u}${e.suffix}`, done: !1 };\n }\n };\n}, E = [\n [\"C\", 100],\n [\"XC\", 90],\n [\"L\", 50],\n [\"XL\", 40],\n [\"X\", 10],\n [\"IX\", 9],\n [\"V\", 5],\n [\"IV\", 4],\n [\"I\", 1]\n], j = (e) => {\n if (e < 1 || e > ze)\n return null;\n let t = e, n = \"\";\n for (const [s, r] of E)\n for (; t >= r; )\n n += s, t -= r;\n return n;\n}, W = (e) => {\n if (e.length === 0 || e !== e.toUpperCase())\n return null;\n let t = e, n = 0;\n for (const [r, o] of E)\n for (; t.startsWith(r); )\n n += o, t = t.slice(r.length);\n if (t.length > 0)\n return null;\n const s = j(n);\n return !s || s !== e ? null : n;\n}, nt = (e, t) => {\n let n = 0;\n return {\n next() {\n n += 1;\n const s = e + t * n, r = j(s);\n return r ? { value: r, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, st = (e) => new RegExp(\"\\\\p{White_Space}\", \"u\").test(e) ? \"space\" : new RegExp(\"\\\\p{P}\", \"u\").test(e) ? \"punct\" : new RegExp(\"\\\\p{S}\", \"u\").test(e) ? \"symbol\" : new RegExp(\"\\\\p{Script=Latin}\", \"u\").test(e) ? \"latin\" : new RegExp(\"\\\\p{Script=Han}\", \"u\").test(e) ? \"han\" : new RegExp(\"\\\\p{Script=Hiragana}\", \"u\").test(e) ? \"hiragana\" : new RegExp(\"\\\\p{Script=Katakana}\", \"u\").test(e) ? \"katakana\" : new RegExp(\"\\\\p{N}\", \"u\").test(e) ? \"number\" : \"other\", rt = (e) => {\n const t = [];\n let n = \"\", s = null;\n for (const r of e) {\n const o = st(r);\n if (s === o) {\n n += r;\n continue;\n }\n s !== null && t.push({ value: n, group: s }), n = r, s = o;\n }\n return s !== null && t.push({ value: n, group: s }), t;\n}, it = (e) => {\n const t = rt(e), n = t.map((i, a) => ({ index: a, num: W(i.value) })).filter((i) => i.num !== null);\n if (n.length !== 1)\n return null;\n const s = n[0].index, r = n[0].num, o = t.slice(0, s).map((i) => i.value).join(\"\"), u = t.slice(s + 1).map((i) => i.value).join(\"\");\n return { prefix: o, num: r, suffix: u };\n}, ot = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = j(r);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, b = {\n 一: 1,\n 二: 2,\n 三: 3,\n 四: 4,\n 五: 5,\n 六: 6,\n 七: 7,\n 八: 8,\n 九: 9\n}, S = {\n 壱: 1,\n 弐: 2,\n 参: 3,\n 肆: 4,\n 伍: 5,\n 陸: 6,\n 柒: 7,\n 捌: 8,\n 玖: 9\n}, C = {\n 十: 10,\n 拾: 10,\n 百: 100,\n 佰: 100,\n 千: 1e3,\n 仟: 1e3\n}, O = {\n 万: 1e4,\n 萬: 1e4\n}, at = /* @__PURE__ */ new Set([\n ...Object.keys(b),\n ...Object.keys(S),\n ...Object.keys(C),\n ...Object.keys(O)\n]), ut = (e) => at.has(e), lt = (e) => /[壱弐参肆伍陸柒捌玖拾萬佰仟]/.test(e) ? \"traditional\" : \"modern\", $ = (e) => {\n if (!e)\n return null;\n const t = lt(e);\n if (e.includes(\"万\") || e.includes(\"萬\")) {\n const i = /^([一二三四五六七八九壱弐参肆伍陸柒捌玖])?(万|萬)$/.exec(e);\n if (!i)\n return null;\n const a = i[1];\n return a ? (b[a] ?? S[a]) !== 1 ? null : { num: 1e4, style: t } : { num: 1e4, style: t };\n }\n let s = 0, r = 0, o = Number.POSITIVE_INFINITY, u = !1;\n for (const i of e) {\n const a = b[i] ?? S[i];\n if (a) {\n if (u)\n return null;\n r = a, u = !0;\n continue;\n }\n const l = C[i];\n if (l) {\n if (l >= o)\n return null;\n r === 0 && (r = 1), s += r * l, r = 0, o = l, u = !1;\n continue;\n }\n return O[i], null;\n }\n return s += r, s <= 0 || s > 1e4 ? null : { num: s, style: t };\n}, ct = (e) => {\n const t = [];\n let n = \"\", s = 0, r = 0;\n for (const l of e)\n ut(l) ? (n || (s = r), n += l) : n && (t.push({ start: s, end: r, text: n }), n = \"\"), r += l.length;\n n && t.push({ start: s, end: r, text: n });\n const o = t.map((l) => ({ run: l, parsed: $(l.text) })).filter((l) => l.parsed !== null);\n if (o.length !== 1)\n return null;\n const u = o[0], i = e.slice(0, u.run.start), a = e.slice(u.run.end);\n return {\n prefix: i,\n num: u.parsed.num,\n suffix: a,\n style: u.parsed.style\n };\n}, F = (e, t) => {\n if (!Number.isFinite(e) || e <= 0 || e > 1e4)\n return null;\n const n = t === \"traditional\" ? [\"\", \"壱\", \"弐\", \"参\", \"肆\", \"伍\", \"陸\", \"柒\", \"捌\", \"玖\"] : [\"\", \"一\", \"二\", \"三\", \"四\", \"五\", \"六\", \"七\", \"八\", \"九\"], s = t === \"traditional\" ? \"拾\" : \"十\", r = t === \"traditional\" ? \"萬\" : \"万\";\n if (e === 1e4)\n return `${n[1]}${r}`;\n let o = e, u = \"\";\n const i = Math.floor(o / 1e3);\n i > 0 && (i > 1 && (u += n[i]), u += \"千\", o %= 1e3);\n const a = Math.floor(o / 100);\n a > 0 && (a > 1 && (u += n[a]), u += \"百\", o %= 100);\n const l = Math.floor(o / 10);\n return l > 0 && (l > 1 && (u += n[l]), u += s, o %= 10), o > 0 && (u += n[o]), u || null;\n}, ft = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = e + t * s, o = F(r, n);\n return o ? { value: o, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, dt = (e, t, n) => {\n let s = 0;\n return {\n next() {\n s += 1;\n const r = t + n * s, o = F(r, e.style);\n return o ? { value: `${e.prefix}${o}${e.suffix}`, done: !1 } : { value: void 0, done: !0 };\n }\n };\n}, h = (e) => {\n if (e.length < 2)\n return null;\n const t = e[1] - e[0];\n for (let n = 2; n < e.length; n += 1)\n if (Math.abs(e[n] - e[n - 1] - t) > L)\n return null;\n return t;\n}, mt = (e) => {\n if (e.length < 2 || e[0] === 0)\n return null;\n const t = e[1] / e[0];\n for (let n = 2; n < e.length; n += 1)\n if (e[n - 1] === 0 || Math.abs(e[n] / e[n - 1] - t) > L)\n return null;\n return t;\n}, ht = (e) => {\n const t = e.map((i) => _e(i));\n if (t.every((i) => i !== null)) {\n const i = t, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.format === a.format\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: et(\n { prefix: a.prefix, suffix: a.suffix, format: a.format },\n d.num,\n f\n )\n };\n }\n }\n }\n const n = e.map((i) => Ze(i));\n if (n.every(Boolean)) {\n const i = n[0], a = n[n.length - 1];\n if (n.every(\n (c) => c?.prefix === i.prefix && c?.suffix === i.suffix\n )) {\n const c = n.map((d) => d?.num ?? 0), f = h(c);\n if (f !== null)\n return {\n kind: \"arithmetic\",\n iterator: tt(\n { prefix: a.prefix, suffix: a.suffix, width: a.width },\n a.num,\n f\n )\n };\n }\n }\n const s = e.map((i) => W(i));\n if (s.every((i) => i !== null)) {\n const i = s, a = h(i);\n if (a !== null) {\n const l = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: nt(l, a)\n };\n }\n }\n const r = e.map((i) => $(i));\n if (r.every((i) => i !== null)) {\n const i = r, a = i[0].style;\n if (i.every((l) => l.style === a)) {\n const l = i.map((f) => f.num), c = h(l);\n if (c !== null) {\n const f = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ft(f.num, c, f.style)\n };\n }\n }\n }\n const o = e.map((i) => it(i));\n if (o.every((i) => i !== null)) {\n const i = o, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = c[c.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: ot(\n { prefix: a.prefix, suffix: a.suffix },\n d,\n f\n )\n };\n }\n }\n }\n const u = e.map((i) => ct(i));\n if (u.every((i) => i !== null)) {\n const i = u, a = i[0];\n if (i.every(\n (c) => c.prefix === a.prefix && c.suffix === a.suffix && c.style === a.style\n )) {\n const c = i.map((d) => d.num), f = h(c);\n if (f !== null) {\n const d = i[i.length - 1];\n return {\n kind: \"arithmetic\",\n iterator: dt(\n { prefix: a.prefix, suffix: a.suffix, style: a.style },\n d.num,\n f\n )\n };\n }\n }\n }\n return null;\n}, gt = (e, t) => {\n const n = t.match(e);\n return n ? {\n kind: \"list\",\n iterator: Ye(n, e)\n } : null;\n};\nfunction pt(e, t) {\n const n = t?.registry ?? De();\n if (e.length === 0)\n return m.fromSeed(e, \"seed-repeat\", I(e));\n if (e.length === 1)\n return m.fromSeed(e, \"copy\", Be(e[0]));\n if (Qe(e)) {\n const s = gt(e, n);\n if (s)\n return m.fromSeed(e, s.kind, s.iterator);\n const r = ht(e);\n if (r)\n return m.fromSeed(e, r.kind, r.iterator);\n }\n if (qe(e)) {\n const s = h(e);\n if (s !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n Ge(e[e.length - 1], s)\n );\n const r = mt(e);\n if (r !== null)\n return m.fromSeed(\n e,\n \"geometric\",\n Ue(e[e.length - 1], r)\n );\n }\n if (Xe(e)) {\n const s = e.map((o) => o.getTime()), r = h(s);\n if (r !== null)\n return m.fromSeed(\n e,\n \"arithmetic\",\n He(e[e.length - 1], r)\n );\n }\n return m.fromSeed(e, \"seed-repeat\", I(e));\n}\nexport {\n m as Sequence,\n z as SequenceRegistry,\n De as createBuiltInRegistry,\n v as formatEnglishOrdinalWord,\n pt as inferSequence,\n p as ordinalSuffix,\n A as parseEnglishOrdinalWord,\n Je as registerBuiltInLists,\n Re as registerBuiltInMatchers\n};\n//# sourceMappingURL=index.js.map\n","import type { DataModel } from \"./dataModel\";\nimport type { EditMode, SelectionRange } from \"./types\";\nimport { createBuiltInRegistry, inferSequence } from \"@extable/sequence\";\n\nexport type FillHandleMode = 'copy' | 'sequence';\n\nexport interface FillHandleSource {\n colKey: string;\n colIndex: number;\n startRowIndex: number;\n endRowIndex: number;\n mode: FillHandleMode;\n}\n\nfunction normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol)\n };\n}\n\nfunction coerceToTime(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const s = value.trim();\n if (/^\\d{1,2}:\\d{2}(:\\d{2}(\\.\\d{1,3})?)?$/.test(s)) {\n const d = new Date(`1970-01-01T${s}`);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(s);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction coerceToDate(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'number' && Number.isFinite(value)) return new Date(value);\n if (typeof value === 'string') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nexport function getFillHandleSource(dataModel: DataModel, ranges: SelectionRange[]): FillHandleSource | null {\n if (ranges.length !== 1) return null;\n const range = normalizeRange(ranges[0]!);\n if (range.kind !== 'cells') return null;\n const width = range.endCol - range.startCol + 1;\n const height = range.endRow - range.startRow + 1;\n if (width !== 1) return null;\n if (height < 1) return null;\n\n const schema = dataModel.getSchema();\n const col = schema.columns[range.startCol];\n if (!col) return null;\n\n if (height === 1) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'copy'\n };\n }\n\n if (col.type === 'boolean') {\n return null;\n }\n\n if (\n col.type === 'number' ||\n col.type === 'date' ||\n col.type === 'time' ||\n col.type === 'datetime' ||\n col.type === 'string'\n ) {\n return {\n colKey: col.key,\n colIndex: range.startCol,\n startRowIndex: range.startRow,\n endRowIndex: range.endRow,\n mode: 'sequence'\n };\n }\n\n // enum/tags: sequence not supported (copy only, but 2-cell handle should not appear)\n return null;\n}\n\nexport function makeFillValueGetter(\n dataModel: DataModel,\n source: FillHandleSource,\n langs?: readonly string[]\n): ((offsetFromEnd: number) => unknown) | null {\n const schema = dataModel.getSchema();\n const rows = dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return null;\n const seed: unknown[] = [];\n for (let r = source.startRowIndex; r <= source.endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) return null;\n seed.push(dataModel.getCell(row.id, col.key));\n }\n\n if (source.mode === 'copy') {\n const last = seed[seed.length - 1];\n return () => last;\n }\n\n const registry = createBuiltInRegistry(langs);\n if (col.type === 'number') {\n const numbers = seed.map((value) => (typeof value === 'number' ? value : Number(value)));\n if (!numbers.every((value) => Number.isFinite(value))) return null;\n const seq = inferSequence(numbers, { registry });\n const cache: number[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n const dates = seed.map((value) =>\n col.type === 'time' ? coerceToTime(value) : coerceToDate(value)\n );\n if (!dates.every((value) => value instanceof Date)) return null;\n const seq = inferSequence(dates as Date[], { registry });\n const cache: Date[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n if (col.type === 'string') {\n const strings = seed.map((value) => String(value ?? ''));\n const seq = inferSequence(strings, { registry });\n const cache: string[] = [];\n let done = false;\n return (offsetFromEnd) => {\n while (!done && cache.length < offsetFromEnd) {\n const next = seq.next();\n if (next.done) {\n done = true;\n break;\n }\n cache.push(next.value);\n }\n if (offsetFromEnd <= 0) return null;\n return cache[offsetFromEnd - 1] ?? null;\n };\n }\n\n return null;\n}\n\nexport const FILL_HANDLE_VISUAL_SIZE_PX = 12;\nexport const FILL_HANDLE_HIT_SIZE_PX = 14;\n\nexport function getFillHandleRect(cellRect: DOMRect, size = FILL_HANDLE_VISUAL_SIZE_PX): DOMRect {\n return new DOMRect(cellRect.right - size - 1, cellRect.bottom - size - 1, size, size);\n}\n\nexport function isPointInRect(x: number, y: number, rect: DOMRect) {\n return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\n}\n\nexport function shouldShowFillHandle(\n dataModel: DataModel,\n ranges: SelectionRange[],\n activeRowId: string | null,\n activeColKey: string | null,\n editMode: EditMode,\n): boolean {\n if (editMode === \"readonly\") return false;\n const src = getFillHandleSource(dataModel, ranges);\n if (!src) return false;\n if (!activeRowId || activeRowId === '__all__') return false;\n if (activeColKey === null) return false;\n if (activeColKey === '__all__' || activeColKey === null) return false;\n if (activeColKey !== src.colKey) return false;\n if (dataModel.isReadonly(activeRowId, activeColKey)) return false;\n return true;\n}\n","import type { DataModel } from \"./dataModel\";\nimport type {\n InternalRow,\n Schema,\n ColumnSchema,\n NumberFormat,\n IntegerFormat,\n SelectionRange,\n View,\n ViewFilterValues,\n EditMode,\n} from \"./types\";\nimport { coerceDatePattern, formatDateLite, parseIsoDate } from \"./dateUtils\";\nimport { toRawValue } from \"./cellValueCodec\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n FILL_HANDLE_VISUAL_SIZE_PX,\n getFillHandleRect,\n isPointInRect,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport { columnFormatToStyle, mergeStyle, styleToCssText } from \"./styleResolver\";\nimport { getButtonLabel, getLinkLabel, resolveButtonAction, resolveLinkAction } from \"./actionValue\";\nimport { formatIntegerWithPrefix, formatNumberForEdit } from \"./numberIO\";\n\nconst CANVAS_FONT_FAMILY = '\"Inter\",\"Segoe UI\",system-ui,-apple-system,\"Helvetica Neue\",sans-serif';\n// Canvas text tends to render slightly larger than HTML with the same nominal size.\n// Use a slightly smaller size to visually match HTML's 14px.\nconst CANVAS_FONT_SIZE_PX = 13.5;\n\nfunction getColumnSortDir(view: View, colKey: string): \"asc\" | \"desc\" | null {\n const s = view.sorts?.[0];\n if (!s) return null;\n return s.key === colKey ? s.dir : null;\n}\n\nfunction hasActiveColumnFilter(view: View, colKey: string): boolean {\n const hasValues = (view.filters ?? []).some((f) => {\n const vf = f as ViewFilterValues;\n return vf?.kind === \"values\" && vf.key === colKey;\n });\n if (hasValues) return true;\n const diag = view.columnDiagnostics?.[colKey];\n return Boolean(diag?.errors || diag?.warnings);\n}\n\nfunction svgFunnel() {\n // Simple funnel icon (stroke only) for filter affordance.\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 5h18l-7 8v6l-4 2v-8L3 5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n </svg>\n `.trim();\n}\n\nfunction svgArrow(dir: \"asc\" | \"desc\") {\n const d = dir === \"asc\" ? \"M12 6l6 8H6l6-8z\" : \"M12 18l-6-8h12l-6 8z\";\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"${d}\" fill=\"currentColor\"/>\n </svg>\n `.trim();\n}\n\nfunction drawDiagnosticCorner(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n level: \"warning\" | \"error\",\n) {\n const size = Math.min(10, Math.floor(Math.min(w, h) / 2));\n if (size <= 0) return;\n const color = level === \"error\" ? \"#ef4444\" : \"#f59e0b\";\n ctx.save();\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x + w, y);\n ctx.lineTo(x + w - size, y);\n ctx.lineTo(x + w, y + size);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nclass ValueFormatCache {\n private numberFormatCache = new Map<string, Intl.NumberFormat>();\n private dateParseCache = new Map<string, Date>();\n\n getNumberFormatter(options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = JSON.stringify(options);\n let fmt = this.numberFormatCache.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat(\"en-US\", options);\n this.numberFormatCache.set(key, fmt);\n }\n return fmt;\n }\n\n parseIsoDate(value: string): Date | null {\n const cached = this.dateParseCache.get(value);\n if (cached) return cached;\n const parsed = parseIsoDate(value);\n if (!parsed || Number.isNaN(parsed.getTime())) return null;\n this.dateParseCache.set(value, parsed);\n return parsed;\n }\n}\n\nfunction drawFunnelIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.strokeStyle = \"rgba(15,23,42,1)\";\n ctx.lineWidth = 2;\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n // Top trapezoid\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + Math.round(size * 0.62), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.38), y + Math.round(size * 0.46));\n ctx.closePath();\n ctx.stroke();\n // Stem\n ctx.beginPath();\n ctx.moveTo(x + Math.round(size * 0.46), y + Math.round(size * 0.46));\n ctx.lineTo(x + Math.round(size * 0.46), y + size);\n ctx.lineTo(x + Math.round(size * 0.54), y + size - 2);\n ctx.lineTo(x + Math.round(size * 0.54), y + Math.round(size * 0.46));\n ctx.stroke();\n ctx.restore();\n}\n\nfunction drawSortArrowIcon(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n alpha: number,\n dir: \"asc\" | \"desc\",\n) {\n ctx.save();\n ctx.globalAlpha = alpha;\n ctx.fillStyle = \"rgba(15,23,42,1)\";\n ctx.beginPath();\n if (dir === \"asc\") {\n ctx.moveTo(x + size / 2, y);\n ctx.lineTo(x + size, y + size);\n ctx.lineTo(x, y + size);\n } else {\n ctx.moveTo(x, y);\n ctx.lineTo(x + size, y);\n ctx.lineTo(x + size / 2, y + size);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nfunction resolveTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n if (Array.isArray(values)) {\n return values.filter((v): v is string => typeof v === \"string\");\n }\n }\n }\n return null;\n}\n\nclass FenwickTree {\n // 1-based BIT\n private tree: number[];\n private n: number;\n\n constructor(n: number) {\n this.n = n;\n this.tree = new Array(n + 1).fill(0);\n }\n\n static from(values: number[]) {\n const ft = new FenwickTree(values.length);\n for (let i = 0; i < values.length; i += 1) ft.add(i, values[i] ?? 0);\n return ft;\n }\n\n sum(count: number) {\n // sum of first `count` items: [0..count-1]\n let i = Math.max(0, Math.min(this.n, count));\n let res = 0;\n while (i > 0) {\n res += this.tree[i] ?? 0;\n i -= i & -i;\n }\n return res;\n }\n\n total() {\n return this.sum(this.n);\n }\n\n add(index0: number, delta: number) {\n let i = index0 + 1;\n if (i <= 0 || i > this.n) return;\n while (i <= this.n) {\n this.tree[i] = (this.tree[i] ?? 0) + delta;\n i += i & -i;\n }\n }\n\n /**\n * Returns the smallest index `i` (0-based) such that `sum(i + 1) >= target`.\n * If `target <= 0`, returns 0. If `target > total`, returns `n - 1`.\n */\n lowerBound(target: number) {\n if (this.n <= 0) return 0;\n if (target <= 0) return 0;\n const total = this.total();\n if (target > total) return this.n - 1;\n let idx = 0;\n // Largest power of two >= n\n let bit = 1;\n while (bit <= this.n) bit <<= 1;\n let acc = 0;\n for (let step = bit; step !== 0; step >>= 1) {\n const next = idx + step;\n if (next <= this.n) {\n const nextAcc = acc + (this.tree[next] ?? 0);\n if (nextAcc < target) {\n idx = next;\n acc = nextAcc;\n }\n }\n }\n // idx is the last position where prefix sum < target; answer is idx (0-based)\n return Math.min(this.n - 1, idx);\n }\n}\n\nexport interface ViewportState {\n scrollTop: number;\n scrollLeft: number;\n clientWidth: number;\n clientHeight: number;\n deltaX: number;\n deltaY: number;\n timestamp: number;\n}\n\nexport interface Renderer {\n mount(root: HTMLElement): void;\n render(state?: ViewportState): void;\n destroy(): void;\n getCellElements(): NodeListOf<HTMLElement> | null;\n hitTest(\n event: MouseEvent,\n ): { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\n hitTestAction?(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null;\n setActiveCell(rowId: string | null, colKey: string | null): void;\n setSelection(ranges: SelectionRange[]): void;\n}\n\nexport class HTMLRenderer implements Renderer {\n private tableEl: HTMLTableElement | null = null;\n private defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n private rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private measureCache = new Map<string, { height: number; frame: number }>();\n private frame = 0;\n constructor(private dataModel: DataModel) {}\n\n mount(root: HTMLElement) {\n this.tableEl = document.createElement(\"table\");\n this.tableEl.dataset.extableRenderer = \"html\";\n root.innerHTML = \"\";\n root.appendChild(this.tableEl);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.updateActiveClasses();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.applySelectionClasses();\n }\n\n render(_state?: ViewportState) {\n this.frame += 1;\n if (!this.tableEl) return;\n const scrollContainer = this.tableEl.parentElement;\n const prevTop = scrollContainer?.scrollTop ?? 0;\n const prevLeft = scrollContainer?.scrollLeft ?? 0;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n this.tableEl.innerHTML = \"\";\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const colBaseCss = colBaseStyles.map((s) => styleToCssText(s));\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n this.tableEl.style.width = `${totalWidth}px`;\n this.tableEl.appendChild(this.renderHeader(schema, colWidths));\n const body = document.createElement(\"tbody\");\n for (const row of rows) {\n body.appendChild(this.renderRow(row, schema, colWidths, colBaseStyles, colBaseCss));\n }\n this.tableEl.appendChild(body);\n this.updateActiveClasses();\n this.applySelectionClasses();\n if (scrollContainer) {\n scrollContainer.scrollTop = prevTop;\n scrollContainer.scrollLeft = prevLeft;\n }\n for (const [key, entry] of Array.from(this.measureCache.entries())) {\n if (entry.frame !== this.frame) this.measureCache.delete(key);\n }\n }\n\n destroy() {\n removeFromParent(this.tableEl);\n this.tableEl = null;\n }\n\n getCellElements() {\n return this.tableEl?.querySelectorAll<HTMLElement>(\"tr[data-row-id] td[data-col-key]\") ?? null;\n }\n\n hitTest(event: MouseEvent) {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const corner = target.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = target.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const cell = target.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n\n hitTestAction(\n event: MouseEvent,\n ):\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null {\n const target = event.target as HTMLElement | null;\n if (!target) return null;\n const tagRemove = target.closest<HTMLButtonElement>(\"[data-extable-tag-remove]\");\n if (tagRemove && !tagRemove.disabled) {\n const cell = tagRemove.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const indexStr = tagRemove.dataset.extableTagIndex;\n const tagIndex = indexStr ? Number.parseInt(indexStr, 10) : Number.NaN;\n if (!Number.isFinite(tagIndex)) return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind: \"tag-remove\" as const,\n tagIndex,\n };\n }\n const actionEl = target.closest<HTMLElement>(\"[data-extable-action]\");\n if (!actionEl) return null;\n const cell = actionEl.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (!cell || !row) return null;\n const kind = actionEl.dataset.extableAction as \"button\" | \"link\" | undefined;\n if (kind !== \"button\" && kind !== \"link\") return null;\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n kind,\n };\n }\n\n private renderHeader(schema: Schema, colWidths: number[]) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n tr.style.height = `${this.defaultRowHeight}px`;\n const rowTh = document.createElement(\"th\");\n rowTh.classList.add(\"extable-row-header\", \"extable-corner\");\n rowTh.textContent = \"\";\n rowTh.style.width = `${this.rowHeaderWidth}px`;\n if (this.activeRowId) rowTh.classList.toggle(\"extable-active-row-header\", true);\n rowTh.dataset.colKey = \"\";\n tr.appendChild(rowTh);\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const th = document.createElement(\"th\");\n th.dataset.colKey = col.key;\n const sortDir = getColumnSortDir(view, col.key);\n const hasFilter = hasActiveColumnFilter(view, col.key);\n if (sortDir) th.dataset.extableSortDir = sortDir;\n else th.removeAttribute(\"data-extable-sort-dir\");\n if (hasFilter) th.dataset.extableFsActive = \"1\";\n else th.removeAttribute(\"data-extable-fs-active\");\n\n const wrap = document.createElement(\"div\");\n wrap.className = \"extable-col-header\";\n const label = document.createElement(\"span\");\n label.className = \"extable-col-header-text\";\n label.textContent = col.header ?? col.key;\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"extable-filter-sort-trigger\";\n btn.dataset.extableFsOpen = \"1\";\n btn.dataset.extableColKey = col.key;\n btn.title = \"Filter / Sort\";\n btn.innerHTML = sortDir ? svgArrow(sortDir) : svgFunnel();\n wrap.appendChild(label);\n wrap.appendChild(btn);\n th.appendChild(wrap);\n const width = colWidths[idx] ?? col.width;\n if (width) th.style.width = `${width}px`;\n th.dataset.colKey = col.key;\n if (this.activeColKey !== null && this.activeColKey === col.key) {\n th.classList.add(\"extable-active-col-header\");\n }\n tr.appendChild(th);\n }\n thead.appendChild(tr);\n return thead;\n }\n\n private renderRow(\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n colBaseStyles: ReturnType<typeof columnFormatToStyle>[],\n colBaseCss: string[],\n ) {\n const tr = document.createElement(\"tr\");\n tr.dataset.rowId = row.id;\n tr.style.height = `${this.defaultRowHeight}px`;\n const view = this.dataModel.getView();\n const rowHeader = document.createElement(\"th\");\n rowHeader.scope = \"row\";\n rowHeader.classList.add(\"extable-row-header\");\n const index = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n rowHeader.textContent = String(index);\n if (this.activeRowId === row.id) rowHeader.classList.add(\"extable-active-row-header\");\n tr.appendChild(rowHeader);\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col) continue;\n const td = document.createElement(\"td\");\n td.classList.add(\"extable-cell\");\n td.dataset.colKey = col.key;\n if (col.type === \"boolean\") td.classList.add(\"extable-boolean\");\n const isPending = this.dataModel.hasPending(row.id, col.key);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const cellStyle = this.dataModel.getCellStyle(row.id, col.key);\n const hasTextColor = Boolean(\n cellStyle?.textColor || condRes.delta?.textColor || col.style?.textColor,\n );\n if (!cellStyle && !condRes.delta && !isPending) {\n const css = colBaseCss[idx] ?? \"\";\n if (css) td.style.cssText = css;\n } else {\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const merged = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const forCss = isPending ? { ...merged, textColor: undefined } : merged;\n const css = styleToCssText(forCss);\n if (css) td.style.cssText = css;\n }\n const wrap = view.wrapText?.[col.key] ?? col.wrapText;\n td.classList.add(wrap ? \"cell-wrap\" : \"cell-nowrap\");\n const raw = this.dataModel.getRawCell(row.id, col.key);\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride\n ? { text: textOverride as string }\n : this.formatValue(valueRes.value, col);\n const interaction = this.dataModel.getCellInteraction(row.id, col.key);\n const tagValues =\n col.type === \"tags\" && !textOverride ? resolveTagValues(valueRes.value) : null;\n const isActionType = col.type === \"button\" || col.type === \"link\";\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(valueRes.value)\n : getLinkLabel(valueRes.value)\n : \"\";\n if (tagValues && tagValues.length) {\n const list = document.createElement(\"div\");\n list.className = \"extable-tag-list\";\n tagValues.forEach((tag, index) => {\n const chip = document.createElement(\"span\");\n chip.className = \"extable-tag\";\n const label = document.createElement(\"span\");\n label.className = \"extable-tag-label\";\n label.textContent = tag;\n const remove = document.createElement(\"button\");\n remove.type = \"button\";\n remove.className = \"extable-tag-remove\";\n remove.dataset.extableTagRemove = \"1\";\n remove.dataset.extableTagIndex = String(index);\n remove.textContent = \"×\";\n if (interaction.readonly || interaction.disabled) {\n remove.disabled = true;\n }\n chip.appendChild(label);\n chip.appendChild(remove);\n list.appendChild(chip);\n });\n td.replaceChildren(list);\n } else if (isActionType && !textOverride && actionValue && actionLabel) {\n const actionEl =\n col.type === \"button\" ? document.createElement(\"button\") : document.createElement(\"span\");\n if (actionEl instanceof HTMLButtonElement) actionEl.type = \"button\";\n actionEl.className =\n col.type === \"button\" ? \"extable-action-button\" : \"extable-action-link\";\n if (interaction.disabled) actionEl.classList.add(\"extable-action-disabled\");\n if (col.type === \"link\" && hasTextColor) actionEl.style.color = \"inherit\";\n actionEl.dataset.extableAction = col.type;\n actionEl.textContent = actionLabel;\n td.replaceChildren(actionEl);\n } else {\n td.textContent = actionLabel || formatted.text;\n if (formatted.color) td.style.color = formatted.color;\n }\n const marker = this.dataModel.getCellMarker(row.id, col.key);\n if (marker) {\n td.classList.toggle(\"extable-diag-warning\", marker.level === \"warning\");\n td.classList.toggle(\"extable-diag-error\", marker.level === \"error\");\n td.dataset.extableDiagMessage = marker.message;\n } else {\n td.classList.remove(\"extable-diag-warning\", \"extable-diag-error\");\n td.removeAttribute(\"data-extable-diag-message\");\n }\n const align =\n col.style?.align ??\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\" ? \"right\" : \"left\");\n td.classList.add(align === \"right\" ? \"align-right\" : \"align-left\");\n const rawNumbered = toRawValue(raw, valueRes.value, col);\n if (rawNumbered !== null) {\n td.dataset.raw = rawNumbered;\n } else {\n const rawStr = raw === null || raw === undefined ? \"\" : String(raw);\n td.dataset.raw = rawStr;\n }\n if (isPending) td.classList.add(\"pending\");\n if (interaction.readonly) td.classList.add(\"extable-readonly\");\n else td.classList.add(\"extable-editable\");\n if (interaction.muted) td.classList.add(\"extable-readonly-muted\");\n if (interaction.disabled) td.classList.add(\"extable-disabled\");\n if (\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === col.key\n ) {\n td.classList.add(\"extable-active-cell\");\n }\n tr.appendChild(td);\n }\n // variable row height based on measured content when wrap enabled\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (wrapAny) {\n let maxHeight = this.defaultRowHeight;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const col = schema.columns[idx];\n if (!col || !col.wrapText) continue;\n const width = colWidths[idx] ?? view.columnWidths?.[col.key] ?? col.width ?? 100;\n const valueRes = this.dataModel.resolveCellValue(row.id, col);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, col);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride\n ? \"#ERROR\"\n : valueRes.value === null || valueRes.value === undefined\n ? \"\"\n : String(valueRes.value);\n const version = this.dataModel.getRowVersion(row.id);\n const key = `${row.id}|${col.key}|${version}|${width}|${text}`;\n const cached = this.measureCache.get(key);\n if (cached) {\n cached.frame = this.frame;\n this.measureCache.set(key, cached);\n maxHeight = Math.max(maxHeight, cached.height);\n continue;\n }\n const measure = document.createElement(\"span\");\n measure.style.visibility = \"hidden\";\n measure.style.position = \"absolute\";\n measure.style.left = \"-10000px\";\n measure.style.top = \"0\";\n measure.style.whiteSpace = \"pre-wrap\";\n measure.style.overflowWrap = \"anywhere\";\n measure.style.display = \"inline-block\";\n measure.style.width = `${width}px`;\n measure.textContent = text;\n const measureHost = this.tableEl?.parentElement;\n if (!measureHost) continue;\n measureHost.appendChild(measure);\n const h =\n measure.clientHeight +\n CELL_PADDING_TOP_PX +\n CELL_PADDING_BOTTOM_PX +\n 2; // border allowance (top+bottom)\n measure.remove();\n this.measureCache.set(key, { height: h, frame: this.frame });\n maxHeight = Math.max(maxHeight, h);\n }\n tr.style.height = `${maxHeight}px`;\n this.dataModel.setRowHeight(row.id, maxHeight);\n } else {\n tr.style.height = `${this.defaultRowHeight}px`;\n this.dataModel.setRowHeight(row.id, this.defaultRowHeight);\n }\n return tr;\n }\n\n private updateActiveClasses() {\n if (!this.tableEl) return;\n const isAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n this.tableEl.classList.toggle(\"extable-all-selected\", isAll);\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-row-header\"))) {\n el.classList.remove(\"extable-active-row-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-col-header\"))) {\n el.classList.remove(\"extable-active-col-header\");\n }\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-active-cell\"))) {\n el.classList.remove(\"extable-active-cell\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] .extable-row-header`,\n ),\n )) {\n el.classList.add(\"extable-active-row-header\");\n }\n }\n if (this.activeColKey !== null) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(`th[data-col-key=\"${this.activeColKey}\"]`),\n )) {\n el.classList.add(\"extable-active-col-header\");\n }\n if (this.activeRowId) {\n for (const el of Array.from(\n this.tableEl.querySelectorAll<HTMLElement>(\n `tr[data-row-id=\"${this.activeRowId}\"] td[data-col-key=\"${this.activeColKey}\"]`,\n ),\n )) {\n el.classList.add(\"extable-active-cell\");\n }\n }\n }\n }\n\n private applySelectionClasses() {\n if (!this.tableEl) return;\n for (const el of Array.from(this.tableEl.querySelectorAll(\".extable-selected\"))) {\n el.classList.remove(\"extable-selected\");\n }\n if (!this.selection.length) return;\n const rows = Array.from(this.tableEl.querySelectorAll<HTMLTableRowElement>(\"tbody tr\"));\n const schema = this.dataModel.getSchema();\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(schema.columns.length - 1, Math.max(range.startCol, range.endCol));\n for (let r = startRow; r <= endRow; r += 1) {\n const rowEl = rows[r];\n if (!rowEl) continue;\n const th = rowEl.querySelector(\"th.extable-row-header\");\n if (th) th.classList.add(\"extable-selected\");\n const cells = Array.from(rowEl.querySelectorAll<HTMLTableCellElement>(\"td\"));\n for (let c = startCol; c <= endCol; c += 1) {\n const cell = cells[c];\n if (cell) cell.classList.add(\"extable-selected\");\n }\n }\n }\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(fmtValue, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(fmtValue, \"time\")\n : coerceDatePattern(fmtValue, \"datetime\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n\nexport class CanvasRenderer implements Renderer {\n private static readonly MAX_CANVAS_DIM_PX = 8192;\n private static readonly ROW_HEIGHT_MEASURE_CHUNK = 500;\n private static readonly ROW_HEIGHT_MEASURE_TIME_BUDGET_MS = 8;\n private static readonly TEXT_MEASURE_CACHE_MAX = 2000;\n private root: HTMLElement | null = null;\n private canvas: HTMLCanvasElement | null = null;\n private spacer: HTMLDivElement | null = null;\n private overlayLayer: HTMLDivElement | null = null;\n private tooltip: HTMLDivElement | null = null;\n private tooltipTarget: { rowId: string; colKey: string } | null = null;\n private tooltipMessage: string | null = null;\n private dataModel: DataModel;\n private readonly rowHeight = DEFAULT_ROW_HEIGHT_PX;\n private readonly headerHeight = HEADER_HEIGHT_PX;\n private readonly lineHeight = 16;\n private readonly padding = 12;\n private readonly rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n private activeRowId: string | null = null;\n private activeColKey: string | null = null;\n private selection: SelectionRange[] = [];\n private valueFormatCache = new ValueFormatCache();\n private textMeasureCache = new Map<string, { lines: string[] }>();\n private frame = 0;\n private cursorTimer: number | null = null;\n private pendingCursorPoint: { x: number; y: number } | null = null;\n private hoverHeaderColKey: string | null = null;\n private hoverHeaderIcon = false;\n private hoverActionKey: string | null = null;\n private activeActionKey: string | null = null;\n private rowHeightCacheKey: string | null = null;\n private rowHeightMeasuredVersion = new Map<string, number>();\n private rowHeightMeasureRaf: number | null = null;\n private rowHeightMeasureTask: { key: string; nextIndex: number } | null = null;\n private heightIndex: {\n key: string | null;\n rowsRef: InternalRow[];\n idToIndex: Map<string, number>;\n heights: number[];\n fenwick: FenwickTree;\n } | null = null;\n\n constructor(\n dataModel: DataModel,\n private getEditMode: () => EditMode = () => \"direct\",\n ) {\n this.dataModel = dataModel;\n }\n\n mount(root: HTMLElement) {\n this.root = root;\n this.canvas = document.createElement(\"canvas\");\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n this.canvas.width = Math.max(1, Math.min(maxDim, Math.floor(root.clientWidth || 600)));\n this.canvas.height = Math.max(1, Math.min(maxDim, Math.floor(root.clientHeight || 400)));\n this.canvas.style.width = `${this.canvas.width}px`;\n this.canvas.style.height = `${this.canvas.height}px`;\n this.canvas.dataset.extableRenderer = \"canvas\";\n this.canvas.style.position = \"sticky\";\n this.canvas.style.top = \"0\";\n this.canvas.style.left = \"0\";\n this.canvas.style.zIndex = \"1\";\n this.canvas.style.cursor = \"cell\";\n this.canvas.addEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.addEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.addEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.addEventListener(\"click\", this.handleClick);\n this.spacer = document.createElement(\"div\");\n this.spacer.style.width = \"1px\";\n if (this.tooltip) this.tooltip.remove();\n if (this.overlayLayer) this.overlayLayer.remove();\n this.overlayLayer = document.createElement(\"div\");\n this.overlayLayer.className = \"extable-overlay-layer\";\n this.tooltip = document.createElement(\"div\");\n this.tooltip.className = \"extable-tooltip\";\n this.tooltip.dataset.visible = \"0\";\n this.overlayLayer.appendChild(this.tooltip);\n root.innerHTML = \"\";\n root.style.position = \"relative\";\n root.appendChild(this.overlayLayer);\n root.appendChild(this.canvas);\n root.appendChild(this.spacer);\n this.render();\n }\n\n setActiveCell(rowId: string | null, colKey: string | null) {\n this.activeRowId = rowId;\n this.activeColKey = colKey;\n this.render();\n }\n\n setSelection(ranges: SelectionRange[]) {\n this.selection = ranges;\n this.render();\n }\n\n render(state?: ViewportState) {\n try {\n this.frame += 1;\n if (!this.canvas || !this.root) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n let baseFont = ctx.font;\n const selectAll = this.activeRowId === \"__all__\" && this.activeColKey === \"__all__\";\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const colWidths = getColumnWidths(schema, view);\n const colBaseStyles = schema.columns.map((c) => columnFormatToStyle(c));\n const fontCache = new Map<string, string>();\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const cacheKey = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n if (cacheKey !== this.rowHeightCacheKey) {\n this.rowHeightCacheKey = cacheKey;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n if (!wrapAny) this.cancelRowHeightMeasurement();\n\n this.ensureHeightIndex(rows, wrapAny ? cacheKey : null, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return;\n\n const totalWidth = this.rowHeaderWidth + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const desiredCanvasWidth = state?.clientWidth ?? (this.root.clientWidth || 600);\n const desiredCanvasHeight =\n state?.clientHeight ?? (this.root.clientHeight || this.canvas.height || 400);\n const maxDim = CanvasRenderer.MAX_CANVAS_DIM_PX;\n const nextWidth = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasWidth)));\n const nextHeight = Math.max(1, Math.min(maxDim, Math.floor(desiredCanvasHeight)));\n if (this.canvas.width !== nextWidth) this.canvas.width = nextWidth;\n if (this.canvas.height !== nextHeight) this.canvas.height = nextHeight;\n this.canvas.style.width = `${nextWidth}px`;\n this.canvas.style.height = `${nextHeight}px`;\n // Resizing resets 2D state, so reapply after size update.\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n baseFont = ctx.font;\n this.refreshTooltipPosition();\n\n const scrollTop = state?.scrollTop ?? this.root.scrollTop;\n const scrollLeft = state?.scrollLeft ?? this.root.scrollLeft;\n const computeVisibleRange = (contentTop: number) => {\n const target = contentTop + 1;\n const visibleStart = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(target)),\n );\n const accum = heightIndex.fenwick.sum(visibleStart);\n let visibleEnd = visibleStart;\n let drawnHeight = 0;\n const maxHeight = (this.canvas?.height ?? 0) + this.rowHeight * 2;\n for (let i = visibleStart; i < rows.length && drawnHeight < maxHeight; i += 1) {\n drawnHeight += heightIndex.heights[i] ?? this.rowHeight;\n visibleEnd = i + 1;\n }\n return { accum, visibleStart, visibleEnd };\n };\n\n let totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n let maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n let contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n let { accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop);\n\n if (wrapAny && cacheKey) {\n const updates: Record<string, number> = {};\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const nextH = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = nextH;\n this.rowHeightMeasuredVersion.set(row.id, version);\n }\n this.applyRowHeightUpdates(updates);\n totalRowsHeight = heightIndex.fenwick.total();\n this.dataModel.setRowHeightsBulk(updates);\n maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n contentScrollTop = Math.max(0, Math.min(scrollTop, maxContentScrollTop));\n ({ accum, visibleStart, visibleEnd } = computeVisibleRange(contentScrollTop));\n if (this.rowHeightMeasureTask || Object.keys(updates).length > 0)\n this.scheduleRowHeightMeasurement();\n }\n\n if (this.spacer) {\n this.spacer.style.height = `${maxContentScrollTop}px`;\n this.spacer.style.width = `${totalWidth}px`;\n }\n const dataXOffset = this.rowHeaderWidth - scrollLeft;\n\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n // Keep row-header column background visible across scroll\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.canvas.height);\n // Body\n let yCursor = this.headerHeight + accum - contentScrollTop;\n for (let i = visibleStart; i < visibleEnd; i += 1) {\n const row = rows[i];\n const rowH = heightIndex.heights[i] ?? this.rowHeight;\n // row header cell\n ctx.strokeStyle = \"#d0d7de\";\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n ctx.strokeRect(0, yCursor, this.rowHeaderWidth, rowH);\n const idxText = this.dataModel.getDisplayIndex(row.id) ?? \"\";\n if (this.activeRowId === row.id) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, yCursor, this.rowHeaderWidth, rowH);\n }\n ctx.fillStyle = \"#0f172a\";\n ctx.font = `bold ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(String(idxText), this.rowHeaderWidth / 2, yCursor + rowH / 2);\n ctx.font = baseFont;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let x = 0;\n let lastFontKey = \"\";\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n x += w;\n continue;\n }\n const interaction = this.dataModel.getCellInteraction(row.id, c.key);\n const muted = interaction.muted;\n ctx.strokeStyle = \"#d0d7de\";\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const cellStyle = this.dataModel.getCellStyle(row.id, c.key);\n const baseStyle = colBaseStyles[idx] ?? {};\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const bg = muted ? \"#f3f4f6\" : (mergedStyle.backgroundColor ?? \"#ffffff\");\n ctx.fillStyle = bg;\n ctx.fillRect(x, yCursor, w, rowH);\n ctx.strokeRect(x, yCursor, w, rowH);\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const textOverride =\n valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const formatted = textOverride ? { text: \"#ERROR\" } : this.formatValue(valueRes.value, c);\n const isActionType = c.type === \"button\" || c.type === \"link\";\n const actionValue = isActionType\n ? c.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? actionValue?.label ??\n (c.type === \"button\" ? getButtonLabel(valueRes.value) : getLinkLabel(valueRes.value))\n : \"\";\n const renderAction = Boolean(isActionType && actionValue && actionLabel && !textOverride);\n const text = actionLabel || formatted.text;\n const align = c.style?.align ?? (c.type === \"number\" ? \"right\" : \"left\");\n const isActiveCell =\n this.activeRowId === row.id &&\n this.activeColKey !== null &&\n this.activeColKey === c.key;\n if (isActiveCell) {\n ctx.strokeStyle = \"#3b82f6\";\n ctx.lineWidth = 2;\n ctx.strokeRect(x + 1, yCursor + 1, w - 2, rowH - 2);\n ctx.lineWidth = 1;\n if (\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const size = FILL_HANDLE_VISUAL_SIZE_PX;\n const left = x + w - size - 1;\n const top = yCursor + rowH - size - 1;\n ctx.fillStyle = \"#3b82f6\";\n ctx.fillRect(left, top, size, size);\n ctx.strokeStyle = \"#ffffff\";\n ctx.strokeRect(left + 0.5, top + 0.5, size - 1, size - 1);\n }\n }\n const actionColor =\n renderAction && c.type === \"link\" && !muted && !mergedStyle.textColor\n ? \"#2563eb\"\n : undefined;\n ctx.fillStyle = this.dataModel.hasPending(row.id, c.key)\n ? \"#b91c1c\"\n : formatted.color\n ? formatted.color\n : muted\n ? \"#94a3b8\"\n : (actionColor ?? mergedStyle.textColor ?? \"#0f172a\");\n const wrap = view.wrapText?.[c.key] ?? c.wrapText ?? false;\n const isBoolean = c.type === \"boolean\" && (!c.format || c.format === \"checkbox\");\n const isCustomBoolean = c.type === \"boolean\" && Boolean(c.format && c.format !== \"checkbox\");\n if (!isBoolean) {\n const fontKey = `${mergedStyle.italic ? \"i\" : \"\"}${mergedStyle.bold ? \"b\" : \"\"}`;\n if (fontKey !== lastFontKey) {\n const cached = fontCache.get(fontKey);\n if (cached) ctx.font = cached;\n else {\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n const f = `${ital}${weight}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\n fontCache.set(fontKey, f);\n ctx.font = f;\n }\n lastFontKey = fontKey;\n }\n } else {\n ctx.font = baseFont;\n lastFontKey = \"\";\n }\n const textAreaX = x + CELL_PADDING_X_PX;\n const textAreaY = yCursor + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, w - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(0, rowH - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX));\n const decorations = {\n underline: Boolean(mergedStyle.underline) || (renderAction && c.type === \"link\"),\n strike: Boolean(mergedStyle.strike),\n };\n const actionBounds =\n renderAction && !isBoolean\n ? this.measureTextBounds(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n )\n : null;\n if (renderAction && c.type === \"button\" && actionBounds) {\n const padX = 6;\n const padY = 4;\n const left = Math.max(textAreaX, actionBounds.x - padX);\n const top = Math.max(textAreaY, actionBounds.y - padY);\n const right = Math.min(textAreaX + textAreaW, actionBounds.x + actionBounds.width + padX);\n const bottom = Math.min(textAreaY + textAreaH, actionBounds.y + actionBounds.height + padY);\n const bw = Math.max(0, right - left);\n const bh = Math.max(0, bottom - top);\n ctx.save();\n const actionKey = `${row.id}::${c.key}::button`;\n const isHover = this.hoverActionKey === actionKey;\n const isActive = this.activeActionKey === actionKey;\n if (muted) {\n ctx.fillStyle = \"#f3f4f6\";\n ctx.strokeStyle = \"#e2e8f0\";\n } else if (isActive) {\n ctx.fillStyle = \"#cbd5e1\";\n ctx.strokeStyle = \"#94a3b8\";\n } else if (isHover) {\n ctx.fillStyle = \"#e2e8f0\";\n ctx.strokeStyle = \"#94a3b8\";\n } else {\n ctx.fillStyle = \"#f8fafc\";\n ctx.strokeStyle = \"#cbd5e1\";\n }\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") {\n ctx.roundRect(left, top, bw, bh, 6);\n } else {\n ctx.rect(left, top, bw, bh);\n }\n ctx.fill();\n ctx.stroke();\n ctx.restore();\n }\n this.drawCellText(\n ctx,\n text,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n isBoolean,\n isCustomBoolean,\n decorations,\n );\n const marker = this.dataModel.getCellMarker(row.id, c.key);\n if (marker) drawDiagnosticCorner(ctx, x, yCursor, w, rowH, marker.level);\n x += w;\n }\n ctx.restore();\n yCursor += rowH;\n }\n\n // Header (draw last to stay on top)\n ctx.fillStyle = \"#e5e7eb\";\n ctx.fillRect(0, 0, this.canvas.width, this.headerHeight);\n ctx.strokeStyle = \"#d0d7de\";\n // corner\n ctx.strokeRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n ctx.fillStyle = \"#9ca3af\";\n ctx.beginPath();\n ctx.moveTo(4, 4);\n ctx.lineTo(16, 4);\n ctx.lineTo(4, 16);\n ctx.closePath();\n ctx.fill();\n if (this.activeRowId) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(0, 0, this.rowHeaderWidth, this.headerHeight);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(this.rowHeaderWidth, 0, this.canvas.width - this.rowHeaderWidth, this.headerHeight);\n ctx.clip();\n ctx.translate(dataXOffset, 0);\n let xHeader = 0;\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n const w = colWidths[idx] ?? 100;\n if (!c) {\n xHeader += w;\n continue;\n }\n const isActiveCol = this.activeColKey !== null && this.activeColKey === c.key;\n if (isActiveCol) {\n ctx.fillStyle = \"rgba(59,130,246,0.16)\";\n ctx.fillRect(xHeader, 0, w, this.headerHeight);\n }\n ctx.strokeStyle = \"#d0d7de\";\n ctx.strokeRect(xHeader, 0, w, this.headerHeight);\n ctx.fillStyle = \"#0f172a\";\n ctx.font = `bold ${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n ctx.fillText(c.header ?? c.key, xHeader + 8, this.headerHeight - 8);\n ctx.font = baseFont;\n\n const sortDir = getColumnSortDir(view, c.key);\n const hasFilter = hasActiveColumnFilter(view, c.key);\n const isHover = this.hoverHeaderColKey !== null && this.hoverHeaderColKey === c.key;\n const showIcon = Boolean(sortDir) || hasFilter || isHover;\n if (showIcon) {\n const alpha = isHover ? 0.9 : hasFilter || sortDir ? 0.75 : 0.45;\n const iconBox = 16;\n const pad = 6;\n const ix = xHeader + w - iconBox - pad;\n const iy = Math.floor((this.headerHeight - iconBox) / 2);\n if (sortDir) {\n drawSortArrowIcon(ctx, ix + 3, iy + 3, iconBox - 6, alpha, sortDir);\n } else {\n drawFunnelIcon(ctx, ix + 2, iy + 2, iconBox - 4, alpha);\n }\n }\n xHeader += w;\n }\n ctx.restore();\n\n // selection overlay\n if (this.selection.length) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n this.rowHeaderWidth,\n this.headerHeight,\n this.canvas.width - this.rowHeaderWidth,\n this.canvas.height - this.headerHeight,\n );\n ctx.clip();\n ctx.strokeStyle = \"#3b82f6\";\n ctx.fillStyle = \"rgba(59,130,246,0.12)\";\n for (const range of this.selection) {\n const startRow = Math.max(0, Math.min(range.startRow, range.endRow));\n const endRow = Math.min(rows.length - 1, Math.max(range.startRow, range.endRow));\n const startCol = Math.max(0, Math.min(range.startCol, range.endCol));\n const endCol = Math.min(\n schema.columns.length - 1,\n Math.max(range.startCol, range.endCol),\n );\n const yTop = this.headerHeight + heightIndex.fenwick.sum(startRow) - contentScrollTop;\n const height = heightIndex.fenwick.sum(endRow + 1) - heightIndex.fenwick.sum(startRow);\n let xLeft = this.rowHeaderWidth;\n for (let c = 0; c < startCol; c += 1) {\n xLeft += colWidths[c] ?? 100;\n }\n let width = 0;\n for (let c = startCol; c <= endCol; c += 1) {\n width += colWidths[c] ?? 100;\n }\n xLeft -= scrollLeft;\n ctx.fillRect(xLeft, yTop, width, height);\n ctx.strokeRect(xLeft + 0.5, yTop + 0.5, width - 1, height - 1);\n }\n ctx.restore();\n }\n\n if (selectAll) {\n ctx.save();\n ctx.fillStyle = \"rgba(59,130,246,0.08)\";\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n ctx.restore();\n }\n } catch {\n // Ignore canvas rendering errors (e.g. context enters an error state after huge resize).\n // A subsequent resize typically recovers.\n return;\n }\n }\n\n destroy() {\n this.cancelRowHeightMeasurement();\n this.heightIndex = null;\n if (this.canvas) {\n this.canvas.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.canvas.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.canvas.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.canvas.removeEventListener(\"pointerleave\", this.handlePointerLeave);\n this.canvas.removeEventListener(\"click\", this.handleClick);\n }\n if (this.cursorTimer) {\n window.clearTimeout(this.cursorTimer);\n this.cursorTimer = null;\n }\n this.pendingCursorPoint = null;\n removeFromParent(this.canvas);\n removeFromParent(this.spacer);\n removeFromParent(this.overlayLayer);\n removeFromParent(this.tooltip);\n this.canvas = null;\n this.spacer = null;\n this.overlayLayer = null;\n this.tooltip = null;\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.root = null;\n }\n\n private ensureHeightIndex(rows: InternalRow[], key: string | null, wrapAny: boolean) {\n const existing = this.heightIndex;\n if (existing && existing.rowsRef === rows && existing.key === key) return;\n const heights = new Array(rows.length);\n const idToIndex = new Map<string, number>();\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i];\n if (!row) continue;\n idToIndex.set(row.id, i);\n let h = this.rowHeight;\n if (wrapAny && key) {\n const version = this.dataModel.getRowVersion(row.id);\n const measuredVersion = this.rowHeightMeasuredVersion.get(row.id);\n const cachedHeight = this.dataModel.getRowHeight(row.id);\n if (measuredVersion === version && typeof cachedHeight === \"number\") h = cachedHeight;\n }\n heights[i] = h;\n }\n this.heightIndex = {\n key,\n rowsRef: rows,\n idToIndex,\n heights,\n fenwick: FenwickTree.from(heights),\n };\n }\n\n private applyRowHeightUpdates(updates: Record<string, number>) {\n const index = this.heightIndex;\n if (!index) return;\n for (const [rowId, next] of Object.entries(updates)) {\n const i = index.idToIndex.get(rowId);\n if (i === undefined) continue;\n const prev = index.heights[i] ?? this.rowHeight;\n if (prev === next) continue;\n index.heights[i] = next;\n index.fenwick.add(i, next - prev);\n }\n }\n\n private getRowHeightCacheKey(schema: Schema, view: View, colWidths: number[]) {\n const wraps = schema.columns\n .map((c) => ((view.wrapText?.[c.key] ?? c.wrapText) ? \"1\" : \"0\"))\n .join(\"\");\n const widths = colWidths.map((w) => String(w ?? 0)).join(\",\");\n return `${wraps}|${widths}`;\n }\n\n private cancelRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) {\n cancelAnimationFrame(this.rowHeightMeasureRaf);\n this.rowHeightMeasureRaf = null;\n }\n this.rowHeightMeasureTask = null;\n }\n\n private scheduleRowHeightMeasurement() {\n if (this.rowHeightMeasureRaf !== null) return;\n this.rowHeightMeasureRaf = requestAnimationFrame(() => {\n this.rowHeightMeasureRaf = null;\n this.runRowHeightMeasurement();\n });\n }\n\n private runRowHeightMeasurement() {\n if (!this.canvas) return;\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n if (!wrapAny) return;\n const key = this.getRowHeightCacheKey(schema, view, colWidths);\n if (this.rowHeightCacheKey !== key) {\n this.rowHeightCacheKey = key;\n this.rowHeightMeasuredVersion.clear();\n this.rowHeightMeasureTask = null;\n }\n const task = this.rowHeightMeasureTask ?? { key, nextIndex: 0 };\n if (task.key !== key) return;\n\n const rows = this.dataModel.listRows();\n const updates: Record<string, number> = {};\n let measured = 0;\n const start = performance.now();\n while (task.nextIndex < rows.length && measured < CanvasRenderer.ROW_HEIGHT_MEASURE_CHUNK) {\n if (performance.now() - start > CanvasRenderer.ROW_HEIGHT_MEASURE_TIME_BUDGET_MS) break;\n const row = rows[task.nextIndex];\n task.nextIndex += 1;\n if (!row) continue;\n const version = this.dataModel.getRowVersion(row.id);\n if (this.rowHeightMeasuredVersion.get(row.id) === version) continue;\n const h = this.measureRowHeight(ctx, row, schema, colWidths);\n updates[row.id] = h;\n this.rowHeightMeasuredVersion.set(row.id, version);\n measured += 1;\n }\n this.rowHeightMeasureTask = task.nextIndex < rows.length ? task : null;\n this.ensureHeightIndex(rows, this.rowHeightCacheKey, true);\n this.applyRowHeightUpdates(updates);\n this.dataModel.setRowHeightsBulk(updates);\n if (this.rowHeightMeasureTask) this.scheduleRowHeightMeasurement();\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (!this.root || !this.canvas) return;\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = ev.clientX - rect.left;\n const viewportY = ev.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n if (y >= this.headerHeight) return;\n if (x < this.rowHeaderWidth) return;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex < 0) return;\n const col = schema.columns[colIndex];\n if (!col) return;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n const inIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n if (!inIcon) return;\n this.root.dispatchEvent(\n new CustomEvent(\"extable:filter-sort-open\", { bubbles: true, detail: { colKey: col.key } }),\n );\n };\n\n getCellElements() {\n return null;\n }\n\n hitTest(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n // Use viewport-relative coordinates first because headers are rendered as \"sticky\"\n // (they should not be offset by scrollTop in hit-test).\n const viewportX = event.clientX - rect.left;\n const viewportY = event.clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const headerHeight = this.headerHeight;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const totalRowsHeight = heightIndex.fenwick.total();\n const viewportHeight = this.canvas?.height ?? this.root.clientHeight;\n const dataViewportHeight = Math.max(0, viewportHeight - this.headerHeight);\n const maxContentScrollTop = Math.max(0, totalRowsHeight - dataViewportHeight);\n const contentScrollTop = Math.max(0, Math.min(this.root.scrollTop, maxContentScrollTop));\n if (viewportY < headerHeight && viewportX < this.rowHeaderWidth) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n rect: new DOMRect(rect.left, rect.top, this.rowHeaderWidth, headerHeight),\n };\n }\n if (viewportY < headerHeight) {\n // Column header region (canvas)\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex >= 0) {\n const col = schema.columns[colIndex];\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top,\n colWidths[colIndex] ?? 100,\n headerHeight,\n );\n return { rowId: \"__header__\", colKey: col.key, rect: cellRect };\n }\n return null;\n }\n if (viewportX < this.rowHeaderWidth) {\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(\n 0,\n Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)),\n );\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n const row = rows[rowIndex];\n const topPx = rect.top + headerHeight + accumHeight - contentScrollTop;\n const cellRect = new DOMRect(\n rect.left,\n topPx,\n this.rowHeaderWidth,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: null, rect: cellRect };\n }\n const y = viewportY - headerHeight + contentScrollTop;\n const rowIndex = Math.max(0, Math.min(rows.length - 1, heightIndex.fenwick.lowerBound(y + 1)));\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n if (rowIndex < 0 || rowIndex >= rows.length) return null;\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n if (colIndex === -1) return null;\n const row = rows[rowIndex];\n const col = schema.columns[colIndex];\n const rowTop = accumHeight;\n const cellRect = new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + headerHeight + rowTop - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n return { rowId: row.id, colKey: col.key, rect: cellRect };\n }\n\n hitTestAction(event: MouseEvent) {\n if (!this.root || !this.canvas) return null;\n const hit = this.hitTest(event);\n if (!hit || !hit.rowId || !hit.colKey) return null;\n if (hit.rowId === \"__all__\" || hit.rowId === \"__header__\") return null;\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(hit.colKey));\n if (!col || (col.type !== \"button\" && col.type !== \"link\")) return null;\n const valueRes = this.dataModel.resolveCellValue(hit.rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(hit.rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return null;\n const actionValue =\n col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value);\n if (!actionValue || !actionValue.label) return null;\n\n const ctx = this.canvas.getContext(\"2d\");\n if (!ctx) return null;\n const baseStyle = columnFormatToStyle(col);\n const withCond = condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const cellStyle = this.dataModel.getCellStyle(hit.rowId, col.key);\n const mergedStyle = cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n const weight = mergedStyle.bold ? \"600 \" : \"\";\n const ital = mergedStyle.italic ? \"italic \" : \"\";\n ctx.save();\n ctx.font = `${ital}${weight}${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`.trim();\n ctx.textBaseline = \"alphabetic\";\n const view = this.dataModel.getView();\n const wrap = view.wrapText?.[col.key] ?? col.wrapText ?? false;\n const align = col.style?.align ?? \"left\";\n const textAreaX = hit.rect.left + CELL_PADDING_X_PX;\n const textAreaY = hit.rect.top + CELL_PADDING_TOP_PX;\n const textAreaW = Math.max(0, hit.rect.width - CELL_PADDING_X_PX * 2);\n const textAreaH = Math.max(\n 0,\n hit.rect.height - (CELL_PADDING_TOP_PX + CELL_PADDING_BOTTOM_PX),\n );\n const bounds = this.measureTextBounds(\n ctx,\n actionValue.label,\n textAreaX,\n textAreaY,\n textAreaW,\n textAreaH,\n wrap,\n align,\n );\n ctx.restore();\n if (!bounds) return null;\n const pad = col.type === \"button\" ? 6 : 2;\n const left = Math.max(hit.rect.left, bounds.x - pad);\n const top = Math.max(hit.rect.top, bounds.y - pad);\n const right = Math.min(hit.rect.right, bounds.x + bounds.width + pad);\n const bottom = Math.min(hit.rect.bottom, bounds.y + bounds.height + pad);\n if (\n event.clientX >= left &&\n event.clientX <= right &&\n event.clientY >= top &&\n event.clientY <= bottom\n ) {\n return { rowId: hit.rowId, colKey: String(hit.colKey), kind: col.type };\n }\n return null;\n }\n\n private isPointInSelection(rowId: string, colKey: string) {\n if (!this.selection.length) return false;\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return false;\n for (const range of this.selection) {\n if (range.kind !== \"cells\") continue;\n const startRow = Math.min(range.startRow, range.endRow);\n const endRow = Math.max(range.startRow, range.endRow);\n const startCol = Math.min(range.startCol, range.endCol);\n const endCol = Math.max(range.startCol, range.endCol);\n if (rowIndex >= startRow && rowIndex <= endRow && colIndex >= startCol && colIndex <= endCol)\n return true;\n }\n return false;\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.pendingCursorPoint = { x: ev.clientX, y: ev.clientY };\n if (this.cursorTimer) return;\n this.cursorTimer = window.setTimeout(() => {\n this.cursorTimer = null;\n const p = this.pendingCursorPoint;\n if (!p) return;\n this.updateCanvasCursor(p.x, p.y);\n }, 50);\n };\n\n private handlePointerLeave = () => {\n if (!this.canvas) return;\n this.canvas.style.cursor = \"cell\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (this.hoverActionKey || this.activeActionKey) {\n this.hoverActionKey = null;\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (!this.canvas) return;\n const actionHit = this.hitTestAction(\n new MouseEvent(\"mousemove\", { clientX: ev.clientX, clientY: ev.clientY }),\n );\n if (!actionHit || actionHit.kind !== \"button\") return;\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (interaction.disabled) return;\n const nextKey = `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}`;\n if (nextKey !== this.activeActionKey) {\n this.activeActionKey = nextKey;\n this.render();\n }\n };\n\n private handlePointerUp = () => {\n if (this.activeActionKey) {\n this.activeActionKey = null;\n this.render();\n }\n };\n\n private positionTooltipAtRect(rect: DOMRect) {\n if (!this.tooltip) return;\n if (!this.root) return;\n const pad = 8;\n const rootRect = this.root.getBoundingClientRect();\n const maxW = this.root.clientWidth;\n const maxH = this.root.clientHeight;\n let left = rect.right - rootRect.left + pad;\n let top = rect.top - rootRect.top + pad;\n let side: \"right\" | \"left\" = \"right\";\n const tRect = this.tooltip.getBoundingClientRect();\n if (left + tRect.width > maxW) {\n left = Math.max(0, rect.left - rootRect.left - tRect.width - pad);\n side = \"left\";\n }\n if (top + tRect.height > maxH) top = Math.max(0, maxH - tRect.height - pad);\n this.tooltip.style.left = `${left}px`;\n this.tooltip.style.top = `${top}px`;\n this.tooltip.dataset.side = side;\n }\n\n private refreshTooltipPosition() {\n if (!this.tooltip || this.tooltip.dataset.visible !== \"1\") return;\n if (!this.tooltipTarget || !this.tooltipMessage) return;\n const rect = this.getCellRect(this.tooltipTarget.rowId, this.tooltipTarget.colKey);\n if (!rect) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n return;\n }\n this.tooltip.textContent = this.tooltipMessage;\n this.positionTooltipAtRect(rect);\n }\n\n private getCellRect(rowId: string, colKey: string): DOMRect | null {\n if (!this.root || !this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => c.key === colKey);\n if (rowIndex < 0 || colIndex < 0) return null;\n const colWidths = getColumnWidths(schema, view);\n const wrapAny = schema.columns.some((c) => view.wrapText?.[c.key] ?? c.wrapText);\n const key = wrapAny ? this.getRowHeightCacheKey(schema, view, colWidths) : null;\n this.ensureHeightIndex(rows, key, wrapAny);\n const heightIndex = this.heightIndex;\n if (!heightIndex) return null;\n const accumHeight = heightIndex.fenwick.sum(rowIndex);\n let xCursor = this.rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) {\n xCursor += colWidths[i] ?? 100;\n }\n return new DOMRect(\n rect.left + xCursor - this.root.scrollLeft,\n rect.top + this.headerHeight + accumHeight - this.root.scrollTop,\n colWidths[colIndex] ?? 100,\n heightIndex.heights[rowIndex] ?? this.rowHeight,\n );\n }\n\n private updateCanvasCursor(clientX: number, clientY: number) {\n if (!this.root || !this.canvas) return;\n if (this.root.dataset.extableFillDragging === \"1\") {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n // Header hover (filter/sort icon affordance)\n {\n const rect = this.canvas.getBoundingClientRect();\n const viewportX = clientX - rect.left;\n const viewportY = clientY - rect.top;\n const x = viewportX + this.root.scrollLeft;\n const y = viewportY;\n const prevKey = this.hoverHeaderColKey;\n const prevIcon = this.hoverHeaderIcon;\n let nextKey: string | null = null;\n let nextIcon = false;\n if (y >= 0 && y < this.headerHeight && x >= this.rowHeaderWidth) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const colWidths = getColumnWidths(schema, view);\n let xCursor = this.rowHeaderWidth;\n let colIndex = -1;\n for (let i = 0; i < colWidths.length; i += 1) {\n const w = colWidths[i] ?? 100;\n if (x >= xCursor && x <= xCursor + w) {\n colIndex = i;\n break;\n }\n xCursor += w;\n }\n const col = colIndex >= 0 ? schema.columns[colIndex] : null;\n if (col) {\n nextKey = col.key;\n const w = colWidths[colIndex] ?? 100;\n const iconSize = 18;\n const pad = 4;\n const iconLeft = xCursor + w - iconSize - pad;\n const iconTop = Math.floor((this.headerHeight - iconSize) / 2);\n nextIcon =\n x >= iconLeft && x <= iconLeft + iconSize && y >= iconTop && y <= iconTop + iconSize;\n }\n }\n const changed =\n String(prevKey ?? \"\") !== String(nextKey ?? \"\") || Boolean(prevIcon) !== Boolean(nextIcon);\n this.hoverHeaderColKey = nextKey;\n this.hoverHeaderIcon = nextIcon;\n if (nextKey !== null) {\n this.canvas.style.cursor = nextIcon ? \"pointer\" : \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n if (changed) this.render();\n return;\n }\n if (changed) this.render();\n }\n // Cursor spec:\n // - No selection or outside selection: cell\n // - Inside selection & on fill handle: crosshair\n // - Inside selection & readonly/boolean: default\n // - Inside selection & others: text\n let cursor = \"cell\";\n\n const hit = this.hitTest(new MouseEvent(\"mousemove\", { clientX, clientY }));\n if (!hit) {\n this.canvas.style.cursor = cursor;\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.hoverActionKey = null;\n return;\n }\n if (hit.colKey === \"__all__\" || hit.colKey === null) {\n this.canvas.style.cursor = \"default\";\n if (this.tooltip) this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n this.hoverActionKey = null;\n return;\n }\n // In readonly editMode, keep spreadsheet-like cursor for all body cells.\n if (this.getEditMode() === \"readonly\") {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n const marker = this.dataModel.getCellMarker(hit.rowId, hit.colKey);\n if (this.tooltip && marker) {\n const sameCell =\n this.tooltipTarget &&\n this.tooltipTarget.rowId === hit.rowId &&\n this.tooltipTarget.colKey === hit.colKey;\n const sameMessage = this.tooltipMessage === marker.message;\n if (!sameCell || !sameMessage || this.tooltip.dataset.visible !== \"1\") {\n this.tooltipTarget = { rowId: hit.rowId, colKey: hit.colKey };\n this.tooltipMessage = marker.message;\n this.tooltip.textContent = marker.message;\n const rect = this.getCellRect(hit.rowId, hit.colKey);\n if (rect) {\n this.positionTooltipAtRect(rect);\n this.tooltip.dataset.visible = \"1\";\n } else {\n this.tooltip.dataset.visible = \"0\";\n }\n }\n } else if (this.tooltip) {\n this.tooltip.dataset.visible = \"0\";\n this.tooltipTarget = null;\n this.tooltipMessage = null;\n }\n\n const actionHit = this.hitTestAction(new MouseEvent(\"mousemove\", { clientX, clientY }));\n const nextHoverKey = actionHit ? `${actionHit.rowId}::${actionHit.colKey}::${actionHit.kind}` : null;\n if (nextHoverKey !== this.hoverActionKey) {\n this.hoverActionKey = nextHoverKey;\n this.render();\n }\n if (actionHit) {\n const interaction = this.dataModel.getCellInteraction(actionHit.rowId, actionHit.colKey);\n if (!interaction.disabled) {\n this.canvas.style.cursor = \"pointer\";\n return;\n }\n }\n\n if (!this.isPointInSelection(hit.rowId, hit.colKey)) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Only the active cell shows edit-mode cursor affordances. Other selected cells stay `cell`.\n const isActiveCell =\n this.activeRowId === hit.rowId &&\n this.activeColKey !== null &&\n this.activeColKey === hit.colKey;\n if (!isActiveCell) {\n this.canvas.style.cursor = \"cell\";\n return;\n }\n\n // Fill handle hover is only considered inside the active cell and when fill handle is shown.\n if (\n this.activeRowId &&\n this.activeColKey !== null &&\n this.activeRowId !== \"__all__\" &&\n this.activeColKey !== \"__all__\" &&\n shouldShowFillHandle(\n this.dataModel,\n this.selection,\n this.activeRowId,\n this.activeColKey,\n this.getEditMode(),\n )\n ) {\n const cellRect = this.getCellRect(this.activeRowId, this.activeColKey);\n if (cellRect) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(clientX, clientY, handleRect)) {\n this.canvas.style.cursor = \"crosshair\";\n return;\n }\n }\n }\n\n const col = this.dataModel.getSchema().columns.find((c) => c.key === hit.colKey);\n const interaction = this.dataModel.getCellInteraction(hit.rowId, hit.colKey);\n if (interaction.readonly || col?.type === \"boolean\") cursor = \"default\";\n else cursor = \"text\";\n this.canvas.style.cursor = cursor;\n }\n\n private measureRowHeight(\n ctx: CanvasRenderingContext2D,\n row: InternalRow,\n schema: Schema,\n colWidths: number[],\n ) {\n let maxHeight = this.rowHeight;\n const view = this.dataModel.getView();\n for (let idx = 0; idx < schema.columns.length; idx += 1) {\n const c = schema.columns[idx];\n if (!c) continue;\n const wrap = view.wrapText?.[c.key] ?? c.wrapText;\n if (!wrap) continue;\n const w = (colWidths[idx] ?? 100) - this.padding;\n const valueRes = this.dataModel.resolveCellValue(row.id, c);\n const condRes = this.dataModel.resolveConditionalStyle(row.id, c);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n const text = textOverride ? \"#ERROR\" : this.formatValue(valueRes.value, c).text;\n const lines = this.wrapLines(ctx, text, w);\n const h = lines.length * this.lineHeight + this.padding;\n maxHeight = Math.max(maxHeight, h);\n }\n return maxHeight;\n }\n\n private wrapLines(ctx: CanvasRenderingContext2D, text: string, width: number) {\n const key = `${ctx.font}|${width}|${text}`;\n const cached = this.textMeasureCache.get(key);\n if (cached) {\n // LRU refresh\n this.textMeasureCache.delete(key);\n this.textMeasureCache.set(key, cached);\n return cached.lines;\n }\n const rawLines = text.split(\"\\n\");\n const lines: string[] = [];\n for (const line of rawLines) {\n let current = line;\n while (ctx.measureText(current).width > width && current.length > 1) {\n let cut = current.length;\n while (cut > 1 && ctx.measureText(current.slice(0, cut)).width > width) {\n cut -= 1;\n }\n lines.push(current.slice(0, cut));\n current = current.slice(cut);\n }\n lines.push(current);\n }\n this.textMeasureCache.set(key, { lines });\n while (this.textMeasureCache.size > CanvasRenderer.TEXT_MEASURE_CACHE_MAX) {\n const firstKey = this.textMeasureCache.keys().next().value as string | undefined;\n if (!firstKey) break;\n this.textMeasureCache.delete(firstKey);\n }\n return lines;\n }\n\n private fitTextLine(ctx: CanvasRenderingContext2D, text: string, width: number) {\n let out = text;\n while (ctx.measureText(out).width > width && out.length > 1) {\n out = `${out.slice(0, -2)}…`;\n }\n return out;\n }\n\n private getTextLinesForBounds(\n ctx: CanvasRenderingContext2D,\n text: string,\n width: number,\n wrap: boolean,\n height: number,\n ) {\n const raw = wrap ? this.wrapLines(ctx, text, width) : [this.fitTextLine(ctx, text, width)];\n const maxLines = Math.max(1, Math.floor(height / this.lineHeight));\n return raw.slice(0, maxLines);\n }\n\n private measureTextBounds(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\",\n ): DOMRect | null {\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n if (!lines.length) return null;\n let minX = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx] ?? \"\";\n const lineWidth = ctx.measureText(line).width;\n let startX = x;\n if (align === \"right\") startX = x + width - lineWidth;\n else if (align === \"center\") startX = x + (width - lineWidth) / 2;\n const lineTop = y + this.lineHeight * idx;\n const lineBottom = lineTop + this.lineHeight;\n minX = Math.min(minX, startX);\n maxX = Math.max(maxX, startX + lineWidth);\n minY = Math.min(minY, lineTop);\n maxY = Math.max(maxY, lineBottom);\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) return null;\n return new DOMRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n private drawCellText(\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n width: number,\n height: number,\n wrap: boolean,\n align: \"left\" | \"right\" | \"center\" = \"left\",\n isBoolean = false,\n isCustomBoolean = false,\n decorations?: { underline?: boolean; strike?: boolean },\n ) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x - 4, y - 4, width + 8, height + 8);\n ctx.clip();\n const fontBackup = ctx.font;\n if (isBoolean) {\n ctx.font = \"28px sans-serif\";\n } else if (isCustomBoolean) {\n ctx.font = `${CANVAS_FONT_SIZE_PX}px ${CANVAS_FONT_FAMILY}`;\n }\n const lines = this.getTextLinesForBounds(ctx, text, width, wrap, height);\n const totalTextHeight = lines.length * this.lineHeight;\n const baseY = y + Math.max(0, Math.floor((height - totalTextHeight) / 2));\n const renderLine = (ln: string, lineIdx: number) => {\n const baseline = baseY + this.lineHeight * lineIdx;\n let startX = x;\n let endX = x;\n if (align === \"right\") {\n ctx.textAlign = \"right\";\n endX = x + width;\n startX = endX - ctx.measureText(ln).width;\n ctx.fillText(ln, endX, baseline);\n } else if (align === \"center\") {\n ctx.textAlign = \"center\";\n const center = x + width / 2;\n const w = ctx.measureText(ln).width;\n startX = center - w / 2;\n endX = center + w / 2;\n ctx.fillText(ln, center, baseline);\n } else {\n ctx.textAlign = \"left\";\n startX = x;\n endX = x + ctx.measureText(ln).width;\n ctx.fillText(ln, x, baseline);\n }\n if (decorations?.underline || decorations?.strike) {\n const strokeBackup = ctx.strokeStyle;\n const lineWidthBackup = ctx.lineWidth;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.lineWidth = 1;\n ctx.beginPath();\n if (decorations.underline) {\n const yUnderline = baseline + 2;\n ctx.moveTo(startX, yUnderline);\n ctx.lineTo(endX, yUnderline);\n }\n if (decorations.strike) {\n const yStrike = baseline - Math.floor(this.lineHeight / 2) + 2;\n ctx.moveTo(startX, yStrike);\n ctx.lineTo(endX, yStrike);\n }\n ctx.stroke();\n ctx.strokeStyle = strokeBackup;\n ctx.lineWidth = lineWidthBackup;\n }\n };\n for (let idx = 0; idx < lines.length; idx += 1) {\n renderLine(lines[idx] ?? \"\", idx + 1);\n }\n ctx.textAlign = \"left\";\n ctx.font = fontBackup;\n ctx.restore();\n }\n\n private formatValue(value: unknown, col: ColumnSchema): { text: string; color?: string } {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.type === \"button\") {\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n }\n if (col.type === \"tags\") {\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n }\n if (col.type === \"boolean\") {\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n }\n if (col.type === \"number\" && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n const text = formatNumberForEdit(num, { format: \"scientific\", precision: fmt?.precision });\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n if ((col.type === \"int\" || col.type === \"uint\") && typeof value === \"number\") {\n const num = value;\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n const text = formatIntegerWithPrefix(num, token);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n\n const opts: Intl.NumberFormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n };\n const text = this.valueFormatCache.getNumberFormatter(opts).format(num);\n const color = fmt?.negativeRed && num < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n }\n if (\n (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") &&\n (value instanceof Date || typeof value === \"string\")\n ) {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? (fmtValue ?? \"yyyy-MM-dd\")\n : col.type === \"time\"\n ? (fmtValue ?? \"HH:mm\")\n : (fmtValue ?? \"yyyy-MM-dd'T'HH:mm:ss'Z'\");\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else {\n d = this.valueFormatCache.parseIsoDate(value);\n }\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n }\n return { text: String(value) };\n }\n}\n","import type { CellAction, Command, EditMode, SelectionRange } from \"./types\";\nimport type { DataModel } from \"./dataModel\";\nimport {\n coerceNumericForColumn,\n formatIntegerWithPrefix,\n formatNumberForEdit,\n normalizeNumericInput,\n parseNumericText,\n} from \"./numberIO\";\nimport {\n FILL_HANDLE_HIT_SIZE_PX,\n getFillHandleRect,\n getFillHandleSource,\n isPointInRect,\n makeFillValueGetter,\n shouldShowFillHandle,\n} from \"./fillHandle\";\nimport { removeFromParent } from \"./utils\";\nimport {\n DEFAULT_ROW_HEIGHT_PX,\n HEADER_HEIGHT_PX,\n ROW_HEADER_WIDTH_PX,\n CELL_PADDING_X_PX,\n CELL_PADDING_TOP_PX,\n CELL_PADDING_BOTTOM_PX,\n getColumnWidths,\n} from \"./geometry\";\nimport { resolveButtonAction, resolveLinkAction } from \"./actionValue\";\n\ntype EditHandler = (cmd: Command, commit: boolean) => void;\ntype RowSelectHandler = (rowId: string) => void;\ntype MoveHandler = (rowId?: string) => void;\ntype HitTest = (\n event: MouseEvent,\n) => { rowId: string; colKey: string | null; element?: HTMLElement; rect: DOMRect } | null;\ntype ActionHitTest = (\n event: MouseEvent,\n) =>\n | { rowId: string; colKey: string; kind: \"button\" | \"link\" }\n | { rowId: string; colKey: string; kind: \"tag-remove\"; tagIndex: number }\n | null;\ntype ActiveChange = (rowId: string | null, colKey: string | null) => void;\ntype ContextMenuHandler = (\n rowId: string | null,\n colKey: string | null,\n clientX: number,\n clientY: number,\n) => void;\ntype SelectionChange = (ranges: SelectionRange[]) => void;\ntype UndoRedoHandler = () => void;\ntype ActionHandler = (action: CellAction) => void;\n\nexport class SelectionManager {\n private root: HTMLElement;\n private editMode: EditMode;\n private onEdit: EditHandler;\n private onRowSelect: RowSelectHandler;\n private onMove: MoveHandler;\n private hitTest: HitTest;\n private hitAction: ActionHitTest | null = null;\n private onContextMenu: ContextMenuHandler;\n private handleDocumentContextMenu: ((ev: MouseEvent) => void) | null = null;\n private selectionRanges: SelectionRange[] = [];\n private inputEl: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null = null;\n private floatingInputWrapper: HTMLDivElement | null = null;\n private selectionInput: HTMLInputElement | null = null;\n private copyToastEl: HTMLDivElement | null = null;\n private copyToastTimer: number | null = null;\n private selectionMode = true;\n private lastBooleanCell: { rowId: string; colKey: string } | null = null;\n private selectionAnchor: { rowIndex: number; colIndex: number } | null = null;\n private dragging = false;\n private dragStart: { rowIndex: number; colIndex: number; kind: \"cells\" | \"rows\" } | null = null;\n private pointerDownClient: { x: number; y: number } | null = null;\n private dragMoved = false;\n private dragSelectionChanged = false;\n private suppressNextClick = false;\n private fillDragging = false;\n private fillSource: import(\"./fillHandle\").FillHandleSource | null = null;\n private fillEndRowIndex: number | null = null;\n private rootCursorBackup: string | null = null;\n private lastPointerClient: { x: number; y: number } | null = null;\n private autoScrollRaf: number | null = null;\n private autoScrollActive = false;\n private activeCell: { rowId: string; colKey: string | null } | null = null;\n private activeHost: HTMLElement | null = null;\n private activeHostOriginalText: string | null = null;\n private activeOriginalValue: { rowId: string; colKey: string; value: unknown } | null = null;\n private composing = false;\n private lastCompositionEnd = 0;\n private readonly handleInputCompositionStart = () => {\n this.composing = true;\n };\n private readonly handleInputCompositionEnd = () => {\n this.composing = false;\n this.lastCompositionEnd = Date.now();\n };\n private readonly handleSelectionBlur = () => this.teardownSelectionInput();\n private readonly handleRootKeydown = async (ev: KeyboardEvent) => {\n if (ev.defaultPrevented) return;\n if (!this.selectionMode) return;\n if (this.inputEl) return;\n if (ev.isComposing || this.composing) return;\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (!accel) return;\n const key = ev.key.toLowerCase();\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n } else if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n }\n };\n private isCellReadonly: (rowId: string, colKey: string) => boolean;\n private sequenceLangs?: readonly string[];\n private onCellAction: ActionHandler;\n\n constructor(\n root: HTMLElement,\n editMode: EditMode,\n onEdit: EditHandler,\n onRowSelect: RowSelectHandler,\n onMove: MoveHandler,\n hitTest: HitTest,\n hitAction: ActionHitTest | null,\n private dataModel: DataModel,\n sequenceLangs: readonly string[] | undefined,\n isCellReadonly: (rowId: string, colKey: string) => boolean,\n onCellAction: ActionHandler,\n private onActiveChange: ActiveChange,\n onContextMenu: ContextMenuHandler,\n private onSelectionChange: SelectionChange,\n private onUndo: UndoRedoHandler,\n private onRedo: UndoRedoHandler,\n ) {\n this.root = root;\n this.editMode = editMode;\n this.onEdit = onEdit;\n this.onRowSelect = onRowSelect;\n this.onMove = onMove;\n this.hitTest = hitTest;\n this.hitAction = hitAction;\n this.sequenceLangs = sequenceLangs;\n this.isCellReadonly = isCellReadonly;\n this.onCellAction = onCellAction;\n this.onContextMenu = onContextMenu;\n this.bind();\n }\n\n setEditMode(mode: EditMode) {\n this.editMode = mode;\n }\n\n syncAfterRowsChanged() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) {\n this.selectionRanges = [];\n this.activeCell = null;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(true);\n this.onActiveChange(null, null);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n const maxRow = rows.length - 1;\n const maxCol = schema.columns.length - 1;\n\n const activeRowId = this.activeCell?.rowId ?? null;\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : -1;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : -1;\n\n // If current active cell is still visible, just clamp selection ranges when needed.\n if (activeRowIndex >= 0 && activeColIndex >= 0) {\n let changed = false;\n if (!this.selectionRanges.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: activeRowIndex,\n endRow: activeRowIndex,\n startCol: activeColIndex,\n endCol: activeColIndex,\n },\n ];\n changed = true;\n } else {\n const nextRanges: SelectionRange[] = this.selectionRanges.map((r) => {\n const clamp = (n: number, max: number) => Math.max(0, Math.min(max, n));\n const next: SelectionRange = {\n ...r,\n startRow: clamp(r.startRow, maxRow),\n endRow: clamp(r.endRow, maxRow),\n startCol: clamp(r.startCol, maxCol),\n endCol: clamp(r.endCol, maxCol),\n };\n if (\n next.startRow !== r.startRow ||\n next.endRow !== r.endRow ||\n next.startCol !== r.startCol ||\n next.endCol !== r.endCol\n ) {\n changed = true;\n }\n return next;\n });\n this.selectionRanges = nextRanges;\n }\n if (changed) this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n return;\n }\n\n // Active row got filtered out (or active col disappeared): move to the nearest visible row/col.\n const desiredColKey = activeColKey ?? schema.columns[0]?.key ?? \"\";\n let colIndex = schema.columns.findIndex((c) => String(c.key) === String(desiredColKey));\n if (colIndex < 0) colIndex = 0;\n const colKey = schema.columns[colIndex]?.key ?? \"\";\n\n const baseIndex = activeRowId ? this.dataModel.getBaseRowIndex(activeRowId) : 0;\n const fallbackRow = rows[rows.length - 1] ?? rows[0] ?? null;\n const nextRow =\n rows.find((r) => this.dataModel.getBaseRowIndex(r.id) >= baseIndex) ?? fallbackRow;\n if (!nextRow) return;\n const rowId = nextRow.id;\n const rowIndex = this.dataModel.getRowIndex(rowId);\n\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n navigateToCell(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const rowIndex = this.dataModel.getRowIndex(rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return;\n this.selectionAnchor = null;\n this.lastBooleanCell = null;\n this.teardownInput(false);\n const nextRange: SelectionRange = {\n kind: \"cells\",\n startRow: rowIndex,\n endRow: rowIndex,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n const current = this.dataModel.getCell(rowId, colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n this.updateFillHandleFlag();\n }\n\n cancelEditing() {\n this.teardownInput(true);\n }\n\n destroy() {\n this.root.removeEventListener(\"click\", this.handleClick);\n this.root.removeEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.removeEventListener(\"pointermove\", this.handlePointerMove);\n this.root.removeEventListener(\"pointerup\", this.handlePointerUp);\n this.root.removeEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.removeEventListener(\"keydown\", this.handleRootKeydown);\n if (this.handleDocumentContextMenu) {\n document.removeEventListener(\"contextmenu\", this.handleDocumentContextMenu, true);\n }\n this.teardownInput(true);\n this.teardownSelectionInput();\n this.teardownCopyToast();\n this.stopAutoScroll();\n }\n\n onScroll(scrollTop: number, scrollLeft: number) {\n // Editors are positioned in scroll-container content coordinates and follow scroll automatically.\n void scrollTop;\n void scrollLeft;\n this.positionCopyToast();\n }\n\n private bind() {\n this.root.addEventListener(\"click\", this.handleClick);\n this.root.addEventListener(\"pointerdown\", this.handlePointerDown);\n this.root.addEventListener(\"pointermove\", this.handlePointerMove);\n this.root.addEventListener(\"pointerup\", this.handlePointerUp);\n this.root.addEventListener(\"pointercancel\", this.handlePointerUp);\n this.root.addEventListener(\"keydown\", this.handleRootKeydown);\n this.handleDocumentContextMenu = (ev: MouseEvent) => this.handleContextMenu(ev);\n document.addEventListener(\"contextmenu\", this.handleDocumentContextMenu, { capture: true });\n }\n\n private updateFillHandleFlag() {\n const activeColKey = this.activeCell?.colKey ?? null;\n const activeRowId = this.activeCell?.rowId ?? null;\n this.root.dataset.extableFillHandle = shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n activeRowId,\n activeColKey,\n this.editMode,\n )\n ? \"1\"\n : \"\";\n }\n\n private findColumn(colKey: string) {\n const schema = this.dataModel.getSchema();\n return schema.columns.find((c) => c.key === colKey);\n }\n\n private pad2(n: number) {\n return String(n).padStart(2, \"0\");\n }\n\n private formatLocalDateForInput(d: Date) {\n return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())}`;\n }\n\n private formatLocalTimeForInput(d: Date) {\n return `${this.pad2(d.getHours())}:${this.pad2(d.getMinutes())}`;\n }\n\n private formatLocalDateTimeForInput(d: Date) {\n return `${this.formatLocalDateForInput(d)}T${this.formatLocalTimeForInput(d)}`;\n }\n\n private normalizeTemporalInitialValue(colType: \"date\" | \"time\" | \"datetime\", initial: string) {\n const value = initial.trim();\n if (!value) return \"\";\n\n if (colType === \"date\") {\n const m = value.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateForInput(d);\n return \"\";\n }\n\n if (colType === \"time\") {\n const m = value.match(/(\\d{2}:\\d{2})(?::\\d{2})?/);\n if (m) return m[1] ?? \"\";\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalTimeForInput(d);\n return \"\";\n }\n\n // datetime => input[type=\"datetime-local\"] expects \"YYYY-MM-DDTHH:mm\" (no timezone).\n if (/Z$/.test(value) && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value)) {\n return value.replace(/Z$/, \"\").slice(0, 16);\n }\n if (\n /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}/.test(value) &&\n !/[+-]\\d{2}:\\d{2}$/.test(value)\n ) {\n return value.slice(0, 16);\n }\n const d = new Date(value);\n if (!Number.isNaN(d.getTime())) return this.formatLocalDateTimeForInput(d);\n return \"\";\n }\n\n private ensureCopyToast() {\n if (this.copyToastEl) return this.copyToastEl;\n // Ensure a positioning context for the toast.\n const computed = window.getComputedStyle(this.root);\n if (computed.position === \"static\") {\n this.root.style.position = \"relative\";\n }\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.dataset.extableCopyToast = \"1\";\n toast.style.position = \"absolute\";\n toast.style.left = \"0\";\n toast.style.top = \"0\";\n toast.style.pointerEvents = \"none\";\n toast.style.zIndex = \"1000\";\n toast.style.display = \"none\";\n // Keep it from affecting layout.\n toast.style.margin = \"0\";\n this.root.appendChild(toast);\n this.copyToastEl = toast;\n return toast;\n }\n\n private teardownCopyToast() {\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n if (!this.copyToastEl) return;\n this.copyToastEl.style.display = \"none\";\n removeFromParent(this.copyToastEl);\n this.copyToastEl = null;\n }\n\n private positionCopyToast() {\n if (!this.copyToastEl) return;\n const w = this.copyToastEl.offsetWidth || 0;\n const h = this.copyToastEl.offsetHeight || 0;\n const inset = 16;\n const maxLeft = Math.max(0, this.root.scrollLeft + this.root.clientWidth - w - inset);\n const maxTop = Math.max(0, this.root.scrollTop + this.root.clientHeight - h - inset);\n const minLeft = Math.max(0, this.root.scrollLeft + inset);\n const minTop = Math.max(0, this.root.scrollTop + inset);\n const rootRect = this.root.getBoundingClientRect();\n const rect = this.getActiveCellRect();\n if (rect) {\n const candidateLeft = rect.right - rootRect.left + this.root.scrollLeft - w + 8;\n const candidateTop = rect.top - rootRect.top + this.root.scrollTop - h + 8;\n const left = Math.min(maxLeft, Math.max(minLeft, candidateLeft));\n const top = Math.min(maxTop, Math.max(minTop, candidateTop));\n this.copyToastEl.style.left = `${left}px`;\n this.copyToastEl.style.top = `${top}px`;\n return;\n }\n this.copyToastEl.style.left = `${maxLeft}px`;\n this.copyToastEl.style.top = `${maxTop}px`;\n }\n\n private showCopyToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 1200) {\n const toast = this.ensureCopyToast();\n toast.textContent = message;\n toast.dataset.variant = variant;\n toast.style.display = \"block\";\n this.positionCopyToast();\n if (this.copyToastTimer) {\n window.clearTimeout(this.copyToastTimer);\n this.copyToastTimer = null;\n }\n this.copyToastTimer = window.setTimeout(() => {\n toast.style.display = \"none\";\n }, durationMs);\n }\n\n private ensureSelectionInput() {\n if (this.selectionInput) return this.selectionInput;\n const input = document.createElement(\"input\");\n input.type = \"text\";\n // This input exists only to receive keyboard/clipboard/IME events in selection mode.\n // It is not a text editor.\n input.readOnly = true;\n // Helps suppress virtual keyboards; also reduces IME oddities on some platforms.\n input.inputMode = \"none\";\n input.autocomplete = \"off\";\n input.spellcheck = false;\n input.style.position = \"absolute\";\n input.style.left = \"0\";\n input.style.top = \"0\";\n // Avoid affecting scroll extents in the scroll container.\n input.style.transform = \"translate(-10000px, 0)\";\n input.style.width = \"1px\";\n input.style.height = \"1px\";\n input.style.opacity = \"0\";\n input.style.pointerEvents = \"none\";\n input.addEventListener(\"keydown\", this.handleSelectionKeydown);\n input.addEventListener(\"beforeinput\", this.handleSelectionBeforeInput);\n input.addEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.addEventListener(\"copy\", this.handleSelectionCopy);\n input.addEventListener(\"cut\", this.handleSelectionCut);\n input.addEventListener(\"paste\", this.handleSelectionPaste);\n input.addEventListener(\"blur\", this.handleSelectionBlur);\n // Keep the selection input inside the table container (root), but offscreen.\n this.root.appendChild(input);\n this.selectionInput = input;\n return input;\n }\n\n private focusSelectionInput(valueForSelection: string) {\n const input = this.ensureSelectionInput();\n input.value = valueForSelection;\n this.selectionMode = true;\n input.focus({ preventScroll: true });\n input.select();\n }\n\n private openEditorAtActiveCell(options?: {\n initialValueOverride?: string;\n placeCursorAtEnd?: boolean;\n }) {\n if (!this.activeCell) return;\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const cell = this.findHtmlCellElement(rowId, colKey);\n if (cell) {\n this.activateCellElement(cell, rowId, colKey, options);\n return;\n }\n const rect = this.computeCanvasCellRect(rowId, colKey);\n if (rect) {\n this.activateFloating(rect, rowId, colKey, options);\n }\n }\n\n private escapeCssAttrValue(value: string) {\n const css = (globalThis as unknown as { CSS?: { escape?: (s: string) => string } }).CSS;\n const escapeFn = css?.escape;\n if (typeof escapeFn === \"function\") return escapeFn(value);\n // Minimal escaping for attribute selector values inside double quotes.\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n }\n\n private findHtmlCellElement(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const key = String(colKey);\n const rowIdEsc = this.escapeCssAttrValue(rowId);\n const keyEsc = this.escapeCssAttrValue(key);\n return (\n this.root.querySelector<HTMLElement>(\n `tr[data-row-id=\"${rowIdEsc}\"] td[data-col-key=\"${keyEsc}\"]`,\n ) ?? null\n );\n }\n\n private computeCanvasCellRect(rowId: string, colKey: string | null) {\n if (colKey === null) return null;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return null;\n const rootRect = this.root.getBoundingClientRect();\n return new DOMRect(\n rootRect.left + box.left - this.root.scrollLeft,\n rootRect.top + box.top - this.root.scrollTop,\n box.width,\n box.height,\n );\n }\n\n private computeCanvasCellBoxContent(rowId: string, colKey: string) {\n const canvas = this.root.querySelector<HTMLCanvasElement>(\n 'canvas[data-extable-renderer=\"canvas\"]',\n );\n if (!canvas) return null;\n return this.getCanvasCellMetrics(rowId, colKey);\n }\n\n private getCanvasCellMetrics(rowId: string, colKey: string) {\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n const rows = this.dataModel.listRows();\n const rowIndex = rows.findIndex((r) => r.id === rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(colKey));\n if (rowIndex < 0 || colIndex < 0) return null;\n\n const headerHeight = HEADER_HEIGHT_PX;\n const rowHeaderWidth = ROW_HEADER_WIDTH_PX;\n const defaultRowHeight = DEFAULT_ROW_HEIGHT_PX;\n const colWidths = getColumnWidths(schema, view);\n\n let left = rowHeaderWidth;\n for (let i = 0; i < colIndex; i += 1) left += colWidths[i] ?? 100;\n\n let top = headerHeight;\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) return null;\n const h = this.dataModel.getRowHeight(row.id) ?? defaultRowHeight;\n top += h;\n }\n const height = this.dataModel.getRowHeight(rowId) ?? defaultRowHeight;\n const width = colWidths[colIndex] ?? 100;\n return { left, top, width, height, rowIndex, colIndex };\n }\n\n private getActiveCellRect() {\n const active = this.activeCell;\n if (!active) return null;\n const rootRect = this.root.getBoundingClientRect();\n const schema = this.dataModel.getSchema();\n const view = this.dataModel.getView();\n if (active.rowId === \"__all__\" && active.colKey === \"__all__\") {\n return new DOMRect(rootRect.left, rootRect.top, ROW_HEADER_WIDTH_PX, HEADER_HEIGHT_PX);\n }\n if (active.rowId === \"__header__\" && active.colKey !== null) {\n const key = this.escapeCssAttrValue(String(active.colKey));\n const headerEl = this.root.querySelector<HTMLElement>(`th[data-col-key=\"${key}\"]`);\n if (headerEl) return headerEl.getBoundingClientRect();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(active.colKey));\n if (colIndex >= 0) {\n const colWidths = getColumnWidths(schema, view);\n let x = ROW_HEADER_WIDTH_PX;\n for (let i = 0; i < colIndex; i += 1) x += colWidths[i] ?? 100;\n const width = colWidths[colIndex] ?? 100;\n return new DOMRect(\n rootRect.left + x - this.root.scrollLeft,\n rootRect.top,\n width,\n HEADER_HEIGHT_PX,\n );\n }\n }\n if (active.colKey === null) {\n const rowIndex = this.dataModel.getRowIndex(active.rowId);\n if (rowIndex >= 0) {\n let y = HEADER_HEIGHT_PX;\n const rows = this.dataModel.listRows();\n for (let i = 0; i < rowIndex; i += 1) {\n const row = rows[i];\n if (!row) break;\n y += this.dataModel.getRowHeight(row.id) ?? DEFAULT_ROW_HEIGHT_PX;\n }\n const height = this.dataModel.getRowHeight(active.rowId) ?? DEFAULT_ROW_HEIGHT_PX;\n return new DOMRect(\n rootRect.left,\n rootRect.top + y - this.root.scrollTop,\n ROW_HEADER_WIDTH_PX,\n height,\n );\n }\n }\n if (active.colKey === null) return null;\n const cellEl = this.findHtmlCellElement(active.rowId, active.colKey);\n if (cellEl) return cellEl.getBoundingClientRect();\n return this.computeCanvasCellRect(active.rowId, active.colKey);\n }\n\n private ensureVisibleCell(rowId: string, colKey: string) {\n const htmlCell = this.findHtmlCellElement(rowId, colKey);\n if (htmlCell) {\n if (typeof (htmlCell as HTMLElement).scrollIntoView === \"function\") {\n (htmlCell as HTMLElement).scrollIntoView({ block: \"nearest\", inline: \"nearest\" });\n }\n return;\n }\n const metrics = this.getCanvasCellMetrics(rowId, colKey);\n if (!metrics) return;\n const xStart = metrics.left;\n const xEnd = metrics.left + metrics.width;\n const yStart = metrics.top;\n const yEnd = metrics.top + metrics.height;\n\n const leftVis = this.root.scrollLeft;\n const rightVis = this.root.scrollLeft + this.root.clientWidth;\n const topVis = this.root.scrollTop;\n const bottomVis = this.root.scrollTop + this.root.clientHeight;\n\n if (xStart < leftVis) this.root.scrollLeft = Math.max(0, xStart);\n else if (xEnd > rightVis) this.root.scrollLeft = Math.max(0, xEnd - this.root.clientWidth);\n\n if (yStart < topVis) this.root.scrollTop = Math.max(0, yStart);\n else if (yEnd > bottomVis) this.root.scrollTop = Math.max(0, yEnd - this.root.clientHeight);\n }\n\n private moveActiveCell(deltaRow: number, deltaCol: number, extendSelection = false) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n if (!rows.length || !schema.columns.length) return;\n const { rowIndex, colIndex } = this.getActiveIndices();\n if (!extendSelection) this.selectionAnchor = null;\n const anchor =\n extendSelection && this.selectionAnchor\n ? this.selectionAnchor\n : extendSelection\n ? { rowIndex, colIndex }\n : null;\n if (extendSelection && !this.selectionAnchor) this.selectionAnchor = { rowIndex, colIndex };\n const nextRowIndex = Math.max(0, Math.min(rows.length - 1, rowIndex + deltaRow));\n const nextColIndex = Math.max(0, Math.min(schema.columns.length - 1, colIndex + deltaCol));\n {\n const row = rows[nextRowIndex];\n if (!row) return;\n const col = schema.columns[nextColIndex];\n if (!col) return;\n const rowId = row.id;\n const colKey = col.key;\n\n const nextRange: SelectionRange = anchor\n ? {\n kind: \"cells\",\n startRow: anchor.rowIndex,\n endRow: nextRowIndex,\n startCol: anchor.colIndex,\n endCol: nextColIndex,\n }\n : {\n kind: \"cells\",\n startRow: nextRowIndex,\n endRow: nextRowIndex,\n startCol: nextColIndex,\n endCol: nextColIndex,\n };\n this.selectionRanges = [nextRange];\n this.activeCell = { rowId, colKey };\n this.onActiveChange(rowId, colKey);\n this.onSelectionChange(this.selectionRanges);\n this.ensureVisibleCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n this.updateFillHandleFlag();\n return;\n }\n }\n\n private handlePointerDown = (ev: PointerEvent) => {\n if (ev.button !== 0) return;\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) return;\n if (el?.closest(\".extable-filter-sort-trigger\")) return;\n // Avoid starting a drag from inside an active editor.\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) return;\n // Commit current editor before starting a drag/select operation.\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n if (!this.tryCommitActiveEditor()) return;\n }\n if (this.fillDragging) return;\n const hit = this.hitTest(ev as unknown as MouseEvent);\n if (!hit) return;\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") return;\n if (hit.colKey === \"__all__\") return;\n\n // Fill handle drag starts only when the pointer is down on the handle area.\n const fillSrc = getFillHandleSource(this.dataModel, this.selectionRanges);\n if (fillSrc && this.activeCell) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const handleRowIndex = fillSrc.endRowIndex;\n const handleColIndex = fillSrc.colIndex;\n const handleRow = rows[handleRowIndex];\n const handleCol = schema.columns[handleColIndex];\n if (handleRow && handleCol) {\n const cellRect =\n this.findHtmlCellElement(handleRow.id, handleCol.key)?.getBoundingClientRect() ??\n this.computeCanvasCellRect(handleRow.id, handleCol.key);\n if (\n cellRect &&\n shouldShowFillHandle(\n this.dataModel,\n this.selectionRanges,\n this.activeCell.rowId,\n this.activeCell.colKey,\n this.editMode,\n )\n ) {\n const handleRect = getFillHandleRect(cellRect, FILL_HANDLE_HIT_SIZE_PX);\n if (isPointInRect(ev.clientX, ev.clientY, handleRect)) {\n ev.preventDefault();\n this.fillDragging = true;\n this.fillSource = fillSrc;\n this.fillEndRowIndex = fillSrc.endRowIndex;\n this.root.dataset.extableFillDragging = \"1\";\n if (this.rootCursorBackup === null)\n this.rootCursorBackup = this.root.style.cursor || \"\";\n this.root.style.cursor = \"crosshair\";\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n this.dragging = false;\n this.dragStart = null;\n this.suppressNextClick = true;\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n // Expand selection to include filled range preview (start with source).\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: fillSrc.startRowIndex,\n endRow: fillSrc.endRowIndex,\n startCol: fillSrc.colIndex,\n endCol: fillSrc.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n this.startAutoScroll();\n return;\n }\n }\n }\n }\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const rowIndex = hit.rowId === \"__header__\" ? 0 : this.dataModel.getRowIndex(hit.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex < 0) return;\n\n if (hit.rowId === \"__header__\") {\n // Select entire column when clicking column header.\n if (!rows.length) return;\n const range: SelectionRange = {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n };\n this.selectionRanges = [range];\n this.onSelectionChange(this.selectionRanges);\n this.dragging = false;\n this.selectionMode = true;\n this.dragStart = null;\n this.selectionAnchor = null;\n this.suppressNextClick = false;\n const targetRow = rows[0];\n const targetCol = schema.columns[colIndex];\n if (targetRow && targetCol) {\n this.activeCell = { rowId: targetRow.id, colKey: targetCol.key };\n this.onActiveChange(targetRow.id, targetCol.key);\n }\n this.focusSelectionInput(\"\");\n return;\n }\n\n if (rowIndex < 0) return;\n\n const kind: \"cells\" | \"rows\" = hit.colKey === null ? \"rows\" : \"cells\";\n this.dragging = true;\n this.pointerDownClient = { x: ev.clientX, y: ev.clientY };\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.dragStart = { rowIndex, colIndex, kind };\n this.suppressNextClick = false;\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n\n try {\n (ev.target as Element | null)?.setPointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.startAutoScroll();\n };\n\n private getHitAtClientPoint(clientX: number, clientY: number) {\n // Prefer coordinate-based hit-test for auto-scroll ticks (no real event.target).\n if (typeof document.elementFromPoint !== \"function\") return null;\n const el = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n if (el && this.root.contains(el)) {\n const corner = el.closest<HTMLElement>(\"th.extable-corner\");\n if (corner) {\n return {\n rowId: \"__all__\",\n colKey: \"__all__\",\n element: corner,\n rect: corner.getBoundingClientRect(),\n };\n }\n const rowHeader = el.closest<HTMLElement>(\"th.extable-row-header:not(.extable-corner)\");\n if (rowHeader) {\n const row = rowHeader.closest<HTMLElement>(\"tr[data-row-id]\");\n if (row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: null,\n element: rowHeader,\n rect: rowHeader.getBoundingClientRect(),\n };\n }\n }\n const colHeader = el.closest<HTMLElement>(\"th[data-col-key]\");\n if (colHeader) {\n return {\n rowId: \"__header__\",\n colKey: colHeader.dataset.colKey ?? \"\",\n element: colHeader,\n rect: colHeader.getBoundingClientRect(),\n };\n }\n const cell = el.closest<HTMLElement>(\"td[data-col-key]\");\n const row = cell?.closest<HTMLElement>(\"tr[data-row-id]\");\n if (cell && row) {\n return {\n rowId: row.dataset.rowId ?? \"\",\n colKey: cell.dataset.colKey ?? \"\",\n element: cell,\n rect: cell.getBoundingClientRect(),\n };\n }\n }\n // Canvas renderer hitTest does not rely on target; a minimal shape is enough.\n return this.hitTest({ clientX, clientY } as unknown as MouseEvent);\n }\n\n private updateDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.dragging || !this.dragStart) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (\n hit.colKey === \"__all__\" ||\n (this.dragStart.kind === \"cells\" && hit.colKey === null)\n )\n return;\n\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const endColIndex =\n this.dragStart.kind === \"rows\"\n ? schema.columns.length - 1\n : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (endColIndex < 0) return;\n\n const startRow = this.dragStart.rowIndex;\n const startCol = this.dragStart.kind === \"rows\" ? 0 : this.dragStart.colIndex;\n const endCol = this.dragStart.kind === \"rows\" ? schema.columns.length - 1 : endColIndex;\n if (endRowIndex !== startRow || endCol !== startCol) {\n this.dragSelectionChanged = true;\n }\n const nextRange: SelectionRange = {\n kind: this.dragStart.kind,\n startRow,\n endRow: endRowIndex,\n startCol,\n endCol,\n };\n this.selectionRanges = [nextRange];\n const activeRowId = rows[endRowIndex]?.id ?? hit.rowId;\n const activeColKey =\n this.dragStart.kind === \"rows\"\n ? (schema.columns[0]?.key ?? hit.colKey)\n : (schema.columns[endColIndex]?.key ?? hit.colKey);\n this.activeCell = { rowId: activeRowId, colKey: activeColKey };\n this.onActiveChange(activeRowId, activeColKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n }\n\n private updateFillDragFromClientPoint(clientX: number, clientY: number) {\n if (!this.fillDragging || !this.fillSource) return;\n const hit = this.getHitAtClientPoint(clientX, clientY);\n if (!hit) return;\n if (hit.colKey === \"__all__\" || hit.colKey === null) return;\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const endRowIndex = this.dataModel.getRowIndex(hit.rowId);\n if (endRowIndex < 0) return;\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIndex !== this.fillSource.colIndex) return;\n\n // Vertical fill only; allow dragging downwards from the source end.\n const nextEnd = Math.max(this.fillSource.endRowIndex, endRowIndex);\n if (this.fillEndRowIndex !== nextEnd) {\n this.fillEndRowIndex = nextEnd;\n const activeRowId = rows[nextEnd]?.id ?? hit.rowId;\n const col = schema.columns[this.fillSource.colIndex];\n if (!col) return;\n const colKey = col.key;\n this.activeCell = { rowId: activeRowId, colKey };\n this.onActiveChange(activeRowId, colKey);\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: this.fillSource.startRowIndex,\n endRow: nextEnd,\n startCol: this.fillSource.colIndex,\n endCol: this.fillSource.colIndex,\n },\n ];\n this.onSelectionChange(this.selectionRanges);\n }\n this.suppressNextClick = true;\n }\n\n private computeAutoScrollDelta(clientX: number, clientY: number) {\n const rect = this.root.getBoundingClientRect();\n const threshold = 24;\n const maxStep = 18;\n let dx = 0;\n let dy = 0;\n if (clientX < rect.left + threshold) {\n dx = -Math.ceil(((rect.left + threshold - clientX) / threshold) * maxStep);\n } else if (clientX > rect.right - threshold) {\n dx = Math.ceil(((clientX - (rect.right - threshold)) / threshold) * maxStep);\n }\n if (clientY < rect.top + threshold) {\n dy = -Math.ceil(((rect.top + threshold - clientY) / threshold) * maxStep);\n } else if (clientY > rect.bottom - threshold) {\n dy = Math.ceil(((clientY - (rect.bottom - threshold)) / threshold) * maxStep);\n }\n return { dx, dy };\n }\n\n private startAutoScroll() {\n if (this.autoScrollActive) return;\n this.autoScrollActive = true;\n const tick = () => {\n if (!this.autoScrollActive) return;\n const p = this.lastPointerClient;\n if (!p || (!this.dragging && !this.fillDragging)) {\n this.stopAutoScroll();\n return;\n }\n const { dx, dy } = this.computeAutoScrollDelta(p.x, p.y);\n if (dx !== 0 || dy !== 0) {\n const prevTop = this.root.scrollTop;\n const prevLeft = this.root.scrollLeft;\n this.root.scrollTop = Math.max(0, prevTop + dy);\n this.root.scrollLeft = Math.max(0, prevLeft + dx);\n // While scrolling, keep updating selection/fill based on the latest pointer position.\n if (this.fillDragging) this.updateFillDragFromClientPoint(p.x, p.y);\n else this.updateDragFromClientPoint(p.x, p.y);\n }\n const raf =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf(tick);\n };\n const raf2 =\n window.requestAnimationFrame ??\n ((cb: FrameRequestCallback) => window.setTimeout(() => cb(performance.now()), 16));\n this.autoScrollRaf = raf2(tick);\n }\n\n private stopAutoScroll() {\n this.autoScrollActive = false;\n if (this.autoScrollRaf !== null) {\n const caf = window.cancelAnimationFrame ?? ((id: number) => window.clearTimeout(id));\n caf(this.autoScrollRaf);\n this.autoScrollRaf = null;\n }\n }\n\n private handlePointerMove = (ev: PointerEvent) => {\n this.lastPointerClient = { x: ev.clientX, y: ev.clientY };\n if (this.fillDragging && this.fillSource) {\n this.updateFillDragFromClientPoint(ev.clientX, ev.clientY);\n return;\n }\n if (!this.dragging || !this.dragStart) return;\n if (!this.dragMoved && this.pointerDownClient) {\n const dx = ev.clientX - this.pointerDownClient.x;\n const dy = ev.clientY - this.pointerDownClient.y;\n // Ignore tiny pointer jitter so clicks aren't suppressed.\n if (dx * dx + dy * dy < 9) return;\n this.dragMoved = true;\n }\n this.updateDragFromClientPoint(ev.clientX, ev.clientY);\n };\n\n private handlePointerUp = (ev: PointerEvent) => {\n if (this.fillDragging && this.fillSource) {\n const src = this.fillSource;\n const endRowIndex = this.fillEndRowIndex ?? src.endRowIndex;\n this.fillDragging = false;\n this.fillSource = null;\n this.fillEndRowIndex = null;\n this.root.dataset.extableFillDragging = \"\";\n if (this.rootCursorBackup !== null) {\n this.root.style.cursor = this.rootCursorBackup;\n this.rootCursorBackup = null;\n }\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n this.commitFill(src, endRowIndex);\n this.suppressNextClick = true;\n return;\n }\n if (!this.dragging) return;\n this.dragging = false;\n this.dragStart = null;\n const suppressTrailingClick = this.dragSelectionChanged;\n this.pointerDownClient = null;\n this.dragMoved = false;\n this.dragSelectionChanged = false;\n this.stopAutoScroll();\n try {\n (ev.target as Element | null)?.releasePointerCapture?.(ev.pointerId);\n } catch {\n // ignore\n }\n if (suppressTrailingClick) this.suppressNextClick = true;\n if (this.suppressNextClick) {\n // Keep selection mode focus; prevent the trailing click from opening edit.\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n }\n };\n\n private commitFill(source: import(\"./fillHandle\").FillHandleSource, endRowIndex: number) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const col = schema.columns[source.colIndex];\n if (!col) return;\n if (endRowIndex <= source.endRowIndex) return;\n\n const getValue = makeFillValueGetter(this.dataModel, source, this.sequenceLangs);\n if (!getValue) return;\n\n const commitNow = this.editMode === \"direct\";\n const batchId = `fill:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = source.endRowIndex + 1; r <= endRowIndex; r += 1) {\n const row = rows[r];\n if (!row) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const offset = r - source.endRowIndex;\n const next = getValue(offset);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n\n // Select the filled range after commit and focus selection mode.\n const endRow = rows[endRowIndex];\n if (!endRow) return;\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: source.startRowIndex,\n endRow: endRowIndex,\n startCol: source.colIndex,\n endCol: source.colIndex,\n },\n ];\n this.activeCell = { rowId: endRow.id, colKey: col.key };\n this.onActiveChange(endRow.id, col.key);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.ensureVisibleCell(endRow.id, col.key);\n const current = this.dataModel.getCell(endRow.id, col.key);\n this.focusSelectionInput(this.cellToClipboardString(current));\n }\n\n private teardownSelectionInput() {\n const input = this.selectionInput;\n if (!input) return;\n\n // Avoid re-entrancy via blur fired during DOM removal.\n this.selectionInput = null;\n\n input.removeEventListener(\"keydown\", this.handleSelectionKeydown);\n input.removeEventListener(\"beforeinput\", this.handleSelectionBeforeInput);\n input.removeEventListener(\"compositionstart\", this.handleSelectionCompositionStart);\n input.removeEventListener(\"copy\", this.handleSelectionCopy);\n input.removeEventListener(\"cut\", this.handleSelectionCut);\n input.removeEventListener(\"paste\", this.handleSelectionPaste);\n input.removeEventListener(\"blur\", this.handleSelectionBlur);\n removeFromParent(input);\n }\n\n private handleSelectionCopy = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.showCopyToast(`Copied ${payload.cellCount} cells`, \"info\");\n };\n\n private handleSelectionCut = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n ev.preventDefault();\n ev.clipboardData?.setData(\"text/plain\", payload.text);\n ev.clipboardData?.setData(\"text/tab-separated-values\", payload.text);\n ev.clipboardData?.setData(\"text/html\", payload.html);\n this.clearSelectionValues();\n };\n\n private handleSelectionPaste = (ev: ClipboardEvent) => {\n if (!this.selectionMode) return;\n ev.preventDefault();\n const html = ev.clipboardData?.getData(\"text/html\") ?? \"\";\n const tsv = ev.clipboardData?.getData(\"text/tab-separated-values\") ?? \"\";\n const text = ev.clipboardData?.getData(\"text/plain\") ?? \"\";\n const grid = this.parseClipboardGrid({ html, tsv, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n };\n\n private handleSelectionCompositionStart = (ev?: CompositionEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n\n if (this.isCellReadonly(ac.rowId, ac.colKey)) {\n // Keep selection mode for readonly cells.\n // IMPORTANT: cancel any ongoing IME composition by tearing down the focused hidden input.\n // Otherwise, some IMEs show a floating preedit UI (e.g. an \"a\") even though we ignore edits.\n ev?.preventDefault?.();\n ev?.stopPropagation?.();\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n this.teardownSelectionInput();\n this.focusSelectionInput(currentText);\n return;\n }\n\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n };\n\n private handleSelectionBeforeInput = (ev: InputEvent) => {\n if (!this.selectionMode) return;\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) return;\n if (!this.isCellReadonly(ac.rowId, ac.colKey)) return;\n\n // Block text insertion into the hidden selection input while readonly.\n ev.preventDefault();\n try {\n const current = this.dataModel.getCell(ac.rowId, ac.colKey);\n const currentText = this.cellToClipboardString(current);\n const input = this.ensureSelectionInput();\n input.value = currentText;\n input.select();\n } catch {\n // ignore\n }\n };\n\n public async copySelection() {\n const payload = this.buildSelectionClipboardPayload();\n if (!payload) return;\n const { text, html, cellCount } = payload;\n\n const copyViaClipboardApi = async () => {\n if (typeof navigator === \"undefined\" || !navigator.clipboard) return false;\n if (typeof ClipboardItem !== \"undefined\" && navigator.clipboard.write) {\n try {\n const item = new ClipboardItem({\n \"text/plain\": new Blob([text], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n });\n await navigator.clipboard.write([item]);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n if (navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n /* fallthrough */\n }\n }\n return false;\n };\n\n const copyViaFallbackInput = () => {\n const input = this.ensureSelectionInput();\n const prev = input.value;\n input.value = text;\n input.select();\n document.execCommand?.(\"copy\");\n input.value = prev;\n };\n\n const copied = await copyViaClipboardApi();\n if (!copied) copyViaFallbackInput();\n this.showCopyToast(`Copied ${cellCount} cells`, \"info\");\n }\n\n public async pasteFromClipboard() {\n if (this.editMode === \"readonly\") return;\n if (!this.selectionMode) return;\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.readText) return;\n try {\n const text = await navigator.clipboard.readText();\n if (!text) return;\n const grid = this.parseClipboardGrid({ html: \"\", tsv: text, text });\n if (!grid) return;\n this.applyClipboardGrid(grid);\n } catch {\n /* ignore */\n }\n }\n\n private handleSelectionKeydown = async (ev: KeyboardEvent) => {\n if (!this.selectionMode) return;\n if (!this.activeCell) return;\n if (ev.isComposing || this.composing) return;\n\n // Ignore modifier-only keys in selection mode (do not enter edit mode).\n if (\n ev.key === \"Shift\" ||\n ev.key === \"Control\" ||\n ev.key === \"Alt\" ||\n ev.key === \"Meta\" ||\n ev.key === \"CapsLock\" ||\n ev.key === \"NumLock\" ||\n ev.key === \"ScrollLock\"\n ) {\n return;\n }\n\n const isMac = typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n const accel = isMac ? ev.metaKey : ev.ctrlKey;\n if (accel) {\n const key = ev.key.toLowerCase();\n if (key === \"z\") {\n ev.preventDefault();\n if (isMac && ev.shiftKey) this.onRedo();\n else this.onUndo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"y\") {\n ev.preventDefault();\n this.onRedo();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"c\") {\n ev.preventDefault();\n await this.copySelection();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"x\") {\n ev.preventDefault();\n await this.copySelection();\n this.clearSelectionValues();\n this.selectionAnchor = null;\n return;\n }\n if (key === \"v\") {\n // Let the paste event fire; it will be handled on the input.\n this.selectionAnchor = null;\n return;\n }\n }\n\n if (ev.key === \" \" && this.activeCell.colKey !== null) {\n const col = this.findColumn(this.activeCell.colKey);\n if (col?.type === \"button\" || col?.type === \"link\") {\n ev.preventDefault();\n this.triggerCellAction(this.activeCell.rowId, this.activeCell.colKey, col.type);\n this.selectionAnchor = null;\n return;\n }\n if (col?.type === \"boolean\") {\n ev.preventDefault();\n this.toggleBoolean(this.activeCell.rowId, this.activeCell.colKey);\n this.selectionAnchor = null;\n return;\n }\n this.selectionAnchor = null;\n return;\n }\n\n const isTab = ev.key === \"Tab\";\n const isEnter = ev.key === \"Enter\";\n const isArrow =\n ev.key === \"ArrowLeft\" ||\n ev.key === \"ArrowRight\" ||\n ev.key === \"ArrowUp\" ||\n ev.key === \"ArrowDown\";\n if (isTab || isEnter || isArrow) {\n ev.preventDefault();\n this.teardownSelectionInput();\n if (isTab) {\n this.moveActiveCell(0, ev.shiftKey ? -1 : 1, false);\n return;\n }\n if (isEnter) {\n this.moveActiveCell(ev.shiftKey ? -1 : 1, 0, false);\n return;\n }\n const extend = ev.shiftKey;\n if (ev.key === \"ArrowLeft\") this.moveActiveCell(0, -1, extend);\n else if (ev.key === \"ArrowRight\") this.moveActiveCell(0, 1, extend);\n else if (ev.key === \"ArrowUp\") this.moveActiveCell(-1, 0, extend);\n else if (ev.key === \"ArrowDown\") this.moveActiveCell(1, 0, extend);\n return;\n }\n\n if (\n this.activeCell.colKey !== null &&\n this.isCellReadonly(this.activeCell.rowId, this.activeCell.colKey)\n ) {\n ev.preventDefault();\n this.selectionAnchor = null;\n return;\n }\n\n this.selectionMode = false;\n this.selectionAnchor = null;\n this.teardownSelectionInput();\n // Let the original keydown insert the character into the now-focused editor naturally.\n this.openEditorAtActiveCell();\n };\n\n private getActiveIndices() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const fallback = { rowIndex: 0, colIndex: 0 };\n const ac = this.activeCell;\n if (!ac) return fallback;\n const rowIndex = rows.findIndex((r) => r.id === ac.rowId);\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n return { rowIndex: rowIndex >= 0 ? rowIndex : 0, colIndex: colIndex >= 0 ? colIndex : 0 };\n }\n\n private normalizeRange(range: SelectionRange): SelectionRange {\n return {\n ...range,\n startRow: Math.min(range.startRow, range.endRow),\n endRow: Math.max(range.startRow, range.endRow),\n startCol: Math.min(range.startCol, range.endCol),\n endCol: Math.max(range.startCol, range.endCol),\n };\n }\n\n private getCopyRange(): SelectionRange | null {\n const schema = this.dataModel.getSchema();\n if (this.selectionRanges.length > 0) {\n const first = this.selectionRanges[0];\n if (!first) return null;\n const normalized = this.normalizeRange(first);\n if (normalized.kind === \"rows\") {\n return {\n kind: \"cells\",\n startRow: normalized.startRow,\n endRow: normalized.endRow,\n startCol: normalized.startCol,\n endCol: normalized.endCol,\n };\n }\n return normalized;\n }\n if (!this.activeCell) return null;\n const ac = this.activeCell;\n if (!ac) return null;\n const rowIdx = this.dataModel.getRowIndex(ac.rowId);\n const colIdx = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n if (rowIdx < 0 || colIdx < 0) return null;\n return { kind: \"cells\", startRow: rowIdx, endRow: rowIdx, startCol: colIdx, endCol: colIdx };\n }\n\n private cellToClipboardString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"number\") return String(value);\n const linkAction = resolveLinkAction(value);\n if (linkAction?.href) return linkAction.href;\n const buttonAction = resolveButtonAction(value);\n if (buttonAction?.label) return buttonAction.label;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(value);\n }\n\n private escapeHtml(text: string) {\n return text\n .replaceAll(\"&\", \"&\")\n .replaceAll(\"<\", \"<\")\n .replaceAll(\">\", \">\")\n .replaceAll('\"', \""\")\n .replaceAll(\"'\", \"'\");\n }\n\n private buildSelectionClipboardPayload(): {\n text: string;\n html: string;\n cellCount: number;\n } | null {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range) return null;\n if (range.kind !== \"cells\") return null;\n\n const out: string[] = [];\n const htmlRows: string[] = [];\n const tableStyle = \"border-collapse:collapse;border-spacing:0;\";\n const cellStyle = \"border:1px solid #d0d7de;padding:4px 6px;vertical-align:top;\";\n let cellCount = 0;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n const line: string[] = [];\n const htmlCells: string[] = [];\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n const v = this.dataModel.getCell(row.id, col.key);\n const s = this.cellToClipboardString(v);\n line.push(s);\n htmlCells.push(`<td style=\"${cellStyle}\">${this.escapeHtml(s)}</td>`);\n cellCount += 1;\n }\n out.push(line.join(\"\\t\"));\n htmlRows.push(`<tr>${htmlCells.join(\"\")}</tr>`);\n }\n const text = out.join(\"\\r\\n\");\n const html = `<table style=\"${tableStyle}\"><tbody>${htmlRows.join(\"\")}</tbody></table>`;\n return { text, html, cellCount };\n }\n\n private clearSelectionValues() {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const range = this.getCopyRange();\n if (!range || range.kind !== \"cells\") return;\n const commitNow = this.editMode === \"direct\";\n const batchId = `cut:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = range.startRow; r <= range.endRow; r += 1) {\n const row = rows[r];\n if (!row) continue;\n for (let c = range.startCol; c <= range.endCol; c += 1) {\n const col = schema.columns[c];\n if (!col) continue;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = col.type === \"boolean\" ? false : \"\";\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private parseClipboardGrid(payload: { html: string; tsv: string; text: string }):\n | string[][]\n | null {\n const fromHtml = this.parseHtmlTable(payload.html);\n if (fromHtml) return fromHtml;\n const raw = payload.tsv || payload.text;\n return this.parseTsv(raw);\n }\n\n private parseTsv(text: string): string[][] | null {\n const trimmed = text.replace(/\\r\\n$/, \"\").replace(/\\n$/, \"\");\n if (!trimmed) return null;\n const rows = trimmed.split(/\\r\\n|\\n/);\n return rows.map((r) => r.split(\"\\t\"));\n }\n\n private parseHtmlTable(html: string): string[][] | null {\n if (!html) return null;\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const table = doc.querySelector(\"table\");\n if (!table) return null;\n const trs = Array.from(table.querySelectorAll(\"tr\"));\n if (trs.length === 0) return null;\n const grid: string[][] = [];\n for (const tr of trs) {\n const cells = Array.from(tr.querySelectorAll(\"th,td\"));\n if (\n cells.some(\n (c) =>\n (c as HTMLTableCellElement).rowSpan > 1 || (c as HTMLTableCellElement).colSpan > 1,\n )\n ) {\n return null;\n }\n grid.push(cells.map((c) => (c.textContent ?? \"\").trim()));\n }\n return grid.length ? grid : null;\n } catch {\n return null;\n }\n }\n\n private coerceCellValue(raw: string, colKey: string): unknown {\n const col = this.findColumn(colKey);\n if (!col) return raw;\n if (raw === \"\") return \"\";\n if (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") {\n const parsed = parseNumericText(raw);\n if (!parsed.ok) return raw;\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n return coerced.ok ? coerced.value : raw;\n }\n if (col.type === \"boolean\") {\n const v = raw.trim().toLowerCase();\n if (v === \"true\" || v === \"1\" || v === \"yes\") return true;\n if (v === \"false\" || v === \"0\" || v === \"no\") return false;\n return raw;\n }\n return raw;\n }\n\n private applyClipboardGrid(grid: string[][]) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const { rowIndex: startRow, colIndex: startCol } = this.getActiveIndices();\n const commitNow = this.editMode === \"direct\";\n const batchId = `paste:${Date.now()}:${Math.random().toString(16).slice(2)}`;\n for (let r = 0; r < grid.length; r += 1) {\n const row = rows[startRow + r];\n if (!row) break;\n const line = grid[r] ?? [];\n for (let c = 0; c < line.length; c += 1) {\n const col = schema.columns[startCol + c];\n if (!col) break;\n if (this.isCellReadonly(row.id, col.key)) continue;\n const next = this.coerceCellValue(line[c] ?? \"\", col.key);\n const cmd: Command = {\n kind: \"edit\",\n rowId: row.id,\n colKey: col.key,\n next,\n payload: { batchId },\n };\n this.onEdit(cmd, commitNow);\n }\n }\n }\n\n private createEditor(colKey: string, initial: string) {\n const col = this.findColumn(colKey);\n const needsTextarea = col?.wrapText || initial.includes(\"\\n\");\n if (needsTextarea) {\n const ta = document.createElement(\"textarea\");\n ta.value = initial;\n ta.style.resize = \"none\";\n ta.style.whiteSpace = \"pre-wrap\";\n ta.style.overflowWrap = \"anywhere\";\n ta.style.overflow = \"hidden\";\n this.autosize(ta);\n ta.addEventListener(\"input\", () => this.autosize(ta));\n return { control: ta, value: initial };\n }\n if (col?.type === \"boolean\") {\n const input = document.createElement(\"input\");\n input.type = \"checkbox\";\n input.checked = initial === \"true\" || initial === \"1\" || initial === \"on\";\n return { control: input, value: initial };\n }\n if (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\") {\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n if (col?.type === \"date\" || col?.type === \"time\" || col?.type === \"datetime\") {\n const input = document.createElement(\"input\");\n input.type = col.type === \"date\" ? \"date\" : col.type === \"time\" ? \"time\" : \"datetime-local\";\n const normalized = this.normalizeTemporalInitialValue(col.type, initial);\n input.value = normalized;\n return { control: input, value: normalized };\n }\n if (col?.type === \"enum\" || col?.type === \"tags\") {\n const allowCustom = col.enum?.allowCustom ?? col.tags?.allowCustom;\n const options = col.enum?.options ?? col.tags?.options ?? [];\n if (allowCustom === false) {\n const select = document.createElement(\"select\");\n const empty = document.createElement(\"option\");\n empty.value = \"\";\n empty.textContent = \"\";\n select.appendChild(empty);\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n op.textContent = opt;\n if (initial === opt) op.selected = true;\n select.appendChild(op);\n }\n return { control: select, value: initial };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n const listId = `extable-datalist-${String(colKey)}`;\n input.setAttribute(\"list\", listId);\n input.value = initial;\n let datalist = document.getElementById(listId) as HTMLDataListElement | null;\n if (!datalist) {\n datalist = document.createElement(\"datalist\");\n datalist.id = listId;\n for (const opt of options) {\n const op = document.createElement(\"option\");\n op.value = opt;\n datalist.appendChild(op);\n }\n this.root.appendChild(datalist);\n }\n return { control: input, value: initial, datalistId: listId };\n }\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = initial;\n return { control: input, value: initial };\n }\n\n private getInitialEditValue(colKey: string, current: unknown): string {\n if (current === null || current === undefined) return \"\";\n const col = this.findColumn(colKey);\n if (!col) return String(current);\n\n if ((col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") && typeof current === \"number\") {\n if (col.type === \"number\") {\n const fmt = col.format as { format?: string; precision?: number; scale?: number } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n return formatNumberForEdit(current, { format: \"scientific\", precision: fmt?.precision });\n }\n return formatNumberForEdit(current, { format: \"decimal\", scale: fmt?.scale });\n }\n\n const fmt = col.format as { format?: string } | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n return formatIntegerWithPrefix(current, token);\n }\n return String(current);\n }\n\n return String(current);\n }\n\n private readActiveValueForCommit(): { ok: true; value: unknown } | { ok: false } {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) {\n return { ok: true, value: this.inputEl?.value ?? \"\" };\n }\n\n const col = this.findColumn(this.activeCell.colKey);\n if (\n col &&\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\") &&\n this.inputEl instanceof HTMLInputElement\n ) {\n const normalized = normalizeNumericInput(this.inputEl.value);\n if (normalized === \"\") return { ok: true, value: \"\" };\n\n const parsed = parseNumericText(normalized);\n if (!parsed.ok) return { ok: false };\n const coerced = coerceNumericForColumn(parsed.value, col.type);\n if (!coerced.ok) return { ok: false };\n return { ok: true, value: coerced.value };\n }\n\n return { ok: true, value: this.readActiveValue() };\n }\n\n private tryCommitActiveEditor(): boolean {\n if (!this.inputEl || !this.activeCell || this.activeCell.colKey === null) return true;\n const { rowId, colKey } = this.activeCell;\n const next = this.readActiveValueForCommit();\n if (!next.ok) {\n this.inputEl.focus({ preventScroll: true });\n return false;\n }\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n return true;\n }\n\n private autosize(ta: HTMLTextAreaElement) {\n const style = window.getComputedStyle(ta);\n let lineHeight = Number.parseFloat(style.lineHeight);\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) lineHeight = 16;\n ta.rows = 1; // shrink to measure\n const lines = Math.ceil(ta.scrollHeight / lineHeight);\n ta.rows = Math.max(1, lines);\n ta.style.minHeight = `${lineHeight}px`;\n }\n\n private positionFloatingContentBox(\n box: { left: number; top: number; width: number; height: number },\n wrapper: HTMLDivElement,\n ) {\n const insetX = CELL_PADDING_X_PX;\n const insetTop = CELL_PADDING_TOP_PX;\n const insetBottom = CELL_PADDING_BOTTOM_PX;\n wrapper.style.left = `${box.left + insetX}px`;\n wrapper.style.top = `${box.top + insetTop}px`;\n wrapper.style.width = `${Math.max(8, box.width - insetX * 2)}px`;\n wrapper.style.height = `${Math.max(8, box.height - (insetTop + insetBottom))}px`;\n }\n\n private handleClick = (ev: MouseEvent) => {\n if (ev.button !== 0) {\n return; // only left click starts edit/selection; right-click is handled by contextmenu\n }\n const el = ev.target as HTMLElement | null;\n if (el?.closest('button[data-extable-fs-open=\"1\"]')) {\n return;\n }\n if (this.suppressNextClick) {\n this.suppressNextClick = false;\n return;\n }\n if (this.inputEl && ev.target && this.inputEl.contains(ev.target as Node)) {\n return;\n }\n if (this.inputEl && this.activeCell && this.activeCell.colKey !== null) {\n if (!this.tryCommitActiveEditor()) return;\n }\n const hit =\n typeof document.elementFromPoint === \"function\"\n ? this.getHitAtClientPoint(ev.clientX, ev.clientY)\n : this.hitTest(ev);\n if (!hit) return;\n const actionHit = this.hitAction ? this.hitAction(ev) : null;\n if (actionHit) {\n if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", actionHit);\n }\n if (actionHit.kind === \"tag-remove\") {\n const removed = this.removeTagValue(actionHit.rowId, actionHit.colKey, actionHit.tagIndex);\n if (removed) {\n ev.preventDefault();\n return;\n }\n } else {\n const triggered = this.triggerCellAction(actionHit.rowId, actionHit.colKey, actionHit.kind);\n if (triggered) {\n ev.preventDefault();\n return;\n }\n }\n } else if ((globalThis as { __EXTABLE_DEBUG_ACTIONS?: boolean }).__EXTABLE_DEBUG_ACTIONS) {\n console.log(\"[extable][canvas][action-click]\", null);\n }\n const wasSameCell =\n this.selectionMode &&\n !ev.shiftKey &&\n !ev.metaKey &&\n !ev.ctrlKey &&\n this.activeCell?.rowId === hit.rowId &&\n String(this.activeCell?.colKey) === String(hit.colKey);\n if (hit.rowId === \"__all__\" && hit.colKey === \"__all__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n this.teardownInput(false);\n if (rows.length && schema.columns.length) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: 0,\n endCol: schema.columns.length - 1,\n },\n ];\n this.activeCell = { rowId: \"__all__\", colKey: \"__all__\" };\n this.onActiveChange(\"__all__\", \"__all__\");\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n } else {\n this.activeCell = null;\n this.onActiveChange(\"__all__\", \"__all__\");\n this.selectionAnchor = null;\n }\n return;\n }\n this.onRowSelect(hit.rowId);\n if (hit.rowId === \"__header__\") {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const colIndex = schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (rows.length && colIndex >= 0) {\n this.selectionRanges = [\n {\n kind: \"cells\",\n startRow: 0,\n endRow: rows.length - 1,\n startCol: colIndex,\n endCol: colIndex,\n },\n ];\n this.activeCell = { rowId: rows[0].id, colKey: hit.colKey };\n this.onActiveChange(this.activeCell.rowId, this.activeCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n return;\n }\n this.applySelectionFromHit(ev, hit);\n if (hit.colKey === null || hit.colKey === \"__all__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (hit.rowId === \"__header__\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n return;\n }\n if (this.isCellReadonly(hit.rowId, hit.colKey)) {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n this.focusSelectionInput(this.cellToClipboardString(current));\n return;\n }\n const col = this.findColumn(hit.colKey);\n const isBoolean = col?.type === \"boolean\";\n if (isBoolean) {\n const isSecondClick =\n this.lastBooleanCell?.rowId === hit.rowId &&\n String(this.lastBooleanCell?.colKey) === String(hit.colKey);\n this.lastBooleanCell = { rowId: hit.rowId, colKey: hit.colKey };\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.teardownInput(false);\n this.teardownSelectionInput();\n if (isSecondClick) {\n this.toggleBoolean(hit.rowId, hit.colKey);\n // Keep focus on the hidden selection input so Space does not scroll the container/page.\n this.focusSelectionInput(\"\");\n return;\n }\n // Keep focus on the hidden selection input so Space can toggle.\n this.focusSelectionInput(\"\");\n return;\n }\n this.lastBooleanCell = null;\n this.selectionAnchor = null;\n this.teardownInput(false);\n const current = this.dataModel.getCell(hit.rowId, hit.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n if (wasSameCell) {\n this.selectionMode = false;\n this.teardownSelectionInput();\n this.openEditorAtActiveCell();\n }\n };\n\n private triggerCellAction(rowId: string, colKey: string, kind: \"button\" | \"link\") {\n const col = this.findColumn(colKey);\n if (!col) return false;\n if (col.type !== kind) return false;\n const interaction = this.dataModel.getCellInteraction(rowId, colKey);\n if (interaction.disabled) return false;\n const valueRes = this.dataModel.resolveCellValue(rowId, col);\n const condRes = this.dataModel.resolveConditionalStyle(rowId, col);\n const textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n if (textOverride) return false;\n if (col.type === \"button\") {\n const actionValue = resolveButtonAction(valueRes.value);\n if (!actionValue) return false;\n this.onCellAction({ kind: \"button\", rowId, colKey, value: actionValue });\n return true;\n }\n if (col.type === \"link\") {\n const linkValue = resolveLinkAction(valueRes.value);\n if (!linkValue?.href) return false;\n this.openLink(linkValue.href, linkValue.target);\n return true;\n }\n return false;\n }\n\n private removeTagValue(rowId: string, colKey: string, tagIndex: number) {\n if (this.isCellReadonly(rowId, colKey)) return false;\n const col = this.findColumn(colKey);\n if (!col || col.type !== \"tags\") return false;\n const current = this.dataModel.getCell(rowId, colKey);\n const values = this.normalizeTagValues(current);\n if (!values || tagIndex < 0 || tagIndex >= values.length) return false;\n const nextValues = values.filter((_, i) => i !== tagIndex);\n const next =\n current && typeof current === \"object\" && (current as Record<string, unknown>).kind === \"tags\"\n ? { kind: \"tags\", values: nextValues }\n : nextValues;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n return true;\n }\n\n private normalizeTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((v): v is string => typeof v === \"string\");\n }\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return [];\n return trimmed.split(/\\s*,\\s*/).filter(Boolean);\n }\n return null;\n }\n\n private openLink(href: string, target?: string) {\n if (typeof document === \"undefined\") return;\n if (!href) return;\n const link = document.createElement(\"a\");\n link.href = href;\n link.target = target ?? \"_self\";\n link.rel = \"noopener noreferrer\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n\n private toggleBoolean(rowId: string, colKey: string) {\n const current = this.dataModel.getCell(rowId, colKey);\n const currentBool = current === true || current === \"true\" || current === \"1\" || current === 1;\n const next = !currentBool;\n const cmd: Command = { kind: \"edit\", rowId, colKey, next };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n this.onMove(rowId);\n }\n\n private handleContextMenu = (ev: MouseEvent) => {\n const target = ev.target as Node | null;\n if (ev.ctrlKey) {\n ev.preventDefault();\n return;\n }\n if (!target || !this.root.contains(target)) return;\n ev.preventDefault();\n ev.stopPropagation();\n const hit = this.hitTest(ev);\n const rowId = hit?.rowId ?? null;\n const colKey = hit?.colKey ?? null;\n this.onContextMenu(rowId, colKey, ev.clientX, ev.clientY);\n };\n\n private applySelectionFromHit(ev: MouseEvent, hit: { rowId: string; colKey: string | null }) {\n const schema = this.dataModel.getSchema();\n const rowIdx = this.dataModel.getRowIndex(hit.rowId);\n const isRow = hit.colKey === null;\n const colIdx = isRow ? (schema.columns.length > 0 ? 0 : -1) : schema.columns.findIndex((c) => String(c.key) === String(hit.colKey));\n if (colIdx < 0) return;\n const targetRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: rowIdx,\n endRow: rowIdx,\n startCol: Math.max(0, colIdx),\n endCol: Math.max(0, colIdx),\n };\n let nextRanges: SelectionRange[] = [];\n if (ev.shiftKey && this.activeCell) {\n const ac = this.activeCell;\n const anchorRow = this.dataModel.getRowIndex(ac.rowId);\n const anchorCol = schema.columns.findIndex((c) => String(c.key) === String(ac.colKey));\n const anchorRange: SelectionRange = isRow\n ? {\n kind: \"rows\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: 0,\n endCol: schema.columns.length - 1,\n }\n : {\n kind: \"cells\",\n startRow: anchorRow,\n endRow: rowIdx,\n startCol: Math.max(0, anchorCol),\n endCol: Math.max(0, colIdx),\n };\n nextRanges = [anchorRange];\n } else if (ev.metaKey || ev.ctrlKey) {\n nextRanges = [...this.selectionRanges, targetRange];\n } else {\n nextRanges = [targetRange];\n }\n this.selectionRanges = this.mergeRanges(nextRanges);\n const anchorCell =\n targetRange.kind === \"rows\"\n ? { rowId: hit.rowId, colKey: schema.columns[colIdx]?.key ?? null }\n : { rowId: hit.rowId, colKey: hit.colKey };\n this.activeCell = anchorCell;\n this.onActiveChange(anchorCell.rowId, anchorCell.colKey);\n this.onSelectionChange(this.selectionRanges);\n this.updateFillHandleFlag();\n if (targetRange.kind === \"rows\") {\n this.selectionMode = true;\n this.selectionAnchor = null;\n this.focusSelectionInput(\"\");\n }\n }\n\n private mergeRanges(ranges: SelectionRange[]) {\n const merged: SelectionRange[] = [];\n const sorted = [...ranges].sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"rows\" ? -1 : 1;\n if (a.startRow !== b.startRow) return a.startRow - b.startRow;\n if (a.startCol !== b.startCol) return a.startCol - b.startCol;\n if (a.endRow !== b.endRow) return a.endRow - b.endRow;\n return a.endCol - b.endCol;\n });\n for (const r of sorted) {\n const last = merged.at(-1);\n if (!last) {\n merged.push({ ...r });\n continue;\n }\n if (last.kind !== r.kind) {\n merged.push({ ...r });\n continue;\n }\n if (r.kind === \"rows\") {\n const canMerge =\n last.startCol === r.startCol &&\n last.endCol === r.endCol &&\n last.startRow <= r.endRow + 1 &&\n r.startRow <= last.endRow + 1;\n if (canMerge) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n } else {\n const sameCols = last.startCol === r.startCol && last.endCol === r.endCol;\n const sameRows = last.startRow === r.startRow && last.endRow === r.endRow;\n const rowsTouch = last.startRow <= r.endRow + 1 && r.startRow <= last.endRow + 1;\n const colsTouch = last.startCol <= r.endCol + 1 && r.startCol <= last.endCol + 1;\n if (sameCols && rowsTouch) {\n last.startRow = Math.min(last.startRow, r.startRow);\n last.endRow = Math.max(last.endRow, r.endRow);\n continue;\n }\n if (sameRows && colsTouch) {\n last.startCol = Math.min(last.startCol, r.startCol);\n last.endCol = Math.max(last.endCol, r.endCol);\n continue;\n }\n }\n merged.push({ ...r });\n }\n return merged;\n }\n\n private activateCellElement(\n cell: HTMLElement,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n this.activeHost = cell;\n this.activeHostOriginalText = cell.textContent ?? \"\";\n const current = this.dataModel.getCell(rowId, colKey);\n this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, cell));\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n cell.textContent = \"\";\n cell.appendChild(input);\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n }\n\n private activateFloating(\n rect: DOMRect,\n rowId: string,\n colKey: string,\n options?: { initialValueOverride?: string; placeCursorAtEnd?: boolean },\n ) {\n this.teardownInput();\n this.activeCell = { rowId, colKey };\n void rect;\n const box = this.computeCanvasCellBoxContent(rowId, colKey);\n if (!box) return;\n const wrapper = document.createElement(\"div\");\n this.activeHost = wrapper;\n this.activeHostOriginalText = null;\n wrapper.style.position = \"absolute\";\n wrapper.dataset.extableFloating = \"fixed\";\n wrapper.style.pointerEvents = \"auto\";\n wrapper.style.padding = \"0\";\n wrapper.style.zIndex = \"10\";\n const current = this.dataModel.getCell(rowId, colKey);\n this.activeOriginalValue = { rowId, colKey, value: current };\n const initialValue =\n options?.initialValueOverride ?? this.getInitialEditValue(colKey, current);\n const { control, value } = this.createEditor(colKey, initialValue);\n const input = control;\n input.value = value;\n const isCheckbox = input instanceof HTMLInputElement && input.type === \"checkbox\";\n input.style.width = \"100%\";\n input.style.height = \"100%\";\n input.style.boxSizing = \"border-box\";\n input.style.margin = \"0\";\n input.style.padding = \"0\";\n input.style.border = \"none\";\n input.style.borderRadius = \"0\";\n input.style.boxShadow = \"none\";\n input.style.background = \"#fff\";\n input.style.outline = \"none\";\n input.style.fontSize = \"14px\";\n input.style.fontFamily = \"inherit\";\n input.style.lineHeight = \"16px\";\n input.style.fontWeight = \"inherit\";\n if (isCheckbox) {\n input.style.width = \"auto\";\n input.style.height = \"auto\";\n input.style.lineHeight = \"normal\";\n }\n const col = this.findColumn(colKey);\n input.style.textAlign =\n col?.style?.align ??\n (col?.type === \"number\" || col?.type === \"int\" || col?.type === \"uint\" ? \"right\" : \"left\");\n input.style.pointerEvents = \"auto\";\n input.addEventListener(\"keydown\", (e) => this.handleKey(e as KeyboardEvent, wrapper));\n input.addEventListener(\"compositionstart\", this.handleInputCompositionStart);\n input.addEventListener(\"compositionend\", this.handleInputCompositionEnd);\n input.addEventListener(\"focus\", () => {\n if (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement) input.select();\n });\n this.bindImmediateCommit(input);\n wrapper.appendChild(input);\n if (input instanceof HTMLSelectElement) {\n // No auto focus/click for select; standard focus will allow selection on first interaction\n }\n if (input.tagName.toLowerCase() === \"textarea\") {\n requestAnimationFrame(() => {\n if (input instanceof HTMLTextAreaElement) this.autosize(input);\n });\n }\n this.root.appendChild(wrapper);\n this.positionFloatingContentBox(box, wrapper);\n input.focus({ preventScroll: true });\n if (\n options?.placeCursorAtEnd &&\n (input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement)\n ) {\n const end = input.value.length;\n input.setSelectionRange(end, end);\n }\n this.inputEl = input;\n this.floatingInputWrapper = wrapper;\n }\n\n private handleKey(e: KeyboardEvent, cell: HTMLElement) {\n if (!this.activeCell || !this.inputEl) return;\n const now = Date.now();\n if (e.isComposing || this.composing) return; // IME composing; ignore control keys\n if (now - this.lastCompositionEnd < 24) return; // absorb trailing key events right after IME commit\n const { rowId, colKey } = this.activeCell;\n if (colKey === null) return;\n const isTextarea = this.inputEl.tagName.toLowerCase() === \"textarea\";\n const isAltEnter = e.key === \"Enter\" && e.altKey;\n const commitAndMove = (deltaRow: number, deltaCol: number) => {\n const next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(deltaRow, deltaCol);\n };\n\n if (e.key === \"Tab\") {\n e.preventDefault();\n commitAndMove(0, e.shiftKey ? -1 : 1);\n return;\n }\n if (e.key === \"Enter\") {\n if (isTextarea && isAltEnter) {\n // allow newline insertion (Excel-like Alt+Enter)\n return;\n }\n e.preventDefault();\n commitAndMove(e.shiftKey ? -1 : 1, 0);\n return;\n }\n if (e.key === \"Escape\") {\n e.preventDefault();\n this.cancelEdit(cell);\n this.onMove();\n if (this.activeCell && this.activeCell.colKey !== null) {\n const current = this.dataModel.getCell(this.activeCell.rowId, this.activeCell.colKey);\n const currentText = this.cellToClipboardString(current);\n this.focusSelectionInput(currentText);\n }\n } else if (e.key === \"Backspace\" && this.inputEl.value === \"\") {\n e.preventDefault();\n this.commitEdit(rowId, colKey, \"\");\n this.onMove(rowId);\n this.teardownInput(false);\n this.moveActiveCell(0, 0);\n }\n }\n\n private commitEdit(rowId: string, colKey: string | null, value: unknown) {\n if (colKey === null) return;\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: value,\n };\n const commitNow = this.editMode === \"direct\";\n this.onEdit(cmd, commitNow);\n }\n\n private readActiveValue() {\n if (!this.inputEl || !this.activeCell) return this.inputEl?.value ?? \"\";\n if (this.inputEl instanceof HTMLInputElement) {\n if (this.inputEl.type === \"checkbox\") {\n return this.inputEl.checked;\n }\n if (this.inputEl.type === \"number\") {\n if (this.inputEl.value === \"\") return \"\";\n const parsed = Number(this.inputEl.value);\n return Number.isNaN(parsed) ? \"\" : parsed;\n }\n return this.inputEl.value;\n }\n if (this.inputEl instanceof HTMLSelectElement) {\n return this.inputEl.value;\n }\n return (this.inputEl as HTMLTextAreaElement).value;\n }\n\n private bindImmediateCommit(control: HTMLElement) {\n if (!this.activeCell) return;\n const isInstant =\n control instanceof HTMLInputElement\n ? control.type === \"checkbox\" ||\n control.type === \"date\" ||\n control.type === \"time\" ||\n control.type === \"datetime-local\"\n : control instanceof HTMLSelectElement;\n if (!isInstant) return;\n control.addEventListener(\"change\", () => {\n const ac = this.activeCell;\n if (!ac) return;\n const { rowId, colKey } = ac;\n if (colKey === null) return;\n const next = this.readActiveValueForCommit();\n if (!next.ok) return;\n this.commitEdit(rowId, colKey, next.value);\n this.onMove(rowId);\n this.teardownInput(false);\n });\n }\n\n private cancelEdit(cell: HTMLElement) {\n const ac = this.activeCell;\n if (!ac || ac.colKey === null) {\n this.teardownInput(false);\n cell.blur();\n return;\n }\n\n const { rowId, colKey } = ac;\n const orig =\n this.activeOriginalValue &&\n this.activeOriginalValue.rowId === rowId &&\n this.activeOriginalValue.colKey === colKey\n ? this.activeOriginalValue.value\n : this.dataModel.getCell(rowId, colKey);\n\n const current = this.dataModel.getCell(rowId, colKey);\n const norm = (v: unknown) => (v === null || v === undefined ? \"\" : v);\n const normalizedOrig = norm(orig);\n const normalizedCurrent = norm(current);\n\n // If something committed/changed during this edit session (e.g. due to a validation path),\n // revert it back to the original value. Otherwise, do not emit any command.\n if (!Object.is(normalizedCurrent, normalizedOrig)) {\n const cmd: Command = {\n kind: \"edit\",\n rowId,\n colKey,\n next: normalizedOrig,\n prev: normalizedCurrent,\n };\n this.onEdit(cmd, true);\n }\n\n this.teardownInput(false);\n cell.blur();\n }\n\n private teardownInput(clearActive = false) {\n removeFromParent(this.inputEl);\n removeFromParent(this.floatingInputWrapper);\n if (this.activeHost && this.activeHostOriginalText !== null) {\n this.activeHost.textContent = this.activeHostOriginalText;\n }\n this.inputEl = null;\n this.floatingInputWrapper = null;\n this.activeHost = null;\n this.activeHostOriginalText = null;\n this.activeOriginalValue = null;\n this.composing = false;\n if (clearActive) {\n this.activeCell = null;\n this.onActiveChange(null, null);\n }\n }\n}\n","export type CellPrimitive = string | number | boolean | null;\n\nexport type ButtonValue = string | { label: string; command: string; commandfor: string };\nexport type LinkValue = string | { label: string; href: string; target?: string };\n\nexport type CellValue =\n | CellPrimitive\n | Date\n | { kind: \"enum\"; value: string }\n | { kind: \"tags\"; values: string[] }\n | ButtonValue\n | LinkValue;\n\nexport type ColumnType =\n | \"string\"\n | \"number\"\n | \"int\"\n | \"uint\"\n | \"boolean\"\n | \"datetime\"\n | \"date\"\n | \"time\"\n | \"enum\"\n | \"tags\"\n | \"button\"\n | \"link\";\n\nexport type StringFormat = {\n maxLength?: number;\n regex?: string;\n};\n\nexport type NumberFormat = {\n precision?: number;\n scale?: number;\n signed?: boolean;\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for number display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"scientific\": scientific notation\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type IntegerFormat = {\n thousandSeparator?: boolean;\n negativeRed?: boolean;\n /**\n * Format token for integer display.\n * - \"decimal\": normal decimal formatting (default)\n * - \"binary\" | \"octal\" | \"hex\": prefixed base literals\n * - other strings are reserved for future/custom formatters\n */\n format?: string;\n};\n\nexport type BooleanFormat = \"checkbox\" | string | [string, string];\nexport type DateFormat = string;\nexport type TimeFormat = string;\nexport type DateTimeFormat = string;\n\nexport type ColumnFormat<TType extends ColumnType> = TType extends \"string\"\n ? StringFormat\n : TType extends \"number\"\n ? NumberFormat\n : TType extends \"int\" | \"uint\"\n ? IntegerFormat\n : TType extends \"boolean\"\n ? BooleanFormat\n : TType extends \"date\"\n ? DateFormat\n : TType extends \"time\"\n ? TimeFormat\n : TType extends \"datetime\"\n ? DateTimeFormat\n : never;\n\nexport type ResolvedCellStyle = {\n backgroundColor?: string;\n textColor?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n readonly?: boolean;\n disabled?: boolean;\n};\n\nexport type StyleDelta = Partial<ResolvedCellStyle>;\n\nexport type DiagnosticLevel = \"warning\" | \"error\";\nexport type CellDiagnostic = {\n level: DiagnosticLevel;\n message: string;\n source: \"formula\" | \"conditionalStyle\";\n};\n\nexport type FormulaOk = string | boolean | number | Date;\nexport type FormulaWarn<T extends FormulaOk> = readonly [value: T, warning: Error];\nexport type FormulaReturn<T extends FormulaOk = FormulaOk> = T | FormulaWarn<T>;\n\nexport type ConditionalStyleFn<TData extends object = object> = (\n data: TData,\n) => StyleDelta | null | Error;\n\nexport type Updater<T> = T | ((oldValue: T) => T);\n\nexport type CellAddress =\n | { rowId: string; colKey: string }\n | { rowIndex: number; colIndex: number }\n | { rowId: string; colIndex: number }\n | { rowIndex: number; colKey: string };\n\nexport type CellTarget = {\n rowId: string;\n colKey: string;\n};\n\n// Forward declaration for recursive type inference\nexport interface ColumnSchema<\n TData extends object = object,\n RData extends object = TData,\n TType extends ColumnType = ColumnType,\n K extends string = string,\n> {\n key: K;\n type: TType;\n header?: string;\n readonly?: boolean;\n /**\n * When true, enforce uniqueness within this column (per table).\n * Duplicate (non-empty) values mark all duplicated cells as invalid.\n */\n unique?: boolean;\n nullable?: boolean;\n format?: ColumnFormat<TType>;\n enum?: { options: string[]; allowCustom?: boolean };\n tags?: { options: string[]; allowCustom?: boolean };\n width?: number; // px\n wrapText?: boolean; // allow per-column wrapping\n style?: {\n textColor?: string;\n backgroundColor?: string;\n align?: \"left\" | \"right\" | \"center\";\n decorations?: { strike?: boolean; underline?: boolean; bold?: boolean; italic?: boolean };\n readonly?: boolean;\n disabled?: boolean;\n };\n formula?: (data: TData) => unknown;\n conditionalStyle?: ConditionalStyleFn<RData>;\n}\n\n// Infer row data type from schema columns\nexport type InferSchemaData<TColumns extends readonly ColumnSchema<any>[]> = {\n [I in keyof TColumns]: TColumns[I] extends ColumnSchema<infer TData, any, infer TType, infer K>\n ? K extends keyof TData\n ? TData[K]\n : never\n : never;\n} extends (infer U)[]\n ? U extends object\n ? U\n : Record<string, unknown>\n : Record<string, unknown>;\n\nexport interface Schema<TData extends object = object, RData extends object = TData> {\n columns: ColumnSchema<TData, RData>[];\n row?: { conditionalStyle?: ConditionalStyleFn<RData> };\n}\n\n/**\n * Helper to lock schema generics so `formula`/`conditionalStyle` receive the correct row type.\n * Usage: `const schema = defineSchema<MyRow>({ columns: [...], row: {...} });`\n */\nexport const defineSchema = <TData extends object, RData extends object = TData>(\n schema: Schema<TData, RData>,\n): Schema<TData, RData> => schema;\n\nexport type RowObject<T extends object = Record<string, unknown>> = {\n _readonly?: boolean;\n} & T &\n Record<string, unknown>;\n\n// Public data is object-row arrays only. Use `null` or `undefined` for async loading.\nexport type NullableData<T extends object = object> = T[] | null | undefined;\n\nexport type ViewFilterOp = {\n kind: \"op\";\n key: string;\n op: \"eq\" | \"neq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"contains\";\n value: unknown;\n};\n\nexport type ViewFilterValues = {\n kind: \"values\";\n key: string;\n /** Allow-list of selected non-blank values. */\n values: unknown[];\n /** When true, blanks (null/undefined/\"\") are included. */\n includeBlanks?: boolean;\n};\n\nexport type ViewFilter = ViewFilterOp | ViewFilterValues;\n\nexport type ColumnDiagnosticFilter = {\n errors?: boolean;\n warnings?: boolean;\n};\n\nexport type ColumnDiagnosticFilterMap = Record<string, ColumnDiagnosticFilter>;\n\nexport interface ViewSort {\n key: string;\n dir: \"asc\" | \"desc\";\n}\n\nexport interface View {\n hiddenColumns?: string[];\n filters?: ViewFilter[];\n sorts?: ViewSort[];\n /**\n * Column-scoped diagnostic quick filters.\n * Key is the column key (stringified).\n */\n columnDiagnostics?: ColumnDiagnosticFilterMap;\n userId?: string; // personalization\n columnWidths?: Record<string, number>; // key -> px\n rowHeights?: Record<string, number>;\n wrapText?: Record<string, boolean>; // view override per column\n}\n\nexport type RenderMode = \"html\" | \"canvas\" | \"auto\";\nexport type EditMode = \"direct\" | \"commit\" | \"readonly\";\nexport type LockMode = \"none\" | \"row\";\n\nexport interface Command {\n kind: \"edit\" | \"deleteRow\" | \"insertRow\" | \"updateView\" | \"lock\" | \"unlock\";\n rowId?: string;\n colKey?: string;\n rowData?: RowObject;\n prev?: unknown;\n next?: unknown;\n payload?: unknown;\n}\n\nexport type CommitChanges = {\n commands: Command[];\n user?: UserInfo;\n};\n\nexport type CommitHandler = (changes: CommitChanges) => Promise<void>;\n\nexport interface UserInfo {\n id: string;\n name: string;\n}\n\nexport interface ServerAdapter {\n fetchInitial?: () => Promise<{\n data: Record<string, unknown>[];\n view?: View;\n schema?: Schema;\n user: UserInfo;\n }>;\n lockRow: (rowId: string, user: UserInfo) => Promise<void>;\n unlockRows: (rowIds: string[], user: UserInfo) => Promise<void>;\n commit: (commands: Command[], user: UserInfo) => Promise<void>;\n subscribe: (onEvent: (event: ServerEvent) => void) => () => void;\n}\n\nexport type ServerEvent = { type: \"update\"; commands: Command[]; user: UserInfo };\n\nexport interface CoreOptions {\n renderMode?: RenderMode;\n editMode?: EditMode;\n lockMode?: LockMode;\n /** Preferred languages for auto-fill sequence matching (e.g. [\"ja\", \"en\"]). */\n langs?: string[];\n defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n server?: ServerAdapter;\n user?: UserInfo;\n}\n\nexport interface TableConfig<T extends object = Record<string, unknown>> {\n data: T[] | null;\n view: View;\n schema: Schema;\n}\n\nexport type HistoryCommandKind = Command[\"kind\"];\n\nexport type UndoRedoStep = {\n batchId: string | null;\n kinds: HistoryCommandKind[];\n commandCount: number;\n label: string;\n};\n\nexport type UndoRedoHistory = {\n /** Top (index 0) is the next undo step. */\n undo: UndoRedoStep[];\n /** Top (index 0) is the next redo step. */\n redo: UndoRedoStep[];\n};\n\nexport interface InternalRow {\n id: string;\n raw: RowObject;\n displayIndex: number;\n}\n\nexport type SelectionKind = \"cells\" | \"rows\";\n\nexport interface SelectionRange {\n kind: SelectionKind;\n startRow: number;\n endRow: number;\n startCol: number;\n endCol: number;\n}\n\nexport type ToggleState = \"on\" | \"off\" | \"mixed\" | \"disabled\";\nexport type ColorState = string | \"mixed\" | null | \"disabled\";\n\nexport type TableError = {\n scope: \"validation\" | \"commit\" | \"render\" | \"formula\" | \"conditionalStyle\" | \"unknown\";\n message: string;\n target?: { rowId?: string; colKey?: string };\n};\n\nexport type ButtonActionValue =\n | { label: string; command?: undefined; commandfor?: undefined }\n | { label: string; command: string; commandfor: string };\n\nexport type CellAction = {\n kind: \"button\";\n rowId: string;\n colKey: string;\n value: ButtonActionValue;\n};\n\nexport type TableState = {\n canCommit: boolean;\n pendingCommandCount: number;\n pendingCellCount?: number;\n undoRedo: { canUndo: boolean; canRedo: boolean };\n renderMode: \"html\" | \"canvas\";\n activeErrors: TableError[];\n};\n\nexport type TableStateListener = (next: TableState, prev: TableState | null) => void;\n\nexport type RowStateSnapshot<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = {\n rowId: string;\n rowIndex: number;\n data: TResult;\n pending?: Partial<TInput>;\n diagnostics?: TableError[];\n};\n\nexport type RowChangeReason = \"new\" | \"edit\" | \"delete\";\nexport type RowStateListener<\n TInput extends object = Record<string, unknown>,\n TResult extends object = TInput,\n> = (\n rowId: string,\n next: RowStateSnapshot<TInput, TResult> | null,\n prev: RowStateSnapshot<TInput, TResult> | null,\n reason: RowChangeReason,\n) => void;\n\nexport type SelectionSnapshot = {\n ranges: SelectionRange[];\n activeRowIndex: number | null;\n activeRowKey: string | null;\n activeColumnIndex: number | null;\n activeColumnKey: string | null;\n activeValueRaw: unknown;\n activeValueDisplay: string;\n activeValueType: ColumnType | null;\n diagnostic: CellDiagnostic | null;\n action?: CellAction | null;\n styles: {\n columnStyle: Partial<ResolvedCellStyle>;\n cellStyle: Partial<ResolvedCellStyle>;\n resolved: Partial<ResolvedCellStyle>;\n };\n};\n\nexport type SelectionChangeReason =\n | \"selection\"\n | \"edit\"\n | \"action\"\n | \"style\"\n | \"schema\"\n | \"view\"\n | \"data\"\n | \"unknown\";\nexport type SelectionListener = (\n next: SelectionSnapshot,\n prev: SelectionSnapshot | null,\n reason: SelectionChangeReason,\n) => void;\n","import \"./styles.css\";\nimport { CommandQueue } from \"./commandQueue\";\nimport { DataModel } from \"./dataModel\";\nimport { resolveCellAddress } from \"./address\";\nimport { LockManager } from \"./lockManager\";\nimport { CanvasRenderer, HTMLRenderer, type Renderer, type ViewportState } from \"./renderers\";\nimport { SelectionManager } from \"./selectionManager\";\nimport { resolveCellStyles } from \"./styleResolver\";\nimport { getButtonLabel, getLinkLabel } from \"./actionValue\";\nimport { removeFromParent, toArray } from \"./utils\";\nimport type {\n CellAction,\n CellTarget,\n Command,\n CommitHandler,\n CoreOptions,\n HistoryCommandKind,\n InternalRow,\n NullableData,\n EditMode,\n LockMode,\n RenderMode,\n Schema,\n ServerAdapter,\n SelectionChangeReason,\n SelectionListener,\n SelectionRange,\n SelectionSnapshot,\n TableConfig,\n TableError,\n TableState,\n TableStateListener,\n UndoRedoHistory,\n UndoRedoStep,\n UserInfo,\n Updater,\n View,\n ViewFilterValues,\n RowObject,\n RowStateSnapshot,\n RowStateListener,\n RowChangeReason,\n} from \"./types\";\n\nexport * from \"./types\";\n\nexport interface CoreInit<T extends object = Record<string, unknown>> {\n root: HTMLElement;\n defaultData: NullableData<T>;\n defaultView: View;\n schema: Schema<any>;\n options?: CoreOptions;\n}\n\nexport class ExtableCore<T extends object = Record<string, unknown>, R extends object = T> {\n private root: HTMLElement;\n private shell: HTMLDivElement | null = null;\n private viewportEl: HTMLDivElement | null = null;\n private viewportResizeObserver: ResizeObserver | null = null;\n private dataModel: DataModel;\n private dataLoaded: boolean;\n private commandQueue: CommandQueue;\n private lockManager: LockManager;\n private renderer: Renderer;\n private selectionManager: SelectionManager | null = null;\n private renderMode: RenderMode;\n private editMode: EditMode;\n private lockMode: LockMode;\n private server?: ServerAdapter;\n private user?: UserInfo;\n private unsubscribe?: () => void;\n private resizeHandler: (() => void) | null = null;\n private scrollHandler: (() => void) | null = null;\n private viewportState: ViewportState | null = null;\n private rafId: number | null = null;\n private contextMenu: HTMLDivElement | null = null;\n private contextMenuRowId: string | null = null;\n private handleGlobalPointer: ((ev: MouseEvent | PointerEvent) => void) | null = null;\n private toast: HTMLDivElement | null = null;\n private toastTimer: number | null = null;\n private sequenceLangs?: readonly string[];\n\n private mounted = false;\n\n private isCellReadonly(rowId: string, colKey: string) {\n return this.editMode === \"readonly\" || this.dataModel.isReadonly(rowId, colKey);\n }\n\n private resolveRowId(row: string | number): string | null {\n if (typeof row === \"string\") {\n return this.findRowById(row)?.id ?? null;\n }\n const found = this.dataModel.listAllRows()[row] ?? null;\n return found?.id ?? null;\n }\n\n private filterSortSidebar: HTMLElement | null = null;\n private filterSortSidebarUnsub: (() => void) | null = null;\n private filterSortKeydown: ((ev: KeyboardEvent) => void) | null = null;\n private filterSortClickCapture: ((ev: MouseEvent) => void) | null = null;\n private filterSortOpenEvent: ((ev: Event) => void) | null = null;\n private filterSortActiveColumnKey: string | null = null;\n private filterSortDraft: {\n colKey: string;\n values: Array<{ key: string; value: unknown; label: string }>;\n hasBlanks: boolean;\n selected: Set<string>;\n includeBlanks: boolean;\n diagErrors: boolean;\n diagWarnings: boolean;\n search: string;\n } | null = null;\n\n private tableStateListeners = new Set<TableStateListener>();\n private selectionListeners = new Set<SelectionListener>();\n private lastTableState: TableState | null = null;\n private lastSelectionSnapshot: SelectionSnapshot | null = null;\n private lastAction: CellAction | null = null;\n private selectionRanges: SelectionRange[] = [];\n private activeCell: CellTarget | null = null;\n private activeErrors: TableError[] = [];\n private rowStateListeners = new Set<RowStateListener<T, R>>();\n private lastRowStates = new Map<string, RowStateSnapshot<T, R>>();\n\n private isFilterSortPanelVisible() {\n return this.root.classList.contains(\"extable-filter-sort-open\");\n }\n\n private safeRender(state?: ViewportState) {\n try {\n this.renderer.render(state);\n const hadRenderError = this.activeErrors.some((e) => e.scope === \"render\");\n if (hadRenderError) {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"render\");\n this.emitTableState();\n }\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"render\"),\n { scope: \"render\", message },\n ];\n this.emitTableState();\n }\n }\n\n constructor(init: CoreInit<T>) {\n this.root = init.root;\n this.root.classList.add(\"extable-root\");\n this.renderMode = init.options?.renderMode ?? \"auto\";\n this.editMode = init.options?.editMode ?? \"direct\";\n this.lockMode = init.options?.lockMode ?? \"none\";\n this.server = init.options?.server;\n this.user = init.options?.user;\n this.sequenceLangs = init.options?.langs;\n\n const defaultData = init.defaultData ?? null;\n const initialData = defaultData ?? [];\n this.dataLoaded = defaultData !== null && defaultData !== undefined;\n this.dataModel = new DataModel(\n initialData as unknown as RowObject[],\n init.schema,\n init.defaultView,\n );\n this.commandQueue = new CommandQueue();\n this.lockManager = new LockManager(this.lockMode, this.server, this.user);\n this.renderer = this.chooseRenderer(this.renderMode);\n this.applyRootDecor(init.options);\n this.applyReadonlyClass();\n void this.loadInitial();\n }\n\n private async loadInitial() {\n if (this.server?.fetchInitial) {\n try {\n const initial = await this.server.fetchInitial();\n this.dataModel.setData(initial.data);\n if (initial.schema) this.dataModel.setSchema(initial.schema);\n if (initial.view) this.dataModel.setView(initial.view);\n this.user = initial.user ?? this.user;\n this.lockManager.setUser(this.user);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"fetchInitial failed\", e);\n }\n }\n this.mount();\n }\n\n private applyRootDecor(options?: CoreOptions) {\n const classes = toArray(options?.defaultClass);\n if (classes?.length) {\n this.root.classList.add(...classes);\n }\n if (options?.defaultStyle) {\n for (const [k, v] of Object.entries(options.defaultStyle)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n }\n\n private applyReadonlyClass() {\n this.root.classList.toggle(\"extable-readonly-all\", this.editMode === \"readonly\");\n }\n\n private chooseRenderer(mode: RenderMode): Renderer {\n if (mode === \"auto\") {\n const ua = typeof navigator !== \"undefined\" ? navigator.userAgent : \"\";\n type UserAgentBrand = { brand?: string };\n type NavigatorWithUAData = Navigator & { userAgentData?: { brands?: UserAgentBrand[] } };\n const isBot =\n /bot|crawl|spider|playwright|puppeteer|selenium|phantomjs/i.test(ua) ||\n (typeof navigator !== \"undefined\" &&\n \"userAgentData\" in navigator &&\n (navigator as NavigatorWithUAData).userAgentData?.brands?.some((b) =>\n /bot/i.test(b.brand ?? \"\"),\n ));\n return isBot\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n return mode === \"html\"\n ? new HTMLRenderer(this.dataModel)\n : new CanvasRenderer(this.dataModel, () => this.editMode);\n }\n\n private ensureShell() {\n if (this.shell && this.viewportEl && this.shell.parentElement === this.root) return;\n this.root.innerHTML = \"\";\n const shell = document.createElement(\"div\");\n shell.className = \"extable-shell\";\n const viewport = document.createElement(\"div\");\n viewport.className = \"extable-viewport\";\n shell.appendChild(viewport);\n this.root.appendChild(shell);\n this.shell = shell;\n this.viewportEl = viewport;\n\n this.viewportResizeObserver?.disconnect();\n const anyRO = globalThis.ResizeObserver as typeof ResizeObserver | undefined;\n if (typeof anyRO === \"function\") {\n this.viewportResizeObserver = new anyRO(() => {\n this.updateViewportFromRoot();\n });\n this.viewportResizeObserver.observe(viewport);\n } else {\n this.viewportResizeObserver = null;\n }\n }\n\n private getScrollHost() {\n return this.viewportEl ?? this.root;\n }\n\n private mount(force = false) {\n if (this.mounted && !force) return;\n this.ensureShell();\n const host = this.viewportEl ?? this.root;\n this.renderer.mount(host);\n this.ensureContextMenu();\n this.ensureToast();\n this.initViewportState();\n\n this.root.classList.toggle(\"extable-loading\", !this.dataLoaded);\n if (!this.dataLoaded) {\n this.root.dataset.extable = \"loading\";\n this.bindViewport();\n this.ensureFilterSort();\n this.emitTableState();\n this.emitSelection(\"data\");\n return;\n }\n this.selectionManager = new SelectionManager(\n host,\n this.editMode,\n (cmd, commitNow) => this.handleEdit(cmd, commitNow),\n (rowId) => void this.lockManager.selectRow(rowId),\n (rowId) => void this.lockManager.unlockOnMove(rowId),\n (ev) => this.renderer.hitTest(ev),\n this.renderer.hitTestAction ? (ev) => this.renderer.hitTestAction!(ev) : null,\n this.dataModel,\n this.sequenceLangs,\n (rowId, colKey) => this.isCellReadonly(rowId, colKey),\n (action) => this.emitAction(action),\n (rowId, colKey) => {\n const target: CellTarget | null = rowId && colKey !== null ? { rowId, colKey } : null;\n if (target) this.renderer.setActiveCell(target.rowId, target.colKey);\n this.activeCell = target;\n this.emitSelection(\"selection\");\n },\n (rowId, _colKey, x, y) => this.showContextMenu(rowId, x, y),\n (ranges) => {\n this.selectionRanges = ranges;\n this.renderer.setSelection(ranges);\n this.emitSelection(\"selection\");\n },\n () => this.undo(),\n () => this.redo(),\n );\n this.root.dataset.extable = \"ready\";\n this.bindViewport();\n this.ensureFilterSort();\n if (this.server) {\n this.unsubscribe = this.server.subscribe((event) => this.handleServerEvent(event));\n }\n this.emitTableState();\n this.emitSelection(\"selection\");\n this.mounted = true;\n }\n\n destroy() {\n this.teardownFilterSort();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.unsubscribe?.();\n this.unbindViewport();\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.mounted = false;\n }\n\n // editMode/lockMode are configured only at construction time for consistency.\n\n setRootClass(classNames: string | string[]) {\n this.root.className = \"\";\n this.root.classList.add(...(toArray(classNames) ?? []));\n }\n\n setRootStyle(style: Partial<CSSStyleDeclaration>) {\n for (const [k, v] of Object.entries(style)) {\n // @ts-expect-error CSSStyleDeclaration index\n this.root.style[k] = v ?? \"\";\n }\n }\n\n setData(data: NullableData<T>) {\n if (data == null) {\n // Allow loading only before the first successful data load.\n if (this.dataLoaded) return;\n this.dataLoaded = false;\n this.safeRender(this.viewportState ?? undefined);\n this.emitSelection(\"data\");\n this.emitTableState();\n return;\n }\n const wasLoaded = this.dataLoaded;\n this.dataLoaded = true;\n this.dataModel.setData(data as unknown as RowObject[]);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n\n if (!wasLoaded) {\n this.root.classList.remove(\"extable-loading\");\n this.selectionManager?.destroy();\n this.selectionManager = null;\n this.mount();\n }\n }\n\n setView(view: View) {\n this.dataModel.setView(view);\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"view\");\n this.emitTableState();\n }\n\n // Public API: configuration getters (mirror setters)\n getSchema(): Schema {\n return this.dataModel.getSchema();\n }\n\n getView(): View {\n return this.dataModel.getView();\n }\n\n /**\n * Returns the current table data (includes pending edits in commit mode and formula results).\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getData(): R[] {\n return this.getTableData();\n }\n\n /**\n * Returns the raw dataset without pending edits and without formula results.\n * Note: This is the full dataset (not affected by view filters/sorts). Use `listRows()` for the visible rows.\n */\n getRawData(): T[] {\n return this.dataModel.listAllRows().map((r) => ({ ...(r.raw as unknown as T) }));\n }\n\n // Public API: cell-level access\n getCell<K extends keyof R & string>(rowId: string, colKey: K): R[K] | undefined {\n return this.dataModel.getCell(rowId, colKey) as R[K] | undefined;\n }\n\n // Public API: row/column index utilities\n getRowIndex(rowId: string): number {\n return this.dataModel.getRowIndex(rowId);\n }\n\n getColumnIndex(colKey: string): number {\n return this.dataModel.getColumnIndex(colKey);\n }\n\n // Public API: row-level access\n findRowById(rowId: string): InternalRow | null {\n const idx = this.dataModel.getBaseRowIndex(rowId);\n if (idx < 0) return null;\n return this.dataModel.listAllRows()[idx] ?? null;\n }\n\n listRows(): InternalRow[] {\n return this.dataModel.listRows();\n }\n\n getAllRows(): InternalRow[] {\n return this.dataModel.listAllRows();\n }\n\n /**\n * Returns a single row as an object (includes pending edits in commit mode and formula results).\n * When a number is passed, it is interpreted as the base row index (not affected by view filters/sorts).\n */\n getRow(rowIdOrIndex: string | number): R | null {\n const rowId = this.resolveRowId(rowIdOrIndex);\n if (!rowId) return null;\n return this.buildRow(rowId);\n }\n\n private buildRow(rowId: string): R | null {\n const found = this.findRowById(rowId);\n if (!found) return null;\n const schema = this.dataModel.getSchema();\n const out: Record<string, unknown> = { ...(found.raw as Record<string, unknown>) };\n for (const col of schema.columns) {\n out[col.key] = this.dataModel.resolveCellValue(rowId, col).value;\n }\n return out as R;\n }\n\n // Public API: bulk data access\n getTableData(): R[] {\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.buildRow(r.id)).filter(Boolean) as R[];\n }\n\n getColumnData<K extends keyof R & string>(colKey: K): R[K][] {\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => c.key === colKey);\n if (!col) return [];\n const rows = this.dataModel.listAllRows();\n return rows.map((r) => this.dataModel.resolveCellValue(r.id, col).value as R[K]);\n }\n\n // Public API: commit-mode pending helpers\n getPending(): Map<string, Record<string, unknown>> {\n if (this.editMode !== \"commit\") return new Map();\n return new Map(this.dataModel.getPending());\n }\n\n getPendingRowIds(): string[] {\n return [...this.getPending().keys()];\n }\n\n hasPendingChanges(): boolean {\n return this.getPending().size > 0;\n }\n\n getPendingCellCount(): number {\n const pending = this.getPending();\n let count = 0;\n for (const row of pending.values()) count += Object.keys(row).length;\n return count;\n }\n\n getCellPending<K extends keyof R & string>(row: string | number, colKey: K): boolean {\n if (this.editMode !== \"commit\") return false;\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n return this.dataModel.hasPending(rowId, colKey);\n }\n\n getDisplayValue<K extends keyof R & string>(row: string | number, colKey: K): string {\n const rowId = this.resolveRowId(row);\n if (!rowId) return \"\";\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) return \"\";\n const res = this.dataModel.resolveCellValue(rowId, col);\n if (res.textOverride) return res.textOverride;\n const v = res.value;\n if (col.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const vv = v as Record<string, unknown>;\n if (vv.kind === \"enum\" && typeof vv.value === \"string\") return vv.value;\n if (vv.kind === \"tags\" && Array.isArray(vv.values)) {\n const values = vv.values.filter((x): x is string => typeof x === \"string\");\n return values.join(\", \");\n }\n }\n return String(v);\n }\n\n insertRow(rowData: T, position?: number | string): string | null {\n let insertAt: number | null = null;\n if (typeof position === \"number\" && Number.isFinite(position)) {\n insertAt = Math.max(0, Math.min(Math.floor(position), this.dataModel.getAllRowCount()));\n } else if (typeof position === \"string\") {\n const baseIdx = this.dataModel.getBaseRowIndex(position);\n if (baseIdx >= 0) insertAt = baseIdx;\n }\n if (insertAt === null) insertAt = this.dataModel.getAllRowCount();\n const newId = this.dataModel.insertRowAt(rowData as unknown as RowObject, insertAt);\n const cmd: Command = {\n kind: \"insertRow\",\n rowId: newId,\n rowData: rowData as unknown as RowObject,\n payload: { index: insertAt },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return newId;\n }\n\n deleteRow(row: string | number): boolean {\n const rowId = this.resolveRowId(row);\n if (!rowId) return false;\n const removed = this.dataModel.removeRow(rowId);\n if (!removed) return false;\n const cmd: Command = {\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n };\n this.commandQueue.enqueue(cmd);\n this.emitRowState(rowId, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n if (this.editMode === \"direct\") void this.sendCommit([cmd]);\n return true;\n }\n\n private handleEdit(cmd: Command, commitNow: boolean) {\n if (this.editMode === \"readonly\") return;\n if (!cmd.rowId || cmd.colKey === undefined) return;\n const prev = this.dataModel.getCell(cmd.rowId, cmd.colKey);\n this.commandQueue.enqueue({ ...cmd, prev });\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, commitNow);\n this.emitRowState(cmd.rowId, \"edit\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n if (commitNow) {\n void this.sendCommit([cmd]);\n }\n }\n\n undo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.undo();\n if (!cmds || !cmds.length) return;\n // Apply inverse operations in reverse order.\n for (let i = cmds.length - 1; i >= 0; i -= 1) {\n const cmd = cmds[i];\n if (!cmd) continue;\n this.applyInverse(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n redo() {\n this.selectionManager?.cancelEditing();\n const cmds = this.commandQueue.redo();\n if (!cmds || !cmds.length) return;\n for (const cmd of cmds) {\n this.applyForward(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n }\n\n getUndoRedoHistory(): UndoRedoHistory {\n const toKinds = (cmds: Command[]): HistoryCommandKind[] => {\n const seen = new Set<HistoryCommandKind>();\n const kinds: HistoryCommandKind[] = [];\n for (const c of cmds) {\n if (seen.has(c.kind)) continue;\n seen.add(c.kind);\n kinds.push(c.kind);\n }\n return kinds;\n };\n\n const labelFor = (kinds: HistoryCommandKind[], commandCount: number) => {\n if (kinds.length === 1 && kinds[0] === \"edit\") {\n return `Edit ${commandCount} cell(s)`;\n }\n if (kinds.length === 1 && kinds[0] === \"insertRow\") {\n return commandCount === 1 ? \"Insert row\" : `Insert row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"deleteRow\") {\n return commandCount === 1 ? \"Delete row\" : `Delete row (${commandCount})`;\n }\n if (kinds.length === 1 && kinds[0] === \"updateView\") {\n return \"Update view\";\n }\n return `Command: ${kinds.join(\", \")} (${commandCount})`;\n };\n\n const toSteps = (groups: { batchId: string | null; commands: Command[] }[]): UndoRedoStep[] =>\n groups.map((g) => {\n const kinds = toKinds(g.commands);\n const commandCount = g.commands.length;\n return {\n batchId: g.batchId,\n kinds,\n commandCount,\n label: labelFor(kinds, commandCount),\n };\n });\n\n return {\n undo: toSteps(this.commandQueue.listUndoGroups()),\n redo: toSteps(this.commandQueue.listRedoGroups()),\n };\n }\n\n private applyInverse(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.prev, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowId) this.dataModel.removeRow(cmd.rowId);\n if (cmd.rowId) this.emitRowState(cmd.rowId, \"delete\");\n return;\n case \"deleteRow\":\n if (cmd.rowId && cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n this.dataModel.insertRowAt(cmd.rowData, index, cmd.rowId);\n this.emitRowState(cmd.rowId, \"new\");\n }\n return;\n default:\n return;\n }\n }\n\n private applyForward(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, this.editMode === \"direct\");\n this.emitRowState(cmd.rowId, \"edit\");\n }\n return;\n case \"insertRow\":\n if (cmd.rowData) {\n const idx = (cmd.payload as Record<string, unknown> | undefined)?.index;\n const index = typeof idx === \"number\" ? idx : this.dataModel.getAllRowCount();\n const forcedId = typeof cmd.rowId === \"string\" ? cmd.rowId : undefined;\n this.dataModel.insertRowAt(cmd.rowData, index, forcedId);\n if (forcedId) this.emitRowState(forcedId, \"new\");\n }\n return;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n return;\n default:\n return;\n }\n }\n\n async commit(): Promise<RowStateSnapshot<T, R>[]>;\n async commit(handler: CommitHandler): Promise<RowStateSnapshot<T, R>[]>;\n async commit(handler?: CommitHandler): Promise<RowStateSnapshot<T, R>[]> {\n const pending = this.commandQueue.listApplied();\n if (!pending.length) return [];\n if (handler) {\n try {\n await handler({ commands: pending, user: this.user });\n this.clearCommitErrors();\n } catch (e) {\n this.recordCommitError(e);\n throw e;\n }\n return this.finalizeCommit(pending);\n }\n const snapshots = this.finalizeCommit(pending, () => this.sendCommit(pending));\n return snapshots;\n }\n\n private async sendCommit(commands: Command[]) {\n if (this.server && this.user) {\n try {\n await this.server.commit(commands, this.user);\n this.clearCommitErrors();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"commit failed\", e);\n this.recordCommitError(e);\n }\n }\n }\n\n private clearCommitErrors() {\n this.activeErrors = this.activeErrors.filter((e) => e.scope !== \"commit\");\n this.emitTableState();\n }\n\n private recordCommitError(error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n this.activeErrors = [\n ...this.activeErrors.filter((x) => x.scope !== \"commit\"),\n { scope: \"commit\", message: msg },\n ];\n this.emitTableState();\n }\n\n private finalizeCommit(\n pending: Command[],\n afterApply?: () => Promise<void>,\n ): Promise<RowStateSnapshot<T, R>[]> {\n const touched = new Set<string>();\n for (const cmd of pending) {\n if (cmd.rowId) {\n this.dataModel.applyPending(cmd.rowId);\n touched.add(cmd.rowId);\n }\n }\n const run = async () => {\n if (afterApply) await afterApply();\n await this.lockManager.unlockOnCommit(pending.at(-1)?.rowId);\n this.commandQueue.clear();\n const snapshots: RowStateSnapshot<T, R>[] = [];\n for (const rowId of touched) {\n this.emitRowState(rowId, \"edit\");\n const snap = this.getRowStateSnapshot(rowId);\n if (snap) snapshots.push(snap);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitTableState();\n this.emitSelection(\"edit\");\n return snapshots;\n };\n return run();\n }\n\n private handleServerEvent(event: {\n type: \"update\";\n commands: Command[];\n user: UserInfo;\n }) {\n for (const cmd of event.commands) {\n this.applyCommand(cmd);\n }\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.emitSelection(\"data\");\n this.emitTableState();\n }\n\n private applyCommand(cmd: Command) {\n switch (cmd.kind) {\n case \"edit\":\n if (cmd.rowId && cmd.colKey !== undefined) {\n this.dataModel.setCell(cmd.rowId, cmd.colKey, cmd.next, true);\n this.emitRowState(cmd.rowId, \"edit\");\n }\n break;\n case \"insertRow\":\n if (cmd.rowData) {\n const id = this.dataModel.insertRow(cmd.rowData);\n if (id) this.emitRowState(id, \"new\");\n }\n break;\n case \"deleteRow\":\n if (cmd.rowId) {\n this.dataModel.removeRow(cmd.rowId);\n this.emitRowState(cmd.rowId, \"delete\");\n }\n break;\n case \"updateView\":\n if (cmd.next && typeof cmd.next === \"object\") {\n this.dataModel.setView(cmd.next as View);\n }\n break;\n default:\n break;\n }\n }\n\n private ensureContextMenu() {\n if (this.contextMenu?.isConnected) return;\n this.contextMenu = null;\n const pop = document.createElement(\"div\");\n pop.className = \"extable-context-menu\";\n pop.setAttribute(\"popover\", \"manual\");\n pop.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n const readonlyMode = this.editMode === \"readonly\";\n const actions: Array<{ key: string; label?: string; kind?: \"sep\" }> = readonlyMode\n ? [{ key: \"copy\", label: \"Copy\" }]\n : [\n { key: \"copy\", label: \"Copy\" },\n { key: \"paste\", label: \"Paste\" },\n { key: \"sep-top\", kind: \"sep\" },\n { key: \"undo\", label: \"Undo\" },\n { key: \"redo\", label: \"Redo\" },\n { key: \"sep-mid\", kind: \"sep\" },\n { key: \"insert-above\", label: \"Insert row above\" },\n { key: \"insert-below\", label: \"Insert row below\" },\n { key: \"delete-row\", label: \"Delete row\" },\n ];\n const list = document.createElement(\"div\");\n for (const act of actions) {\n if (act.kind === \"sep\") {\n const hr = document.createElement(\"hr\");\n hr.className = \"extable-context-sep\";\n list.appendChild(hr);\n continue;\n }\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.dataset.action = act.key;\n btn.textContent = act.label ?? \"\";\n btn.addEventListener(\"click\", () => {\n this.handleContextAction(act.key);\n this.closeContextMenu();\n });\n list.appendChild(btn);\n }\n pop.appendChild(list);\n (this.viewportEl ?? this.root).appendChild(pop);\n this.contextMenu = pop;\n }\n\n private showContextMenu(rowId: string | null, clientX: number, clientY: number) {\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n if (!this.contextMenu.isConnected) {\n // Host may have been rebuilt (e.g. renderer switch). Recreate.\n this.contextMenu = null;\n this.ensureContextMenu();\n if (!this.contextMenu) return;\n }\n this.contextMenuRowId = rowId;\n // Update enable/disable state for undo/redo.\n for (const btn of Array.from(\n this.contextMenu.querySelectorAll<HTMLButtonElement>(\"button[data-action]\"),\n )) {\n const action = btn.dataset.action;\n if (action === \"undo\") btn.disabled = !this.commandQueue.canUndo();\n else if (action === \"redo\") btn.disabled = !this.commandQueue.canRedo();\n }\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const rect = { width: 220, height: 160 };\n let left = clientX;\n let top = clientY;\n if (left + rect.width > viewportWidth) left = Math.max(0, viewportWidth - rect.width - 8);\n if (top + rect.height > viewportHeight) top = Math.max(0, viewportHeight - rect.height - 8);\n this.contextMenu.style.left = `${left}px`;\n this.contextMenu.style.top = `${top}px`;\n this.contextMenu.hidePopover?.();\n this.contextMenu.showPopover?.();\n }\n\n private handleContextAction(action: string) {\n if (action === \"copy\") {\n void this.selectionManager?.copySelection();\n return;\n }\n if (action === \"paste\") {\n void this.selectionManager?.pasteFromClipboard();\n return;\n }\n if (action === \"undo\") {\n this.undo();\n return;\n }\n if (action === \"redo\") {\n this.redo();\n return;\n }\n if (!this.contextMenuRowId) return;\n const idx = this.dataModel.getBaseRowIndex(this.contextMenuRowId);\n const targetIndex = idx >= 0 ? idx : this.dataModel.getAllRowCount();\n if (action === \"insert-above\" || action === \"insert-below\") {\n const insertAt = action === \"insert-above\" ? targetIndex : targetIndex + 1;\n const raw = this.createBlankRow();\n const newId = this.dataModel.insertRowAt(raw, insertAt);\n this.commandQueue.enqueue({\n kind: \"insertRow\",\n rowId: newId,\n rowData: raw,\n payload: { index: insertAt },\n });\n this.emitRowState(newId, \"new\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row inserted\", \"info\");\n return;\n }\n if (action === \"delete-row\") {\n const removed = this.dataModel.removeRow(this.contextMenuRowId);\n if (!removed) return;\n this.commandQueue.enqueue({\n kind: \"deleteRow\",\n rowId: removed.row.id,\n rowData: removed.row.raw,\n payload: { index: removed.index },\n });\n this.emitRowState(removed.row.id, \"delete\");\n this.safeRender(this.viewportState ?? undefined);\n this.selectionManager?.syncAfterRowsChanged();\n this.showToast(\"Row deleted\", \"info\");\n return;\n }\n }\n\n private createBlankRow(): RowObject {\n const schema = this.dataModel.getSchema();\n const obj: RowObject = {};\n for (const col of schema.columns) {\n obj[String(col.key)] = null;\n }\n return obj;\n }\n\n private closeContextMenu() {\n this.contextMenu?.hidePopover?.();\n }\n\n private ensureToast() {\n if (this.toast?.isConnected) return;\n this.toast = null;\n const toast = document.createElement(\"div\");\n toast.className = \"extable-toast\";\n toast.setAttribute(\"popover\", \"manual\");\n toast.style.right = \"16px\";\n toast.style.bottom = \"16px\";\n toast.style.position = \"fixed\";\n (this.viewportEl ?? this.root).appendChild(toast);\n this.toast = toast;\n }\n\n private showToast(message: string, variant: \"info\" | \"error\" = \"info\", durationMs = 2500) {\n this.ensureToast();\n if (!this.toast) return;\n this.toast.textContent = message;\n this.toast.dataset.variant = variant;\n this.toast.hidePopover?.();\n this.toast.showPopover?.();\n if (this.toastTimer) {\n window.clearTimeout(this.toastTimer);\n this.toastTimer = null;\n }\n this.toastTimer = window.setTimeout(() => {\n this.toast?.hidePopover?.();\n }, durationMs);\n }\n\n private bindViewport() {\n this.resizeHandler = () => this.updateViewportFromRoot();\n this.scrollHandler = () => this.updateViewportFromRoot();\n this.getScrollHost().addEventListener(\"scroll\", this.scrollHandler, { passive: true });\n window.addEventListener(\"resize\", this.resizeHandler);\n this.handleGlobalPointer = (ev: MouseEvent | PointerEvent) => {\n if (this.contextMenu && !this.contextMenu.contains(ev.target as Node)) {\n this.contextMenu.hidePopover?.();\n }\n };\n document.addEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n\n }\n\n private unbindViewport() {\n if (this.resizeHandler) window.removeEventListener(\"resize\", this.resizeHandler);\n if (this.scrollHandler) this.getScrollHost().removeEventListener(\"scroll\", this.scrollHandler);\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n if (this.handleGlobalPointer) {\n document.removeEventListener(\"pointerdown\", this.handleGlobalPointer, true);\n this.handleGlobalPointer = null;\n }\n if (this.contextMenu) {\n this.contextMenu.hidePopover?.();\n if (this.contextMenu.parentElement) removeFromParent(this.contextMenu);\n this.contextMenu = null;\n }\n if (this.toast) {\n this.toast.hidePopover?.();\n if (this.toast.parentElement) removeFromParent(this.toast);\n this.toast = null;\n }\n }\n\n remount(target: HTMLElement) {\n this.unbindViewport();\n this.teardownFilterSort();\n this.selectionManager?.destroy();\n this.renderer.destroy();\n this.root = target;\n this.applyReadonlyClass();\n this.shell = null;\n this.viewportEl = null;\n this.viewportResizeObserver?.disconnect();\n this.viewportResizeObserver = null;\n this.renderer = this.chooseRenderer(this.renderMode);\n this.mounted = false;\n this.mount(true);\n }\n\n // Public API: table-level state callbacks\n getTableState(): TableState {\n const effective = this.renderer instanceof HTMLRenderer ? \"html\" : \"canvas\";\n const applied = this.commandQueue.listApplied();\n const pendingCommands = this.editMode === \"commit\" ? applied : [];\n const pendingCommandCount = pendingCommands.length;\n const pendingCellCount = (() => {\n const keys = new Set<string>();\n for (const c of pendingCommands) {\n if (c.kind !== \"edit\") continue;\n if (!c.rowId || c.colKey === undefined) continue;\n keys.add(`${c.rowId}::${String(c.colKey)}`);\n }\n return keys.size;\n })();\n const validationErrors: TableError[] = this.dataModel.getValidationErrors().map((e) => ({\n scope: \"validation\",\n message: e.message,\n target: { rowId: e.rowId, colKey: e.colKey },\n }));\n const diagnosticErrors: TableError[] = this.dataModel\n .getDiagnostics()\n .map((x) => {\n if (!x.diag) return null;\n return {\n scope: x.diag.source,\n message: x.diag.message,\n target: { rowId: x.rowId, colKey: x.colKey },\n } as TableError;\n })\n .filter(Boolean) as TableError[];\n diagnosticErrors.sort((a, b) => {\n const ar = a.target?.rowId ? this.dataModel.getRowIndex(a.target.rowId) : -1;\n const br = b.target?.rowId ? this.dataModel.getRowIndex(b.target.rowId) : -1;\n if (ar !== br) return ar - br;\n const ac =\n a.target?.colKey !== undefined ? this.dataModel.getColumnIndex(a.target.colKey) : -1;\n const bc =\n b.target?.colKey !== undefined ? this.dataModel.getColumnIndex(b.target.colKey) : -1;\n if (ac !== bc) return ac - bc;\n if (a.scope !== b.scope) return a.scope < b.scope ? -1 : 1;\n return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;\n });\n const activeErrors = [\n ...validationErrors,\n ...diagnosticErrors.slice(0, 200),\n ...this.activeErrors,\n ];\n return {\n canCommit: this.editMode === \"commit\" && pendingCommandCount > 0,\n pendingCommandCount,\n pendingCellCount,\n undoRedo: { canUndo: this.commandQueue.canUndo(), canRedo: this.commandQueue.canRedo() },\n renderMode: effective,\n activeErrors,\n };\n }\n\n subscribeTableState(listener: TableStateListener) {\n this.tableStateListeners.add(listener);\n listener(this.getTableState(), null);\n return () => this.tableStateListeners.delete(listener);\n }\n\n private emitTableState() {\n const next = this.getTableState();\n const prev = this.lastTableState;\n const errorsEqual = (() => {\n if (!prev) return false;\n if (prev.activeErrors.length !== next.activeErrors.length) return false;\n for (let i = 0; i < next.activeErrors.length; i += 1) {\n const a = prev.activeErrors[i];\n const b = next.activeErrors[i];\n if (!a || !b) return false;\n if (a.scope !== b.scope) return false;\n if (a.message !== b.message) return false;\n const at = a.target;\n const bt = b.target;\n if (!at && !bt) continue;\n if (!at || !bt) return false;\n if ((at.rowId ?? null) !== (bt.rowId ?? null)) return false;\n if (String(at.colKey ?? \"\") !== String(bt.colKey ?? \"\")) return false;\n }\n return true;\n })();\n // Shallow equality shortcut.\n const same =\n prev &&\n prev.canCommit === next.canCommit &&\n prev.pendingCommandCount === next.pendingCommandCount &&\n prev.pendingCellCount === next.pendingCellCount &&\n prev.undoRedo.canUndo === next.undoRedo.canUndo &&\n prev.undoRedo.canRedo === next.undoRedo.canRedo &&\n prev.renderMode === next.renderMode &&\n errorsEqual;\n if (same) return;\n this.lastTableState = next;\n for (const l of this.tableStateListeners) l(next, prev);\n }\n\n // Public API: selection callbacks\n getSelectionSnapshot(): SelectionSnapshot {\n const ranges = this.selectionRanges;\n const schema = this.dataModel.getSchema();\n const active = this.activeCell;\n const activeRowId = active?.rowId ?? null;\n const activeColKey = active?.colKey ?? null;\n const activeRowIndex = activeRowId ? this.dataModel.getRowIndex(activeRowId) : null;\n const activeColIndex =\n activeColKey !== null\n ? schema.columns.findIndex((c) => String(c.key) === String(activeColKey))\n : null;\n const col =\n activeColIndex !== null && activeColIndex >= 0 ? schema.columns[activeColIndex] : null;\n\n const activeValueRes =\n activeRowId && col ? this.dataModel.resolveCellValue(activeRowId, col) : null;\n const activeCondRes =\n activeRowId && col ? this.dataModel.resolveConditionalStyle(activeRowId, col) : null;\n const activeTextOverride =\n activeValueRes?.textOverride ?? (activeCondRes?.forceErrorText ? \"#ERROR\" : undefined);\n const activeValueRaw = activeValueRes ? activeValueRes.value : null;\n const activeValueDisplay = (() => {\n if (activeTextOverride) return activeTextOverride;\n const v = activeValueRaw;\n if (col?.type === \"button\") {\n const label = getButtonLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (col?.type === \"link\") {\n const label = getLinkLabel(v);\n return label || (v === null || v === undefined ? \"\" : String(v));\n }\n if (v === null || v === undefined) return \"\";\n if (v instanceof Date) return v.toISOString();\n if (typeof v === \"string\") return v;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (typeof v === \"object\") {\n const obj = v as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return obj.value;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return obj.values.filter((x) => typeof x === \"string\").join(\", \");\n }\n }\n return String(v);\n })();\n const activeValueType = col?.type ?? null;\n const diagnostic =\n activeRowId && activeColKey !== null\n ? this.dataModel.getCellDiagnostic(activeRowId, activeColKey)\n : null;\n\n const activeStyles = (() => {\n if (!activeRowId || !col) {\n return { columnStyle: {}, cellStyle: {}, resolved: {} };\n }\n const { columnStyle, cellStyle, resolved } = resolveCellStyles(\n this.dataModel,\n activeRowId,\n col,\n );\n return { columnStyle, cellStyle, resolved };\n })();\n\n return {\n ranges: [...ranges],\n activeRowIndex: activeRowIndex !== null && activeRowIndex >= 0 ? activeRowIndex : null,\n activeRowKey: activeRowId,\n activeColumnIndex: activeColIndex !== null && activeColIndex >= 0 ? activeColIndex : null,\n activeColumnKey: activeColKey,\n activeValueRaw,\n activeValueDisplay,\n activeValueType,\n diagnostic,\n action: this.lastAction,\n styles: activeStyles,\n };\n }\n\n subscribeSelection(listener: SelectionListener) {\n this.selectionListeners.add(listener);\n listener(this.getSelectionSnapshot(), null, \"selection\");\n return () => this.selectionListeners.delete(listener);\n }\n\n private emitAction(action: CellAction) {\n this.lastAction = action;\n this.emitSelection(\"action\");\n this.lastAction = null;\n }\n\n private emitSelection(reason: SelectionChangeReason) {\n const next = this.getSelectionSnapshot();\n const prev = this.lastSelectionSnapshot;\n this.lastSelectionSnapshot = next;\n for (const l of this.selectionListeners) l(next, prev, reason);\n }\n\n private getRowStateSnapshot(rowId: string): RowStateSnapshot<T, R> | null {\n const rowIndex = this.dataModel.getRowIndex(rowId);\n if (rowIndex < 0) return null;\n const data = this.buildRow(rowId);\n if (!data) return null;\n const pending =\n this.editMode === \"commit\"\n ? (this.dataModel.getPending().get(rowId) ?? undefined)\n : undefined;\n const diagnostics = this.getTableState().activeErrors.filter((e) => e.target?.rowId === rowId);\n return {\n rowId,\n rowIndex,\n data,\n pending: pending as Partial<T> | undefined,\n diagnostics: diagnostics.length ? diagnostics : undefined,\n };\n }\n\n subscribeRowState(listener: RowStateListener<T, R>) {\n this.rowStateListeners.add(listener);\n const rows = this.dataModel.listAllRows();\n for (const row of rows) {\n const snap = this.getRowStateSnapshot(row.id);\n if (!snap) continue;\n this.lastRowStates.set(row.id, snap);\n listener(row.id, snap, null, \"new\");\n }\n return () => this.rowStateListeners.delete(listener);\n }\n\n private emitRowState(rowId: string, reason: RowChangeReason) {\n const prev = this.lastRowStates.get(rowId) ?? null;\n if (reason === \"delete\") {\n this.lastRowStates.delete(rowId);\n for (const l of this.rowStateListeners) l(rowId, null, prev, reason);\n return;\n }\n const next = this.getRowStateSnapshot(rowId);\n if (!next) return;\n this.lastRowStates.set(rowId, next);\n for (const l of this.rowStateListeners) l(rowId, next, prev, reason);\n }\n\n // Public API: value updates\n setCellValue<K extends keyof T & string>(row: number | string, colKey: K, next: Updater<T[K]>) {\n const rowId = typeof row === \"string\" ? row : this.dataModel.listRows()[row]?.id;\n const resolved = rowId ? resolveCellAddress(this.dataModel, { rowId, colKey }) : null;\n if (!resolved) return;\n if (this.isCellReadonly(resolved.rowId, resolved.colKey)) return;\n const current = this.dataModel.getCell(resolved.rowId, resolved.colKey) as T[K];\n const computed = typeof next === \"function\" ? (next as (old: T[K]) => T[K])(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: resolved.rowId, colKey: resolved.colKey, next: computed },\n this.editMode === \"direct\",\n );\n }\n\n setValueToSelection(next: Updater<unknown>) {\n const schema = this.dataModel.getSchema();\n const rows = this.dataModel.listRows();\n const unique = new Set<string>();\n for (const r of this.selectionRanges) {\n if (r.kind !== \"cells\") continue;\n const sr = Math.min(r.startRow, r.endRow);\n const er = Math.max(r.startRow, r.endRow);\n const sc = Math.min(r.startCol, r.endCol);\n const ec = Math.max(r.startCol, r.endCol);\n for (let rowIndex = sr; rowIndex <= er; rowIndex += 1) {\n const row = rows[rowIndex];\n if (!row) continue;\n for (let colIndex = sc; colIndex <= ec; colIndex += 1) {\n const col = schema.columns[colIndex];\n if (!col) continue;\n const key = `${row.id}::${String(col.key)}`;\n if (unique.has(key)) continue;\n unique.add(key);\n if (this.isCellReadonly(row.id, col.key)) continue;\n const current = this.dataModel.getCell(row.id, col.key);\n const computed = typeof next === \"function\" ? next(current) : next;\n this.handleEdit(\n { kind: \"edit\", rowId: row.id, colKey: col.key, next: computed },\n this.editMode === \"direct\",\n );\n }\n }\n }\n }\n\n private stableValueKey(value: unknown) {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (value instanceof Date) return `date:${value.getTime()}`;\n if (typeof value === \"string\") return `s:${value}`;\n if (typeof value === \"number\") return `n:${Number.isNaN(value) ? \"NaN\" : String(value)}`;\n if (typeof value === \"boolean\") return `b:${value ? \"1\" : \"0\"}`;\n if (typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const kind = obj.kind;\n if (kind === \"enum\" && typeof obj.value === \"string\") return `enum:${obj.value}`;\n if (kind === \"tags\" && Array.isArray(obj.values)) {\n return `tags:${obj.values.filter((x) => typeof x === \"string\").join(\"|\")}`;\n }\n }\n try {\n return `json:${JSON.stringify(value)}`;\n } catch {\n return `str:${String(value)}`;\n }\n }\n\n private ensureFilterSort() {\n this.ensureFilterSortSidebar();\n this.ensureFilterSortHeaderIntegration();\n this.ensureFilterSortEscape();\n }\n\n private ensureFilterSortEscape() {\n if (this.filterSortKeydown) return;\n this.filterSortKeydown = (ev: KeyboardEvent) => {\n if (!this.isFilterSortPanelVisible()) return;\n if (ev.key !== \"Escape\") return;\n ev.preventDefault();\n ev.stopPropagation();\n this.hideFilterSortPanel();\n };\n document.addEventListener(\"keydown\", this.filterSortKeydown, true);\n }\n\n private ensureFilterSortHeaderIntegration() {\n if (this.filterSortClickCapture) return;\n const host = this.viewportEl ?? this.root;\n this.filterSortClickCapture = (ev: MouseEvent) => {\n const el = ev.target as HTMLElement | null;\n const btn = el?.closest<HTMLButtonElement>('button[data-extable-fs-open=\"1\"]');\n if (!btn) return;\n const key =\n btn.dataset.extableColKey ?? btn.closest<HTMLElement>(\"th[data-col-key]\")?.dataset.colKey;\n if (!key) return;\n ev.preventDefault();\n ev.stopPropagation();\n this.showFilterSortPanel(key);\n };\n host.addEventListener(\"click\", this.filterSortClickCapture, true);\n this.filterSortOpenEvent = (ev: Event) => {\n const anyEv = ev as CustomEvent<unknown>;\n const detail = anyEv.detail as Record<string, unknown> | null | undefined;\n const key = detail?.colKey;\n if (key === undefined || key === null) return;\n this.showFilterSortPanel(String(key));\n };\n host.addEventListener(\"extable:filter-sort-open\", this.filterSortOpenEvent);\n }\n\n private ensureFilterSortSidebar() {\n if (this.filterSortSidebar) {\n if (this.filterSortSidebar.isConnected) return;\n this.filterSortSidebar = null;\n }\n this.ensureShell();\n const shell = this.shell ?? this.root;\n\n const aside = document.createElement(\"aside\");\n aside.className = \"extable-filter-sort-sidebar\";\n aside.innerHTML = `\n <div class=\"extable-filter-sort-header\">\n <div class=\"extable-filter-sort-row\">\n <div class=\"extable-filter-sort-title\" data-extable-fs=\"title\">Sort/Filter</div>\n <button type=\"button\" data-extable-fs=\"close\" class=\"extable-filter-sort-close\">×</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-body\">\n <div class=\"extable-filter-sort-section extable-filter-sort-section-filter\">\n <div class=\"extable-filter-sort-section-title\">Filter</div>\n <div class=\"extable-filter-sort-actions\">\n <label><input type=\"checkbox\" data-extable-fs=\"col-errors\" /> Errors</label>\n <label><input type=\"checkbox\" data-extable-fs=\"col-warnings\" /> Warnings</label>\n </div>\n <input data-extable-fs=\"search\" type=\"text\" placeholder=\"Search values\" />\n <div class=\"extable-filter-sort-values\" data-extable-fs=\"values\"></div>\n <div class=\"extable-filter-sort-actions\" data-align=\"split\">\n <button type=\"button\" data-extable-fs=\"select-all\">Select All</button>\n <button type=\"button\" data-extable-fs=\"select-none\">Select None</button>\n <button type=\"button\" data-extable-fs=\"apply-filter\">Apply</button>\n <button type=\"button\" data-extable-fs=\"clear-filter\">Clear</button>\n </div>\n </div>\n <div class=\"extable-filter-sort-section extable-filter-sort-section-sort\">\n <div class=\"extable-filter-sort-section-title\">Sort</div>\n <div class=\"extable-filter-sort-actions\" data-align=\"right\">\n <button type=\"button\" data-extable-fs=\"sort-asc\">Sort Asc</button>\n <button type=\"button\" data-extable-fs=\"sort-desc\">Sort Desc</button>\n <button type=\"button\" data-extable-fs=\"clear-sort\">Clear Sort</button>\n </div>\n </div>\n </div>\n `;\n shell.appendChild(aside);\n this.filterSortSidebar = aside;\n\n const btnClose = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"close\"]');\n const cbErrors = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"col-errors\"]');\n const cbWarnings = aside.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = aside.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]');\n const values = aside.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n const btnAll = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-all\"]');\n const btnNone = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"select-none\"]');\n const btnApply = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"apply-filter\"]',\n );\n const btnClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-filter\"]',\n );\n const btnSortAsc = aside.querySelector<HTMLButtonElement>('button[data-extable-fs=\"sort-asc\"]');\n const btnSortDesc = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const btnSortClear = aside.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"clear-sort\"]',\n );\n\n if (\n !btnClose ||\n !cbErrors ||\n !cbWarnings ||\n !search ||\n !values ||\n !btnAll ||\n !btnNone ||\n !btnApply ||\n !btnClear ||\n !btnSortAsc ||\n !btnSortDesc ||\n !btnSortClear\n ) {\n removeFromParent(aside);\n this.filterSortSidebar = null;\n return;\n }\n\n btnClose.addEventListener(\"click\", () => this.hideFilterSortPanel());\n\n cbErrors.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagErrors = cbErrors.checked;\n });\n cbWarnings.addEventListener(\"change\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.diagWarnings = cbWarnings.checked;\n });\n search.addEventListener(\"input\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.search = search.value;\n this.renderFilterSortValues();\n });\n\n values.addEventListener(\"change\", (e) => {\n const input = (e.target as HTMLElement | null)?.closest<HTMLInputElement>(\n 'input[type=\"checkbox\"][data-fs-val]',\n );\n if (!input || !this.filterSortDraft) return;\n const k = input.dataset.fsVal ?? \"\";\n if (!k) return;\n if (k === \"__blanks__\") {\n this.filterSortDraft.includeBlanks = input.checked;\n } else if (input.checked) {\n this.filterSortDraft.selected.add(k);\n } else {\n this.filterSortDraft.selected.delete(k);\n }\n });\n\n btnAll.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set(this.filterSortDraft.values.map((v) => v.key));\n this.filterSortDraft.includeBlanks = this.filterSortDraft.hasBlanks;\n this.renderFilterSortValues();\n });\n btnNone.addEventListener(\"click\", () => {\n if (!this.filterSortDraft) return;\n this.filterSortDraft.selected = new Set();\n this.filterSortDraft.includeBlanks = false;\n this.renderFilterSortValues();\n });\n btnApply.addEventListener(\"click\", () => this.applyFilterSortDraft());\n btnClear.addEventListener(\"click\", () => this.clearFilterSortForActiveColumn());\n btnSortAsc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"asc\"));\n btnSortDesc.addEventListener(\"click\", () => this.setSortForActiveColumn(\"desc\"));\n btnSortClear.addEventListener(\"click\", () => this.clearSort());\n\n this.filterSortSidebarUnsub = this.dataModel.subscribe(() => {\n if (!this.isFilterSortPanelVisible()) return;\n if (!this.filterSortActiveColumnKey) return;\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n });\n }\n\n showFilterSortPanel(colKey: string) {\n this.filterSortActiveColumnKey = colKey;\n this.buildFilterSortDraft(colKey);\n this.root.classList.toggle(\"extable-filter-sort-open\", true);\n this.renderFilterSortSidebar();\n const input =\n this.filterSortSidebar?.querySelector<HTMLInputElement>('input[data-extable-fs=\"search\"]') ??\n null;\n input?.focus();\n }\n\n hideFilterSortPanel() {\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n toggleFilterSortPanel(colKey: string) {\n if (this.isFilterSortPanelVisible()) this.hideFilterSortPanel();\n else this.showFilterSortPanel(colKey);\n }\n\n private buildFilterSortDraft(colKey: string) {\n const view = this.dataModel.getView();\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(colKey));\n if (!col) {\n this.filterSortDraft = null;\n return;\n }\n const prevSearch =\n this.filterSortDraft && String(this.filterSortDraft.colKey) === String(col.key)\n ? this.filterSortDraft.search\n : \"\";\n const distinct = this.dataModel.getDistinctValuesForColumn(col.key);\n const values = distinct.values.map((v) => ({ ...v, key: this.stableValueKey(v.value) }));\n const existing = (view.filters ?? []).find(\n (f) =>\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(col.key),\n ) as ViewFilterValues | undefined;\n\n const selected = new Set<string>();\n if (existing) {\n for (const v of existing.values ?? []) selected.add(this.stableValueKey(v));\n } else {\n for (const v of values) selected.add(v.key);\n }\n const includeBlanks = existing ? Boolean(existing.includeBlanks) : distinct.hasBlanks;\n const diag = view.columnDiagnostics?.[String(col.key)];\n this.filterSortDraft = {\n colKey: col.key,\n values,\n hasBlanks: distinct.hasBlanks,\n selected,\n includeBlanks,\n diagErrors: Boolean(diag?.errors),\n diagWarnings: Boolean(diag?.warnings),\n search: prevSearch,\n };\n }\n\n private renderFilterSortSidebar() {\n if (!this.filterSortSidebar) return;\n const title = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"title\"]');\n const cbErrors = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-errors\"]',\n );\n const cbWarnings = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"col-warnings\"]',\n );\n const search = this.filterSortSidebar.querySelector<HTMLInputElement>(\n 'input[data-extable-fs=\"search\"]',\n );\n if (!title || !cbErrors || !cbWarnings || !search) return;\n const btnSortAsc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-asc\"]',\n );\n const btnSortDesc = this.filterSortSidebar.querySelector<HTMLButtonElement>(\n 'button[data-extable-fs=\"sort-desc\"]',\n );\n const draft = this.filterSortDraft;\n if (!draft) {\n title.textContent = \"Sort/Filter\";\n cbErrors.checked = false;\n cbWarnings.checked = false;\n search.value = \"\";\n if (btnSortAsc) btnSortAsc.dataset.active = \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = \"0\";\n this.renderFilterSortValues();\n return;\n }\n const schema = this.dataModel.getSchema();\n const col = schema.columns.find((c) => String(c.key) === String(draft.colKey));\n const name = col?.header ?? String(draft.colKey);\n title.textContent = `Sort/Filter: ${name}`;\n cbErrors.checked = draft.diagErrors;\n cbWarnings.checked = draft.diagWarnings;\n search.value = draft.search;\n const view = this.dataModel.getView();\n const sort = view.sorts?.find((s) => String(s.key) === String(draft.colKey));\n if (btnSortAsc) btnSortAsc.dataset.active = sort?.dir === \"asc\" ? \"1\" : \"0\";\n if (btnSortDesc) btnSortDesc.dataset.active = sort?.dir === \"desc\" ? \"1\" : \"0\";\n this.renderFilterSortValues();\n }\n\n private renderFilterSortValues() {\n if (!this.filterSortSidebar) return;\n const values = this.filterSortSidebar.querySelector<HTMLElement>('[data-extable-fs=\"values\"]');\n if (!values) return;\n values.innerHTML = \"\";\n const draft = this.filterSortDraft;\n if (!draft) return;\n\n const q = draft.search.trim().toLowerCase();\n const total = draft.values.length + (draft.hasBlanks ? 1 : 0);\n if (total > 100 && !q) {\n const msg = document.createElement(\"div\");\n msg.textContent = \"Too many values (100+). Type to search.\";\n values.appendChild(msg);\n return;\n }\n\n if (draft.hasBlanks) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = \"__blanks__\";\n cb.checked = draft.includeBlanks;\n const text = document.createElement(\"span\");\n text.textContent = \"(Blanks)\";\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n\n const filtered = q\n ? draft.values.filter((v) => v.label.toLowerCase().includes(q))\n : draft.values;\n for (const v of filtered.slice(0, 200)) {\n const label = document.createElement(\"label\");\n const cb = document.createElement(\"input\");\n cb.type = \"checkbox\";\n cb.dataset.fsVal = v.key;\n cb.checked = draft.selected.has(v.key);\n const text = document.createElement(\"span\");\n text.textContent = v.label;\n label.appendChild(cb);\n label.appendChild(text);\n values.appendChild(label);\n }\n }\n\n private applyFilterSortDraft() {\n const draft = this.filterSortDraft;\n if (!draft) return;\n const view = this.dataModel.getView();\n const existingFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(draft.colKey)\n ),\n );\n\n const allSelected =\n draft.selected.size === draft.values.length &&\n draft.includeBlanks === Boolean(draft.hasBlanks);\n const nextFilters = allSelected\n ? existingFilters\n : [\n ...existingFilters,\n {\n kind: \"values\",\n key: draft.colKey,\n values: draft.values.filter((v) => draft.selected.has(v.key)).map((v) => v.value),\n includeBlanks: draft.includeBlanks,\n } satisfies ViewFilterValues,\n ];\n\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n if (draft.diagErrors || draft.diagWarnings) {\n nextDiagnostics[String(draft.colKey)] = {\n errors: draft.diagErrors,\n warnings: draft.diagWarnings,\n };\n } else {\n delete nextDiagnostics[String(draft.colKey)];\n }\n\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n }\n\n private clearFilterSortForActiveColumn() {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextFilters = [...(view.filters ?? [])].filter(\n (f) =>\n !(\n (f as ViewFilterValues).kind === \"values\" &&\n String((f as ViewFilterValues).key) === String(colKey)\n ),\n );\n const nextDiagnostics = { ...(view.columnDiagnostics ?? {}) };\n delete nextDiagnostics[String(colKey)];\n const nextView: View = {\n ...view,\n filters: nextFilters.length ? nextFilters : undefined,\n columnDiagnostics: Object.keys(nextDiagnostics).length ? nextDiagnostics : undefined,\n };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private setSortForActiveColumn(dir: \"asc\" | \"desc\") {\n const colKey = this.filterSortActiveColumnKey;\n if (colKey === null || colKey === undefined) return;\n const view = this.dataModel.getView();\n const nextView: View = { ...view, sorts: [{ key: colKey, dir }] };\n this.setView(nextView);\n this.buildFilterSortDraft(colKey);\n this.renderFilterSortSidebar();\n }\n\n private clearSort() {\n const view = this.dataModel.getView();\n if (!view.sorts?.length) return;\n const nextView: View = { ...view, sorts: undefined };\n this.setView(nextView);\n if (this.filterSortActiveColumnKey !== null) {\n this.buildFilterSortDraft(this.filterSortActiveColumnKey);\n this.renderFilterSortSidebar();\n }\n }\n\n private teardownFilterSort() {\n this.filterSortSidebarUnsub?.();\n this.filterSortSidebarUnsub = null;\n if (this.filterSortSidebar) {\n removeFromParent(this.filterSortSidebar);\n this.filterSortSidebar = null;\n }\n if (this.filterSortKeydown) {\n document.removeEventListener(\"keydown\", this.filterSortKeydown, true);\n this.filterSortKeydown = null;\n }\n if (this.filterSortClickCapture) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"click\",\n this.filterSortClickCapture,\n true,\n );\n this.filterSortClickCapture = null;\n }\n if (this.filterSortOpenEvent) {\n (this.viewportEl ?? this.root).removeEventListener(\n \"extable:filter-sort-open\",\n this.filterSortOpenEvent,\n );\n this.filterSortOpenEvent = null;\n }\n this.root.classList.toggle(\"extable-filter-sort-open\", false);\n this.filterSortActiveColumnKey = null;\n this.filterSortDraft = null;\n }\n\n private initViewportState() {\n const host = this.getScrollHost();\n this.viewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n }\n\n private updateViewportFromRoot() {\n if (!this.viewportState) this.initViewportState();\n const prev = this.viewportState ?? {\n scrollTop: 0,\n scrollLeft: 0,\n clientWidth: 0,\n clientHeight: 0,\n deltaX: 0,\n deltaY: 0,\n timestamp: performance.now(),\n };\n const host = this.getScrollHost();\n const next: ViewportState = {\n scrollTop: host.scrollTop,\n scrollLeft: host.scrollLeft,\n clientWidth: host.clientWidth,\n clientHeight: host.clientHeight,\n deltaX: host.scrollLeft - prev.scrollLeft,\n deltaY: host.scrollTop - prev.scrollTop,\n timestamp: performance.now(),\n };\n this.viewportState = next;\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => this.flushRender());\n }\n }\n\n private flushRender() {\n this.rafId = null;\n if (!this.viewportState) return;\n this.selectionManager?.onScroll(this.viewportState.scrollTop, this.viewportState.scrollLeft);\n // HTML renderer re-renders DOM; avoid doing it on scroll to preserve scroll position.\n if (this.renderer instanceof HTMLRenderer) return;\n this.safeRender(this.viewportState);\n }\n}\n\n// Compatibility helpers for wrappers/tests\nexport function createTablePlaceholder<T extends object = Record<string, unknown>>(\n config: TableConfig<T>,\n options?: CoreOptions,\n) {\n const core = new ExtableCore<T>({\n root: document.createElement(\"div\"),\n defaultData: config.data,\n defaultView: config.view,\n schema: config.schema,\n options,\n });\n return core;\n}\n\nexport function mountTable(target: HTMLElement, core: ExtableCore) {\n core.remount(target);\n return core;\n}\n"],"names":["getBatchId","cmd","p","id","CommandQueue","cap","command","batchId","last","out","group","g","resolveCellAddress","dataModel","address","schema","rows","resolveByIndex","rowIndex","colIndex","row","col","resolveByKeys","rowId","colKey","c","LockManager","mode","server","user","currentRowId","keepRowId","toUnlock","rowIds","e","V","n","s","J","r","R","D","K","z","i","a","l","u","P","k","f","B","G","H","U","Y","q","X","Q","Z","_","ee","te","ne","se","re","ie","oe","ae","ue","le","ce","fe","de","me","he","ge","pe","xe","ye","be","Se","je","ke","we","Ne","Ie","Te","Me","T","Ae","ve","Le","Ee","We","Ce","Oe","$e","x","y","M","w","Fe","Pe","A","v","N","Ve","Je","Re","De","Ke","m","L","ze","Be","I","Ge","He","Ue","Ye","qe","Xe","Qe","Ze","_e","et","tt","E","j","W","nt","st","rt","it","ot","b","S","C","O","at","ut","lt","$","o","ct","F","ft","dt","h","mt","ht","d","gt","pt","normalizeRange","range","coerceToTime","value","coerceToDate","getFillHandleSource","ranges","width","height","makeFillValueGetter","source","langs","seed","registry","createBuiltInRegistry","numbers","seq","inferSequence","cache","done","offsetFromEnd","next","dates","strings","FILL_HANDLE_VISUAL_SIZE_PX","FILL_HANDLE_HIT_SIZE_PX","getFillHandleRect","cellRect","size","isPointInRect","rect","shouldShowFillHandle","activeRowId","activeColKey","editMode","src","CANVAS_FONT_FAMILY","CANVAS_FONT_SIZE_PX","getColumnSortDir","view","hasActiveColumnFilter","vf","diag","svgFunnel","svgArrow","dir","drawDiagnosticCorner","ctx","level","color","ValueFormatCache","options","key","fmt","cached","parsed","parseIsoDate","drawFunnelIcon","alpha","drawSortArrowIcon","resolveTagValues","obj","values","FenwickTree","count","res","index0","delta","target","total","idx","bit","acc","step","nextAcc","HTMLRenderer","DEFAULT_ROW_HEIGHT_PX","ROW_HEADER_WIDTH_PX","root","_state","scrollContainer","prevTop","prevLeft","colWidths","getColumnWidths","colBaseStyles","columnFormatToStyle","colBaseCss","styleToCssText","totalWidth","body","entry","removeFromParent","event","corner","rowHeader","cell","tagRemove","indexStr","tagIndex","actionEl","kind","thead","tr","rowTh","th","sortDir","hasFilter","wrap","label","btn","index","td","isPending","condRes","cellStyle","hasTextColor","css","baseStyle","withCond","mergeStyle","merged","forCss","raw","valueRes","textOverride","formatted","interaction","tagValues","isActionType","actionValue","resolveButtonAction","resolveLinkAction","actionLabel","getButtonLabel","getLinkLabel","list","tag","chip","remove","marker","align","rawNumbered","toRawValue","rawStr","maxHeight","text","version","measure","measureHost","CELL_PADDING_TOP_PX","CELL_PADDING_BOTTOM_PX","isAll","el","startRow","endRow","startCol","endCol","rowEl","cells","tags","num","formatNumberForEdit","opts","token","formatIntegerWithPrefix","fmtValue","coerceDatePattern","formatDateLite","_CanvasRenderer","getEditMode","HEADER_HEIGHT_PX","ev","viewportX","viewportY","xCursor","iconSize","iconLeft","iconTop","actionHit","nextKey","maxDim","state","baseFont","selectAll","fontCache","wrapAny","cacheKey","heightIndex","desiredCanvasWidth","desiredCanvasHeight","nextWidth","nextHeight","scrollTop","scrollLeft","computeVisibleRange","contentTop","visibleStart","accum","visibleEnd","drawnHeight","totalRowsHeight","viewportHeight","dataViewportHeight","maxContentScrollTop","contentScrollTop","updates","nextH","dataXOffset","yCursor","rowH","idxText","lastFontKey","muted","mergedStyle","bg","renderAction","left","top","actionColor","isBoolean","isCustomBoolean","fontKey","weight","textAreaX","CELL_PADDING_X_PX","textAreaY","textAreaW","textAreaH","decorations","actionBounds","right","bottom","bw","bh","actionKey","isHover","isActive","xHeader","iconBox","ix","iy","yTop","xLeft","existing","heights","idToIndex","measuredVersion","cachedHeight","prev","wraps","widths","task","measured","start","headerHeight","accumHeight","topPx","rowTop","hit","ital","bounds","pad","rootRect","maxW","maxH","side","tRect","clientX","clientY","prevKey","prevIcon","nextIcon","changed","cursor","sameCell","sameMessage","nextHoverKey","handleRect","rawLines","lines","line","current","cut","firstKey","maxLines","minX","maxX","minY","maxY","lineWidth","startX","lineTop","lineBottom","fontBackup","totalTextHeight","baseY","renderLine","ln","lineIdx","baseline","endX","center","strokeBackup","lineWidthBackup","yUnderline","yStrike","CanvasRenderer","SelectionManager","onEdit","onRowSelect","onMove","hitTest","hitAction","sequenceLangs","isCellReadonly","onCellAction","onActiveChange","onContextMenu","onSelectionChange","onUndo","onRedo","fillSrc","handleRowIndex","handleColIndex","handleRow","handleCol","targetRow","targetCol","dx","dy","endRowIndex","suppressTrailingClick","payload","html","tsv","grid","ac","currentText","input","isMac","isTab","isEnter","isArrow","extend","wasSameCell","isSecondClick","maxRow","maxCol","activeRowIndex","activeColIndex","nextRanges","clamp","max","desiredColKey","baseIndex","fallbackRow","nextRow","nextRange","colType","initial","toast","inset","maxLeft","maxTop","minLeft","minTop","candidateLeft","candidateTop","message","variant","durationMs","valueForSelection","escapeFn","rowIdEsc","keyEsc","box","rowHeaderWidth","defaultRowHeight","active","headerEl","cellEl","htmlCell","metrics","xStart","xEnd","yStart","yEnd","leftVis","rightVis","topVis","bottomVis","deltaRow","deltaCol","extendSelection","anchor","nextRowIndex","nextColIndex","colHeader","endColIndex","nextEnd","threshold","maxStep","tick","raf","cb","raf2","getValue","commitNow","offset","cellCount","copyViaClipboardApi","item","copyViaFallbackInput","fallback","first","normalized","rowIdx","colIdx","linkAction","buttonAction","htmlRows","tableStyle","htmlCells","fromHtml","trimmed","table","trs","parseNumericText","coerced","coerceNumericForColumn","ta","allowCustom","select","empty","opt","op","listId","datalist","normalizeNumericInput","style","lineHeight","wrapper","insetX","insetTop","insetBottom","linkValue","nextValues","href","link","isRow","targetRange","anchorRow","anchorCol","anchorCell","sorted","sameCols","sameRows","rowsTouch","colsTouch","initialValue","control","isCheckbox","end","now","isTextarea","isAltEnter","commitAndMove","orig","norm","normalizedOrig","normalizedCurrent","clearActive","defineSchema","ExtableCore","init","defaultData","initialData","DataModel","classes","toArray","ua","shell","viewport","anyRO","force","host","action","_colKey","classNames","data","wasLoaded","rowIdOrIndex","found","pending","vv","rowData","position","insertAt","baseIdx","newId","removed","cmds","toKinds","seen","kinds","labelFor","commandCount","toSteps","groups","forcedId","handler","commands","error","msg","afterApply","touched","snapshots","snap","pop","actions","act","hr","viewportWidth","targetIndex","effective","applied","pendingCommands","pendingCommandCount","pendingCellCount","keys","validationErrors","diagnosticErrors","ar","br","bc","activeErrors","listener","errorsEqual","bt","activeValueRes","activeCondRes","activeTextOverride","activeValueRaw","activeValueDisplay","activeValueType","diagnostic","activeStyles","columnStyle","resolved","resolveCellStyles","reason","diagnostics","computed","unique","sr","er","sc","ec","aside","btnClose","cbErrors","cbWarnings","search","btnAll","btnNone","btnApply","btnClear","btnSortAsc","btnSortDesc","btnSortClear","prevSearch","distinct","selected","includeBlanks","title","draft","name","sort","filtered","existingFilters","nextFilters","nextDiagnostics","nextView","createTablePlaceholder","config","mountTable","core"],"mappings":"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AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAI;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAGC,KAAKD,GAAE;AAAA,EACR,CAACvD,GAAG,MAAM;AACR,QAAI,MAAM;AACR,aAAOA;AACT,QAAI,SAAS,KAAK,CAAC,GAAG;AACpB,YAAME,IAAI,EAAE,MAAM,GAAG,EAAE;AACvB,MAAAF,EAAEE,CAAC,IAAI;AAAA,IACT;AACA,WAAOF;AAAA,EACT;AAAA,EACA,CAAA;AACF,GAAGyD,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAOF;AAAA,EACP,SAASC;AACX,GAAGE,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,IAAI;AAAA,EACZ,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,MAAM,IAAI;AAAA,EAClB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,MAAM,IAAI;AAAA,EAClB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,OAAO,CAAC,MAAM,IAAI;AAAA,EAClB,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AACA,GAAGC,KAAK;AAAA,EACN9C;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AACF,GAAG9F,KAAI,CAACgC,MAAM;AACZ,QAAM,IAAIA,IAAI;AACd,MAAI,KAAK,MAAM,KAAK,GAAI,QAAO;AAC/B,QAAME,IAAIF,IAAI;AACd,SAAOE,MAAM,IAAI,OAAOA,MAAM,IAAI,OAAOA,MAAM,IAAI,OAAO;AAC5D,GAAG8D,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAAGC,KAAI;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAAGC,KAAI;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAAGC,KAAI,OAAO;AAAA,EACZ,OAAO,QAAQH,EAAC,EAAE,IAAI,CAAC,CAAChE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAOA,CAAC,CAAC,CAAC;AAClD,GAAGoE,KAAK,OAAO;AAAA,EACb,OAAO,QAAQH,EAAC,EAAE,IAAI,CAAC,CAACjE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAOA,CAAC,CAAC,CAAC;AAClD,GAAGqE,KAAK,OAAO;AAAA,EACb,OAAO,QAAQH,EAAC,EAAE,IAAI,CAAC,CAAClE,GAAG,CAAC,MAAM,CAAC,GAAG,OAAOA,CAAC,CAAC,CAAC;AAClD,GAAGsE,KAAI,CAACtE,MAAM;AACZ,QAAM,IAAIA,EAAE,KAAI,EAAG,YAAW;AAC9B,MAAI,CAAC,EAAG,QAAO;AACf,QAAME,IAAIiE,GAAE,CAAC,KAAKC,GAAG,CAAC;AACtB,MAAIlE,EAAG,QAAOA;AACd,QAAMC,IAAI,EAAE,MAAM,QAAQ;AAC1B,MAAIA,EAAE,WAAW,EAAG,QAAO;AAC3B,QAAME,IAAIgE,GAAGlE,EAAE,CAAC,KAAK,EAAE,GAAG,IAAIgE,GAAEhE,EAAE,CAAC,KAAK,EAAE;AAC1C,SAAO,CAACE,KAAK,CAAC,IAAI,OAAOA,IAAI;AAC/B,GAAGkE,KAAI,CAACvE,MAAM;AACZ,MAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,KAAK,KAAK,MAAMA,CAAC,MAAMA,EAAG,QAAO;AACjE,MAAIA,KAAK,GAAI,QAAOgE,GAAEhE,CAAC,KAAK;AAC5B,MAAIA,IAAI,KAAK;AACX,QAAIiE,GAAEjE,CAAC,EAAG,QAAOiE,GAAEjE,CAAC,KAAK;AACzB,UAAM,IAAI,KAAK,MAAMA,IAAI,EAAE,IAAI,IAAIE,IAAIF,IAAI,IAAIG,IAAI+D,GAAE,CAAC,GAAG7D,IAAI2D,GAAE9D,CAAC;AAChE,WAAO,CAACC,KAAK,CAACE,IAAI,OAAO,GAAGF,CAAC,IAAIE,CAAC;AAAA,EACpC;AACA,SAAO;AACT,GAAGmE,KAAI,CAACxE,MAAM;AACZ,QAAM,IAAI,wBAAwB,KAAKA,CAAC;AACxC,MAAI,GAAG;AACL,UAAMG,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,QAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,EAAG,QAAO;AAC1C,UAAME,IAAI,EAAE,CAAC,GAAG,YAAW;AAC3B,WAAOrC,GAAEmC,CAAC,MAAME,IAAI,OAAO,EAAE,OAAOF,GAAG,QAAQ,UAAS;AAAA,EAC1D;AACA,QAAMD,IAAIoE,GAAEtE,CAAC;AACb,SAAOE,MAAM,OAAO,EAAE,OAAOA,GAAG,QAAQ,OAAM,IAAK;AACrD,GAAGuE,KAAK;AAAA,EACN,IAAI;AAAA,EACJ,OAAO,CAAC,IAAI;AAAA,EACZ,MAAMzE,GAAG;AACP,QAAIA,EAAE,SAAS,EAAG,QAAO;AACzB,UAAM,IAAIA,EAAE,IAAI,CAAC,MAAMwE,GAAE,CAAC,CAAC;AAC3B,QAAI,EAAE,KAAK,CAAC,MAAM,MAAM,IAAI,EAAG,QAAO;AACtC,UAAMtE,IAAI,EAAE,CAAC,EAAE;AACf,QAAI,EAAE,KAAK,CAAC,MAAM,GAAG,WAAWA,CAAC,EAAG,QAAO;AAC3C,UAAMC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,GAAGE,IAAIF,EAAE,CAAC,IAAIA,EAAE,CAAC;AAC/C,aAAS,IAAI,GAAG,IAAIA,EAAE,QAAQ,KAAK;AACjC,UAAIA,EAAE,CAAC,IAAIA,EAAE,IAAI,CAAC,MAAME,EAAG,QAAO;AACpC,WAAO,EAAE,OAAO,IAAI,MAAMA,GAAG,OAAO,EAAE,QAAQH,IAAG;AAAA,EACnD;AAAA,EACA,eAAeF,GAAG,GAAG;AACnB,UAAME,IAAIsE,GAAExE,EAAEA,EAAE,SAAS,CAAC,KAAK,EAAE,GAAGG,IAAI,EAAE,OAAO,UAAU;AAC3D,QAAIE,IAAIH,GAAG,SAAS;AACpB,WAAO;AAAA,MACL,OAAO;AACL,YAAIG,KAAK,EAAE,MAAMA,KAAK,KAAK,CAAC,OAAO,SAASA,CAAC;AAC3C,iBAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,YAAIF,MAAM,QAAQ;AAChB,gBAAM,IAAIoE,GAAElE,CAAC;AACb,iBAAO,IAAI,EAAE,OAAO,GAAG,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,QAC/D;AACA,eAAO,EAAE,OAAO,GAAGA,CAAC,GAAGrC,GAAEqC,CAAC,CAAC,IAAI,MAAM,GAAE;AAAA,MACzC;AAAA,IACN;AAAA,EACE;AACF,GAAGqE,KAAK,CAAC1E,MAAM;AACb,aAAW,KAAK+D;AACd,IAAA/D,EAAE,SAAS,CAAC;AAChB,GAAG2E,KAAK,CAAC3E,MAAM;AACb,EAAAA,EAAE,cAAcyE,EAAE;AACpB,GAAGG,KAAK,CAAC5E,MAAM;AACb,QAAM,IAAIA,KAAK,CAAC,MAAM,IAAI,GAAGE,IAAI,IAAIO,GAAE,EAAE,OAAO,EAAC,CAAE;AACnD,SAAOiE,GAAGxE,CAAC,GAAGyE,GAAGzE,CAAC,GAAGA;AACvB,GAAG2E,KAAK,CAAC7E,MAAM;AACb,MAAI,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,UAAIA,EAAE,WAAW;AACf,eAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,YAAME,IAAIF,EAAE,IAAIA,EAAE,MAAM;AACxB,aAAO,KAAK,GAAG,EAAE,OAAOE,GAAG,MAAM,GAAE;AAAA,IACrC;AAAA,EACJ;AACA;AACA,MAAM4E,EAAE;AAAA,EACN,eAAe,GAAG;AAChB,UAAM5E,IAAI;AACV,SAAK,OAAOA,GAAG,KAAK,OAAOA,EAAE,WAAW,IAAI,SAAS,eAAe,KAAK,WAAW2E,GAAG3E,CAAC;AAAA,EAC1F;AAAA,EACA,OAAO,SAAS,GAAGA,GAAGC,GAAG;AACvB,UAAME,IAAI,IAAIyE,EAAE,GAAG,CAAC;AACpB,WAAOzE,EAAE,OAAOH,GAAGG,EAAE,WAAWF,GAAGE;AAAA,EACrC;AAAA,EACA,OAAO;AACL,WAAO,KAAK,SAAS,KAAI;AAAA,EAC3B;AAAA,EACA,CAAC,OAAO,QAAQ,IAAI;AAClB,WAAO;AAAA,EACT;AACF;AACA,MAAM0E,KAAI,MAAMC,KAAK,KAAKC,KAAK,CAACjF,OAAO;AAAA,EACrC,OAAO;AACL,WAAO,EAAE,OAAOA,GAAG,MAAM,GAAE;AAAA,EAC7B;AACF,IAAIkF,KAAI,CAAClF,MAAM;AACb,MAAI,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,UAAIA,EAAE,WAAW;AACf,eAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,YAAME,IAAIF,EAAE,IAAIA,EAAE,MAAM;AACxB,aAAO,KAAK,GAAG,EAAE,OAAOE,GAAG,MAAM,GAAE;AAAA,IACrC;AAAA,EACJ;AACA,GAAGiF,KAAK,CAACnF,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,aAAOA,KAAK,GAAG,EAAE,OAAOF,IAAI,IAAIE,GAAG,MAAM,GAAE;AAAA,IAC7C;AAAA,EACJ;AACA,GAAGkF,KAAK,CAACpF,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,aAAOA,KAAK,GAAG,EAAE,OAAO,IAAI,KAAKF,EAAE,QAAO,IAAK,IAAIE,CAAC,GAAG,MAAM,GAAE;AAAA,IACjE;AAAA,EACJ;AACA,GAAGmF,KAAK,CAACrF,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,aAAOA,KAAK,GAAG,EAAE,OAAOF,IAAI,KAAKE,GAAG,MAAM,GAAE;AAAA,IAC9C;AAAA,EACJ;AACA,GAAGoF,KAAK,CAACtF,GAAG,MAAM;AAChB,MAAIA,EAAE,SAAS;AACb,WAAOA,EAAE,QAAQ,eAAe,GAAG,EAAE,MAAMA,EAAE,MAAM,OAAOA,EAAE,MAAK,CAAE;AACrE,QAAM,EAAE,MAAME,GAAG,YAAYC,GAAG,MAAME,EAAC,IAAKL,GAAG,IAAIE,EAAE,MAAM;AAC3D,MAAIW,IAAIV;AACR,SAAO;AAAA,IACL,OAAO;AACL,UAAID,EAAE,SAAS,UAAU;AACvB,cAAMQ,IAAIG,IAAIR;AACd,eAAOK,KAAK,IAAI,EAAE,OAAO,QAAQ,MAAM,QAAQG,IAAIH,GAAG,EAAE,OAAOR,EAAE,MAAMW,CAAC,GAAG,MAAM;MACnF;AACA,aAAOA,KAAKA,IAAIR,KAAK,GAAG,EAAE,OAAOH,EAAE,MAAMW,CAAC,GAAG,MAAM,GAAE;AAAA,IACvD;AAAA,EACJ;AACA,GAAG0E,KAAK,CAACvF,MAAMA,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,YAAY,OAAO,SAAS,CAAC,CAAC,GAAGwF,KAAK,CAACxF,MAAMA,EAAE,MAAM,CAAC,MAAM,aAAa,QAAQ,CAAC,OAAO,MAAM,EAAE,SAAS,CAAC,GAAGyF,KAAK,CAACzF,MAAMA,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,QAAQ,GAAG0F,KAAK,CAAC1F,MAAM;AACpN,QAAM,IAAI,0BAA0B,KAAKA,CAAC;AAC1C,MAAI,CAAC;AACH,WAAO;AACT,QAAME,IAAI,EAAE,CAAC,KAAK,IAAIC,IAAI,EAAE,CAAC,KAAK,IAAIE,IAAI,EAAE,CAAC,KAAK,IAAI,IAAI,OAAOF,CAAC;AAClE,MAAI,CAAC,OAAO,SAAS,CAAC;AACpB,WAAO;AACT,QAAMU,IAAIV,EAAE,QAAQ,KAAK,EAAE,EAAE;AAC7B,SAAO,EAAE,QAAQD,GAAG,KAAK,GAAG,OAAOW,GAAG,QAAQR,EAAC;AACjD,GAAGsF,KAAK,CAAC3F,MAAM;AACb,QAAM,IAAI,sCAAsC,KAAKA,CAAC;AACtD,MAAI,GAAG;AACL,UAAMK,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,QAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,EAAG,QAAO;AAC1C,UAAM,IAAI,EAAE,CAAC,GAAG,YAAW;AAC3B,WAAOrC,GAAEqC,CAAC,MAAM,IAAI,OAAO;AAAA,MACzB,QAAQ,EAAE,CAAC,KAAK;AAAA,MAChB,KAAKA;AAAA,MACL,QAAQ,EAAE,CAAC,KAAK;AAAA,MAChB,QAAQ;AAAA,IACd;AAAA,EACE;AACA,QAAMH,IAAI,kCAAkC,KAAKF,CAAC;AAClD,MAAI,CAACE,EAAG,QAAO;AACf,QAAMC,IAAImE,GAAEpE,EAAE,CAAC,KAAK,EAAE;AACtB,SAAOC,MAAM,OAAO,OAAO;AAAA,IACzB,QAAQD,EAAE,CAAC,KAAK;AAAA,IAChB,KAAKC;AAAA,IACL,QAAQD,EAAE,CAAC,KAAK;AAAA,IAChB,QAAQ;AAAA,EACZ;AACA,GAAG0F,KAAK,CAAC5F,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC;AAClB,UAAIE,KAAK,KAAK,CAAC,OAAO,SAASA,CAAC;AAC9B,eAAO,EAAE,OAAO,QAAQ,MAAM,GAAE;AAClC,UAAIL,EAAE,WAAW,QAAQ;AACvB,cAAM,IAAIuE,GAAElE,CAAC;AACb,eAAO,IAAI,EAAE,OAAO,GAAGL,EAAE,MAAM,GAAG,CAAC,GAAGA,EAAE,MAAM,IAAI,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,MAC1F;AACA,aAAO;AAAA,QACL,OAAO,GAAGA,EAAE,MAAM,GAAGK,CAAC,GAAGrC,GAAEqC,CAAC,CAAC,GAAGL,EAAE,MAAM;AAAA,QACxC,MAAM;AAAA,MACd;AAAA,IACI;AAAA,EACJ;AACA,GAAG6F,KAAK,CAAC7F,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC,GAAG,IAAIE,IAAI,IAAI,MAAM,IAAIQ,IAAI,KAAK,IAAIR,CAAC,EAAE,SAAQ,EAAG,SAASL,EAAE,OAAO,GAAG;AAC3F,aAAO,EAAE,OAAO,GAAGA,EAAE,MAAM,GAAG,CAAC,GAAGa,CAAC,GAAGb,EAAE,MAAM,IAAI,MAAM,GAAE;AAAA,IAC5D;AAAA,EACJ;AACA,GAAG8F,KAAI;AAAA,EACL,CAAC,KAAK,GAAG;AAAA,EACT,CAAC,MAAM,EAAE;AAAA,EACT,CAAC,KAAK,EAAE;AAAA,EACR,CAAC,MAAM,EAAE;AAAA,EACT,CAAC,KAAK,EAAE;AAAA,EACR,CAAC,MAAM,CAAC;AAAA,EACR,CAAC,KAAK,CAAC;AAAA,EACP,CAAC,MAAM,CAAC;AAAA,EACR,CAAC,KAAK,CAAC;AACT,GAAGC,KAAI,CAAC/F,MAAM;AACZ,MAAIA,IAAI,KAAKA,IAAIgF;AACf,WAAO;AACT,MAAI,IAAIhF,GAAGE,IAAI;AACf,aAAW,CAACC,GAAGE,CAAC,KAAKyF;AACnB,WAAO,KAAKzF;AACV,MAAAH,KAAKC,GAAG,KAAKE;AACjB,SAAOH;AACT,GAAG8F,KAAI,CAAChG,MAAM;AACZ,MAAIA,EAAE,WAAW,KAAKA,MAAMA,EAAE,YAAW;AACvC,WAAO;AACT,MAAI,IAAIA,GAAGE,IAAI;AACf,aAAW,CAACG,GAAG,CAAC,KAAKyF;AACnB,WAAO,EAAE,WAAWzF,CAAC;AACnB,MAAAH,KAAK,GAAG,IAAI,EAAE,MAAMG,EAAE,MAAM;AAChC,MAAI,EAAE,SAAS;AACb,WAAO;AACT,QAAMF,IAAI4F,GAAE7F,CAAC;AACb,SAAO,CAACC,KAAKA,MAAMH,IAAI,OAAOE;AAChC,GAAG+F,KAAK,CAACjG,GAAG,MAAM;AAChB,MAAIE,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAMC,IAAIH,IAAI,IAAIE,GAAGG,IAAI0F,GAAE5F,CAAC;AAC5B,aAAOE,IAAI,EAAE,OAAOA,GAAG,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC/D;AAAA,EACJ;AACA,GAAG6F,KAAK,CAAClG,MAAM,IAAI,OAAO,oBAAoB,GAAG,EAAE,KAAKA,CAAC,IAAI,UAAU,IAAI,OAAO,UAAU,GAAG,EAAE,KAAKA,CAAC,IAAI,UAAU,IAAI,OAAO,UAAU,GAAG,EAAE,KAAKA,CAAC,IAAI,WAAW,IAAI,OAAO,qBAAqB,GAAG,EAAE,KAAKA,CAAC,IAAI,UAAU,IAAI,OAAO,mBAAmB,GAAG,EAAE,KAAKA,CAAC,IAAI,QAAQ,IAAI,OAAO,wBAAwB,GAAG,EAAE,KAAKA,CAAC,IAAI,aAAa,IAAI,OAAO,wBAAwB,GAAG,EAAE,KAAKA,CAAC,IAAI,aAAa,IAAI,OAAO,UAAU,GAAG,EAAE,KAAKA,CAAC,IAAI,WAAW,SAASmG,KAAK,CAACnG,MAAM;AACld,QAAM,IAAI,CAAA;AACV,MAAIE,IAAI,IAAIC,IAAI;AAChB,aAAWE,KAAKL,GAAG;AACjB,UAAM,IAAIkG,GAAG7F,CAAC;AACd,QAAIF,MAAM,GAAG;AACX,MAAAD,KAAKG;AACL;AAAA,IACF;AACA,IAAAF,MAAM,QAAQ,EAAE,KAAK,EAAE,OAAOD,GAAG,OAAOC,EAAC,CAAE,GAAGD,IAAIG,GAAGF,IAAI;AAAA,EAC3D;AACA,SAAOA,MAAM,QAAQ,EAAE,KAAK,EAAE,OAAOD,GAAG,OAAOC,EAAC,CAAE,GAAG;AACvD,GAAGiG,KAAK,CAACpG,MAAM;AACb,QAAM,IAAImG,GAAGnG,CAAC,GAAGE,IAAI,EAAE,IAAI,CAACQ,GAAGC,OAAO,EAAE,OAAOA,GAAG,KAAKqF,GAAEtF,EAAE,KAAK,IAAI,EAAE,OAAO,CAACA,MAAMA,EAAE,QAAQ,IAAI;AAClG,MAAIR,EAAE,WAAW;AACf,WAAO;AACT,QAAMC,IAAID,EAAE,CAAC,EAAE,OAAOG,IAAIH,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,MAAM,GAAGC,CAAC,EAAE,IAAI,CAACO,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE,GAAGG,IAAI,EAAE,MAAMV,IAAI,CAAC,EAAE,IAAI,CAACO,MAAMA,EAAE,KAAK,EAAE,KAAK,EAAE;AAClI,SAAO,EAAE,QAAQ,GAAG,KAAKL,GAAG,QAAQQ,EAAC;AACvC,GAAGwF,KAAK,CAACrG,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC,GAAG,IAAI4F,GAAE1F,CAAC;AAC5B,aAAO,IAAI,EAAE,OAAO,GAAGL,EAAE,MAAM,GAAG,CAAC,GAAGA,EAAE,MAAM,IAAI,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC1F;AAAA,EACJ;AACA,GAAGsG,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAI;AAAA,EACL,GAAG;AAAA,EACH,GAAG;AACL,GAAGC,KAAqB,oBAAI,IAAI;AAAA,EAC9B,GAAG,OAAO,KAAKJ,EAAC;AAAA,EAChB,GAAG,OAAO,KAAKC,EAAC;AAAA,EAChB,GAAG,OAAO,KAAKC,EAAC;AAAA,EAChB,GAAG,OAAO,KAAKC,EAAC;AAClB,CAAC,GAAGE,KAAK,CAAC3G,MAAM0G,GAAG,IAAI1G,CAAC,GAAG4G,KAAK,CAAC5G,MAAM,kBAAkB,KAAKA,CAAC,IAAI,gBAAgB,UAAU6G,KAAI,CAAC7G,MAAM;AACtG,MAAI,CAACA;AACH,WAAO;AACT,QAAM,IAAI4G,GAAG5G,CAAC;AACd,MAAIA,EAAE,SAAS,GAAG,KAAKA,EAAE,SAAS,GAAG,GAAG;AACtC,UAAMU,IAAI,iCAAiC,KAAKV,CAAC;AACjD,QAAI,CAACU;AACH,aAAO;AACT,UAAMC,IAAID,EAAE,CAAC;AACb,WAAOC,KAAK2F,GAAE3F,CAAC,KAAK4F,GAAE5F,CAAC,OAAO,IAAI,OAAO,EAAE,KAAK,KAAK,OAAO,EAAC,IAAK,EAAE,KAAK,KAAK,OAAO,EAAC;AAAA,EACxF;AACA,MAAIR,IAAI,GAAGE,IAAI,GAAGyG,IAAI,OAAO,mBAAmBjG,IAAI;AACpD,aAAWH,KAAKV,GAAG;AACjB,UAAMW,IAAI2F,GAAE5F,CAAC,KAAK6F,GAAE7F,CAAC;AACrB,QAAIC,GAAG;AACL,UAAIE;AACF,eAAO;AACT,MAAAR,IAAIM,GAAGE,IAAI;AACX;AAAA,IACF;AACA,UAAMD,IAAI4F,GAAE9F,CAAC;AACb,QAAIE,GAAG;AACL,UAAIA,KAAKkG;AACP,eAAO;AACT,MAAAzG,MAAM,MAAMA,IAAI,IAAIF,KAAKE,IAAIO,GAAGP,IAAI,GAAGyG,IAAIlG,GAAGC,IAAI;AAClD;AAAA,IACF;AACA,WAAa;AAAA,EACf;AACA,SAAOV,KAAKE,GAAGF,KAAK,KAAKA,IAAI,MAAM,OAAO,EAAE,KAAKA,GAAG,OAAO,EAAC;AAC9D,GAAG4G,KAAK,CAAC/G,MAAM;AACb,QAAM,IAAI,CAAA;AACV,MAAIE,IAAI,IAAIC,IAAI,GAAGE,IAAI;AACvB,aAAWO,KAAKZ;AACd,IAAA2G,GAAG/F,CAAC,KAAKV,MAAMC,IAAIE,IAAIH,KAAKU,KAAKV,MAAM,EAAE,KAAK,EAAE,OAAOC,GAAG,KAAKE,GAAG,MAAMH,EAAC,CAAE,GAAGA,IAAI,KAAKG,KAAKO,EAAE;AAChG,EAAAV,KAAK,EAAE,KAAK,EAAE,OAAOC,GAAG,KAAKE,GAAG,MAAMH,GAAG;AACzC,QAAM,IAAI,EAAE,IAAI,CAACU,OAAO,EAAE,KAAKA,GAAG,QAAQiG,GAAEjG,EAAE,IAAI,EAAC,EAAG,EAAE,OAAO,CAACA,MAAMA,EAAE,WAAW,IAAI;AACvF,MAAI,EAAE,WAAW;AACf,WAAO;AACT,QAAMC,IAAI,EAAE,CAAC,GAAGH,IAAIV,EAAE,MAAM,GAAGa,EAAE,IAAI,KAAK,GAAGF,IAAIX,EAAE,MAAMa,EAAE,IAAI,GAAG;AAClE,SAAO;AAAA,IACL,QAAQH;AAAA,IACR,KAAKG,EAAE,OAAO;AAAA,IACd,QAAQF;AAAA,IACR,OAAOE,EAAE,OAAO;AAAA,EACpB;AACA,GAAGmG,KAAI,CAAChH,GAAG,MAAM;AACf,MAAI,CAAC,OAAO,SAASA,CAAC,KAAKA,KAAK,KAAKA,IAAI;AACvC,WAAO;AACT,QAAME,IAAI,MAAM,gBAAgB,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAGC,IAAI,MAAM,gBAAgB,MAAM,KAAKE,IAAI,MAAM,gBAAgB,MAAM;AAC5M,MAAIL,MAAM;AACR,WAAO,GAAGE,EAAE,CAAC,CAAC,GAAGG,CAAC;AACpB,MAAI,IAAIL,GAAGa,IAAI;AACf,QAAMH,IAAI,KAAK,MAAM,IAAI,GAAG;AAC5B,EAAAA,IAAI,MAAMA,IAAI,MAAMG,KAAKX,EAAEQ,CAAC,IAAIG,KAAK,KAAK,KAAK;AAC/C,QAAMF,IAAI,KAAK,MAAM,IAAI,GAAG;AAC5B,EAAAA,IAAI,MAAMA,IAAI,MAAME,KAAKX,EAAES,CAAC,IAAIE,KAAK,KAAK,KAAK;AAC/C,QAAMD,IAAI,KAAK,MAAM,IAAI,EAAE;AAC3B,SAAOA,IAAI,MAAMA,IAAI,MAAMC,KAAKX,EAAEU,CAAC,IAAIC,KAAKV,GAAG,KAAK,KAAK,IAAI,MAAMU,KAAKX,EAAE,CAAC,IAAIW,KAAK;AACtF,GAAGoG,KAAK,CAACjH,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAIL,IAAI,IAAIG,GAAG,IAAI6G,GAAE3G,GAAGH,CAAC;AAC/B,aAAO,IAAI,EAAE,OAAO,GAAG,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC/D;AAAA,EACJ;AACA,GAAGgH,KAAK,CAAClH,GAAG,GAAGE,MAAM;AACnB,MAAIC,IAAI;AACR,SAAO;AAAA,IACL,OAAO;AACL,MAAAA,KAAK;AACL,YAAME,IAAI,IAAIH,IAAIC,GAAG,IAAI6G,GAAE3G,GAAGL,EAAE,KAAK;AACrC,aAAO,IAAI,EAAE,OAAO,GAAGA,EAAE,MAAM,GAAG,CAAC,GAAGA,EAAE,MAAM,IAAI,MAAM,GAAE,IAAK,EAAE,OAAO,QAAQ,MAAM,GAAE;AAAA,IAC1F;AAAA,EACJ;AACA,GAAGmH,IAAI,CAACnH,MAAM;AACZ,MAAIA,EAAE,SAAS;AACb,WAAO;AACT,QAAM,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AACpB,WAASE,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,QAAI,KAAK,IAAIF,EAAEE,CAAC,IAAIF,EAAEE,IAAI,CAAC,IAAI,CAAC,IAAI6E;AAClC,aAAO;AACX,SAAO;AACT,GAAGqC,KAAK,CAACpH,MAAM;AACb,MAAIA,EAAE,SAAS,KAAKA,EAAE,CAAC,MAAM;AAC3B,WAAO;AACT,QAAM,IAAIA,EAAE,CAAC,IAAIA,EAAE,CAAC;AACpB,WAASE,IAAI,GAAGA,IAAIF,EAAE,QAAQE,KAAK;AACjC,QAAIF,EAAEE,IAAI,CAAC,MAAM,KAAK,KAAK,IAAIF,EAAEE,CAAC,IAAIF,EAAEE,IAAI,CAAC,IAAI,CAAC,IAAI6E;AACpD,aAAO;AACX,SAAO;AACT,GAAGsC,KAAK,CAACrH,MAAM;AACb,QAAM,IAAIA,EAAE,IAAI,CAACU,MAAMiF,GAAGjF,CAAC,CAAC;AAC5B,MAAI,EAAE,MAAM,CAACA,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAI,GAAGC,IAAID,EAAE,CAAC;AACpB,QAAIA,EAAE;AAAA,MACJ,CAACnB,MAAMA,EAAE,WAAWoB,EAAE,UAAUpB,EAAE,WAAWoB,EAAE,UAAUpB,EAAE,WAAWoB,EAAE;AAAA,IAC9E,GAAO;AACD,YAAMpB,IAAImB,EAAE,IAAI,CAAC4G,MAAMA,EAAE,GAAG,GAAGtG,IAAImG,EAAE5H,CAAC;AACtC,UAAIyB,MAAM,MAAM;AACd,cAAMsG,IAAI5G,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAUkF;AAAA,YACR,EAAE,QAAQjF,EAAE,QAAQ,QAAQA,EAAE,QAAQ,QAAQA,EAAE,OAAM;AAAA,YACtD2G,EAAE;AAAA,YACFtG;AAAA,UACZ;AAAA,QACA;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,QAAMd,IAAIF,EAAE,IAAI,CAACU,MAAMgF,GAAGhF,CAAC,CAAC;AAC5B,MAAIR,EAAE,MAAM,OAAO,GAAG;AACpB,UAAMQ,IAAIR,EAAE,CAAC,GAAGS,IAAIT,EAAEA,EAAE,SAAS,CAAC;AAClC,QAAIA,EAAE;AAAA,MACJ,CAACX,MAAMA,GAAG,WAAWmB,EAAE,UAAUnB,GAAG,WAAWmB,EAAE;AAAA,IACvD,GAAO;AACD,YAAMnB,IAAIW,EAAE,IAAI,CAACoH,MAAMA,GAAG,OAAO,CAAC,GAAGtG,IAAImG,EAAE5H,CAAC;AAC5C,UAAIyB,MAAM;AACR,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU6E;AAAA,YACR,EAAE,QAAQlF,EAAE,QAAQ,QAAQA,EAAE,QAAQ,OAAOA,EAAE,MAAK;AAAA,YACpDA,EAAE;AAAA,YACFK;AAAA,UACZ;AAAA,QACA;AAAA,IACI;AAAA,EACF;AACA,QAAMb,IAAIH,EAAE,IAAI,CAACU,MAAMsF,GAAEtF,CAAC,CAAC;AAC3B,MAAIP,EAAE,MAAM,CAACO,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAIP,GAAGQ,IAAIwG,EAAEzG,CAAC;AACpB,QAAIC,MAAM,MAAM;AACd,YAAMC,IAAIF,EAAEA,EAAE,SAAS,CAAC;AACxB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAUuF,GAAGrF,GAAGD,CAAC;AAAA,MACzB;AAAA,IACI;AAAA,EACF;AACA,QAAMN,IAAIL,EAAE,IAAI,CAACU,MAAMmG,GAAEnG,CAAC,CAAC;AAC3B,MAAIL,EAAE,MAAM,CAACK,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAIL,GAAGM,IAAID,EAAE,CAAC,EAAE;AACtB,QAAIA,EAAE,MAAM,CAACE,MAAMA,EAAE,UAAUD,CAAC,GAAG;AACjC,YAAMC,IAAIF,EAAE,IAAI,CAACM,MAAMA,EAAE,GAAG,GAAGzB,IAAI4H,EAAEvG,CAAC;AACtC,UAAIrB,MAAM,MAAM;AACd,cAAMyB,IAAIN,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAUuG,GAAGjG,EAAE,KAAKzB,GAAGyB,EAAE,KAAK;AAAA,QACxC;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAIhB,EAAE,IAAI,CAACU,MAAM0F,GAAG1F,CAAC,CAAC;AAC5B,MAAI,EAAE,MAAM,CAACA,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAI,GAAGC,IAAID,EAAE,CAAC;AACpB,QAAIA,EAAE;AAAA,MACJ,CAACnB,MAAMA,EAAE,WAAWoB,EAAE,UAAUpB,EAAE,WAAWoB,EAAE;AAAA,IACrD,GAAO;AACD,YAAMpB,IAAImB,EAAE,IAAI,CAAC4G,MAAMA,EAAE,GAAG,GAAGtG,IAAImG,EAAE5H,CAAC;AACtC,UAAIyB,MAAM,MAAM;AACd,cAAMsG,IAAI/H,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU8G;AAAA,YACR,EAAE,QAAQ1F,EAAE,QAAQ,QAAQA,EAAE,OAAM;AAAA,YACpC2G;AAAA,YACAtG;AAAA,UACZ;AAAA,QACA;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,QAAMH,IAAIb,EAAE,IAAI,CAACU,MAAMqG,GAAGrG,CAAC,CAAC;AAC5B,MAAIG,EAAE,MAAM,CAACH,MAAMA,MAAM,IAAI,GAAG;AAC9B,UAAMA,IAAIG,GAAGF,IAAID,EAAE,CAAC;AACpB,QAAIA,EAAE;AAAA,MACJ,CAACnB,MAAMA,EAAE,WAAWoB,EAAE,UAAUpB,EAAE,WAAWoB,EAAE,UAAUpB,EAAE,UAAUoB,EAAE;AAAA,IAC7E,GAAO;AACD,YAAMpB,IAAImB,EAAE,IAAI,CAAC4G,MAAMA,EAAE,GAAG,GAAGtG,IAAImG,EAAE5H,CAAC;AACtC,UAAIyB,MAAM,MAAM;AACd,cAAMsG,IAAI5G,EAAEA,EAAE,SAAS,CAAC;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAUwG;AAAA,YACR,EAAE,QAAQvG,EAAE,QAAQ,QAAQA,EAAE,QAAQ,OAAOA,EAAE,MAAK;AAAA,YACpD2G,EAAE;AAAA,YACFtG;AAAA,UACZ;AAAA,QACA;AAAA,MACM;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT,GAAGuG,KAAK,CAACvH,GAAG,MAAM;AAChB,QAAME,IAAI,EAAE,MAAMF,CAAC;AACnB,SAAOE,IAAI;AAAA,IACT,MAAM;AAAA,IACN,UAAUoF,GAAGpF,GAAGF,CAAC;AAAA,EACrB,IAAM;AACN;AACA,SAASwH,GAAGxH,GAAG,GAAG;AAChB,QAAME,IAAI,GAAG,YAAY0E,GAAE;AAC3B,MAAI5E,EAAE,WAAW;AACf,WAAO8E,EAAE,SAAS9E,GAAG,eAAekF,GAAElF,CAAC,CAAC;AAC1C,MAAIA,EAAE,WAAW;AACf,WAAO8E,EAAE,SAAS9E,GAAG,QAAQiF,GAAGjF,EAAE,CAAC,CAAC,CAAC;AACvC,MAAIyF,GAAGzF,CAAC,GAAG;AACT,UAAMG,IAAIoH,GAAGvH,GAAGE,CAAC;AACjB,QAAIC;AACF,aAAO2E,EAAE,SAAS9E,GAAGG,EAAE,MAAMA,EAAE,QAAQ;AACzC,UAAME,IAAIgH,GAAGrH,CAAC;AACd,QAAIK;AACF,aAAOyE,EAAE,SAAS9E,GAAGK,EAAE,MAAMA,EAAE,QAAQ;AAAA,EAC3C;AACA,MAAIkF,GAAGvF,CAAC,GAAG;AACT,UAAMG,IAAIgH,EAAEnH,CAAC;AACb,QAAIG,MAAM;AACR,aAAO2E,EAAE;AAAA,QACP9E;AAAA,QACA;AAAA,QACAmF,GAAGnF,EAAEA,EAAE,SAAS,CAAC,GAAGG,CAAC;AAAA,MAC7B;AACI,UAAME,IAAI+G,GAAGpH,CAAC;AACd,QAAIK,MAAM;AACR,aAAOyE,EAAE;AAAA,QACP9E;AAAA,QACA;AAAA,QACAqF,GAAGrF,EAAEA,EAAE,SAAS,CAAC,GAAGK,CAAC;AAAA,MAC7B;AAAA,EACE;AACA,MAAImF,GAAGxF,CAAC,GAAG;AACT,UAAMG,IAAIH,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,GAAGK,IAAI8G,EAAEhH,CAAC;AAC5C,QAAIE,MAAM;AACR,aAAOyE,EAAE;AAAA,QACP9E;AAAA,QACA;AAAA,QACAoF,GAAGpF,EAAEA,EAAE,SAAS,CAAC,GAAGK,CAAC;AAAA,MAC7B;AAAA,EACE;AACA,SAAOyE,EAAE,SAAS9E,GAAG,eAAekF,GAAElF,CAAC,CAAC;AAC1C;ACzoDA,SAASyH,GAAeC,GAAuC;AAC7D,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAC7C,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,EAAA;AAEjD;AAEA,SAASC,GAAaC,GAA6B;AACjD,MAAIA,aAAiB,KAAM,QAAOA;AAClC,MAAI,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,EAAG,QAAO,IAAI,KAAKA,CAAK;AAC9E,MAAI,OAAOA,KAAU,UAAU;AAC7B,UAAMzH,IAAIyH,EAAM,KAAA;AAChB,QAAI,uCAAuC,KAAKzH,CAAC,GAAG;AAClD,YAAMmH,IAAI,oBAAI,KAAK,cAAcnH,CAAC,EAAE;AACpC,aAAO,OAAO,MAAMmH,EAAE,QAAA,CAAS,IAAI,OAAOA;AAAAA,IAC5C;AACA,UAAMA,IAAI,IAAI,KAAKnH,CAAC;AACpB,WAAO,OAAO,MAAMmH,EAAE,QAAA,CAAS,IAAI,OAAOA;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAASO,GAAaD,GAA6B;AACjD,MAAIA,aAAiB,KAAM,QAAOA;AAClC,MAAI,OAAOA,KAAU,YAAY,OAAO,SAASA,CAAK,EAAG,QAAO,IAAI,KAAKA,CAAK;AAC9E,MAAI,OAAOA,KAAU,UAAU;AAC7B,UAAMN,IAAI,IAAI,KAAKM,CAAK;AACxB,WAAO,OAAO,MAAMN,EAAE,QAAA,CAAS,IAAI,OAAOA;AAAA,EAC5C;AACA,SAAO;AACT;AAEO,SAASQ,GAAoBnJ,GAAsBoJ,GAAmD;AAC3G,MAAIA,EAAO,WAAW,EAAG,QAAO;AAChC,QAAML,IAAQD,GAAeM,EAAO,CAAC,CAAE;AACvC,MAAIL,EAAM,SAAS,QAAS,QAAO;AACnC,QAAMM,IAAQN,EAAM,SAASA,EAAM,WAAW,GACxCO,IAASP,EAAM,SAASA,EAAM,WAAW;AAE/C,MADIM,MAAU,KACVC,IAAS,EAAG,QAAO;AAGvB,QAAM9I,IADSR,EAAU,UAAA,EACN,QAAQ+I,EAAM,QAAQ;AACzC,SAAKvI,IAED8I,MAAW,IACN;AAAA,IACL,QAAQ9I,EAAI;AAAA,IACZ,UAAUuI,EAAM;AAAA,IAChB,eAAeA,EAAM;AAAA,IACrB,aAAaA,EAAM;AAAA,IACnB,MAAM;AAAA,EAAA,IAINvI,EAAI,SAAS,YACR,OAIPA,EAAI,SAAS,YACbA,EAAI,SAAS,UACbA,EAAI,SAAS,UACbA,EAAI,SAAS,cACbA,EAAI,SAAS,WAEN;AAAA,IACL,QAAQA,EAAI;AAAA,IACZ,UAAUuI,EAAM;AAAA,IAChB,eAAeA,EAAM;AAAA,IACrB,aAAaA,EAAM;AAAA,IACnB,MAAM;AAAA,EAAA,IAKH,OAjCU;AAkCnB;AAEO,SAASQ,GACdvJ,GACAwJ,GACAC,GAC6C;AAC7C,QAAMvJ,IAASF,EAAU,UAAA,GACnBG,IAAOH,EAAU,SAAA,GACjBQ,IAAMN,EAAO,QAAQsJ,EAAO,QAAQ;AAC1C,MAAI,CAAChJ,EAAK,QAAO;AACjB,QAAMkJ,IAAkB,CAAA;AACxB,WAAShI,IAAI8H,EAAO,eAAe9H,KAAK8H,EAAO,aAAa9H,KAAK,GAAG;AAClE,UAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,QAAI,CAACnB,EAAK,QAAO;AACjB,IAAAmJ,EAAK,KAAK1J,EAAU,QAAQO,EAAI,IAAIC,EAAI,GAAG,CAAC;AAAA,EAC9C;AAEA,MAAIgJ,EAAO,SAAS,QAAQ;AAC1B,UAAM7J,IAAO+J,EAAKA,EAAK,SAAS,CAAC;AACjC,WAAO,MAAM/J;AAAA,EACf;AAEA,QAAMgK,IAAWC,GAAsBH,CAAK;AAC5C,MAAIjJ,EAAI,SAAS,UAAU;AACzB,UAAMqJ,IAAUH,EAAK,IAAI,CAACT,MAAW,OAAOA,KAAU,WAAWA,IAAQ,OAAOA,CAAK,CAAE;AACvF,QAAI,CAACY,EAAQ,MAAM,CAACZ,MAAU,OAAO,SAASA,CAAK,CAAC,EAAG,QAAO;AAC9D,UAAMa,IAAMC,GAAcF,GAAS,EAAE,UAAAF,GAAU,GACzCK,IAAkB,CAAA;AACxB,QAAIC,IAAO;AACX,WAAO,CAACC,MAAkB;AACxB,aAAO,CAACD,KAAQD,EAAM,SAASE,KAAe;AAC5C,cAAMC,IAAOL,EAAI,KAAA;AACjB,YAAIK,EAAK,MAAM;AACb,UAAAF,IAAO;AACP;AAAA,QACF;AACA,QAAAD,EAAM,KAAKG,EAAK,KAAK;AAAA,MACvB;AACA,aAAID,KAAiB,IAAU,OACxBF,EAAME,IAAgB,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,MAAI1J,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,YAAY;AACzE,UAAM4J,IAAQV,EAAK;AAAA,MAAI,CAACT,MACtBzI,EAAI,SAAS,SAASwI,GAAaC,CAAK,IAAIC,GAAaD,CAAK;AAAA,IAAA;AAEhE,QAAI,CAACmB,EAAM,MAAM,CAACnB,MAAUA,aAAiB,IAAI,EAAG,QAAO;AAC3D,UAAMa,IAAMC,GAAcK,GAAiB,EAAE,UAAAT,GAAU,GACjDK,IAAgB,CAAA;AACtB,QAAIC,IAAO;AACX,WAAO,CAACC,MAAkB;AACxB,aAAO,CAACD,KAAQD,EAAM,SAASE,KAAe;AAC5C,cAAMC,IAAOL,EAAI,KAAA;AACjB,YAAIK,EAAK,MAAM;AACb,UAAAF,IAAO;AACP;AAAA,QACF;AACA,QAAAD,EAAM,KAAKG,EAAK,KAAK;AAAA,MACvB;AACA,aAAID,KAAiB,IAAU,OACxBF,EAAME,IAAgB,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,MAAI1J,EAAI,SAAS,UAAU;AACzB,UAAM6J,IAAUX,EAAK,IAAI,CAACT,MAAU,OAAOA,KAAS,EAAE,CAAC,GACjDa,IAAMC,GAAcM,GAAS,EAAE,UAAAV,GAAU,GACzCK,IAAkB,CAAA;AACxB,QAAIC,IAAO;AACX,WAAO,CAACC,MAAkB;AACxB,aAAO,CAACD,KAAQD,EAAM,SAASE,KAAe;AAC5C,cAAMC,IAAOL,EAAI,KAAA;AACjB,YAAIK,EAAK,MAAM;AACb,UAAAF,IAAO;AACP;AAAA,QACF;AACA,QAAAD,EAAM,KAAKG,EAAK,KAAK;AAAA,MACvB;AACA,aAAID,KAAiB,IAAU,OACxBF,EAAME,IAAgB,CAAC,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAEO,MAAMI,KAA6B,IAC7BC,KAA0B;AAEhC,SAASC,GAAkBC,GAAmBC,IAAOJ,IAAqC;AAC/F,SAAO,IAAI,QAAQG,EAAS,QAAQC,IAAO,GAAGD,EAAS,SAASC,IAAO,GAAGA,GAAMA,CAAI;AACtF;AAEO,SAASC,GAActF,GAAWC,GAAWsF,GAAe;AACjE,SAAOvF,KAAKuF,EAAK,QAAQvF,KAAKuF,EAAK,SAAStF,KAAKsF,EAAK,OAAOtF,KAAKsF,EAAK;AACzE;AAEO,SAASC,GACd7K,GACAoJ,GACA0B,GACAC,GACAC,GACS;AACT,MAAIA,MAAa,WAAY,QAAO;AACpC,QAAMC,IAAM9B,GAAoBnJ,GAAWoJ,CAAM;AAMjD,SALI,GAAC6B,KACD,CAACH,KAAeA,MAAgB,aAChCC,MAAiB,QACjBA,MAAiB,aAAaA,MAAiB,QAC/CA,MAAiBE,EAAI,UACrBjL,EAAU,WAAW8K,GAAaC,CAAY;AAEpD;AC9KA,MAAMG,IAAqB,0EAGrBC,IAAsB;AAE5B,SAASC,GAAiBC,GAAY1K,GAAuC;AAC3E,QAAMa,IAAI6J,EAAK,QAAQ,CAAC;AACxB,SAAK7J,KACEA,EAAE,QAAQb,IAASa,EAAE,MADb;AAEjB;AAEA,SAAS8J,GAAsBD,GAAY1K,GAAyB;AAKlE,OAJmB0K,EAAK,WAAW,CAAA,GAAI,KAAK,CAAChJ,MAAM;AACjD,UAAMkJ,IAAKlJ;AACX,WAAOkJ,GAAI,SAAS,YAAYA,EAAG,QAAQ5K;AAAA,EAC7C,CAAC,EACc,QAAO;AACtB,QAAM6K,IAAOH,EAAK,oBAAoB1K,CAAM;AAC5C,SAAO,GAAQ6K,GAAM,UAAUA,GAAM;AACvC;AAEA,SAASC,KAAY;AAEnB,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,KAAA;AACJ;AAEA,SAASC,GAASC,GAAqB;AAErC,SAAO;AAAA;AAAA,iBADGA,MAAQ,QAAQ,qBAAqB,sBAG/B;AAAA;AAAA,IAEd,KAAA;AACJ;AAEA,SAASC,GACPC,GACAxG,GACAC,GACAE,GACAgD,GACAsD,GACA;AACA,QAAMpB,IAAO,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,IAAIlF,GAAGgD,CAAC,IAAI,CAAC,CAAC;AACxD,MAAIkC,KAAQ,EAAG;AACf,QAAMqB,IAAQD,MAAU,UAAU,YAAY;AAC9C,EAAAD,EAAI,KAAA,GACJA,EAAI,YAAYE,GAChBF,EAAI,UAAA,GACJA,EAAI,OAAOxG,IAAIG,GAAGF,CAAC,GACnBuG,EAAI,OAAOxG,IAAIG,IAAIkF,GAAMpF,CAAC,GAC1BuG,EAAI,OAAOxG,IAAIG,GAAGF,IAAIoF,CAAI,GAC1BmB,EAAI,UAAA,GACJA,EAAI,KAAA,GACJA,EAAI,QAAA;AACN;AAEA,MAAMG,GAAiB;AAAA,EAAvB,cAAA;AACE,SAAQ,wCAAwB,IAAA,GAChC,KAAQ,qCAAqB,IAAA;AAAA,EAAkB;AAAA,EAE/C,mBAAmBC,GAAsD;AACvE,UAAMC,IAAM,KAAK,UAAUD,CAAO;AAClC,QAAIE,IAAM,KAAK,kBAAkB,IAAID,CAAG;AACxC,WAAKC,MACHA,IAAM,IAAI,KAAK,aAAa,SAASF,CAAO,GAC5C,KAAK,kBAAkB,IAAIC,GAAKC,CAAG,IAE9BA;AAAA,EACT;AAAA,EAEA,aAAalD,GAA4B;AACvC,UAAMmD,IAAS,KAAK,eAAe,IAAInD,CAAK;AAC5C,QAAImD,EAAQ,QAAOA;AACnB,UAAMC,IAASC,GAAarD,CAAK;AACjC,WAAI,CAACoD,KAAU,OAAO,MAAMA,EAAO,QAAA,CAAS,IAAU,QACtD,KAAK,eAAe,IAAIpD,GAAOoD,CAAM,GAC9BA;AAAA,EACT;AACF;AAEA,SAASE,GACPV,GACAxG,GACAC,GACAoF,GACA8B,GACA;AACA,EAAAX,EAAI,KAAA,GACJA,EAAI,cAAcW,GAClBX,EAAI,cAAc,oBAClBA,EAAI,YAAY,GAChBA,EAAI,WAAW,SACfA,EAAI,UAAA,GAEJA,EAAI,OAAOxG,GAAGC,CAAC,GACfuG,EAAI,OAAOxG,IAAIqF,GAAMpF,CAAC,GACtBuG,EAAI,OAAOxG,IAAI,KAAK,MAAMqF,IAAO,IAAI,GAAGpF,IAAI,KAAK,MAAMoF,IAAO,IAAI,CAAC,GACnEmB,EAAI,OAAOxG,IAAI,KAAK,MAAMqF,IAAO,IAAI,GAAGpF,IAAI,KAAK,MAAMoF,IAAO,IAAI,CAAC,GACnEmB,EAAI,UAAA,GACJA,EAAI,OAAA,GAEJA,EAAI,UAAA,GACJA,EAAI,OAAOxG,IAAI,KAAK,MAAMqF,IAAO,IAAI,GAAGpF,IAAI,KAAK,MAAMoF,IAAO,IAAI,CAAC,GACnEmB,EAAI,OAAOxG,IAAI,KAAK,MAAMqF,IAAO,IAAI,GAAGpF,IAAIoF,CAAI,GAChDmB,EAAI,OAAOxG,IAAI,KAAK,MAAMqF,IAAO,IAAI,GAAGpF,IAAIoF,IAAO,CAAC,GACpDmB,EAAI,OAAOxG,IAAI,KAAK,MAAMqF,IAAO,IAAI,GAAGpF,IAAI,KAAK,MAAMoF,IAAO,IAAI,CAAC,GACnEmB,EAAI,OAAA,GACJA,EAAI,QAAA;AACN;AAEA,SAASY,GACPZ,GACAxG,GACAC,GACAoF,GACA8B,GACAb,GACA;AACA,EAAAE,EAAI,KAAA,GACJA,EAAI,cAAcW,GAClBX,EAAI,YAAY,oBAChBA,EAAI,UAAA,GACAF,MAAQ,SACVE,EAAI,OAAOxG,IAAIqF,IAAO,GAAGpF,CAAC,GAC1BuG,EAAI,OAAOxG,IAAIqF,GAAMpF,IAAIoF,CAAI,GAC7BmB,EAAI,OAAOxG,GAAGC,IAAIoF,CAAI,MAEtBmB,EAAI,OAAOxG,GAAGC,CAAC,GACfuG,EAAI,OAAOxG,IAAIqF,GAAMpF,CAAC,GACtBuG,EAAI,OAAOxG,IAAIqF,IAAO,GAAGpF,IAAIoF,CAAI,IAEnCmB,EAAI,UAAA,GACJA,EAAI,KAAA,GACJA,EAAI,QAAA;AACN;AAEA,SAASa,GAAiBzD,GAAiC;AACzD,MAAI,MAAM,QAAQA,CAAK,KAAKA,EAAM,MAAM,CAACrD,MAAM,OAAOA,KAAM,QAAQ;AAClE,WAAOqD;AAET,MAAIA,KAAS,OAAOA,KAAU,UAAU;AACtC,UAAM0D,IAAM1D;AACZ,QAAI0D,EAAI,SAAS,QAAQ;AACvB,YAAMC,IAASD,EAAI;AACnB,UAAI,MAAM,QAAQC,CAAM;AACtB,eAAOA,EAAO,OAAO,CAAChH,MAAmB,OAAOA,KAAM,QAAQ;AAAA,IAElE;AAAA,EACF;AACA,SAAO;AACT;AAEA,MAAMiH,GAAY;AAAA,EAKhB,YAAYtL,GAAW;AACrB,SAAK,IAAIA,GACT,KAAK,OAAO,IAAI,MAAMA,IAAI,CAAC,EAAE,KAAK,CAAC;AAAA,EACrC;AAAA,EAEA,OAAO,KAAKqL,GAAkB;AAC5B,UAAMtE,IAAK,IAAIuE,GAAYD,EAAO,MAAM;AACxC,aAAS,IAAI,GAAG,IAAIA,EAAO,QAAQ,KAAK,EAAG,CAAAtE,EAAG,IAAI,GAAGsE,EAAO,CAAC,KAAK,CAAC;AACnE,WAAOtE;AAAA,EACT;AAAA,EAEA,IAAIwE,GAAe;AAEjB,QAAI/K,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG+K,CAAK,CAAC,GACvCC,IAAM;AACV,WAAOhL,IAAI;AACT,MAAAgL,KAAO,KAAK,KAAKhL,CAAC,KAAK,GACvBA,KAAKA,IAAI,CAACA;AAEZ,WAAOgL;AAAA,EACT;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,IAAI,KAAK,CAAC;AAAA,EACxB;AAAA,EAEA,IAAIC,GAAgBC,GAAe;AACjC,QAAI,IAAID,IAAS;AACjB,QAAI,OAAK,KAAK,IAAI,KAAK;AACvB,aAAO,KAAK,KAAK;AACf,aAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,KAAKC,GACrC,KAAK,IAAI,CAAC;AAAA,EAEd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWC,GAAgB;AAEzB,QADI,KAAK,KAAK,KACVA,KAAU,EAAG,QAAO;AACxB,UAAMC,IAAQ,KAAK,MAAA;AACnB,QAAID,IAASC,EAAO,QAAO,KAAK,IAAI;AACpC,QAAIC,IAAM,GAENC,IAAM;AACV,WAAOA,KAAO,KAAK,IAAG,CAAAA,MAAQ;AAC9B,QAAIC,IAAM;AACV,aAASC,IAAOF,GAAKE,MAAS,GAAGA,MAAS,GAAG;AAC3C,YAAMpD,IAAOiD,IAAMG;AACnB,UAAIpD,KAAQ,KAAK,GAAG;AAClB,cAAMqD,IAAUF,KAAO,KAAK,KAAKnD,CAAI,KAAK;AAC1C,QAAIqD,IAAUN,MACZE,IAAMjD,GACNmD,IAAME;AAAA,MAEV;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,KAAK,IAAI,GAAGJ,CAAG;AAAA,EACjC;AACF;AA8BO,MAAMK,GAAiC;AAAA,EAU5C,YAAoBzN,GAAsB;AAAtB,SAAA,YAAAA,GATpB,KAAQ,UAAmC,MAC3C,KAAQ,mBAAmB0N,IAC3B,KAAQ,iBAAiBC,IACzB,KAAQ,cAA6B,MACrC,KAAQ,eAA8B,MACtC,KAAQ,YAA8B,CAAA,GACtC,KAAQ,mBAAmB,IAAI3B,GAAA,GAC/B,KAAQ,mCAAmB,IAAA,GAC3B,KAAQ,QAAQ;AAAA,EAC2B;AAAA,EAE3C,MAAM4B,GAAmB;AACvB,SAAK,UAAU,SAAS,cAAc,OAAO,GAC7C,KAAK,QAAQ,QAAQ,kBAAkB,QACvCA,EAAK,YAAY,IACjBA,EAAK,YAAY,KAAK,OAAO,GAC7B,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,cAAclN,GAAsBC,GAAuB;AACzD,SAAK,cAAcD,GACnB,KAAK,eAAeC,GACpB,KAAK,oBAAA;AAAA,EACP;AAAA,EAEA,aAAayI,GAA0B;AACrC,SAAK,YAAYA,GACjB,KAAK,sBAAA;AAAA,EACP;AAAA,EAEA,OAAOyE,GAAwB;AAE7B,QADA,KAAK,SAAS,GACV,CAAC,KAAK,QAAS;AACnB,UAAMC,IAAkB,KAAK,QAAQ,eAC/BC,IAAUD,GAAiB,aAAa,GACxCE,IAAWF,GAAiB,cAAc,GAC1C5N,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtBlL,IAAO,KAAK,UAAU,SAAA;AAC5B,SAAK,QAAQ,YAAY;AACzB,UAAM8N,IAAYC,EAAgBhO,GAAQmL,CAAI,GACxC8C,IAAgBjO,EAAO,QAAQ,IAAI,CAACU,MAAMwN,GAAoBxN,CAAC,CAAC,GAChEyN,IAAaF,EAAc,IAAI,CAAC3M,MAAM8M,GAAe9M,CAAC,CAAC,GACvD+M,IAAa,KAAK,iBAAiBN,EAAU,OAAO,CAACX,GAAK9H,MAAM8H,KAAO9H,KAAK,IAAI,CAAC;AACvF,SAAK,QAAQ,MAAM,QAAQ,GAAG+I,CAAU,MACxC,KAAK,QAAQ,YAAY,KAAK,aAAarO,GAAQ+N,CAAS,CAAC;AAC7D,UAAMO,IAAO,SAAS,cAAc,OAAO;AAC3C,eAAWjO,KAAOJ;AAChB,MAAAqO,EAAK,YAAY,KAAK,UAAUjO,GAAKL,GAAQ+N,GAAWE,GAAeE,CAAU,CAAC;AAEpF,SAAK,QAAQ,YAAYG,CAAI,GAC7B,KAAK,oBAAA,GACL,KAAK,sBAAA,GACDV,MACFA,EAAgB,YAAYC,GAC5BD,EAAgB,aAAaE;AAE/B,eAAW,CAAC9B,GAAKuC,CAAK,KAAK,MAAM,KAAK,KAAK,aAAa,QAAA,CAAS;AAC/D,MAAIA,EAAM,UAAU,KAAK,SAAO,KAAK,aAAa,OAAOvC,CAAG;AAAA,EAEhE;AAAA,EAEA,UAAU;AACR,IAAAwC,EAAiB,KAAK,OAAO,GAC7B,KAAK,UAAU;AAAA,EACjB;AAAA,EAEA,kBAAkB;AAChB,WAAO,KAAK,SAAS,iBAA8B,kCAAkC,KAAK;AAAA,EAC5F;AAAA,EAEA,QAAQC,GAAmB;AACzB,UAAMzB,IAASyB,EAAM;AACrB,QAAI,CAACzB,EAAQ,QAAO;AACpB,UAAM0B,IAAS1B,EAAO,QAAqB,mBAAmB;AAC9D,QAAI0B;AACF,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAASA;AAAA,QACT,MAAMA,EAAO,sBAAA;AAAA,MAAsB;AAGvC,UAAMC,IAAY3B,EAAO,QAAqB,4CAA4C;AAC1F,QAAI2B,GAAW;AACb,YAAMtO,IAAMsO,EAAU,QAAqB,iBAAiB;AAC5D,UAAItO;AACF,eAAO;AAAA,UACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,UAC5B,QAAQ;AAAA,UACR,SAASsO;AAAA,UACT,MAAMA,EAAU,sBAAA;AAAA,QAAsB;AAAA,IAG5C;AACA,UAAMC,IAAO5B,EAAO,QAAqB,kBAAkB,GACrD3M,IAAMuO,GAAM,QAAqB,iBAAiB;AACxD,WAAI,CAACA,KAAQ,CAACvO,IAAY,OACnB;AAAA,MACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,MAC5B,QAAQuO,EAAK,QAAQ,UAAU;AAAA,MAC/B,SAASA;AAAA,MACT,MAAMA,EAAK,sBAAA;AAAA,IAAsB;AAAA,EAErC;AAAA,EAEA,cACEH,GAIO;AACP,UAAMzB,IAASyB,EAAM;AACrB,QAAI,CAACzB,EAAQ,QAAO;AACpB,UAAM6B,IAAY7B,EAAO,QAA2B,2BAA2B;AAC/E,QAAI6B,KAAa,CAACA,EAAU,UAAU;AACpC,YAAMD,IAAOC,EAAU,QAAqB,kBAAkB,GACxDxO,IAAMuO,GAAM,QAAqB,iBAAiB;AACxD,UAAI,CAACA,KAAQ,CAACvO,EAAK,QAAO;AAC1B,YAAMyO,IAAWD,EAAU,QAAQ,iBAC7BE,IAAWD,IAAW,OAAO,SAASA,GAAU,EAAE,IAAI,OAAO;AACnE,aAAK,OAAO,SAASC,CAAQ,IACtB;AAAA,QACL,OAAO1O,EAAI,QAAQ,SAAS;AAAA,QAC5B,QAAQuO,EAAK,QAAQ,UAAU;AAAA,QAC/B,MAAM;AAAA,QACN,UAAAG;AAAA,MAAA,IALqC;AAAA,IAOzC;AACA,UAAMC,IAAWhC,EAAO,QAAqB,uBAAuB;AACpE,QAAI,CAACgC,EAAU,QAAO;AACtB,UAAMJ,IAAOI,EAAS,QAAqB,kBAAkB,GACvD3O,IAAMuO,GAAM,QAAqB,iBAAiB;AACxD,QAAI,CAACA,KAAQ,CAACvO,EAAK,QAAO;AAC1B,UAAM4O,IAAOD,EAAS,QAAQ;AAC9B,WAAIC,MAAS,YAAYA,MAAS,SAAe,OAC1C;AAAA,MACL,OAAO5O,EAAI,QAAQ,SAAS;AAAA,MAC5B,QAAQuO,EAAK,QAAQ,UAAU;AAAA,MAC/B,MAAAK;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,aAAajP,GAAgB+N,GAAqB;AACxD,UAAMmB,IAAQ,SAAS,cAAc,OAAO,GACtCC,IAAK,SAAS,cAAc,IAAI;AACtC,IAAAA,EAAG,MAAM,SAAS,GAAG,KAAK,gBAAgB;AAC1C,UAAMC,IAAQ,SAAS,cAAc,IAAI;AACzC,IAAAA,EAAM,UAAU,IAAI,sBAAsB,gBAAgB,GAC1DA,EAAM,cAAc,IACpBA,EAAM,MAAM,QAAQ,GAAG,KAAK,cAAc,MACtC,KAAK,eAAaA,EAAM,UAAU,OAAO,6BAA6B,EAAI,GAC9EA,EAAM,QAAQ,SAAS,IACvBD,EAAG,YAAYC,CAAK;AACpB,UAAMjE,IAAO,KAAK,UAAU,QAAA;AAC5B,aAAS+B,IAAM,GAAGA,IAAMlN,EAAO,QAAQ,QAAQkN,KAAO,GAAG;AACvD,YAAM5M,IAAMN,EAAO,QAAQkN,CAAG;AAC9B,UAAI,CAAC5M,EAAK;AACV,YAAM+O,IAAK,SAAS,cAAc,IAAI;AACtC,MAAAA,EAAG,QAAQ,SAAS/O,EAAI;AACxB,YAAMgP,IAAUpE,GAAiBC,GAAM7K,EAAI,GAAG,GACxCiP,IAAYnE,GAAsBD,GAAM7K,EAAI,GAAG;AACrD,MAAIgP,IAASD,EAAG,QAAQ,iBAAiBC,IACpCD,EAAG,gBAAgB,uBAAuB,GAC3CE,IAAWF,EAAG,QAAQ,kBAAkB,MACvCA,EAAG,gBAAgB,wBAAwB;AAEhD,YAAMG,IAAO,SAAS,cAAc,KAAK;AACzC,MAAAA,EAAK,YAAY;AACjB,YAAMC,IAAQ,SAAS,cAAc,MAAM;AAC3C,MAAAA,EAAM,YAAY,2BAClBA,EAAM,cAAcnP,EAAI,UAAUA,EAAI;AACtC,YAAMoP,IAAM,SAAS,cAAc,QAAQ;AAC3C,MAAAA,EAAI,OAAO,UACXA,EAAI,YAAY,+BAChBA,EAAI,QAAQ,gBAAgB,KAC5BA,EAAI,QAAQ,gBAAgBpP,EAAI,KAChCoP,EAAI,QAAQ,iBACZA,EAAI,YAAYJ,IAAU9D,GAAS8D,CAAO,IAAI/D,GAAA,GAC9CiE,EAAK,YAAYC,CAAK,GACtBD,EAAK,YAAYE,CAAG,GACpBL,EAAG,YAAYG,CAAI;AACnB,YAAMrG,IAAQ4E,EAAUb,CAAG,KAAK5M,EAAI;AACpC,MAAI6I,MAAOkG,EAAG,MAAM,QAAQ,GAAGlG,CAAK,OACpCkG,EAAG,QAAQ,SAAS/O,EAAI,KACpB,KAAK,iBAAiB,QAAQ,KAAK,iBAAiBA,EAAI,OAC1D+O,EAAG,UAAU,IAAI,2BAA2B,GAE9CF,EAAG,YAAYE,CAAE;AAAA,IACnB;AACA,WAAAH,EAAM,YAAYC,CAAE,GACbD;AAAA,EACT;AAAA,EAEQ,UACN7O,GACAL,GACA+N,GACAE,GACAE,GACA;AACA,UAAMgB,IAAK,SAAS,cAAc,IAAI;AACtC,IAAAA,EAAG,QAAQ,QAAQ9O,EAAI,IACvB8O,EAAG,MAAM,SAAS,GAAG,KAAK,gBAAgB;AAC1C,UAAMhE,IAAO,KAAK,UAAU,QAAA,GACtBwD,IAAY,SAAS,cAAc,IAAI;AAC7C,IAAAA,EAAU,QAAQ,OAClBA,EAAU,UAAU,IAAI,oBAAoB;AAC5C,UAAMgB,IAAQ,KAAK,UAAU,gBAAgBtP,EAAI,EAAE,KAAK;AACxD,IAAAsO,EAAU,cAAc,OAAOgB,CAAK,GAChC,KAAK,gBAAgBtP,EAAI,MAAIsO,EAAU,UAAU,IAAI,2BAA2B,GACpFQ,EAAG,YAAYR,CAAS;AACxB,aAASzB,IAAM,GAAGA,IAAMlN,EAAO,QAAQ,QAAQkN,KAAO,GAAG;AACvD,YAAM5M,IAAMN,EAAO,QAAQkN,CAAG;AAC9B,UAAI,CAAC5M,EAAK;AACV,YAAMsP,IAAK,SAAS,cAAc,IAAI;AACtC,MAAAA,EAAG,UAAU,IAAI,cAAc,GAC/BA,EAAG,QAAQ,SAAStP,EAAI,KACpBA,EAAI,SAAS,aAAWsP,EAAG,UAAU,IAAI,iBAAiB;AAC9D,YAAMC,IAAY,KAAK,UAAU,WAAWxP,EAAI,IAAIC,EAAI,GAAG,GACrDwP,IAAU,KAAK,UAAU,wBAAwBzP,EAAI,IAAIC,CAAG,GAC5DyP,IAAY,KAAK,UAAU,aAAa1P,EAAI,IAAIC,EAAI,GAAG,GACvD0P,IAAe,GACnBD,GAAW,aAAaD,EAAQ,OAAO,aAAaxP,EAAI,OAAO;AAEjE,UAAI,CAACyP,KAAa,CAACD,EAAQ,SAAS,CAACD,GAAW;AAC9C,cAAMI,IAAM9B,EAAWjB,CAAG,KAAK;AAC/B,QAAI+C,MAAKL,EAAG,MAAM,UAAUK;AAAA,MAC9B,OAAO;AACL,cAAMC,IAAYjC,EAAcf,CAAG,KAAK,CAAA,GAClCiD,IAAWL,EAAQ,QAAQM,GAAWF,GAAWJ,EAAQ,KAAK,IAAII,GAClEG,IAASN,IAAYK,GAAWD,GAAUJ,CAAS,IAAII,GACvDG,IAAST,IAAY,EAAE,GAAGQ,GAAQ,WAAW,WAAcA,GAC3DJ,IAAM7B,GAAekC,CAAM;AACjC,QAAIL,MAAKL,EAAG,MAAM,UAAUK;AAAA,MAC9B;AACA,YAAMT,IAAOrE,EAAK,WAAW7K,EAAI,GAAG,KAAKA,EAAI;AAC7C,MAAAsP,EAAG,UAAU,IAAIJ,IAAO,cAAc,aAAa;AACnD,YAAMe,IAAM,KAAK,UAAU,WAAWlQ,EAAI,IAAIC,EAAI,GAAG,GAC/CkQ,IAAW,KAAK,UAAU,iBAAiBnQ,EAAI,IAAIC,CAAG,GACtDmQ,IAAeD,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,SAC7EY,IAAYD,IACd,EAAE,MAAMA,EAAA,IACR,KAAK,YAAYD,EAAS,OAAOlQ,CAAG,GAClCqQ,IAAc,KAAK,UAAU,mBAAmBtQ,EAAI,IAAIC,EAAI,GAAG,GAC/DsQ,IACJtQ,EAAI,SAAS,UAAU,CAACmQ,IAAejE,GAAiBgE,EAAS,KAAK,IAAI,MACtEK,IAAevQ,EAAI,SAAS,YAAYA,EAAI,SAAS,QACrDwQ,IAAcD,IAChBvQ,EAAI,SAAS,WACXyQ,GAAoBP,EAAS,KAAK,IAClCQ,GAAkBR,EAAS,KAAK,IAClC,MACES,IAAcJ,IAChBvQ,EAAI,SAAS,WACX4Q,GAAeV,EAAS,KAAK,IAC7BW,GAAaX,EAAS,KAAK,IAC7B;AACJ,UAAII,KAAaA,EAAU,QAAQ;AACjC,cAAMQ,IAAO,SAAS,cAAc,KAAK;AACzC,QAAAA,EAAK,YAAY,oBACjBR,EAAU,QAAQ,CAACS,GAAK1B,MAAU;AAChC,gBAAM2B,IAAO,SAAS,cAAc,MAAM;AAC1C,UAAAA,EAAK,YAAY;AACjB,gBAAM7B,IAAQ,SAAS,cAAc,MAAM;AAC3C,UAAAA,EAAM,YAAY,qBAClBA,EAAM,cAAc4B;AACpB,gBAAME,IAAS,SAAS,cAAc,QAAQ;AAC9C,UAAAA,EAAO,OAAO,UACdA,EAAO,YAAY,sBACnBA,EAAO,QAAQ,mBAAmB,KAClCA,EAAO,QAAQ,kBAAkB,OAAO5B,CAAK,GAC7C4B,EAAO,cAAc,MACjBZ,EAAY,YAAYA,EAAY,cACtCY,EAAO,WAAW,KAEpBD,EAAK,YAAY7B,CAAK,GACtB6B,EAAK,YAAYC,CAAM,GACvBH,EAAK,YAAYE,CAAI;AAAA,QACvB,CAAC,GACD1B,EAAG,gBAAgBwB,CAAI;AAAA,MACzB,WAAWP,KAAgB,CAACJ,KAAgBK,KAAeG,GAAa;AACtE,cAAMjC,IACJ1O,EAAI,SAAS,WAAW,SAAS,cAAc,QAAQ,IAAI,SAAS,cAAc,MAAM;AAC1F,QAAI0O,aAAoB,sBAAmBA,EAAS,OAAO,WAC3DA,EAAS,YACP1O,EAAI,SAAS,WAAW,0BAA0B,uBAChDqQ,EAAY,YAAU3B,EAAS,UAAU,IAAI,yBAAyB,GACtE1O,EAAI,SAAS,UAAU0P,MAAchB,EAAS,MAAM,QAAQ,YAChEA,EAAS,QAAQ,gBAAgB1O,EAAI,MACrC0O,EAAS,cAAciC,GACvBrB,EAAG,gBAAgBZ,CAAQ;AAAA,MAC7B;AACE,QAAAY,EAAG,cAAcqB,KAAeP,EAAU,MACtCA,EAAU,UAAOd,EAAG,MAAM,QAAQc,EAAU;AAElD,YAAMc,IAAS,KAAK,UAAU,cAAcnR,EAAI,IAAIC,EAAI,GAAG;AAC3D,MAAIkR,KACF5B,EAAG,UAAU,OAAO,wBAAwB4B,EAAO,UAAU,SAAS,GACtE5B,EAAG,UAAU,OAAO,sBAAsB4B,EAAO,UAAU,OAAO,GAClE5B,EAAG,QAAQ,qBAAqB4B,EAAO,YAEvC5B,EAAG,UAAU,OAAO,wBAAwB,oBAAoB,GAChEA,EAAG,gBAAgB,2BAA2B;AAEhD,YAAM6B,IACJnR,EAAI,OAAO,UACVA,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,SAAS,UAAU;AAClF,MAAAsP,EAAG,UAAU,IAAI6B,MAAU,UAAU,gBAAgB,YAAY;AACjE,YAAMC,IAAcC,GAAWpB,GAAKC,EAAS,OAAOlQ,CAAG;AACvD,UAAIoR,MAAgB;AAClB,QAAA9B,EAAG,QAAQ,MAAM8B;AAAA,WACZ;AACL,cAAME,IAASrB,KAAQ,OAA4B,KAAK,OAAOA,CAAG;AAClE,QAAAX,EAAG,QAAQ,MAAMgC;AAAA,MACnB;AACA,MAAI/B,KAAWD,EAAG,UAAU,IAAI,SAAS,GACrCe,EAAY,WAAUf,EAAG,UAAU,IAAI,kBAAkB,IACxDA,EAAG,UAAU,IAAI,kBAAkB,GACpCe,EAAY,SAAOf,EAAG,UAAU,IAAI,wBAAwB,GAC5De,EAAY,YAAUf,EAAG,UAAU,IAAI,kBAAkB,GAE3D,KAAK,gBAAgBvP,EAAI,MACzB,KAAK,iBAAiB,QACtB,KAAK,iBAAiBC,EAAI,OAE1BsP,EAAG,UAAU,IAAI,qBAAqB,GAExCT,EAAG,YAAYS,CAAE;AAAA,IACnB;AAGE,QADc5P,EAAO,QAAQ,KAAK,CAACU,MAAMyK,EAAK,WAAWzK,EAAE,GAAG,KAAKA,EAAE,QAAQ,GAChE;AACb,UAAImR,IAAY,KAAK;AACrB,eAAS3E,IAAM,GAAGA,IAAMlN,EAAO,QAAQ,QAAQkN,KAAO,GAAG;AACvD,cAAM5M,IAAMN,EAAO,QAAQkN,CAAG;AAC9B,YAAI,CAAC5M,KAAO,CAACA,EAAI,SAAU;AAC3B,cAAM6I,IAAQ4E,EAAUb,CAAG,KAAK/B,EAAK,eAAe7K,EAAI,GAAG,KAAKA,EAAI,SAAS,KACvEkQ,IAAW,KAAK,UAAU,iBAAiBnQ,EAAI,IAAIC,CAAG,GACtDwP,IAAU,KAAK,UAAU,wBAAwBzP,EAAI,IAAIC,CAAG,GAG5DwR,IADJtB,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,UAE5D,WACAU,EAAS,UAAU,QAAQA,EAAS,UAAU,SAC5C,KACA,OAAOA,EAAS,KAAK,GACrBuB,IAAU,KAAK,UAAU,cAAc1R,EAAI,EAAE,GAC7C2L,IAAM,GAAG3L,EAAI,EAAE,IAAIC,EAAI,GAAG,IAAIyR,CAAO,IAAI5I,CAAK,IAAI2I,CAAI,IACtD5F,IAAS,KAAK,aAAa,IAAIF,CAAG;AACxC,YAAIE,GAAQ;AACV,UAAAA,EAAO,QAAQ,KAAK,OACpB,KAAK,aAAa,IAAIF,GAAKE,CAAM,GACjC2F,IAAY,KAAK,IAAIA,GAAW3F,EAAO,MAAM;AAC7C;AAAA,QACF;AACA,cAAM8F,IAAU,SAAS,cAAc,MAAM;AAC7C,QAAAA,EAAQ,MAAM,aAAa,UAC3BA,EAAQ,MAAM,WAAW,YACzBA,EAAQ,MAAM,OAAO,YACrBA,EAAQ,MAAM,MAAM,KACpBA,EAAQ,MAAM,aAAa,YAC3BA,EAAQ,MAAM,eAAe,YAC7BA,EAAQ,MAAM,UAAU,gBACxBA,EAAQ,MAAM,QAAQ,GAAG7I,CAAK,MAC9B6I,EAAQ,cAAcF;AACtB,cAAMG,IAAc,KAAK,SAAS;AAClC,YAAI,CAACA,EAAa;AAClB,QAAAA,EAAY,YAAYD,CAAO;AAC/B,cAAM1J,IACJ0J,EAAQ,eACRE,KACAC,KACA;AACF,QAAAH,EAAQ,OAAA,GACR,KAAK,aAAa,IAAIhG,GAAK,EAAE,QAAQ1D,GAAG,OAAO,KAAK,OAAO,GAC3DuJ,IAAY,KAAK,IAAIA,GAAWvJ,CAAC;AAAA,MACnC;AACA,MAAA6G,EAAG,MAAM,SAAS,GAAG0C,CAAS,MAC9B,KAAK,UAAU,aAAaxR,EAAI,IAAIwR,CAAS;AAAA,IAC/C;AACE,MAAA1C,EAAG,MAAM,SAAS,GAAG,KAAK,gBAAgB,MAC1C,KAAK,UAAU,aAAa9O,EAAI,IAAI,KAAK,gBAAgB;AAE3D,WAAO8O;AAAA,EACT;AAAA,EAEQ,sBAAsB;AAC5B,QAAI,CAAC,KAAK,QAAS;AACnB,UAAMiD,IAAQ,KAAK,gBAAgB,aAAa,KAAK,iBAAiB;AACtE,SAAK,QAAQ,UAAU,OAAO,wBAAwBA,CAAK;AAC3D,eAAWC,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,4BAA4B,CAAC;AACrF,MAAAA,EAAG,UAAU,OAAO,2BAA2B;AAEjD,eAAWA,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,4BAA4B,CAAC;AACrF,MAAAA,EAAG,UAAU,OAAO,2BAA2B;AAEjD,eAAWA,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,sBAAsB,CAAC;AAC/E,MAAAA,EAAG,UAAU,OAAO,qBAAqB;AAE3C,QAAI,KAAK;AACP,iBAAWA,KAAM,MAAM;AAAA,QACrB,KAAK,QAAQ;AAAA,UACX,mBAAmB,KAAK,WAAW;AAAA,QAAA;AAAA,MACrC;AAEA,QAAAA,EAAG,UAAU,IAAI,2BAA2B;AAGhD,QAAI,KAAK,iBAAiB,MAAM;AAC9B,iBAAWA,KAAM,MAAM;AAAA,QACrB,KAAK,QAAQ,iBAA8B,oBAAoB,KAAK,YAAY,IAAI;AAAA,MAAA;AAEpF,QAAAA,EAAG,UAAU,IAAI,2BAA2B;AAE9C,UAAI,KAAK;AACP,mBAAWA,KAAM,MAAM;AAAA,UACrB,KAAK,QAAQ;AAAA,YACX,mBAAmB,KAAK,WAAW,uBAAuB,KAAK,YAAY;AAAA,UAAA;AAAA,QAC7E;AAEA,UAAAA,EAAG,UAAU,IAAI,qBAAqB;AAAA,IAG5C;AAAA,EACF;AAAA,EAEQ,wBAAwB;AAC9B,QAAI,CAAC,KAAK,QAAS;AACnB,eAAWA,KAAM,MAAM,KAAK,KAAK,QAAQ,iBAAiB,mBAAmB,CAAC;AAC5E,MAAAA,EAAG,UAAU,OAAO,kBAAkB;AAExC,QAAI,CAAC,KAAK,UAAU,OAAQ;AAC5B,UAAMpS,IAAO,MAAM,KAAK,KAAK,QAAQ,iBAAsC,UAAU,CAAC,GAChFD,IAAS,KAAK,UAAU,UAAA;AAC9B,eAAW6I,KAAS,KAAK,WAAW;AAClC,YAAMyJ,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIzJ,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D0J,IAAS,KAAK,IAAItS,EAAK,SAAS,GAAG,KAAK,IAAI4I,EAAM,UAAUA,EAAM,MAAM,CAAC,GACzE2J,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI3J,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D4J,IAAS,KAAK,IAAIzS,EAAO,QAAQ,SAAS,GAAG,KAAK,IAAI6I,EAAM,UAAUA,EAAM,MAAM,CAAC;AACzF,eAASrH,IAAI8Q,GAAU9Q,KAAK+Q,GAAQ/Q,KAAK,GAAG;AAC1C,cAAMkR,IAAQzS,EAAKuB,CAAC;AACpB,YAAI,CAACkR,EAAO;AACZ,cAAMrD,IAAKqD,EAAM,cAAc,uBAAuB;AACtD,QAAIrD,KAAIA,EAAG,UAAU,IAAI,kBAAkB;AAC3C,cAAMsD,IAAQ,MAAM,KAAKD,EAAM,iBAAuC,IAAI,CAAC;AAC3E,iBAAShS,IAAI8R,GAAU9R,KAAK+R,GAAQ/R,KAAK,GAAG;AAC1C,gBAAMkO,IAAO+D,EAAMjS,CAAC;AACpB,UAAIkO,KAAMA,EAAK,UAAU,IAAI,kBAAkB;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY7F,GAAgBzI,GAAqD;AACvF,QAAIyI,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,QAAIzI,EAAI,SAAS;AAEf,aAAO,EAAE,MADK4Q,GAAenI,CAAK,KACV,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS;AAEf,aAAO,EAAE,MADK6Q,GAAapI,CAAK,KACR,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS,QAAQ;AACvB,YAAMsS,IAAOpG,GAAiBzD,CAAK;AACnC,UAAI6J,EAAM,QAAO,EAAE,MAAMA,EAAK,KAAK,IAAI,EAAA;AAAA,IACzC;AACA,QAAItS,EAAI,SAAS;AACf,aAAIA,EAAI,WAAW,cAAc,CAACA,EAAI,SAC7B,EAAE,MAAMyI,IAAQ,MAAM,IAAA,IAE3B,MAAM,QAAQzI,EAAI,MAAM,KAAKA,EAAI,OAAO,UAAU,IAC7C,EAAE,MAAc,OAARyI,IAAezI,EAAI,OAAO,CAAC,IAAYA,EAAI,OAAO,CAAC,CAAvB,EAAwB,IAE9D,EAAE,MAAMyI,IAAQ,OAAOzI,EAAI,MAAM,IAAI,GAAA;AAE9C,QAAIA,EAAI,SAAS,YAAY,OAAOyI,KAAU,UAAU;AACtD,YAAM8J,IAAM9J,GACNkD,IAAM3L,EAAI;AAEhB,WADc2L,GAAK,UAAU,eACf,cAAc;AAC1B,cAAM6F,IAAOgB,GAAoBD,GAAK,EAAE,QAAQ,cAAc,WAAW5G,GAAK,WAAW,GACnFJ,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAAA;AAAAA,MACjB;AAEA,YAAMkH,IAAiC,CAAA;AACvC,MAAI9G,GAAK,UAAU,WACjB8G,EAAK,wBAAwB9G,EAAI,OACjC8G,EAAK,wBAAwB9G,EAAI,QAEnC8G,EAAK,cAAc,EAAQ9G,GAAK;AAChC,YAAM6F,IAAO,KAAK,iBAAiB,mBAAmBiB,CAAI,EAAE,OAAOF,CAAG,GAChEhH,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAA;AAAA,IACjB;AAEA,SAAKvL,EAAI,SAAS,SAASA,EAAI,SAAS,WAAW,OAAOyI,KAAU,UAAU;AAC5E,YAAM8J,IAAM9J,GACNkD,IAAM3L,EAAI,QACV0S,IAAQ/G,GAAK,UAAU;AAC7B,UAAI+G,MAAU,YAAYA,MAAU,WAAWA,MAAU,OAAO;AAC9D,cAAMlB,IAAOmB,GAAwBJ,GAAKG,CAAK,GACzCnH,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAAA;AAAAA,MACjB;AAEA,YAAMkH,IAAiC;AAAA,QACrC,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,QACvB,aAAa,EAAQ9G,GAAK;AAAA,MAAiB,GAEvC6F,IAAO,KAAK,iBAAiB,mBAAmBiB,CAAI,EAAE,OAAOF,CAAG,GAChEhH,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAA;AAAA,IACjB;AACA,SACGvL,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,gBAC3DyI,aAAiB,QAAQ,OAAOA,KAAU,WAC3C;AACA,YAAMmK,IAAW5S,EAAI,QACf2L,IACJ3L,EAAI,SAAS,SACT6S,GAAkBD,GAAU,MAAM,IAClC5S,EAAI,SAAS,SACX6S,GAAkBD,GAAU,MAAM,IAClCC,GAAkBD,GAAU,UAAU;AAC9C,UAAIzK,IAAiB;AAKrB,aAJIM,aAAiB,OAAMN,IAAIM,IAE7BN,IAAI,KAAK,iBAAiB,aAAaM,CAAK,GAEzCN,IACE,EAAE,MAAM2K,GAAe3K,GAAGwD,CAAG,EAAA,IADrB,EAAE,MAAM,OAAOlD,CAAK,EAAA;AAAA,IAErC;AACA,WAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAAA,EAC7B;AACF;AAEO,MAAMsK,IAAN,MAAMA,EAAmC;AAAA,EA0C9C,YACEvT,GACQwT,IAA8B,MAAM,UAC5C;AADQ,SAAA,cAAAA,GAvCV,KAAQ,OAA2B,MACnC,KAAQ,SAAmC,MAC3C,KAAQ,SAAgC,MACxC,KAAQ,eAAsC,MAC9C,KAAQ,UAAiC,MACzC,KAAQ,gBAA0D,MAClE,KAAQ,iBAAgC,MAExC,KAAiB,YAAY9F,IAC7B,KAAiB,eAAe+F,IAChC,KAAiB,aAAa,IAC9B,KAAiB,UAAU,IAC3B,KAAiB,iBAAiB9F,IAClC,KAAQ,cAA6B,MACrC,KAAQ,eAA8B,MACtC,KAAQ,YAA8B,CAAA,GACtC,KAAQ,mBAAmB,IAAI3B,GAAA,GAC/B,KAAQ,uCAAuB,IAAA,GAC/B,KAAQ,QAAQ,GAChB,KAAQ,cAA6B,MACrC,KAAQ,qBAAsD,MAC9D,KAAQ,oBAAmC,MAC3C,KAAQ,kBAAkB,IAC1B,KAAQ,iBAAgC,MACxC,KAAQ,kBAAiC,MACzC,KAAQ,oBAAmC,MAC3C,KAAQ,+CAA+B,IAAA,GACvC,KAAQ,sBAAqC,MAC7C,KAAQ,uBAAkE,MAC1E,KAAQ,cAMG,MAwmBX,KAAQ,cAAc,CAAC0H,MAAmB;AACxC,UAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ;AAChC,YAAM9I,IAAO,KAAK,OAAO,sBAAA,GACnB+I,IAAYD,EAAG,UAAU9I,EAAK,MAC9BgJ,IAAYF,EAAG,UAAU9I,EAAK,KAC9BvF,IAAIsO,IAAY,KAAK,KAAK,YAC1BrO,IAAIsO;AAEV,UADItO,KAAK,KAAK,gBACVD,IAAI,KAAK,eAAgB;AAC7B,YAAMnF,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtB4C,IAAYC,EAAgBhO,GAAQmL,CAAI;AAC9C,UAAIwI,IAAU,KAAK,gBACfvT,IAAW;AACf,eAASyB,IAAI,GAAGA,IAAIkM,EAAU,QAAQlM,KAAK,GAAG;AAC5C,cAAMyD,IAAIyI,EAAUlM,CAAC,KAAK;AAC1B,YAAIsD,KAAKwO,KAAWxO,KAAKwO,IAAUrO,GAAG;AACpC,UAAAlF,IAAWyB;AACX;AAAA,QACF;AACA,QAAA8R,KAAWrO;AAAAA,MACb;AACA,UAAIlF,IAAW,EAAG;AAClB,YAAME,IAAMN,EAAO,QAAQI,CAAQ;AACnC,UAAI,CAACE,EAAK;AACV,YAAMgF,IAAIyI,EAAU3N,CAAQ,KAAK,KAC3BwT,IAAW,IAEXC,IAAWF,IAAUrO,IAAIsO,IADnB,GAENE,IAAU,KAAK,OAAO,KAAK,eAAeF,KAAY,CAAC;AAG7D,MADEzO,KAAK0O,KAAY1O,KAAK0O,IAAWD,KAAYxO,KAAK0O,KAAW1O,KAAK0O,IAAUF,KAE9E,KAAK,KAAK;AAAA,QACR,IAAI,YAAY,4BAA4B,EAAE,SAAS,IAAM,QAAQ,EAAE,QAAQtT,EAAI,MAAI,CAAG;AAAA,MAAA;AAAA,IAE9F,GA8LA,KAAQ,oBAAoB,CAACkT,MAAqB;AAEhD,MADA,KAAK,qBAAqB,EAAE,GAAGA,EAAG,SAAS,GAAGA,EAAG,QAAA,GAC7C,MAAK,gBACT,KAAK,cAAc,OAAO,WAAW,MAAM;AACzC,aAAK,cAAc;AACnB,cAAMrU,IAAI,KAAK;AACf,QAAKA,KACL,KAAK,mBAAmBA,EAAE,GAAGA,EAAE,CAAC;AAAA,MAClC,GAAG,EAAE;AAAA,IACP,GAEA,KAAQ,qBAAqB,MAAM;AACjC,MAAK,KAAK,WACV,KAAK,OAAO,MAAM,SAAS,QACvB,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,OAClB,KAAK,kBAAkB,KAAK,qBAC9B,KAAK,iBAAiB,MACtB,KAAK,kBAAkB,MACvB,KAAK,OAAA;AAAA,IAET,GAEA,KAAQ,oBAAoB,CAACqU,MAAqB;AAChD,UAAI,CAAC,KAAK,OAAQ;AAClB,YAAMO,IAAY,KAAK;AAAA,QACrB,IAAI,WAAW,aAAa,EAAE,SAASP,EAAG,SAAS,SAASA,EAAG,QAAA,CAAS;AAAA,MAAA;AAI1E,UAFI,CAACO,KAAaA,EAAU,SAAS,YACjB,KAAK,UAAU,mBAAmBA,EAAU,OAAOA,EAAU,MAAM,EACvE,SAAU;AAC1B,YAAMC,IAAU,GAAGD,EAAU,KAAK,KAAKA,EAAU,MAAM,KAAKA,EAAU,IAAI;AAC1E,MAAIC,MAAY,KAAK,oBACnB,KAAK,kBAAkBA,GACvB,KAAK,OAAA;AAAA,IAET,GAEA,KAAQ,kBAAkB,MAAM;AAC9B,MAAI,KAAK,oBACP,KAAK,kBAAkB,MACvB,KAAK,OAAA;AAAA,IAET,GAh3BE,KAAK,YAAYlU;AAAA,EACnB;AAAA,EAEA,MAAM4N,GAAmB;AACvB,SAAK,OAAOA,GACZ,KAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,UAAMuG,IAASZ,EAAe;AAC9B,SAAK,OAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAIY,GAAQ,KAAK,MAAMvG,EAAK,eAAe,GAAG,CAAC,CAAC,GACrF,KAAK,OAAO,SAAS,KAAK,IAAI,GAAG,KAAK,IAAIuG,GAAQ,KAAK,MAAMvG,EAAK,gBAAgB,GAAG,CAAC,CAAC,GACvF,KAAK,OAAO,MAAM,QAAQ,GAAG,KAAK,OAAO,KAAK,MAC9C,KAAK,OAAO,MAAM,SAAS,GAAG,KAAK,OAAO,MAAM,MAChD,KAAK,OAAO,QAAQ,kBAAkB,UACtC,KAAK,OAAO,MAAM,WAAW,UAC7B,KAAK,OAAO,MAAM,MAAM,KACxB,KAAK,OAAO,MAAM,OAAO,KACzB,KAAK,OAAO,MAAM,SAAS,KAC3B,KAAK,OAAO,MAAM,SAAS,QAC3B,KAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB,GAClE,KAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB,GAClE,KAAK,OAAO,iBAAiB,aAAa,KAAK,eAAe,GAC9D,KAAK,OAAO,iBAAiB,gBAAgB,KAAK,kBAAkB,GACpE,KAAK,OAAO,iBAAiB,SAAS,KAAK,WAAW,GACtD,KAAK,SAAS,SAAS,cAAc,KAAK,GAC1C,KAAK,OAAO,MAAM,QAAQ,OACtB,KAAK,WAAS,KAAK,QAAQ,OAAA,GAC3B,KAAK,gBAAc,KAAK,aAAa,OAAA,GACzC,KAAK,eAAe,SAAS,cAAc,KAAK,GAChD,KAAK,aAAa,YAAY,yBAC9B,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAY,mBACzB,KAAK,QAAQ,QAAQ,UAAU,KAC/B,KAAK,aAAa,YAAY,KAAK,OAAO,GAC1CA,EAAK,YAAY,IACjBA,EAAK,MAAM,WAAW,YACtBA,EAAK,YAAY,KAAK,YAAY,GAClCA,EAAK,YAAY,KAAK,MAAM,GAC5BA,EAAK,YAAY,KAAK,MAAM,GAC5B,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,cAAclN,GAAsBC,GAAuB;AACzD,SAAK,cAAcD,GACnB,KAAK,eAAeC,GACpB,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,aAAayI,GAA0B;AACrC,SAAK,YAAYA,GACjB,KAAK,OAAA;AAAA,EACP;AAAA,EAEA,OAAOgL,GAAuB;AAC5B,QAAI;AAEF,UADA,KAAK,SAAS,GACV,CAAC,KAAK,UAAU,CAAC,KAAK,KAAM;AAChC,YAAMvI,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,UAAI,CAACA,EAAK;AACV,MAAAA,EAAI,OAAO,GAAGV,CAAmB,MAAMD,CAAkB;AACzD,UAAImJ,IAAWxI,EAAI;AACnB,YAAMyI,IAAY,KAAK,gBAAgB,aAAa,KAAK,iBAAiB,WACpEpU,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtBlL,IAAO,KAAK,UAAU,SAAA,GACtB8N,IAAYC,EAAgBhO,GAAQmL,CAAI,GACxC8C,IAAgBjO,EAAO,QAAQ,IAAI,CAACU,MAAMwN,GAAoBxN,CAAC,CAAC,GAChE2T,wBAAgB,IAAA,GAChBC,IAAUtU,EAAO,QAAQ,KAAK,CAACU,MAAMyK,EAAK,WAAWzK,EAAE,GAAG,KAAKA,EAAE,QAAQ,GACzE6T,IAAWD,IAAU,KAAK,qBAAqBtU,GAAQmL,GAAM4C,CAAS,IAAI;AAChF,MAAIwG,MAAa,KAAK,sBACpB,KAAK,oBAAoBA,GACzB,KAAK,yBAAyB,MAAA,GAC9B,KAAK,uBAAuB,OAEzBD,KAAS,KAAK,2BAAA,GAEnB,KAAK,kBAAkBrU,GAAMqU,IAAUC,IAAW,MAAMD,CAAO;AAC/D,YAAME,IAAc,KAAK;AACzB,UAAI,CAACA,EAAa;AAElB,YAAMnG,IAAa,KAAK,iBAAiBN,EAAU,OAAO,CAACX,GAAK9H,MAAM8H,KAAO9H,KAAK,IAAI,CAAC,GACjFmP,IAAqBP,GAAO,gBAAgB,KAAK,KAAK,eAAe,MACrEQ,IACJR,GAAO,iBAAiB,KAAK,KAAK,gBAAgB,KAAK,OAAO,UAAU,MACpED,IAASZ,EAAe,mBACxBsB,IAAY,KAAK,IAAI,GAAG,KAAK,IAAIV,GAAQ,KAAK,MAAMQ,CAAkB,CAAC,CAAC,GACxEG,IAAa,KAAK,IAAI,GAAG,KAAK,IAAIX,GAAQ,KAAK,MAAMS,CAAmB,CAAC,CAAC;AAChF,MAAI,KAAK,OAAO,UAAUC,MAAW,KAAK,OAAO,QAAQA,IACrD,KAAK,OAAO,WAAWC,MAAY,KAAK,OAAO,SAASA,IAC5D,KAAK,OAAO,MAAM,QAAQ,GAAGD,CAAS,MACtC,KAAK,OAAO,MAAM,SAAS,GAAGC,CAAU,MAExCjJ,EAAI,OAAO,GAAGV,CAAmB,MAAMD,CAAkB,IACzDmJ,IAAWxI,EAAI,MACf,KAAK,uBAAA;AAEL,YAAMkJ,IAAYX,GAAO,aAAa,KAAK,KAAK,WAC1CY,IAAaZ,GAAO,cAAc,KAAK,KAAK,YAC5Ca,IAAsB,CAACC,MAAuB;AAClD,cAAMhI,IAASgI,IAAa,GACtBC,IAAe,KAAK;AAAA,UACxB;AAAA,UACA,KAAK,IAAIhV,EAAK,SAAS,GAAGuU,EAAY,QAAQ,WAAWxH,CAAM,CAAC;AAAA,QAAA,GAE5DkI,IAAQV,EAAY,QAAQ,IAAIS,CAAY;AAClD,YAAIE,IAAaF,GACbG,IAAc;AAClB,cAAMvD,KAAa,KAAK,QAAQ,UAAU,KAAK,KAAK,YAAY;AAChE,iBAAShQ,IAAIoT,GAAcpT,IAAI5B,EAAK,UAAUmV,IAAcvD,GAAWhQ,KAAK;AAC1E,UAAAuT,KAAeZ,EAAY,QAAQ3S,CAAC,KAAK,KAAK,WAC9CsT,IAAatT,IAAI;AAEnB,eAAO,EAAE,OAAAqT,GAAO,cAAAD,GAAc,YAAAE,EAAAA;AAAAA,MAChC;AAEA,UAAIE,IAAkBb,EAAY,QAAQ,MAAA;AAC1C,YAAMc,IAAiB,KAAK,QAAQ,UAAU,KAAK,KAAK,cAClDC,IAAqB,KAAK,IAAI,GAAGD,IAAiB,KAAK,YAAY;AACzE,UAAIE,IAAsB,KAAK,IAAI,GAAGH,IAAkBE,CAAkB,GACtEE,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAIZ,GAAWW,CAAmB,CAAC,GACvE,EAAE,OAAAN,GAAO,cAAAD,GAAc,YAAAE,EAAA,IAAeJ,EAAoBU,CAAgB;AAE9E,UAAInB,KAAWC,GAAU;AACvB,cAAMmB,IAAkC,CAAA;AACxC,iBAAS7T,IAAIoT,GAAcpT,IAAIsT,GAAYtT,KAAK,GAAG;AACjD,gBAAMxB,IAAMJ,EAAK4B,CAAC;AAClB,cAAI,CAACxB,EAAK;AACV,gBAAM0R,IAAU,KAAK,UAAU,cAAc1R,EAAI,EAAE;AACnD,cAAI,KAAK,yBAAyB,IAAIA,EAAI,EAAE,MAAM0R,EAAS;AAC3D,gBAAM4D,IAAQ,KAAK,iBAAiBhK,GAAKtL,GAAKL,GAAQ+N,CAAS;AAC/D,UAAA2H,EAAQrV,EAAI,EAAE,IAAIsV,GAClB,KAAK,yBAAyB,IAAItV,EAAI,IAAI0R,CAAO;AAAA,QACnD;AACA,aAAK,sBAAsB2D,CAAO,GAClCL,IAAkBb,EAAY,QAAQ,MAAA,GACtC,KAAK,UAAU,kBAAkBkB,CAAO,GACxCF,IAAsB,KAAK,IAAI,GAAGH,IAAkBE,CAAkB,GACtEE,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAIZ,GAAWW,CAAmB,CAAC,GACtE,EAAE,OAAAN,GAAO,cAAAD,GAAc,YAAAE,EAAA,IAAeJ,EAAoBU,CAAgB,IACvE,KAAK,wBAAwB,OAAO,KAAKC,CAAO,EAAE,SAAS,MAC7D,KAAK,6BAAA;AAAA,MACT;AAEA,MAAI,KAAK,WACP,KAAK,OAAO,MAAM,SAAS,GAAGF,CAAmB,MACjD,KAAK,OAAO,MAAM,QAAQ,GAAGnH,CAAU;AAEzC,YAAMuH,IAAc,KAAK,iBAAiBd;AAE1C,MAAAnJ,EAAI,UAAU,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GAEzDA,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,gBAAgB,KAAK,OAAO,MAAM;AAE1D,UAAIkK,IAAU,KAAK,eAAeX,IAAQO;AAC1C,eAAS5T,IAAIoT,GAAcpT,IAAIsT,GAAYtT,KAAK,GAAG;AACjD,cAAMxB,IAAMJ,EAAK4B,CAAC,GACZiU,IAAOtB,EAAY,QAAQ3S,CAAC,KAAK,KAAK;AAE5C,QAAA8J,EAAI,cAAc,WAClBA,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAGkK,GAAS,KAAK,gBAAgBC,CAAI,GAClDnK,EAAI,WAAW,GAAGkK,GAAS,KAAK,gBAAgBC,CAAI;AACpD,cAAMC,IAAU,KAAK,UAAU,gBAAgB1V,EAAI,EAAE,KAAK;AAC1D,QAAI,KAAK,gBAAgBA,EAAI,OAC3BsL,EAAI,YAAY,yBAChBA,EAAI,SAAS,GAAGkK,GAAS,KAAK,gBAAgBC,CAAI,IAEpDnK,EAAI,YAAY,WAChBA,EAAI,OAAO,QAAQV,CAAmB,MAAMD,CAAkB,IAC9DW,EAAI,YAAY,UAChBA,EAAI,eAAe,UACnBA,EAAI,SAAS,OAAOoK,CAAO,GAAG,KAAK,iBAAiB,GAAGF,IAAUC,IAAO,CAAC,GACzEnK,EAAI,OAAOwI,GACXxI,EAAI,YAAY,QAChBA,EAAI,eAAe,cAEnBA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,OAAO,QAAQ,KAAK;AAAA,UACzB,KAAK,OAAO,SAAS,KAAK;AAAA,QAAA,GAE5BA,EAAI,KAAA,GACJA,EAAI,UAAUiK,GAAa,CAAC;AAC5B,YAAIzQ,IAAI,GACJ6Q,IAAc;AAClB,iBAAS9I,IAAM,GAAGA,IAAMlN,EAAO,QAAQ,QAAQkN,KAAO,GAAG;AACvD,gBAAMxM,IAAIV,EAAO,QAAQkN,CAAG,GACtB5H,IAAIyI,EAAUb,CAAG,KAAK;AAC5B,cAAI,CAACxM,GAAG;AACN,YAAAyE,KAAKG;AACL;AAAA,UACF;AAEA,gBAAM2Q,KADc,KAAK,UAAU,mBAAmB5V,EAAI,IAAIK,EAAE,GAAG,EACzC;AAC1B,UAAAiL,EAAI,cAAc;AAClB,gBAAMmE,KAAU,KAAK,UAAU,wBAAwBzP,EAAI,IAAIK,CAAC,GAC1DqP,KAAY,KAAK,UAAU,aAAa1P,EAAI,IAAIK,EAAE,GAAG,GACrDwP,KAAYjC,EAAcf,CAAG,KAAK,CAAA,GAClCiD,KAAWL,GAAQ,QAAQM,GAAWF,IAAWJ,GAAQ,KAAK,IAAII,IAClEgG,IAAcnG,KAAYK,GAAWD,IAAUJ,EAAS,IAAII,IAC5DgG,KAAKF,KAAQ,YAAaC,EAAY,mBAAmB;AAC/D,UAAAvK,EAAI,YAAYwK,IAChBxK,EAAI,SAASxG,GAAG0Q,GAASvQ,GAAGwQ,CAAI,GAChCnK,EAAI,WAAWxG,GAAG0Q,GAASvQ,GAAGwQ,CAAI;AAClC,gBAAMtF,KAAW,KAAK,UAAU,iBAAiBnQ,EAAI,IAAIK,CAAC,GACpD+P,KACJD,GAAS,iBAAiBV,GAAQ,iBAAiB,WAAW,SAC1DY,KAAYD,KAAe,EAAE,MAAM,SAAA,IAAa,KAAK,YAAYD,GAAS,OAAO9P,CAAC,GAClFmQ,KAAenQ,EAAE,SAAS,YAAYA,EAAE,SAAS,QACjDoQ,KAAcD,KAChBnQ,EAAE,SAAS,WACTqQ,GAAoBP,GAAS,KAAK,IAClCQ,GAAkBR,GAAS,KAAK,IAClC,MACES,KAAcJ,KAChBC,IAAa,UACZpQ,EAAE,SAAS,WAAWwQ,GAAeV,GAAS,KAAK,IAAIW,GAAaX,GAAS,KAAK,KACnF,IACE4F,KAAe,GAAQvF,MAAgBC,MAAeG,MAAe,CAACR,KACtEqB,KAAOb,MAAeP,GAAU,MAChCe,KAAQ/Q,EAAE,OAAO,UAAUA,EAAE,SAAS,WAAW,UAAU;AAKjE,cAHE,KAAK,gBAAgBL,EAAI,MACzB,KAAK,iBAAiB,QACtB,KAAK,iBAAiBK,EAAE,QAExBiL,EAAI,cAAc,WAClBA,EAAI,YAAY,GAChBA,EAAI,WAAWxG,IAAI,GAAG0Q,IAAU,GAAGvQ,IAAI,GAAGwQ,IAAO,CAAC,GAClDnK,EAAI,YAAY,GAEdhB;AAAA,YACE,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK,YAAA;AAAA,UAAY,IAEnB;AACA,kBAAMH,IAAOJ,IACPiM,KAAOlR,IAAIG,IAAIkF,IAAO,GACtB8L,IAAMT,IAAUC,IAAOtL,IAAO;AACpC,YAAAmB,EAAI,YAAY,WAChBA,EAAI,SAAS0K,IAAMC,GAAK9L,GAAMA,CAAI,GAClCmB,EAAI,cAAc,WAClBA,EAAI,WAAW0K,KAAO,KAAKC,IAAM,KAAK9L,IAAO,GAAGA,IAAO,CAAC;AAAA,UAC1D;AAEF,gBAAM+L,KACJH,MAAgB1V,EAAE,SAAS,UAAU,CAACuV,MAAS,CAACC,EAAY,YACxD,YACA;AACN,UAAAvK,EAAI,YAAY,KAAK,UAAU,WAAWtL,EAAI,IAAIK,EAAE,GAAG,IACnD,YACAgQ,GAAU,QACRA,GAAU,QACVuF,KACE,YACCM,MAAeL,EAAY,aAAa;AACjD,gBAAM1G,KAAOrE,EAAK,WAAWzK,EAAE,GAAG,KAAKA,EAAE,YAAY,IAC/C8V,KAAY9V,EAAE,SAAS,cAAc,CAACA,EAAE,UAAUA,EAAE,WAAW,aAC/D+V,KAAkB/V,EAAE,SAAS,aAAa,GAAQA,EAAE,UAAUA,EAAE,WAAW;AACjF,cAAK8V;AAeH,YAAA7K,EAAI,OAAOwI,GACX6B,IAAc;AAAA,eAhBA;AACd,kBAAMU,IAAU,GAAGR,EAAY,SAAS,MAAM,EAAE,GAAGA,EAAY,OAAO,MAAM,EAAE;AAC9E,gBAAIQ,MAAYV,GAAa;AAC3B,oBAAM9J,KAASmI,EAAU,IAAIqC,CAAO;AACpC,kBAAIxK,MAAY,OAAOA;AAAA,mBAClB;AACH,sBAAMyK,IAAST,EAAY,OAAO,SAAS,IAErC/T,KAAI,GADG+T,EAAY,SAAS,YAAY,EAC7B,GAAGS,CAAM,GAAG1L,CAAmB,MAAMD,CAAkB,GAAG,KAAA;AAC3E,gBAAAqJ,EAAU,IAAIqC,GAASvU,EAAC,GACxBwJ,EAAI,OAAOxJ;AAAA,cACb;AACA,cAAA6T,IAAcU;AAAA,YAChB;AAAA,UACF;AAIA,gBAAME,KAAYzR,IAAI0R,IAChBC,KAAYjB,IAAU3D,IACtB6E,KAAY,KAAK,IAAI,GAAGzR,IAAIuR,KAAoB,CAAC,GACjDG,KAAY,KAAK,IAAI,GAAGlB,KAAQ5D,KAAsBC,GAAuB,GAC7E8E,KAAc;AAAA,YAClB,WAAW,EAAQf,EAAY,aAAeE,MAAgB1V,EAAE,SAAS;AAAA,YACzE,QAAQ,EAAQwV,EAAY;AAAA,UAAM,GAE9BgB,KACJd,MAAgB,CAACI,KACb,KAAK;AAAA,YACH7K;AAAA,YACAmG;AAAA,YACA8E;AAAA,YACAE;AAAA,YACAC;AAAA,YACAC;AAAA,YACAxH;AAAA,YACAiC;AAAA,UAAA,IAEF;AACN,cAAI2E,MAAgB1V,EAAE,SAAS,YAAYwW,IAAc;AAGvD,kBAAMb,IAAO,KAAK,IAAIO,IAAWM,GAAa,IAAI,CAAI,GAChDZ,KAAM,KAAK,IAAIQ,IAAWI,GAAa,IAAI,CAAI,GAC/CC,KAAQ,KAAK,IAAIP,KAAYG,IAAWG,GAAa,IAAIA,GAAa,QAAQ,CAAI,GAClFE,KAAS,KAAK,IAAIN,KAAYE,IAAWE,GAAa,IAAIA,GAAa,SAAS,CAAI,GACpFG,KAAK,KAAK,IAAI,GAAGF,KAAQd,CAAI,GAC7BiB,KAAK,KAAK,IAAI,GAAGF,KAASd,EAAG;AACnC,YAAA3K,EAAI,KAAA;AACJ,kBAAM4L,KAAY,GAAGlX,EAAI,EAAE,KAAKK,EAAE,GAAG,YAC/B8W,KAAU,KAAK,mBAAmBD,IAClCE,KAAW,KAAK,oBAAoBF;AAC1C,YAAItB,MACFtK,EAAI,YAAY,WAChBA,EAAI,cAAc,aACT8L,MACT9L,EAAI,YAAY,WAChBA,EAAI,cAAc,aACT6L,MACT7L,EAAI,YAAY,WAChBA,EAAI,cAAc,cAElBA,EAAI,YAAY,WAChBA,EAAI,cAAc,YAEpBA,EAAI,YAAY,GAChBA,EAAI,UAAA,GACA,OAAOA,EAAI,aAAc,aAC3BA,EAAI,UAAU0K,GAAMC,IAAKe,IAAIC,IAAI,CAAC,IAElC3L,EAAI,KAAK0K,GAAMC,IAAKe,IAAIC,EAAE,GAE5B3L,EAAI,KAAA,GACJA,EAAI,OAAA,GACJA,EAAI,QAAA;AAAA,UACN;AACA,eAAK;AAAA,YACHA;AAAA,YACAmG;AAAA,YACA8E;AAAA,YACAE;AAAA,YACAC;AAAA,YACAC;AAAA,YACAxH;AAAA,YACAiC;AAAA,YACA+E;AAAA,YACAC;AAAA,YACAQ;AAAA,UAAA;AAEF,gBAAMzF,KAAS,KAAK,UAAU,cAAcnR,EAAI,IAAIK,EAAE,GAAG;AACzD,UAAI8Q,SAA6B7F,GAAKxG,GAAG0Q,GAASvQ,GAAGwQ,GAAMtE,GAAO,KAAK,GACvErM,KAAKG;AAAA,QACP;AACA,QAAAqG,EAAI,QAAA,GACJkK,KAAWC;AAAA,MACb;AAGA,MAAAnK,EAAI,YAAY,WAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,YAAY,GACvDA,EAAI,cAAc,WAElBA,EAAI,WAAW,GAAG,GAAG,KAAK,gBAAgB,KAAK,YAAY,GAC3DA,EAAI,YAAY,WAChBA,EAAI,UAAA,GACJA,EAAI,OAAO,GAAG,CAAC,GACfA,EAAI,OAAO,IAAI,CAAC,GAChBA,EAAI,OAAO,GAAG,EAAE,GAChBA,EAAI,UAAA,GACJA,EAAI,KAAA,GACA,KAAK,gBACPA,EAAI,YAAY,yBAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,gBAAgB,KAAK,YAAY,IAG3DA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,KAAK,KAAK,gBAAgB,GAAG,KAAK,OAAO,QAAQ,KAAK,gBAAgB,KAAK,YAAY,GAC3FA,EAAI,KAAA,GACJA,EAAI,UAAUiK,GAAa,CAAC;AAC5B,UAAI8B,IAAU;AACd,eAASxK,IAAM,GAAGA,IAAMlN,EAAO,QAAQ,QAAQkN,KAAO,GAAG;AACvD,cAAMxM,IAAIV,EAAO,QAAQkN,CAAG,GACtB5H,IAAIyI,EAAUb,CAAG,KAAK;AAC5B,YAAI,CAACxM,GAAG;AACN,UAAAgX,KAAWpS;AACX;AAAA,QACF;AAEA,QADoB,KAAK,iBAAiB,QAAQ,KAAK,iBAAiB5E,EAAE,QAExEiL,EAAI,YAAY,yBAChBA,EAAI,SAAS+L,GAAS,GAAGpS,GAAG,KAAK,YAAY,IAE/CqG,EAAI,cAAc,WAClBA,EAAI,WAAW+L,GAAS,GAAGpS,GAAG,KAAK,YAAY,GAC/CqG,EAAI,YAAY,WAChBA,EAAI,OAAO,QAAQV,CAAmB,MAAMD,CAAkB,IAC9DW,EAAI,SAASjL,EAAE,UAAUA,EAAE,KAAKgX,IAAU,GAAG,KAAK,eAAe,CAAC,GAClE/L,EAAI,OAAOwI;AAEX,cAAM7E,IAAUpE,GAAiBC,GAAMzK,EAAE,GAAG,GACtC6O,IAAYnE,GAAsBD,GAAMzK,EAAE,GAAG,GAC7C8W,IAAU,KAAK,sBAAsB,QAAQ,KAAK,sBAAsB9W,EAAE;AAEhF,YADiB,EAAQ4O,KAAYC,KAAaiI,GACpC;AACZ,gBAAMlL,IAAQkL,IAAU,MAAMjI,KAAaD,IAAU,OAAO,MACtDqI,IAAU,IAEVC,KAAKF,IAAUpS,IAAIqS,IADb,GAENE,KAAK,KAAK,OAAO,KAAK,eAAeF,KAAW,CAAC;AACvD,UAAIrI,IACF/C,GAAkBZ,GAAKiM,KAAK,GAAGC,KAAK,GAAGF,IAAU,GAAGrL,GAAOgD,CAAO,IAElEjD,GAAeV,GAAKiM,KAAK,GAAGC,KAAK,GAAGF,IAAU,GAAGrL,CAAK;AAAA,QAE1D;AACA,QAAAoL,KAAWpS;AAAA,MACb;AAIA,UAHAqG,EAAI,QAAA,GAGA,KAAK,UAAU,QAAQ;AACzB,QAAAA,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI;AAAA,UACF,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,OAAO,QAAQ,KAAK;AAAA,UACzB,KAAK,OAAO,SAAS,KAAK;AAAA,QAAA,GAE5BA,EAAI,KAAA,GACJA,EAAI,cAAc,WAClBA,EAAI,YAAY;AAChB,mBAAW9C,KAAS,KAAK,WAAW;AAClC,gBAAMyJ,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIzJ,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D0J,IAAS,KAAK,IAAItS,EAAK,SAAS,GAAG,KAAK,IAAI4I,EAAM,UAAUA,EAAM,MAAM,CAAC,GACzE2J,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI3J,EAAM,UAAUA,EAAM,MAAM,CAAC,GAC7D4J,IAAS,KAAK;AAAA,YAClBzS,EAAO,QAAQ,SAAS;AAAA,YACxB,KAAK,IAAI6I,EAAM,UAAUA,EAAM,MAAM;AAAA,UAAA,GAEjCiP,IAAO,KAAK,eAAetD,EAAY,QAAQ,IAAIlC,CAAQ,IAAImD,GAC/DrM,IAASoL,EAAY,QAAQ,IAAIjC,IAAS,CAAC,IAAIiC,EAAY,QAAQ,IAAIlC,CAAQ;AACrF,cAAIyF,IAAQ,KAAK;AACjB,mBAASrX,IAAI,GAAGA,IAAI8R,GAAU9R,KAAK;AACjC,YAAAqX,KAAShK,EAAUrN,CAAC,KAAK;AAE3B,cAAIyI,IAAQ;AACZ,mBAASzI,IAAI8R,GAAU9R,KAAK+R,GAAQ/R,KAAK;AACvC,YAAAyI,KAAS4E,EAAUrN,CAAC,KAAK;AAE3B,UAAAqX,KAASjD,GACTnJ,EAAI,SAASoM,GAAOD,GAAM3O,GAAOC,CAAM,GACvCuC,EAAI,WAAWoM,IAAQ,KAAKD,IAAO,KAAK3O,IAAQ,GAAGC,IAAS,CAAC;AAAA,QAC/D;AACA,QAAAuC,EAAI,QAAA;AAAA,MACN;AAEA,MAAIyI,MACFzI,EAAI,KAAA,GACJA,EAAI,YAAY,yBAChBA,EAAI,SAAS,GAAG,GAAG,KAAK,OAAO,OAAO,KAAK,OAAO,MAAM,GACxDA,EAAI,QAAA;AAAA,IAER,QAAQ;AAGN;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU;AACR,SAAK,2BAAA,GACL,KAAK,cAAc,MACf,KAAK,WACP,KAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB,GACrE,KAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB,GACrE,KAAK,OAAO,oBAAoB,aAAa,KAAK,eAAe,GACjE,KAAK,OAAO,oBAAoB,gBAAgB,KAAK,kBAAkB,GACvE,KAAK,OAAO,oBAAoB,SAAS,KAAK,WAAW,IAEvD,KAAK,gBACP,OAAO,aAAa,KAAK,WAAW,GACpC,KAAK,cAAc,OAErB,KAAK,qBAAqB,MAC1B6C,EAAiB,KAAK,MAAM,GAC5BA,EAAiB,KAAK,MAAM,GAC5BA,EAAiB,KAAK,YAAY,GAClCA,EAAiB,KAAK,OAAO,GAC7B,KAAK,SAAS,MACd,KAAK,SAAS,MACd,KAAK,eAAe,MACpB,KAAK,UAAU,MACf,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MACtB,KAAK,OAAO;AAAA,EACd;AAAA,EAEQ,kBAAkBvO,GAAqB+L,GAAoBsI,GAAkB;AACnF,UAAM0D,IAAW,KAAK;AACtB,QAAIA,KAAYA,EAAS,YAAY/X,KAAQ+X,EAAS,QAAQhM,EAAK;AACnE,UAAMiM,IAAU,IAAI,MAAMhY,EAAK,MAAM,GAC/BiY,wBAAgB,IAAA;AACtB,aAASrW,IAAI,GAAGA,IAAI5B,EAAK,QAAQ4B,KAAK,GAAG;AACvC,YAAMxB,IAAMJ,EAAK4B,CAAC;AAClB,UAAI,CAACxB,EAAK;AACV,MAAA6X,EAAU,IAAI7X,EAAI,IAAIwB,CAAC;AACvB,UAAIyG,IAAI,KAAK;AACb,UAAIgM,KAAWtI,GAAK;AAClB,cAAM+F,IAAU,KAAK,UAAU,cAAc1R,EAAI,EAAE,GAC7C8X,IAAkB,KAAK,yBAAyB,IAAI9X,EAAI,EAAE,GAC1D+X,IAAe,KAAK,UAAU,aAAa/X,EAAI,EAAE;AACvD,QAAI8X,MAAoBpG,KAAW,OAAOqG,KAAiB,aAAU9P,IAAI8P;AAAA,MAC3E;AACA,MAAAH,EAAQpW,CAAC,IAAIyG;AAAA,IACf;AACA,SAAK,cAAc;AAAA,MACjB,KAAA0D;AAAA,MACA,SAAS/L;AAAA,MACT,WAAAiY;AAAA,MACA,SAAAD;AAAA,MACA,SAAStL,GAAY,KAAKsL,CAAO;AAAA,IAAA;AAAA,EAErC;AAAA,EAEQ,sBAAsBvC,GAAiC;AAC7D,UAAM/F,IAAQ,KAAK;AACnB,QAAKA;AACL,iBAAW,CAACnP,GAAOyJ,CAAI,KAAK,OAAO,QAAQyL,CAAO,GAAG;AACnD,cAAM7T,IAAI8N,EAAM,UAAU,IAAInP,CAAK;AACnC,YAAIqB,MAAM,OAAW;AACrB,cAAMwW,IAAO1I,EAAM,QAAQ9N,CAAC,KAAK,KAAK;AACtC,QAAIwW,MAASpO,MACb0F,EAAM,QAAQ9N,CAAC,IAAIoI,GACnB0F,EAAM,QAAQ,IAAI9N,GAAGoI,IAAOoO,CAAI;AAAA,MAClC;AAAA,EACF;AAAA,EAEQ,qBAAqBrY,GAAgBmL,GAAY4C,GAAqB;AAC5E,UAAMuK,IAAQtY,EAAO,QAClB,IAAI,CAACU,MAAQyK,EAAK,WAAWzK,EAAE,GAAG,KAAKA,EAAE,WAAY,MAAM,GAAI,EAC/D,KAAK,EAAE,GACJ6X,IAASxK,EAAU,IAAI,CAACzI,MAAM,OAAOA,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAC5D,WAAO,GAAGgT,CAAK,IAAIC,CAAM;AAAA,EAC3B;AAAA,EAEQ,6BAA6B;AACnC,IAAI,KAAK,wBAAwB,SAC/B,qBAAqB,KAAK,mBAAmB,GAC7C,KAAK,sBAAsB,OAE7B,KAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,+BAA+B;AACrC,IAAI,KAAK,wBAAwB,SACjC,KAAK,sBAAsB,sBAAsB,MAAM;AACrD,WAAK,sBAAsB,MAC3B,KAAK,wBAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEQ,0BAA0B;AAChC,QAAI,CAAC,KAAK,OAAQ;AAClB,UAAM5M,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA,EAAK;AACV,IAAAA,EAAI,OAAO,GAAGV,CAAmB,MAAMD,CAAkB;AACzD,UAAMhL,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtB4C,IAAYC,EAAgBhO,GAAQmL,CAAI;AAE9C,QAAI,CADYnL,EAAO,QAAQ,KAAK,CAACU,MAAMyK,EAAK,WAAWzK,EAAE,GAAG,KAAKA,EAAE,QAAQ,EACjE;AACd,UAAMsL,IAAM,KAAK,qBAAqBhM,GAAQmL,GAAM4C,CAAS;AAC7D,IAAI,KAAK,sBAAsB/B,MAC7B,KAAK,oBAAoBA,GACzB,KAAK,yBAAyB,MAAA,GAC9B,KAAK,uBAAuB;AAE9B,UAAMwM,IAAO,KAAK,wBAAwB,EAAE,KAAAxM,GAAK,WAAW,EAAA;AAC5D,QAAIwM,EAAK,QAAQxM,EAAK;AAEtB,UAAM/L,IAAO,KAAK,UAAU,SAAA,GACtByV,IAAkC,CAAA;AACxC,QAAI+C,IAAW;AACf,UAAMC,IAAQ,YAAY,IAAA;AAC1B,WAAOF,EAAK,YAAYvY,EAAK,UAAUwY,IAAWpF,EAAe,4BAC3D,cAAY,IAAA,IAAQqF,IAAQrF,EAAe,sCAD0C;AAEzF,YAAMhT,IAAMJ,EAAKuY,EAAK,SAAS;AAE/B,UADAA,EAAK,aAAa,GACd,CAACnY,EAAK;AACV,YAAM0R,IAAU,KAAK,UAAU,cAAc1R,EAAI,EAAE;AACnD,UAAI,KAAK,yBAAyB,IAAIA,EAAI,EAAE,MAAM0R,EAAS;AAC3D,YAAMzJ,IAAI,KAAK,iBAAiBqD,GAAKtL,GAAKL,GAAQ+N,CAAS;AAC3D,MAAA2H,EAAQrV,EAAI,EAAE,IAAIiI,GAClB,KAAK,yBAAyB,IAAIjI,EAAI,IAAI0R,CAAO,GACjD0G,KAAY;AAAA,IACd;AACA,SAAK,uBAAuBD,EAAK,YAAYvY,EAAK,SAASuY,IAAO,MAClE,KAAK,kBAAkBvY,GAAM,KAAK,mBAAmB,EAAI,GACzD,KAAK,sBAAsByV,CAAO,GAClC,KAAK,UAAU,kBAAkBA,CAAO,GACpC,KAAK,wBAAsB,KAAK,6BAAA;AAAA,EACtC;AAAA,EAwCA,kBAAkB;AAChB,WAAO;AAAA,EACT;AAAA,EAEA,QAAQjH,GAAmB;AACzB,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ,QAAO;AACvC,UAAM/D,IAAO,KAAK,OAAO,sBAAA,GAGnB+I,IAAYhF,EAAM,UAAU/D,EAAK,MACjCgJ,IAAYjF,EAAM,UAAU/D,EAAK,KACjCvF,IAAIsO,IAAY,KAAK,KAAK,YAC1BzT,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtBlL,IAAO,KAAK,UAAU,SAAA,GACtB0Y,IAAe,KAAK,cACpB5K,IAAYC,EAAgBhO,GAAQmL,CAAI,GACxCmJ,IAAUtU,EAAO,QAAQ,KAAK,CAACU,MAAMyK,EAAK,WAAWzK,EAAE,GAAG,KAAKA,EAAE,QAAQ,GACzEsL,IAAMsI,IAAU,KAAK,qBAAqBtU,GAAQmL,GAAM4C,CAAS,IAAI;AAC3E,SAAK,kBAAkB9N,GAAM+L,GAAKsI,CAAO;AACzC,UAAME,IAAc,KAAK;AACzB,QAAI,CAACA,EAAa,QAAO;AACzB,UAAMa,IAAkBb,EAAY,QAAQ,MAAA,GACtCc,IAAiB,KAAK,QAAQ,UAAU,KAAK,KAAK,cAClDC,IAAqB,KAAK,IAAI,GAAGD,IAAiB,KAAK,YAAY,GACnEE,IAAsB,KAAK,IAAI,GAAGH,IAAkBE,CAAkB,GACtEE,IAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,WAAWD,CAAmB,CAAC;AACvF,QAAI9B,IAAYiF,KAAgBlF,IAAY,KAAK;AAC/C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,MAAM,IAAI,QAAQ/I,EAAK,MAAMA,EAAK,KAAK,KAAK,gBAAgBiO,CAAY;AAAA,MAAA;AAG5E,QAAIjF,IAAYiF,GAAc;AAE5B,UAAIhF,IAAU,KAAK,gBACfvT,IAAW;AACf,eAASyB,IAAI,GAAGA,IAAIkM,EAAU,QAAQlM,KAAK,GAAG;AAC5C,cAAMyD,IAAIyI,EAAUlM,CAAC,KAAK;AAC1B,YAAIsD,KAAKwO,KAAWxO,KAAKwO,IAAUrO,GAAG;AACpClF,UAAAA,IAAWyB;AACX;AAAA,QACF;AACA8R,QAAAA,KAAWrO;AAAA,MACb;AACA,UAAIlF,KAAY,GAAG;AACjB,cAAME,IAAMN,EAAO,QAAQI,CAAQ,GAC7BmK,IAAW,IAAI;AAAA,UACnBG,EAAK,OAAOiJ,IAAU,KAAK,KAAK;AAAA,UAChCjJ,EAAK;AAAA,UACLqD,EAAU3N,CAAQ,KAAK;AAAA,UACvBuY;AAAA,QAAA;AAEF,eAAO,EAAE,OAAO,cAAc,QAAQrY,EAAI,KAAK,MAAMiK,EAAAA;AAAAA,MACvD;AACA,aAAO;AAAA,IACT;AACA,QAAIkJ,IAAY,KAAK,gBAAgB;AACnC,YAAMrO,IAAIsO,IAAYiF,IAAelD,GAC/BtV,IAAW,KAAK;AAAA,QACpB;AAAA,QACA,KAAK,IAAIF,EAAK,SAAS,GAAGuU,EAAY,QAAQ,WAAWpP,IAAI,CAAC,CAAC;AAAA,MAAA,GAE3DwT,IAAcpE,EAAY,QAAQ,IAAIrU,CAAQ;AACpD,UAAIA,IAAW,KAAKA,KAAYF,EAAK,OAAQ,QAAO;AACpD,YAAMI,IAAMJ,EAAKE,CAAQ,GACnB0Y,IAAQnO,EAAK,MAAMiO,IAAeC,IAAcnD,GAChDlL,IAAW,IAAI;AAAA,QACnBG,EAAK;AAAA,QACLmO;AAAA,QACA,KAAK;AAAA,QACLrE,EAAY,QAAQrU,CAAQ,KAAK,KAAK;AAAA,MAAA;AAExC,aAAO,EAAE,OAAOE,EAAI,IAAI,QAAQ,MAAM,MAAMkK,EAAAA;AAAAA,IAC9C;AACA,UAAMnF,IAAIsO,IAAYiF,IAAelD,GAC/BtV,IAAW,KAAK,IAAI,GAAG,KAAK,IAAIF,EAAK,SAAS,GAAGuU,EAAY,QAAQ,WAAWpP,IAAI,CAAC,CAAC,CAAC,GACvFwT,IAAcpE,EAAY,QAAQ,IAAIrU,CAAQ;AACpD,QAAIA,IAAW,KAAKA,KAAYF,EAAK,OAAQ,QAAO;AACpD,QAAI0T,IAAU,KAAK,gBACfvT,IAAW;AACf,aAASyB,IAAI,GAAGA,IAAIkM,EAAU,QAAQlM,KAAK,GAAG;AAC5C,YAAMyD,IAAIyI,EAAUlM,CAAC,KAAK;AAC1B,UAAIsD,KAAKwO,KAAWxO,KAAKwO,IAAUrO,GAAG;AACpC,QAAAlF,IAAWyB;AACX;AAAA,MACF;AACA,MAAA8R,KAAWrO;AAAA,IACb;AACA,QAAIlF,MAAa,GAAI,QAAO;AAC5B,UAAMC,IAAMJ,EAAKE,CAAQ,GACnBG,IAAMN,EAAO,QAAQI,CAAQ,GAC7B0Y,IAASF,GACTrO,IAAW,IAAI;AAAA,MACnBG,EAAK,OAAOiJ,IAAU,KAAK,KAAK;AAAA,MAChCjJ,EAAK,MAAMiO,IAAeG,IAAS,KAAK,KAAK;AAAA,MAC7C/K,EAAU3N,CAAQ,KAAK;AAAA,MACvBoU,EAAY,QAAQrU,CAAQ,KAAK,KAAK;AAAA,IAAA;AAExC,WAAO,EAAE,OAAOE,EAAI,IAAI,QAAQC,EAAI,KAAK,MAAMiK,EAAA;AAAA,EACjD;AAAA,EAEA,cAAckE,GAAmB;AAC/B,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ,QAAO;AACvC,UAAMsK,IAAM,KAAK,QAAQtK,CAAK;AAE9B,QADI,CAACsK,KAAO,CAACA,EAAI,SAAS,CAACA,EAAI,UAC3BA,EAAI,UAAU,aAAaA,EAAI,UAAU,aAAc,QAAO;AAElE,UAAMzY,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACI,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOqY,EAAI,MAAM,CAAC;AAC3E,QAAI,CAACzY,KAAQA,EAAI,SAAS,YAAYA,EAAI,SAAS,OAAS,QAAO;AACnE,UAAMkQ,IAAW,KAAK,UAAU,iBAAiBuI,EAAI,OAAOzY,CAAG,GACzDwP,IAAU,KAAK,UAAU,wBAAwBiJ,EAAI,OAAOzY,CAAG;AAErE,QADqBkQ,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,QACjE,QAAO;AACzB,UAAMgB,IACJxQ,EAAI,SAAS,WACTyQ,GAAoBP,EAAS,KAAK,IAClCQ,GAAkBR,EAAS,KAAK;AACtC,QAAI,CAACM,KAAe,CAACA,EAAY,MAAO,QAAO;AAE/C,UAAMnF,IAAM,KAAK,OAAO,WAAW,IAAI;AACvC,QAAI,CAACA,EAAK,QAAO;AACjB,UAAMuE,IAAYhC,GAAoB5N,CAAG,GACnC6P,IAAWL,EAAQ,QAAQM,GAAWF,GAAWJ,EAAQ,KAAK,IAAII,GAClEH,IAAY,KAAK,UAAU,aAAagJ,EAAI,OAAOzY,EAAI,GAAG,GAC1D4V,IAAcnG,IAAYK,GAAWD,GAAUJ,CAAS,IAAII,GAC5DwG,IAAST,EAAY,OAAO,SAAS,IACrC8C,IAAO9C,EAAY,SAAS,YAAY;AAC9C,IAAAvK,EAAI,KAAA,GACJA,EAAI,OAAO,GAAGqN,CAAI,GAAGrC,CAAM,GAAG1L,CAAmB,MAAMD,CAAkB,GAAG,KAAA,GAC5EW,EAAI,eAAe;AAEnB,UAAM6D,IADO,KAAK,UAAU,QAAA,EACV,WAAWlP,EAAI,GAAG,KAAKA,EAAI,YAAY,IACnDmR,IAAQnR,EAAI,OAAO,SAAS,QAC5BsW,IAAYmC,EAAI,KAAK,OAAOlC,IAC5BC,IAAYiC,EAAI,KAAK,MAAM7G,IAC3B6E,IAAY,KAAK,IAAI,GAAGgC,EAAI,KAAK,QAAQlC,KAAoB,CAAC,GAC9DG,IAAY,KAAK;AAAA,MACrB;AAAA,MACA+B,EAAI,KAAK,UAAU7G,KAAsBC;AAAA,IAAA,GAErC8G,IAAS,KAAK;AAAA,MAClBtN;AAAA,MACAmF,EAAY;AAAA,MACZ8F;AAAA,MACAE;AAAA,MACAC;AAAA,MACAC;AAAA,MACAxH;AAAA,MACAiC;AAAA,IAAA;AAGF,QADA9F,EAAI,QAAA,GACA,CAACsN,EAAQ,QAAO;AACpB,UAAMC,IAAM5Y,EAAI,SAAS,WAAW,IAAI,GAClC+V,IAAO,KAAK,IAAI0C,EAAI,KAAK,MAAME,EAAO,IAAIC,CAAG,GAC7C5C,IAAM,KAAK,IAAIyC,EAAI,KAAK,KAAKE,EAAO,IAAIC,CAAG,GAC3C/B,IAAQ,KAAK,IAAI4B,EAAI,KAAK,OAAOE,EAAO,IAAIA,EAAO,QAAQC,CAAG,GAC9D9B,IAAS,KAAK,IAAI2B,EAAI,KAAK,QAAQE,EAAO,IAAIA,EAAO,SAASC,CAAG;AACvE,WACEzK,EAAM,WAAW4H,KACjB5H,EAAM,WAAW0I,KACjB1I,EAAM,WAAW6H,KACjB7H,EAAM,WAAW2I,IAEV,EAAE,OAAO2B,EAAI,OAAO,QAAQ,OAAOA,EAAI,MAAM,GAAG,MAAMzY,EAAI,KAAA,IAE5D;AAAA,EACT;AAAA,EAEQ,mBAAmBE,GAAeC,GAAgB;AACxD,QAAI,CAAC,KAAK,UAAU,OAAQ,QAAO;AACnC,UAAMT,IAAS,KAAK,UAAU,UAAA,GACxBG,IAAW,KAAK,UAAU,YAAYK,CAAK,GAC3CJ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAMA,EAAE,QAAQD,CAAM;AACjE,QAAIN,IAAW,KAAKC,IAAW,EAAG,QAAO;AACzC,eAAWyI,KAAS,KAAK,WAAW;AAClC,UAAIA,EAAM,SAAS,QAAS;AAC5B,YAAMyJ,IAAW,KAAK,IAAIzJ,EAAM,UAAUA,EAAM,MAAM,GAChD0J,IAAS,KAAK,IAAI1J,EAAM,UAAUA,EAAM,MAAM,GAC9C2J,IAAW,KAAK,IAAI3J,EAAM,UAAUA,EAAM,MAAM,GAChD4J,IAAS,KAAK,IAAI5J,EAAM,UAAUA,EAAM,MAAM;AACpD,UAAI1I,KAAYmS,KAAYnS,KAAYoS,KAAUnS,KAAYoS,KAAYpS,KAAYqS;AACpF,eAAO;AAAA,IACX;AACA,WAAO;AAAA,EACT;AAAA,EAgDQ,sBAAsB/H,GAAe;AAE3C,QADI,CAAC,KAAK,WACN,CAAC,KAAK,KAAM;AAChB,UAAMwO,IAAM,GACNC,IAAW,KAAK,KAAK,sBAAA,GACrBC,IAAO,KAAK,KAAK,aACjBC,IAAO,KAAK,KAAK;AACvB,QAAIhD,IAAO3L,EAAK,QAAQyO,EAAS,OAAOD,GACpC5C,IAAM5L,EAAK,MAAMyO,EAAS,MAAMD,GAChCI,IAAyB;AAC7B,UAAMC,IAAQ,KAAK,QAAQ,sBAAA;AAC3B,IAAIlD,IAAOkD,EAAM,QAAQH,MACvB/C,IAAO,KAAK,IAAI,GAAG3L,EAAK,OAAOyO,EAAS,OAAOI,EAAM,QAAQL,CAAG,GAChEI,IAAO,SAELhD,IAAMiD,EAAM,SAASF,MAAM/C,IAAM,KAAK,IAAI,GAAG+C,IAAOE,EAAM,SAASL,CAAG,IAC1E,KAAK,QAAQ,MAAM,OAAO,GAAG7C,CAAI,MACjC,KAAK,QAAQ,MAAM,MAAM,GAAGC,CAAG,MAC/B,KAAK,QAAQ,QAAQ,OAAOgD;AAAA,EAC9B;AAAA,EAEQ,yBAAyB;AAE/B,QADI,CAAC,KAAK,WAAW,KAAK,QAAQ,QAAQ,YAAY,OAClD,CAAC,KAAK,iBAAiB,CAAC,KAAK,eAAgB;AACjD,UAAM5O,IAAO,KAAK,YAAY,KAAK,cAAc,OAAO,KAAK,cAAc,MAAM;AACjF,QAAI,CAACA,GAAM;AACT,WAAK,QAAQ,QAAQ,UAAU,KAC/B,KAAK,gBAAgB,MACrB,KAAK,iBAAiB;AACtB;AAAA,IACF;AACA,SAAK,QAAQ,cAAc,KAAK,gBAChC,KAAK,sBAAsBA,CAAI;AAAA,EACjC;AAAA,EAEQ,YAAYlK,GAAeC,GAAgC;AACjE,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ,QAAO;AACvC,UAAMiK,IAAO,KAAK,OAAO,sBAAA,GACnB1K,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtBlL,IAAO,KAAK,UAAU,SAAA,GACtBE,IAAW,KAAK,UAAU,YAAYK,CAAK,GAC3CJ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAMA,EAAE,QAAQD,CAAM;AACjE,QAAIN,IAAW,KAAKC,IAAW,EAAG,QAAO;AACzC,UAAM2N,IAAYC,EAAgBhO,GAAQmL,CAAI,GACxCmJ,IAAUtU,EAAO,QAAQ,KAAK,CAACU,MAAMyK,EAAK,WAAWzK,EAAE,GAAG,KAAKA,EAAE,QAAQ,GACzEsL,IAAMsI,IAAU,KAAK,qBAAqBtU,GAAQmL,GAAM4C,CAAS,IAAI;AAC3E,SAAK,kBAAkB9N,GAAM+L,GAAKsI,CAAO;AACzC,UAAME,IAAc,KAAK;AACzB,QAAI,CAACA,EAAa,QAAO;AACzB,UAAMoE,IAAcpE,EAAY,QAAQ,IAAIrU,CAAQ;AACpD,QAAIwT,IAAU,KAAK;AACnB,aAAS9R,IAAI,GAAGA,IAAIzB,GAAUyB,KAAK;AACjC,MAAA8R,KAAW5F,EAAUlM,CAAC,KAAK;AAE7B,WAAO,IAAI;AAAA,MACT6I,EAAK,OAAOiJ,IAAU,KAAK,KAAK;AAAA,MAChCjJ,EAAK,MAAM,KAAK,eAAekO,IAAc,KAAK,KAAK;AAAA,MACvD7K,EAAU3N,CAAQ,KAAK;AAAA,MACvBoU,EAAY,QAAQrU,CAAQ,KAAK,KAAK;AAAA,IAAA;AAAA,EAE1C;AAAA,EAEQ,mBAAmBqZ,GAAiBC,GAAiB;AAC3D,QAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,OAAQ;AAChC,QAAI,KAAK,KAAK,QAAQ,wBAAwB,KAAK;AACjD,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAEA;AACE,YAAM/O,IAAO,KAAK,OAAO,sBAAA,GACnB+I,IAAY+F,IAAU9O,EAAK,MAC3BgJ,IAAY+F,IAAU/O,EAAK,KAC3BvF,IAAIsO,IAAY,KAAK,KAAK,YAC1BrO,IAAIsO,GACJgG,IAAU,KAAK,mBACfC,IAAW,KAAK;AACtB,UAAI3F,IAAyB,MACzB4F,IAAW;AACf,UAAIxU,KAAK,KAAKA,IAAI,KAAK,gBAAgBD,KAAK,KAAK,gBAAgB;AAC/D,cAAMnF,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtB4C,IAAYC,EAAgBhO,GAAQmL,CAAI;AAC9C,YAAIwI,IAAU,KAAK,gBACfvT,IAAW;AACf,iBAASyB,IAAI,GAAGA,IAAIkM,EAAU,QAAQlM,KAAK,GAAG;AAC5C,gBAAMyD,IAAIyI,EAAUlM,CAAC,KAAK;AAC1B,cAAIsD,KAAKwO,KAAWxO,KAAKwO,IAAUrO,GAAG;AACpC,YAAAlF,IAAWyB;AACX;AAAA,UACF;AACA,UAAA8R,KAAWrO;AAAA,QACb;AACA,cAAMhF,IAAMF,KAAY,IAAIJ,EAAO,QAAQI,CAAQ,IAAI;AACvD,YAAIE,GAAK;AACP,UAAA0T,IAAU1T,EAAI;AACd,gBAAMgF,IAAIyI,EAAU3N,CAAQ,KAAK,KAC3BwT,IAAW,IAEXC,IAAWF,IAAUrO,IAAIsO,IADnB,GAENE,IAAU,KAAK,OAAO,KAAK,eAAeF,KAAY,CAAC;AAC7D,UAAAgG,IACEzU,KAAK0O,KAAY1O,KAAK0O,IAAWD,KAAYxO,KAAK0O,KAAW1O,KAAK0O,IAAUF;AAAA,QAChF;AAAA,MACF;AACA,YAAMiG,IACJ,OAAOH,KAAW,EAAE,MAAM,OAAO1F,KAAW,EAAE,KAAK,EAAQ2F,KAAc,EAAQC;AAGnF,UAFA,KAAK,oBAAoB5F,GACzB,KAAK,kBAAkB4F,GACnB5F,MAAY,MAAM;AACpB,aAAK,OAAO,MAAM,SAAS4F,IAAW,YAAY,WAC9C,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MAClBC,UAAc,OAAA;AAClB;AAAA,MACF;AACA,MAAIA,UAAc,OAAA;AAAA,IACpB;AAMA,QAAIC,IAAS;AAEb,UAAMf,IAAM,KAAK,QAAQ,IAAI,WAAW,aAAa,EAAE,SAAAS,GAAS,SAAAC,EAAA,CAAS,CAAC;AAC1E,QAAI,CAACV,GAAK;AACR,WAAK,OAAO,MAAM,SAASe,GACvB,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MACtB,KAAK,iBAAiB;AACtB;AAAA,IACF;AACA,QAAIf,EAAI,WAAW,aAAaA,EAAI,WAAW,MAAM;AACnD,WAAK,OAAO,MAAM,SAAS,WACvB,KAAK,YAAS,KAAK,QAAQ,QAAQ,UAAU,MACjD,KAAK,gBAAgB,MACrB,KAAK,iBAAiB,MACtB,KAAK,iBAAiB;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,YAAA,MAAkB,YAAY;AACrC,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAEA,UAAMvH,IAAS,KAAK,UAAU,cAAcuH,EAAI,OAAOA,EAAI,MAAM;AACjE,QAAI,KAAK,WAAWvH,GAAQ;AAC1B,YAAMuI,IACJ,KAAK,iBACL,KAAK,cAAc,UAAUhB,EAAI,SACjC,KAAK,cAAc,WAAWA,EAAI,QAC9BiB,IAAc,KAAK,mBAAmBxI,EAAO;AACnD,UAAI,CAACuI,KAAY,CAACC,KAAe,KAAK,QAAQ,QAAQ,YAAY,KAAK;AACrE,aAAK,gBAAgB,EAAE,OAAOjB,EAAI,OAAO,QAAQA,EAAI,OAAA,GACrD,KAAK,iBAAiBvH,EAAO,SAC7B,KAAK,QAAQ,cAAcA,EAAO;AAClC,cAAM9G,IAAO,KAAK,YAAYqO,EAAI,OAAOA,EAAI,MAAM;AACnD,QAAIrO,KACF,KAAK,sBAAsBA,CAAI,GAC/B,KAAK,QAAQ,QAAQ,UAAU,OAE/B,KAAK,QAAQ,QAAQ,UAAU;AAAA,MAEnC;AAAA,IACF,MAAA,CAAW,KAAK,YACd,KAAK,QAAQ,QAAQ,UAAU,KAC/B,KAAK,gBAAgB,MACrB,KAAK,iBAAiB;AAGxB,UAAMqJ,IAAY,KAAK,cAAc,IAAI,WAAW,aAAa,EAAE,SAAAyF,GAAS,SAAAC,EAAA,CAAS,CAAC,GAChFQ,IAAelG,IAAY,GAAGA,EAAU,KAAK,KAAKA,EAAU,MAAM,KAAKA,EAAU,IAAI,KAAK;AAKhG,QAJIkG,MAAiB,KAAK,mBACxB,KAAK,iBAAiBA,GACtB,KAAK,OAAA,IAEHlG,KAEE,CADgB,KAAK,UAAU,mBAAmBA,EAAU,OAAOA,EAAU,MAAM,EACtE,UAAU;AACzB,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAGF,QAAI,CAAC,KAAK,mBAAmBgF,EAAI,OAAOA,EAAI,MAAM,GAAG;AACnD,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAOA,QAAI,EAHF,KAAK,gBAAgBA,EAAI,SACzB,KAAK,iBAAiB,QACtB,KAAK,iBAAiBA,EAAI,SACT;AACjB,WAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACF;AAGA,QACE,KAAK,eACL,KAAK,iBAAiB,QACtB,KAAK,gBAAgB,aACrB,KAAK,iBAAiB,aACtBpO;AAAA,MACE,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,YAAA;AAAA,IAAY,GAEnB;AACA,YAAMJ,IAAW,KAAK,YAAY,KAAK,aAAa,KAAK,YAAY;AACrE,UAAIA,GAAU;AACZ,cAAM2P,IAAa5P,GAAkBC,GAAUF,EAAuB;AACtE,YAAII,GAAc+O,GAASC,GAASS,CAAU,GAAG;AAC/C,eAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM5Z,IAAM,KAAK,UAAU,UAAA,EAAY,QAAQ,KAAK,CAACI,MAAMA,EAAE,QAAQqY,EAAI,MAAM;AAE/E,IADoB,KAAK,UAAU,mBAAmBA,EAAI,OAAOA,EAAI,MAAM,EAC3D,YAAYzY,GAAK,SAAS,YAAWwZ,IAAS,YACzDA,IAAS,QACd,KAAK,OAAO,MAAM,SAASA;AAAA,EAC7B;AAAA,EAEQ,iBACNnO,GACAtL,GACAL,GACA+N,GACA;AACA,QAAI8D,IAAY,KAAK;AACrB,UAAM1G,IAAO,KAAK,UAAU,QAAA;AAC5B,aAAS+B,IAAM,GAAGA,IAAMlN,EAAO,QAAQ,QAAQkN,KAAO,GAAG;AACvD,YAAM,IAAIlN,EAAO,QAAQkN,CAAG;AAG5B,UAFI,CAAC,KAED,EADS/B,EAAK,WAAW,EAAE,GAAG,KAAK,EAAE,UAC9B;AACX,YAAM7F,KAAKyI,EAAUb,CAAG,KAAK,OAAO,KAAK,SACnCsD,IAAW,KAAK,UAAU,iBAAiBnQ,EAAI,IAAI,CAAC,GACpDyP,IAAU,KAAK,UAAU,wBAAwBzP,EAAI,IAAI,CAAC,GAE1DyR,IADetB,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,UACvD,WAAW,KAAK,YAAYU,EAAS,OAAO,CAAC,EAAE,MAErElI,IADQ,KAAK,UAAUqD,GAAKmG,GAAMxM,CAAC,EACzB,SAAS,KAAK,aAAa,KAAK;AAChD,MAAAuM,IAAY,KAAK,IAAIA,GAAWvJ,CAAC;AAAA,IACnC;AACA,WAAOuJ;AAAA,EACT;AAAA,EAEQ,UAAUlG,GAA+BmG,GAAc3I,GAAe;AAC5E,UAAM6C,IAAM,GAAGL,EAAI,IAAI,IAAIxC,CAAK,IAAI2I,CAAI,IAClC5F,IAAS,KAAK,iBAAiB,IAAIF,CAAG;AAC5C,QAAIE;AAEF,kBAAK,iBAAiB,OAAOF,CAAG,GAChC,KAAK,iBAAiB,IAAIA,GAAKE,CAAM,GAC9BA,EAAO;AAEhB,UAAMiO,IAAWrI,EAAK,MAAM;AAAA,CAAI,GAC1BsI,IAAkB,CAAA;AACxB,eAAWC,KAAQF,GAAU;AAC3B,UAAIG,IAAUD;AACd,aAAO1O,EAAI,YAAY2O,CAAO,EAAE,QAAQnR,KAASmR,EAAQ,SAAS,KAAG;AACnE,YAAIC,IAAMD,EAAQ;AAClB,eAAOC,IAAM,KAAK5O,EAAI,YAAY2O,EAAQ,MAAM,GAAGC,CAAG,CAAC,EAAE,QAAQpR;AAC/D,UAAAoR,KAAO;AAET,QAAAH,EAAM,KAAKE,EAAQ,MAAM,GAAGC,CAAG,CAAC,GAChCD,IAAUA,EAAQ,MAAMC,CAAG;AAAA,MAC7B;AACA,MAAAH,EAAM,KAAKE,CAAO;AAAA,IACpB;AAEA,SADA,KAAK,iBAAiB,IAAItO,GAAK,EAAE,OAAAoO,GAAO,GACjC,KAAK,iBAAiB,OAAO/G,EAAe,0BAAwB;AACzE,YAAMmH,IAAW,KAAK,iBAAiB,KAAA,EAAO,OAAO;AACrD,UAAI,CAACA,EAAU;AACf,WAAK,iBAAiB,OAAOA,CAAQ;AAAA,IACvC;AACA,WAAOJ;AAAA,EACT;AAAA,EAEQ,YAAYzO,GAA+BmG,GAAc3I,GAAe;AAC9E,QAAIzJ,IAAMoS;AACV,WAAOnG,EAAI,YAAYjM,CAAG,EAAE,QAAQyJ,KAASzJ,EAAI,SAAS;AACxD,MAAAA,IAAM,GAAGA,EAAI,MAAM,GAAG,EAAE,CAAC;AAE3B,WAAOA;AAAA,EACT;AAAA,EAEQ,sBACNiM,GACAmG,GACA3I,GACAqG,GACApG,GACA;AACA,UAAMmH,IAAMf,IAAO,KAAK,UAAU7D,GAAKmG,GAAM3I,CAAK,IAAI,CAAC,KAAK,YAAYwC,GAAKmG,GAAM3I,CAAK,CAAC,GACnFsR,IAAW,KAAK,IAAI,GAAG,KAAK,MAAMrR,IAAS,KAAK,UAAU,CAAC;AACjE,WAAOmH,EAAI,MAAM,GAAGkK,CAAQ;AAAA,EAC9B;AAAA,EAEQ,kBACN9O,GACAmG,GACA3M,GACAC,GACA+D,GACAC,GACAoG,GACAiC,GACgB;AAChB,UAAM2I,IAAQ,KAAK,sBAAsBzO,GAAKmG,GAAM3I,GAAOqG,GAAMpG,CAAM;AACvE,QAAI,CAACgR,EAAM,OAAQ,QAAO;AAC1B,QAAIM,IAAO,OAAO,mBACdC,IAAO,OAAO,mBACdC,IAAO,OAAO,mBACdC,IAAO,OAAO;AAClB,aAAS3N,IAAM,GAAGA,IAAMkN,EAAM,QAAQlN,KAAO,GAAG;AAC9C,YAAMmN,IAAOD,EAAMlN,CAAG,KAAK,IACrB4N,IAAYnP,EAAI,YAAY0O,CAAI,EAAE;AACxC,UAAIU,IAAS5V;AACb,MAAIsM,MAAU,UAASsJ,IAAS5V,IAAIgE,IAAQ2R,IACnCrJ,MAAU,aAAUsJ,IAAS5V,KAAKgE,IAAQ2R,KAAa;AAChE,YAAME,IAAU5V,IAAI,KAAK,aAAa8H,GAChC+N,IAAaD,IAAU,KAAK;AAClC,MAAAN,IAAO,KAAK,IAAIA,GAAMK,CAAM,GAC5BJ,IAAO,KAAK,IAAIA,GAAMI,IAASD,CAAS,GACxCF,IAAO,KAAK,IAAIA,GAAMI,CAAO,GAC7BH,IAAO,KAAK,IAAIA,GAAMI,CAAU;AAAA,IAClC;AACA,WAAI,CAAC,OAAO,SAASP,CAAI,KAAK,CAAC,OAAO,SAASE,CAAI,IAAU,OACtD,IAAI,QAAQF,GAAME,GAAMD,IAAOD,GAAMG,IAAOD,CAAI;AAAA,EACzD;AAAA,EAEQ,aACNjP,GACAmG,GACA3M,GACAC,GACA+D,GACAC,GACAoG,GACAiC,IAAqC,QACrC+E,IAAY,IACZC,IAAkB,IAClBQ,GACA;AACA,IAAAtL,EAAI,KAAA,GACJA,EAAI,UAAA,GACJA,EAAI,KAAKxG,IAAI,GAAGC,IAAI,GAAG+D,IAAQ,GAAGC,IAAS,CAAC,GAC5CuC,EAAI,KAAA;AACJ,UAAMuP,IAAavP,EAAI;AACvB,IAAI6K,IACF7K,EAAI,OAAO,oBACF8K,MACT9K,EAAI,OAAO,GAAGV,CAAmB,MAAMD,CAAkB;AAE3D,UAAMoP,IAAQ,KAAK,sBAAsBzO,GAAKmG,GAAM3I,GAAOqG,GAAMpG,CAAM,GACjE+R,IAAkBf,EAAM,SAAS,KAAK,YACtCgB,IAAQhW,IAAI,KAAK,IAAI,GAAG,KAAK,OAAOgE,IAAS+R,KAAmB,CAAC,CAAC,GAClEE,IAAa,CAACC,GAAYC,MAAoB;AAClD,YAAMC,IAAWJ,IAAQ,KAAK,aAAaG;AAC3C,UAAIR,IAAS5V,GACTsW,IAAOtW;AACX,UAAIsM,MAAU;AACZ,QAAA9F,EAAI,YAAY,SAChB8P,IAAOtW,IAAIgE,GACX4R,IAASU,IAAO9P,EAAI,YAAY2P,CAAE,EAAE,OACpC3P,EAAI,SAAS2P,GAAIG,GAAMD,CAAQ;AAAA,eACtB/J,MAAU,UAAU;AAC7B,QAAA9F,EAAI,YAAY;AAChB,cAAM+P,IAASvW,IAAIgE,IAAQ,GACrB7D,IAAIqG,EAAI,YAAY2P,CAAE,EAAE;AAC9B,QAAAP,IAASW,IAASpW,IAAI,GACtBmW,IAAOC,IAASpW,IAAI,GACpBqG,EAAI,SAAS2P,GAAII,GAAQF,CAAQ;AAAA,MACnC;AACE,QAAA7P,EAAI,YAAY,QAChBoP,IAAS5V,GACTsW,IAAOtW,IAAIwG,EAAI,YAAY2P,CAAE,EAAE,OAC/B3P,EAAI,SAAS2P,GAAInW,GAAGqW,CAAQ;AAE9B,UAAIvE,GAAa,aAAaA,GAAa,QAAQ;AACjD,cAAM0E,IAAehQ,EAAI,aACnBiQ,IAAkBjQ,EAAI;AAI5B,YAHAA,EAAI,cAAcA,EAAI,WACtBA,EAAI,YAAY,GAChBA,EAAI,UAAA,GACAsL,EAAY,WAAW;AACzB,gBAAM4E,IAAaL,IAAW;AAC9B,UAAA7P,EAAI,OAAOoP,GAAQc,CAAU,GAC7BlQ,EAAI,OAAO8P,GAAMI,CAAU;AAAA,QAC7B;AACA,YAAI5E,EAAY,QAAQ;AACtB,gBAAM6E,IAAUN,IAAW,KAAK,MAAM,KAAK,aAAa,CAAC,IAAI;AAC7D,UAAA7P,EAAI,OAAOoP,GAAQe,CAAO,GAC1BnQ,EAAI,OAAO8P,GAAMK,CAAO;AAAA,QAC1B;AACA,QAAAnQ,EAAI,OAAA,GACJA,EAAI,cAAcgQ,GAClBhQ,EAAI,YAAYiQ;AAAA,MAClB;AAAA,IACF;AACA,aAAS1O,IAAM,GAAGA,IAAMkN,EAAM,QAAQlN,KAAO;AAC3C,MAAAmO,EAAWjB,EAAMlN,CAAG,KAAK,IAAIA,IAAM,CAAC;AAEtC,IAAAvB,EAAI,YAAY,QAChBA,EAAI,OAAOuP,GACXvP,EAAI,QAAA;AAAA,EACN;AAAA,EAEQ,YAAY5C,GAAgBzI,GAAqD;AACvF,QAAIyI,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,QAAIzI,EAAI,SAAS;AAEf,aAAO,EAAE,MADK4Q,GAAenI,CAAK,KACV,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS;AAEf,aAAO,EAAE,MADK6Q,GAAapI,CAAK,KACR,OAAOA,CAAK,EAAA;AAEtC,QAAIzI,EAAI,SAAS,QAAQ;AACvB,YAAMsS,IAAOpG,GAAiBzD,CAAK;AACnC,UAAI6J,EAAM,QAAO,EAAE,MAAMA,EAAK,KAAK,IAAI,EAAA;AAAA,IACzC;AACA,QAAItS,EAAI,SAAS;AACf,aAAIA,EAAI,WAAW,cAAc,CAACA,EAAI,SAC7B,EAAE,MAAMyI,IAAQ,MAAM,IAAA,IAE3B,MAAM,QAAQzI,EAAI,MAAM,KAAKA,EAAI,OAAO,UAAU,IAC7C,EAAE,MAAc,OAARyI,IAAezI,EAAI,OAAO,CAAC,IAAYA,EAAI,OAAO,CAAC,CAAvB,EAAwB,IAE9D,EAAE,MAAMyI,IAAQ,OAAOzI,EAAI,MAAM,IAAI,GAAA;AAE9C,QAAIA,EAAI,SAAS,YAAY,OAAOyI,KAAU,UAAU;AACtD,YAAM8J,IAAM9J,GACNkD,IAAM3L,EAAI;AAEhB,WADc2L,GAAK,UAAU,eACf,cAAc;AAC1B,cAAM6F,IAAOgB,GAAoBD,GAAK,EAAE,QAAQ,cAAc,WAAW5G,GAAK,WAAW,GACnFJ,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAAA;AAAAA,MACjB;AAEA,YAAMkH,IAAiC,CAAA;AACvC,MAAI9G,GAAK,UAAU,WACjB8G,EAAK,wBAAwB9G,EAAI,OACjC8G,EAAK,wBAAwB9G,EAAI,QAEnC8G,EAAK,cAAc,EAAQ9G,GAAK;AAChC,YAAM6F,IAAO,KAAK,iBAAiB,mBAAmBiB,CAAI,EAAE,OAAOF,CAAG,GAChEhH,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAA;AAAA,IACjB;AAEA,SAAKvL,EAAI,SAAS,SAASA,EAAI,SAAS,WAAW,OAAOyI,KAAU,UAAU;AAC5E,YAAM8J,IAAM9J,GACNkD,IAAM3L,EAAI,QACV0S,IAAQ/G,GAAK,UAAU;AAC7B,UAAI+G,MAAU,YAAYA,MAAU,WAAWA,MAAU,OAAO;AAC9D,cAAMlB,IAAOmB,GAAwBJ,GAAKG,CAAK,GACzCnH,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,eAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAAA;AAAAA,MACjB;AAEA,YAAMkH,IAAiC;AAAA,QACrC,uBAAuB;AAAA,QACvB,uBAAuB;AAAA,QACvB,aAAa,EAAQ9G,GAAK;AAAA,MAAiB,GAEvC6F,IAAO,KAAK,iBAAiB,mBAAmBiB,CAAI,EAAE,OAAOF,CAAG,GAChEhH,IAAQI,GAAK,eAAe4G,IAAM,IAAI,YAAY;AACxD,aAAO,EAAE,MAAAf,GAAM,OAAAjG,EAAA;AAAA,IACjB;AACA,SACGvL,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,gBAC3DyI,aAAiB,QAAQ,OAAOA,KAAU,WAC3C;AACA,YAAMmK,IAAW5S,EAAI,QACf2L,IACJ3L,EAAI,SAAS,SACR4S,KAAY,eACb5S,EAAI,SAAS,SACV4S,KAAY,UACZA,KAAY;AACrB,UAAIzK,IAAiB;AAKrB,aAJIM,aAAiB,OAAMN,IAAIM,IAE7BN,IAAI,KAAK,iBAAiB,aAAaM,CAAK,GAEzCN,IACE,EAAE,MAAM2K,GAAe3K,GAAGwD,CAAG,EAAA,IADrB,EAAE,MAAM,OAAOlD,CAAK,EAAA;AAAA,IAErC;AACA,WAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAAA,EAC7B;AACF;AAz5CEsK,EAAwB,oBAAoB,MAC5CA,EAAwB,2BAA2B,KACnDA,EAAwB,oCAAoC,GAC5DA,EAAwB,yBAAyB;AAJ5C,IAAM0I,KAAN1I;AC1wBA,MAAM2I,GAAiB;AAAA,EAoE5B,YACEtO,GACA5C,GACAmR,GACAC,GACAC,GACAC,GACAC,GACQvc,GACRwc,GACAC,GACAC,GACQC,GACRC,GACQC,GACAC,GACAC,GACR;AATQ,SAAA,YAAA/c,GAIA,KAAA,iBAAA2c,GAEA,KAAA,oBAAAE,GACA,KAAA,SAAAC,GACA,KAAA,SAAAC,GA7EV,KAAQ,YAAkC,MAE1C,KAAQ,4BAA+D,MACvE,KAAQ,kBAAoC,CAAA,GAC5C,KAAQ,UAA6E,MACrF,KAAQ,uBAA8C,MACtD,KAAQ,iBAA0C,MAClD,KAAQ,cAAqC,MAC7C,KAAQ,iBAAgC,MACxC,KAAQ,gBAAgB,IACxB,KAAQ,kBAA4D,MACpE,KAAQ,kBAAiE,MACzE,KAAQ,WAAW,IACnB,KAAQ,YAAmF,MAC3F,KAAQ,oBAAqD,MAC7D,KAAQ,YAAY,IACpB,KAAQ,uBAAuB,IAC/B,KAAQ,oBAAoB,IAC5B,KAAQ,eAAe,IACvB,KAAQ,aAA6D,MACrE,KAAQ,kBAAiC,MACzC,KAAQ,mBAAkC,MAC1C,KAAQ,oBAAqD,MAC7D,KAAQ,gBAA+B,MACvC,KAAQ,mBAAmB,IAC3B,KAAQ,aAA8D,MACtE,KAAQ,aAAiC,MACzC,KAAQ,yBAAwC,MAChD,KAAQ,sBAAgF,MACxF,KAAQ,YAAY,IACpB,KAAQ,qBAAqB,GAC7B,KAAiB,8BAA8B,MAAM;AACnD,WAAK,YAAY;AAAA,IACnB,GACA,KAAiB,4BAA4B,MAAM;AACjD,WAAK,YAAY,IACjB,KAAK,qBAAqB,KAAK,IAAA;AAAA,IACjC,GACA,KAAiB,sBAAsB,MAAM,KAAK,uBAAA,GAClD,KAAiB,oBAAoB,OAAOrJ,MAAsB;AAOhE,UANIA,EAAG,oBACH,CAAC,KAAK,iBACN,KAAK,WACLA,EAAG,eAAe,KAAK,aAGvB,EAFU,OAAO,YAAc,OAAe,OAAO,KAAK,UAAU,QAAQ,IAC1DA,EAAG,UAAUA,EAAG,SAC1B;AACZ,YAAMxH,IAAMwH,EAAG,IAAI,YAAA;AACnB,MAAIxH,MAAQ,OACVwH,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,KACFxH,MAAQ,QACjBwH,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,GACX,KAAK,qBAAA;AAAA,IAET,GAgmBA,KAAQ,oBAAoB,CAACA,MAAqB;AAChD,UAAIA,EAAG,WAAW,EAAG;AACrB,YAAMnB,IAAKmB,EAAG;AASd,UARInB,GAAI,QAAQ,kCAAkC,KAC9CA,GAAI,QAAQ,8BAA8B,KAE1C,KAAK,WAAWmB,EAAG,UAAU,KAAK,QAAQ,SAASA,EAAG,MAAc,KAEpE,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,WAAW,QAC5D,CAAC,KAAK,2BAER,KAAK,aAAc;AACvB,YAAMuF,IAAM,KAAK,QAAQvF,CAA2B;AAGpD,UAFI,CAACuF,KACDA,EAAI,UAAU,aAAaA,EAAI,WAAW,aAC1CA,EAAI,WAAW,UAAW;AAG9B,YAAM+D,IAAU7T,GAAoB,KAAK,WAAW,KAAK,eAAe;AACxE,UAAI6T,KAAW,KAAK,YAAY;AAC9B,cAAM9c,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB8c,IAAiBD,EAAQ,aACzBE,IAAiBF,EAAQ,UACzBG,IAAYhd,EAAK8c,CAAc,GAC/BG,IAAYld,EAAO,QAAQgd,CAAc;AAC/C,YAAIC,KAAaC,GAAW;AAC1B,gBAAM3S,IACJ,KAAK,oBAAoB0S,EAAU,IAAIC,EAAU,GAAG,GAAG,sBAAA,KACvD,KAAK,sBAAsBD,EAAU,IAAIC,EAAU,GAAG;AACxD,cACE3S,KACAI;AAAA,YACE,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK,WAAW;AAAA,YAChB,KAAK,WAAW;AAAA,YAChB,KAAK;AAAA,UAAA,GAEP;AACA,kBAAMuP,IAAa5P,GAAkBC,GAAUF,EAAuB;AACtE,gBAAII,GAAc+I,EAAG,SAASA,EAAG,SAAS0G,CAAU,GAAG;AACrD,cAAA1G,EAAG,eAAA,GACH,KAAK,eAAe,IACpB,KAAK,aAAasJ,GAClB,KAAK,kBAAkBA,EAAQ,aAC/B,KAAK,KAAK,QAAQ,sBAAsB,KACpC,KAAK,qBAAqB,SAC5B,KAAK,mBAAmB,KAAK,KAAK,MAAM,UAAU,KACpD,KAAK,KAAK,MAAM,SAAS,aACzB,KAAK,oBAAoB,EAAE,GAAGtJ,EAAG,SAAS,GAAGA,EAAG,QAAA,GAChD,KAAK,WAAW,IAChB,KAAK,YAAY,MACjB,KAAK,oBAAoB;AACzB,kBAAI;AACD,gBAAAA,EAAG,QAA2B,oBAAoBA,EAAG,SAAS;AAAA,cACjE,QAAQ;AAAA,cAER;AAEA,mBAAK,kBAAkB;AAAA,gBACrB;AAAA,kBACE,MAAM;AAAA,kBACN,UAAUsJ,EAAQ;AAAA,kBAClB,QAAQA,EAAQ;AAAA,kBAChB,UAAUA,EAAQ;AAAA,kBAClB,QAAQA,EAAQ;AAAA,gBAAA;AAAA,cAClB,GAEF,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,gBAAA;AACL;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM9c,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBE,IAAW4Y,EAAI,UAAU,eAAe,IAAI,KAAK,UAAU,YAAYA,EAAI,KAAK,GAChF3Y,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOqY,EAAI,MAAM,CAAC;AACrF,UAAI3Y,IAAW,EAAG;AAElB,UAAI2Y,EAAI,UAAU,cAAc;AAE9B,YAAI,CAAC9Y,EAAK,OAAQ;AAClB,cAAM4I,IAAwB;AAAA,UAC5B,MAAM;AAAA,UACN,UAAU;AAAA,UACV,QAAQ5I,EAAK,SAAS;AAAA,UACtB,UAAUG;AAAA,UACV,QAAQA;AAAA,QAAA;AAEV,aAAK,kBAAkB,CAACyI,CAAK,GAC7B,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,WAAW,IAChB,KAAK,gBAAgB,IACrB,KAAK,YAAY,MACjB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB;AACzB,cAAMsU,IAAYld,EAAK,CAAC,GAClBmd,IAAYpd,EAAO,QAAQI,CAAQ;AACzC,QAAI+c,KAAaC,MACf,KAAK,aAAa,EAAE,OAAOD,EAAU,IAAI,QAAQC,EAAU,IAAA,GAC3D,KAAK,eAAeD,EAAU,IAAIC,EAAU,GAAG,IAEjD,KAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AAEA,UAAIjd,IAAW,EAAG;AAElB,YAAM8O,IAAyB8J,EAAI,WAAW,OAAO,SAAS;AAC9D,WAAK,WAAW,IAChB,KAAK,oBAAoB,EAAE,GAAGvF,EAAG,SAAS,GAAGA,EAAG,QAAA,GAChD,KAAK,YAAY,IACjB,KAAK,uBAAuB,IAC5B,KAAK,YAAY,EAAE,UAAArT,GAAU,UAAAC,GAAU,MAAA6O,EAAA,GACvC,KAAK,oBAAoB,IACzB,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE,GAAGuE,EAAG,SAAS,GAAGA,EAAG,QAAA;AAEhD,UAAI;AACD,QAAAA,EAAG,QAA2B,oBAAoBA,EAAG,SAAS;AAAA,MACjE,QAAQ;AAAA,MAER;AACA,WAAK,gBAAA;AAAA,IACP,GAgMA,KAAQ,oBAAoB,CAACA,MAAqB;AAEhD,UADA,KAAK,oBAAoB,EAAE,GAAGA,EAAG,SAAS,GAAGA,EAAG,QAAA,GAC5C,KAAK,gBAAgB,KAAK,YAAY;AACxC,aAAK,8BAA8BA,EAAG,SAASA,EAAG,OAAO;AACzD;AAAA,MACF;AACA,UAAI,GAAC,KAAK,YAAY,CAAC,KAAK,YAC5B;AAAA,YAAI,CAAC,KAAK,aAAa,KAAK,mBAAmB;AAC7C,gBAAM6J,IAAK7J,EAAG,UAAU,KAAK,kBAAkB,GACzC8J,IAAK9J,EAAG,UAAU,KAAK,kBAAkB;AAE/C,cAAI6J,IAAKA,IAAKC,IAAKA,IAAK,EAAG;AAC3B,eAAK,YAAY;AAAA,QACnB;AACA,aAAK,0BAA0B9J,EAAG,SAASA,EAAG,OAAO;AAAA;AAAA,IACvD,GAEA,KAAQ,kBAAkB,CAACA,MAAqB;AAC9C,UAAI,KAAK,gBAAgB,KAAK,YAAY;AACxC,cAAMzI,IAAM,KAAK,YACXwS,IAAc,KAAK,mBAAmBxS,EAAI;AAChD,aAAK,eAAe,IACpB,KAAK,aAAa,MAClB,KAAK,kBAAkB,MACvB,KAAK,KAAK,QAAQ,sBAAsB,IACpC,KAAK,qBAAqB,SAC5B,KAAK,KAAK,MAAM,SAAS,KAAK,kBAC9B,KAAK,mBAAmB,OAE1B,KAAK,eAAA;AACL,YAAI;AACD,UAAAyI,EAAG,QAA2B,wBAAwBA,EAAG,SAAS;AAAA,QACrE,QAAQ;AAAA,QAER;AACA,aAAK,WAAWzI,GAAKwS,CAAW,GAChC,KAAK,oBAAoB;AACzB;AAAA,MACF;AACA,UAAI,CAAC,KAAK,SAAU;AACpB,WAAK,WAAW,IAChB,KAAK,YAAY;AACjB,YAAMC,IAAwB,KAAK;AACnC,WAAK,oBAAoB,MACzB,KAAK,YAAY,IACjB,KAAK,uBAAuB,IAC5B,KAAK,eAAA;AACL,UAAI;AACD,QAAAhK,EAAG,QAA2B,wBAAwBA,EAAG,SAAS;AAAA,MACrE,QAAQ;AAAA,MAER;AAEA,UADIgK,WAA4B,oBAAoB,KAChD,KAAK,qBAEH,KAAK,cAAc,KAAK,WAAW,WAAW,MAAM;AACtD,cAAMlD,IAAU,KAAK,UAAU,QAAQ,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM;AACpF,aAAK,oBAAoB,KAAK,sBAAsBA,CAAO,CAAC;AAAA,MAC9D;AAAA,IAEJ,GAoEA,KAAQ,sBAAsB,CAAC9G,MAAuB;AACpD,UAAI,CAAC,KAAK,cAAe;AACzB,YAAMiK,IAAU,KAAK,+BAAA;AACrB,MAAKA,MACLjK,EAAG,eAAA,GACHA,EAAG,eAAe,QAAQ,cAAciK,EAAQ,IAAI,GACpDjK,EAAG,eAAe,QAAQ,6BAA6BiK,EAAQ,IAAI,GACnEjK,EAAG,eAAe,QAAQ,aAAaiK,EAAQ,IAAI,GACnD,KAAK,cAAc,UAAUA,EAAQ,SAAS,UAAU,MAAM;AAAA,IAChE,GAEA,KAAQ,qBAAqB,CAACjK,MAAuB;AACnD,UAAI,CAAC,KAAK,cAAe;AACzB,YAAMiK,IAAU,KAAK,+BAAA;AACrB,MAAKA,MACLjK,EAAG,eAAA,GACHA,EAAG,eAAe,QAAQ,cAAciK,EAAQ,IAAI,GACpDjK,EAAG,eAAe,QAAQ,6BAA6BiK,EAAQ,IAAI,GACnEjK,EAAG,eAAe,QAAQ,aAAaiK,EAAQ,IAAI,GACnD,KAAK,qBAAA;AAAA,IACP,GAEA,KAAQ,uBAAuB,CAACjK,MAAuB;AACrD,UAAI,CAAC,KAAK,cAAe;AACzB,MAAAA,EAAG,eAAA;AACH,YAAMkK,IAAOlK,EAAG,eAAe,QAAQ,WAAW,KAAK,IACjDmK,IAAMnK,EAAG,eAAe,QAAQ,2BAA2B,KAAK,IAChE1B,IAAO0B,EAAG,eAAe,QAAQ,YAAY,KAAK,IAClDoK,IAAO,KAAK,mBAAmB,EAAE,MAAAF,GAAM,KAAAC,GAAK,MAAA7L,GAAM;AACxD,MAAK8L,KACL,KAAK,mBAAmBA,CAAI;AAAA,IAC9B,GAEA,KAAQ,kCAAkC,CAACpK,MAA0B;AACnE,UAAI,CAAC,KAAK,cAAe;AACzB,YAAMqK,IAAK,KAAK;AAChB,UAAI,GAACA,KAAMA,EAAG,WAAW,OAEzB;AAAA,YAAI,KAAK,eAAeA,EAAG,OAAOA,EAAG,MAAM,GAAG;AAI5C,UAAArK,GAAI,iBAAA,GACJA,GAAI,kBAAA;AACJ,gBAAM8G,IAAU,KAAK,UAAU,QAAQuD,EAAG,OAAOA,EAAG,MAAM,GACpDC,IAAc,KAAK,sBAAsBxD,CAAO;AACtD,eAAK,uBAAA,GACL,KAAK,oBAAoBwD,CAAW;AACpC;AAAA,QACF;AAEA,aAAK,gBAAgB,IACrB,KAAK,uBAAA,GACL,KAAK,uBAAA;AAAA;AAAA,IACP,GAEA,KAAQ,6BAA6B,CAACtK,MAAmB;AACvD,UAAI,CAAC,KAAK,cAAe;AACzB,YAAMqK,IAAK,KAAK;AAChB,UAAI,GAACA,KAAMA,EAAG,WAAW,SACpB,KAAK,eAAeA,EAAG,OAAOA,EAAG,MAAM,GAG5C;AAAA,QAAArK,EAAG,eAAA;AACH,YAAI;AACF,gBAAM8G,IAAU,KAAK,UAAU,QAAQuD,EAAG,OAAOA,EAAG,MAAM,GACpDC,IAAc,KAAK,sBAAsBxD,CAAO,GAChDyD,IAAQ,KAAK,qBAAA;AACnB,UAAAA,EAAM,QAAQD,GACdC,EAAM,OAAA;AAAA,QACR,QAAQ;AAAA,QAER;AAAA;AAAA,IACF,GA6DA,KAAQ,yBAAyB,OAAOvK,MAAsB;AAM5D,UALI,CAAC,KAAK,iBACN,CAAC,KAAK,cACNA,EAAG,eAAe,KAAK,aAIzBA,EAAG,QAAQ,WACXA,EAAG,QAAQ,aACXA,EAAG,QAAQ,SACXA,EAAG,QAAQ,UACXA,EAAG,QAAQ,cACXA,EAAG,QAAQ,aACXA,EAAG,QAAQ;AAEX;AAGF,YAAMwK,IAAQ,OAAO,YAAc,OAAe,OAAO,KAAK,UAAU,QAAQ;AAEhF,UADcA,IAAQxK,EAAG,UAAUA,EAAG,SAC3B;AACT,cAAMxH,IAAMwH,EAAG,IAAI,YAAA;AACnB,YAAIxH,MAAQ,KAAK;AACf,UAAAwH,EAAG,eAAA,GACCwK,KAASxK,EAAG,WAAU,KAAK,OAAA,SACrB,OAAA,GACV,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAIxH,MAAQ,KAAK;AACf,UAAAwH,EAAG,eAAA,GACH,KAAK,OAAA,GACL,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAIxH,MAAQ,KAAK;AACf,UAAAwH,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,GACX,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAIxH,MAAQ,KAAK;AACf,UAAAwH,EAAG,eAAA,GACH,MAAM,KAAK,cAAA,GACX,KAAK,qBAAA,GACL,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAIxH,MAAQ,KAAK;AAEf,eAAK,kBAAkB;AACvB;AAAA,QACF;AAAA,MACF;AAEA,UAAIwH,EAAG,QAAQ,OAAO,KAAK,WAAW,WAAW,MAAM;AACrD,cAAMlT,IAAM,KAAK,WAAW,KAAK,WAAW,MAAM;AAClD,YAAIA,GAAK,SAAS,YAAYA,GAAK,SAAS,QAAQ;AAClD,UAAAkT,EAAG,eAAA,GACH,KAAK,kBAAkB,KAAK,WAAW,OAAO,KAAK,WAAW,QAAQlT,EAAI,IAAI,GAC9E,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,YAAIA,GAAK,SAAS,WAAW;AAC3B,UAAAkT,EAAG,eAAA,GACH,KAAK,cAAc,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GAChE,KAAK,kBAAkB;AACvB;AAAA,QACF;AACA,aAAK,kBAAkB;AACvB;AAAA,MACF;AAEA,YAAMyK,IAAQzK,EAAG,QAAQ,OACnB0K,IAAU1K,EAAG,QAAQ,SACrB2K,IACJ3K,EAAG,QAAQ,eACXA,EAAG,QAAQ,gBACXA,EAAG,QAAQ,aACXA,EAAG,QAAQ;AACb,UAAIyK,KAASC,KAAWC,GAAS;AAG/B,YAFA3K,EAAG,eAAA,GACH,KAAK,uBAAA,GACDyK,GAAO;AACT,eAAK,eAAe,GAAGzK,EAAG,WAAW,KAAK,GAAG,EAAK;AAClD;AAAA,QACF;AACA,YAAI0K,GAAS;AACX,eAAK,eAAe1K,EAAG,WAAW,KAAK,GAAG,GAAG,EAAK;AAClD;AAAA,QACF;AACA,cAAM4K,IAAS5K,EAAG;AAClB,QAAIA,EAAG,QAAQ,mBAAkB,eAAe,GAAG,IAAI4K,CAAM,IACpD5K,EAAG,QAAQ,oBAAmB,eAAe,GAAG,GAAG4K,CAAM,IACzD5K,EAAG,QAAQ,iBAAgB,eAAe,IAAI,GAAG4K,CAAM,IACvD5K,EAAG,QAAQ,oBAAkB,eAAe,GAAG,GAAG4K,CAAM;AACjE;AAAA,MACF;AAEA,UACE,KAAK,WAAW,WAAW,QAC3B,KAAK,eAAe,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GACjE;AACA,QAAA5K,EAAG,eAAA,GACH,KAAK,kBAAkB;AACvB;AAAA,MACF;AAEA,WAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,uBAAA,GAEL,KAAK,uBAAA;AAAA,IACP,GA2YA,KAAQ,cAAc,CAACA,MAAmB;AAKxC,UAJIA,EAAG,WAAW,KAGPA,EAAG,QACN,QAAQ,kCAAkC;AAChD;AAEF,UAAI,KAAK,mBAAmB;AAC1B,aAAK,oBAAoB;AACzB;AAAA,MACF;AAIA,UAHI,KAAK,WAAWA,EAAG,UAAU,KAAK,QAAQ,SAASA,EAAG,MAAc,KAGpE,KAAK,WAAW,KAAK,cAAc,KAAK,WAAW,WAAW,QAC5D,CAAC,KAAK;AAAyB;AAErC,YAAMuF,IACJ,OAAO,SAAS,oBAAqB,aACjC,KAAK,oBAAoBvF,EAAG,SAASA,EAAG,OAAO,IAC/C,KAAK,QAAQA,CAAE;AACrB,UAAI,CAACuF,EAAK;AACV,YAAMhF,IAAY,KAAK,YAAY,KAAK,UAAUP,CAAE,IAAI;AACxD,UAAIO;AAIF,YAHK,WAAqD,2BACxD,QAAQ,IAAI,mCAAmCA,CAAS,GAEtDA,EAAU,SAAS;AAErB,cADgB,KAAK,eAAeA,EAAU,OAAOA,EAAU,QAAQA,EAAU,QAAQ,GAC5E;AACX,YAAAP,EAAG,eAAA;AACH;AAAA,UACF;AAAA,mBAEkB,KAAK,kBAAkBO,EAAU,OAAOA,EAAU,QAAQA,EAAU,IAAI,GAC3E;AACb,UAAAP,EAAG,eAAA;AACH;AAAA,QACF;AAAA,YAEJ,CAAY,WAAqD,2BAC/D,QAAQ,IAAI,mCAAmC,IAAI;AAErD,YAAM6K,IACJ,KAAK,iBACL,CAAC7K,EAAG,YACJ,CAACA,EAAG,WACJ,CAACA,EAAG,WACJ,KAAK,YAAY,UAAUuF,EAAI,SAC/B,OAAO,KAAK,YAAY,MAAM,MAAM,OAAOA,EAAI,MAAM;AACvD,UAAIA,EAAI,UAAU,aAAaA,EAAI,WAAW,WAAW;AACvD,cAAM/Y,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA;AAC5B,aAAK,cAAc,EAAK,GACpBA,EAAK,UAAUD,EAAO,QAAQ,UAChC,KAAK,kBAAkB;AAAA,UACrB;AAAA,YACE,MAAM;AAAA,YACN,UAAU;AAAA,YACV,QAAQC,EAAK,SAAS;AAAA,YACtB,UAAU;AAAA,YACV,QAAQD,EAAO,QAAQ,SAAS;AAAA,UAAA;AAAA,QAClC,GAEF,KAAK,aAAa,EAAE,OAAO,WAAW,QAAQ,UAAA,GAC9C,KAAK,eAAe,WAAW,SAAS,GACxC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACL,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE,MAE3B,KAAK,aAAa,MAClB,KAAK,eAAe,WAAW,SAAS,GACxC,KAAK,kBAAkB;AAEzB;AAAA,MACF;AAEA,UADA,KAAK,YAAY+Y,EAAI,KAAK,GACtBA,EAAI,UAAU,cAAc;AAC9B,cAAM/Y,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBG,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOqY,EAAI,MAAM,CAAC;AACrF,QAAI9Y,EAAK,UAAUG,KAAY,MAC7B,KAAK,kBAAkB;AAAA,UACrB;AAAA,YACE,MAAM;AAAA,YACN,UAAU;AAAA,YACV,QAAQH,EAAK,SAAS;AAAA,YACtB,UAAUG;AAAA,YACV,QAAQA;AAAA,UAAA;AAAA,QACV,GAEF,KAAK,aAAa,EAAE,OAAOH,EAAK,CAAC,EAAE,IAAI,QAAQ8Y,EAAI,OAAA,GACnD,KAAK,eAAe,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GACjE,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACL,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAE7B;AAAA,MACF;AAEA,UADA,KAAK,sBAAsBvF,GAAIuF,CAAG,GAC9BA,EAAI,WAAW,QAAQA,EAAI,WAAW,WAAW;AACnD,aAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AACA,UAAIA,EAAI,UAAU,cAAc;AAC9B,aAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AACA,UAAI,KAAK,eAAeA,EAAI,OAAOA,EAAI,MAAM,GAAG;AAC9C,aAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK;AACxB,cAAMuB,IAAU,KAAK,UAAU,QAAQvB,EAAI,OAAOA,EAAI,MAAM;AAC5D,aAAK,oBAAoB,KAAK,sBAAsBuB,CAAO,CAAC;AAC5D;AAAA,MACF;AAGA,UAFY,KAAK,WAAWvB,EAAI,MAAM,GACf,SAAS,WACjB;AACb,cAAMuF,IACJ,KAAK,iBAAiB,UAAUvF,EAAI,SACpC,OAAO,KAAK,iBAAiB,MAAM,MAAM,OAAOA,EAAI,MAAM;AAM5D,YALA,KAAK,kBAAkB,EAAE,OAAOA,EAAI,OAAO,QAAQA,EAAI,OAAA,GACvD,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK,GACxB,KAAK,uBAAA,GACDuF,GAAe;AACjB,eAAK,cAAcvF,EAAI,OAAOA,EAAI,MAAM,GAExC,KAAK,oBAAoB,EAAE;AAC3B;AAAA,QACF;AAEA,aAAK,oBAAoB,EAAE;AAC3B;AAAA,MACF;AACA,WAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK;AACxB,YAAMuB,IAAU,KAAK,UAAU,QAAQvB,EAAI,OAAOA,EAAI,MAAM,GACtD+E,IAAc,KAAK,sBAAsBxD,CAAO;AACtD,WAAK,oBAAoBwD,CAAW,GAChCO,MACF,KAAK,gBAAgB,IACrB,KAAK,uBAAA,GACL,KAAK,uBAAA;AAAA,IAET,GA2FA,KAAQ,oBAAoB,CAAC7K,MAAmB;AAC9C,YAAMxG,IAASwG,EAAG;AAClB,UAAIA,EAAG,SAAS;AACd,QAAAA,EAAG,eAAA;AACH;AAAA,MACF;AACA,UAAI,CAACxG,KAAU,CAAC,KAAK,KAAK,SAASA,CAAM,EAAG;AAC5C,MAAAwG,EAAG,eAAA,GACHA,EAAG,gBAAA;AACH,YAAMuF,IAAM,KAAK,QAAQvF,CAAE,GACrBhT,IAAQuY,GAAK,SAAS,MACtBtY,IAASsY,GAAK,UAAU;AAC9B,WAAK,cAAcvY,GAAOC,GAAQ+S,EAAG,SAASA,EAAG,OAAO;AAAA,IAC1D,GAj5DE,KAAK,OAAO9F,GACZ,KAAK,WAAW5C,GAChB,KAAK,SAASmR,GACd,KAAK,cAAcC,GACnB,KAAK,SAASC,GACd,KAAK,UAAUC,GACf,KAAK,YAAYC,GACjB,KAAK,gBAAgBC,GACrB,KAAK,iBAAiBC,GACtB,KAAK,eAAeC,GACpB,KAAK,gBAAgBE,GACrB,KAAK,KAAA;AAAA,EACP;AAAA,EAEA,YAAY9b,GAAgB;AAC1B,SAAK,WAAWA;AAAA,EAClB;AAAA,EAEA,uBAAuB;AACrB,UAAMZ,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA;AAC5B,QAAI,CAACA,EAAK,UAAU,CAACD,EAAO,QAAQ,QAAQ;AAC1C,WAAK,kBAAkB,CAAA,GACvB,KAAK,aAAa,MAClB,KAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAI,GACvB,KAAK,eAAe,MAAM,IAAI,GAC9B,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA;AACL;AAAA,IACF;AAEA,UAAMue,IAASte,EAAK,SAAS,GACvBue,IAASxe,EAAO,QAAQ,SAAS,GAEjC4K,IAAc,KAAK,YAAY,SAAS,MACxCC,IAAe,KAAK,YAAY,UAAU,MAC1C4T,IAAiB7T,IAAc,KAAK,UAAU,YAAYA,CAAW,IAAI,IACzE8T,IACJ7T,MAAiB,OACb7K,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOmK,CAAY,CAAC,IACtE;AAGN,QAAI4T,KAAkB,KAAKC,KAAkB,GAAG;AAC9C,UAAI7E,IAAU;AACd,UAAI,CAAC,KAAK,gBAAgB;AACxB,aAAK,kBAAkB;AAAA,UACrB;AAAA,YACE,MAAM;AAAA,YACN,UAAU4E;AAAA,YACV,QAAQA;AAAA,YACR,UAAUC;AAAA,YACV,QAAQA;AAAA,UAAA;AAAA,QACV,GAEF7E,IAAU;AAAA,WACL;AACL,cAAM8E,IAA+B,KAAK,gBAAgB,IAAI,CAACnd,MAAM;AACnE,gBAAMod,IAAQ,CAACvd,GAAWwd,MAAgB,KAAK,IAAI,GAAG,KAAK,IAAIA,GAAKxd,CAAC,CAAC,GAChE4I,IAAuB;AAAA,YAC3B,GAAGzI;AAAA,YACH,UAAUod,EAAMpd,EAAE,UAAU+c,CAAM;AAAA,YAClC,QAAQK,EAAMpd,EAAE,QAAQ+c,CAAM;AAAA,YAC9B,UAAUK,EAAMpd,EAAE,UAAUgd,CAAM;AAAA,YAClC,QAAQI,EAAMpd,EAAE,QAAQgd,CAAM;AAAA,UAAA;AAEhC,kBACEvU,EAAK,aAAazI,EAAE,YACpByI,EAAK,WAAWzI,EAAE,UAClByI,EAAK,aAAazI,EAAE,YACpByI,EAAK,WAAWzI,EAAE,YAElBqY,IAAU,KAEL5P;AAAA,QACT,CAAC;AACD,aAAK,kBAAkB0U;AAAA,MACzB;AACA,MAAI9E,KAAS,KAAK,kBAAkB,KAAK,eAAe,GACxD,KAAK,qBAAA;AACL;AAAA,IACF;AAGA,UAAMiF,IAAgBjU,KAAgB7K,EAAO,QAAQ,CAAC,GAAG,OAAO;AAChE,QAAII,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOoe,CAAa,CAAC;AACtF,IAAI1e,IAAW,MAAGA,IAAW;AAC7B,UAAMK,IAAST,EAAO,QAAQI,CAAQ,GAAG,OAAO,IAE1C2e,IAAYnU,IAAc,KAAK,UAAU,gBAAgBA,CAAW,IAAI,GACxEoU,IAAc/e,EAAKA,EAAK,SAAS,CAAC,KAAKA,EAAK,CAAC,KAAK,MAClDgf,IACJhf,EAAK,KAAK,CAACuB,MAAM,KAAK,UAAU,gBAAgBA,EAAE,EAAE,KAAKud,CAAS,KAAKC;AACzE,QAAI,CAACC,EAAS;AACd,UAAMze,IAAQye,EAAQ,IAChB9e,IAAW,KAAK,UAAU,YAAYK,CAAK;AAEjD,SAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK,GACxB,KAAK,kBAAkB;AAAA,MACrB;AAAA,QACE,MAAM;AAAA,QACN,UAAUL;AAAA,QACV,QAAQA;AAAA,QACR,UAAUC;AAAA,QACV,QAAQA;AAAA,MAAA;AAAA,IACV,GAEF,KAAK,aAAa,EAAE,OAAAI,GAAO,QAAAC,EAAA,GAC3B,KAAK,eAAeD,GAAOC,CAAM,GACjC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,kBAAkBD,GAAOC,CAAM;AACpC,UAAM6Z,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM;AACpD,SAAK,oBAAoB,KAAK,sBAAsB6Z,CAAO,CAAC,GAC5D,KAAK,qBAAA;AAAA,EACP;AAAA,EAEA,eAAe9Z,GAAeC,GAAgB;AAC5C,UAAMT,IAAS,KAAK,UAAU,UAAA,GACxBG,IAAW,KAAK,UAAU,YAAYK,CAAK,GAC3CJ,IAAWJ,EAAO,QAAQ,UAAU,CAAC,MAAM,OAAO,EAAE,GAAG,MAAM,OAAOS,CAAM,CAAC;AACjF,QAAIN,IAAW,KAAKC,IAAW,EAAG;AAClC,SAAK,kBAAkB,MACvB,KAAK,kBAAkB,MACvB,KAAK,cAAc,EAAK;AACxB,UAAM8e,IAA4B;AAAA,MAChC,MAAM;AAAA,MACN,UAAU/e;AAAA,MACV,QAAQA;AAAA,MACR,UAAUC;AAAA,MACV,QAAQA;AAAA,IAAA;AAEV,SAAK,kBAAkB,CAAC8e,CAAS,GACjC,KAAK,aAAa,EAAE,OAAA1e,GAAO,QAAAC,EAAA,GAC3B,KAAK,eAAeD,GAAOC,CAAM,GACjC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,kBAAkBD,GAAOC,CAAM;AACpC,UAAM6Z,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM;AACpD,SAAK,oBAAoB,KAAK,sBAAsB6Z,CAAO,CAAC,GAC5D,KAAK,qBAAA;AAAA,EACP;AAAA,EAEA,gBAAgB;AACd,SAAK,cAAc,EAAI;AAAA,EACzB;AAAA,EAEA,UAAU;AACR,SAAK,KAAK,oBAAoB,SAAS,KAAK,WAAW,GACvD,KAAK,KAAK,oBAAoB,eAAe,KAAK,iBAAiB,GACnE,KAAK,KAAK,oBAAoB,eAAe,KAAK,iBAAiB,GACnE,KAAK,KAAK,oBAAoB,aAAa,KAAK,eAAe,GAC/D,KAAK,KAAK,oBAAoB,iBAAiB,KAAK,eAAe,GACnE,KAAK,KAAK,oBAAoB,WAAW,KAAK,iBAAiB,GAC3D,KAAK,6BACP,SAAS,oBAAoB,eAAe,KAAK,2BAA2B,EAAI,GAElF,KAAK,cAAc,EAAI,GACvB,KAAK,uBAAA,GACL,KAAK,kBAAA,GACL,KAAK,eAAA;AAAA,EACP;AAAA,EAEA,SAASzF,GAAmBC,GAAoB;AAI9C,SAAK,kBAAA;AAAA,EACP;AAAA,EAEQ,OAAO;AACb,SAAK,KAAK,iBAAiB,SAAS,KAAK,WAAW,GACpD,KAAK,KAAK,iBAAiB,eAAe,KAAK,iBAAiB,GAChE,KAAK,KAAK,iBAAiB,eAAe,KAAK,iBAAiB,GAChE,KAAK,KAAK,iBAAiB,aAAa,KAAK,eAAe,GAC5D,KAAK,KAAK,iBAAiB,iBAAiB,KAAK,eAAe,GAChE,KAAK,KAAK,iBAAiB,WAAW,KAAK,iBAAiB,GAC5D,KAAK,4BAA4B,CAACtB,MAAmB,KAAK,kBAAkBA,CAAE,GAC9E,SAAS,iBAAiB,eAAe,KAAK,2BAA2B,EAAE,SAAS,IAAM;AAAA,EAC5F;AAAA,EAEQ,uBAAuB;AAC7B,UAAM3I,IAAe,KAAK,YAAY,UAAU,MAC1CD,IAAc,KAAK,YAAY,SAAS;AAC9C,SAAK,KAAK,QAAQ,oBAAoBD;AAAA,MACpC,KAAK;AAAA,MACL,KAAK;AAAA,MACLC;AAAA,MACAC;AAAA,MACA,KAAK;AAAA,IAAA,IAEH,MACA;AAAA,EACN;AAAA,EAEQ,WAAWpK,GAAgB;AAEjC,WADe,KAAK,UAAU,UAAA,EAChB,QAAQ,KAAK,CAACC,MAAMA,EAAE,QAAQD,CAAM;AAAA,EACpD;AAAA,EAEQ,KAAKY,GAAW;AACtB,WAAO,OAAOA,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,EAClC;AAAA,EAEQ,wBAAwBoH,GAAS;AACvC,WAAO,GAAGA,EAAE,YAAA,CAAa,IAAI,KAAK,KAAKA,EAAE,SAAA,IAAa,CAAC,CAAC,IAAI,KAAK,KAAKA,EAAE,QAAA,CAAS,CAAC;AAAA,EACpF;AAAA,EAEQ,wBAAwBA,GAAS;AACvC,WAAO,GAAG,KAAK,KAAKA,EAAE,SAAA,CAAU,CAAC,IAAI,KAAK,KAAKA,EAAE,WAAA,CAAY,CAAC;AAAA,EAChE;AAAA,EAEQ,4BAA4BA,GAAS;AAC3C,WAAO,GAAG,KAAK,wBAAwBA,CAAC,CAAC,IAAI,KAAK,wBAAwBA,CAAC,CAAC;AAAA,EAC9E;AAAA,EAEQ,8BAA8B0W,GAAuCC,GAAiB;AAC5F,UAAMrW,IAAQqW,EAAQ,KAAA;AACtB,QAAI,CAACrW,EAAO,QAAO;AAEnB,QAAIoW,MAAY,QAAQ;AACtB,YAAMlZ,IAAI8C,EAAM,MAAM,sBAAsB;AAC5C,UAAI9C,EAAG,QAAOA,EAAE,CAAC,KAAK;AACtB,YAAMwC,IAAI,IAAI,KAAKM,CAAK;AACxB,aAAK,OAAO,MAAMN,EAAE,QAAA,CAAS,IACtB,KADgC,KAAK,wBAAwBA,CAAC;AAAA,IAEvE;AAEA,QAAI0W,MAAY,QAAQ;AACtB,YAAMlZ,IAAI8C,EAAM,MAAM,0BAA0B;AAChD,UAAI9C,EAAG,QAAOA,EAAE,CAAC,KAAK;AACtB,YAAMwC,IAAI,IAAI,KAAKM,CAAK;AACxB,aAAK,OAAO,MAAMN,EAAE,QAAA,CAAS,IACtB,KADgC,KAAK,wBAAwBA,CAAC;AAAA,IAEvE;AAGA,QAAI,KAAK,KAAKM,CAAK,KAAK,iCAAiC,KAAKA,CAAK;AACjE,aAAOA,EAAM,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE;AAE5C,QACE,gDAAgD,KAAKA,CAAK,KAC1D,CAAC,mBAAmB,KAAKA,CAAK;AAE9B,aAAOA,EAAM,MAAM,GAAG,EAAE;AAE1B,UAAMN,IAAI,IAAI,KAAKM,CAAK;AACxB,WAAK,OAAO,MAAMN,EAAE,QAAA,CAAS,IACtB,KADgC,KAAK,4BAA4BA,CAAC;AAAA,EAE3E;AAAA,EAEQ,kBAAkB;AACxB,QAAI,KAAK,YAAa,QAAO,KAAK;AAGlC,IADiB,OAAO,iBAAiB,KAAK,IAAI,EACrC,aAAa,aACxB,KAAK,KAAK,MAAM,WAAW;AAE7B,UAAM4W,IAAQ,SAAS,cAAc,KAAK;AAC1C,WAAAA,EAAM,YAAY,iBAClBA,EAAM,QAAQ,mBAAmB,KACjCA,EAAM,MAAM,WAAW,YACvBA,EAAM,MAAM,OAAO,KACnBA,EAAM,MAAM,MAAM,KAClBA,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,UAAU,QAEtBA,EAAM,MAAM,SAAS,KACrB,KAAK,KAAK,YAAYA,CAAK,GAC3B,KAAK,cAAcA,GACZA;AAAA,EACT;AAAA,EAEQ,oBAAoB;AAK1B,IAJI,KAAK,mBACP,OAAO,aAAa,KAAK,cAAc,GACvC,KAAK,iBAAiB,OAEnB,KAAK,gBACV,KAAK,YAAY,MAAM,UAAU,QACjC7Q,EAAiB,KAAK,WAAW,GACjC,KAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,CAAC,KAAK,YAAa;AACvB,UAAMlJ,IAAI,KAAK,YAAY,eAAe,GACpCgD,IAAI,KAAK,YAAY,gBAAgB,GACrCgX,IAAQ,IACRC,IAAU,KAAK,IAAI,GAAG,KAAK,KAAK,aAAa,KAAK,KAAK,cAAcja,IAAIga,CAAK,GAC9EE,IAAS,KAAK,IAAI,GAAG,KAAK,KAAK,YAAY,KAAK,KAAK,eAAelX,IAAIgX,CAAK,GAC7EG,IAAU,KAAK,IAAI,GAAG,KAAK,KAAK,aAAaH,CAAK,GAClDI,IAAS,KAAK,IAAI,GAAG,KAAK,KAAK,YAAYJ,CAAK,GAChDnG,IAAW,KAAK,KAAK,sBAAA,GACrBzO,IAAO,KAAK,kBAAA;AAClB,QAAIA,GAAM;AACR,YAAMiV,IAAgBjV,EAAK,QAAQyO,EAAS,OAAO,KAAK,KAAK,aAAa7T,IAAI,GACxEsa,IAAelV,EAAK,MAAMyO,EAAS,MAAM,KAAK,KAAK,YAAY7Q,IAAI,GACnE+N,IAAO,KAAK,IAAIkJ,GAAS,KAAK,IAAIE,GAASE,CAAa,CAAC,GACzDrJ,IAAM,KAAK,IAAIkJ,GAAQ,KAAK,IAAIE,GAAQE,CAAY,CAAC;AAC3D,WAAK,YAAY,MAAM,OAAO,GAAGvJ,CAAI,MACrC,KAAK,YAAY,MAAM,MAAM,GAAGC,CAAG;AACnC;AAAA,IACF;AACA,SAAK,YAAY,MAAM,OAAO,GAAGiJ,CAAO,MACxC,KAAK,YAAY,MAAM,MAAM,GAAGC,CAAM;AAAA,EACxC;AAAA,EAEQ,cAAcK,GAAiBC,IAA4B,QAAQC,IAAa,MAAM;AAC5F,UAAMV,IAAQ,KAAK,gBAAA;AACnB,IAAAA,EAAM,cAAcQ,GACpBR,EAAM,QAAQ,UAAUS,GACxBT,EAAM,MAAM,UAAU,SACtB,KAAK,kBAAA,GACD,KAAK,mBACP,OAAO,aAAa,KAAK,cAAc,GACvC,KAAK,iBAAiB,OAExB,KAAK,iBAAiB,OAAO,WAAW,MAAM;AAC5C,MAAAA,EAAM,MAAM,UAAU;AAAA,IACxB,GAAGU,CAAU;AAAA,EACf;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,KAAK,eAAgB,QAAO,KAAK;AACrC,UAAMhC,IAAQ,SAAS,cAAc,OAAO;AAC5C,WAAAA,EAAM,OAAO,QAGbA,EAAM,WAAW,IAEjBA,EAAM,YAAY,QAClBA,EAAM,eAAe,OACrBA,EAAM,aAAa,IACnBA,EAAM,MAAM,WAAW,YACvBA,EAAM,MAAM,OAAO,KACnBA,EAAM,MAAM,MAAM,KAElBA,EAAM,MAAM,YAAY,0BACxBA,EAAM,MAAM,QAAQ,OACpBA,EAAM,MAAM,SAAS,OACrBA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,iBAAiB,WAAW,KAAK,sBAAsB,GAC7DA,EAAM,iBAAiB,eAAe,KAAK,0BAA0B,GACrEA,EAAM,iBAAiB,oBAAoB,KAAK,+BAA+B,GAC/EA,EAAM,iBAAiB,QAAQ,KAAK,mBAAmB,GACvDA,EAAM,iBAAiB,OAAO,KAAK,kBAAkB,GACrDA,EAAM,iBAAiB,SAAS,KAAK,oBAAoB,GACzDA,EAAM,iBAAiB,QAAQ,KAAK,mBAAmB,GAEvD,KAAK,KAAK,YAAYA,CAAK,GAC3B,KAAK,iBAAiBA,GACfA;AAAA,EACT;AAAA,EAEQ,oBAAoBiC,GAA2B;AACrD,UAAMjC,IAAQ,KAAK,qBAAA;AACnB,IAAAA,EAAM,QAAQiC,GACd,KAAK,gBAAgB,IACrBjC,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM,GACnCA,EAAM,OAAA;AAAA,EACR;AAAA,EAEQ,uBAAuBhS,GAG5B;AACD,QAAI,CAAC,KAAK,WAAY;AACtB,UAAM,EAAE,OAAAvL,GAAO,QAAAC,EAAA,IAAW,KAAK;AAC/B,QAAIA,MAAW,KAAM;AACrB,UAAMmO,IAAO,KAAK,oBAAoBpO,GAAOC,CAAM;AACnD,QAAImO,GAAM;AACR,WAAK,oBAAoBA,GAAMpO,GAAOC,GAAQsL,CAAO;AACrD;AAAA,IACF;AACA,UAAMrB,IAAO,KAAK,sBAAsBlK,GAAOC,CAAM;AACrD,IAAIiK,KACF,KAAK,iBAAiBA,GAAMlK,GAAOC,GAAQsL,CAAO;AAAA,EAEtD;AAAA,EAEQ,mBAAmBhD,GAAe;AAExC,UAAMkX,IADO,WAAuE,KAC9D;AACtB,WAAI,OAAOA,KAAa,aAAmBA,EAASlX,CAAK,IAElDA,EAAM,QAAQ,UAAU,MAAM;AAAA,EACvC;AAAA,EAEQ,oBAAoBvI,GAAeC,GAAuB;AAChE,QAAIA,MAAW,KAAM,QAAO;AAC5B,UAAMuL,IAAM,OAAOvL,CAAM,GACnByf,IAAW,KAAK,mBAAmB1f,CAAK,GACxC2f,IAAS,KAAK,mBAAmBnU,CAAG;AAC1C,WACE,KAAK,KAAK;AAAA,MACR,mBAAmBkU,CAAQ,uBAAuBC,CAAM;AAAA,IAAA,KACrD;AAAA,EAET;AAAA,EAEQ,sBAAsB3f,GAAeC,GAAuB;AAClE,QAAIA,MAAW,KAAM,QAAO;AAC5B,UAAM2f,IAAM,KAAK,4BAA4B5f,GAAOC,CAAM;AAC1D,QAAI,CAAC2f,EAAK,QAAO;AACjB,UAAMjH,IAAW,KAAK,KAAK,sBAAA;AAC3B,WAAO,IAAI;AAAA,MACTA,EAAS,OAAOiH,EAAI,OAAO,KAAK,KAAK;AAAA,MACrCjH,EAAS,MAAMiH,EAAI,MAAM,KAAK,KAAK;AAAA,MACnCA,EAAI;AAAA,MACJA,EAAI;AAAA,IAAA;AAAA,EAER;AAAA,EAEQ,4BAA4B5f,GAAeC,GAAgB;AAIjE,WAHe,KAAK,KAAK;AAAA,MACvB;AAAA,IAAA,IAGK,KAAK,qBAAqBD,GAAOC,CAAM,IAD1B;AAAA,EAEtB;AAAA,EAEQ,qBAAqBD,GAAeC,GAAgB;AAC1D,UAAMT,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA,GACtBlL,IAAO,KAAK,UAAU,SAAA,GACtBE,IAAWF,EAAK,UAAU,CAACuB,MAAMA,EAAE,OAAOhB,CAAK,GAC/CJ,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOD,CAAM,CAAC;AACjF,QAAIN,IAAW,KAAKC,IAAW,EAAG,QAAO;AAEzC,UAAMuY,IAAepF,IACf8M,IAAiB5S,IACjB6S,IAAmB9S,IACnBO,IAAYC,EAAgBhO,GAAQmL,CAAI;AAE9C,QAAIkL,IAAOgK;AACX,aAASxe,IAAI,GAAGA,IAAIzB,GAAUyB,KAAK,EAAG,CAAAwU,KAAQtI,EAAUlM,CAAC,KAAK;AAE9D,QAAIyU,IAAMqC;AACV,aAAS9W,IAAI,GAAGA,IAAI1B,GAAU0B,KAAK,GAAG;AACpC,YAAMxB,IAAMJ,EAAK4B,CAAC;AAClB,UAAI,CAACxB,EAAK,QAAO;AACjB,YAAMiI,IAAI,KAAK,UAAU,aAAajI,EAAI,EAAE,KAAKigB;AACjD,MAAAhK,KAAOhO;AAAA,IACT;AACA,UAAMc,IAAS,KAAK,UAAU,aAAa5I,CAAK,KAAK8f,GAC/CnX,IAAQ4E,EAAU3N,CAAQ,KAAK;AACrC,WAAO,EAAE,MAAAiW,GAAM,KAAAC,GAAK,OAAAnN,GAAO,QAAAC,GAAQ,UAAAjJ,GAAU,UAAAC,EAAA;AAAA,EAC/C;AAAA,EAEQ,oBAAoB;AAC1B,UAAMmgB,IAAS,KAAK;AACpB,QAAI,CAACA,EAAQ,QAAO;AACpB,UAAMpH,IAAW,KAAK,KAAK,sBAAA,GACrBnZ,IAAS,KAAK,UAAU,UAAA,GACxBmL,IAAO,KAAK,UAAU,QAAA;AAC5B,QAAIoV,EAAO,UAAU,aAAaA,EAAO,WAAW;AAClD,aAAO,IAAI,QAAQpH,EAAS,MAAMA,EAAS,KAAK1L,IAAqB8F,EAAgB;AAEvF,QAAIgN,EAAO,UAAU,gBAAgBA,EAAO,WAAW,MAAM;AAC3D,YAAMvU,IAAM,KAAK,mBAAmB,OAAOuU,EAAO,MAAM,CAAC,GACnDC,IAAW,KAAK,KAAK,cAA2B,oBAAoBxU,CAAG,IAAI;AACjF,UAAIwU,EAAU,QAAOA,EAAS,sBAAA;AAC9B,YAAMpgB,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAO6f,EAAO,MAAM,CAAC;AACxF,UAAIngB,KAAY,GAAG;AACjB,cAAM2N,IAAYC,EAAgBhO,GAAQmL,CAAI;AAC9C,YAAIhG,IAAIsI;AACR,iBAAS5L,IAAI,GAAGA,IAAIzB,GAAUyB,KAAK,EAAG,CAAAsD,KAAK4I,EAAUlM,CAAC,KAAK;AAC3D,cAAMsH,IAAQ4E,EAAU3N,CAAQ,KAAK;AACrC,eAAO,IAAI;AAAA,UACT+Y,EAAS,OAAOhU,IAAI,KAAK,KAAK;AAAA,UAC9BgU,EAAS;AAAA,UACThQ;AAAA,UACAoK;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AACA,QAAIgN,EAAO,WAAW,MAAM;AAC1B,YAAMpgB,IAAW,KAAK,UAAU,YAAYogB,EAAO,KAAK;AACxD,UAAIpgB,KAAY,GAAG;AACjB,YAAIiF,IAAImO;AACR,cAAMtT,IAAO,KAAK,UAAU,SAAA;AAC5B,iBAAS4B,IAAI,GAAGA,IAAI1B,GAAU0B,KAAK,GAAG;AACpC,gBAAMxB,IAAMJ,EAAK4B,CAAC;AAClB,cAAI,CAACxB,EAAK;AACV,UAAA+E,KAAK,KAAK,UAAU,aAAa/E,EAAI,EAAE,KAAKmN;AAAA,QAC9C;AACA,cAAMpE,IAAS,KAAK,UAAU,aAAamX,EAAO,KAAK,KAAK/S;AAC5D,eAAO,IAAI;AAAA,UACT2L,EAAS;AAAA,UACTA,EAAS,MAAM/T,IAAI,KAAK,KAAK;AAAA,UAC7BqI;AAAA,UACArE;AAAA,QAAA;AAAA,MAEJ;AAAA,IACF;AACA,QAAImX,EAAO,WAAW,KAAM,QAAO;AACnC,UAAME,IAAS,KAAK,oBAAoBF,EAAO,OAAOA,EAAO,MAAM;AACnE,WAAIE,IAAeA,EAAO,sBAAA,IACnB,KAAK,sBAAsBF,EAAO,OAAOA,EAAO,MAAM;AAAA,EAC/D;AAAA,EAEQ,kBAAkB/f,GAAeC,GAAgB;AACvD,UAAMigB,IAAW,KAAK,oBAAoBlgB,GAAOC,CAAM;AACvD,QAAIigB,GAAU;AACZ,MAAI,OAAQA,EAAyB,kBAAmB,cACrDA,EAAyB,eAAe,EAAE,OAAO,WAAW,QAAQ,WAAW;AAElF;AAAA,IACF;AACA,UAAMC,IAAU,KAAK,qBAAqBngB,GAAOC,CAAM;AACvD,QAAI,CAACkgB,EAAS;AACd,UAAMC,IAASD,EAAQ,MACjBE,IAAOF,EAAQ,OAAOA,EAAQ,OAC9BG,IAASH,EAAQ,KACjBI,IAAOJ,EAAQ,MAAMA,EAAQ,QAE7BK,IAAU,KAAK,KAAK,YACpBC,IAAW,KAAK,KAAK,aAAa,KAAK,KAAK,aAC5CC,IAAS,KAAK,KAAK,WACnBC,IAAY,KAAK,KAAK,YAAY,KAAK,KAAK;AAElD,IAAIP,IAASI,IAAS,KAAK,KAAK,aAAa,KAAK,IAAI,GAAGJ,CAAM,IACtDC,IAAOI,MAAU,KAAK,KAAK,aAAa,KAAK,IAAI,GAAGJ,IAAO,KAAK,KAAK,WAAW,IAErFC,IAASI,IAAQ,KAAK,KAAK,YAAY,KAAK,IAAI,GAAGJ,CAAM,IACpDC,IAAOI,MAAW,KAAK,KAAK,YAAY,KAAK,IAAI,GAAGJ,IAAO,KAAK,KAAK,YAAY;AAAA,EAC5F;AAAA,EAEQ,eAAeK,GAAkBC,GAAkBC,IAAkB,IAAO;AAClF,UAAMthB,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA;AAC5B,QAAI,CAACA,EAAK,UAAU,CAACD,EAAO,QAAQ,OAAQ;AAC5C,UAAM,EAAE,UAAAG,GAAU,UAAAC,MAAa,KAAK,iBAAA;AACpC,IAAKkhB,MAAiB,KAAK,kBAAkB;AAC7C,UAAMC,IACJD,KAAmB,KAAK,kBACpB,KAAK,kBACLA,IACE,EAAE,UAAAnhB,GAAU,UAAAC,EAAA,IACZ;AACR,IAAIkhB,KAAmB,CAAC,KAAK,yBAAsB,kBAAkB,EAAE,UAAAnhB,GAAU,UAAAC,EAAA;AACjF,UAAMohB,IAAe,KAAK,IAAI,GAAG,KAAK,IAAIvhB,EAAK,SAAS,GAAGE,IAAWihB,CAAQ,CAAC,GACzEK,IAAe,KAAK,IAAI,GAAG,KAAK,IAAIzhB,EAAO,QAAQ,SAAS,GAAGI,IAAWihB,CAAQ,CAAC;AACzF;AACE,YAAMhhB,IAAMJ,EAAKuhB,CAAY;AAC7B,UAAI,CAACnhB,EAAK;AACV,YAAMC,IAAMN,EAAO,QAAQyhB,CAAY;AACvC,UAAI,CAACnhB,EAAK;AACV,YAAME,IAAQH,EAAI,IACZI,IAASH,EAAI,KAEb4e,IAA4BqC,IAC9B;AAAA,QACE,MAAM;AAAA,QACN,UAAUA,EAAO;AAAA,QACjB,QAAQC;AAAA,QACR,UAAUD,EAAO;AAAA,QACjB,QAAQE;AAAA,MAAA,IAEV;AAAA,QACE,MAAM;AAAA,QACN,UAAUD;AAAA,QACV,QAAQA;AAAA,QACR,UAAUC;AAAA,QACV,QAAQA;AAAA,MAAA;AAEd,WAAK,kBAAkB,CAACvC,CAAS,GACjC,KAAK,aAAa,EAAE,OAAA1e,GAAO,QAAAC,EAAA,GAC3B,KAAK,eAAeD,GAAOC,CAAM,GACjC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,kBAAkBD,GAAOC,CAAM;AAEpC,YAAM6Z,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM,GAC9Cqd,IAAc,KAAK,sBAAsBxD,CAAO;AACtD,WAAK,oBAAoBwD,CAAW,GACpC,KAAK,qBAAA;AACL;AAAA,IACF;AAAA,EACF;AAAA,EAqIQ,oBAAoBtE,GAAiBC,GAAiB;AAE5D,QAAI,OAAO,SAAS,oBAAqB,WAAY,QAAO;AAC5D,UAAMpH,IAAK,SAAS,iBAAiBmH,GAASC,CAAO;AACrD,QAAIpH,KAAM,KAAK,KAAK,SAASA,CAAE,GAAG;AAChC,YAAM3D,IAAS2D,EAAG,QAAqB,mBAAmB;AAC1D,UAAI3D;AACF,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAASA;AAAA,UACT,MAAMA,EAAO,sBAAA;AAAA,QAAsB;AAGvC,YAAMC,IAAY0D,EAAG,QAAqB,4CAA4C;AACtF,UAAI1D,GAAW;AACb,cAAMtO,IAAMsO,EAAU,QAAqB,iBAAiB;AAC5D,YAAItO;AACF,iBAAO;AAAA,YACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,YAC5B,QAAQ;AAAA,YACR,SAASsO;AAAA,YACT,MAAMA,EAAU,sBAAA;AAAA,UAAsB;AAAA,MAG5C;AACA,YAAM+S,IAAYrP,EAAG,QAAqB,kBAAkB;AAC5D,UAAIqP;AACF,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQA,EAAU,QAAQ,UAAU;AAAA,UACpC,SAASA;AAAA,UACT,MAAMA,EAAU,sBAAA;AAAA,QAAsB;AAG1C,YAAM9S,IAAOyD,EAAG,QAAqB,kBAAkB,GACjDhS,IAAMuO,GAAM,QAAqB,iBAAiB;AACxD,UAAIA,KAAQvO;AACV,eAAO;AAAA,UACL,OAAOA,EAAI,QAAQ,SAAS;AAAA,UAC5B,QAAQuO,EAAK,QAAQ,UAAU;AAAA,UAC/B,SAASA;AAAA,UACT,MAAMA,EAAK,sBAAA;AAAA,QAAsB;AAAA,IAGvC;AAEA,WAAO,KAAK,QAAQ,EAAE,SAAA4K,GAAS,SAAAC,GAAkC;AAAA,EACnE;AAAA,EAEQ,0BAA0BD,GAAiBC,GAAiB;AAClE,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,UAAW;AACvC,UAAMV,IAAM,KAAK,oBAAoBS,GAASC,CAAO;AAErD,QADI,CAACV,KAEHA,EAAI,WAAW,aACd,KAAK,UAAU,SAAS,WAAWA,EAAI,WAAW;AAEnD;AAEF,UAAM/Y,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBsd,IAAc,KAAK,UAAU,YAAYxE,EAAI,KAAK;AACxD,QAAIwE,IAAc,EAAG;AACrB,UAAMoE,IACJ,KAAK,UAAU,SAAS,SACpB3hB,EAAO,QAAQ,SAAS,IACxBA,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOqY,EAAI,MAAM,CAAC;AAC1E,QAAI4I,IAAc,EAAG;AAErB,UAAMrP,IAAW,KAAK,UAAU,UAC1BE,IAAW,KAAK,UAAU,SAAS,SAAS,IAAI,KAAK,UAAU,UAC/DC,IAAS,KAAK,UAAU,SAAS,SAASzS,EAAO,QAAQ,SAAS,IAAI2hB;AAC5E,KAAIpE,MAAgBjL,KAAYG,MAAWD,OACzC,KAAK,uBAAuB;AAE9B,UAAM0M,IAA4B;AAAA,MAChC,MAAM,KAAK,UAAU;AAAA,MACrB,UAAA5M;AAAA,MACA,QAAQiL;AAAA,MACR,UAAA/K;AAAA,MACA,QAAAC;AAAA,IAAA;AAEF,SAAK,kBAAkB,CAACyM,CAAS;AACjC,UAAMtU,IAAc3K,EAAKsd,CAAW,GAAG,MAAMxE,EAAI,OAC3ClO,IACJ,KAAK,UAAU,SAAS,SACnB7K,EAAO,QAAQ,CAAC,GAAG,OAAO+Y,EAAI,SAC9B/Y,EAAO,QAAQ2hB,CAAW,GAAG,OAAO5I,EAAI;AAC/C,SAAK,aAAa,EAAE,OAAOnO,GAAa,QAAQC,EAAA,GAChD,KAAK,eAAeD,GAAaC,CAAY,GAC7C,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA;AAAA,EACP;AAAA,EAEQ,8BAA8B2O,GAAiBC,GAAiB;AACtE,QAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,WAAY;AAC5C,UAAMV,IAAM,KAAK,oBAAoBS,GAASC,CAAO;AAErD,QADI,CAACV,KACDA,EAAI,WAAW,aAAaA,EAAI,WAAW,KAAM;AACrD,UAAM/Y,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBsd,IAAc,KAAK,UAAU,YAAYxE,EAAI,KAAK;AAGxD,QAFIwE,IAAc,KACDvd,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOqY,EAAI,MAAM,CAAC,MACpE,KAAK,WAAW,SAAU;AAG3C,UAAM6I,IAAU,KAAK,IAAI,KAAK,WAAW,aAAarE,CAAW;AACjE,QAAI,KAAK,oBAAoBqE,GAAS;AACpC,WAAK,kBAAkBA;AACvB,YAAMhX,IAAc3K,EAAK2hB,CAAO,GAAG,MAAM7I,EAAI,OACvCzY,IAAMN,EAAO,QAAQ,KAAK,WAAW,QAAQ;AACnD,UAAI,CAACM,EAAK;AACV,YAAMG,IAASH,EAAI;AACnB,WAAK,aAAa,EAAE,OAAOsK,GAAa,QAAAnK,EAAA,GACxC,KAAK,eAAemK,GAAanK,CAAM,GACvC,KAAK,kBAAkB;AAAA,QACrB;AAAA,UACE,MAAM;AAAA,UACN,UAAU,KAAK,WAAW;AAAA,UAC1B,QAAQmhB;AAAA,UACR,UAAU,KAAK,WAAW;AAAA,UAC1B,QAAQ,KAAK,WAAW;AAAA,QAAA;AAAA,MAC1B,GAEF,KAAK,kBAAkB,KAAK,eAAe;AAAA,IAC7C;AACA,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEQ,uBAAuBpI,GAAiBC,GAAiB;AAC/D,UAAM/O,IAAO,KAAK,KAAK,sBAAA,GACjBmX,IAAY,IACZC,IAAU;AAChB,QAAIzE,IAAK,GACLC,IAAK;AACT,WAAI9D,IAAU9O,EAAK,OAAOmX,IACxBxE,IAAK,CAAC,KAAK,MAAO3S,EAAK,OAAOmX,IAAYrI,KAAWqI,IAAaC,CAAO,IAChEtI,IAAU9O,EAAK,QAAQmX,MAChCxE,IAAK,KAAK,MAAO7D,KAAW9O,EAAK,QAAQmX,MAAcA,IAAaC,CAAO,IAEzErI,IAAU/O,EAAK,MAAMmX,IACvBvE,IAAK,CAAC,KAAK,MAAO5S,EAAK,MAAMmX,IAAYpI,KAAWoI,IAAaC,CAAO,IAC/DrI,IAAU/O,EAAK,SAASmX,MACjCvE,IAAK,KAAK,MAAO7D,KAAW/O,EAAK,SAASmX,MAAcA,IAAaC,CAAO,IAEvE,EAAE,IAAAzE,GAAI,IAAAC,EAAA;AAAA,EACf;AAAA,EAEQ,kBAAkB;AACxB,QAAI,KAAK,iBAAkB;AAC3B,SAAK,mBAAmB;AACxB,UAAMyE,IAAO,MAAM;AACjB,UAAI,CAAC,KAAK,iBAAkB;AAC5B,YAAM5iB,IAAI,KAAK;AACf,UAAI,CAACA,KAAM,CAAC,KAAK,YAAY,CAAC,KAAK,cAAe;AAChD,aAAK,eAAA;AACL;AAAA,MACF;AACA,YAAM,EAAE,IAAAke,GAAI,IAAAC,EAAA,IAAO,KAAK,uBAAuBne,EAAE,GAAGA,EAAE,CAAC;AACvD,UAAIke,MAAO,KAAKC,MAAO,GAAG;AACxB,cAAMzP,IAAU,KAAK,KAAK,WACpBC,IAAW,KAAK,KAAK;AAC3B,aAAK,KAAK,YAAY,KAAK,IAAI,GAAGD,IAAUyP,CAAE,GAC9C,KAAK,KAAK,aAAa,KAAK,IAAI,GAAGxP,IAAWuP,CAAE,GAE5C,KAAK,eAAc,KAAK,8BAA8Ble,EAAE,GAAGA,EAAE,CAAC,IAC7D,KAAK,0BAA0BA,EAAE,GAAGA,EAAE,CAAC;AAAA,MAC9C;AACA,YAAM6iB,IACJ,OAAO,0BACN,CAACC,MAA6B,OAAO,WAAW,MAAMA,EAAG,YAAY,IAAA,CAAK,GAAG,EAAE;AAClF,WAAK,gBAAgBD,EAAID,CAAI;AAAA,IAC/B,GACMG,IACJ,OAAO,0BACN,CAACD,MAA6B,OAAO,WAAW,MAAMA,EAAG,YAAY,IAAA,CAAK,GAAG,EAAE;AAClF,SAAK,gBAAgBC,EAAKH,CAAI;AAAA,EAChC;AAAA,EAEQ,iBAAiB;AACvB,SAAK,mBAAmB,IACpB,KAAK,kBAAkB,UACb,OAAO,yBAAyB,CAAC3iB,MAAe,OAAO,aAAaA,CAAE,IAC9E,KAAK,aAAa,GACtB,KAAK,gBAAgB;AAAA,EAEzB;AAAA,EAgEQ,WAAWkK,GAAiDiU,GAAqB;AACvF,UAAMvd,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBK,IAAMN,EAAO,QAAQsJ,EAAO,QAAQ;AAE1C,QADI,CAAChJ,KACDid,KAAejU,EAAO,YAAa;AAEvC,UAAM6Y,IAAW9Y,GAAoB,KAAK,WAAWC,GAAQ,KAAK,aAAa;AAC/E,QAAI,CAAC6Y,EAAU;AAEf,UAAMC,IAAY,KAAK,aAAa,UAC9B5iB,IAAU,QAAQ,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACzE,aAASgC,IAAI8H,EAAO,cAAc,GAAG9H,KAAK+b,GAAa/b,KAAK,GAAG;AAC7D,YAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,UAAI,CAACnB,EAAK;AACV,UAAI,KAAK,eAAeA,EAAI,IAAIC,EAAI,GAAG,EAAG;AAC1C,YAAM+hB,IAAS7gB,IAAI8H,EAAO,aACpBW,IAAOkY,EAASE,CAAM,GACtBnjB,IAAe;AAAA,QACnB,MAAM;AAAA,QACN,OAAOmB,EAAI;AAAA,QACX,QAAQC,EAAI;AAAA,QACZ,MAAA2J;AAAA,QACA,SAAS,EAAE,SAAAzK,EAAA;AAAA,MAAQ;AAErB,WAAK,OAAON,GAAKkjB,CAAS;AAAA,IAC5B;AAGA,UAAM7P,IAAStS,EAAKsd,CAAW;AAC/B,QAAI,CAAChL,EAAQ;AACb,SAAK,kBAAkB;AAAA,MACrB;AAAA,QACE,MAAM;AAAA,QACN,UAAUjJ,EAAO;AAAA,QACjB,QAAQiU;AAAA,QACR,UAAUjU,EAAO;AAAA,QACjB,QAAQA,EAAO;AAAA,MAAA;AAAA,IACjB,GAEF,KAAK,aAAa,EAAE,OAAOiJ,EAAO,IAAI,QAAQjS,EAAI,IAAA,GAClD,KAAK,eAAeiS,EAAO,IAAIjS,EAAI,GAAG,GACtC,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACL,KAAK,kBAAkBiS,EAAO,IAAIjS,EAAI,GAAG;AACzC,UAAMga,IAAU,KAAK,UAAU,QAAQ/H,EAAO,IAAIjS,EAAI,GAAG;AACzD,SAAK,oBAAoB,KAAK,sBAAsBga,CAAO,CAAC;AAAA,EAC9D;AAAA,EAEQ,yBAAyB;AAC/B,UAAMyD,IAAQ,KAAK;AACnB,IAAKA,MAGL,KAAK,iBAAiB,MAEtBA,EAAM,oBAAoB,WAAW,KAAK,sBAAsB,GAChEA,EAAM,oBAAoB,eAAe,KAAK,0BAA0B,GACxEA,EAAM,oBAAoB,oBAAoB,KAAK,+BAA+B,GAClFA,EAAM,oBAAoB,QAAQ,KAAK,mBAAmB,GAC1DA,EAAM,oBAAoB,OAAO,KAAK,kBAAkB,GACxDA,EAAM,oBAAoB,SAAS,KAAK,oBAAoB,GAC5DA,EAAM,oBAAoB,QAAQ,KAAK,mBAAmB,GAC1DvP,EAAiBuP,CAAK;AAAA,EACxB;AAAA,EA6EA,MAAa,gBAAgB;AAC3B,UAAMN,IAAU,KAAK,+BAAA;AACrB,QAAI,CAACA,EAAS;AACd,UAAM,EAAE,MAAA3L,GAAM,MAAA4L,GAAM,WAAA4E,EAAA,IAAc7E,GAE5B8E,IAAsB,YAAY;AACtC,UAAI,OAAO,YAAc,OAAe,CAAC,UAAU,UAAW,QAAO;AACrE,UAAI,OAAO,gBAAkB,OAAe,UAAU,UAAU;AAC9D,YAAI;AACF,gBAAMC,IAAO,IAAI,cAAc;AAAA,YAC7B,cAAc,IAAI,KAAK,CAAC1Q,CAAI,GAAG,EAAE,MAAM,cAAc;AAAA,YACrD,aAAa,IAAI,KAAK,CAAC4L,CAAI,GAAG,EAAE,MAAM,YAAA,CAAa;AAAA,UAAA,CACpD;AACD,uBAAM,UAAU,UAAU,MAAM,CAAC8E,CAAI,CAAC,GAC/B;AAAA,QACT,QAAQ;AAAA,QAER;AAEF,UAAI,UAAU,UAAU;AACtB,YAAI;AACF,uBAAM,UAAU,UAAU,UAAU1Q,CAAI,GACjC;AAAA,QACT,QAAQ;AAAA,QAER;AAEF,aAAO;AAAA,IACT,GAEM2Q,IAAuB,MAAM;AACjC,YAAM1E,IAAQ,KAAK,qBAAA,GACb1F,IAAO0F,EAAM;AACnB,MAAAA,EAAM,QAAQjM,GACdiM,EAAM,OAAA,GACN,SAAS,cAAc,MAAM,GAC7BA,EAAM,QAAQ1F;AAAA,IAChB;AAGA,IADe,MAAMkK,EAAA,KACRE,EAAA,GACb,KAAK,cAAc,UAAUH,CAAS,UAAU,MAAM;AAAA,EACxD;AAAA,EAEA,MAAa,qBAAqB;AAChC,QAAI,KAAK,aAAa,cACjB,KAAK,iBACN,SAAO,YAAc,OAAe,CAAC,UAAU,WAAW;AAC9D,UAAI;AACF,cAAMxQ,IAAO,MAAM,UAAU,UAAU,SAAA;AACvC,YAAI,CAACA,EAAM;AACX,cAAM8L,IAAO,KAAK,mBAAmB,EAAE,MAAM,IAAI,KAAK9L,GAAM,MAAAA,GAAM;AAClE,YAAI,CAAC8L,EAAM;AACX,aAAK,mBAAmBA,CAAI;AAAA,MAC9B,QAAQ;AAAA,MAER;AAAA,EACF;AAAA,EAqHQ,mBAAmB;AACzB,UAAM5d,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtByiB,IAAW,EAAE,UAAU,GAAG,UAAU,EAAA,GACpC7E,IAAK,KAAK;AAChB,QAAI,CAACA,EAAI,QAAO6E;AAChB,UAAMviB,IAAWF,EAAK,UAAU,CAACuB,MAAMA,EAAE,OAAOqc,EAAG,KAAK,GAClDzd,IAAWJ,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOmd,EAAG,MAAM,CAAC;AACpF,WAAO,EAAE,UAAU1d,KAAY,IAAIA,IAAW,GAAG,UAAUC,KAAY,IAAIA,IAAW,EAAA;AAAA,EACxF;AAAA,EAEQ,eAAeyI,GAAuC;AAC5D,WAAO;AAAA,MACL,GAAGA;AAAA,MACH,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,MAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,MAC7C,UAAU,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,MAC/C,QAAQ,KAAK,IAAIA,EAAM,UAAUA,EAAM,MAAM;AAAA,IAAA;AAAA,EAEjD;AAAA,EAEQ,eAAsC;AAC5C,UAAM7I,IAAS,KAAK,UAAU,UAAA;AAC9B,QAAI,KAAK,gBAAgB,SAAS,GAAG;AACnC,YAAM2iB,IAAQ,KAAK,gBAAgB,CAAC;AACpC,UAAI,CAACA,EAAO,QAAO;AACnB,YAAMC,IAAa,KAAK,eAAeD,CAAK;AAC5C,aAAIC,EAAW,SAAS,SACf;AAAA,QACL,MAAM;AAAA,QACN,UAAUA,EAAW;AAAA,QACrB,QAAQA,EAAW;AAAA,QACnB,UAAUA,EAAW;AAAA,QACrB,QAAQA,EAAW;AAAA,MAAA,IAGhBA;AAAA,IACT;AACA,QAAI,CAAC,KAAK,WAAY,QAAO;AAC7B,UAAM/E,IAAK,KAAK;AAChB,QAAI,CAACA,EAAI,QAAO;AAChB,UAAMgF,IAAS,KAAK,UAAU,YAAYhF,EAAG,KAAK,GAC5CiF,IAAS9iB,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOmd,EAAG,MAAM,CAAC;AAClF,WAAIgF,IAAS,KAAKC,IAAS,IAAU,OAC9B,EAAE,MAAM,SAAS,UAAUD,GAAQ,QAAQA,GAAQ,UAAUC,GAAQ,QAAQA,EAAA;AAAA,EACtF;AAAA,EAEQ,sBAAsB/Z,GAAwB;AACpD,QAAIA,KAAU,KAA6B,QAAO;AAClD,QAAIA,aAAiB,KAAM,QAAOA,EAAM,YAAA;AACxC,QAAI,OAAOA,KAAU,UAAW,QAAOA,IAAQ,SAAS;AACxD,QAAI,OAAOA,KAAU,SAAU,QAAO,OAAOA,CAAK;AAClD,UAAMga,IAAa/R,GAAkBjI,CAAK;AAC1C,QAAIga,GAAY,KAAM,QAAOA,EAAW;AACxC,UAAMC,IAAejS,GAAoBhI,CAAK;AAC9C,QAAIia,GAAc,MAAO,QAAOA,EAAa;AAC7C,QAAI,OAAOja,KAAU,UAAU;AAC7B,YAAM0D,IAAM1D,GACNkG,IAAOxC,EAAI;AACjB,UAAIwC,MAAS,UAAU,OAAOxC,EAAI,SAAU,iBAAiBA,EAAI;AACjE,UAAIwC,MAAS,UAAU,MAAM,QAAQxC,EAAI,MAAM;AAC7C,eAAOA,EAAI,OAAO,OAAO,CAACtH,MAAM,OAAOA,KAAM,QAAQ,EAAE,KAAK,IAAI;AAAA,IAEpE;AACA,WAAO,OAAO4D,CAAK;AAAA,EACrB;AAAA,EAEQ,WAAW+I,GAAc;AAC/B,WAAOA,EACJ,WAAW,KAAK,OAAO,EACvB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,MAAM,EACtB,WAAW,KAAK,QAAQ,EACxB,WAAW,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEQ,iCAIC;AACP,UAAM9R,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB4I,IAAQ,KAAK,aAAA;AAEnB,QADI,CAACA,KACDA,EAAM,SAAS,QAAS,QAAO;AAEnC,UAAMnJ,IAAgB,CAAA,GAChBujB,IAAqB,CAAA,GACrBC,IAAa,8CACbnT,IAAY;AAClB,QAAIuS,IAAY;AAChB,aAAS9gB,IAAIqH,EAAM,UAAUrH,KAAKqH,EAAM,QAAQrH,KAAK,GAAG;AACtD,YAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,UAAI,CAACnB,EAAK;AACV,YAAMga,IAAiB,CAAA,GACjB8I,IAAsB,CAAA;AAC5B,eAASziB,IAAImI,EAAM,UAAUnI,KAAKmI,EAAM,QAAQnI,KAAK,GAAG;AACtD,cAAMJ,IAAMN,EAAO,QAAQU,CAAC;AAC5B,YAAI,CAACJ,EAAK;AACV,cAAMoF,IAAI,KAAK,UAAU,QAAQrF,EAAI,IAAIC,EAAI,GAAG,GAC1CgB,IAAI,KAAK,sBAAsBoE,CAAC;AACtC,QAAA2U,EAAK,KAAK/Y,CAAC,GACX6hB,EAAU,KAAK,cAAcpT,CAAS,KAAK,KAAK,WAAWzO,CAAC,CAAC,OAAO,GACpEghB,KAAa;AAAA,MACf;AACA,MAAA5iB,EAAI,KAAK2a,EAAK,KAAK,GAAI,CAAC,GACxB4I,EAAS,KAAK,OAAOE,EAAU,KAAK,EAAE,CAAC,OAAO;AAAA,IAChD;AACA,UAAMrR,IAAOpS,EAAI,KAAK;AAAA,CAAM,GACtBge,IAAO,iBAAiBwF,CAAU,YAAYD,EAAS,KAAK,EAAE,CAAC;AACrE,WAAO,EAAE,MAAAnR,GAAM,MAAA4L,GAAM,WAAA4E,EAAA;AAAA,EACvB;AAAA,EAEQ,uBAAuB;AAC7B,UAAMtiB,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB4I,IAAQ,KAAK,aAAA;AACnB,QAAI,CAACA,KAASA,EAAM,SAAS,QAAS;AACtC,UAAMuZ,IAAY,KAAK,aAAa,UAC9B5iB,IAAU,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AACxE,aAASgC,IAAIqH,EAAM,UAAUrH,KAAKqH,EAAM,QAAQrH,KAAK,GAAG;AACtD,YAAMnB,IAAMJ,EAAKuB,CAAC;AAClB,UAAKnB;AACL,iBAAS,IAAIwI,EAAM,UAAU,KAAKA,EAAM,QAAQ,KAAK,GAAG;AACtD,gBAAMvI,IAAMN,EAAO,QAAQ,CAAC;AAE5B,cADI,CAACM,KACD,KAAK,eAAeD,EAAI,IAAIC,EAAI,GAAG,EAAG;AAC1C,gBAAM2J,IAAO3J,EAAI,SAAS,YAAY,KAAQ,IACxCpB,IAAe;AAAA,YACnB,MAAM;AAAA,YACN,OAAOmB,EAAI;AAAA,YACX,QAAQC,EAAI;AAAA,YACZ,MAAA2J;AAAA,YACA,SAAS,EAAE,SAAAzK,EAAA;AAAA,UAAQ;AAErB,eAAK,OAAON,GAAKkjB,CAAS;AAAA,QAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB3E,GAElB;AACP,UAAM2F,IAAW,KAAK,eAAe3F,EAAQ,IAAI;AACjD,QAAI2F,EAAU,QAAOA;AACrB,UAAM7S,IAAMkN,EAAQ,OAAOA,EAAQ;AACnC,WAAO,KAAK,SAASlN,CAAG;AAAA,EAC1B;AAAA,EAEQ,SAASuB,GAAiC;AAChD,UAAMuR,IAAUvR,EAAK,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,EAAE;AAC3D,WAAKuR,IACQA,EAAQ,MAAM,SAAS,EACxB,IAAI,CAAC7hB,MAAMA,EAAE,MAAM,GAAI,CAAC,IAFf;AAAA,EAGvB;AAAA,EAEQ,eAAekc,GAAiC;AACtD,QAAI,CAACA,EAAM,QAAO;AAClB,QAAI;AAGF,YAAM4F,IAFS,IAAI,UAAA,EACA,gBAAgB5F,GAAM,WAAW,EAClC,cAAc,OAAO;AACvC,UAAI,CAAC4F,EAAO,QAAO;AACnB,YAAMC,IAAM,MAAM,KAAKD,EAAM,iBAAiB,IAAI,CAAC;AACnD,UAAIC,EAAI,WAAW,EAAG,QAAO;AAC7B,YAAM3F,IAAmB,CAAA;AACzB,iBAAWzO,KAAMoU,GAAK;AACpB,cAAM5Q,IAAQ,MAAM,KAAKxD,EAAG,iBAAiB,OAAO,CAAC;AACrD,YACEwD,EAAM;AAAA,UACJ,CAACjS,MACEA,EAA2B,UAAU,KAAMA,EAA2B,UAAU;AAAA,QAAA;AAGrF,iBAAO;AAET,QAAAkd,EAAK,KAAKjL,EAAM,IAAI,CAACjS,OAAOA,EAAE,eAAe,IAAI,KAAA,CAAM,CAAC;AAAA,MAC1D;AACA,aAAOkd,EAAK,SAASA,IAAO;AAAA,IAC9B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,gBAAgBrN,GAAa9P,GAAyB;AAC5D,UAAMH,IAAM,KAAK,WAAWG,CAAM;AAClC,QAAI,CAACH,EAAK,QAAOiQ;AACjB,QAAIA,MAAQ,GAAI,QAAO;AACvB,QAAIjQ,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,QAAQ;AACtE,YAAM6L,IAASqX,GAAiBjT,CAAG;AACnC,UAAI,CAACpE,EAAO,GAAI,QAAOoE;AACvB,YAAMkT,IAAUC,GAAuBvX,EAAO,OAAO7L,EAAI,IAAI;AAC7D,aAAOmjB,EAAQ,KAAKA,EAAQ,QAAQlT;AAAA,IACtC;AACA,QAAIjQ,EAAI,SAAS,WAAW;AAC1B,YAAMoF,IAAI6K,EAAI,KAAA,EAAO,YAAA;AACrB,aAAI7K,MAAM,UAAUA,MAAM,OAAOA,MAAM,QAAc,KACjDA,MAAM,WAAWA,MAAM,OAAOA,MAAM,OAAa,KAC9C6K;AAAA,IACT;AACA,WAAOA;AAAA,EACT;AAAA,EAEQ,mBAAmBqN,GAAkB;AAC3C,UAAM5d,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtB,EAAE,UAAUqS,GAAU,UAAUE,EAAA,IAAa,KAAK,iBAAA,GAClD4P,IAAY,KAAK,aAAa,UAC9B5iB,IAAU,SAAS,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1E,aAASgC,IAAI,GAAGA,IAAIoc,EAAK,QAAQpc,KAAK,GAAG;AACvC,YAAMnB,IAAMJ,EAAKqS,IAAW9Q,CAAC;AAC7B,UAAI,CAACnB,EAAK;AACV,YAAMga,IAAOuD,EAAKpc,CAAC,KAAK,CAAA;AACxB,eAASd,IAAI,GAAGA,IAAI2Z,EAAK,QAAQ3Z,KAAK,GAAG;AACvC,cAAMJ,IAAMN,EAAO,QAAQwS,IAAW9R,CAAC;AACvC,YAAI,CAACJ,EAAK;AACV,YAAI,KAAK,eAAeD,EAAI,IAAIC,EAAI,GAAG,EAAG;AAC1C,cAAM2J,IAAO,KAAK,gBAAgBoQ,EAAK3Z,CAAC,KAAK,IAAIJ,EAAI,GAAG,GAClDpB,IAAe;AAAA,UACnB,MAAM;AAAA,UACN,OAAOmB,EAAI;AAAA,UACX,QAAQC,EAAI;AAAA,UACZ,MAAA2J;AAAA,UACA,SAAS,EAAE,SAAAzK,EAAA;AAAA,QAAQ;AAErB,aAAK,OAAON,GAAKkjB,CAAS;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa3hB,GAAgB2e,GAAiB;AACpD,UAAM9e,IAAM,KAAK,WAAWG,CAAM;AAElC,QADsBH,GAAK,YAAY8e,EAAQ,SAAS;AAAA,CAAI,GACzC;AACjB,YAAMuE,IAAK,SAAS,cAAc,UAAU;AAC5C,aAAAA,EAAG,QAAQvE,GACXuE,EAAG,MAAM,SAAS,QAClBA,EAAG,MAAM,aAAa,YACtBA,EAAG,MAAM,eAAe,YACxBA,EAAG,MAAM,WAAW,UACpB,KAAK,SAASA,CAAE,GAChBA,EAAG,iBAAiB,SAAS,MAAM,KAAK,SAASA,CAAE,CAAC,GAC7C,EAAE,SAASA,GAAI,OAAOvE,EAAA;AAAA,IAC/B;AACA,QAAI9e,GAAK,SAAS,WAAW;AAC3B,YAAMyd,IAAQ,SAAS,cAAc,OAAO;AAC5CA,aAAAA,EAAM,OAAO,YACbA,EAAM,UAAUqB,MAAY,UAAUA,MAAY,OAAOA,MAAY,MAC9D,EAAE,SAASrB,GAAO,OAAOqB,EAAA;AAAA,IAClC;AACA,QAAI9e,GAAK,SAAS,YAAYA,GAAK,SAAS,SAASA,GAAK,SAAS,QAAQ;AACzE,YAAMyd,IAAQ,SAAS,cAAc,OAAO;AAC5CA,aAAAA,EAAM,OAAO,QACbA,EAAM,QAAQqB,GACP,EAAE,SAASrB,GAAO,OAAOqB,EAAA;AAAA,IAClC;AACA,QAAI9e,GAAK,SAAS,UAAUA,GAAK,SAAS,UAAUA,GAAK,SAAS,YAAY;AAC5E,YAAMyd,IAAQ,SAAS,cAAc,OAAO;AAC5CA,MAAAA,EAAM,OAAOzd,EAAI,SAAS,SAAS,SAASA,EAAI,SAAS,SAAS,SAAS;AAC3E,YAAMsiB,IAAa,KAAK,8BAA8BtiB,EAAI,MAAM8e,CAAO;AACvErB,aAAAA,EAAM,QAAQ6E,GACP,EAAE,SAAS7E,GAAO,OAAO6E,EAAA;AAAA,IAClC;AACA,QAAItiB,GAAK,SAAS,UAAUA,GAAK,SAAS,QAAQ;AAChD,YAAMsjB,IAActjB,EAAI,MAAM,eAAeA,EAAI,MAAM,aACjDyL,IAAUzL,EAAI,MAAM,WAAWA,EAAI,MAAM,WAAW,CAAA;AAC1D,UAAIsjB,MAAgB,IAAO;AACzB,cAAMC,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAQ,SAAS,cAAc,QAAQ;AAC7C,QAAAA,EAAM,QAAQ,IACdA,EAAM,cAAc,IACpBD,EAAO,YAAYC,CAAK;AACxB,mBAAWC,KAAOhY,GAAS;AACzB,gBAAMiY,IAAK,SAAS,cAAc,QAAQ;AAC1C,UAAAA,EAAG,QAAQD,GACXC,EAAG,cAAcD,GACb3E,MAAY2E,MAAKC,EAAG,WAAW,KACnCH,EAAO,YAAYG,CAAE;AAAA,QACvB;AACA,eAAO,EAAE,SAASH,GAAQ,OAAOzE,EAAA;AAAA,MACnC;AACA,YAAMrB,IAAQ,SAAS,cAAc,OAAO;AAC5CA,MAAAA,EAAM,OAAO;AACb,YAAMkG,IAAS,oBAAoB,OAAOxjB,CAAM,CAAC;AACjDsd,MAAAA,EAAM,aAAa,QAAQkG,CAAM,GACjClG,EAAM,QAAQqB;AACd,UAAI8E,IAAW,SAAS,eAAeD,CAAM;AAC7C,UAAI,CAACC,GAAU;AACb,QAAAA,IAAW,SAAS,cAAc,UAAU,GAC5CA,EAAS,KAAKD;AACd,mBAAWF,KAAOhY,GAAS;AACzB,gBAAMiY,IAAK,SAAS,cAAc,QAAQ;AAC1C,UAAAA,EAAG,QAAQD,GACXG,EAAS,YAAYF,CAAE;AAAA,QACzB;AACA,aAAK,KAAK,YAAYE,CAAQ;AAAA,MAChC;AACA,aAAO,EAAE,SAASnG,GAAO,OAAOqB,GAAS,YAAY6E,EAAA;AAAA,IACvD;AACA,UAAMlG,IAAQ,SAAS,cAAc,OAAO;AAC5C,WAAAA,EAAM,OAAO,QACbA,EAAM,QAAQqB,GACP,EAAE,SAASrB,GAAO,OAAOqB,EAAA;AAAA,EAClC;AAAA,EAEQ,oBAAoB3e,GAAgB6Z,GAA0B;AACpE,QAAIA,KAAY,KAA+B,QAAO;AACtD,UAAMha,IAAM,KAAK,WAAWG,CAAM;AAClC,QAAI,CAACH,EAAK,QAAO,OAAOga,CAAO;AAE/B,SAAKha,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,WAAW,OAAOga,KAAY,UAAU;AACvG,UAAIha,EAAI,SAAS,UAAU;AACzB,cAAM2L,IAAM3L,EAAI;AAEhB,gBADc2L,GAAK,UAAU,eACf,eACL6G,GAAoBwH,GAAS,EAAE,QAAQ,cAAc,WAAWrO,GAAK,WAAW,IAElF6G,GAAoBwH,GAAS,EAAE,QAAQ,WAAW,OAAOrO,GAAK,OAAO;AAAA,MAC9E;AAGA,YAAM+G,IADM1S,EAAI,QACG,UAAU;AAC7B,aAAI0S,MAAU,YAAYA,MAAU,WAAWA,MAAU,QAChDC,GAAwBqH,GAAStH,CAAK,IAExC,OAAOsH,CAAO;AAAA,IACvB;AAEA,WAAO,OAAOA,CAAO;AAAA,EACvB;AAAA,EAEQ,2BAAyE;AAC/E,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,cAAc,KAAK,WAAW,WAAW;AAClE,aAAO,EAAE,IAAI,IAAM,OAAO,KAAK,SAAS,SAAS,GAAA;AAGnD,UAAMha,IAAM,KAAK,WAAW,KAAK,WAAW,MAAM;AAClD,QACEA,MACCA,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,WAC7D,KAAK,mBAAmB,kBACxB;AACA,YAAMsiB,IAAauB,GAAsB,KAAK,QAAQ,KAAK;AAC3D,UAAIvB,MAAe,GAAI,QAAO,EAAE,IAAI,IAAM,OAAO,GAAA;AAEjD,YAAMzW,IAASqX,GAAiBZ,CAAU;AAC1C,UAAI,CAACzW,EAAO,GAAI,QAAO,EAAE,IAAI,GAAA;AAC7B,YAAMsX,IAAUC,GAAuBvX,EAAO,OAAO7L,EAAI,IAAI;AAC7D,aAAKmjB,EAAQ,KACN,EAAE,IAAI,IAAM,OAAOA,EAAQ,MAAA,IADV,EAAE,IAAI,GAAA;AAAA,IAEhC;AAEA,WAAO,EAAE,IAAI,IAAM,OAAO,KAAK,kBAAgB;AAAA,EACjD;AAAA,EAEQ,wBAAiC;AACvC,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,cAAc,KAAK,WAAW,WAAW,KAAM,QAAO;AACjF,UAAM,EAAE,OAAAjjB,GAAO,QAAAC,EAAA,IAAW,KAAK,YACzBwJ,IAAO,KAAK,yBAAA;AAClB,WAAKA,EAAK,MAIV,KAAK,WAAWzJ,GAAOC,GAAQwJ,EAAK,KAAK,GACzC,KAAK,OAAOzJ,CAAK,GACjB,KAAK,cAAc,EAAK,GACjB,OANL,KAAK,QAAQ,MAAM,EAAE,eAAe,IAAM,GACnC;AAAA,EAMX;AAAA,EAEQ,SAASmjB,GAAyB;AACxC,UAAMS,IAAQ,OAAO,iBAAiBT,CAAE;AACxC,QAAIU,IAAa,OAAO,WAAWD,EAAM,UAAU;AACnD,KAAI,CAAC,OAAO,SAASC,CAAU,KAAKA,KAAc,OAAGA,IAAa,KAClEV,EAAG,OAAO;AACV,UAAMvJ,IAAQ,KAAK,KAAKuJ,EAAG,eAAeU,CAAU;AACpD,IAAAV,EAAG,OAAO,KAAK,IAAI,GAAGvJ,CAAK,GAC3BuJ,EAAG,MAAM,YAAY,GAAGU,CAAU;AAAA,EACpC;AAAA,EAEQ,2BACNjE,GACAkE,GACA;AACA,UAAMC,IAAS1N,IACT2N,IAAWtS,IACXuS,IAActS;AACpB,IAAAmS,EAAQ,MAAM,OAAO,GAAGlE,EAAI,OAAOmE,CAAM,MACzCD,EAAQ,MAAM,MAAM,GAAGlE,EAAI,MAAMoE,CAAQ,MACzCF,EAAQ,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAGlE,EAAI,QAAQmE,IAAS,CAAC,CAAC,MAC5DD,EAAQ,MAAM,SAAS,GAAG,KAAK,IAAI,GAAGlE,EAAI,UAAUoE,IAAWC,EAAY,CAAC;AAAA,EAC9E;AAAA,EAiKQ,kBAAkBjkB,GAAeC,GAAgBwO,GAAyB;AAChF,UAAM3O,IAAM,KAAK,WAAWG,CAAM;AAIlC,QAHI,CAACH,KACDA,EAAI,SAAS2O,KACG,KAAK,UAAU,mBAAmBzO,GAAOC,CAAM,EACnD,SAAU,QAAO;AACjC,UAAM+P,IAAW,KAAK,UAAU,iBAAiBhQ,GAAOF,CAAG,GACrDwP,IAAU,KAAK,UAAU,wBAAwBtP,GAAOF,CAAG;AAEjE,QADqBkQ,EAAS,iBAAiBV,EAAQ,iBAAiB,WAAW,QACjE,QAAO;AACzB,QAAIxP,EAAI,SAAS,UAAU;AACzB,YAAMwQ,IAAcC,GAAoBP,EAAS,KAAK;AACtD,aAAKM,KACL,KAAK,aAAa,EAAE,MAAM,UAAU,OAAAtQ,GAAO,QAAAC,GAAQ,OAAOqQ,GAAa,GAChE,MAFkB;AAAA,IAG3B;AACA,QAAIxQ,EAAI,SAAS,QAAQ;AACvB,YAAMokB,IAAY1T,GAAkBR,EAAS,KAAK;AAClD,aAAKkU,GAAW,QAChB,KAAK,SAASA,EAAU,MAAMA,EAAU,MAAM,GACvC,MAFsB;AAAA,IAG/B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAelkB,GAAeC,GAAgBsO,GAAkB;AACtE,QAAI,KAAK,eAAevO,GAAOC,CAAM,EAAG,QAAO;AAC/C,UAAMH,IAAM,KAAK,WAAWG,CAAM;AAClC,QAAI,CAACH,KAAOA,EAAI,SAAS,OAAQ,QAAO;AACxC,UAAMga,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM,GAC9CiM,IAAS,KAAK,mBAAmB4N,CAAO;AAC9C,QAAI,CAAC5N,KAAUqC,IAAW,KAAKA,KAAYrC,EAAO,OAAQ,QAAO;AACjE,UAAMiY,IAAajY,EAAO,OAAO,CAAC7J,GAAGhB,MAAMA,MAAMkN,CAAQ,GACnD9E,IACJqQ,KAAW,OAAOA,KAAY,YAAaA,EAAoC,SAAS,SACpF,EAAE,MAAM,QAAQ,QAAQqK,MACxBA,GACAzlB,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAAsB;AAAA,MACA,QAAAC;AAAA,MACA,MAAAwJ;AAAA,IAAA,GAEImY,IAAY,KAAK,aAAa;AACpC,gBAAK,OAAOljB,GAAKkjB,CAAS,GACnB;AAAA,EACT;AAAA,EAEQ,mBAAmBrZ,GAAiC;AAC1D,QAAI,MAAM,QAAQA,CAAK,KAAKA,EAAM,MAAM,CAACrD,MAAM,OAAOA,KAAM,QAAQ;AAClE,aAAOqD;AAET,QAAIA,KAAS,OAAOA,KAAU,UAAU;AACtC,YAAM0D,IAAM1D;AACZ,UAAI0D,EAAI,SAAS,UAAU,MAAM,QAAQA,EAAI,MAAM;AACjD,eAAOA,EAAI,OAAO,OAAO,CAAC/G,MAAmB,OAAOA,KAAM,QAAQ;AAAA,IAEtE;AACA,QAAI,OAAOqD,KAAU,UAAU;AAC7B,YAAMsa,IAAUta,EAAM,KAAA;AACtB,aAAKsa,IACEA,EAAQ,MAAM,SAAS,EAAE,OAAO,OAAO,IADzB,CAAA;AAAA,IAEvB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAASuB,GAAc5X,GAAiB;AAE9C,QADI,OAAO,WAAa,OACpB,CAAC4X,EAAM;AACX,UAAMC,IAAO,SAAS,cAAc,GAAG;AACvC,IAAAA,EAAK,OAAOD,GACZC,EAAK,SAAS7X,KAAU,SACxB6X,EAAK,MAAM,uBACXA,EAAK,MAAM,UAAU,QACrB,SAAS,KAAK,YAAYA,CAAI,GAC9BA,EAAK,MAAA,GACLA,EAAK,OAAA;AAAA,EACP;AAAA,EAEQ,cAAcrkB,GAAeC,GAAgB;AACnD,UAAM6Z,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM,GAG9CvB,IAAe,EAAE,MAAM,QAAQ,OAAAsB,GAAO,QAAAC,GAAQ,MADvC,EADO6Z,MAAY,MAAQA,MAAY,UAAUA,MAAY,OAAOA,MAAY,GAEzC,GAC9C8H,IAAY,KAAK,aAAa;AACpC,SAAK,OAAOljB,GAAKkjB,CAAS,GAC1B,KAAK,OAAO5hB,CAAK;AAAA,EACnB;AAAA,EAiBQ,sBAAsBgT,GAAgBuF,GAA+C;AAC3F,UAAM/Y,IAAS,KAAK,UAAU,UAAA,GACxB6iB,IAAS,KAAK,UAAU,YAAY9J,EAAI,KAAK,GAC7C+L,IAAQ/L,EAAI,WAAW,MACvB+J,IAASgC,IAAS9kB,EAAO,QAAQ,SAAS,IAAI,IAAI,KAAMA,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOqY,EAAI,MAAM,CAAC;AAClI,QAAI+J,IAAS,EAAG;AAChB,UAAMiC,IAA8BD,IAChC;AAAA,MACE,MAAM;AAAA,MACN,UAAUjC;AAAA,MACV,QAAQA;AAAA,MACR,UAAU;AAAA,MACV,QAAQ7iB,EAAO,QAAQ,SAAS;AAAA,IAAA,IAElC;AAAA,MACE,MAAM;AAAA,MACN,UAAU6iB;AAAA,MACV,QAAQA;AAAA,MACR,UAAU,KAAK,IAAI,GAAGC,CAAM;AAAA,MAC5B,QAAQ,KAAK,IAAI,GAAGA,CAAM;AAAA,IAAA;AAEhC,QAAInE,IAA+B,CAAA;AACnC,QAAInL,EAAG,YAAY,KAAK,YAAY;AAClC,YAAMqK,IAAK,KAAK,YACVmH,IAAY,KAAK,UAAU,YAAYnH,EAAG,KAAK,GAC/CoH,IAAYjlB,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOmd,EAAG,MAAM,CAAC;AAgBrF,MAAAc,IAAa,CAfuBmG,IAChC;AAAA,QACE,MAAM;AAAA,QACN,UAAUE;AAAA,QACV,QAAQnC;AAAA,QACR,UAAU;AAAA,QACV,QAAQ7iB,EAAO,QAAQ,SAAS;AAAA,MAAA,IAElC;AAAA,QACE,MAAM;AAAA,QACN,UAAUglB;AAAA,QACV,QAAQnC;AAAA,QACR,UAAU,KAAK,IAAI,GAAGoC,CAAS;AAAA,QAC/B,QAAQ,KAAK,IAAI,GAAGnC,CAAM;AAAA,MAAA,CAEP;AAAA,IAC3B,MAAA,CAAWtP,EAAG,WAAWA,EAAG,UAC1BmL,IAAa,CAAC,GAAG,KAAK,iBAAiBoG,CAAW,IAElDpG,IAAa,CAACoG,CAAW;AAE3B,SAAK,kBAAkB,KAAK,YAAYpG,CAAU;AAClD,UAAMuG,IACJH,EAAY,SAAS,SACjB,EAAE,OAAOhM,EAAI,OAAO,QAAQ/Y,EAAO,QAAQ8iB,CAAM,GAAG,OAAO,SAC3D,EAAE,OAAO/J,EAAI,OAAO,QAAQA,EAAI,OAAA;AACtC,SAAK,aAAamM,GAClB,KAAK,eAAeA,EAAW,OAAOA,EAAW,MAAM,GACvD,KAAK,kBAAkB,KAAK,eAAe,GAC3C,KAAK,qBAAA,GACDH,EAAY,SAAS,WACvB,KAAK,gBAAgB,IACrB,KAAK,kBAAkB,MACvB,KAAK,oBAAoB,EAAE;AAAA,EAE/B;AAAA,EAEQ,YAAY7b,GAA0B;AAC5C,UAAMmH,IAA2B,CAAA,GAC3B8U,IAAS,CAAC,GAAGjc,CAAM,EAAE,KAAK,CAACpH,GAAG2F,MAC9B3F,EAAE,SAAS2F,EAAE,OAAa3F,EAAE,SAAS,SAAS,KAAK,IACnDA,EAAE,aAAa2F,EAAE,WAAiB3F,EAAE,WAAW2F,EAAE,WACjD3F,EAAE,aAAa2F,EAAE,WAAiB3F,EAAE,WAAW2F,EAAE,WACjD3F,EAAE,WAAW2F,EAAE,SAAe3F,EAAE,SAAS2F,EAAE,SACxC3F,EAAE,SAAS2F,EAAE,MACrB;AACD,eAAWjG,KAAK2jB,GAAQ;AACtB,YAAM1lB,IAAO4Q,EAAO,GAAG,EAAE;AACzB,UAAI,CAAC5Q,GAAM;AACT,QAAA4Q,EAAO,KAAK,EAAE,GAAG7O,GAAG;AACpB;AAAA,MACF;AACA,UAAI/B,EAAK,SAAS+B,EAAE,MAAM;AACxB,QAAA6O,EAAO,KAAK,EAAE,GAAG7O,GAAG;AACpB;AAAA,MACF;AACA,UAAIA,EAAE,SAAS;AAMb,YAJE/B,EAAK,aAAa+B,EAAE,YACpB/B,EAAK,WAAW+B,EAAE,UAClB/B,EAAK,YAAY+B,EAAE,SAAS,KAC5BA,EAAE,YAAY/B,EAAK,SAAS,GAChB;AACZ,UAAAA,EAAK,WAAW,KAAK,IAAIA,EAAK,UAAU+B,EAAE,QAAQ,GAClD/B,EAAK,SAAS,KAAK,IAAIA,EAAK,QAAQ+B,EAAE,MAAM;AAC5C;AAAA,QACF;AAAA,aACK;AACL,cAAM4jB,IAAW3lB,EAAK,aAAa+B,EAAE,YAAY/B,EAAK,WAAW+B,EAAE,QAC7D6jB,IAAW5lB,EAAK,aAAa+B,EAAE,YAAY/B,EAAK,WAAW+B,EAAE,QAC7D8jB,IAAY7lB,EAAK,YAAY+B,EAAE,SAAS,KAAKA,EAAE,YAAY/B,EAAK,SAAS,GACzE8lB,IAAY9lB,EAAK,YAAY+B,EAAE,SAAS,KAAKA,EAAE,YAAY/B,EAAK,SAAS;AAC/E,YAAI2lB,KAAYE,GAAW;AACzB,UAAA7lB,EAAK,WAAW,KAAK,IAAIA,EAAK,UAAU+B,EAAE,QAAQ,GAClD/B,EAAK,SAAS,KAAK,IAAIA,EAAK,QAAQ+B,EAAE,MAAM;AAC5C;AAAA,QACF;AACA,YAAI6jB,KAAYE,GAAW;AACzB,UAAA9lB,EAAK,WAAW,KAAK,IAAIA,EAAK,UAAU+B,EAAE,QAAQ,GAClD/B,EAAK,SAAS,KAAK,IAAIA,EAAK,QAAQ+B,EAAE,MAAM;AAC5C;AAAA,QACF;AAAA,MACF;AACA,MAAA6O,EAAO,KAAK,EAAE,GAAG7O,GAAG;AAAA,IACtB;AACA,WAAO6O;AAAA,EACT;AAAA,EAEQ,oBACNzB,GACApO,GACAC,GACAsL,GACA;AACA,SAAK,cAAA,GACL,KAAK,aAAa,EAAE,OAAAvL,GAAO,QAAAC,EAAA,GAC3B,KAAK,aAAamO,GAClB,KAAK,yBAAyBA,EAAK,eAAe;AAClD,UAAM0L,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM;AACpD,SAAK,sBAAsB,EAAE,OAAAD,GAAO,QAAAC,GAAQ,OAAO6Z,EAAA;AACnD,UAAMkL,IACJzZ,GAAS,wBAAwB,KAAK,oBAAoBtL,GAAQ6Z,CAAO,GACrE,EAAE,SAAAmL,GAAS,OAAA1c,EAAA,IAAU,KAAK,aAAatI,GAAQ+kB,CAAY,GAC3DzH,IAAQ0H;AACd,IAAA1H,EAAM,QAAQhV;AACd,UAAM2c,IAAa3H,aAAiB,oBAAoBA,EAAM,SAAS;AACvE,IAAAA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,YAAY,cACxBA,EAAM,MAAM,SAAS,KACrBA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,eAAe,KAC3BA,EAAM,MAAM,YAAY,QACxBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,UAAU,QACtBA,EAAM,MAAM,WAAW,QACvBA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,aAAa,WACrB2H,MACF3H,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,aAAa;AAE3B,UAAMzd,IAAM,KAAK,WAAWG,CAAM;AAiBlC,QAhBAsd,EAAM,MAAM,YACVzd,GAAK,OAAO,UACXA,GAAK,SAAS,YAAYA,GAAK,SAAS,SAASA,GAAK,SAAS,SAAS,UAAU,SACrFyd,EAAM,iBAAiB,WAAW,CAAC5c,MAAM,KAAK,UAAUA,GAAoByN,CAAI,CAAC,GACjFmP,EAAM,iBAAiB,SAAS,MAAM;AACpC,OAAIA,aAAiB,oBAAoBA,aAAiB,0BAA2B,OAAA;AAAA,IACvF,CAAC,GACD,KAAK,oBAAoBA,CAAK,GAC9BnP,EAAK,cAAc,IACnBA,EAAK,YAAYmP,CAAK,GAClBA,EAAM,QAAQ,YAAA,MAAkB,cAClC,sBAAsB,MAAM;AAC1B,MAAIA,aAAiB,uBAAqB,KAAK,SAASA,CAAK;AAAA,IAC/D,CAAC,GAEHA,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM,GAEjChS,GAAS,qBACRgS,aAAiB,oBAAoBA,aAAiB,sBACvD;AACA,YAAM4H,IAAM5H,EAAM,MAAM;AACxB,MAAAA,EAAM,kBAAkB4H,GAAKA,CAAG;AAAA,IAClC;AACA,SAAK,UAAU5H;AAAA,EACjB;AAAA,EAEQ,iBACNrT,GACAlK,GACAC,GACAsL,GACA;AACA,SAAK,cAAA,GACL,KAAK,aAAa,EAAE,OAAAvL,GAAO,QAAAC,EAAA;AAE3B,UAAM2f,IAAM,KAAK,4BAA4B5f,GAAOC,CAAM;AAC1D,QAAI,CAAC2f,EAAK;AACV,UAAMkE,IAAU,SAAS,cAAc,KAAK;AAC5C,SAAK,aAAaA,GAClB,KAAK,yBAAyB,MAC9BA,EAAQ,MAAM,WAAW,YACzBA,EAAQ,QAAQ,kBAAkB,SAClCA,EAAQ,MAAM,gBAAgB,QAC9BA,EAAQ,MAAM,UAAU,KACxBA,EAAQ,MAAM,SAAS;AACvB,UAAMhK,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM;AACpD,SAAK,sBAAsB,EAAE,OAAAD,GAAO,QAAAC,GAAQ,OAAO6Z,EAAA;AACnD,UAAMkL,IACJzZ,GAAS,wBAAwB,KAAK,oBAAoBtL,GAAQ6Z,CAAO,GACrE,EAAE,SAAAmL,GAAS,OAAA1c,EAAA,IAAU,KAAK,aAAatI,GAAQ+kB,CAAY,GAC3DzH,IAAQ0H;AACd,IAAA1H,EAAM,QAAQhV;AACd,UAAM2c,IAAa3H,aAAiB,oBAAoBA,EAAM,SAAS;AACvE,IAAAA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,YAAY,cACxBA,EAAM,MAAM,SAAS,KACrBA,EAAM,MAAM,UAAU,KACtBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,eAAe,KAC3BA,EAAM,MAAM,YAAY,QACxBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,UAAU,QACtBA,EAAM,MAAM,WAAW,QACvBA,EAAM,MAAM,aAAa,WACzBA,EAAM,MAAM,aAAa,QACzBA,EAAM,MAAM,aAAa,WACrB2H,MACF3H,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,aAAa;AAE3B,UAAMzd,IAAM,KAAK,WAAWG,CAAM;AAwBlC,QAvBAsd,EAAM,MAAM,YACVzd,GAAK,OAAO,UACXA,GAAK,SAAS,YAAYA,GAAK,SAAS,SAASA,GAAK,SAAS,SAAS,UAAU,SACrFyd,EAAM,MAAM,gBAAgB,QAC5BA,EAAM,iBAAiB,WAAW,CAAC5c,MAAM,KAAK,UAAUA,GAAoBmjB,CAAO,CAAC,GACpFvG,EAAM,iBAAiB,oBAAoB,KAAK,2BAA2B,GAC3EA,EAAM,iBAAiB,kBAAkB,KAAK,yBAAyB,GACvEA,EAAM,iBAAiB,SAAS,MAAM;AACpC,OAAIA,aAAiB,oBAAoBA,aAAiB,0BAA2B,OAAA;AAAA,IACvF,CAAC,GACD,KAAK,oBAAoBA,CAAK,GAC9BuG,EAAQ,YAAYvG,CAAK,GAIrBA,EAAM,QAAQ,YAAA,MAAkB,cAClC,sBAAsB,MAAM;AAC1B,MAAIA,aAAiB,uBAAqB,KAAK,SAASA,CAAK;AAAA,IAC/D,CAAC,GAEH,KAAK,KAAK,YAAYuG,CAAO,GAC7B,KAAK,2BAA2BlE,GAAKkE,CAAO,GAC5CvG,EAAM,MAAM,EAAE,eAAe,GAAA,CAAM,GAEjChS,GAAS,qBACRgS,aAAiB,oBAAoBA,aAAiB,sBACvD;AACA,YAAM4H,IAAM5H,EAAM,MAAM;AACxB,MAAAA,EAAM,kBAAkB4H,GAAKA,CAAG;AAAA,IAClC;AACA,SAAK,UAAU5H,GACf,KAAK,uBAAuBuG;AAAA,EAC9B;AAAA,EAEQ,UAAUnjB,GAAkByN,GAAmB;AACrD,QAAI,CAAC,KAAK,cAAc,CAAC,KAAK,QAAS;AACvC,UAAMgX,IAAM,KAAK,IAAA;AAEjB,QADIzkB,EAAE,eAAe,KAAK,aACtBykB,IAAM,KAAK,qBAAqB,GAAI;AACxC,UAAM,EAAE,OAAAplB,GAAO,QAAAC,EAAA,IAAW,KAAK;AAC/B,QAAIA,MAAW,KAAM;AACrB,UAAMolB,IAAa,KAAK,QAAQ,QAAQ,kBAAkB,YACpDC,IAAa3kB,EAAE,QAAQ,WAAWA,EAAE,QACpC4kB,IAAgB,CAAC3E,GAAkBC,MAAqB;AAC5D,YAAMpX,IAAO,KAAK,yBAAA;AAClB,MAAKA,EAAK,OACV,KAAK,WAAWzJ,GAAOC,GAAQwJ,EAAK,KAAK,GACzC,KAAK,OAAOzJ,CAAK,GACjB,KAAK,cAAc,EAAK,GACxB,KAAK,eAAe4gB,GAAUC,CAAQ;AAAA,IACxC;AAEA,QAAIlgB,EAAE,QAAQ,OAAO;AACnB,MAAAA,EAAE,eAAA,GACF4kB,EAAc,GAAG5kB,EAAE,WAAW,KAAK,CAAC;AACpC;AAAA,IACF;AACA,QAAIA,EAAE,QAAQ,SAAS;AACrB,UAAI0kB,KAAcC;AAEhB;AAEF,MAAA3kB,EAAE,eAAA,GACF4kB,EAAc5kB,EAAE,WAAW,KAAK,GAAG,CAAC;AACpC;AAAA,IACF;AACE,QAAIA,EAAE,QAAQ;AAIZ,UAHAA,EAAE,eAAA,GACF,KAAK,WAAWyN,CAAI,GACpB,KAAK,OAAA,GACD,KAAK,cAAc,KAAK,WAAW,WAAW,MAAM;AACtD,cAAM0L,IAAU,KAAK,UAAU,QAAQ,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM,GAC9EwD,IAAc,KAAK,sBAAsBxD,CAAO;AACtD,aAAK,oBAAoBwD,CAAW;AAAA,MACtC;AAAA,WACS3c,EAAE,QAAQ,eAAe,KAAK,QAAQ,UAAU,OACzDA,EAAE,eAAA,GACF,KAAK,WAAWX,GAAOC,GAAQ,EAAE,GACjC,KAAK,OAAOD,CAAK,GACjB,KAAK,cAAc,EAAK,GACxB,KAAK,eAAe,GAAG,CAAC;AAAA,EAE9B;AAAA,EAEQ,WAAWA,GAAeC,GAAuBsI,GAAgB;AACvE,QAAItI,MAAW,KAAM;AACrB,UAAMvB,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAAsB;AAAA,MACA,QAAAC;AAAA,MACA,MAAMsI;AAAA,IAAA,GAEFqZ,IAAY,KAAK,aAAa;AACpC,SAAK,OAAOljB,GAAKkjB,CAAS;AAAA,EAC5B;AAAA,EAEQ,kBAAkB;AACxB,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,WAAY,QAAO,KAAK,SAAS,SAAS;AACrE,QAAI,KAAK,mBAAmB,kBAAkB;AAC5C,UAAI,KAAK,QAAQ,SAAS;AACxB,eAAO,KAAK,QAAQ;AAEtB,UAAI,KAAK,QAAQ,SAAS,UAAU;AAClC,YAAI,KAAK,QAAQ,UAAU,GAAI,QAAO;AACtC,cAAMjW,IAAS,OAAO,KAAK,QAAQ,KAAK;AACxC,eAAO,OAAO,MAAMA,CAAM,IAAI,KAAKA;AAAA,MACrC;AACA,aAAO,KAAK,QAAQ;AAAA,IACtB;AACA,WAAI,KAAK,mBAAmB,oBACnB,KAAK,QAAQ,QAEd,KAAK,QAAgC;AAAA,EAC/C;AAAA,EAEQ,oBAAoBsZ,GAAsB;AAShD,IARI,CAAC,KAAK,cAQN,EANFA,aAAmB,mBACfA,EAAQ,SAAS,cACjBA,EAAQ,SAAS,UACjBA,EAAQ,SAAS,UACjBA,EAAQ,SAAS,mBACjBA,aAAmB,sBAEzBA,EAAQ,iBAAiB,UAAU,MAAM;AACvC,YAAM5H,IAAK,KAAK;AAChB,UAAI,CAACA,EAAI;AACT,YAAM,EAAE,OAAArd,GAAO,QAAAC,EAAA,IAAWod;AAC1B,UAAIpd,MAAW,KAAM;AACrB,YAAMwJ,IAAO,KAAK,yBAAA;AAClB,MAAKA,EAAK,OACV,KAAK,WAAWzJ,GAAOC,GAAQwJ,EAAK,KAAK,GACzC,KAAK,OAAOzJ,CAAK,GACjB,KAAK,cAAc,EAAK;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEQ,WAAWoO,GAAmB;AACpC,UAAMiP,IAAK,KAAK;AAChB,QAAI,CAACA,KAAMA,EAAG,WAAW,MAAM;AAC7B,WAAK,cAAc,EAAK,GACxBjP,EAAK,KAAA;AACL;AAAA,IACF;AAEA,UAAM,EAAE,OAAApO,GAAO,QAAAC,EAAA,IAAWod,GACpBmI,IACJ,KAAK,uBACL,KAAK,oBAAoB,UAAUxlB,KACnC,KAAK,oBAAoB,WAAWC,IAChC,KAAK,oBAAoB,QACzB,KAAK,UAAU,QAAQD,GAAOC,CAAM,GAEpC6Z,IAAU,KAAK,UAAU,QAAQ9Z,GAAOC,CAAM,GAC9CwlB,IAAO,CAACvgB,MAAgBA,KAAgC,IACxDwgB,IAAiBD,EAAKD,CAAI,GAC1BG,IAAoBF,EAAK3L,CAAO;AAItC,QAAI,CAAC,OAAO,GAAG6L,GAAmBD,CAAc,GAAG;AACjD,YAAMhnB,IAAe;AAAA,QACnB,MAAM;AAAA,QACN,OAAAsB;AAAA,QACA,QAAAC;AAAA,QACA,MAAMylB;AAAA,QACN,MAAMC;AAAA,MAAA;AAER,WAAK,OAAOjnB,GAAK,EAAI;AAAA,IACvB;AAEA,SAAK,cAAc,EAAK,GACxB0P,EAAK,KAAA;AAAA,EACP;AAAA,EAEQ,cAAcwX,IAAc,IAAO;AACzC,IAAA5X,EAAiB,KAAK,OAAO,GAC7BA,EAAiB,KAAK,oBAAoB,GACtC,KAAK,cAAc,KAAK,2BAA2B,SACrD,KAAK,WAAW,cAAc,KAAK,yBAErC,KAAK,UAAU,MACf,KAAK,uBAAuB,MAC5B,KAAK,aAAa,MAClB,KAAK,yBAAyB,MAC9B,KAAK,sBAAsB,MAC3B,KAAK,YAAY,IACb4X,MACF,KAAK,aAAa,MAClB,KAAK,eAAe,MAAM,IAAI;AAAA,EAElC;AACF;AC5wEO,MAAMC,KAAe,CAC1BrmB,MACyBA;AC7HpB,MAAMsmB,GAA8E;AAAA,EA4FzF,YAAYC,GAAmB;AA1F/B,SAAQ,QAA+B,MACvC,KAAQ,aAAoC,MAC5C,KAAQ,yBAAgD,MAMxD,KAAQ,mBAA4C,MAOpD,KAAQ,gBAAqC,MAC7C,KAAQ,gBAAqC,MAC7C,KAAQ,gBAAsC,MAC9C,KAAQ,QAAuB,MAC/B,KAAQ,cAAqC,MAC7C,KAAQ,mBAAkC,MAC1C,KAAQ,sBAAwE,MAChF,KAAQ,QAA+B,MACvC,KAAQ,aAA4B,MAGpC,KAAQ,UAAU,IAclB,KAAQ,oBAAwC,MAChD,KAAQ,yBAA8C,MACtD,KAAQ,oBAA0D,MAClE,KAAQ,yBAA4D,MACpE,KAAQ,sBAAoD,MAC5D,KAAQ,4BAA2C,MACnD,KAAQ,kBASG,MAEX,KAAQ,0CAA0B,IAAA,GAClC,KAAQ,yCAAyB,IAAA,GACjC,KAAQ,iBAAoC,MAC5C,KAAQ,wBAAkD,MAC1D,KAAQ,aAAgC,MACxC,KAAQ,kBAAoC,CAAA,GAC5C,KAAQ,aAAgC,MACxC,KAAQ,eAA6B,CAAA,GACrC,KAAQ,wCAAwB,IAAA,GAChC,KAAQ,oCAAoB,IAAA,GAyB1B,KAAK,OAAOA,EAAK,MACjB,KAAK,KAAK,UAAU,IAAI,cAAc,GACtC,KAAK,aAAaA,EAAK,SAAS,cAAc,QAC9C,KAAK,WAAWA,EAAK,SAAS,YAAY,UAC1C,KAAK,WAAWA,EAAK,SAAS,YAAY,QAC1C,KAAK,SAASA,EAAK,SAAS,QAC5B,KAAK,OAAOA,EAAK,SAAS,MAC1B,KAAK,gBAAgBA,EAAK,SAAS;AAEnC,UAAMC,IAAcD,EAAK,eAAe,MAClCE,IAAcD,KAAe,CAAA;AACnC,SAAK,aAAaA,KAAgB,MAClC,KAAK,YAAY,IAAIE;AAAA,MACnBD;AAAA,MACAF,EAAK;AAAA,MACLA,EAAK;AAAA,IAAA,GAEP,KAAK,eAAe,IAAIlnB,GAAA,GACxB,KAAK,cAAc,IAAIsB,GAAY,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI,GACxE,KAAK,WAAW,KAAK,eAAe,KAAK,UAAU,GACnD,KAAK,eAAe4lB,EAAK,OAAO,GAChC,KAAK,mBAAA,GACA,KAAK,YAAA;AAAA,EACZ;AAAA,EAtFQ,eAAe/lB,GAAeC,GAAgB;AACpD,WAAO,KAAK,aAAa,cAAc,KAAK,UAAU,WAAWD,GAAOC,CAAM;AAAA,EAChF;AAAA,EAEQ,aAAaJ,GAAqC;AACxD,WAAI,OAAOA,KAAQ,WACV,KAAK,YAAYA,CAAG,GAAG,MAAM,QAExB,KAAK,UAAU,YAAA,EAAcA,CAAG,KAAK,OACrC,MAAM;AAAA,EACtB;AAAA,EA8BQ,2BAA2B;AACjC,WAAO,KAAK,KAAK,UAAU,SAAS,0BAA0B;AAAA,EAChE;AAAA,EAEQ,WAAW6T,GAAuB;AACxC,QAAI;AACF,WAAK,SAAS,OAAOA,CAAK,GACH,KAAK,aAAa,KAAK,CAAC/S,MAAMA,EAAE,UAAU,QAAQ,MAEvE,KAAK,eAAe,KAAK,aAAa,OAAO,CAACA,MAAMA,EAAE,UAAU,QAAQ,GACxE,KAAK,eAAA;AAAA,IAET,SAAS,GAAG;AACV,YAAM0e,IAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AACzD,WAAK,eAAe;AAAA,QAClB,GAAG,KAAK,aAAa,OAAO,CAAC1a,MAAMA,EAAE,UAAU,QAAQ;AAAA,QACvD,EAAE,OAAO,UAAU,SAAA0a,EAAA;AAAA,MAAQ,GAE7B,KAAK,eAAA;AAAA,IACP;AAAA,EACF;AAAA,EA4BA,MAAc,cAAc;AAC1B,QAAI,KAAK,QAAQ;AACf,UAAI;AACF,cAAMT,IAAU,MAAM,KAAK,OAAO,aAAA;AAClC,aAAK,UAAU,QAAQA,EAAQ,IAAI,GAC/BA,EAAQ,UAAQ,KAAK,UAAU,UAAUA,EAAQ,MAAM,GACvDA,EAAQ,QAAM,KAAK,UAAU,QAAQA,EAAQ,IAAI,GACrD,KAAK,OAAOA,EAAQ,QAAQ,KAAK,MACjC,KAAK,YAAY,QAAQ,KAAK,IAAI;AAAA,MACpC,SAASje,GAAG;AAEV,gBAAQ,KAAK,uBAAuBA,CAAC;AAAA,MACvC;AAEF,SAAK,MAAA;AAAA,EACP;AAAA,EAEQ,eAAe4K,GAAuB;AAC5C,UAAM4a,IAAUC,GAAQ7a,GAAS,YAAY;AAI7C,QAHI4a,GAAS,UACX,KAAK,KAAK,UAAU,IAAI,GAAGA,CAAO,GAEhC5a,GAAS;AACX,iBAAW,CAAC7J,GAAGwD,CAAC,KAAK,OAAO,QAAQqG,EAAQ,YAAY;AAEtD,aAAK,KAAK,MAAM7J,CAAC,IAAIwD,KAAK;AAAA,EAGhC;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,KAAK,UAAU,OAAO,wBAAwB,KAAK,aAAa,UAAU;AAAA,EACjF;AAAA,EAEQ,eAAe9E,GAA4B;AACjD,QAAIA,MAAS,QAAQ;AACnB,YAAMimB,IAAK,OAAO,YAAc,MAAc,UAAU,YAAY;AAUpE,aANE,4DAA4D,KAAKA,CAAE,KAClE,OAAO,YAAc,OACpB,mBAAmB,aAClB,UAAkC,eAAe,QAAQ;AAAA,QAAK,CAACpf,MAC9D,OAAO,KAAKA,EAAE,SAAS,EAAE;AAAA,MAAA,IAG3B,IAAI8F,GAAa,KAAK,SAAS,IAC/B,IAAIwO,GAAe,KAAK,WAAW,MAAM,KAAK,QAAQ;AAAA,IAC5D;AACA,WAAOnb,MAAS,SACZ,IAAI2M,GAAa,KAAK,SAAS,IAC/B,IAAIwO,GAAe,KAAK,WAAW,MAAM,KAAK,QAAQ;AAAA,EAC5D;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,SAAS,KAAK,cAAc,KAAK,MAAM,kBAAkB,KAAK,KAAM;AAC7E,SAAK,KAAK,YAAY;AACtB,UAAM+K,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY;AAClB,UAAMC,IAAW,SAAS,cAAc,KAAK;AAC7C,IAAAA,EAAS,YAAY,oBACrBD,EAAM,YAAYC,CAAQ,GAC1B,KAAK,KAAK,YAAYD,CAAK,GAC3B,KAAK,QAAQA,GACb,KAAK,aAAaC,GAElB,KAAK,wBAAwB,WAAA;AAC7B,UAAMC,IAAQ,WAAW;AACzB,IAAI,OAAOA,KAAU,cACnB,KAAK,yBAAyB,IAAIA,EAAM,MAAM;AAC5C,WAAK,uBAAA;AAAA,IACP,CAAC,GACD,KAAK,uBAAuB,QAAQD,CAAQ,KAE5C,KAAK,yBAAyB;AAAA,EAElC;AAAA,EAEQ,gBAAgB;AACtB,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AAAA,EAEQ,MAAME,IAAQ,IAAO;AAC3B,QAAI,KAAK,WAAW,CAACA,EAAO;AAC5B,SAAK,YAAA;AACL,UAAMC,IAAO,KAAK,cAAc,KAAK;AAOrC,QANA,KAAK,SAAS,MAAMA,CAAI,GACxB,KAAK,kBAAA,GACL,KAAK,YAAA,GACL,KAAK,kBAAA,GAEL,KAAK,KAAK,UAAU,OAAO,mBAAmB,CAAC,KAAK,UAAU,GAC1D,CAAC,KAAK,YAAY;AACpB,WAAK,KAAK,QAAQ,UAAU,WAC5B,KAAK,aAAA,GACL,KAAK,iBAAA,GACL,KAAK,eAAA,GACL,KAAK,cAAc,MAAM;AACzB;AAAA,IACF;AACA,SAAK,mBAAmB,IAAIlL;AAAA,MAC1BkL;AAAA,MACA,KAAK;AAAA,MACL,CAAChoB,GAAKkjB,MAAc,KAAK,WAAWljB,GAAKkjB,CAAS;AAAA,MAClD,CAAC5hB,MAAA;AAAU,QAAK,KAAK,YAAY,UAAUA,CAAK;AAAA;AAAA,MAChD,CAACA,MAAA;AAAU,QAAK,KAAK,YAAY,aAAaA,CAAK;AAAA;AAAA,MACnD,CAACgT,MAAO,KAAK,SAAS,QAAQA,CAAE;AAAA,MAChC,KAAK,SAAS,gBAAgB,CAACA,MAAO,KAAK,SAAS,cAAeA,CAAE,IAAI;AAAA,MACzE,KAAK;AAAA,MACL,KAAK;AAAA,MACL,CAAChT,GAAOC,MAAW,KAAK,eAAeD,GAAOC,CAAM;AAAA,MACpD,CAAC0mB,MAAW,KAAK,WAAWA,CAAM;AAAA,MAClC,CAAC3mB,GAAOC,MAAW;AACjB,cAAMuM,IAA4BxM,KAASC,MAAW,OAAO,EAAE,OAAAD,GAAO,QAAAC,MAAW;AACjF,QAAIuM,KAAQ,KAAK,SAAS,cAAcA,EAAO,OAAOA,EAAO,MAAM,GACnE,KAAK,aAAaA,GAClB,KAAK,cAAc,WAAW;AAAA,MAChC;AAAA,MACA,CAACxM,GAAO4mB,GAASjiB,GAAGC,MAAM,KAAK,gBAAgB5E,GAAO2E,GAAGC,CAAC;AAAA,MAC1D,CAAC8D,MAAW;AACV,aAAK,kBAAkBA,GACvB,KAAK,SAAS,aAAaA,CAAM,GACjC,KAAK,cAAc,WAAW;AAAA,MAChC;AAAA,MACA,MAAM,KAAK,KAAA;AAAA,MACX,MAAM,KAAK,KAAA;AAAA,IAAK,GAElB,KAAK,KAAK,QAAQ,UAAU,SAC5B,KAAK,aAAA,GACL,KAAK,iBAAA,GACD,KAAK,WACP,KAAK,cAAc,KAAK,OAAO,UAAU,CAACuF,MAAU,KAAK,kBAAkBA,CAAK,CAAC,IAEnF,KAAK,eAAA,GACL,KAAK,cAAc,WAAW,GAC9B,KAAK,UAAU;AAAA,EACjB;AAAA,EAEA,UAAU;AACR,SAAK,mBAAA,GACL,KAAK,kBAAkB,QAAA,GACvB,KAAK,SAAS,QAAA,GACd,KAAK,cAAA,GACL,KAAK,eAAA,GACL,KAAK,wBAAwB,WAAA,GAC7B,KAAK,yBAAyB,MAC9B,KAAK,UAAU;AAAA,EACjB;AAAA;AAAA,EAIA,aAAa4Y,GAA+B;AAC1C,SAAK,KAAK,YAAY,IACtB,KAAK,KAAK,UAAU,IAAI,GAAIT,GAAQS,CAAU,KAAK,EAAG;AAAA,EACxD;AAAA,EAEA,aAAajD,GAAqC;AAChD,eAAW,CAACliB,GAAGwD,CAAC,KAAK,OAAO,QAAQ0e,CAAK;AAEvC,WAAK,KAAK,MAAMliB,CAAC,IAAIwD,KAAK;AAAA,EAE9B;AAAA,EAEA,QAAQ4hB,GAAuB;AAC7B,QAAIA,KAAQ,MAAM;AAEhB,UAAI,KAAK,WAAY;AACrB,WAAK,aAAa,IAClB,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA;AACL;AAAA,IACF;AACA,UAAMC,IAAY,KAAK;AACvB,SAAK,aAAa,IAClB,KAAK,UAAU,QAAQD,CAA8B,GACrD,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA,GAEAC,MACH,KAAK,KAAK,UAAU,OAAO,iBAAiB,GAC5C,KAAK,kBAAkB,QAAA,GACvB,KAAK,mBAAmB,MACxB,KAAK,MAAA;AAAA,EAET;AAAA,EAEA,QAAQpc,GAAY;AAClB,SAAK,UAAU,QAAQA,CAAI,GAC3B,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA;AAAA,EACP;AAAA;AAAA,EAGA,YAAoB;AAClB,WAAO,KAAK,UAAU,UAAA;AAAA,EACxB;AAAA,EAEA,UAAgB;AACd,WAAO,KAAK,UAAU,QAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAe;AACb,WAAO,KAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAkB;AAChB,WAAO,KAAK,UAAU,YAAA,EAAc,IAAI,CAAC3J,OAAO,EAAE,GAAIA,EAAE,IAAA,EAAuB;AAAA,EACjF;AAAA;AAAA,EAGA,QAAoChB,GAAeC,GAA6B;AAC9E,WAAO,KAAK,UAAU,QAAQD,GAAOC,CAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,YAAYD,GAAuB;AACjC,WAAO,KAAK,UAAU,YAAYA,CAAK;AAAA,EACzC;AAAA,EAEA,eAAeC,GAAwB;AACrC,WAAO,KAAK,UAAU,eAAeA,CAAM;AAAA,EAC7C;AAAA;AAAA,EAGA,YAAYD,GAAmC;AAC7C,UAAM0M,IAAM,KAAK,UAAU,gBAAgB1M,CAAK;AAChD,WAAI0M,IAAM,IAAU,OACb,KAAK,UAAU,YAAA,EAAcA,CAAG,KAAK;AAAA,EAC9C;AAAA,EAEA,WAA0B;AACxB,WAAO,KAAK,UAAU,SAAA;AAAA,EACxB;AAAA,EAEA,aAA4B;AAC1B,WAAO,KAAK,UAAU,YAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAOsa,GAAyC;AAC9C,UAAMhnB,IAAQ,KAAK,aAAagnB,CAAY;AAC5C,WAAKhnB,IACE,KAAK,SAASA,CAAK,IADP;AAAA,EAErB;AAAA,EAEQ,SAASA,GAAyB;AACxC,UAAMinB,IAAQ,KAAK,YAAYjnB,CAAK;AACpC,QAAI,CAACinB,EAAO,QAAO;AACnB,UAAMznB,IAAS,KAAK,UAAU,UAAA,GACxBN,IAA+B,EAAE,GAAI+nB,EAAM,IAAA;AACjD,eAAWnnB,KAAON,EAAO;AACvB,MAAAN,EAAIY,EAAI,GAAG,IAAI,KAAK,UAAU,iBAAiBE,GAAOF,CAAG,EAAE;AAE7D,WAAOZ;AAAA,EACT;AAAA;AAAA,EAGA,eAAoB;AAElB,WADa,KAAK,UAAU,YAAA,EAChB,IAAI,CAAC8B,MAAM,KAAK,SAASA,EAAE,EAAE,CAAC,EAAE,OAAO,OAAO;AAAA,EAC5D;AAAA,EAEA,cAA0Cf,GAAmB;AAE3D,UAAMH,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACI,MAAMA,EAAE,QAAQD,CAAM;AACvD,WAAKH,IACQ,KAAK,UAAU,YAAA,EAChB,IAAI,CAACkB,MAAM,KAAK,UAAU,iBAAiBA,EAAE,IAAIlB,CAAG,EAAE,KAAa,IAF9D,CAAA;AAAA,EAGnB;AAAA;AAAA,EAGA,aAAmD;AACjD,WAAI,KAAK,aAAa,+BAAqB,IAAA,IACpC,IAAI,IAAI,KAAK,UAAU,YAAY;AAAA,EAC5C;AAAA,EAEA,mBAA6B;AAC3B,WAAO,CAAC,GAAG,KAAK,WAAA,EAAa,MAAM;AAAA,EACrC;AAAA,EAEA,oBAA6B;AAC3B,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA,EAEA,sBAA8B;AAC5B,UAAMonB,IAAU,KAAK,WAAA;AACrB,QAAI9a,IAAQ;AACZ,eAAWvM,KAAOqnB,EAAQ,OAAA,QAAmB,OAAO,KAAKrnB,CAAG,EAAE;AAC9D,WAAOuM;AAAA,EACT;AAAA,EAEA,eAA2CvM,GAAsBI,GAAoB;AACnF,QAAI,KAAK,aAAa,SAAU,QAAO;AACvC,UAAMD,IAAQ,KAAK,aAAaH,CAAG;AACnC,WAAKG,IACE,KAAK,UAAU,WAAWA,GAAOC,CAAM,IAD3B;AAAA,EAErB;AAAA,EAEA,gBAA4CJ,GAAsBI,GAAmB;AACnF,UAAMD,IAAQ,KAAK,aAAaH,CAAG;AACnC,QAAI,CAACG,EAAO,QAAO;AAEnB,UAAMF,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAAC,MAAM,OAAO,EAAE,GAAG,MAAM,OAAOG,CAAM,CAAC;AACvE,QAAI,CAACH,EAAK,QAAO;AACjB,UAAMuM,IAAM,KAAK,UAAU,iBAAiBrM,GAAOF,CAAG;AACtD,QAAIuM,EAAI,aAAc,QAAOA,EAAI;AACjC,UAAMnH,IAAImH,EAAI;AACd,QAAIvM,EAAI,SAAS;AAEf,aADc4Q,GAAexL,CAAC,MACbA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,QAAIpF,EAAI,SAAS;AAEf,aADc6Q,GAAazL,CAAC,MACXA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,QAAIA,KAAM,KAAyB,QAAO;AAC1C,QAAIA,aAAa,KAAM,QAAOA,EAAE,YAAA;AAChC,QAAI,OAAOA,KAAM,SAAU,QAAOA;AAClC,QAAI,OAAOA,KAAM,YAAY,OAAOA,KAAM,UAAW,QAAO,OAAOA,CAAC;AACpE,QAAI,OAAOA,KAAM,UAAU;AACzB,YAAMiiB,IAAKjiB;AACX,UAAIiiB,EAAG,SAAS,UAAU,OAAOA,EAAG,SAAU,iBAAiBA,EAAG;AAClE,UAAIA,EAAG,SAAS,UAAU,MAAM,QAAQA,EAAG,MAAM;AAE/C,eADeA,EAAG,OAAO,OAAO,CAACxiB,MAAmB,OAAOA,KAAM,QAAQ,EAC3D,KAAK,IAAI;AAAA,IAE3B;AACA,WAAO,OAAOO,CAAC;AAAA,EACjB;AAAA,EAEA,UAAUkiB,GAAYC,GAA2C;AAC/D,QAAIC,IAA0B;AAC9B,QAAI,OAAOD,KAAa,YAAY,OAAO,SAASA,CAAQ;AAC1D,MAAAC,IAAW,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,MAAMD,CAAQ,GAAG,KAAK,UAAU,eAAA,CAAgB,CAAC;AAAA,aAC7E,OAAOA,KAAa,UAAU;AACvC,YAAME,IAAU,KAAK,UAAU,gBAAgBF,CAAQ;AACvD,MAAIE,KAAW,MAAGD,IAAWC;AAAA,IAC/B;AACA,IAAID,MAAa,SAAMA,IAAW,KAAK,UAAU,eAAA;AACjD,UAAME,IAAQ,KAAK,UAAU,YAAYJ,GAAiCE,CAAQ,GAC5E5oB,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAO8oB;AAAA,MACP,SAAAJ;AAAA,MACA,SAAS,EAAE,OAAOE,EAAA;AAAA,IAAS;AAE7B,gBAAK,aAAa,QAAQ5oB,CAAG,GAC7B,KAAK,aAAa8oB,GAAO,KAAK,GAC9B,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA,GACD,KAAK,aAAa,YAAe,KAAK,WAAW,CAAC9oB,CAAG,CAAC,GACnD8oB;AAAA,EACT;AAAA,EAEA,UAAU3nB,GAA+B;AACvC,UAAMG,IAAQ,KAAK,aAAaH,CAAG;AACnC,QAAI,CAACG,EAAO,QAAO;AACnB,UAAMynB,IAAU,KAAK,UAAU,UAAUznB,CAAK;AAC9C,QAAI,CAACynB,EAAS,QAAO;AACrB,UAAM/oB,IAAe;AAAA,MACnB,MAAM;AAAA,MACN,OAAO+oB,EAAQ,IAAI;AAAA,MACnB,SAASA,EAAQ,IAAI;AAAA,MACrB,SAAS,EAAE,OAAOA,EAAQ,MAAA;AAAA,IAAM;AAElC,gBAAK,aAAa,QAAQ/oB,CAAG,GAC7B,KAAK,aAAasB,GAAO,QAAQ,GACjC,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA,GACD,KAAK,aAAa,YAAe,KAAK,WAAW,CAACtB,CAAG,CAAC,GACnD;AAAA,EACT;AAAA,EAEQ,WAAWA,GAAckjB,GAAoB;AAEnD,QADI,KAAK,aAAa,cAClB,CAACljB,EAAI,SAASA,EAAI,WAAW,OAAW;AAC5C,UAAMmZ,IAAO,KAAK,UAAU,QAAQnZ,EAAI,OAAOA,EAAI,MAAM;AACzD,SAAK,aAAa,QAAQ,EAAE,GAAGA,GAAK,MAAAmZ,GAAM,GAC1C,KAAK,UAAU,QAAQnZ,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAMkjB,CAAS,GACjE,KAAK,aAAaljB,EAAI,OAAO,MAAM,GACnC,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM,GACrBkjB,KACG,KAAK,WAAW,CAACljB,CAAG,CAAC;AAAA,EAE9B;AAAA,EAEA,OAAO;AACL,SAAK,kBAAkB,cAAA;AACvB,UAAMgpB,IAAO,KAAK,aAAa,KAAA;AAC/B,QAAI,GAACA,KAAQ,CAACA,EAAK,SAEnB;AAAA,eAASrmB,IAAIqmB,EAAK,SAAS,GAAGrmB,KAAK,GAAGA,KAAK,GAAG;AAC5C,cAAM3C,IAAMgpB,EAAKrmB,CAAC;AAClB,QAAK3C,KACL,KAAK,aAAaA,CAAG;AAAA,MACvB;AACA,WAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM;AAAA;AAAA,EAC3B;AAAA,EAEA,OAAO;AACL,SAAK,kBAAkB,cAAA;AACvB,UAAMgpB,IAAO,KAAK,aAAa,KAAA;AAC/B,QAAI,GAACA,KAAQ,CAACA,EAAK,SACnB;AAAA,iBAAWhpB,KAAOgpB;AAChB,aAAK,aAAahpB,CAAG;AAEvB,WAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM;AAAA;AAAA,EAC3B;AAAA,EAEA,qBAAsC;AACpC,UAAMipB,IAAU,CAACD,MAA0C;AACzD,YAAME,wBAAW,IAAA,GACXC,IAA8B,CAAA;AACpC,iBAAW3nB,KAAKwnB;AACd,QAAIE,EAAK,IAAI1nB,EAAE,IAAI,MACnB0nB,EAAK,IAAI1nB,EAAE,IAAI,GACf2nB,EAAM,KAAK3nB,EAAE,IAAI;AAEnB,aAAO2nB;AAAA,IACT,GAEMC,IAAW,CAACD,GAA6BE,MACzCF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,SAC9B,QAAQE,CAAY,aAEzBF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,cAC9BE,MAAiB,IAAI,eAAe,eAAeA,CAAY,MAEpEF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,cAC9BE,MAAiB,IAAI,eAAe,eAAeA,CAAY,MAEpEF,EAAM,WAAW,KAAKA,EAAM,CAAC,MAAM,eAC9B,gBAEF,YAAYA,EAAM,KAAK,IAAI,CAAC,KAAKE,CAAY,KAGhDC,IAAU,CAACC,MACfA,EAAO,IAAI,CAAC7oB,MAAM;AAChB,YAAMyoB,IAAQF,EAAQvoB,EAAE,QAAQ,GAC1B2oB,IAAe3oB,EAAE,SAAS;AAChC,aAAO;AAAA,QACL,SAASA,EAAE;AAAA,QACX,OAAAyoB;AAAA,QACA,cAAAE;AAAA,QACA,OAAOD,EAASD,GAAOE,CAAY;AAAA,MAAA;AAAA,IAEvC,CAAC;AAEH,WAAO;AAAA,MACL,MAAMC,EAAQ,KAAK,aAAa,gBAAgB;AAAA,MAChD,MAAMA,EAAQ,KAAK,aAAa,gBAAgB;AAAA,IAAA;AAAA,EAEpD;AAAA,EAEQ,aAAatpB,GAAc;AACjC,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SAASA,EAAI,WAAW,WAC9B,KAAK,UAAU,QAAQA,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAM,KAAK,aAAa,QAAQ,GAClF,KAAK,aAAaA,EAAI,OAAO,MAAM;AAErC;AAAA,MACF,KAAK;AACH,QAAIA,EAAI,SAAO,KAAK,UAAU,UAAUA,EAAI,KAAK,GAC7CA,EAAI,SAAO,KAAK,aAAaA,EAAI,OAAO,QAAQ;AACpD;AAAA,MACF,KAAK;AACH,YAAIA,EAAI,SAASA,EAAI,SAAS;AAC5B,gBAAMgO,IAAOhO,EAAI,SAAiD,OAC5DyQ,IAAQ,OAAOzC,KAAQ,WAAWA,IAAM,KAAK,UAAU,eAAA;AAC7D,eAAK,UAAU,YAAYhO,EAAI,SAASyQ,GAAOzQ,EAAI,KAAK,GACxD,KAAK,aAAaA,EAAI,OAAO,KAAK;AAAA,QACpC;AACA;AAAA,MACF;AACE;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,aAAaA,GAAc;AACjC,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SAASA,EAAI,WAAW,WAC9B,KAAK,UAAU,QAAQA,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAM,KAAK,aAAa,QAAQ,GAClF,KAAK,aAAaA,EAAI,OAAO,MAAM;AAErC;AAAA,MACF,KAAK;AACH,YAAIA,EAAI,SAAS;AACf,gBAAMgO,IAAOhO,EAAI,SAAiD,OAC5DyQ,IAAQ,OAAOzC,KAAQ,WAAWA,IAAM,KAAK,UAAU,eAAA,GACvDwb,IAAW,OAAOxpB,EAAI,SAAU,WAAWA,EAAI,QAAQ;AAC7D,eAAK,UAAU,YAAYA,EAAI,SAASyQ,GAAO+Y,CAAQ,GACnDA,KAAU,KAAK,aAAaA,GAAU,KAAK;AAAA,QACjD;AACA;AAAA,MACF,KAAK;AACH,QAAIxpB,EAAI,UACN,KAAK,UAAU,UAAUA,EAAI,KAAK,GAClC,KAAK,aAAaA,EAAI,OAAO,QAAQ;AAEvC;AAAA,MACF;AACE;AAAA,IAAA;AAAA,EAEN;AAAA,EAIA,MAAM,OAAOypB,GAA4D;AACvE,UAAMjB,IAAU,KAAK,aAAa,YAAA;AAClC,QAAI,CAACA,EAAQ,OAAQ,QAAO,CAAA;AAC5B,QAAIiB,GAAS;AACX,UAAI;AACF,cAAMA,EAAQ,EAAE,UAAUjB,GAAS,MAAM,KAAK,MAAM,GACpD,KAAK,kBAAA;AAAA,MACP,SAASvmB,GAAG;AACV,mBAAK,kBAAkBA,CAAC,GAClBA;AAAA,MACR;AACA,aAAO,KAAK,eAAeumB,CAAO;AAAA,IACpC;AAEA,WADkB,KAAK,eAAeA,GAAS,MAAM,KAAK,WAAWA,CAAO,CAAC;AAAA,EAE/E;AAAA,EAEA,MAAc,WAAWkB,GAAqB;AAC5C,QAAI,KAAK,UAAU,KAAK;AACtB,UAAI;AACF,cAAM,KAAK,OAAO,OAAOA,GAAU,KAAK,IAAI,GAC5C,KAAK,kBAAA;AAAA,MACP,SAAS,GAAG;AAEV,gBAAQ,KAAK,iBAAiB,CAAC,GAC/B,KAAK,kBAAkB,CAAC;AAAA,MAC1B;AAAA,EAEJ;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,eAAe,KAAK,aAAa,OAAO,CAACznB,MAAMA,EAAE,UAAU,QAAQ,GACxE,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,kBAAkB0nB,GAAgB;AACxC,UAAMC,IAAMD,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AACjE,SAAK,eAAe;AAAA,MAClB,GAAG,KAAK,aAAa,OAAO,CAAC1jB,MAAMA,EAAE,UAAU,QAAQ;AAAA,MACvD,EAAE,OAAO,UAAU,SAAS2jB,EAAA;AAAA,IAAI,GAElC,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,eACNpB,GACAqB,GACmC;AACnC,UAAMC,wBAAc,IAAA;AACpB,eAAW9pB,KAAOwoB;AAChB,MAAIxoB,EAAI,UACN,KAAK,UAAU,aAAaA,EAAI,KAAK,GACrC8pB,EAAQ,IAAI9pB,EAAI,KAAK;AAmBzB,YAhBY,YAAY;AACtB,MAAI6pB,WAAkBA,EAAA,GACtB,MAAM,KAAK,YAAY,eAAerB,EAAQ,GAAG,EAAE,GAAG,KAAK,GAC3D,KAAK,aAAa,MAAA;AAClB,YAAMuB,IAAsC,CAAA;AAC5C,iBAAWzoB,KAASwoB,GAAS;AAC3B,aAAK,aAAaxoB,GAAO,MAAM;AAC/B,cAAM0oB,IAAO,KAAK,oBAAoB1oB,CAAK;AAC3C,QAAI0oB,KAAMD,EAAU,KAAKC,CAAI;AAAA,MAC/B;AACA,kBAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,eAAA,GACL,KAAK,cAAc,MAAM,GAClBD;AAAA,IACT,GACO;AAAA,EACT;AAAA,EAEQ,kBAAkBxa,GAIvB;AACD,eAAWvP,KAAOuP,EAAM;AACtB,WAAK,aAAavP,CAAG;AAEvB,SAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,cAAc,MAAM,GACzB,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,aAAaA,GAAc;AACjC,YAAQA,EAAI,MAAA;AAAA,MACV,KAAK;AACH,QAAIA,EAAI,SAASA,EAAI,WAAW,WAC9B,KAAK,UAAU,QAAQA,EAAI,OAAOA,EAAI,QAAQA,EAAI,MAAM,EAAI,GAC5D,KAAK,aAAaA,EAAI,OAAO,MAAM;AAErC;AAAA,MACF,KAAK;AACH,YAAIA,EAAI,SAAS;AACf,gBAAME,IAAK,KAAK,UAAU,UAAUF,EAAI,OAAO;AAC/C,UAAIE,KAAI,KAAK,aAAaA,GAAI,KAAK;AAAA,QACrC;AACA;AAAA,MACF,KAAK;AACH,QAAIF,EAAI,UACN,KAAK,UAAU,UAAUA,EAAI,KAAK,GAClC,KAAK,aAAaA,EAAI,OAAO,QAAQ;AAEvC;AAAA,MACF,KAAK;AACH,QAAIA,EAAI,QAAQ,OAAOA,EAAI,QAAS,YAClC,KAAK,UAAU,QAAQA,EAAI,IAAY;AAEzC;AAAA,IAEA;AAAA,EAEN;AAAA,EAEQ,oBAAoB;AAC1B,QAAI,KAAK,aAAa,YAAa;AACnC,SAAK,cAAc;AACnB,UAAMiqB,IAAM,SAAS,cAAc,KAAK;AACxC,IAAAA,EAAI,YAAY,wBAChBA,EAAI,aAAa,WAAW,QAAQ,GACpCA,EAAI,iBAAiB,eAAe,CAAChoB,MAAMA,EAAE,gBAAgB;AAE7D,UAAMioB,IADe,KAAK,aAAa,aAEnC,CAAC,EAAE,KAAK,QAAQ,OAAO,OAAA,CAAQ,IAC/B;AAAA,MACE,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,MACtB,EAAE,KAAK,SAAS,OAAO,QAAA;AAAA,MACvB,EAAE,KAAK,WAAW,MAAM,MAAA;AAAA,MACxB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,MACtB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,MACtB,EAAE,KAAK,WAAW,MAAM,MAAA;AAAA,MACxB,EAAE,KAAK,gBAAgB,OAAO,mBAAA;AAAA,MAC9B,EAAE,KAAK,gBAAgB,OAAO,mBAAA;AAAA,MAC9B,EAAE,KAAK,cAAc,OAAO,aAAA;AAAA,IAAa,GAEzChY,IAAO,SAAS,cAAc,KAAK;AACzC,eAAWiY,KAAOD,GAAS;AACzB,UAAIC,EAAI,SAAS,OAAO;AACtB,cAAMC,IAAK,SAAS,cAAc,IAAI;AACtC,QAAAA,EAAG,YAAY,uBACflY,EAAK,YAAYkY,CAAE;AACnB;AAAA,MACF;AACA,YAAM5Z,IAAM,SAAS,cAAc,QAAQ;AAC3C,MAAAA,EAAI,OAAO,UACXA,EAAI,QAAQ,SAAS2Z,EAAI,KACzB3Z,EAAI,cAAc2Z,EAAI,SAAS,IAC/B3Z,EAAI,iBAAiB,SAAS,MAAM;AAClC,aAAK,oBAAoB2Z,EAAI,GAAG,GAChC,KAAK,iBAAA;AAAA,MACP,CAAC,GACDjY,EAAK,YAAY1B,CAAG;AAAA,IACtB;AACA,IAAAyZ,EAAI,YAAY/X,CAAI,IACnB,KAAK,cAAc,KAAK,MAAM,YAAY+X,CAAG,GAC9C,KAAK,cAAcA;AAAA,EACrB;AAAA,EAEQ,gBAAgB3oB,GAAsBgZ,GAAiBC,GAAiB;AAG9E,QAFA,KAAK,kBAAA,GACD,CAAC,KAAK,eACN,CAAC,KAAK,YAAY,gBAEpB,KAAK,cAAc,MACnB,KAAK,kBAAA,GACD,CAAC,KAAK;AAAa;AAEzB,SAAK,mBAAmBjZ;AAExB,eAAWkP,KAAO,MAAM;AAAA,MACtB,KAAK,YAAY,iBAAoC,qBAAqB;AAAA,IAAA,GACzE;AACD,YAAMyX,IAASzX,EAAI,QAAQ;AAC3B,MAAIyX,MAAW,SAAQzX,EAAI,WAAW,CAAC,KAAK,aAAa,QAAA,IAChDyX,MAAW,WAAQzX,EAAI,WAAW,CAAC,KAAK,aAAa,QAAA;AAAA,IAChE;AACA,UAAM6Z,IAAgB,OAAO,YACvBjU,IAAiB,OAAO,aACxB5K,IAAO,EAAE,OAAO,KAAK,QAAQ,IAAA;AACnC,QAAI2L,IAAOmD,GACPlD,IAAMmD;AACV,IAAIpD,IAAO3L,EAAK,QAAQ6e,MAAelT,IAAO,KAAK,IAAI,GAAGkT,IAAgB7e,EAAK,QAAQ,CAAC,IACpF4L,IAAM5L,EAAK,SAAS4K,MAAgBgB,IAAM,KAAK,IAAI,GAAGhB,IAAiB5K,EAAK,SAAS,CAAC,IAC1F,KAAK,YAAY,MAAM,OAAO,GAAG2L,CAAI,MACrC,KAAK,YAAY,MAAM,MAAM,GAAGC,CAAG,MACnC,KAAK,YAAY,cAAA,GACjB,KAAK,YAAY,cAAA;AAAA,EACnB;AAAA,EAEQ,oBAAoB6Q,GAAgB;AAC1C,QAAIA,MAAW,QAAQ;AACrB,MAAK,KAAK,kBAAkB,cAAA;AAC5B;AAAA,IACF;AACA,QAAIA,MAAW,SAAS;AACtB,MAAK,KAAK,kBAAkB,mBAAA;AAC5B;AAAA,IACF;AACA,QAAIA,MAAW,QAAQ;AACrB,WAAK,KAAA;AACL;AAAA,IACF;AACA,QAAIA,MAAW,QAAQ;AACrB,WAAK,KAAA;AACL;AAAA,IACF;AACA,QAAI,CAAC,KAAK,iBAAkB;AAC5B,UAAMja,IAAM,KAAK,UAAU,gBAAgB,KAAK,gBAAgB,GAC1Dsc,IAActc,KAAO,IAAIA,IAAM,KAAK,UAAU,eAAA;AACpD,QAAIia,MAAW,kBAAkBA,MAAW,gBAAgB;AAC1D,YAAMW,IAAWX,MAAW,iBAAiBqC,IAAcA,IAAc,GACnEjZ,IAAM,KAAK,eAAA,GACXyX,IAAQ,KAAK,UAAU,YAAYzX,GAAKuX,CAAQ;AACtD,WAAK,aAAa,QAAQ;AAAA,QACxB,MAAM;AAAA,QACN,OAAOE;AAAA,QACP,SAASzX;AAAA,QACT,SAAS,EAAE,OAAOuX,EAAA;AAAA,MAAS,CAC5B,GACD,KAAK,aAAaE,GAAO,KAAK,GAC9B,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,UAAU,gBAAgB,MAAM;AACrC;AAAA,IACF;AACA,QAAIb,MAAW,cAAc;AAC3B,YAAMc,IAAU,KAAK,UAAU,UAAU,KAAK,gBAAgB;AAC9D,UAAI,CAACA,EAAS;AACd,WAAK,aAAa,QAAQ;AAAA,QACxB,MAAM;AAAA,QACN,OAAOA,EAAQ,IAAI;AAAA,QACnB,SAASA,EAAQ,IAAI;AAAA,QACrB,SAAS,EAAE,OAAOA,EAAQ,MAAA;AAAA,MAAM,CACjC,GACD,KAAK,aAAaA,EAAQ,IAAI,IAAI,QAAQ,GAC1C,KAAK,WAAW,KAAK,iBAAiB,MAAS,GAC/C,KAAK,kBAAkB,qBAAA,GACvB,KAAK,UAAU,eAAe,MAAM;AACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAA4B;AAClC,UAAMjoB,IAAS,KAAK,UAAU,UAAA,GACxByM,IAAiB,CAAA;AACvB,eAAWnM,KAAON,EAAO;AACvB,MAAAyM,EAAI,OAAOnM,EAAI,GAAG,CAAC,IAAI;AAEzB,WAAOmM;AAAA,EACT;AAAA,EAEQ,mBAAmB;AACzB,SAAK,aAAa,cAAA;AAAA,EACpB;AAAA,EAEQ,cAAc;AACpB,QAAI,KAAK,OAAO,YAAa;AAC7B,SAAK,QAAQ;AACb,UAAM4S,IAAQ,SAAS,cAAc,KAAK;AAC1C,IAAAA,EAAM,YAAY,iBAClBA,EAAM,aAAa,WAAW,QAAQ,GACtCA,EAAM,MAAM,QAAQ,QACpBA,EAAM,MAAM,SAAS,QACrBA,EAAM,MAAM,WAAW,UACtB,KAAK,cAAc,KAAK,MAAM,YAAYA,CAAK,GAChD,KAAK,QAAQA;AAAA,EACf;AAAA,EAEQ,UAAUQ,GAAiBC,IAA4B,QAAQC,IAAa,MAAM;AAExF,IADA,KAAK,YAAA,GACA,KAAK,UACV,KAAK,MAAM,cAAcF,GACzB,KAAK,MAAM,QAAQ,UAAUC,GAC7B,KAAK,MAAM,cAAA,GACX,KAAK,MAAM,cAAA,GACP,KAAK,eACP,OAAO,aAAa,KAAK,UAAU,GACnC,KAAK,aAAa,OAEpB,KAAK,aAAa,OAAO,WAAW,MAAM;AACxC,WAAK,OAAO,cAAA;AAAA,IACd,GAAGC,CAAU;AAAA,EACf;AAAA,EAEQ,eAAe;AACrB,SAAK,gBAAgB,MAAM,KAAK,uBAAA,GAChC,KAAK,gBAAgB,MAAM,KAAK,uBAAA,GAChC,KAAK,gBAAgB,iBAAiB,UAAU,KAAK,eAAe,EAAE,SAAS,IAAM,GACrF,OAAO,iBAAiB,UAAU,KAAK,aAAa,GACpD,KAAK,sBAAsB,CAACvM,MAAkC;AAC5D,MAAI,KAAK,eAAe,CAAC,KAAK,YAAY,SAASA,EAAG,MAAc,KAClE,KAAK,YAAY,cAAA;AAAA,IAErB,GACA,SAAS,iBAAiB,eAAe,KAAK,qBAAqB,EAAI;AAAA,EAEzE;AAAA,EAEQ,iBAAiB;AACvB,IAAI,KAAK,iBAAe,OAAO,oBAAoB,UAAU,KAAK,aAAa,GAC3E,KAAK,iBAAe,KAAK,cAAA,EAAgB,oBAAoB,UAAU,KAAK,aAAa,GACzF,KAAK,UAAU,SACjB,qBAAqB,KAAK,KAAK,GAC/B,KAAK,QAAQ,OAEX,KAAK,wBACP,SAAS,oBAAoB,eAAe,KAAK,qBAAqB,EAAI,GAC1E,KAAK,sBAAsB,OAEzB,KAAK,gBACP,KAAK,YAAY,cAAA,GACb,KAAK,YAAY,iBAAehF,EAAiB,KAAK,WAAW,GACrE,KAAK,cAAc,OAEjB,KAAK,UACP,KAAK,MAAM,cAAA,GACP,KAAK,MAAM,iBAAeA,EAAiB,KAAK,KAAK,GACzD,KAAK,QAAQ;AAAA,EAEjB;AAAA,EAEA,QAAQxB,GAAqB;AAC3B,SAAK,eAAA,GACL,KAAK,mBAAA,GACL,KAAK,kBAAkB,QAAA,GACvB,KAAK,SAAS,QAAA,GACd,KAAK,OAAOA,GACZ,KAAK,mBAAA,GACL,KAAK,QAAQ,MACb,KAAK,aAAa,MAClB,KAAK,wBAAwB,WAAA,GAC7B,KAAK,yBAAyB,MAC9B,KAAK,WAAW,KAAK,eAAe,KAAK,UAAU,GACnD,KAAK,UAAU,IACf,KAAK,MAAM,EAAI;AAAA,EACjB;AAAA;AAAA,EAGA,gBAA4B;AAC1B,UAAMyc,IAAY,KAAK,oBAAoBlc,KAAe,SAAS,UAC7Dmc,IAAU,KAAK,aAAa,YAAA,GAC5BC,IAAkB,KAAK,aAAa,WAAWD,IAAU,CAAA,GACzDE,IAAsBD,EAAgB,QACtCE,KAAoB,MAAM;AAC9B,YAAMC,wBAAW,IAAA;AACjB,iBAAWppB,KAAKipB;AACd,QAAIjpB,EAAE,SAAS,WACX,CAACA,EAAE,SAASA,EAAE,WAAW,UAC7BopB,EAAK,IAAI,GAAGppB,EAAE,KAAK,KAAK,OAAOA,EAAE,MAAM,CAAC,EAAE;AAE5C,aAAOopB,EAAK;AAAA,IACd,GAAA,GACMC,IAAiC,KAAK,UAAU,sBAAsB,IAAI,CAAC5oB,OAAO;AAAA,MACtF,OAAO;AAAA,MACP,SAASA,EAAE;AAAA,MACX,QAAQ,EAAE,OAAOA,EAAE,OAAO,QAAQA,EAAE,OAAA;AAAA,IAAO,EAC3C,GACI6oB,IAAiC,KAAK,UACzC,iBACA,IAAI,CAAC7kB,MACCA,EAAE,OACA;AAAA,MACL,OAAOA,EAAE,KAAK;AAAA,MACd,SAASA,EAAE,KAAK;AAAA,MAChB,QAAQ,EAAE,OAAOA,EAAE,OAAO,QAAQA,EAAE,OAAA;AAAA,IAAO,IAJzB,IAMrB,EACA,OAAO,OAAO;AACjB,IAAA6kB,EAAiB,KAAK,CAAC,GAAGviB,MAAM;AAC9B,YAAMwiB,IAAK,EAAE,QAAQ,QAAQ,KAAK,UAAU,YAAY,EAAE,OAAO,KAAK,IAAI,IACpEC,IAAKziB,EAAE,QAAQ,QAAQ,KAAK,UAAU,YAAYA,EAAE,OAAO,KAAK,IAAI;AAC1E,UAAIwiB,MAAOC,EAAI,QAAOD,IAAKC;AAC3B,YAAMrM,IACJ,EAAE,QAAQ,WAAW,SAAY,KAAK,UAAU,eAAe,EAAE,OAAO,MAAM,IAAI,IAC9EsM,IACJ1iB,EAAE,QAAQ,WAAW,SAAY,KAAK,UAAU,eAAeA,EAAE,OAAO,MAAM,IAAI;AACpF,aAAIoW,MAAOsM,IAAWtM,IAAKsM,IACvB,EAAE,UAAU1iB,EAAE,QAAc,EAAE,QAAQA,EAAE,QAAQ,KAAK,IAClD,EAAE,UAAUA,EAAE,UAAU,KAAK,EAAE,UAAUA,EAAE,UAAU,IAAI;AAAA,IAClE,CAAC;AACD,UAAM2iB,IAAe;AAAA,MACnB,GAAGL;AAAA,MACH,GAAGC,EAAiB,MAAM,GAAG,GAAG;AAAA,MAChC,GAAG,KAAK;AAAA,IAAA;AAEV,WAAO;AAAA,MACL,WAAW,KAAK,aAAa,YAAYJ,IAAsB;AAAA,MAC/D,qBAAAA;AAAA,MACA,kBAAAC;AAAA,MACA,UAAU,EAAE,SAAS,KAAK,aAAa,WAAW,SAAS,KAAK,aAAa,UAAQ;AAAA,MACrF,YAAYJ;AAAA,MACZ,cAAAW;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,oBAAoBC,GAA8B;AAChD,gBAAK,oBAAoB,IAAIA,CAAQ,GACrCA,EAAS,KAAK,cAAA,GAAiB,IAAI,GAC5B,MAAM,KAAK,oBAAoB,OAAOA,CAAQ;AAAA,EACvD;AAAA,EAEQ,iBAAiB;AACvB,UAAMpgB,IAAO,KAAK,cAAA,GACZoO,IAAO,KAAK,gBACZiS,KAAe,MAAM;AAEzB,UADI,CAACjS,KACDA,EAAK,aAAa,WAAWpO,EAAK,aAAa,OAAQ,QAAO;AAClE,eAASpI,IAAI,GAAGA,IAAIoI,EAAK,aAAa,QAAQpI,KAAK,GAAG;AACpD,cAAMC,IAAIuW,EAAK,aAAaxW,CAAC,GACvB4F,IAAIwC,EAAK,aAAapI,CAAC;AAG7B,YAFI,CAACC,KAAK,CAAC2F,KACP3F,EAAE,UAAU2F,EAAE,SACd3F,EAAE,YAAY2F,EAAE,QAAS,QAAO;AACpC,cAAMI,IAAK/F,EAAE,QACPyoB,IAAK9iB,EAAE;AACb,YAAI,GAACI,KAAM,CAAC0iB,OACR,CAAC1iB,KAAM,CAAC0iB,MACP1iB,EAAG,SAAS,WAAW0iB,EAAG,SAAS,SACpC,OAAO1iB,EAAG,UAAU,EAAE,MAAM,OAAO0iB,EAAG,UAAU,EAAE;AAAG,iBAAO;AAAA,MAClE;AACA,aAAO;AAAA,IACT,GAAA;AAWA,QARE,EAAAlS,KACAA,EAAK,cAAcpO,EAAK,aACxBoO,EAAK,wBAAwBpO,EAAK,uBAClCoO,EAAK,qBAAqBpO,EAAK,oBAC/BoO,EAAK,SAAS,YAAYpO,EAAK,SAAS,WACxCoO,EAAK,SAAS,YAAYpO,EAAK,SAAS,WACxCoO,EAAK,eAAepO,EAAK,cACzBqgB,IAEF;AAAA,WAAK,iBAAiBrgB;AACtB,iBAAWlI,KAAK,KAAK,oBAAqB,CAAAA,EAAEkI,GAAMoO,CAAI;AAAA;AAAA,EACxD;AAAA;AAAA,EAGA,uBAA0C;AACxC,UAAMnP,IAAS,KAAK,iBACdlJ,IAAS,KAAK,UAAU,UAAA,GACxBugB,IAAS,KAAK,YACd3V,IAAc2V,GAAQ,SAAS,MAC/B1V,IAAe0V,GAAQ,UAAU,MACjC9B,IAAiB7T,IAAc,KAAK,UAAU,YAAYA,CAAW,IAAI,MACzE8T,IACJ7T,MAAiB,OACb7K,EAAO,QAAQ,UAAU,CAACU,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOmK,CAAY,CAAC,IACtE,MACAvK,IACJoe,MAAmB,QAAQA,KAAkB,IAAI1e,EAAO,QAAQ0e,CAAc,IAAI,MAE9E8L,IACJ5f,KAAetK,IAAM,KAAK,UAAU,iBAAiBsK,GAAatK,CAAG,IAAI,MACrEmqB,IACJ7f,KAAetK,IAAM,KAAK,UAAU,wBAAwBsK,GAAatK,CAAG,IAAI,MAC5EoqB,IACJF,GAAgB,iBAAiBC,GAAe,iBAAiB,WAAW,SACxEE,IAAiBH,IAAiBA,EAAe,QAAQ,MACzDI,KAAsB,MAAM;AAChC,UAAIF,EAAoB,QAAOA;AAC/B,YAAMhlB,IAAIilB;AACV,UAAIrqB,GAAK,SAAS;AAEhB,eADc4Q,GAAexL,CAAC,MACbA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,UAAIpF,GAAK,SAAS;AAEhB,eADc6Q,GAAazL,CAAC,MACXA,KAAM,OAA0B,KAAK,OAAOA,CAAC;AAEhE,UAAIA,KAAM,KAAyB,QAAO;AAC1C,UAAIA,aAAa,KAAM,QAAOA,EAAE,YAAA;AAChC,UAAI,OAAOA,KAAM,SAAU,QAAOA;AAClC,UAAI,OAAOA,KAAM,YAAY,OAAOA,KAAM,UAAW,QAAO,OAAOA,CAAC;AACpE,UAAI,OAAOA,KAAM,UAAU;AACzB,cAAM+G,IAAM/G,GACNuJ,IAAOxC,EAAI;AACjB,YAAIwC,MAAS,UAAU,OAAOxC,EAAI,SAAU,iBAAiBA,EAAI;AACjE,YAAIwC,MAAS,UAAU,MAAM,QAAQxC,EAAI,MAAM;AAC7C,iBAAOA,EAAI,OAAO,OAAO,CAACtH,MAAM,OAAOA,KAAM,QAAQ,EAAE,KAAK,IAAI;AAAA,MAEpE;AACA,aAAO,OAAOO,CAAC;AAAA,IACjB,GAAA,GACMmlB,IAAkBvqB,GAAK,QAAQ,MAC/BwqB,IACJlgB,KAAeC,MAAiB,OAC5B,KAAK,UAAU,kBAAkBD,GAAaC,CAAY,IAC1D,MAEAkgB,KAAgB,MAAM;AAC1B,UAAI,CAACngB,KAAe,CAACtK;AACnB,eAAO,EAAE,aAAa,CAAA,GAAI,WAAW,CAAA,GAAI,UAAU,GAAC;AAEtD,YAAM,EAAE,aAAA0qB,GAAa,WAAAjb,GAAW,UAAAkb,EAAA,IAAaC;AAAA,QAC3C,KAAK;AAAA,QACLtgB;AAAA,QACAtK;AAAA,MAAA;AAEF,aAAO,EAAE,aAAA0qB,GAAa,WAAAjb,GAAW,UAAAkb,EAAA;AAAA,IACnC,GAAA;AAEA,WAAO;AAAA,MACL,QAAQ,CAAC,GAAG/hB,CAAM;AAAA,MAClB,gBAAgBuV,MAAmB,QAAQA,KAAkB,IAAIA,IAAiB;AAAA,MAClF,cAAc7T;AAAA,MACd,mBAAmB8T,MAAmB,QAAQA,KAAkB,IAAIA,IAAiB;AAAA,MACrF,iBAAiB7T;AAAA,MACjB,gBAAA8f;AAAA,MACA,oBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,YAAAC;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,QAAQC;AAAA,IAAA;AAAA,EAEZ;AAAA,EAEA,mBAAmBV,GAA6B;AAC9C,gBAAK,mBAAmB,IAAIA,CAAQ,GACpCA,EAAS,KAAK,wBAAwB,MAAM,WAAW,GAChD,MAAM,KAAK,mBAAmB,OAAOA,CAAQ;AAAA,EACtD;AAAA,EAEQ,WAAWlD,GAAoB;AACrC,SAAK,aAAaA,GAClB,KAAK,cAAc,QAAQ,GAC3B,KAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,cAAcgE,GAA+B;AACnD,UAAMlhB,IAAO,KAAK,qBAAA,GACZoO,IAAO,KAAK;AAClB,SAAK,wBAAwBpO;AAC7B,eAAWlI,KAAK,KAAK,mBAAoB,CAAAA,EAAEkI,GAAMoO,GAAM8S,CAAM;AAAA,EAC/D;AAAA,EAEQ,oBAAoB3qB,GAA8C;AACxE,UAAML,IAAW,KAAK,UAAU,YAAYK,CAAK;AACjD,QAAIL,IAAW,EAAG,QAAO;AACzB,UAAMmnB,IAAO,KAAK,SAAS9mB,CAAK;AAChC,QAAI,CAAC8mB,EAAM,QAAO;AAClB,UAAMI,IACJ,KAAK,aAAa,WACb,KAAK,UAAU,WAAA,EAAa,IAAIlnB,CAAK,KAAK,SAC3C,QACA4qB,IAAc,KAAK,cAAA,EAAgB,aAAa,OAAO,CAACjqB,MAAMA,EAAE,QAAQ,UAAUX,CAAK;AAC7F,WAAO;AAAA,MACL,OAAAA;AAAA,MACA,UAAAL;AAAA,MACA,MAAAmnB;AAAA,MACA,SAAAI;AAAA,MACA,aAAa0D,EAAY,SAASA,IAAc;AAAA,IAAA;AAAA,EAEpD;AAAA,EAEA,kBAAkBf,GAAkC;AAClD,SAAK,kBAAkB,IAAIA,CAAQ;AACnC,UAAMpqB,IAAO,KAAK,UAAU,YAAA;AAC5B,eAAWI,KAAOJ,GAAM;AACtB,YAAMipB,IAAO,KAAK,oBAAoB7oB,EAAI,EAAE;AAC5C,MAAK6oB,MACL,KAAK,cAAc,IAAI7oB,EAAI,IAAI6oB,CAAI,GACnCmB,EAAShqB,EAAI,IAAI6oB,GAAM,MAAM,KAAK;AAAA,IACpC;AACA,WAAO,MAAM,KAAK,kBAAkB,OAAOmB,CAAQ;AAAA,EACrD;AAAA,EAEQ,aAAa7pB,GAAe2qB,GAAyB;AAC3D,UAAM9S,IAAO,KAAK,cAAc,IAAI7X,CAAK,KAAK;AAC9C,QAAI2qB,MAAW,UAAU;AACvB,WAAK,cAAc,OAAO3qB,CAAK;AAC/B,iBAAWuB,KAAK,KAAK,qBAAqBvB,GAAO,MAAM6X,GAAM8S,CAAM;AACnE;AAAA,IACF;AACA,UAAMlhB,IAAO,KAAK,oBAAoBzJ,CAAK;AAC3C,QAAKyJ,GACL;AAAA,WAAK,cAAc,IAAIzJ,GAAOyJ,CAAI;AAClC,iBAAWlI,KAAK,KAAK,qBAAqBvB,GAAOyJ,GAAMoO,GAAM8S,CAAM;AAAA;AAAA,EACrE;AAAA;AAAA,EAGA,aAAyC9qB,GAAsBI,GAAWwJ,GAAqB;AAC7F,UAAMzJ,IAAQ,OAAOH,KAAQ,WAAWA,IAAM,KAAK,UAAU,SAAA,EAAWA,CAAG,GAAG,IACxE4qB,IAAWzqB,IAAQX,GAAmB,KAAK,WAAW,EAAE,OAAAW,GAAO,QAAAC,EAAA,CAAQ,IAAI;AAEjF,QADI,CAACwqB,KACD,KAAK,eAAeA,EAAS,OAAOA,EAAS,MAAM,EAAG;AAC1D,UAAM3Q,IAAU,KAAK,UAAU,QAAQ2Q,EAAS,OAAOA,EAAS,MAAM,GAChEI,IAAW,OAAOphB,KAAS,aAAcA,EAA6BqQ,CAAO,IAAIrQ;AACvF,SAAK;AAAA,MACH,EAAE,MAAM,QAAQ,OAAOghB,EAAS,OAAO,QAAQA,EAAS,QAAQ,MAAMI,EAAA;AAAA,MACtE,KAAK,aAAa;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,oBAAoBphB,GAAwB;AAC1C,UAAMjK,IAAS,KAAK,UAAU,UAAA,GACxBC,IAAO,KAAK,UAAU,SAAA,GACtBqrB,wBAAa,IAAA;AACnB,eAAW9pB,KAAK,KAAK,iBAAiB;AACpC,UAAIA,EAAE,SAAS,QAAS;AACxB,YAAM+pB,IAAK,KAAK,IAAI/pB,EAAE,UAAUA,EAAE,MAAM,GAClCgqB,IAAK,KAAK,IAAIhqB,EAAE,UAAUA,EAAE,MAAM,GAClCiqB,IAAK,KAAK,IAAIjqB,EAAE,UAAUA,EAAE,MAAM,GAClCkqB,IAAK,KAAK,IAAIlqB,EAAE,UAAUA,EAAE,MAAM;AACxC,eAASrB,IAAWorB,GAAIprB,KAAYqrB,GAAIrrB,KAAY,GAAG;AACrD,cAAME,IAAMJ,EAAKE,CAAQ;AACzB,YAAKE;AACL,mBAASD,IAAWqrB,GAAIrrB,KAAYsrB,GAAItrB,KAAY,GAAG;AACrD,kBAAME,IAAMN,EAAO,QAAQI,CAAQ;AACnC,gBAAI,CAACE,EAAK;AACV,kBAAM0L,IAAM,GAAG3L,EAAI,EAAE,KAAK,OAAOC,EAAI,GAAG,CAAC;AAGzC,gBAFIgrB,EAAO,IAAItf,CAAG,MAClBsf,EAAO,IAAItf,CAAG,GACV,KAAK,eAAe3L,EAAI,IAAIC,EAAI,GAAG,GAAG;AAC1C,kBAAMga,IAAU,KAAK,UAAU,QAAQja,EAAI,IAAIC,EAAI,GAAG,GAChD+qB,IAAW,OAAOphB,KAAS,aAAaA,EAAKqQ,CAAO,IAAIrQ;AAC9D,iBAAK;AAAA,cACH,EAAE,MAAM,QAAQ,OAAO5J,EAAI,IAAI,QAAQC,EAAI,KAAK,MAAM+qB,EAAA;AAAA,cACtD,KAAK,aAAa;AAAA,YAAA;AAAA,UAEtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAetiB,GAAgB;AACrC,QAAIA,MAAU,KAAM,QAAO;AAC3B,QAAIA,MAAU,OAAW,QAAO;AAChC,QAAIA,aAAiB,KAAM,QAAO,QAAQA,EAAM,SAAS;AACzD,QAAI,OAAOA,KAAU,SAAU,QAAO,KAAKA,CAAK;AAChD,QAAI,OAAOA,KAAU,SAAU,QAAO,KAAK,OAAO,MAAMA,CAAK,IAAI,QAAQ,OAAOA,CAAK,CAAC;AACtF,QAAI,OAAOA,KAAU,kBAAkB,KAAKA,IAAQ,MAAM,GAAG;AAC7D,QAAI,OAAOA,KAAU,UAAU;AAC7B,YAAM0D,IAAM1D,GACNkG,IAAOxC,EAAI;AACjB,UAAIwC,MAAS,UAAU,OAAOxC,EAAI,SAAU,SAAU,QAAO,QAAQA,EAAI,KAAK;AAC9E,UAAIwC,MAAS,UAAU,MAAM,QAAQxC,EAAI,MAAM;AAC7C,eAAO,QAAQA,EAAI,OAAO,OAAO,CAACtH,MAAM,OAAOA,KAAM,QAAQ,EAAE,KAAK,GAAG,CAAC;AAAA,IAE5E;AACA,QAAI;AACF,aAAO,QAAQ,KAAK,UAAU4D,CAAK,CAAC;AAAA,IACtC,QAAQ;AACN,aAAO,OAAO,OAAOA,CAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,mBAAmB;AACzB,SAAK,wBAAA,GACL,KAAK,kCAAA,GACL,KAAK,uBAAA;AAAA,EACP;AAAA,EAEQ,yBAAyB;AAC/B,IAAI,KAAK,sBACT,KAAK,oBAAoB,CAACyK,MAAsB;AAC9C,MAAK,KAAK,8BACNA,EAAG,QAAQ,aACfA,EAAG,eAAA,GACHA,EAAG,gBAAA,GACH,KAAK,oBAAA;AAAA,IACP,GACA,SAAS,iBAAiB,WAAW,KAAK,mBAAmB,EAAI;AAAA,EACnE;AAAA,EAEQ,oCAAoC;AAC1C,QAAI,KAAK,uBAAwB;AACjC,UAAM0T,IAAO,KAAK,cAAc,KAAK;AACrC,SAAK,yBAAyB,CAAC1T,MAAmB;AAEhD,YAAM9D,IADK8D,EAAG,QACE,QAA2B,kCAAkC;AAC7E,UAAI,CAAC9D,EAAK;AACV,YAAM1D,IACJ0D,EAAI,QAAQ,iBAAiBA,EAAI,QAAqB,kBAAkB,GAAG,QAAQ;AACrF,MAAK1D,MACLwH,EAAG,eAAA,GACHA,EAAG,gBAAA,GACH,KAAK,oBAAoBxH,CAAG;AAAA,IAC9B,GACAkb,EAAK,iBAAiB,SAAS,KAAK,wBAAwB,EAAI,GAChE,KAAK,sBAAsB,CAAC1T,MAAc;AAGxC,YAAMxH,IAFQwH,EACO,QACD;AACpB,MAAyBxH,KAAQ,QACjC,KAAK,oBAAoB,OAAOA,CAAG,CAAC;AAAA,IACtC,GACAkb,EAAK,iBAAiB,4BAA4B,KAAK,mBAAmB;AAAA,EAC5E;AAAA,EAEQ,0BAA0B;AAChC,QAAI,KAAK,mBAAmB;AAC1B,UAAI,KAAK,kBAAkB,YAAa;AACxC,WAAK,oBAAoB;AAAA,IAC3B;AACA,SAAK,YAAA;AACL,UAAMJ,IAAQ,KAAK,SAAS,KAAK,MAE3B6E,IAAQ,SAAS,cAAc,OAAO;AAC5C,IAAAA,EAAM,YAAY,+BAClBA,EAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAiClB7E,EAAM,YAAY6E,CAAK,GACvB,KAAK,oBAAoBA;AAEzB,UAAMC,IAAWD,EAAM,cAAiC,iCAAiC,GACnFE,IAAWF,EAAM,cAAgC,qCAAqC,GACtFG,IAAaH,EAAM;AAAA,MACvB;AAAA,IAAA,GAEII,IAASJ,EAAM,cAAgC,iCAAiC,GAChFjf,IAASif,EAAM,cAA2B,4BAA4B,GACtEK,IAASL,EAAM,cAAiC,sCAAsC,GACtFM,IAAUN,EAAM,cAAiC,uCAAuC,GACxFO,IAAWP,EAAM;AAAA,MACrB;AAAA,IAAA,GAEIQ,IAAWR,EAAM;AAAA,MACrB;AAAA,IAAA,GAEIS,IAAaT,EAAM,cAAiC,oCAAoC,GACxFU,IAAcV,EAAM;AAAA,MACxB;AAAA,IAAA,GAEIW,IAAeX,EAAM;AAAA,MACzB;AAAA,IAAA;AAGF,QACE,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACrf,KACD,CAACsf,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,KACD,CAACC,GACD;AACA,MAAA9d,EAAiBmd,CAAK,GACtB,KAAK,oBAAoB;AACzB;AAAA,IACF;AAEA,IAAAC,EAAS,iBAAiB,SAAS,MAAM,KAAK,qBAAqB,GAEnEC,EAAS,iBAAiB,UAAU,MAAM;AACxC,MAAK,KAAK,oBACV,KAAK,gBAAgB,aAAaA,EAAS;AAAA,IAC7C,CAAC,GACDC,EAAW,iBAAiB,UAAU,MAAM;AAC1C,MAAK,KAAK,oBACV,KAAK,gBAAgB,eAAeA,EAAW;AAAA,IACjD,CAAC,GACDC,EAAO,iBAAiB,SAAS,MAAM;AACrC,MAAK,KAAK,oBACV,KAAK,gBAAgB,SAASA,EAAO,OACrC,KAAK,uBAAA;AAAA,IACP,CAAC,GAEDrf,EAAO,iBAAiB,UAAU,CAACvL,MAAM;AACvC,YAAM4c,IAAS5c,EAAE,QAA+B;AAAA,QAC9C;AAAA,MAAA;AAEF,UAAI,CAAC4c,KAAS,CAAC,KAAK,gBAAiB;AACrC,YAAM7b,IAAI6b,EAAM,QAAQ,SAAS;AACjC,MAAK7b,MACDA,MAAM,eACR,KAAK,gBAAgB,gBAAgB6b,EAAM,UAClCA,EAAM,UACf,KAAK,gBAAgB,SAAS,IAAI7b,CAAC,IAEnC,KAAK,gBAAgB,SAAS,OAAOA,CAAC;AAAA,IAE1C,CAAC,GAED8pB,EAAO,iBAAiB,SAAS,MAAM;AACrC,MAAK,KAAK,oBACV,KAAK,gBAAgB,WAAW,IAAI,IAAI,KAAK,gBAAgB,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GACrF,KAAK,gBAAgB,gBAAgB,KAAK,gBAAgB,WAC1D,KAAK,uBAAA;AAAA,IACP,CAAC,GACDC,EAAQ,iBAAiB,SAAS,MAAM;AACtC,MAAK,KAAK,oBACV,KAAK,gBAAgB,WAAW,oBAAI,IAAA,GACpC,KAAK,gBAAgB,gBAAgB,IACrC,KAAK,uBAAA;AAAA,IACP,CAAC,GACDC,EAAS,iBAAiB,SAAS,MAAM,KAAK,sBAAsB,GACpEC,EAAS,iBAAiB,SAAS,MAAM,KAAK,gCAAgC,GAC9EC,EAAW,iBAAiB,SAAS,MAAM,KAAK,uBAAuB,KAAK,CAAC,GAC7EC,EAAY,iBAAiB,SAAS,MAAM,KAAK,uBAAuB,MAAM,CAAC,GAC/EC,EAAa,iBAAiB,SAAS,MAAM,KAAK,WAAW,GAE7D,KAAK,yBAAyB,KAAK,UAAU,UAAU,MAAM;AAC3D,MAAK,KAAK,8BACL,KAAK,8BACV,KAAK,qBAAqB,KAAK,yBAAyB,GACxD,KAAK,wBAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB7rB,GAAgB;AAClC,SAAK,4BAA4BA,GACjC,KAAK,qBAAqBA,CAAM,GAChC,KAAK,KAAK,UAAU,OAAO,4BAA4B,EAAI,GAC3D,KAAK,wBAAA,IAEH,KAAK,mBAAmB,cAAgC,iCAAiC,KACzF,OACK,MAAA;AAAA,EACT;AAAA,EAEA,sBAAsB;AACpB,SAAK,KAAK,UAAU,OAAO,4BAA4B,EAAK,GAC5D,KAAK,4BAA4B,MACjC,KAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,sBAAsBA,GAAgB;AACpC,IAAI,KAAK,6BAA4B,KAAK,oBAAA,IACrC,KAAK,oBAAoBA,CAAM;AAAA,EACtC;AAAA,EAEQ,qBAAqBA,GAAgB;AAC3C,UAAM0K,IAAO,KAAK,UAAU,QAAA,GAEtB7K,IADS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACI,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOD,CAAM,CAAC;AACvE,QAAI,CAACH,GAAK;AACR,WAAK,kBAAkB;AACvB;AAAA,IACF;AACA,UAAMisB,IACJ,KAAK,mBAAmB,OAAO,KAAK,gBAAgB,MAAM,MAAM,OAAOjsB,EAAI,GAAG,IAC1E,KAAK,gBAAgB,SACrB,IACAksB,IAAW,KAAK,UAAU,2BAA2BlsB,EAAI,GAAG,GAC5DoM,IAAS8f,EAAS,OAAO,IAAI,CAAC9mB,OAAO,EAAE,GAAGA,GAAG,KAAK,KAAK,eAAeA,EAAE,KAAK,IAAI,GACjFsS,KAAY7M,EAAK,WAAW,CAAA,GAAI;AAAA,MACpC,CAAChJ,MACEA,EAAuB,SAAS,YACjC,OAAQA,EAAuB,GAAG,MAAM,OAAO7B,EAAI,GAAG;AAAA,IAAA,GAGpDmsB,wBAAe,IAAA;AACrB,QAAIzU;AACF,iBAAWtS,KAAKsS,EAAS,UAAU,CAAA,KAAa,IAAI,KAAK,eAAetS,CAAC,CAAC;AAAA;AAE1E,iBAAWA,KAAKgH,EAAQ,CAAA+f,EAAS,IAAI/mB,EAAE,GAAG;AAE5C,UAAMgnB,IAAgB1U,IAAW,EAAQA,EAAS,gBAAiBwU,EAAS,WACtElhB,IAAOH,EAAK,oBAAoB,OAAO7K,EAAI,GAAG,CAAC;AACrD,SAAK,kBAAkB;AAAA,MACrB,QAAQA,EAAI;AAAA,MACZ,QAAAoM;AAAA,MACA,WAAW8f,EAAS;AAAA,MACpB,UAAAC;AAAA,MACA,eAAAC;AAAA,MACA,YAAY,EAAQphB,GAAM;AAAA,MAC1B,cAAc,EAAQA,GAAM;AAAA,MAC5B,QAAQihB;AAAA,IAAA;AAAA,EAEZ;AAAA,EAEQ,0BAA0B;AAChC,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAMI,IAAQ,KAAK,kBAAkB,cAA2B,2BAA2B,GACrFd,IAAW,KAAK,kBAAkB;AAAA,MACtC;AAAA,IAAA,GAEIC,IAAa,KAAK,kBAAkB;AAAA,MACxC;AAAA,IAAA,GAEIC,IAAS,KAAK,kBAAkB;AAAA,MACpC;AAAA,IAAA;AAEF,QAAI,CAACY,KAAS,CAACd,KAAY,CAACC,KAAc,CAACC,EAAQ;AACnD,UAAMK,IAAa,KAAK,kBAAkB;AAAA,MACxC;AAAA,IAAA,GAEIC,IAAc,KAAK,kBAAkB;AAAA,MACzC;AAAA,IAAA,GAEIO,IAAQ,KAAK;AACnB,QAAI,CAACA,GAAO;AACV,MAAAD,EAAM,cAAc,eACpBd,EAAS,UAAU,IACnBC,EAAW,UAAU,IACrBC,EAAO,QAAQ,IACXK,MAAYA,EAAW,QAAQ,SAAS,MACxCC,MAAaA,EAAY,QAAQ,SAAS,MAC9C,KAAK,uBAAA;AACL;AAAA,IACF;AAGA,UAAMQ,IAFS,KAAK,UAAU,UAAA,EACX,QAAQ,KAAK,CAACnsB,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOksB,EAAM,MAAM,CAAC,GAC3D,UAAU,OAAOA,EAAM,MAAM;AAC/C,IAAAD,EAAM,cAAc,gBAAgBE,CAAI,IACxChB,EAAS,UAAUe,EAAM,YACzBd,EAAW,UAAUc,EAAM,cAC3Bb,EAAO,QAAQa,EAAM;AAErB,UAAME,IADO,KAAK,UAAU,QAAA,EACV,OAAO,KAAK,CAACxrB,MAAM,OAAOA,EAAE,GAAG,MAAM,OAAOsrB,EAAM,MAAM,CAAC;AAC3E,IAAIR,MAAYA,EAAW,QAAQ,SAASU,GAAM,QAAQ,QAAQ,MAAM,MACpET,MAAaA,EAAY,QAAQ,SAASS,GAAM,QAAQ,SAAS,MAAM,MAC3E,KAAK,uBAAA;AAAA,EACP;AAAA,EAEQ,yBAAyB;AAC/B,QAAI,CAAC,KAAK,kBAAmB;AAC7B,UAAMpgB,IAAS,KAAK,kBAAkB,cAA2B,4BAA4B;AAC7F,QAAI,CAACA,EAAQ;AACb,IAAAA,EAAO,YAAY;AACnB,UAAMkgB,IAAQ,KAAK;AACnB,QAAI,CAACA,EAAO;AAEZ,UAAMnqB,IAAImqB,EAAM,OAAO,KAAA,EAAO,YAAA;AAE9B,QADcA,EAAM,OAAO,UAAUA,EAAM,YAAY,IAAI,KAC/C,OAAO,CAACnqB,GAAG;AACrB,YAAMqmB,IAAM,SAAS,cAAc,KAAK;AACxC,MAAAA,EAAI,cAAc,2CAClBpc,EAAO,YAAYoc,CAAG;AACtB;AAAA,IACF;AAEA,QAAI8D,EAAM,WAAW;AACnB,YAAMnd,IAAQ,SAAS,cAAc,OAAO,GACtCwS,IAAK,SAAS,cAAc,OAAO;AACzC,MAAAA,EAAG,OAAO,YACVA,EAAG,QAAQ,QAAQ,cACnBA,EAAG,UAAU2K,EAAM;AACnB,YAAM9a,IAAO,SAAS,cAAc,MAAM;AAC1C,MAAAA,EAAK,cAAc,YACnBrC,EAAM,YAAYwS,CAAE,GACpBxS,EAAM,YAAYqC,CAAI,GACtBpF,EAAO,YAAY+C,CAAK;AAAA,IAC1B;AAEA,UAAMsd,IAAWtqB,IACbmqB,EAAM,OAAO,OAAO,CAAClnB,MAAMA,EAAE,MAAM,cAAc,SAASjD,CAAC,CAAC,IAC5DmqB,EAAM;AACV,eAAWlnB,KAAKqnB,EAAS,MAAM,GAAG,GAAG,GAAG;AACtC,YAAMtd,IAAQ,SAAS,cAAc,OAAO,GACtCwS,IAAK,SAAS,cAAc,OAAO;AACzC,MAAAA,EAAG,OAAO,YACVA,EAAG,QAAQ,QAAQvc,EAAE,KACrBuc,EAAG,UAAU2K,EAAM,SAAS,IAAIlnB,EAAE,GAAG;AACrC,YAAMoM,IAAO,SAAS,cAAc,MAAM;AAC1C,MAAAA,EAAK,cAAcpM,EAAE,OACrB+J,EAAM,YAAYwS,CAAE,GACpBxS,EAAM,YAAYqC,CAAI,GACtBpF,EAAO,YAAY+C,CAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAC7B,UAAMmd,IAAQ,KAAK;AACnB,QAAI,CAACA,EAAO;AACZ,UAAMzhB,IAAO,KAAK,UAAU,QAAA,GACtB6hB,IAAkB,CAAC,GAAI7hB,EAAK,WAAW,CAAA,CAAG,EAAE;AAAA,MAChD,CAAChJ,MACC,EACGA,EAAuB,SAAS,YACjC,OAAQA,EAAuB,GAAG,MAAM,OAAOyqB,EAAM,MAAM;AAAA,IAAA,GAO3DK,IAFJL,EAAM,SAAS,SAASA,EAAM,OAAO,UACrCA,EAAM,kBAAkB,EAAQA,EAAM,YAEpCI,IACA;AAAA,MACE,GAAGA;AAAA,MACH;AAAA,QACE,MAAM;AAAA,QACN,KAAKJ,EAAM;AAAA,QACX,QAAQA,EAAM,OAAO,OAAO,CAAClnB,MAAMknB,EAAM,SAAS,IAAIlnB,EAAE,GAAG,CAAC,EAAE,IAAI,CAACA,MAAMA,EAAE,KAAK;AAAA,QAChF,eAAeknB,EAAM;AAAA,MAAA;AAAA,IACvB,GAGAM,IAAkB,EAAE,GAAI/hB,EAAK,qBAAqB,CAAA,EAAC;AACzD,IAAIyhB,EAAM,cAAcA,EAAM,eAC5BM,EAAgB,OAAON,EAAM,MAAM,CAAC,IAAI;AAAA,MACtC,QAAQA,EAAM;AAAA,MACd,UAAUA,EAAM;AAAA,IAAA,IAGlB,OAAOM,EAAgB,OAAON,EAAM,MAAM,CAAC;AAG7C,UAAMO,IAAiB;AAAA,MACrB,GAAGhiB;AAAA,MACH,SAAS8hB,EAAY,SAASA,IAAc;AAAA,MAC5C,mBAAmB,OAAO,KAAKC,CAAe,EAAE,SAASA,IAAkB;AAAA,IAAA;AAE7E,SAAK,QAAQC,CAAQ;AAAA,EACvB;AAAA,EAEQ,iCAAiC;AACvC,UAAM1sB,IAAS,KAAK;AACpB,QAAIA,KAAW,KAA8B;AAC7C,UAAM0K,IAAO,KAAK,UAAU,QAAA,GACtB8hB,IAAc,CAAC,GAAI9hB,EAAK,WAAW,CAAA,CAAG,EAAE;AAAA,MAC5C,CAAChJ,MACC,EACGA,EAAuB,SAAS,YACjC,OAAQA,EAAuB,GAAG,MAAM,OAAO1B,CAAM;AAAA,IAAA,GAGrDysB,IAAkB,EAAE,GAAI/hB,EAAK,qBAAqB,CAAA,EAAC;AACzD,WAAO+hB,EAAgB,OAAOzsB,CAAM,CAAC;AACrC,UAAM0sB,IAAiB;AAAA,MACrB,GAAGhiB;AAAA,MACH,SAAS8hB,EAAY,SAASA,IAAc;AAAA,MAC5C,mBAAmB,OAAO,KAAKC,CAAe,EAAE,SAASA,IAAkB;AAAA,IAAA;AAE7E,SAAK,QAAQC,CAAQ,GACrB,KAAK,qBAAqB1sB,CAAM,GAChC,KAAK,wBAAA;AAAA,EACP;AAAA,EAEQ,uBAAuBgL,GAAqB;AAClD,UAAMhL,IAAS,KAAK;AACpB,QAAIA,KAAW,KAA8B;AAE7C,UAAM0sB,IAAiB,EAAE,GADZ,KAAK,UAAU,QAAA,GACM,OAAO,CAAC,EAAE,KAAK1sB,GAAQ,KAAAgL,EAAA,CAAK,EAAA;AAC9D,SAAK,QAAQ0hB,CAAQ,GACrB,KAAK,qBAAqB1sB,CAAM,GAChC,KAAK,wBAAA;AAAA,EACP;AAAA,EAEQ,YAAY;AAClB,UAAM0K,IAAO,KAAK,UAAU,QAAA;AAC5B,QAAI,CAACA,EAAK,OAAO,OAAQ;AACzB,UAAMgiB,IAAiB,EAAE,GAAGhiB,GAAM,OAAO,OAAA;AACzC,SAAK,QAAQgiB,CAAQ,GACjB,KAAK,8BAA8B,SACrC,KAAK,qBAAqB,KAAK,yBAAyB,GACxD,KAAK,wBAAA;AAAA,EAET;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,yBAAA,GACL,KAAK,yBAAyB,MAC1B,KAAK,sBACP3e,EAAiB,KAAK,iBAAiB,GACvC,KAAK,oBAAoB,OAEvB,KAAK,sBACP,SAAS,oBAAoB,WAAW,KAAK,mBAAmB,EAAI,GACpE,KAAK,oBAAoB,OAEvB,KAAK,4BACN,KAAK,cAAc,KAAK,MAAM;AAAA,MAC7B;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IAAA,GAEF,KAAK,yBAAyB,OAE5B,KAAK,yBACN,KAAK,cAAc,KAAK,MAAM;AAAA,MAC7B;AAAA,MACA,KAAK;AAAA,IAAA,GAEP,KAAK,sBAAsB,OAE7B,KAAK,KAAK,UAAU,OAAO,4BAA4B,EAAK,GAC5D,KAAK,4BAA4B,MACjC,KAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,oBAAoB;AAC1B,UAAM0Y,IAAO,KAAK,cAAA;AAClB,SAAK,gBAAgB;AAAA,MACnB,WAAWA,EAAK;AAAA,MAChB,YAAYA,EAAK;AAAA,MACjB,aAAaA,EAAK;AAAA,MAClB,cAAcA,EAAK;AAAA,MACnB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW,YAAY,IAAA;AAAA,IAAI;AAAA,EAE/B;AAAA,EAEQ,yBAAyB;AAC/B,IAAK,KAAK,iBAAe,KAAK,kBAAA;AAC9B,UAAM7O,IAAO,KAAK,iBAAiB;AAAA,MACjC,WAAW;AAAA,MACX,YAAY;AAAA,MAKZ,WAAW,YAAY,IAAA;AAAA,IAAI,GAEvB6O,IAAO,KAAK,cAAA,GACZjd,IAAsB;AAAA,MAC1B,WAAWid,EAAK;AAAA,MAChB,YAAYA,EAAK;AAAA,MACjB,aAAaA,EAAK;AAAA,MAClB,cAAcA,EAAK;AAAA,MACnB,QAAQA,EAAK,aAAa7O,EAAK;AAAA,MAC/B,QAAQ6O,EAAK,YAAY7O,EAAK;AAAA,MAC9B,WAAW,YAAY,IAAA;AAAA,IAAI;AAE7B,SAAK,gBAAgBpO,GACjB,KAAK,UAAU,SACjB,KAAK,QAAQ,sBAAsB,MAAM,KAAK,aAAa;AAAA,EAE/D;AAAA,EAEQ,cAAc;AAEpB,IADA,KAAK,QAAQ,MACR,KAAK,kBACV,KAAK,kBAAkB,SAAS,KAAK,cAAc,WAAW,KAAK,cAAc,UAAU,GAEvF,OAAK,oBAAoBsD,OAC7B,KAAK,WAAW,KAAK,aAAa;AAAA,EACpC;AACF;AAGO,SAAS6f,GACdC,GACAthB,GACA;AAQA,SAPa,IAAIua,GAAe;AAAA,IAC9B,MAAM,SAAS,cAAc,KAAK;AAAA,IAClC,aAAa+G,EAAO;AAAA,IACpB,aAAaA,EAAO;AAAA,IACpB,QAAQA,EAAO;AAAA,IACf,SAAAthB;AAAA,EAAA,CACD;AAEH;AAEO,SAASuhB,GAAWtgB,GAAqBugB,GAAmB;AACjE,SAAAA,EAAK,QAAQvgB,CAAM,GACZugB;AACT;"}
|