vastgrid 0.1.1 → 0.2.1
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/README.md +175 -13
- package/dist/canvas/geometry.d.ts +92 -0
- package/dist/canvas/geometry.d.ts.map +1 -0
- package/dist/canvas/geometry.js +197 -0
- package/dist/canvas/geometry.js.map +1 -0
- package/dist/canvas/grid-canvas.d.ts +161 -0
- package/dist/canvas/grid-canvas.d.ts.map +1 -0
- package/dist/canvas/grid-canvas.js +1146 -0
- package/dist/canvas/grid-canvas.js.map +1 -0
- package/dist/canvas/hooks.d.ts +61 -0
- package/dist/canvas/hooks.d.ts.map +1 -0
- package/dist/canvas/hooks.js +2 -0
- package/dist/canvas/hooks.js.map +1 -0
- package/dist/canvas/keys.d.ts +26 -0
- package/dist/canvas/keys.d.ts.map +1 -0
- package/dist/canvas/keys.js +133 -0
- package/dist/canvas/keys.js.map +1 -0
- package/dist/canvas/layout.d.ts +26 -0
- package/dist/canvas/layout.d.ts.map +1 -0
- package/dist/canvas/layout.js +73 -0
- package/dist/canvas/layout.js.map +1 -0
- package/dist/canvas/scroll.d.ts +31 -0
- package/dist/canvas/scroll.d.ts.map +1 -0
- package/dist/canvas/scroll.js +111 -0
- package/dist/canvas/scroll.js.map +1 -0
- package/dist/canvas/text.d.ts +23 -0
- package/dist/canvas/text.d.ts.map +1 -0
- package/dist/canvas/text.js +142 -0
- package/dist/canvas/text.js.map +1 -0
- package/dist/{theme.d.ts → canvas/theme.d.ts} +8 -0
- package/dist/canvas/theme.d.ts.map +1 -0
- package/dist/canvas/theme.js +62 -0
- package/dist/canvas/theme.js.map +1 -0
- package/dist/core/cache.d.ts +48 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +222 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/checked.d.ts +20 -0
- package/dist/core/checked.d.ts.map +1 -0
- package/dist/core/checked.js +61 -0
- package/dist/core/checked.js.map +1 -0
- package/dist/core/client.d.ts +33 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +103 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/conditions.d.ts +48 -0
- package/dist/core/conditions.d.ts.map +1 -0
- package/dist/core/conditions.js +105 -0
- package/dist/core/conditions.js.map +1 -0
- package/dist/core/evaluate.d.ts +20 -0
- package/dist/core/evaluate.d.ts.map +1 -0
- package/dist/core/evaluate.js +210 -0
- package/dist/core/evaluate.js.map +1 -0
- package/dist/core/filters.d.ts +51 -0
- package/dist/core/filters.d.ts.map +1 -0
- package/dist/core/filters.js +303 -0
- package/dist/core/filters.js.map +1 -0
- package/dist/core/format.d.ts +14 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +303 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/measures.d.ts +26 -0
- package/dist/core/measures.d.ts.map +1 -0
- package/dist/core/measures.js +105 -0
- package/dist/core/measures.js.map +1 -0
- package/dist/core/request-ids.d.ts +20 -0
- package/dist/core/request-ids.d.ts.map +1 -0
- package/dist/core/request-ids.js +55 -0
- package/dist/core/request-ids.js.map +1 -0
- package/dist/core/rows.d.ts +79 -0
- package/dist/core/rows.d.ts.map +1 -0
- package/dist/core/rows.js +173 -0
- package/dist/core/rows.js.map +1 -0
- package/dist/core/store.d.ts +233 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +1162 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/totals.d.ts +24 -0
- package/dist/core/totals.d.ts.map +1 -0
- package/dist/core/totals.js +49 -0
- package/dist/core/totals.js.map +1 -0
- package/dist/core/trace.d.ts +7 -0
- package/dist/core/trace.d.ts.map +1 -0
- package/dist/core/trace.js +26 -0
- package/dist/core/trace.js.map +1 -0
- package/dist/core/transports.d.ts +50 -0
- package/dist/core/transports.d.ts.map +1 -0
- package/dist/core/transports.js +160 -0
- package/dist/core/transports.js.map +1 -0
- package/dist/core/types.d.ts +151 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +45 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core.d.ts +12 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +11 -0
- package/dist/core.js.map +1 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/dist/react/accessible-rows.d.ts +13 -0
- package/dist/react/accessible-rows.d.ts.map +1 -0
- package/dist/react/accessible-rows.js +320 -0
- package/dist/react/accessible-rows.js.map +1 -0
- package/dist/react/cell-editor.d.ts +22 -0
- package/dist/react/cell-editor.d.ts.map +1 -0
- package/dist/react/cell-editor.js +431 -0
- package/dist/react/cell-editor.js.map +1 -0
- package/dist/react/cell-menu.d.ts +18 -0
- package/dist/react/cell-menu.d.ts.map +1 -0
- package/dist/react/cell-menu.js +299 -0
- package/dist/react/cell-menu.js.map +1 -0
- package/dist/react/column-menu.d.ts +16 -0
- package/dist/react/column-menu.d.ts.map +1 -0
- package/dist/react/column-menu.js +1311 -0
- package/dist/react/column-menu.js.map +1 -0
- package/dist/react/columns-menu.d.ts +7 -0
- package/dist/react/columns-menu.d.ts.map +1 -0
- package/dist/react/columns-menu.js +249 -0
- package/dist/react/columns-menu.js.map +1 -0
- package/dist/react/conditions-menu.d.ts +10 -0
- package/dist/react/conditions-menu.d.ts.map +1 -0
- package/dist/react/conditions-menu.js +795 -0
- package/dist/react/conditions-menu.js.map +1 -0
- package/dist/react/context.d.ts +29 -0
- package/dist/react/context.d.ts.map +1 -0
- package/dist/react/context.js +18 -0
- package/dist/react/context.js.map +1 -0
- package/dist/react/data-grid.d.ts +79 -0
- package/dist/react/data-grid.d.ts.map +1 -0
- package/dist/react/data-grid.js +653 -0
- package/dist/react/data-grid.js.map +1 -0
- package/dist/react/detail-panel.d.ts +22 -0
- package/dist/react/detail-panel.d.ts.map +1 -0
- package/dist/react/detail-panel.js +242 -0
- package/dist/react/detail-panel.js.map +1 -0
- package/dist/react/export-menu.d.ts +11 -0
- package/dist/react/export-menu.d.ts.map +1 -0
- package/dist/react/export-menu.js +304 -0
- package/dist/react/export-menu.js.map +1 -0
- package/dist/react/find-bar.d.ts +11 -0
- package/dist/react/find-bar.d.ts.map +1 -0
- package/dist/react/find-bar.js +303 -0
- package/dist/react/find-bar.js.map +1 -0
- package/dist/react/format-form.d.ts +12 -0
- package/dist/react/format-form.d.ts.map +1 -0
- package/dist/react/format-form.js +863 -0
- package/dist/react/format-form.js.map +1 -0
- package/dist/react/formula-menu.d.ts +6 -0
- package/dist/react/formula-menu.d.ts.map +1 -0
- package/dist/react/formula-menu.js +343 -0
- package/dist/react/formula-menu.js.map +1 -0
- package/dist/react/grid-body.d.ts +33 -0
- package/dist/react/grid-body.d.ts.map +1 -0
- package/dist/react/grid-body.js +1389 -0
- package/dist/react/grid-body.js.map +1 -0
- package/dist/react/group-menu.d.ts +7 -0
- package/dist/react/group-menu.d.ts.map +1 -0
- package/dist/react/group-menu.js +508 -0
- package/dist/react/group-menu.js.map +1 -0
- package/dist/react/hooks.d.ts +33 -0
- package/dist/react/hooks.d.ts.map +1 -0
- package/dist/react/hooks.js +161 -0
- package/dist/react/hooks.js.map +1 -0
- package/dist/react/messages.d.ts +180 -0
- package/dist/react/messages.d.ts.map +1 -0
- package/dist/react/messages.js +414 -0
- package/dist/react/messages.js.map +1 -0
- package/dist/react/save.d.ts +9 -0
- package/dist/react/save.d.ts.map +1 -0
- package/dist/react/save.js +102 -0
- package/dist/react/save.js.map +1 -0
- package/dist/react/static-rows.d.ts +9 -0
- package/dist/react/static-rows.d.ts.map +1 -0
- package/dist/react/static-rows.js +176 -0
- package/dist/react/static-rows.js.map +1 -0
- package/dist/react/status-bar.d.ts +12 -0
- package/dist/react/status-bar.d.ts.map +1 -0
- package/dist/react/status-bar.js +413 -0
- package/dist/react/status-bar.js.map +1 -0
- package/dist/react/toolbar-popover.d.ts +14 -0
- package/dist/react/toolbar-popover.d.ts.map +1 -0
- package/dist/react/toolbar-popover.js +143 -0
- package/dist/react/toolbar-popover.js.map +1 -0
- package/dist/react/toolbar.d.ts +13 -0
- package/dist/react/toolbar.d.ts.map +1 -0
- package/dist/react/toolbar.js +344 -0
- package/dist/react/toolbar.js.map +1 -0
- package/dist/server.d.ts +22 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +45 -0
- package/dist/server.js.map +1 -0
- package/dist/styles.css +496 -316
- package/package.json +42 -17
- package/src/canvas/geometry.ts +197 -0
- package/src/canvas/grid-canvas.ts +1222 -0
- package/src/canvas/hooks.ts +61 -0
- package/src/canvas/keys.ts +96 -0
- package/src/canvas/layout.ts +77 -0
- package/src/canvas/scroll.ts +120 -0
- package/src/canvas/text.ts +155 -0
- package/src/{theme.ts → canvas/theme.ts} +14 -1
- package/src/core/cache.ts +247 -0
- package/src/core/checked.ts +64 -0
- package/src/core/client.ts +103 -0
- package/src/core/conditions.ts +89 -0
- package/src/core/evaluate.ts +221 -0
- package/src/core/filters.ts +268 -0
- package/src/core/format.ts +309 -0
- package/src/core/measures.ts +99 -0
- package/src/core/request-ids.ts +54 -0
- package/src/core/rows.ts +213 -0
- package/src/core/store.ts +1122 -0
- package/src/core/totals.ts +59 -0
- package/src/core/trace.ts +44 -0
- package/src/core/transports.ts +177 -0
- package/src/core/types.ts +169 -0
- package/src/core.ts +39 -0
- package/src/index.ts +24 -12
- package/src/react/accessible-rows.tsx +242 -0
- package/src/react/cell-editor.tsx +216 -0
- package/src/react/cell-menu.tsx +166 -0
- package/src/react/column-menu.tsx +619 -0
- package/src/react/columns-menu.tsx +116 -0
- package/src/react/conditions-menu.tsx +289 -0
- package/src/react/context.ts +33 -0
- package/src/react/data-grid.tsx +286 -0
- package/src/react/detail-panel.tsx +92 -0
- package/src/react/export-menu.tsx +112 -0
- package/src/react/find-bar.tsx +112 -0
- package/src/react/format-form.tsx +421 -0
- package/src/react/formula-menu.tsx +163 -0
- package/src/react/grid-body.tsx +744 -0
- package/src/react/group-menu.tsx +214 -0
- package/src/react/hooks.ts +104 -0
- package/src/react/messages.ts +556 -0
- package/src/react/save.ts +42 -0
- package/src/react/static-rows.tsx +59 -0
- package/src/react/status-bar.tsx +175 -0
- package/src/react/toolbar-popover.tsx +69 -0
- package/src/react/toolbar.tsx +152 -0
- package/src/server.ts +58 -0
- package/src/styles.css +496 -316
- package/dist/components/bars.d.ts +0 -14
- package/dist/components/bars.d.ts.map +0 -1
- package/dist/components/bars.js +0 -68
- package/dist/components/bars.js.map +0 -1
- package/dist/components/cell-inspector.d.ts +0 -11
- package/dist/components/cell-inspector.d.ts.map +0 -1
- package/dist/components/cell-inspector.js +0 -37
- package/dist/components/cell-inspector.js.map +0 -1
- package/dist/components/columns-panel.d.ts +0 -12
- package/dist/components/columns-panel.d.ts.map +0 -1
- package/dist/components/columns-panel.js +0 -11
- package/dist/components/columns-panel.js.map +0 -1
- package/dist/components/filter-panel.d.ts +0 -22
- package/dist/components/filter-panel.d.ts.map +0 -1
- package/dist/components/filter-panel.js +0 -169
- package/dist/components/filter-panel.js.map +0 -1
- package/dist/components/find-bar.d.ts +0 -9
- package/dist/components/find-bar.d.ts.map +0 -1
- package/dist/components/find-bar.js +0 -46
- package/dist/components/find-bar.js.map +0 -1
- package/dist/components/popover.d.ts +0 -38
- package/dist/components/popover.d.ts.map +0 -1
- package/dist/components/popover.js +0 -104
- package/dist/components/popover.js.map +0 -1
- package/dist/components/stats-panel.d.ts +0 -12
- package/dist/components/stats-panel.d.ts.map +0 -1
- package/dist/components/stats-panel.js +0 -40
- package/dist/components/stats-panel.js.map +0 -1
- package/dist/controller.d.ts +0 -227
- package/dist/controller.d.ts.map +0 -1
- package/dist/controller.js +0 -845
- package/dist/controller.js.map +0 -1
- package/dist/data-grid.d.ts +0 -51
- package/dist/data-grid.d.ts.map +0 -1
- package/dist/data-grid.js +0 -704
- package/dist/data-grid.js.map +0 -1
- package/dist/labels.d.ts +0 -9
- package/dist/labels.d.ts.map +0 -1
- package/dist/labels.js +0 -38
- package/dist/labels.js.map +0 -1
- package/dist/messages.d.ts +0 -99
- package/dist/messages.d.ts.map +0 -1
- package/dist/messages.js +0 -276
- package/dist/messages.js.map +0 -1
- package/dist/renderer.d.ts +0 -52
- package/dist/renderer.d.ts.map +0 -1
- package/dist/renderer.js +0 -522
- package/dist/renderer.js.map +0 -1
- package/dist/text.d.ts +0 -14
- package/dist/text.d.ts.map +0 -1
- package/dist/text.js +0 -63
- package/dist/text.js.map +0 -1
- package/dist/theme.d.ts.map +0 -1
- package/dist/theme.js +0 -54
- package/dist/theme.js.map +0 -1
- package/src/components/bars.tsx +0 -180
- package/src/components/cell-inspector.tsx +0 -70
- package/src/components/columns-panel.tsx +0 -59
- package/src/components/filter-panel.tsx +0 -293
- package/src/components/find-bar.tsx +0 -104
- package/src/components/popover.tsx +0 -194
- package/src/components/stats-panel.tsx +0 -153
- package/src/controller.ts +0 -945
- package/src/data-grid.tsx +0 -1035
- package/src/labels.ts +0 -46
- package/src/messages.ts +0 -390
- package/src/renderer.ts +0 -535
- package/src/text.ts +0 -55
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["applyCommand","CommandError","canonicalJson","checkPlan","decodeBlock","displayedColumns","emptyDocument","emptySession","keyText","normalizePlan","PlanError","planOptions","repairDocument","ViewCache","GridClient","valuesPlan","measuresPlan","RowReader","sameColumns","TotalsReader","now","track","GridError","CACHE_BYTES","RETRIED","Set","isCancelled","error","code","asGridError","message","reason","path","Error","String","planKey","plan","GridStore","listeners","rowListeners","events","document","session","controlled","proposed","client","connection","opened","current","next","written","Map","writes","writeVersions","writing","Promise","resolve","totals","revision","signal","measure","publish","readFailed","rowsVersion","constructor","options","reader","table","snapshot","rowKey","base","keyed","Boolean","active","key","showView","info","view","showRows","emitRows","fail","cacheBytes","displayed","pending","status","failedWrite","initial","seed","getSnapshot","subscribe","listener","add","delete","on","event","set","emit","value","changes","previous","columns","keep","displayedOf","follow","names","aggregate","measures","map","name","result","request","start","end","block","bytes","values","forEach","column","index","rows","part","cell","row","cache","size","loaded","entry","undefined","get","isCut","rowId","getRowsVersion","subscribeRows","setViewport","viewport","ensure","connect","transport","connected","openingEvents","stopEvents","push","onEvent","tableId","close","id","catch","ref","open","read","opening","abort","reset","AbortController","repaired","capabilities","seeded","edits","version","removed","length","change","showPlan","schedule","fileChanged","_","rest","then","adopt","progress","readableRows","rowCount","withKeyFor","around","top","find","item","hash","rowCountExact","checked","receive","rowIds","truncated","partialViews","fresh","aborted","prepare","live","scroll","located","locate","keys","state","updated","command","contextFor","target","Math","min","dropWritten","write","Number","POSITIVE_INFINITY","max","lookup","withWritten","page","has","markWritten","updates","update","text","done","dropped","control","setDocument","setSession","extra","shown","reports","Object","applyNow","kind","context","clipboard","started","dispatch","given","structuredClone","applied","tries","details","load","failure","ok","output","send","requests","dispatchSync","retryWrite","failed","retry","op","stillLast","discardWrite","failWrite","list","step","history","at","before","after","sent","exportUrl","exportName","format","split","pop","replace","reload","summarize","ranges","search","limit","made","count","slice","from","direction","caseSensitive","indexOf","found","fullValue","textLimit","overwrite","some","sendNow","finished","members","other","core","createGridStore"],"sources":["store.ts"],"sourcesContent":["import {\n applyCommand,\n type CheckedPlan,\n type Column,\n type CommandContext,\n CommandError,\n type CommandRequest,\n type CommandResult,\n canonicalJson,\n checkPlan,\n decodeBlock,\n displayedColumns,\n type ErrorCode,\n emptyDocument,\n emptySession,\n type GridCommand,\n type GridDocument,\n type GridSession,\n type JsonValue,\n keyText,\n type LoadedRow,\n type Measure,\n normalizePlan,\n type Operation,\n type Plan,\n PlanError,\n planOptions,\n type RowKey,\n repairDocument,\n} from \"vastgrid-spec\";\nimport { ViewCache } from \"./cache.js\";\nimport { GridClient, type Transport } from \"./client.js\";\nimport { valuesPlan } from \"./filters.js\";\nimport { measuresPlan } from \"./measures.js\";\nimport { RowReader, sameColumns, type View, type Viewport } from \"./rows.js\";\nimport { TotalsReader } from \"./totals.js\";\nimport { now, track } from \"./trace.js\";\nimport {\n type CommandOutcome,\n type FailedWrite,\n GridError,\n type GridSnapshot,\n type InitialView,\n type OpenOptions,\n type RowsResult,\n type TableInfo,\n type ViewInfo,\n type WriteUpdate,\n} from \"./types.js\";\n\n/** Bytes of rows that a store keeps for the view on screen, by default. */\nexport const CACHE_BYTES = 64 * 1024 * 1024;\n\n/** Failures of a write that the same write may not meet when it is sent again. */\nconst RETRIED = new Set<ErrorCode>([\"internal\", \"cancelled\", \"not_ready\", \"table_not_found\"]);\n\nexport interface GridStoreOptions {\n /** Where the engine is. */\n transport: Transport;\n /** The `ref` of the table to open (§8.2). */\n table: string;\n /** The `read` options of `open`. */\n open?: OpenOptions;\n /** The document to start with (§5.1); the empty document by default. */\n document?: GridDocument;\n /** The session to start with (§5.2). */\n session?: GridSession;\n /** Rows read on a server, shown before the first read (§7 of react.md). */\n initial?: InitialView;\n /** Bytes of rows to keep (`CACHE_BYTES` by default). */\n cacheBytes?: number;\n}\n\nexport interface DispatchOptions {\n /** What `edit.paste` pastes. */\n clipboard?: { text?: string; html?: string };\n}\n\ntype Part = \"document\" | \"session\";\n\n/** A command applied, or why it was not. */\ntype Applied =\n | { kind: \"applied\"; result: CommandResult; table: TableInfo }\n | { kind: \"failed\"; error: CommandError | GridError; view: View | null };\n\ninterface Events {\n document: GridDocument;\n session: GridSession;\n error: GridError;\n}\n\nfunction isCancelled(error: unknown) {\n return error instanceof GridError && error.code === \"cancelled\";\n}\n\nfunction asGridError(error: unknown): GridError {\n if (error instanceof GridError) return error;\n if (error instanceof PlanError) {\n return new GridError(\"invalid_plan\", error.message, { reason: error.reason, path: error.path });\n }\n return new GridError(\"internal\", error instanceof Error ? error.message : String(error));\n}\n\nfunction planKey(plan: Plan): string {\n return canonicalJson(normalizePlan(plan));\n}\n\n/**\n * The grid without a screen (§4 of react.md): the state of the specification as immutable snapshots, the\n * commands that change it, and the rows of the view on screen, read through a transport. Making a store has\n * no side effects; `connect` opens the table and starts reading.\n */\nexport class GridStore {\n private snapshot: GridSnapshot;\n private readonly listeners = new Set<() => void>();\n private readonly rowListeners = new Set<() => void>();\n private readonly events: { [K in keyof Events]: Set<(value: Events[K]) => void> } = {\n document: new Set(),\n session: new Set(),\n error: new Set(),\n };\n private readonly controlled = { document: false, session: false };\n /** What a command made of a controlled part, until the host passes it back (§5.2 of react.md). */\n private readonly proposed: { document?: GridDocument; session?: GridSession } = {};\n private client: GridClient | null = null;\n /** Counts connections, so that answers to an earlier one are dropped. */\n private connection = 0;\n /** Whether the table is open for the current connection. */\n private opened = false;\n private current: View | null = null;\n private next: View | null = null;\n private readonly reader: RowReader;\n /**\n * Values of writes (§7.2) that the rows read do not hold yet, by the key text of their row and by column, with\n * the write that gave them: the grid shows them at once, and drops them when the write fails or once the view\n * of its edits version is on screen.\n */\n private readonly written = new Map<string, Map<string, { value: JsonValue; write: number }>>();\n private writes = 0;\n /** The edits version that each write that succeeded made. */\n private readonly writeVersions = new Map<number, number>();\n /** Settles once the writes sent so far are answered and their steps are in the history. */\n private writing: Promise<void> = Promise.resolve();\n private readonly totals = new TotalsReader(\n (plan, revision, signal) => this.measure(plan, revision, signal),\n (totals) => this.publish({ totals }),\n (error) => this.readFailed(error),\n );\n private rowsVersion = 0;\n\n constructor(private readonly options: GridStoreOptions) {\n this.reader = new RowReader(\n {\n current: () => this.current,\n next: () => this.next,\n client: () => this.client,\n table: () => this.snapshot.table,\n opened: () => this.opened,\n rowKey: () => this.base(\"document\").rowKey,\n keyed: () => Boolean(this.base(\"session\").active?.key),\n showView: (info) => this.publish({ view: info }),\n showRows: () => this.emitRows(),\n fail: (error) => this.readFailed(error),\n },\n options.cacheBytes ?? CACHE_BYTES,\n );\n this.snapshot = {\n document: options.document ?? emptyDocument(),\n session: options.session ?? emptySession(),\n table: null,\n view: null,\n displayed: [],\n pending: null,\n status: \"idle\",\n error: null,\n failedWrite: null,\n totals: null,\n };\n if (options.initial) this.seed(options.initial);\n }\n\n // ----- reading the state -----\n\n getSnapshot = (): GridSnapshot => this.snapshot;\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n /** Follows changes of the document or the session (reported also when they are controlled), and errors. */\n on<K extends keyof Events>(event: K, listener: (value: Events[K]) => void): () => void {\n const set = this.events[event] as Set<(value: Events[K]) => void>;\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n }\n\n private emit<K extends keyof Events>(event: K, value: Events[K]) {\n for (const listener of this.events[event] as Set<(value: Events[K]) => void>) listener(value);\n }\n\n private publish(changes: Partial<{ -readonly [K in keyof GridSnapshot]: GridSnapshot[K] }>) {\n const previous = this.snapshot;\n const next = { ...previous, ...changes };\n if (next.view && previous.view && sameColumns(next.view.columns, previous.view.columns)) {\n // Views read again keep their columns' identity, which displayed columns and commands key on.\n if (next.view.columns !== previous.view.columns) next.view = { ...next.view, columns: previous.view.columns };\n }\n const keep = next.document.columns === previous.document.columns && next.view?.columns === previous.view?.columns;\n next.displayed = keep ? previous.displayed : this.displayedOf(next);\n this.snapshot = next;\n for (const listener of this.listeners) listener();\n // The totals are read once the table is open, which rows read on a server come before.\n if (this.opened) this.totals.follow(this.current, this.snapshot);\n }\n\n /** Reads the one row of a plan that aggregates without keys: its values and their types, by column name. */\n private async measure(plan: Plan, revision: string | null, signal?: AbortSignal) {\n const table = this.snapshot.table;\n const client = this.client;\n if (!table || !client || !this.opened) throw new GridError(\"not_ready\", \"The table is not open yet.\");\n const names = plan.aggregate?.measures.map((measure) => measure.name) ?? [];\n const result = await client.request<RowsResult>(\n \"rows\",\n { table: table.table, revision, plan, start: 0, end: 1, columns: names },\n signal,\n );\n const block = decodeBlock(result.block.bytes);\n const values: Record<string, JsonValue> = {};\n const columns: Record<string, Column> = {};\n block.columns.forEach((column, index) => {\n values[column.name] = block.rows[0]?.[index] ?? null;\n columns[column.name] = column;\n });\n return { values, columns };\n }\n\n /**\n * Measures (§4.5) over the rows of the document's plan, for the column statistics: an `aggregate` without keys\n * (`measuresPlan`). Fails for a plan that groups rows.\n */\n async aggregate(\n measures: Measure[],\n signal?: AbortSignal,\n ): Promise<{ values: Record<string, JsonValue>; columns: Record<string, Column> }> {\n const plan = measuresPlan(this.base(\"document\").plan ?? {}, measures);\n if (!plan) throw new GridError(\"invalid_plan\", \"The measures of a grouped view are not read.\");\n return this.measure(plan, this.current?.revision ?? this.snapshot.table?.revision ?? null, signal);\n }\n\n private displayedOf(snapshot: GridSnapshot) {\n return snapshot.view ? displayedColumns(snapshot.document, snapshot.view.columns) : [];\n }\n\n /** The state that commands apply to: what was proposed for controlled parts, or what is shown. */\n private base<P extends Part>(part: P): GridSnapshot[P] {\n return (this.proposed[part] ?? this.snapshot[part]) as GridSnapshot[P];\n }\n\n // ----- rows -----\n\n /** The value of a cell of the view on screen; undefined while it is not read. */\n cell(row: number, column: string): JsonValue | undefined {\n const view = this.current;\n const value = view?.cache.value(row, column);\n if (!view || this.written.size === 0) return value;\n const key = view.cache.loaded(row, this.base(\"document\").rowKey)?.key;\n const entry = key === undefined ? undefined : this.written.get(keyText(key))?.get(column);\n return entry === undefined ? value : entry.value;\n }\n\n /** Whether the engine cut a cell's value to the text limit (§8.4). */\n isCut(row: number, column: string) {\n return this.current?.cache.isCut(row, column) ?? false;\n }\n\n /** The key of a row of the view on screen (§5.3); undefined while it is not read. */\n rowKey(row: number): RowKey | undefined {\n return this.current?.cache.loaded(row, this.base(\"document\").rowKey)?.key;\n }\n\n /** The row ID of a row of the view on screen. */\n rowId(row: number) {\n return this.current?.cache.rowId(row);\n }\n\n /** Changes whenever rows of the view on screen arrive or leave. */\n getRowsVersion = (): number => this.rowsVersion;\n\n /** Follows the arrival of rows (the snapshot does not change when rows arrive). */\n subscribeRows = (listener: () => void): (() => void) => {\n this.rowListeners.add(listener);\n return () => {\n this.rowListeners.delete(listener);\n };\n };\n\n private emitRows() {\n this.rowsVersion++;\n for (const listener of this.rowListeners) listener();\n }\n\n /** Tells the store what the canvas shows, so that it reads those rows and a page around them. */\n setViewport(viewport: Viewport) {\n this.reader.setViewport(viewport);\n }\n\n /** Reads rows `[start, end)` of `columns` of the view on screen if they are not read, for cells React renders. */\n ensure(start: number, end: number, columns: readonly string[]) {\n this.reader.ensure(start, end, columns);\n }\n\n // ----- connecting -----\n\n /**\n * Opens the table, follows its events and reads the view of the document's plan. Gives the function that\n * undoes all of it; connecting again afterwards works (Strict Mode does it, §4.3 of react.md).\n */\n connect(): () => void {\n const connection = ++this.connection;\n const client = new GridClient(this.options.transport);\n this.client = client;\n this.opened = false;\n let connected = true;\n // Events can arrive before the open response names the table (HTTP's streams are independent). Replay\n // them against that response, so an early ready event cannot leave plans waiting for loading forever.\n let openingEvents: Record<string, unknown>[] | null = [];\n const stopEvents = client.subscribe((event) => {\n if (!connected || connection !== this.connection) return;\n if (openingEvents) openingEvents.push(event);\n else this.onEvent(event, connection);\n });\n if (this.snapshot.status === \"idle\" || this.snapshot.status === \"error\") this.publish({ status: \"opening\" });\n let tableId: string | null = null;\n const close = (id: string) => void client.request(\"close\", { table: id }).catch(() => {});\n void (async () => {\n try {\n // Not cancelled: an engine may open the table all the same, which is then closed.\n const info = await client.request<TableInfo>(\"open\", {\n ref: this.options.table,\n ...(this.options.open ? { read: this.options.open } : {}),\n });\n if (!connected) {\n close(info.table);\n return;\n }\n tableId = info.table;\n this.opened = true;\n this.opening(info);\n const events = openingEvents;\n openingEvents = null;\n for (const event of events ?? []) this.onEvent(event, connection);\n } catch (error) {\n openingEvents = null;\n if (connected && !isCancelled(error)) {\n this.publish({ status: \"error\" });\n this.fail(asGridError(error));\n }\n }\n })();\n return () => {\n if (!connected) return;\n connected = false;\n openingEvents = null;\n stopEvents();\n if (tableId !== null) close(tableId);\n if (connection !== this.connection) return;\n this.connection++;\n this.opened = false;\n this.current?.abort.abort();\n this.next?.abort.abort();\n this.next = null;\n this.totals.reset();\n if (this.current) this.current = { ...this.current, abort: new AbortController() };\n this.client = null;\n };\n }\n\n /** The table is open: repairs the document for it and reads the view (§5.5). */\n private opening(info: TableInfo) {\n const document = this.base(\"document\");\n const repaired = repairDocument(document, info.columns, planOptions(info.capabilities));\n const seeded = this.current;\n // Rows read on a server stay when they belong to the same revision and plan.\n if (seeded && (seeded.revision !== info.revision || seeded.edits !== info.edits.version)) this.current = null;\n else if (seeded) this.current = { ...seeded, abort: new AbortController() };\n this.publish({ table: info, status: info.status === \"error\" ? \"error\" : \"ready\" });\n if (repaired.removed.length > 0) this.change(repaired.document, this.base(\"session\"));\n this.showPlan(this.base(\"document\").plan ?? {});\n this.reader.schedule();\n }\n\n private onEvent(event: Record<string, unknown>, connection: number) {\n if (connection !== this.connection) return;\n const table = this.snapshot.table;\n if (!table || event.table !== table.table) return;\n if (event.event === \"changed\") {\n const revision = event.revision as string | null;\n const edits = event.edits as TableInfo[\"edits\"];\n const fileChanged = event.fileChanged === true;\n if (revision === table.revision) {\n if (edits.version === table.edits.version && fileChanged === (table.fileChanged === true)) return;\n const { fileChanged: _, ...rest } = table;\n this.publish({ table: fileChanged ? { ...rest, edits, fileChanged } : { ...rest, edits } });\n this.showPlan(this.base(\"document\").plan ?? {});\n return;\n }\n // Another revision may have other columns: the table is read again, then the view (§5.4).\n const client = this.client;\n void client\n ?.request<TableInfo>(\"info\", { table: table.table })\n .then((info) => {\n if (connection === this.connection) this.adopt(info);\n })\n .catch((error: unknown) => {\n if (connection === this.connection && !isCancelled(error)) this.fail(asGridError(error));\n });\n } else if (event.event === \"progress\") {\n this.publish({\n table: {\n ...table,\n status: event.status as TableInfo[\"status\"],\n progress: event.progress as number | null,\n readableRows: event.readableRows as number,\n rowCount: event.rowCount as number | null,\n },\n });\n if (event.status === \"ready\") this.showPlan(this.base(\"document\").plan ?? {});\n // A view still being made reads its rows again once the table is read, also without `view` events (§9).\n const view = this.current;\n if (event.status === \"ready\" && view?.info && view.info.status !== \"ready\") {\n const columns = this.reader.withKeyFor(view, this.reader.viewport.columns);\n void this.reader.read(view, this.reader.around(this.reader.viewport.top, null, columns)).then(\n () => this.reader.schedule(),\n () => {},\n );\n }\n } else if (event.event === \"view\") {\n const view = [this.next, this.current].find(\n (item) => item?.info?.hash === event.hash && item?.revision === table.revision,\n );\n if (view?.info) {\n view.info = {\n ...view.info,\n status: event.status as ViewInfo[\"status\"],\n readableRows: event.readableRows as number,\n rowCount: event.rowCount as number,\n rowCountExact: event.rowCountExact as boolean,\n };\n if (view === this.current) this.publish({ view: view.info });\n this.reader.schedule();\n }\n }\n }\n\n private fail(error: GridError) {\n this.publish({ error });\n this.emit(\"error\", error);\n }\n\n /** A read failed: unless it was cancelled, the failure belongs to no command (§4.2 of react.md). */\n private readFailed(error: unknown) {\n if (!isCancelled(error)) this.fail(asGridError(error));\n }\n\n /** Shows rows read on a server before the table is open. */\n private seed(initial: InitialView) {\n const { table, plan, rows } = initial;\n if (planKey(plan) !== planKey(this.snapshot.document.plan ?? {})) return;\n try {\n const view: View = {\n key: planKey(plan),\n plan,\n checked: checkPlan(plan, table.columns, planOptions(table.capabilities)),\n revision: table.revision,\n edits: rows.view.edits.version,\n info: rows.view,\n cache: new ViewCache(),\n abort: new AbortController(),\n };\n const block = decodeBlock(rows.block.bytes);\n view.cache.receive(\n rows.start,\n rows.rowIds,\n block.columns.map((column) => column.name),\n block.rows,\n rows.truncated,\n );\n this.current = view;\n this.snapshot = { ...this.snapshot, table, view: rows.view };\n this.snapshot = { ...this.snapshot, displayed: this.displayedOf(this.snapshot) };\n } catch (error) {\n if (!(error instanceof PlanError)) throw error;\n }\n }\n\n // ----- views -----\n\n /**\n * Reads the view of a plan while the view on screen stays, and shows it when its first rows arrive, with the\n * session moved by `view.update` (§5.4; §4.2 of react.md).\n */\n private showPlan(plan: Plan) {\n const table = this.snapshot.table;\n if (!table || !this.client || !this.opened) return;\n const key = planKey(plan);\n if (table.status === \"loading\" && !table.capabilities.partialViews && key !== planKey({})) {\n this.next?.abort.abort();\n this.next = null;\n this.publish({ pending: { plan } });\n return;\n }\n const fresh = (view: View | null) =>\n view !== null &&\n !view.abort.signal.aborted &&\n view.key === key &&\n view.revision === table.revision &&\n view.edits === table.edits.version;\n if (this.next && !fresh(this.next)) {\n this.next.abort.abort();\n this.next = null;\n }\n if (fresh(this.current)) {\n if (this.snapshot.pending) this.publish({ pending: null });\n return;\n }\n if (this.next) return;\n if (this.current?.info?.status === \"building\") this.current.abort.abort();\n let checked: CheckedPlan;\n try {\n checked = checkPlan(plan, table.columns, planOptions(table.capabilities));\n } catch (error) {\n if (!(error instanceof PlanError)) throw error;\n if (this.snapshot.pending) this.publish({ pending: null });\n this.fail(asGridError(error));\n return;\n }\n const view: View = {\n key,\n plan,\n checked,\n revision: table.revision,\n edits: table.edits.version,\n info: null,\n cache: new ViewCache(),\n abort: new AbortController(),\n };\n this.next = view;\n if (this.current) this.publish({ pending: { plan } });\n void this.prepare(view, this.connection);\n }\n\n private live(view: View, connection: number) {\n return connection === this.connection && view === this.next;\n }\n\n private async prepare(view: View, connection: number) {\n const table = this.snapshot.table as TableInfo;\n const client = this.client as GridClient;\n const columns = this.reader.withKeyFor(view, this.reader.viewport.columns);\n try {\n const top = this.current ? this.reader.viewport.top : (this.base(\"session\").scroll?.row ?? 0);\n await this.reader.read(view, this.reader.around(top, null, columns));\n if (!this.live(view, connection) || !view.info) return;\n let info: ViewInfo = view.info;\n if (top >= info.rowCount && info.rowCount > 0) {\n await this.reader.read(view, this.reader.around(info.rowCount - 1, info.rowCount, columns));\n if (!this.live(view, connection) || !view.info) return;\n info = view.info;\n }\n // The session as it is now: the person may have moved while the rows were read.\n const session = this.base(\"session\");\n const document = this.base(\"document\");\n const key = session.active?.key;\n const located: { key: RowKey; row: number | null }[] = [];\n if (key && session.view !== info.hash && table.capabilities.locate) {\n const result = await client.request<{ rows: (number | null)[] }>(\n \"locate\",\n {\n table: table.table,\n revision: view.revision,\n plan: view.plan,\n keys: [key],\n ...(document.rowKey === undefined ? {} : { rowKey: document.rowKey }),\n },\n view.abort.signal,\n );\n if (!this.live(view, connection)) return;\n located.push({ key, row: result.rows[0] ?? null });\n }\n const state = { document: this.base(\"document\"), session: this.base(\"session\") };\n const updated = applyCommand(\n state,\n { command: \"view.update\", hash: info.hash, located },\n this.contextFor(view, table, info),\n );\n const scroll = updated.session.scroll;\n const target = scroll && scroll !== state.session.scroll ? scroll.row : Math.min(top, info.rowCount - 1);\n if (\n info.status === \"ready\" &&\n target >= 0 &&\n view.cache.value(target, columns[0] ?? \"\") === undefined &&\n columns.length > 0\n ) {\n await this.reader.read(view, this.reader.around(target, info.rowCount, columns));\n if (!this.live(view, connection)) return;\n }\n const previous = this.current;\n previous?.abort.abort();\n this.current = view;\n this.next = null;\n // The rows, the view and the session's new positions are shown in one step.\n // A view that comes on screen ends the failure of the one before (a pivot with too many columns).\n this.change(updated.document, updated.session, { view: view.info ?? info, pending: null, error: null });\n // The snapshot keeps the columns of the view before when they are the same, for commands to key on.\n view.info = this.snapshot.view;\n // Values of writes that the new rows hold are no longer needed.\n this.dropWritten((write) => (this.writeVersions.get(write) ?? Number.POSITIVE_INFINITY) <= view.edits);\n this.emitRows();\n this.reader.schedule();\n // A normal read waits for completion, also when there is no event channel or the ready event raced\n // the preview. It reports a failed build and is cancelled when the plan or connection changes.\n if (view.info?.status === \"building\" && table.status === \"ready\") {\n void this.reader.read(view, this.reader.around(Math.max(0, target), null, columns)).then(\n () => this.reader.schedule(),\n () => {},\n );\n }\n } catch (error) {\n if (view === this.next) {\n this.next = null;\n if (this.snapshot.pending) this.publish({ pending: null });\n }\n if (connection === this.connection && !isCancelled(error)) this.fail(asGridError(error));\n }\n }\n\n private contextFor(view: View, table: TableInfo, info: ViewInfo | null = view.info): CommandContext {\n const rowKey = this.base(\"document\").rowKey;\n return {\n table: table.columns,\n revision: view.revision,\n view: {\n columns: info?.columns ?? view.checked.columns,\n rowCount: info?.rowCount ?? 0,\n rowIds: view.checked.rowIds,\n },\n lookup: (row) => this.withWritten(view.cache.loaded(row, rowKey)),\n page: Math.max(1, this.reader.viewport.rows - 1),\n capabilities: table.capabilities,\n };\n }\n\n // ----- changing the state -----\n\n /** A row as commands read it, with the values of writes that its rows do not hold yet. */\n private withWritten(row: LoadedRow | undefined): LoadedRow | undefined {\n if (!row?.key || this.written.size === 0) return row;\n const values = this.written.get(keyText(row.key));\n if (!values) return row;\n return {\n key: row.key,\n has: (column) => values.has(column) || row.has(column),\n get: (column) => {\n const entry = values.get(column);\n return entry === undefined ? row.get(column) : entry.value;\n },\n };\n }\n\n /** Shows the values of a write until it is answered (§7.2). */\n private markWritten(write: number, updates: readonly { key: RowKey; column: string; value: JsonValue }[]) {\n for (const update of updates) {\n const text = keyText(update.key);\n let values = this.written.get(text);\n if (!values) {\n values = new Map();\n this.written.set(text, values);\n }\n values.set(update.column, { value: update.value, write });\n }\n this.emitRows();\n }\n\n /** Forgets the values of writes: one that failed, or those that the rows on screen now hold. */\n private dropWritten(done: (write: number) => boolean) {\n let dropped = false;\n for (const [text, values] of this.written) {\n for (const [column, entry] of values) {\n if (!done(entry.write)) continue;\n values.delete(column);\n dropped = true;\n }\n if (values.size === 0) this.written.delete(text);\n }\n if (dropped) this.emitRows();\n }\n\n /** Makes a part controlled: commands report what they make of it, and only `setDocument`/`setSession` show it. */\n control(part: Part, controlled: boolean) {\n this.controlled[part] = controlled;\n if (!controlled) delete this.proposed[part];\n }\n\n /** Shows a document given by the host (a controlled prop, a saved view, an agent). */\n setDocument(document: GridDocument) {\n delete this.proposed.document;\n const previous = this.snapshot.document;\n if (document === previous) return;\n this.publish({ document });\n if (document.plan !== previous.plan) this.showPlan(document.plan ?? {});\n this.reader.schedule();\n }\n\n /** Shows a session given by the host. */\n setSession(session: GridSession) {\n delete this.proposed.session;\n if (session === this.snapshot.session) return;\n this.publish({ session });\n }\n\n /**\n * Applies a new state from a command: shows what is not controlled, with `extra` members of the snapshot in the\n * same step, and reports both parts that changed.\n */\n private change(\n document: GridDocument,\n session: GridSession,\n extra: Partial<{ -readonly [K in keyof GridSnapshot]: GridSnapshot[K] }> = {},\n ) {\n const shown: Partial<{ -readonly [K in keyof GridSnapshot]: GridSnapshot[K] }> = { ...extra };\n const previous = this.snapshot.document;\n const reports: ([\"document\", GridDocument] | [\"session\", GridSession])[] = [];\n if (document !== this.base(\"document\")) {\n if (this.controlled.document) this.proposed.document = document;\n else shown.document = document;\n reports.push([\"document\", document]);\n }\n if (session !== this.base(\"session\")) {\n if (this.controlled.session) this.proposed.session = session;\n else shown.session = session;\n reports.push([\"session\", session]);\n }\n if (Object.keys(shown).length > 0) this.publish(shown);\n for (const [part, value] of reports) {\n if (part === \"document\") this.emit(\"document\", value);\n else this.emit(\"session\", value);\n }\n if (shown.document && shown.document.plan !== previous.plan) this.showPlan(shown.document.plan ?? {});\n }\n\n /** Applies a command now, or tells why it cannot be applied (rows to read first included). */\n private applyNow(command: GridCommand, options: DispatchOptions): Applied {\n const view = this.current;\n const table = this.snapshot.table;\n if (!view?.info || !table) {\n return { kind: \"failed\", error: new GridError(\"not_ready\", \"The table is not open yet.\"), view: null };\n }\n const context = this.contextFor(view, table);\n if (options.clipboard) context.clipboard = options.clipboard;\n const started = now();\n try {\n const result = applyCommand({ document: this.base(\"document\"), session: this.base(\"session\") }, command, context);\n track(command.command, started, \"commands\");\n this.change(result.document, result.session);\n return { kind: \"applied\", result, table };\n } catch (error) {\n if (!(error instanceof CommandError)) throw error;\n track(command.command, started, \"commands\", \"error\");\n return { kind: \"failed\", error, view };\n }\n }\n\n /**\n * Applies a command (§4.2 of react.md). The state changes at once when the command has what it needs;\n * a command that needs rows that are not read reads them first. Resolves once the command's requests are\n * answered, and never rejects. The same function for the life of the store.\n */\n readonly dispatch = async (command: GridCommand, options: DispatchOptions = {}): Promise<CommandOutcome> => {\n // The state never shares objects with a command that its caller may change later.\n const given = structuredClone(command);\n // An undo or a redo takes the last step once the writes sent before it are in the history.\n if (given.command === \"history.undo\" || given.command === \"history.redo\") await this.writing;\n let applied = this.applyNow(given, options);\n for (\n let tries = 0;\n tries < 3 &&\n applied.kind === \"failed\" &&\n applied.view &&\n applied.error instanceof CommandError &&\n applied.error.reason === \"not_loaded\" &&\n applied.error.details;\n tries++\n ) {\n const view = applied.view;\n try {\n await this.reader.load(view, applied.error.details as { rows: [number, number][]; columns: string[] });\n } catch (failure) {\n // A view that another replaced while its rows were read (a write, or the file read again) is cancelled:\n // the command applies to the new one.\n if (!isCancelled(failure) || view === this.current) return { ok: false, error: asGridError(failure) };\n }\n applied = this.applyNow(given, options);\n }\n if (applied.kind === \"failed\") return { ok: false, error: applied.error };\n try {\n const output = await this.send(given.command, applied.result.requests, applied.table);\n const value = output ?? applied.result.output;\n return value === undefined ? { ok: true } : { ok: true, output: value };\n } catch (error) {\n return { ok: false, error: asGridError(error) };\n }\n };\n\n /**\n * Applies a command synchronously, as a `copy` event needs (its clipboard is written before the handler\n * returns). A command that needs rows that are not read fails with `not_loaded`; its requests are sent.\n */\n dispatchSync(command: GridCommand, options: DispatchOptions = {}): CommandOutcome {\n const given = structuredClone(command);\n const applied = this.applyNow(given, options);\n if (applied.kind === \"failed\") return { ok: false, error: applied.error };\n if (applied.result.requests.length > 0) {\n void this.send(given.command, applied.result.requests, applied.table).catch((error: unknown) => {\n this.fail(asGridError(error));\n });\n }\n return applied.result.output === undefined ? { ok: true } : { ok: true, output: applied.result.output };\n }\n\n /**\n * Sends the failed write again (§6.6 of react.md): the same updates, or after an `edit_conflict` without their\n * `previous`, so that they write over what the cells hold now. It succeeds as its command would have: the history\n * gets its step, or an undo or a redo whose step is still the last moves it. Resolves as `dispatch` does.\n */\n readonly retryWrite = async (): Promise<CommandOutcome> => {\n const failed = this.snapshot.failedWrite;\n const table = this.snapshot.table;\n if (!failed) return { ok: false, error: new GridError(\"invalid_request\", \"No write failed.\") };\n if (failed.retry === null || !table || table.revision !== failed.revision) {\n return { ok: false, error: new GridError(\"revision_changed\", \"The write cannot be sent again.\") };\n }\n this.publish({ failedWrite: null });\n const request: CommandRequest = { op: \"write\", revision: failed.revision, updates: failed.updates };\n if (failed.rowKey !== undefined) request.rowKey = failed.rowKey;\n const command = this.stillLast(failed) ? failed.command : \"write\";\n try {\n await this.send(command, [request], table, failed.retry === \"overwrite\");\n return { ok: true };\n } catch (error) {\n return { ok: false, error: asGridError(error) };\n }\n };\n\n /** Forgets the failed write: its cells show what the engine holds. */\n discardWrite() {\n if (this.snapshot.failedWrite) this.publish({ failedWrite: null });\n }\n\n /** Keeps a write that failed, for `retryWrite` and `discardWrite`. */\n private failWrite(command: string, request: CommandRequest, error: GridError) {\n const failed: FailedWrite = {\n command,\n updates: request.updates as WriteUpdate[],\n revision: (request.revision as string | null | undefined) ?? null,\n ...(request.rowKey === undefined ? {} : { rowKey: request.rowKey as string | string[] }),\n error,\n retry: error.code === \"edit_conflict\" ? \"overwrite\" : RETRIED.has(error.code) ? \"retry\" : null,\n };\n this.publish({ failedWrite: failed });\n }\n\n /** Whether a failed undo or redo has its step still last in its list, where its write then moves it from. */\n private stillLast(failed: FailedWrite) {\n const list = failed.command === \"history.undo\" ? \"undo\" : failed.command === \"history.redo\" ? \"redo\" : null;\n if (!list) return true;\n const step = this.base(\"session\").history?.[list].at(-1);\n if (!step) return false;\n const written = step.updates.map((update) => ({\n key: update.key,\n column: update.column,\n value: list === \"undo\" ? update.before : update.after,\n previous: list === \"undo\" ? update.after : update.before,\n }));\n const sent = failed.updates.map(({ key, column, value, previous }) => ({ key, column, value, previous }));\n return canonicalJson(written) === canonicalJson(sent);\n }\n\n /** Where the file of an `export` without a target can be downloaded (`Transport.exportUrl`), or null. */\n exportUrl(target: string): string | null {\n return this.options.transport.exportUrl?.(target) ?? null;\n }\n\n /** A name for the file of an export that an engine answers as data: the table's name with the format's extension. */\n exportName(format: string): string {\n const name = this.options.table.split(/[\\\\/]/).pop() ?? \"\";\n const base = name.replace(/(\\.(gz|zst))?$/i, \"\").replace(/\\.[^.]*$/, \"\") || \"export\";\n return `${base}.${format}`;\n }\n\n /**\n * Reads the table's file as it is now (`reload`, §7.6), without the cells written into the table as it was read:\n * for a file that changed on disk while the table had written cells (`fileChanged` of the table).\n */\n async reload(): Promise<void> {\n const table = this.snapshot.table;\n const client = this.client;\n const connection = this.connection;\n if (!table || !client || !this.opened) throw new GridError(\"not_ready\", \"The table is not open yet.\");\n const info = await client.request<TableInfo>(\"reload\", { table: table.table });\n if (connection === this.connection) this.adopt(info);\n }\n\n /** Another revision of the table (§5.4): the document is repaired for its columns (§5.5), and the view read. */\n private adopt(info: TableInfo) {\n const current = this.snapshot.table;\n if (\n current &&\n current.revision === info.revision &&\n current.edits.version === info.edits.version &&\n current.fileChanged === info.fileChanged &&\n current.status === info.status\n ) {\n return;\n }\n const repaired = repairDocument(this.base(\"document\"), info.columns, planOptions(info.capabilities));\n this.publish({ table: info, status: info.status === \"error\" ? \"error\" : \"ready\" });\n if (repaired.removed.length > 0) this.change(repaired.document, this.base(\"session\"));\n this.showPlan(this.base(\"document\").plan ?? {});\n this.reader.schedule();\n }\n\n /** Counts and sums the cells of ranges of the view on screen (`summarize`, §8.2). */\n async summarize(\n ranges: [number, number][],\n columns: string[],\n signal?: AbortSignal,\n ): Promise<{ count: number; numericCount: number; sum: unknown; min: unknown; max: unknown; average: unknown }> {\n const view = this.current;\n const table = this.snapshot.table;\n const client = this.client;\n if (!view || !table || !client || !this.opened) throw new GridError(\"not_ready\", \"The table is not open yet.\");\n return client.request(\n \"summarize\",\n { table: table.table, revision: view.revision, plan: view.plan, ranges, columns },\n signal,\n );\n }\n\n /**\n * The values of a column with how many rows have each, the most common first, for the column menu's list: the\n * rows of the document's plan without the column's own conditions, and those whose text contains `search`\n * (`valuesPlan`). At most `limit` of them; `truncated` when there are more.\n */\n async values(\n column: string,\n { search = \"\", limit = 1_000 }: { search?: string; limit?: number } = {},\n signal?: AbortSignal,\n ): Promise<{ values: { value: JsonValue; count: number }[]; truncated: boolean }> {\n const table = this.snapshot.table;\n const client = this.client;\n if (!table || !client || !this.opened) throw new GridError(\"not_ready\", \"The table is not open yet.\");\n const made = valuesPlan(this.base(\"document\").plan ?? {}, column, search);\n if (!made) throw new GridError(\"invalid_plan\", \"The values of a grouped view are not listed.\");\n const result = await client.request<RowsResult>(\n \"rows\",\n {\n table: table.table,\n revision: this.current?.revision ?? table.revision,\n plan: made.plan,\n start: 0,\n end: limit + 1,\n columns: [column, made.count],\n },\n signal,\n );\n const rows = decodeBlock(result.block.bytes).rows;\n return {\n values: rows.slice(0, limit).map(([value, count]) => ({ value, count: Number(count) })),\n truncated: rows.length > limit,\n };\n }\n\n /**\n * Finds the next cell of the view on screen after `from` (before it with `direction` −1) whose text contains\n * `text` (`find`, §8.2), among the displayed columns in display order, wrapping around; null when none does.\n */\n async find(\n text: string,\n {\n from,\n direction = 1,\n caseSensitive = false,\n }: { from: { row: number; column: string }; direction?: 1 | -1; caseSensitive?: boolean },\n signal?: AbortSignal,\n ): Promise<{ row: number; column: string } | null> {\n const view = this.current;\n const table = this.snapshot.table;\n const client = this.client;\n if (!view || !table || !client || !this.opened) throw new GridError(\"not_ready\", \"The table is not open yet.\");\n const columns = this.snapshot.displayed.map((item) => item.column.name);\n const column = Math.max(0, columns.indexOf(from.column));\n const found = await client.request<{ row: number; column: number } | null>(\n \"find\",\n {\n table: table.table,\n revision: view.revision,\n plan: view.plan,\n text,\n columns,\n from: { row: from.row, column },\n direction,\n ...(caseSensitive ? { caseSensitive: true } : {}),\n },\n signal,\n );\n return found ? { row: found.row, column: columns[found.column] } : null;\n }\n\n /** The whole value of a cell of the view on screen, also when the engine cut its text (§8.4), and its type. */\n async fullValue(row: number, column: string, signal?: AbortSignal): Promise<{ value: JsonValue; column: Column }> {\n const view = this.current;\n const table = this.snapshot.table;\n const client = this.client;\n if (!view || !table || !client || !this.opened) throw new GridError(\"not_ready\", \"The table is not open yet.\");\n const result = await client.request<RowsResult>(\n \"rows\",\n {\n table: table.table,\n revision: view.revision,\n plan: view.plan,\n start: row,\n end: row + 1,\n columns: [column],\n textLimit: 1_000_000,\n },\n signal,\n );\n const block = decodeBlock(result.block.bytes);\n return { value: block.rows[0]?.[0] ?? null, column: block.columns[0] };\n }\n\n /** Sends the requests of a command and applies the commands of §6.7 that their answers call for. */\n private async send(name: string, requests: CommandRequest[], table: TableInfo, overwrite = false): Promise<unknown> {\n if (!requests.some((request) => request.op === \"write\")) return this.sendNow(name, requests, table, overwrite);\n let done = () => {};\n const finished = new Promise<void>((resolve) => {\n done = resolve;\n });\n this.writing = this.writing.then(() => finished);\n try {\n return await this.sendNow(name, requests, table, overwrite);\n } finally {\n done();\n }\n }\n\n private async sendNow(name: string, requests: CommandRequest[], table: TableInfo, overwrite: boolean) {\n const client = this.client;\n let output: unknown;\n for (const request of requests) {\n if (!client) throw new GridError(\"not_ready\", \"The grid is not connected.\");\n const { op, ...members } = request;\n const updates = (op === \"write\" ? members.updates : []) as WriteUpdate[];\n const write = op === \"write\" ? ++this.writes : 0;\n if (write) this.markWritten(write, updates);\n // An overwrite checks no `previous`; the history keeps them all the same, as the values the person wrote over.\n const sent = overwrite ? { ...members, updates: updates.map(({ previous: _, ...update }) => update) } : members;\n let result: Record<string, unknown>;\n try {\n result = await client.request<Record<string, unknown>>(op as Operation, { table: table.table, ...sent });\n } catch (error) {\n if (write) {\n this.dropWritten((other) => other === write);\n if (client === this.client) this.failWrite(name, request, asGridError(error));\n }\n throw error;\n }\n if (op === \"write\") {\n const core =\n name === \"history.undo\"\n ? { command: \"history.undone\" as const }\n : name === \"history.redo\"\n ? { command: \"history.redone\" as const }\n : {\n command: \"history.push\" as const,\n updates: updates.map((update) => ({\n key: update.key,\n column: update.column,\n before: update.previous ?? null,\n after: update.value,\n })),\n };\n const state = { document: this.base(\"document\"), session: this.base(\"session\") };\n const view = this.current;\n if (view) {\n const applied = applyCommand(state, core as GridCommand, this.contextFor(view, table));\n this.change(applied.document, applied.session);\n }\n const edits = result.edits as TableInfo[\"edits\"];\n this.writeVersions.set(write, edits.version);\n // The engine's event may have brought the view of this version on screen before the answer came.\n if (this.current && this.current.edits >= edits.version) this.dropWritten((other) => other === write);\n const current = this.snapshot.table;\n if (current) this.publish({ table: { ...current, edits } });\n this.showPlan(this.base(\"document\").plan ?? {});\n } else {\n output = result;\n }\n }\n return output;\n }\n}\n\n/** Makes a store (§4 of react.md). */\nexport function createGridStore(options: GridStoreOptions): GridStore {\n return new GridStore(options);\n}\n"],"mappings":"AAAA,SACEA,YAAY,EAIZC,YAAY,EAGZC,aAAa,EACbC,SAAS,EACTC,WAAW,EACXC,gBAAgB,EAEhBC,aAAa,EACbC,YAAY,EAKZC,OAAO,EAGPC,aAAa,EAGbC,SAAS,EACTC,WAAW,EAEXC,cAAc,QACT,eAAe;AACtB,SAASC,SAAS,QAAQ,YAAY;AACtC,SAASC,UAAU,QAAwB,aAAa;AACxD,SAASC,UAAU,QAAQ,cAAc;AACzC,SAASC,YAAY,QAAQ,eAAe;AAC5C,SAASC,SAAS,EAAEC,WAAW,QAAkC,WAAW;AAC5E,SAASC,YAAY,QAAQ,aAAa;AAC1C,SAASC,GAAG,EAAEC,KAAK,QAAQ,YAAY;AACvC,SAGEC,SAAS,QAQJ,YAAY;;AAEnB;AACA,OAAO,MAAMC,WAAW,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;;AAE3C;AACA,MAAMC,OAAO,GAAG,IAAIC,GAAG,CAAY,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;;AA0B7F;;AAWA,SAASC,WAAWA,CAACC,KAAc,EAAE;EACnC,OAAOA,KAAK,YAAYL,SAAS,IAAIK,KAAK,CAACC,IAAI,KAAK,WAAW;AACjE;AAEA,SAASC,WAAWA,CAACF,KAAc,EAAa;EAC9C,IAAIA,KAAK,YAAYL,SAAS,EAAE,OAAOK,KAAK;EAC5C,IAAIA,KAAK,YAAYjB,SAAS,EAAE;IAC9B,OAAO,IAAIY,SAAS,CAAC,cAAc,EAAEK,KAAK,CAACG,OAAO,EAAE;MAAEC,MAAM,EAAEJ,KAAK,CAACI,MAAM;MAAEC,IAAI,EAAEL,KAAK,CAACK;IAAK,CAAC,CAAC;EACjG;EACA,OAAO,IAAIV,SAAS,CAAC,UAAU,EAAEK,KAAK,YAAYM,KAAK,GAAGN,KAAK,CAACG,OAAO,GAAGI,MAAM,CAACP,KAAK,CAAC,CAAC;AAC1F;AAEA,SAASQ,OAAOA,CAACC,IAAU,EAAU;EACnC,OAAOlC,aAAa,CAACO,aAAa,CAAC2B,IAAI,CAAC,CAAC;AAC3C;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,CAAC;EAEJC,SAAS,GAAG,IAAIb,GAAG,CAAa,CAAC;EACjCc,YAAY,GAAG,IAAId,GAAG,CAAa,CAAC;EACpCe,MAAM,GAA6D;IAClFC,QAAQ,EAAE,IAAIhB,GAAG,CAAC,CAAC;IACnBiB,OAAO,EAAE,IAAIjB,GAAG,CAAC,CAAC;IAClBE,KAAK,EAAE,IAAIF,GAAG,CAAC;EACjB,CAAC;EACgBkB,UAAU,GAAG;IAAEF,QAAQ,EAAE,KAAK;IAAEC,OAAO,EAAE;EAAM,CAAC;EACjE;EACiBE,QAAQ,GAAuD,CAAC,CAAC;EAC1EC,MAAM,GAAsB,IAAI;EACxC;EACQC,UAAU,GAAG,CAAC;EACtB;EACQC,MAAM,GAAG,KAAK;EACdC,OAAO,GAAgB,IAAI;EAC3BC,IAAI,GAAgB,IAAI;EAEhC;AACF;AACA;AACA;AACA;EACmBC,OAAO,GAAG,IAAIC,GAAG,CAA2D,CAAC;EACtFC,MAAM,GAAG,CAAC;EAClB;EACiBC,aAAa,GAAG,IAAIF,GAAG,CAAiB,CAAC;EAC1D;EACQG,OAAO,GAAkBC,OAAO,CAACC,OAAO,CAAC,CAAC;EACjCC,MAAM,GAAG,IAAItC,YAAY,CACxC,CAACiB,IAAI,EAAEsB,QAAQ,EAAEC,MAAM,KAAK,IAAI,CAACC,OAAO,CAACxB,IAAI,EAAEsB,QAAQ,EAAEC,MAAM,CAAC,EAC/DF,MAAM,IAAK,IAAI,CAACI,OAAO,CAAC;IAAEJ;EAAO,CAAC,CAAC,EACnC9B,KAAK,IAAK,IAAI,CAACmC,UAAU,CAACnC,KAAK,CAClC,CAAC;EACOoC,WAAW,GAAG,CAAC;EAEvBC,WAAWA,CAAkBC,OAAyB,EAAE;IAAA,KAA3BA,OAAyB,GAAzBA,OAAyB;IACpD,IAAI,CAACC,MAAM,GAAG,IAAIjD,SAAS,CACzB;MACE+B,OAAO,EAAEA,CAAA,KAAM,IAAI,CAACA,OAAO;MAC3BC,IAAI,EAAEA,CAAA,KAAM,IAAI,CAACA,IAAI;MACrBJ,MAAM,EAAEA,CAAA,KAAM,IAAI,CAACA,MAAM;MACzBsB,KAAK,EAAEA,CAAA,KAAM,IAAI,CAACC,QAAQ,CAACD,KAAK;MAChCpB,MAAM,EAAEA,CAAA,KAAM,IAAI,CAACA,MAAM;MACzBsB,MAAM,EAAEA,CAAA,KAAM,IAAI,CAACC,IAAI,CAAC,UAAU,CAAC,CAACD,MAAM;MAC1CE,KAAK,EAAEA,CAAA,KAAMC,OAAO,CAAC,IAAI,CAACF,IAAI,CAAC,SAAS,CAAC,CAACG,MAAM,EAAEC,GAAG,CAAC;MACtDC,QAAQ,EAAGC,IAAI,IAAK,IAAI,CAACf,OAAO,CAAC;QAAEgB,IAAI,EAAED;MAAK,CAAC,CAAC;MAChDE,QAAQ,EAAEA,CAAA,KAAM,IAAI,CAACC,QAAQ,CAAC,CAAC;MAC/BC,IAAI,EAAGrD,KAAK,IAAK,IAAI,CAACmC,UAAU,CAACnC,KAAK;IACxC,CAAC,EACDsC,OAAO,CAACgB,UAAU,IAAI1D,WACxB,CAAC;IACD,IAAI,CAAC6C,QAAQ,GAAG;MACd3B,QAAQ,EAAEwB,OAAO,CAACxB,QAAQ,IAAInC,aAAa,CAAC,CAAC;MAC7CoC,OAAO,EAAEuB,OAAO,CAACvB,OAAO,IAAInC,YAAY,CAAC,CAAC;MAC1C4D,KAAK,EAAE,IAAI;MACXU,IAAI,EAAE,IAAI;MACVK,SAAS,EAAE,EAAE;MACbC,OAAO,EAAE,IAAI;MACbC,MAAM,EAAE,MAAM;MACdzD,KAAK,EAAE,IAAI;MACX0D,WAAW,EAAE,IAAI;MACjB5B,MAAM,EAAE;IACV,CAAC;IACD,IAAIQ,OAAO,CAACqB,OAAO,EAAE,IAAI,CAACC,IAAI,CAACtB,OAAO,CAACqB,OAAO,CAAC;EACjD;;EAEA;;EAEAE,WAAW,GAAGA,CAAA,KAAoB,IAAI,CAACpB,QAAQ;EAE/CqB,SAAS,GAAIC,QAAoB,IAAmB;IAClD,IAAI,CAACpD,SAAS,CAACqD,GAAG,CAACD,QAAQ,CAAC;IAC5B,OAAO,MAAM;MACX,IAAI,CAACpD,SAAS,CAACsD,MAAM,CAACF,QAAQ,CAAC;IACjC,CAAC;EACH,CAAC;;EAED;EACAG,EAAEA,CAAyBC,KAAQ,EAAEJ,QAAoC,EAAc;IACrF,MAAMK,GAAG,GAAG,IAAI,CAACvD,MAAM,CAACsD,KAAK,CAAoC;IACjEC,GAAG,CAACJ,GAAG,CAACD,QAAQ,CAAC;IACjB,OAAO,MAAM;MACXK,GAAG,CAACH,MAAM,CAACF,QAAQ,CAAC;IACtB,CAAC;EACH;EAEQM,IAAIA,CAAyBF,KAAQ,EAAEG,KAAgB,EAAE;IAC/D,KAAK,MAAMP,QAAQ,IAAI,IAAI,CAAClD,MAAM,CAACsD,KAAK,CAAC,EAAqCJ,QAAQ,CAACO,KAAK,CAAC;EAC/F;EAEQpC,OAAOA,CAACqC,OAA0E,EAAE;IAC1F,MAAMC,QAAQ,GAAG,IAAI,CAAC/B,QAAQ;IAC9B,MAAMnB,IAAI,GAAG;MAAE,GAAGkD,QAAQ;MAAE,GAAGD;IAAQ,CAAC;IACxC,IAAIjD,IAAI,CAAC4B,IAAI,IAAIsB,QAAQ,CAACtB,IAAI,IAAI3D,WAAW,CAAC+B,IAAI,CAAC4B,IAAI,CAACuB,OAAO,EAAED,QAAQ,CAACtB,IAAI,CAACuB,OAAO,CAAC,EAAE;MACvF;MACA,IAAInD,IAAI,CAAC4B,IAAI,CAACuB,OAAO,KAAKD,QAAQ,CAACtB,IAAI,CAACuB,OAAO,EAAEnD,IAAI,CAAC4B,IAAI,GAAG;QAAE,GAAG5B,IAAI,CAAC4B,IAAI;QAAEuB,OAAO,EAAED,QAAQ,CAACtB,IAAI,CAACuB;MAAQ,CAAC;IAC/G;IACA,MAAMC,IAAI,GAAGpD,IAAI,CAACR,QAAQ,CAAC2D,OAAO,KAAKD,QAAQ,CAAC1D,QAAQ,CAAC2D,OAAO,IAAInD,IAAI,CAAC4B,IAAI,EAAEuB,OAAO,KAAKD,QAAQ,CAACtB,IAAI,EAAEuB,OAAO;IACjHnD,IAAI,CAACiC,SAAS,GAAGmB,IAAI,GAAGF,QAAQ,CAACjB,SAAS,GAAG,IAAI,CAACoB,WAAW,CAACrD,IAAI,CAAC;IACnE,IAAI,CAACmB,QAAQ,GAAGnB,IAAI;IACpB,KAAK,MAAMyC,QAAQ,IAAI,IAAI,CAACpD,SAAS,EAAEoD,QAAQ,CAAC,CAAC;IACjD;IACA,IAAI,IAAI,CAAC3C,MAAM,EAAE,IAAI,CAACU,MAAM,CAAC8C,MAAM,CAAC,IAAI,CAACvD,OAAO,EAAE,IAAI,CAACoB,QAAQ,CAAC;EAClE;;EAEA;EACA,MAAcR,OAAOA,CAACxB,IAAU,EAAEsB,QAAuB,EAAEC,MAAoB,EAAE;IAC/E,MAAMQ,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,MAAMtB,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,IAAI,CAACsB,KAAK,IAAI,CAACtB,MAAM,IAAI,CAAC,IAAI,CAACE,MAAM,EAAE,MAAM,IAAIzB,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;IACrG,MAAMkF,KAAK,GAAGpE,IAAI,CAACqE,SAAS,EAAEC,QAAQ,CAACC,GAAG,CAAE/C,OAAO,IAAKA,OAAO,CAACgD,IAAI,CAAC,IAAI,EAAE;IAC3E,MAAMC,MAAM,GAAG,MAAMhE,MAAM,CAACiE,OAAO,CACjC,MAAM,EACN;MAAE3C,KAAK,EAAEA,KAAK,CAACA,KAAK;MAAET,QAAQ;MAAEtB,IAAI;MAAE2E,KAAK,EAAE,CAAC;MAAEC,GAAG,EAAE,CAAC;MAAEZ,OAAO,EAAEI;IAAM,CAAC,EACxE7C,MACF,CAAC;IACD,MAAMsD,KAAK,GAAG7G,WAAW,CAACyG,MAAM,CAACI,KAAK,CAACC,KAAK,CAAC;IAC7C,MAAMC,MAAiC,GAAG,CAAC,CAAC;IAC5C,MAAMf,OAA+B,GAAG,CAAC,CAAC;IAC1Ca,KAAK,CAACb,OAAO,CAACgB,OAAO,CAAC,CAACC,MAAM,EAAEC,KAAK,KAAK;MACvCH,MAAM,CAACE,MAAM,CAACT,IAAI,CAAC,GAAGK,KAAK,CAACM,IAAI,CAAC,CAAC,CAAC,GAAGD,KAAK,CAAC,IAAI,IAAI;MACpDlB,OAAO,CAACiB,MAAM,CAACT,IAAI,CAAC,GAAGS,MAAM;IAC/B,CAAC,CAAC;IACF,OAAO;MAAEF,MAAM;MAAEf;IAAQ,CAAC;EAC5B;;EAEA;AACF;AACA;AACA;EACE,MAAMK,SAASA,CACbC,QAAmB,EACnB/C,MAAoB,EAC6D;IACjF,MAAMvB,IAAI,GAAGpB,YAAY,CAAC,IAAI,CAACsD,IAAI,CAAC,UAAU,CAAC,CAAClC,IAAI,IAAI,CAAC,CAAC,EAAEsE,QAAQ,CAAC;IACrE,IAAI,CAACtE,IAAI,EAAE,MAAM,IAAId,SAAS,CAAC,cAAc,EAAE,8CAA8C,CAAC;IAC9F,OAAO,IAAI,CAACsC,OAAO,CAACxB,IAAI,EAAE,IAAI,CAACY,OAAO,EAAEU,QAAQ,IAAI,IAAI,CAACU,QAAQ,CAACD,KAAK,EAAET,QAAQ,IAAI,IAAI,EAAEC,MAAM,CAAC;EACpG;EAEQ2C,WAAWA,CAAClC,QAAsB,EAAE;IAC1C,OAAOA,QAAQ,CAACS,IAAI,GAAGxE,gBAAgB,CAAC+D,QAAQ,CAAC3B,QAAQ,EAAE2B,QAAQ,CAACS,IAAI,CAACuB,OAAO,CAAC,GAAG,EAAE;EACxF;;EAEA;EACQ9B,IAAIA,CAAiBkD,IAAO,EAAmB;IACrD,OAAQ,IAAI,CAAC5E,QAAQ,CAAC4E,IAAI,CAAC,IAAI,IAAI,CAACpD,QAAQ,CAACoD,IAAI,CAAC;EACpD;;EAEA;;EAEA;EACAC,IAAIA,CAACC,GAAW,EAAEL,MAAc,EAAyB;IACvD,MAAMxC,IAAI,GAAG,IAAI,CAAC7B,OAAO;IACzB,MAAMiD,KAAK,GAAGpB,IAAI,EAAE8C,KAAK,CAAC1B,KAAK,CAACyB,GAAG,EAAEL,MAAM,CAAC;IAC5C,IAAI,CAACxC,IAAI,IAAI,IAAI,CAAC3B,OAAO,CAAC0E,IAAI,KAAK,CAAC,EAAE,OAAO3B,KAAK;IAClD,MAAMvB,GAAG,GAAGG,IAAI,CAAC8C,KAAK,CAACE,MAAM,CAACH,GAAG,EAAE,IAAI,CAACpD,IAAI,CAAC,UAAU,CAAC,CAACD,MAAM,CAAC,EAAEK,GAAG;IACrE,MAAMoD,KAAK,GAAGpD,GAAG,KAAKqD,SAAS,GAAGA,SAAS,GAAG,IAAI,CAAC7E,OAAO,CAAC8E,GAAG,CAACxH,OAAO,CAACkE,GAAG,CAAC,CAAC,EAAEsD,GAAG,CAACX,MAAM,CAAC;IACzF,OAAOS,KAAK,KAAKC,SAAS,GAAG9B,KAAK,GAAG6B,KAAK,CAAC7B,KAAK;EAClD;;EAEA;EACAgC,KAAKA,CAACP,GAAW,EAAEL,MAAc,EAAE;IACjC,OAAO,IAAI,CAACrE,OAAO,EAAE2E,KAAK,CAACM,KAAK,CAACP,GAAG,EAAEL,MAAM,CAAC,IAAI,KAAK;EACxD;;EAEA;EACAhD,MAAMA,CAACqD,GAAW,EAAsB;IACtC,OAAO,IAAI,CAAC1E,OAAO,EAAE2E,KAAK,CAACE,MAAM,CAACH,GAAG,EAAE,IAAI,CAACpD,IAAI,CAAC,UAAU,CAAC,CAACD,MAAM,CAAC,EAAEK,GAAG;EAC3E;;EAEA;EACAwD,KAAKA,CAACR,GAAW,EAAE;IACjB,OAAO,IAAI,CAAC1E,OAAO,EAAE2E,KAAK,CAACO,KAAK,CAACR,GAAG,CAAC;EACvC;;EAEA;EACAS,cAAc,GAAGA,CAAA,KAAc,IAAI,CAACpE,WAAW;;EAE/C;EACAqE,aAAa,GAAI1C,QAAoB,IAAmB;IACtD,IAAI,CAACnD,YAAY,CAACoD,GAAG,CAACD,QAAQ,CAAC;IAC/B,OAAO,MAAM;MACX,IAAI,CAACnD,YAAY,CAACqD,MAAM,CAACF,QAAQ,CAAC;IACpC,CAAC;EACH,CAAC;EAEOX,QAAQA,CAAA,EAAG;IACjB,IAAI,CAAChB,WAAW,EAAE;IAClB,KAAK,MAAM2B,QAAQ,IAAI,IAAI,CAACnD,YAAY,EAAEmD,QAAQ,CAAC,CAAC;EACtD;;EAEA;EACA2C,WAAWA,CAACC,QAAkB,EAAE;IAC9B,IAAI,CAACpE,MAAM,CAACmE,WAAW,CAACC,QAAQ,CAAC;EACnC;;EAEA;EACAC,MAAMA,CAACxB,KAAa,EAAEC,GAAW,EAAEZ,OAA0B,EAAE;IAC7D,IAAI,CAAClC,MAAM,CAACqE,MAAM,CAACxB,KAAK,EAAEC,GAAG,EAAEZ,OAAO,CAAC;EACzC;;EAEA;;EAEA;AACF;AACA;AACA;EACEoC,OAAOA,CAAA,EAAe;IACpB,MAAM1F,UAAU,GAAG,EAAE,IAAI,CAACA,UAAU;IACpC,MAAMD,MAAM,GAAG,IAAI/B,UAAU,CAAC,IAAI,CAACmD,OAAO,CAACwE,SAAS,CAAC;IACrD,IAAI,CAAC5F,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,MAAM,GAAG,KAAK;IACnB,IAAI2F,SAAS,GAAG,IAAI;IACpB;IACA;IACA,IAAIC,aAA+C,GAAG,EAAE;IACxD,MAAMC,UAAU,GAAG/F,MAAM,CAAC4C,SAAS,CAAEK,KAAK,IAAK;MAC7C,IAAI,CAAC4C,SAAS,IAAI5F,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE;MAClD,IAAI6F,aAAa,EAAEA,aAAa,CAACE,IAAI,CAAC/C,KAAK,CAAC,CAAC,KACxC,IAAI,CAACgD,OAAO,CAAChD,KAAK,EAAEhD,UAAU,CAAC;IACtC,CAAC,CAAC;IACF,IAAI,IAAI,CAACsB,QAAQ,CAACgB,MAAM,KAAK,MAAM,IAAI,IAAI,CAAChB,QAAQ,CAACgB,MAAM,KAAK,OAAO,EAAE,IAAI,CAACvB,OAAO,CAAC;MAAEuB,MAAM,EAAE;IAAU,CAAC,CAAC;IAC5G,IAAI2D,OAAsB,GAAG,IAAI;IACjC,MAAMC,KAAK,GAAIC,EAAU,IAAK,KAAKpG,MAAM,CAACiE,OAAO,CAAC,OAAO,EAAE;MAAE3C,KAAK,EAAE8E;IAAG,CAAC,CAAC,CAACC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,YAAY;MAChB,IAAI;QACF;QACA,MAAMtE,IAAI,GAAG,MAAM/B,MAAM,CAACiE,OAAO,CAAY,MAAM,EAAE;UACnDqC,GAAG,EAAE,IAAI,CAAClF,OAAO,CAACE,KAAK;UACvB,IAAI,IAAI,CAACF,OAAO,CAACmF,IAAI,GAAG;YAAEC,IAAI,EAAE,IAAI,CAACpF,OAAO,CAACmF;UAAK,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC,CAAC;QACF,IAAI,CAACV,SAAS,EAAE;UACdM,KAAK,CAACpE,IAAI,CAACT,KAAK,CAAC;UACjB;QACF;QACA4E,OAAO,GAAGnE,IAAI,CAACT,KAAK;QACpB,IAAI,CAACpB,MAAM,GAAG,IAAI;QAClB,IAAI,CAACuG,OAAO,CAAC1E,IAAI,CAAC;QAClB,MAAMpC,MAAM,GAAGmG,aAAa;QAC5BA,aAAa,GAAG,IAAI;QACpB,KAAK,MAAM7C,KAAK,IAAItD,MAAM,IAAI,EAAE,EAAE,IAAI,CAACsG,OAAO,CAAChD,KAAK,EAAEhD,UAAU,CAAC;MACnE,CAAC,CAAC,OAAOnB,KAAK,EAAE;QACdgH,aAAa,GAAG,IAAI;QACpB,IAAID,SAAS,IAAI,CAAChH,WAAW,CAACC,KAAK,CAAC,EAAE;UACpC,IAAI,CAACkC,OAAO,CAAC;YAAEuB,MAAM,EAAE;UAAQ,CAAC,CAAC;UACjC,IAAI,CAACJ,IAAI,CAACnD,WAAW,CAACF,KAAK,CAAC,CAAC;QAC/B;MACF;IACF,CAAC,EAAE,CAAC;IACJ,OAAO,MAAM;MACX,IAAI,CAAC+G,SAAS,EAAE;MAChBA,SAAS,GAAG,KAAK;MACjBC,aAAa,GAAG,IAAI;MACpBC,UAAU,CAAC,CAAC;MACZ,IAAIG,OAAO,KAAK,IAAI,EAAEC,KAAK,CAACD,OAAO,CAAC;MACpC,IAAIjG,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE;MACpC,IAAI,CAACA,UAAU,EAAE;MACjB,IAAI,CAACC,MAAM,GAAG,KAAK;MACnB,IAAI,CAACC,OAAO,EAAEuG,KAAK,CAACA,KAAK,CAAC,CAAC;MAC3B,IAAI,CAACtG,IAAI,EAAEsG,KAAK,CAACA,KAAK,CAAC,CAAC;MACxB,IAAI,CAACtG,IAAI,GAAG,IAAI;MAChB,IAAI,CAACQ,MAAM,CAAC+F,KAAK,CAAC,CAAC;MACnB,IAAI,IAAI,CAACxG,OAAO,EAAE,IAAI,CAACA,OAAO,GAAG;QAAE,GAAG,IAAI,CAACA,OAAO;QAAEuG,KAAK,EAAE,IAAIE,eAAe,CAAC;MAAE,CAAC;MAClF,IAAI,CAAC5G,MAAM,GAAG,IAAI;IACpB,CAAC;EACH;;EAEA;EACQyG,OAAOA,CAAC1E,IAAe,EAAE;IAC/B,MAAMnC,QAAQ,GAAG,IAAI,CAAC6B,IAAI,CAAC,UAAU,CAAC;IACtC,MAAMoF,QAAQ,GAAG9I,cAAc,CAAC6B,QAAQ,EAAEmC,IAAI,CAACwB,OAAO,EAAEzF,WAAW,CAACiE,IAAI,CAAC+E,YAAY,CAAC,CAAC;IACvF,MAAMC,MAAM,GAAG,IAAI,CAAC5G,OAAO;IAC3B;IACA,IAAI4G,MAAM,KAAKA,MAAM,CAAClG,QAAQ,KAAKkB,IAAI,CAAClB,QAAQ,IAAIkG,MAAM,CAACC,KAAK,KAAKjF,IAAI,CAACiF,KAAK,CAACC,OAAO,CAAC,EAAE,IAAI,CAAC9G,OAAO,GAAG,IAAI,CAAC,KACzG,IAAI4G,MAAM,EAAE,IAAI,CAAC5G,OAAO,GAAG;MAAE,GAAG4G,MAAM;MAAEL,KAAK,EAAE,IAAIE,eAAe,CAAC;IAAE,CAAC;IAC3E,IAAI,CAAC5F,OAAO,CAAC;MAAEM,KAAK,EAAES,IAAI;MAAEQ,MAAM,EAAER,IAAI,CAACQ,MAAM,KAAK,OAAO,GAAG,OAAO,GAAG;IAAQ,CAAC,CAAC;IAClF,IAAIsE,QAAQ,CAACK,OAAO,CAACC,MAAM,GAAG,CAAC,EAAE,IAAI,CAACC,MAAM,CAACP,QAAQ,CAACjH,QAAQ,EAAE,IAAI,CAAC6B,IAAI,CAAC,SAAS,CAAC,CAAC;IACrF,IAAI,CAAC4F,QAAQ,CAAC,IAAI,CAAC5F,IAAI,CAAC,UAAU,CAAC,CAAClC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC8B,MAAM,CAACiG,QAAQ,CAAC,CAAC;EACxB;EAEQrB,OAAOA,CAAChD,KAA8B,EAAEhD,UAAkB,EAAE;IAClE,IAAIA,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE;IACpC,MAAMqB,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,IAAI,CAACA,KAAK,IAAI2B,KAAK,CAAC3B,KAAK,KAAKA,KAAK,CAACA,KAAK,EAAE;IAC3C,IAAI2B,KAAK,CAACA,KAAK,KAAK,SAAS,EAAE;MAC7B,MAAMpC,QAAQ,GAAGoC,KAAK,CAACpC,QAAyB;MAChD,MAAMmG,KAAK,GAAG/D,KAAK,CAAC+D,KAA2B;MAC/C,MAAMO,WAAW,GAAGtE,KAAK,CAACsE,WAAW,KAAK,IAAI;MAC9C,IAAI1G,QAAQ,KAAKS,KAAK,CAACT,QAAQ,EAAE;QAC/B,IAAImG,KAAK,CAACC,OAAO,KAAK3F,KAAK,CAAC0F,KAAK,CAACC,OAAO,IAAIM,WAAW,MAAMjG,KAAK,CAACiG,WAAW,KAAK,IAAI,CAAC,EAAE;QAC3F,MAAM;UAAEA,WAAW,EAAEC,CAAC;UAAE,GAAGC;QAAK,CAAC,GAAGnG,KAAK;QACzC,IAAI,CAACN,OAAO,CAAC;UAAEM,KAAK,EAAEiG,WAAW,GAAG;YAAE,GAAGE,IAAI;YAAET,KAAK;YAAEO;UAAY,CAAC,GAAG;YAAE,GAAGE,IAAI;YAAET;UAAM;QAAE,CAAC,CAAC;QAC3F,IAAI,CAACK,QAAQ,CAAC,IAAI,CAAC5F,IAAI,CAAC,UAAU,CAAC,CAAClC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC/C;MACF;MACA;MACA,MAAMS,MAAM,GAAG,IAAI,CAACA,MAAM;MAC1B,KAAKA,MAAM,EACPiE,OAAO,CAAY,MAAM,EAAE;QAAE3C,KAAK,EAAEA,KAAK,CAACA;MAAM,CAAC,CAAC,CACnDoG,IAAI,CAAE3F,IAAI,IAAK;QACd,IAAI9B,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE,IAAI,CAAC0H,KAAK,CAAC5F,IAAI,CAAC;MACtD,CAAC,CAAC,CACDsE,KAAK,CAAEvH,KAAc,IAAK;QACzB,IAAImB,UAAU,KAAK,IAAI,CAACA,UAAU,IAAI,CAACpB,WAAW,CAACC,KAAK,CAAC,EAAE,IAAI,CAACqD,IAAI,CAACnD,WAAW,CAACF,KAAK,CAAC,CAAC;MAC1F,CAAC,CAAC;IACN,CAAC,MAAM,IAAImE,KAAK,CAACA,KAAK,KAAK,UAAU,EAAE;MACrC,IAAI,CAACjC,OAAO,CAAC;QACXM,KAAK,EAAE;UACL,GAAGA,KAAK;UACRiB,MAAM,EAAEU,KAAK,CAACV,MAA6B;UAC3CqF,QAAQ,EAAE3E,KAAK,CAAC2E,QAAyB;UACzCC,YAAY,EAAE5E,KAAK,CAAC4E,YAAsB;UAC1CC,QAAQ,EAAE7E,KAAK,CAAC6E;QAClB;MACF,CAAC,CAAC;MACF,IAAI7E,KAAK,CAACV,MAAM,KAAK,OAAO,EAAE,IAAI,CAAC8E,QAAQ,CAAC,IAAI,CAAC5F,IAAI,CAAC,UAAU,CAAC,CAAClC,IAAI,IAAI,CAAC,CAAC,CAAC;MAC7E;MACA,MAAMyC,IAAI,GAAG,IAAI,CAAC7B,OAAO;MACzB,IAAI8C,KAAK,CAACV,MAAM,KAAK,OAAO,IAAIP,IAAI,EAAED,IAAI,IAAIC,IAAI,CAACD,IAAI,CAACQ,MAAM,KAAK,OAAO,EAAE;QAC1E,MAAMgB,OAAO,GAAG,IAAI,CAAClC,MAAM,CAAC0G,UAAU,CAAC/F,IAAI,EAAE,IAAI,CAACX,MAAM,CAACoE,QAAQ,CAAClC,OAAO,CAAC;QAC1E,KAAK,IAAI,CAAClC,MAAM,CAACmF,IAAI,CAACxE,IAAI,EAAE,IAAI,CAACX,MAAM,CAAC2G,MAAM,CAAC,IAAI,CAAC3G,MAAM,CAACoE,QAAQ,CAACwC,GAAG,EAAE,IAAI,EAAE1E,OAAO,CAAC,CAAC,CAACmE,IAAI,CAC3F,MAAM,IAAI,CAACrG,MAAM,CAACiG,QAAQ,CAAC,CAAC,EAC5B,MAAM,CAAC,CACT,CAAC;MACH;IACF,CAAC,MAAM,IAAIrE,KAAK,CAACA,KAAK,KAAK,MAAM,EAAE;MACjC,MAAMjB,IAAI,GAAG,CAAC,IAAI,CAAC5B,IAAI,EAAE,IAAI,CAACD,OAAO,CAAC,CAAC+H,IAAI,CACxCC,IAAI,IAAKA,IAAI,EAAEpG,IAAI,EAAEqG,IAAI,KAAKnF,KAAK,CAACmF,IAAI,IAAID,IAAI,EAAEtH,QAAQ,KAAKS,KAAK,CAACT,QACxE,CAAC;MACD,IAAImB,IAAI,EAAED,IAAI,EAAE;QACdC,IAAI,CAACD,IAAI,GAAG;UACV,GAAGC,IAAI,CAACD,IAAI;UACZQ,MAAM,EAAEU,KAAK,CAACV,MAA4B;UAC1CsF,YAAY,EAAE5E,KAAK,CAAC4E,YAAsB;UAC1CC,QAAQ,EAAE7E,KAAK,CAAC6E,QAAkB;UAClCO,aAAa,EAAEpF,KAAK,CAACoF;QACvB,CAAC;QACD,IAAIrG,IAAI,KAAK,IAAI,CAAC7B,OAAO,EAAE,IAAI,CAACa,OAAO,CAAC;UAAEgB,IAAI,EAAEA,IAAI,CAACD;QAAK,CAAC,CAAC;QAC5D,IAAI,CAACV,MAAM,CAACiG,QAAQ,CAAC,CAAC;MACxB;IACF;EACF;EAEQnF,IAAIA,CAACrD,KAAgB,EAAE;IAC7B,IAAI,CAACkC,OAAO,CAAC;MAAElC;IAAM,CAAC,CAAC;IACvB,IAAI,CAACqE,IAAI,CAAC,OAAO,EAAErE,KAAK,CAAC;EAC3B;;EAEA;EACQmC,UAAUA,CAACnC,KAAc,EAAE;IACjC,IAAI,CAACD,WAAW,CAACC,KAAK,CAAC,EAAE,IAAI,CAACqD,IAAI,CAACnD,WAAW,CAACF,KAAK,CAAC,CAAC;EACxD;;EAEA;EACQ4D,IAAIA,CAACD,OAAoB,EAAE;IACjC,MAAM;MAAEnB,KAAK;MAAE/B,IAAI;MAAEmF;IAAK,CAAC,GAAGjC,OAAO;IACrC,IAAInD,OAAO,CAACC,IAAI,CAAC,KAAKD,OAAO,CAAC,IAAI,CAACiC,QAAQ,CAAC3B,QAAQ,CAACL,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE;IAClE,IAAI;MACF,MAAMyC,IAAU,GAAG;QACjBH,GAAG,EAAEvC,OAAO,CAACC,IAAI,CAAC;QAClBA,IAAI;QACJ+I,OAAO,EAAEhL,SAAS,CAACiC,IAAI,EAAE+B,KAAK,CAACiC,OAAO,EAAEzF,WAAW,CAACwD,KAAK,CAACwF,YAAY,CAAC,CAAC;QACxEjG,QAAQ,EAAES,KAAK,CAACT,QAAQ;QACxBmG,KAAK,EAAEtC,IAAI,CAAC1C,IAAI,CAACgF,KAAK,CAACC,OAAO;QAC9BlF,IAAI,EAAE2C,IAAI,CAAC1C,IAAI;QACf8C,KAAK,EAAE,IAAI9G,SAAS,CAAC,CAAC;QACtB0I,KAAK,EAAE,IAAIE,eAAe,CAAC;MAC7B,CAAC;MACD,MAAMxC,KAAK,GAAG7G,WAAW,CAACmH,IAAI,CAACN,KAAK,CAACC,KAAK,CAAC;MAC3CrC,IAAI,CAAC8C,KAAK,CAACyD,OAAO,CAChB7D,IAAI,CAACR,KAAK,EACVQ,IAAI,CAAC8D,MAAM,EACXpE,KAAK,CAACb,OAAO,CAACO,GAAG,CAAEU,MAAM,IAAKA,MAAM,CAACT,IAAI,CAAC,EAC1CK,KAAK,CAACM,IAAI,EACVA,IAAI,CAAC+D,SACP,CAAC;MACD,IAAI,CAACtI,OAAO,GAAG6B,IAAI;MACnB,IAAI,CAACT,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAED,KAAK;QAAEU,IAAI,EAAE0C,IAAI,CAAC1C;MAAK,CAAC;MAC5D,IAAI,CAACT,QAAQ,GAAG;QAAE,GAAG,IAAI,CAACA,QAAQ;QAAEc,SAAS,EAAE,IAAI,CAACoB,WAAW,CAAC,IAAI,CAAClC,QAAQ;MAAE,CAAC;IAClF,CAAC,CAAC,OAAOzC,KAAK,EAAE;MACd,IAAI,EAAEA,KAAK,YAAYjB,SAAS,CAAC,EAAE,MAAMiB,KAAK;IAChD;EACF;;EAEA;;EAEA;AACF;AACA;AACA;EACUuI,QAAQA,CAAC9H,IAAU,EAAE;IAC3B,MAAM+B,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,IAAI,CAACA,KAAK,IAAI,CAAC,IAAI,CAACtB,MAAM,IAAI,CAAC,IAAI,CAACE,MAAM,EAAE;IAC5C,MAAM2B,GAAG,GAAGvC,OAAO,CAACC,IAAI,CAAC;IACzB,IAAI+B,KAAK,CAACiB,MAAM,KAAK,SAAS,IAAI,CAACjB,KAAK,CAACwF,YAAY,CAAC4B,YAAY,IAAI7G,GAAG,KAAKvC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;MACzF,IAAI,CAACc,IAAI,EAAEsG,KAAK,CAACA,KAAK,CAAC,CAAC;MACxB,IAAI,CAACtG,IAAI,GAAG,IAAI;MAChB,IAAI,CAACY,OAAO,CAAC;QAAEsB,OAAO,EAAE;UAAE/C;QAAK;MAAE,CAAC,CAAC;MACnC;IACF;IACA,MAAMoJ,KAAK,GAAI3G,IAAiB,IAC9BA,IAAI,KAAK,IAAI,IACb,CAACA,IAAI,CAAC0E,KAAK,CAAC5F,MAAM,CAAC8H,OAAO,IAC1B5G,IAAI,CAACH,GAAG,KAAKA,GAAG,IAChBG,IAAI,CAACnB,QAAQ,KAAKS,KAAK,CAACT,QAAQ,IAChCmB,IAAI,CAACgF,KAAK,KAAK1F,KAAK,CAAC0F,KAAK,CAACC,OAAO;IACpC,IAAI,IAAI,CAAC7G,IAAI,IAAI,CAACuI,KAAK,CAAC,IAAI,CAACvI,IAAI,CAAC,EAAE;MAClC,IAAI,CAACA,IAAI,CAACsG,KAAK,CAACA,KAAK,CAAC,CAAC;MACvB,IAAI,CAACtG,IAAI,GAAG,IAAI;IAClB;IACA,IAAIuI,KAAK,CAAC,IAAI,CAACxI,OAAO,CAAC,EAAE;MACvB,IAAI,IAAI,CAACoB,QAAQ,CAACe,OAAO,EAAE,IAAI,CAACtB,OAAO,CAAC;QAAEsB,OAAO,EAAE;MAAK,CAAC,CAAC;MAC1D;IACF;IACA,IAAI,IAAI,CAAClC,IAAI,EAAE;IACf,IAAI,IAAI,CAACD,OAAO,EAAE4B,IAAI,EAAEQ,MAAM,KAAK,UAAU,EAAE,IAAI,CAACpC,OAAO,CAACuG,KAAK,CAACA,KAAK,CAAC,CAAC;IACzE,IAAI4B,OAAoB;IACxB,IAAI;MACFA,OAAO,GAAGhL,SAAS,CAACiC,IAAI,EAAE+B,KAAK,CAACiC,OAAO,EAAEzF,WAAW,CAACwD,KAAK,CAACwF,YAAY,CAAC,CAAC;IAC3E,CAAC,CAAC,OAAOhI,KAAK,EAAE;MACd,IAAI,EAAEA,KAAK,YAAYjB,SAAS,CAAC,EAAE,MAAMiB,KAAK;MAC9C,IAAI,IAAI,CAACyC,QAAQ,CAACe,OAAO,EAAE,IAAI,CAACtB,OAAO,CAAC;QAAEsB,OAAO,EAAE;MAAK,CAAC,CAAC;MAC1D,IAAI,CAACH,IAAI,CAACnD,WAAW,CAACF,KAAK,CAAC,CAAC;MAC7B;IACF;IACA,MAAMkD,IAAU,GAAG;MACjBH,GAAG;MACHtC,IAAI;MACJ+I,OAAO;MACPzH,QAAQ,EAAES,KAAK,CAACT,QAAQ;MACxBmG,KAAK,EAAE1F,KAAK,CAAC0F,KAAK,CAACC,OAAO;MAC1BlF,IAAI,EAAE,IAAI;MACV+C,KAAK,EAAE,IAAI9G,SAAS,CAAC,CAAC;MACtB0I,KAAK,EAAE,IAAIE,eAAe,CAAC;IAC7B,CAAC;IACD,IAAI,CAACxG,IAAI,GAAG4B,IAAI;IAChB,IAAI,IAAI,CAAC7B,OAAO,EAAE,IAAI,CAACa,OAAO,CAAC;MAAEsB,OAAO,EAAE;QAAE/C;MAAK;IAAE,CAAC,CAAC;IACrD,KAAK,IAAI,CAACsJ,OAAO,CAAC7G,IAAI,EAAE,IAAI,CAAC/B,UAAU,CAAC;EAC1C;EAEQ6I,IAAIA,CAAC9G,IAAU,EAAE/B,UAAkB,EAAE;IAC3C,OAAOA,UAAU,KAAK,IAAI,CAACA,UAAU,IAAI+B,IAAI,KAAK,IAAI,CAAC5B,IAAI;EAC7D;EAEA,MAAcyI,OAAOA,CAAC7G,IAAU,EAAE/B,UAAkB,EAAE;IACpD,MAAMqB,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAkB;IAC9C,MAAMtB,MAAM,GAAG,IAAI,CAACA,MAAoB;IACxC,MAAMuD,OAAO,GAAG,IAAI,CAAClC,MAAM,CAAC0G,UAAU,CAAC/F,IAAI,EAAE,IAAI,CAACX,MAAM,CAACoE,QAAQ,CAAClC,OAAO,CAAC;IAC1E,IAAI;MACF,MAAM0E,GAAG,GAAG,IAAI,CAAC9H,OAAO,GAAG,IAAI,CAACkB,MAAM,CAACoE,QAAQ,CAACwC,GAAG,GAAI,IAAI,CAACxG,IAAI,CAAC,SAAS,CAAC,CAACsH,MAAM,EAAElE,GAAG,IAAI,CAAE;MAC7F,MAAM,IAAI,CAACxD,MAAM,CAACmF,IAAI,CAACxE,IAAI,EAAE,IAAI,CAACX,MAAM,CAAC2G,MAAM,CAACC,GAAG,EAAE,IAAI,EAAE1E,OAAO,CAAC,CAAC;MACpE,IAAI,CAAC,IAAI,CAACuF,IAAI,CAAC9G,IAAI,EAAE/B,UAAU,CAAC,IAAI,CAAC+B,IAAI,CAACD,IAAI,EAAE;MAChD,IAAIA,IAAc,GAAGC,IAAI,CAACD,IAAI;MAC9B,IAAIkG,GAAG,IAAIlG,IAAI,CAAC+F,QAAQ,IAAI/F,IAAI,CAAC+F,QAAQ,GAAG,CAAC,EAAE;QAC7C,MAAM,IAAI,CAACzG,MAAM,CAACmF,IAAI,CAACxE,IAAI,EAAE,IAAI,CAACX,MAAM,CAAC2G,MAAM,CAACjG,IAAI,CAAC+F,QAAQ,GAAG,CAAC,EAAE/F,IAAI,CAAC+F,QAAQ,EAAEvE,OAAO,CAAC,CAAC;QAC3F,IAAI,CAAC,IAAI,CAACuF,IAAI,CAAC9G,IAAI,EAAE/B,UAAU,CAAC,IAAI,CAAC+B,IAAI,CAACD,IAAI,EAAE;QAChDA,IAAI,GAAGC,IAAI,CAACD,IAAI;MAClB;MACA;MACA,MAAMlC,OAAO,GAAG,IAAI,CAAC4B,IAAI,CAAC,SAAS,CAAC;MACpC,MAAM7B,QAAQ,GAAG,IAAI,CAAC6B,IAAI,CAAC,UAAU,CAAC;MACtC,MAAMI,GAAG,GAAGhC,OAAO,CAAC+B,MAAM,EAAEC,GAAG;MAC/B,MAAMmH,OAA8C,GAAG,EAAE;MACzD,IAAInH,GAAG,IAAIhC,OAAO,CAACmC,IAAI,KAAKD,IAAI,CAACqG,IAAI,IAAI9G,KAAK,CAACwF,YAAY,CAACmC,MAAM,EAAE;QAClE,MAAMjF,MAAM,GAAG,MAAMhE,MAAM,CAACiE,OAAO,CACjC,QAAQ,EACR;UACE3C,KAAK,EAAEA,KAAK,CAACA,KAAK;UAClBT,QAAQ,EAAEmB,IAAI,CAACnB,QAAQ;UACvBtB,IAAI,EAAEyC,IAAI,CAACzC,IAAI;UACf2J,IAAI,EAAE,CAACrH,GAAG,CAAC;UACX,IAAIjC,QAAQ,CAAC4B,MAAM,KAAK0D,SAAS,GAAG,CAAC,CAAC,GAAG;YAAE1D,MAAM,EAAE5B,QAAQ,CAAC4B;UAAO,CAAC;QACtE,CAAC,EACDQ,IAAI,CAAC0E,KAAK,CAAC5F,MACb,CAAC;QACD,IAAI,CAAC,IAAI,CAACgI,IAAI,CAAC9G,IAAI,EAAE/B,UAAU,CAAC,EAAE;QAClC+I,OAAO,CAAChD,IAAI,CAAC;UAAEnE,GAAG;UAAEgD,GAAG,EAAEb,MAAM,CAACU,IAAI,CAAC,CAAC,CAAC,IAAI;QAAK,CAAC,CAAC;MACpD;MACA,MAAMyE,KAAK,GAAG;QAAEvJ,QAAQ,EAAE,IAAI,CAAC6B,IAAI,CAAC,UAAU,CAAC;QAAE5B,OAAO,EAAE,IAAI,CAAC4B,IAAI,CAAC,SAAS;MAAE,CAAC;MAChF,MAAM2H,OAAO,GAAGjM,YAAY,CAC1BgM,KAAK,EACL;QAAEE,OAAO,EAAE,aAAa;QAAEjB,IAAI,EAAErG,IAAI,CAACqG,IAAI;QAAEY;MAAQ,CAAC,EACpD,IAAI,CAACM,UAAU,CAACtH,IAAI,EAAEV,KAAK,EAAES,IAAI,CACnC,CAAC;MACD,MAAMgH,MAAM,GAAGK,OAAO,CAACvJ,OAAO,CAACkJ,MAAM;MACrC,MAAMQ,MAAM,GAAGR,MAAM,IAAIA,MAAM,KAAKI,KAAK,CAACtJ,OAAO,CAACkJ,MAAM,GAAGA,MAAM,CAAClE,GAAG,GAAG2E,IAAI,CAACC,GAAG,CAACxB,GAAG,EAAElG,IAAI,CAAC+F,QAAQ,GAAG,CAAC,CAAC;MACxG,IACE/F,IAAI,CAACQ,MAAM,KAAK,OAAO,IACvBgH,MAAM,IAAI,CAAC,IACXvH,IAAI,CAAC8C,KAAK,CAAC1B,KAAK,CAACmG,MAAM,EAAEhG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK2B,SAAS,IACxD3B,OAAO,CAAC4D,MAAM,GAAG,CAAC,EAClB;QACA,MAAM,IAAI,CAAC9F,MAAM,CAACmF,IAAI,CAACxE,IAAI,EAAE,IAAI,CAACX,MAAM,CAAC2G,MAAM,CAACuB,MAAM,EAAExH,IAAI,CAAC+F,QAAQ,EAAEvE,OAAO,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,CAACuF,IAAI,CAAC9G,IAAI,EAAE/B,UAAU,CAAC,EAAE;MACpC;MACA,MAAMqD,QAAQ,GAAG,IAAI,CAACnD,OAAO;MAC7BmD,QAAQ,EAAEoD,KAAK,CAACA,KAAK,CAAC,CAAC;MACvB,IAAI,CAACvG,OAAO,GAAG6B,IAAI;MACnB,IAAI,CAAC5B,IAAI,GAAG,IAAI;MAChB;MACA;MACA,IAAI,CAACgH,MAAM,CAACgC,OAAO,CAACxJ,QAAQ,EAAEwJ,OAAO,CAACvJ,OAAO,EAAE;QAAEmC,IAAI,EAAEA,IAAI,CAACD,IAAI,IAAIA,IAAI;QAAEO,OAAO,EAAE,IAAI;QAAExD,KAAK,EAAE;MAAK,CAAC,CAAC;MACvG;MACAkD,IAAI,CAACD,IAAI,GAAG,IAAI,CAACR,QAAQ,CAACS,IAAI;MAC9B;MACA,IAAI,CAAC0H,WAAW,CAAEC,KAAK,IAAK,CAAC,IAAI,CAACnJ,aAAa,CAAC2E,GAAG,CAACwE,KAAK,CAAC,IAAIC,MAAM,CAACC,iBAAiB,KAAK7H,IAAI,CAACgF,KAAK,CAAC;MACtG,IAAI,CAAC9E,QAAQ,CAAC,CAAC;MACf,IAAI,CAACb,MAAM,CAACiG,QAAQ,CAAC,CAAC;MACtB;MACA;MACA,IAAItF,IAAI,CAACD,IAAI,EAAEQ,MAAM,KAAK,UAAU,IAAIjB,KAAK,CAACiB,MAAM,KAAK,OAAO,EAAE;QAChE,KAAK,IAAI,CAAClB,MAAM,CAACmF,IAAI,CAACxE,IAAI,EAAE,IAAI,CAACX,MAAM,CAAC2G,MAAM,CAACwB,IAAI,CAACM,GAAG,CAAC,CAAC,EAAEP,MAAM,CAAC,EAAE,IAAI,EAAEhG,OAAO,CAAC,CAAC,CAACmE,IAAI,CACtF,MAAM,IAAI,CAACrG,MAAM,CAACiG,QAAQ,CAAC,CAAC,EAC5B,MAAM,CAAC,CACT,CAAC;MACH;IACF,CAAC,CAAC,OAAOxI,KAAK,EAAE;MACd,IAAIkD,IAAI,KAAK,IAAI,CAAC5B,IAAI,EAAE;QACtB,IAAI,CAACA,IAAI,GAAG,IAAI;QAChB,IAAI,IAAI,CAACmB,QAAQ,CAACe,OAAO,EAAE,IAAI,CAACtB,OAAO,CAAC;UAAEsB,OAAO,EAAE;QAAK,CAAC,CAAC;MAC5D;MACA,IAAIrC,UAAU,KAAK,IAAI,CAACA,UAAU,IAAI,CAACpB,WAAW,CAACC,KAAK,CAAC,EAAE,IAAI,CAACqD,IAAI,CAACnD,WAAW,CAACF,KAAK,CAAC,CAAC;IAC1F;EACF;EAEQwK,UAAUA,CAACtH,IAAU,EAAEV,KAAgB,EAAES,IAAqB,GAAGC,IAAI,CAACD,IAAI,EAAkB;IAClG,MAAMP,MAAM,GAAG,IAAI,CAACC,IAAI,CAAC,UAAU,CAAC,CAACD,MAAM;IAC3C,OAAO;MACLF,KAAK,EAAEA,KAAK,CAACiC,OAAO;MACpB1C,QAAQ,EAAEmB,IAAI,CAACnB,QAAQ;MACvBmB,IAAI,EAAE;QACJuB,OAAO,EAAExB,IAAI,EAAEwB,OAAO,IAAIvB,IAAI,CAACsG,OAAO,CAAC/E,OAAO;QAC9CuE,QAAQ,EAAE/F,IAAI,EAAE+F,QAAQ,IAAI,CAAC;QAC7BU,MAAM,EAAExG,IAAI,CAACsG,OAAO,CAACE;MACvB,CAAC;MACDuB,MAAM,EAAGlF,GAAG,IAAK,IAAI,CAACmF,WAAW,CAAChI,IAAI,CAAC8C,KAAK,CAACE,MAAM,CAACH,GAAG,EAAErD,MAAM,CAAC,CAAC;MACjEyI,IAAI,EAAET,IAAI,CAACM,GAAG,CAAC,CAAC,EAAE,IAAI,CAACzI,MAAM,CAACoE,QAAQ,CAACf,IAAI,GAAG,CAAC,CAAC;MAChDoC,YAAY,EAAExF,KAAK,CAACwF;IACtB,CAAC;EACH;;EAEA;;EAEA;EACQkD,WAAWA,CAACnF,GAA0B,EAAyB;IACrE,IAAI,CAACA,GAAG,EAAEhD,GAAG,IAAI,IAAI,CAACxB,OAAO,CAAC0E,IAAI,KAAK,CAAC,EAAE,OAAOF,GAAG;IACpD,MAAMP,MAAM,GAAG,IAAI,CAACjE,OAAO,CAAC8E,GAAG,CAACxH,OAAO,CAACkH,GAAG,CAAChD,GAAG,CAAC,CAAC;IACjD,IAAI,CAACyC,MAAM,EAAE,OAAOO,GAAG;IACvB,OAAO;MACLhD,GAAG,EAAEgD,GAAG,CAAChD,GAAG;MACZqI,GAAG,EAAG1F,MAAM,IAAKF,MAAM,CAAC4F,GAAG,CAAC1F,MAAM,CAAC,IAAIK,GAAG,CAACqF,GAAG,CAAC1F,MAAM,CAAC;MACtDW,GAAG,EAAGX,MAAM,IAAK;QACf,MAAMS,KAAK,GAAGX,MAAM,CAACa,GAAG,CAACX,MAAM,CAAC;QAChC,OAAOS,KAAK,KAAKC,SAAS,GAAGL,GAAG,CAACM,GAAG,CAACX,MAAM,CAAC,GAAGS,KAAK,CAAC7B,KAAK;MAC5D;IACF,CAAC;EACH;;EAEA;EACQ+G,WAAWA,CAACR,KAAa,EAAES,OAAqE,EAAE;IACxG,KAAK,MAAMC,MAAM,IAAID,OAAO,EAAE;MAC5B,MAAME,IAAI,GAAG3M,OAAO,CAAC0M,MAAM,CAACxI,GAAG,CAAC;MAChC,IAAIyC,MAAM,GAAG,IAAI,CAACjE,OAAO,CAAC8E,GAAG,CAACmF,IAAI,CAAC;MACnC,IAAI,CAAChG,MAAM,EAAE;QACXA,MAAM,GAAG,IAAIhE,GAAG,CAAC,CAAC;QAClB,IAAI,CAACD,OAAO,CAAC6C,GAAG,CAACoH,IAAI,EAAEhG,MAAM,CAAC;MAChC;MACAA,MAAM,CAACpB,GAAG,CAACmH,MAAM,CAAC7F,MAAM,EAAE;QAAEpB,KAAK,EAAEiH,MAAM,CAACjH,KAAK;QAAEuG;MAAM,CAAC,CAAC;IAC3D;IACA,IAAI,CAACzH,QAAQ,CAAC,CAAC;EACjB;;EAEA;EACQwH,WAAWA,CAACa,IAAgC,EAAE;IACpD,IAAIC,OAAO,GAAG,KAAK;IACnB,KAAK,MAAM,CAACF,IAAI,EAAEhG,MAAM,CAAC,IAAI,IAAI,CAACjE,OAAO,EAAE;MACzC,KAAK,MAAM,CAACmE,MAAM,EAAES,KAAK,CAAC,IAAIX,MAAM,EAAE;QACpC,IAAI,CAACiG,IAAI,CAACtF,KAAK,CAAC0E,KAAK,CAAC,EAAE;QACxBrF,MAAM,CAACvB,MAAM,CAACyB,MAAM,CAAC;QACrBgG,OAAO,GAAG,IAAI;MAChB;MACA,IAAIlG,MAAM,CAACS,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC1E,OAAO,CAAC0C,MAAM,CAACuH,IAAI,CAAC;IAClD;IACA,IAAIE,OAAO,EAAE,IAAI,CAACtI,QAAQ,CAAC,CAAC;EAC9B;;EAEA;EACAuI,OAAOA,CAAC9F,IAAU,EAAE7E,UAAmB,EAAE;IACvC,IAAI,CAACA,UAAU,CAAC6E,IAAI,CAAC,GAAG7E,UAAU;IAClC,IAAI,CAACA,UAAU,EAAE,OAAO,IAAI,CAACC,QAAQ,CAAC4E,IAAI,CAAC;EAC7C;;EAEA;EACA+F,WAAWA,CAAC9K,QAAsB,EAAE;IAClC,OAAO,IAAI,CAACG,QAAQ,CAACH,QAAQ;IAC7B,MAAM0D,QAAQ,GAAG,IAAI,CAAC/B,QAAQ,CAAC3B,QAAQ;IACvC,IAAIA,QAAQ,KAAK0D,QAAQ,EAAE;IAC3B,IAAI,CAACtC,OAAO,CAAC;MAAEpB;IAAS,CAAC,CAAC;IAC1B,IAAIA,QAAQ,CAACL,IAAI,KAAK+D,QAAQ,CAAC/D,IAAI,EAAE,IAAI,CAAC8H,QAAQ,CAACzH,QAAQ,CAACL,IAAI,IAAI,CAAC,CAAC,CAAC;IACvE,IAAI,CAAC8B,MAAM,CAACiG,QAAQ,CAAC,CAAC;EACxB;;EAEA;EACAqD,UAAUA,CAAC9K,OAAoB,EAAE;IAC/B,OAAO,IAAI,CAACE,QAAQ,CAACF,OAAO;IAC5B,IAAIA,OAAO,KAAK,IAAI,CAAC0B,QAAQ,CAAC1B,OAAO,EAAE;IACvC,IAAI,CAACmB,OAAO,CAAC;MAAEnB;IAAQ,CAAC,CAAC;EAC3B;;EAEA;AACF;AACA;AACA;EACUuH,MAAMA,CACZxH,QAAsB,EACtBC,OAAoB,EACpB+K,KAAwE,GAAG,CAAC,CAAC,EAC7E;IACA,MAAMC,KAAwE,GAAG;MAAE,GAAGD;IAAM,CAAC;IAC7F,MAAMtH,QAAQ,GAAG,IAAI,CAAC/B,QAAQ,CAAC3B,QAAQ;IACvC,MAAMkL,OAAkE,GAAG,EAAE;IAC7E,IAAIlL,QAAQ,KAAK,IAAI,CAAC6B,IAAI,CAAC,UAAU,CAAC,EAAE;MACtC,IAAI,IAAI,CAAC3B,UAAU,CAACF,QAAQ,EAAE,IAAI,CAACG,QAAQ,CAACH,QAAQ,GAAGA,QAAQ,CAAC,KAC3DiL,KAAK,CAACjL,QAAQ,GAAGA,QAAQ;MAC9BkL,OAAO,CAAC9E,IAAI,CAAC,CAAC,UAAU,EAAEpG,QAAQ,CAAC,CAAC;IACtC;IACA,IAAIC,OAAO,KAAK,IAAI,CAAC4B,IAAI,CAAC,SAAS,CAAC,EAAE;MACpC,IAAI,IAAI,CAAC3B,UAAU,CAACD,OAAO,EAAE,IAAI,CAACE,QAAQ,CAACF,OAAO,GAAGA,OAAO,CAAC,KACxDgL,KAAK,CAAChL,OAAO,GAAGA,OAAO;MAC5BiL,OAAO,CAAC9E,IAAI,CAAC,CAAC,SAAS,EAAEnG,OAAO,CAAC,CAAC;IACpC;IACA,IAAIkL,MAAM,CAAC7B,IAAI,CAAC2B,KAAK,CAAC,CAAC1D,MAAM,GAAG,CAAC,EAAE,IAAI,CAACnG,OAAO,CAAC6J,KAAK,CAAC;IACtD,KAAK,MAAM,CAAClG,IAAI,EAAEvB,KAAK,CAAC,IAAI0H,OAAO,EAAE;MACnC,IAAInG,IAAI,KAAK,UAAU,EAAE,IAAI,CAACxB,IAAI,CAAC,UAAU,EAAEC,KAAK,CAAC,CAAC,KACjD,IAAI,CAACD,IAAI,CAAC,SAAS,EAAEC,KAAK,CAAC;IAClC;IACA,IAAIyH,KAAK,CAACjL,QAAQ,IAAIiL,KAAK,CAACjL,QAAQ,CAACL,IAAI,KAAK+D,QAAQ,CAAC/D,IAAI,EAAE,IAAI,CAAC8H,QAAQ,CAACwD,KAAK,CAACjL,QAAQ,CAACL,IAAI,IAAI,CAAC,CAAC,CAAC;EACvG;;EAEA;EACQyL,QAAQA,CAAC3B,OAAoB,EAAEjI,OAAwB,EAAW;IACxE,MAAMY,IAAI,GAAG,IAAI,CAAC7B,OAAO;IACzB,MAAMmB,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,IAAI,CAACU,IAAI,EAAED,IAAI,IAAI,CAACT,KAAK,EAAE;MACzB,OAAO;QAAE2J,IAAI,EAAE,QAAQ;QAAEnM,KAAK,EAAE,IAAIL,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;QAAEuD,IAAI,EAAE;MAAK,CAAC;IACxG;IACA,MAAMkJ,OAAO,GAAG,IAAI,CAAC5B,UAAU,CAACtH,IAAI,EAAEV,KAAK,CAAC;IAC5C,IAAIF,OAAO,CAAC+J,SAAS,EAAED,OAAO,CAACC,SAAS,GAAG/J,OAAO,CAAC+J,SAAS;IAC5D,MAAMC,OAAO,GAAG7M,GAAG,CAAC,CAAC;IACrB,IAAI;MACF,MAAMyF,MAAM,GAAG7G,YAAY,CAAC;QAAEyC,QAAQ,EAAE,IAAI,CAAC6B,IAAI,CAAC,UAAU,CAAC;QAAE5B,OAAO,EAAE,IAAI,CAAC4B,IAAI,CAAC,SAAS;MAAE,CAAC,EAAE4H,OAAO,EAAE6B,OAAO,CAAC;MACjH1M,KAAK,CAAC6K,OAAO,CAACA,OAAO,EAAE+B,OAAO,EAAE,UAAU,CAAC;MAC3C,IAAI,CAAChE,MAAM,CAACpD,MAAM,CAACpE,QAAQ,EAAEoE,MAAM,CAACnE,OAAO,CAAC;MAC5C,OAAO;QAAEoL,IAAI,EAAE,SAAS;QAAEjH,MAAM;QAAE1C;MAAM,CAAC;IAC3C,CAAC,CAAC,OAAOxC,KAAK,EAAE;MACd,IAAI,EAAEA,KAAK,YAAY1B,YAAY,CAAC,EAAE,MAAM0B,KAAK;MACjDN,KAAK,CAAC6K,OAAO,CAACA,OAAO,EAAE+B,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC;MACpD,OAAO;QAAEH,IAAI,EAAE,QAAQ;QAAEnM,KAAK;QAAEkD;MAAK,CAAC;IACxC;EACF;;EAEA;AACF;AACA;AACA;AACA;EACWqJ,QAAQ,GAAG,MAAAA,CAAOhC,OAAoB,EAAEjI,OAAwB,GAAG,CAAC,CAAC,KAA8B;IAC1G;IACA,MAAMkK,KAAK,GAAGC,eAAe,CAAClC,OAAO,CAAC;IACtC;IACA,IAAIiC,KAAK,CAACjC,OAAO,KAAK,cAAc,IAAIiC,KAAK,CAACjC,OAAO,KAAK,cAAc,EAAE,MAAM,IAAI,CAAC5I,OAAO;IAC5F,IAAI+K,OAAO,GAAG,IAAI,CAACR,QAAQ,CAACM,KAAK,EAAElK,OAAO,CAAC;IAC3C,KACE,IAAIqK,KAAK,GAAG,CAAC,EACbA,KAAK,GAAG,CAAC,IACTD,OAAO,CAACP,IAAI,KAAK,QAAQ,IACzBO,OAAO,CAACxJ,IAAI,IACZwJ,OAAO,CAAC1M,KAAK,YAAY1B,YAAY,IACrCoO,OAAO,CAAC1M,KAAK,CAACI,MAAM,KAAK,YAAY,IACrCsM,OAAO,CAAC1M,KAAK,CAAC4M,OAAO,EACrBD,KAAK,EAAE,EACP;MACA,MAAMzJ,IAAI,GAAGwJ,OAAO,CAACxJ,IAAI;MACzB,IAAI;QACF,MAAM,IAAI,CAACX,MAAM,CAACsK,IAAI,CAAC3J,IAAI,EAAEwJ,OAAO,CAAC1M,KAAK,CAAC4M,OAA0D,CAAC;MACxG,CAAC,CAAC,OAAOE,OAAO,EAAE;QAChB;QACA;QACA,IAAI,CAAC/M,WAAW,CAAC+M,OAAO,CAAC,IAAI5J,IAAI,KAAK,IAAI,CAAC7B,OAAO,EAAE,OAAO;UAAE0L,EAAE,EAAE,KAAK;UAAE/M,KAAK,EAAEE,WAAW,CAAC4M,OAAO;QAAE,CAAC;MACvG;MACAJ,OAAO,GAAG,IAAI,CAACR,QAAQ,CAACM,KAAK,EAAElK,OAAO,CAAC;IACzC;IACA,IAAIoK,OAAO,CAACP,IAAI,KAAK,QAAQ,EAAE,OAAO;MAAEY,EAAE,EAAE,KAAK;MAAE/M,KAAK,EAAE0M,OAAO,CAAC1M;IAAM,CAAC;IACzE,IAAI;MACF,MAAMgN,MAAM,GAAG,MAAM,IAAI,CAACC,IAAI,CAACT,KAAK,CAACjC,OAAO,EAAEmC,OAAO,CAACxH,MAAM,CAACgI,QAAQ,EAAER,OAAO,CAAClK,KAAK,CAAC;MACrF,MAAM8B,KAAK,GAAG0I,MAAM,IAAIN,OAAO,CAACxH,MAAM,CAAC8H,MAAM;MAC7C,OAAO1I,KAAK,KAAK8B,SAAS,GAAG;QAAE2G,EAAE,EAAE;MAAK,CAAC,GAAG;QAAEA,EAAE,EAAE,IAAI;QAAEC,MAAM,EAAE1I;MAAM,CAAC;IACzE,CAAC,CAAC,OAAOtE,KAAK,EAAE;MACd,OAAO;QAAE+M,EAAE,EAAE,KAAK;QAAE/M,KAAK,EAAEE,WAAW,CAACF,KAAK;MAAE,CAAC;IACjD;EACF,CAAC;;EAED;AACF;AACA;AACA;EACEmN,YAAYA,CAAC5C,OAAoB,EAAEjI,OAAwB,GAAG,CAAC,CAAC,EAAkB;IAChF,MAAMkK,KAAK,GAAGC,eAAe,CAAClC,OAAO,CAAC;IACtC,MAAMmC,OAAO,GAAG,IAAI,CAACR,QAAQ,CAACM,KAAK,EAAElK,OAAO,CAAC;IAC7C,IAAIoK,OAAO,CAACP,IAAI,KAAK,QAAQ,EAAE,OAAO;MAAEY,EAAE,EAAE,KAAK;MAAE/M,KAAK,EAAE0M,OAAO,CAAC1M;IAAM,CAAC;IACzE,IAAI0M,OAAO,CAACxH,MAAM,CAACgI,QAAQ,CAAC7E,MAAM,GAAG,CAAC,EAAE;MACtC,KAAK,IAAI,CAAC4E,IAAI,CAACT,KAAK,CAACjC,OAAO,EAAEmC,OAAO,CAACxH,MAAM,CAACgI,QAAQ,EAAER,OAAO,CAAClK,KAAK,CAAC,CAAC+E,KAAK,CAAEvH,KAAc,IAAK;QAC9F,IAAI,CAACqD,IAAI,CAACnD,WAAW,CAACF,KAAK,CAAC,CAAC;MAC/B,CAAC,CAAC;IACJ;IACA,OAAO0M,OAAO,CAACxH,MAAM,CAAC8H,MAAM,KAAK5G,SAAS,GAAG;MAAE2G,EAAE,EAAE;IAAK,CAAC,GAAG;MAAEA,EAAE,EAAE,IAAI;MAAEC,MAAM,EAAEN,OAAO,CAACxH,MAAM,CAAC8H;IAAO,CAAC;EACzG;;EAEA;AACF;AACA;AACA;AACA;EACWI,UAAU,GAAG,MAAAA,CAAA,KAAqC;IACzD,MAAMC,MAAM,GAAG,IAAI,CAAC5K,QAAQ,CAACiB,WAAW;IACxC,MAAMlB,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,IAAI,CAAC6K,MAAM,EAAE,OAAO;MAAEN,EAAE,EAAE,KAAK;MAAE/M,KAAK,EAAE,IAAIL,SAAS,CAAC,iBAAiB,EAAE,kBAAkB;IAAE,CAAC;IAC9F,IAAI0N,MAAM,CAACC,KAAK,KAAK,IAAI,IAAI,CAAC9K,KAAK,IAAIA,KAAK,CAACT,QAAQ,KAAKsL,MAAM,CAACtL,QAAQ,EAAE;MACzE,OAAO;QAAEgL,EAAE,EAAE,KAAK;QAAE/M,KAAK,EAAE,IAAIL,SAAS,CAAC,kBAAkB,EAAE,iCAAiC;MAAE,CAAC;IACnG;IACA,IAAI,CAACuC,OAAO,CAAC;MAAEwB,WAAW,EAAE;IAAK,CAAC,CAAC;IACnC,MAAMyB,OAAuB,GAAG;MAAEoI,EAAE,EAAE,OAAO;MAAExL,QAAQ,EAAEsL,MAAM,CAACtL,QAAQ;MAAEuJ,OAAO,EAAE+B,MAAM,CAAC/B;IAAQ,CAAC;IACnG,IAAI+B,MAAM,CAAC3K,MAAM,KAAK0D,SAAS,EAAEjB,OAAO,CAACzC,MAAM,GAAG2K,MAAM,CAAC3K,MAAM;IAC/D,MAAM6H,OAAO,GAAG,IAAI,CAACiD,SAAS,CAACH,MAAM,CAAC,GAAGA,MAAM,CAAC9C,OAAO,GAAG,OAAO;IACjE,IAAI;MACF,MAAM,IAAI,CAAC0C,IAAI,CAAC1C,OAAO,EAAE,CAACpF,OAAO,CAAC,EAAE3C,KAAK,EAAE6K,MAAM,CAACC,KAAK,KAAK,WAAW,CAAC;MACxE,OAAO;QAAEP,EAAE,EAAE;MAAK,CAAC;IACrB,CAAC,CAAC,OAAO/M,KAAK,EAAE;MACd,OAAO;QAAE+M,EAAE,EAAE,KAAK;QAAE/M,KAAK,EAAEE,WAAW,CAACF,KAAK;MAAE,CAAC;IACjD;EACF,CAAC;;EAED;EACAyN,YAAYA,CAAA,EAAG;IACb,IAAI,IAAI,CAAChL,QAAQ,CAACiB,WAAW,EAAE,IAAI,CAACxB,OAAO,CAAC;MAAEwB,WAAW,EAAE;IAAK,CAAC,CAAC;EACpE;;EAEA;EACQgK,SAASA,CAACnD,OAAe,EAAEpF,OAAuB,EAAEnF,KAAgB,EAAE;IAC5E,MAAMqN,MAAmB,GAAG;MAC1B9C,OAAO;MACPe,OAAO,EAAEnG,OAAO,CAACmG,OAAwB;MACzCvJ,QAAQ,EAAGoD,OAAO,CAACpD,QAAQ,IAAkC,IAAI;MACjE,IAAIoD,OAAO,CAACzC,MAAM,KAAK0D,SAAS,GAAG,CAAC,CAAC,GAAG;QAAE1D,MAAM,EAAEyC,OAAO,CAACzC;MAA4B,CAAC,CAAC;MACxF1C,KAAK;MACLsN,KAAK,EAAEtN,KAAK,CAACC,IAAI,KAAK,eAAe,GAAG,WAAW,GAAGJ,OAAO,CAACuL,GAAG,CAACpL,KAAK,CAACC,IAAI,CAAC,GAAG,OAAO,GAAG;IAC5F,CAAC;IACD,IAAI,CAACiC,OAAO,CAAC;MAAEwB,WAAW,EAAE2J;IAAO,CAAC,CAAC;EACvC;;EAEA;EACQG,SAASA,CAACH,MAAmB,EAAE;IACrC,MAAMM,IAAI,GAAGN,MAAM,CAAC9C,OAAO,KAAK,cAAc,GAAG,MAAM,GAAG8C,MAAM,CAAC9C,OAAO,KAAK,cAAc,GAAG,MAAM,GAAG,IAAI;IAC3G,IAAI,CAACoD,IAAI,EAAE,OAAO,IAAI;IACtB,MAAMC,IAAI,GAAG,IAAI,CAACjL,IAAI,CAAC,SAAS,CAAC,CAACkL,OAAO,GAAGF,IAAI,CAAC,CAACG,EAAE,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,CAACF,IAAI,EAAE,OAAO,KAAK;IACvB,MAAMrM,OAAO,GAAGqM,IAAI,CAACtC,OAAO,CAACtG,GAAG,CAAEuG,MAAM,KAAM;MAC5CxI,GAAG,EAAEwI,MAAM,CAACxI,GAAG;MACf2C,MAAM,EAAE6F,MAAM,CAAC7F,MAAM;MACrBpB,KAAK,EAAEqJ,IAAI,KAAK,MAAM,GAAGpC,MAAM,CAACwC,MAAM,GAAGxC,MAAM,CAACyC,KAAK;MACrDxJ,QAAQ,EAAEmJ,IAAI,KAAK,MAAM,GAAGpC,MAAM,CAACyC,KAAK,GAAGzC,MAAM,CAACwC;IACpD,CAAC,CAAC,CAAC;IACH,MAAME,IAAI,GAAGZ,MAAM,CAAC/B,OAAO,CAACtG,GAAG,CAAC,CAAC;MAAEjC,GAAG;MAAE2C,MAAM;MAAEpB,KAAK;MAAEE;IAAS,CAAC,MAAM;MAAEzB,GAAG;MAAE2C,MAAM;MAAEpB,KAAK;MAAEE;IAAS,CAAC,CAAC,CAAC;IACzG,OAAOjG,aAAa,CAACgD,OAAO,CAAC,KAAKhD,aAAa,CAAC0P,IAAI,CAAC;EACvD;;EAEA;EACAC,SAASA,CAACzD,MAAc,EAAiB;IACvC,OAAO,IAAI,CAACnI,OAAO,CAACwE,SAAS,CAACoH,SAAS,GAAGzD,MAAM,CAAC,IAAI,IAAI;EAC3D;;EAEA;EACA0D,UAAUA,CAACC,MAAc,EAAU;IACjC,MAAMnJ,IAAI,GAAG,IAAI,CAAC3C,OAAO,CAACE,KAAK,CAAC6L,KAAK,CAAC,OAAO,CAAC,CAACC,GAAG,CAAC,CAAC,IAAI,EAAE;IAC1D,MAAM3L,IAAI,GAAGsC,IAAI,CAACsJ,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,QAAQ;IACpF,OAAO,GAAG5L,IAAI,IAAIyL,MAAM,EAAE;EAC5B;;EAEA;AACF;AACA;AACA;EACE,MAAMI,MAAMA,CAAA,EAAkB;IAC5B,MAAMhM,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,MAAMtB,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,MAAMC,UAAU,GAAG,IAAI,CAACA,UAAU;IAClC,IAAI,CAACqB,KAAK,IAAI,CAACtB,MAAM,IAAI,CAAC,IAAI,CAACE,MAAM,EAAE,MAAM,IAAIzB,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;IACrG,MAAMsD,IAAI,GAAG,MAAM/B,MAAM,CAACiE,OAAO,CAAY,QAAQ,EAAE;MAAE3C,KAAK,EAAEA,KAAK,CAACA;IAAM,CAAC,CAAC;IAC9E,IAAIrB,UAAU,KAAK,IAAI,CAACA,UAAU,EAAE,IAAI,CAAC0H,KAAK,CAAC5F,IAAI,CAAC;EACtD;;EAEA;EACQ4F,KAAKA,CAAC5F,IAAe,EAAE;IAC7B,MAAM5B,OAAO,GAAG,IAAI,CAACoB,QAAQ,CAACD,KAAK;IACnC,IACEnB,OAAO,IACPA,OAAO,CAACU,QAAQ,KAAKkB,IAAI,CAAClB,QAAQ,IAClCV,OAAO,CAAC6G,KAAK,CAACC,OAAO,KAAKlF,IAAI,CAACiF,KAAK,CAACC,OAAO,IAC5C9G,OAAO,CAACoH,WAAW,KAAKxF,IAAI,CAACwF,WAAW,IACxCpH,OAAO,CAACoC,MAAM,KAAKR,IAAI,CAACQ,MAAM,EAC9B;MACA;IACF;IACA,MAAMsE,QAAQ,GAAG9I,cAAc,CAAC,IAAI,CAAC0D,IAAI,CAAC,UAAU,CAAC,EAAEM,IAAI,CAACwB,OAAO,EAAEzF,WAAW,CAACiE,IAAI,CAAC+E,YAAY,CAAC,CAAC;IACpG,IAAI,CAAC9F,OAAO,CAAC;MAAEM,KAAK,EAAES,IAAI;MAAEQ,MAAM,EAAER,IAAI,CAACQ,MAAM,KAAK,OAAO,GAAG,OAAO,GAAG;IAAQ,CAAC,CAAC;IAClF,IAAIsE,QAAQ,CAACK,OAAO,CAACC,MAAM,GAAG,CAAC,EAAE,IAAI,CAACC,MAAM,CAACP,QAAQ,CAACjH,QAAQ,EAAE,IAAI,CAAC6B,IAAI,CAAC,SAAS,CAAC,CAAC;IACrF,IAAI,CAAC4F,QAAQ,CAAC,IAAI,CAAC5F,IAAI,CAAC,UAAU,CAAC,CAAClC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC8B,MAAM,CAACiG,QAAQ,CAAC,CAAC;EACxB;;EAEA;EACA,MAAMiG,SAASA,CACbC,MAA0B,EAC1BjK,OAAiB,EACjBzC,MAAoB,EAC0F;IAC9G,MAAMkB,IAAI,GAAG,IAAI,CAAC7B,OAAO;IACzB,MAAMmB,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,MAAMtB,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,IAAI,CAACgC,IAAI,IAAI,CAACV,KAAK,IAAI,CAACtB,MAAM,IAAI,CAAC,IAAI,CAACE,MAAM,EAAE,MAAM,IAAIzB,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;IAC9G,OAAOuB,MAAM,CAACiE,OAAO,CACnB,WAAW,EACX;MAAE3C,KAAK,EAAEA,KAAK,CAACA,KAAK;MAAET,QAAQ,EAAEmB,IAAI,CAACnB,QAAQ;MAAEtB,IAAI,EAAEyC,IAAI,CAACzC,IAAI;MAAEiO,MAAM;MAAEjK;IAAQ,CAAC,EACjFzC,MACF,CAAC;EACH;;EAEA;AACF;AACA;AACA;AACA;EACE,MAAMwD,MAAMA,CACVE,MAAc,EACd;IAAEiJ,MAAM,GAAG,EAAE;IAAEC,KAAK,GAAG;EAA2C,CAAC,GAAG,CAAC,CAAC,EACxE5M,MAAoB,EAC4D;IAChF,MAAMQ,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,MAAMtB,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,IAAI,CAACsB,KAAK,IAAI,CAACtB,MAAM,IAAI,CAAC,IAAI,CAACE,MAAM,EAAE,MAAM,IAAIzB,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;IACrG,MAAMkP,IAAI,GAAGzP,UAAU,CAAC,IAAI,CAACuD,IAAI,CAAC,UAAU,CAAC,CAAClC,IAAI,IAAI,CAAC,CAAC,EAAEiF,MAAM,EAAEiJ,MAAM,CAAC;IACzE,IAAI,CAACE,IAAI,EAAE,MAAM,IAAIlP,SAAS,CAAC,cAAc,EAAE,8CAA8C,CAAC;IAC9F,MAAMuF,MAAM,GAAG,MAAMhE,MAAM,CAACiE,OAAO,CACjC,MAAM,EACN;MACE3C,KAAK,EAAEA,KAAK,CAACA,KAAK;MAClBT,QAAQ,EAAE,IAAI,CAACV,OAAO,EAAEU,QAAQ,IAAIS,KAAK,CAACT,QAAQ;MAClDtB,IAAI,EAAEoO,IAAI,CAACpO,IAAI;MACf2E,KAAK,EAAE,CAAC;MACRC,GAAG,EAAEuJ,KAAK,GAAG,CAAC;MACdnK,OAAO,EAAE,CAACiB,MAAM,EAAEmJ,IAAI,CAACC,KAAK;IAC9B,CAAC,EACD9M,MACF,CAAC;IACD,MAAM4D,IAAI,GAAGnH,WAAW,CAACyG,MAAM,CAACI,KAAK,CAACC,KAAK,CAAC,CAACK,IAAI;IACjD,OAAO;MACLJ,MAAM,EAAEI,IAAI,CAACmJ,KAAK,CAAC,CAAC,EAAEH,KAAK,CAAC,CAAC5J,GAAG,CAAC,CAAC,CAACV,KAAK,EAAEwK,KAAK,CAAC,MAAM;QAAExK,KAAK;QAAEwK,KAAK,EAAEhE,MAAM,CAACgE,KAAK;MAAE,CAAC,CAAC,CAAC;MACvFnF,SAAS,EAAE/D,IAAI,CAACyC,MAAM,GAAGuG;IAC3B,CAAC;EACH;;EAEA;AACF;AACA;AACA;EACE,MAAMxF,IAAIA,CACRoC,IAAY,EACZ;IACEwD,IAAI;IACJC,SAAS,GAAG,CAAC;IACbC,aAAa,GAAG;EACsE,CAAC,EACzFlN,MAAoB,EAC6B;IACjD,MAAMkB,IAAI,GAAG,IAAI,CAAC7B,OAAO;IACzB,MAAMmB,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,MAAMtB,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,IAAI,CAACgC,IAAI,IAAI,CAACV,KAAK,IAAI,CAACtB,MAAM,IAAI,CAAC,IAAI,CAACE,MAAM,EAAE,MAAM,IAAIzB,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;IAC9G,MAAM8E,OAAO,GAAG,IAAI,CAAChC,QAAQ,CAACc,SAAS,CAACyB,GAAG,CAAEqE,IAAI,IAAKA,IAAI,CAAC3D,MAAM,CAACT,IAAI,CAAC;IACvE,MAAMS,MAAM,GAAGgF,IAAI,CAACM,GAAG,CAAC,CAAC,EAAEvG,OAAO,CAAC0K,OAAO,CAACH,IAAI,CAACtJ,MAAM,CAAC,CAAC;IACxD,MAAM0J,KAAK,GAAG,MAAMlO,MAAM,CAACiE,OAAO,CAChC,MAAM,EACN;MACE3C,KAAK,EAAEA,KAAK,CAACA,KAAK;MAClBT,QAAQ,EAAEmB,IAAI,CAACnB,QAAQ;MACvBtB,IAAI,EAAEyC,IAAI,CAACzC,IAAI;MACf+K,IAAI;MACJ/G,OAAO;MACPuK,IAAI,EAAE;QAAEjJ,GAAG,EAAEiJ,IAAI,CAACjJ,GAAG;QAAEL;MAAO,CAAC;MAC/BuJ,SAAS;MACT,IAAIC,aAAa,GAAG;QAAEA,aAAa,EAAE;MAAK,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC,EACDlN,MACF,CAAC;IACD,OAAOoN,KAAK,GAAG;MAAErJ,GAAG,EAAEqJ,KAAK,CAACrJ,GAAG;MAAEL,MAAM,EAAEjB,OAAO,CAAC2K,KAAK,CAAC1J,MAAM;IAAE,CAAC,GAAG,IAAI;EACzE;;EAEA;EACA,MAAM2J,SAASA,CAACtJ,GAAW,EAAEL,MAAc,EAAE1D,MAAoB,EAAiD;IAChH,MAAMkB,IAAI,GAAG,IAAI,CAAC7B,OAAO;IACzB,MAAMmB,KAAK,GAAG,IAAI,CAACC,QAAQ,CAACD,KAAK;IACjC,MAAMtB,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,IAAI,CAACgC,IAAI,IAAI,CAACV,KAAK,IAAI,CAACtB,MAAM,IAAI,CAAC,IAAI,CAACE,MAAM,EAAE,MAAM,IAAIzB,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;IAC9G,MAAMuF,MAAM,GAAG,MAAMhE,MAAM,CAACiE,OAAO,CACjC,MAAM,EACN;MACE3C,KAAK,EAAEA,KAAK,CAACA,KAAK;MAClBT,QAAQ,EAAEmB,IAAI,CAACnB,QAAQ;MACvBtB,IAAI,EAAEyC,IAAI,CAACzC,IAAI;MACf2E,KAAK,EAAEW,GAAG;MACVV,GAAG,EAAEU,GAAG,GAAG,CAAC;MACZtB,OAAO,EAAE,CAACiB,MAAM,CAAC;MACjB4J,SAAS,EAAE;IACb,CAAC,EACDtN,MACF,CAAC;IACD,MAAMsD,KAAK,GAAG7G,WAAW,CAACyG,MAAM,CAACI,KAAK,CAACC,KAAK,CAAC;IAC7C,OAAO;MAAEjB,KAAK,EAAEgB,KAAK,CAACM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI;MAAEF,MAAM,EAAEJ,KAAK,CAACb,OAAO,CAAC,CAAC;IAAE,CAAC;EACxE;;EAEA;EACA,MAAcwI,IAAIA,CAAChI,IAAY,EAAEiI,QAA0B,EAAE1K,KAAgB,EAAE+M,SAAS,GAAG,KAAK,EAAoB;IAClH,IAAI,CAACrC,QAAQ,CAACsC,IAAI,CAAErK,OAAO,IAAKA,OAAO,CAACoI,EAAE,KAAK,OAAO,CAAC,EAAE,OAAO,IAAI,CAACkC,OAAO,CAACxK,IAAI,EAAEiI,QAAQ,EAAE1K,KAAK,EAAE+M,SAAS,CAAC;IAC9G,IAAI9D,IAAI,GAAGA,CAAA,KAAM,CAAC,CAAC;IACnB,MAAMiE,QAAQ,GAAG,IAAI9N,OAAO,CAAQC,OAAO,IAAK;MAC9C4J,IAAI,GAAG5J,OAAO;IAChB,CAAC,CAAC;IACF,IAAI,CAACF,OAAO,GAAG,IAAI,CAACA,OAAO,CAACiH,IAAI,CAAC,MAAM8G,QAAQ,CAAC;IAChD,IAAI;MACF,OAAO,MAAM,IAAI,CAACD,OAAO,CAACxK,IAAI,EAAEiI,QAAQ,EAAE1K,KAAK,EAAE+M,SAAS,CAAC;IAC7D,CAAC,SAAS;MACR9D,IAAI,CAAC,CAAC;IACR;EACF;EAEA,MAAcgE,OAAOA,CAACxK,IAAY,EAAEiI,QAA0B,EAAE1K,KAAgB,EAAE+M,SAAkB,EAAE;IACpG,MAAMrO,MAAM,GAAG,IAAI,CAACA,MAAM;IAC1B,IAAI8L,MAAe;IACnB,KAAK,MAAM7H,OAAO,IAAI+H,QAAQ,EAAE;MAC9B,IAAI,CAAChM,MAAM,EAAE,MAAM,IAAIvB,SAAS,CAAC,WAAW,EAAE,4BAA4B,CAAC;MAC3E,MAAM;QAAE4N,EAAE;QAAE,GAAGoC;MAAQ,CAAC,GAAGxK,OAAO;MAClC,MAAMmG,OAAO,GAAIiC,EAAE,KAAK,OAAO,GAAGoC,OAAO,CAACrE,OAAO,GAAG,EAAoB;MACxE,MAAMT,KAAK,GAAG0C,EAAE,KAAK,OAAO,GAAG,EAAE,IAAI,CAAC9L,MAAM,GAAG,CAAC;MAChD,IAAIoJ,KAAK,EAAE,IAAI,CAACQ,WAAW,CAACR,KAAK,EAAES,OAAO,CAAC;MAC3C;MACA,MAAM2C,IAAI,GAAGsB,SAAS,GAAG;QAAE,GAAGI,OAAO;QAAErE,OAAO,EAAEA,OAAO,CAACtG,GAAG,CAAC,CAAC;UAAER,QAAQ,EAAEkE,CAAC;UAAE,GAAG6C;QAAO,CAAC,KAAKA,MAAM;MAAE,CAAC,GAAGoE,OAAO;MAC/G,IAAIzK,MAA+B;MACnC,IAAI;QACFA,MAAM,GAAG,MAAMhE,MAAM,CAACiE,OAAO,CAA0BoI,EAAE,EAAe;UAAE/K,KAAK,EAAEA,KAAK,CAACA,KAAK;UAAE,GAAGyL;QAAK,CAAC,CAAC;MAC1G,CAAC,CAAC,OAAOjO,KAAK,EAAE;QACd,IAAI6K,KAAK,EAAE;UACT,IAAI,CAACD,WAAW,CAAEgF,KAAK,IAAKA,KAAK,KAAK/E,KAAK,CAAC;UAC5C,IAAI3J,MAAM,KAAK,IAAI,CAACA,MAAM,EAAE,IAAI,CAACwM,SAAS,CAACzI,IAAI,EAAEE,OAAO,EAAEjF,WAAW,CAACF,KAAK,CAAC,CAAC;QAC/E;QACA,MAAMA,KAAK;MACb;MACA,IAAIuN,EAAE,KAAK,OAAO,EAAE;QAClB,MAAMsC,IAAI,GACR5K,IAAI,KAAK,cAAc,GACnB;UAAEsF,OAAO,EAAE;QAA0B,CAAC,GACtCtF,IAAI,KAAK,cAAc,GACrB;UAAEsF,OAAO,EAAE;QAA0B,CAAC,GACtC;UACEA,OAAO,EAAE,cAAuB;UAChCe,OAAO,EAAEA,OAAO,CAACtG,GAAG,CAAEuG,MAAM,KAAM;YAChCxI,GAAG,EAAEwI,MAAM,CAACxI,GAAG;YACf2C,MAAM,EAAE6F,MAAM,CAAC7F,MAAM;YACrBqI,MAAM,EAAExC,MAAM,CAAC/G,QAAQ,IAAI,IAAI;YAC/BwJ,KAAK,EAAEzC,MAAM,CAACjH;UAChB,CAAC,CAAC;QACJ,CAAC;QACT,MAAM+F,KAAK,GAAG;UAAEvJ,QAAQ,EAAE,IAAI,CAAC6B,IAAI,CAAC,UAAU,CAAC;UAAE5B,OAAO,EAAE,IAAI,CAAC4B,IAAI,CAAC,SAAS;QAAE,CAAC;QAChF,MAAMO,IAAI,GAAG,IAAI,CAAC7B,OAAO;QACzB,IAAI6B,IAAI,EAAE;UACR,MAAMwJ,OAAO,GAAGrO,YAAY,CAACgM,KAAK,EAAEwF,IAAI,EAAiB,IAAI,CAACrF,UAAU,CAACtH,IAAI,EAAEV,KAAK,CAAC,CAAC;UACtF,IAAI,CAAC8F,MAAM,CAACoE,OAAO,CAAC5L,QAAQ,EAAE4L,OAAO,CAAC3L,OAAO,CAAC;QAChD;QACA,MAAMmH,KAAK,GAAGhD,MAAM,CAACgD,KAA2B;QAChD,IAAI,CAACxG,aAAa,CAAC0C,GAAG,CAACyG,KAAK,EAAE3C,KAAK,CAACC,OAAO,CAAC;QAC5C;QACA,IAAI,IAAI,CAAC9G,OAAO,IAAI,IAAI,CAACA,OAAO,CAAC6G,KAAK,IAAIA,KAAK,CAACC,OAAO,EAAE,IAAI,CAACyC,WAAW,CAAEgF,KAAK,IAAKA,KAAK,KAAK/E,KAAK,CAAC;QACrG,MAAMxJ,OAAO,GAAG,IAAI,CAACoB,QAAQ,CAACD,KAAK;QACnC,IAAInB,OAAO,EAAE,IAAI,CAACa,OAAO,CAAC;UAAEM,KAAK,EAAE;YAAE,GAAGnB,OAAO;YAAE6G;UAAM;QAAE,CAAC,CAAC;QAC3D,IAAI,CAACK,QAAQ,CAAC,IAAI,CAAC5F,IAAI,CAAC,UAAU,CAAC,CAAClC,IAAI,IAAI,CAAC,CAAC,CAAC;MACjD,CAAC,MAAM;QACLuM,MAAM,GAAG9H,MAAM;MACjB;IACF;IACA,OAAO8H,MAAM;EACf;AACF;;AAEA;AACA,OAAO,SAAS8C,eAAeA,CAACxN,OAAyB,EAAa;EACpE,OAAO,IAAI5B,SAAS,CAAC4B,OAAO,CAAC;AAC/B","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Plan } from "vastgrid-spec";
|
|
2
|
+
import type { View } from "./rows.js";
|
|
3
|
+
import type { GridSnapshot } from "./types.js";
|
|
4
|
+
type Totals = NonNullable<GridSnapshot["totals"]>;
|
|
5
|
+
/**
|
|
6
|
+
* The totals row of the view on screen (§5.1): read again when the view, its edits or the totals change, with
|
|
7
|
+
* `measure`, and shown with `show`; a read that fails goes to `fail`. The totals on screen stay until the new ones
|
|
8
|
+
* come.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TotalsReader {
|
|
11
|
+
private readonly measure;
|
|
12
|
+
private readonly show;
|
|
13
|
+
private readonly fail;
|
|
14
|
+
/** The revision, edits and plan of the totals read last; empty without them, null to read them again. */
|
|
15
|
+
private key;
|
|
16
|
+
private abort;
|
|
17
|
+
constructor(measure: (plan: Plan, revision: string | null, signal: AbortSignal) => Promise<Totals>, show: (totals: Totals | null) => void, fail: (error: unknown) => void);
|
|
18
|
+
/** Stops the read in flight, and reads the totals row again at the next `follow`, as for a new connection. */
|
|
19
|
+
reset(): void;
|
|
20
|
+
/** Reads the totals row again if the view on screen, its edits or the totals changed. */
|
|
21
|
+
follow(view: View | null, snapshot: GridSnapshot): void;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=totals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totals.d.ts","sourceRoot":"","sources":["../../src/core/totals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAEzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,KAAK,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;AAElD;;;;GAIG;AACH,qBAAa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,yGAAyG;IACzG,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,KAAK,CAAgC;IAE7C,YACmB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,EACtF,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,EACrC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,EAC7C;IAEJ,8GAA8G;IAC9G,KAAK,SAIJ;IAED,yFAAyF;IACzF,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,YAAY,QA0B/C;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { canonicalJson } from "vastgrid-spec";
|
|
2
|
+
import { measuresPlan, totalMeasures } from "./measures.js";
|
|
3
|
+
/**
|
|
4
|
+
* The totals row of the view on screen (§5.1): read again when the view, its edits or the totals change, with
|
|
5
|
+
* `measure`, and shown with `show`; a read that fails goes to `fail`. The totals on screen stay until the new ones
|
|
6
|
+
* come.
|
|
7
|
+
*/
|
|
8
|
+
export class TotalsReader {
|
|
9
|
+
/** The revision, edits and plan of the totals read last; empty without them, null to read them again. */
|
|
10
|
+
key = "";
|
|
11
|
+
abort = null;
|
|
12
|
+
constructor(measure, show, fail) {
|
|
13
|
+
this.measure = measure;
|
|
14
|
+
this.show = show;
|
|
15
|
+
this.fail = fail;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Stops the read in flight, and reads the totals row again at the next `follow`, as for a new connection. */
|
|
19
|
+
reset() {
|
|
20
|
+
this.key = null;
|
|
21
|
+
this.abort?.abort();
|
|
22
|
+
this.abort = null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Reads the totals row again if the view on screen, its edits or the totals changed. */
|
|
26
|
+
follow(view, snapshot) {
|
|
27
|
+
const measures = totalMeasures(snapshot.displayed);
|
|
28
|
+
// A view that is being made is totalled once it is ready.
|
|
29
|
+
if (view && measures.length > 0 && snapshot.view?.status !== "ready") return;
|
|
30
|
+
const plan = view && measures.length > 0 ? measuresPlan(view.plan, measures) : null;
|
|
31
|
+
const key = view && plan ? `${view.revision}\u0000${view.edits}\u0000${canonicalJson(plan)}` : "";
|
|
32
|
+
if (key === this.key) return;
|
|
33
|
+
this.key = key;
|
|
34
|
+
this.abort?.abort();
|
|
35
|
+
this.abort = null;
|
|
36
|
+
if (!view || !plan) {
|
|
37
|
+
if (snapshot.totals) this.show(null);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const abort = new AbortController();
|
|
41
|
+
this.abort = abort;
|
|
42
|
+
this.measure(plan, view.revision, abort.signal).then(totals => {
|
|
43
|
+
if (!abort.signal.aborted) this.show(totals);
|
|
44
|
+
}, error => {
|
|
45
|
+
if (!abort.signal.aborted) this.fail(error);
|
|
46
|
+
}).catch(() => {});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=totals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["canonicalJson","measuresPlan","totalMeasures","TotalsReader","key","abort","constructor","measure","show","fail","reset","follow","view","snapshot","measures","displayed","length","status","plan","revision","edits","totals","AbortController","signal","then","aborted","error","catch"],"sources":["totals.ts"],"sourcesContent":["import { canonicalJson, type Plan } from \"vastgrid-spec\";\nimport { measuresPlan, totalMeasures } from \"./measures.js\";\nimport type { View } from \"./rows.js\";\nimport type { GridSnapshot } from \"./types.js\";\n\ntype Totals = NonNullable<GridSnapshot[\"totals\"]>;\n\n/**\n * The totals row of the view on screen (§5.1): read again when the view, its edits or the totals change, with\n * `measure`, and shown with `show`; a read that fails goes to `fail`. The totals on screen stay until the new ones\n * come.\n */\nexport class TotalsReader {\n /** The revision, edits and plan of the totals read last; empty without them, null to read them again. */\n private key: string | null = \"\";\n private abort: AbortController | null = null;\n\n constructor(\n private readonly measure: (plan: Plan, revision: string | null, signal: AbortSignal) => Promise<Totals>,\n private readonly show: (totals: Totals | null) => void,\n private readonly fail: (error: unknown) => void,\n ) {}\n\n /** Stops the read in flight, and reads the totals row again at the next `follow`, as for a new connection. */\n reset() {\n this.key = null;\n this.abort?.abort();\n this.abort = null;\n }\n\n /** Reads the totals row again if the view on screen, its edits or the totals changed. */\n follow(view: View | null, snapshot: GridSnapshot) {\n const measures = totalMeasures(snapshot.displayed);\n // A view that is being made is totalled once it is ready.\n if (view && measures.length > 0 && snapshot.view?.status !== \"ready\") return;\n const plan = view && measures.length > 0 ? measuresPlan(view.plan, measures) : null;\n const key = view && plan ? `${view.revision}\\u0000${view.edits}\\u0000${canonicalJson(plan)}` : \"\";\n if (key === this.key) return;\n this.key = key;\n this.abort?.abort();\n this.abort = null;\n if (!view || !plan) {\n if (snapshot.totals) this.show(null);\n return;\n }\n const abort = new AbortController();\n this.abort = abort;\n this.measure(plan, view.revision, abort.signal)\n .then(\n (totals) => {\n if (!abort.signal.aborted) this.show(totals);\n },\n (error) => {\n if (!abort.signal.aborted) this.fail(error);\n },\n )\n .catch(() => {});\n }\n}\n"],"mappings":"AAAA,SAASA,aAAa,QAAmB,eAAe;AACxD,SAASC,YAAY,EAAEC,aAAa,QAAQ,eAAe;AAM3D;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,YAAY,CAAC;EACxB;EACQC,GAAG,GAAkB,EAAE;EACvBC,KAAK,GAA2B,IAAI;EAE5CC,WAAWA,CACQC,OAAsF,EACtFC,IAAqC,EACrCC,IAA8B,EAC/C;IAAA,KAHiBF,OAAsF,GAAtFA,OAAsF;IAAA,KACtFC,IAAqC,GAArCA,IAAqC;IAAA,KACrCC,IAA8B,GAA9BA,IAA8B;EAC9C;;EAEH;EACAC,KAAKA,CAAA,EAAG;IACN,IAAI,CAACN,GAAG,GAAG,IAAI;IACf,IAAI,CAACC,KAAK,EAAEA,KAAK,CAAC,CAAC;IACnB,IAAI,CAACA,KAAK,GAAG,IAAI;EACnB;;EAEA;EACAM,MAAMA,CAACC,IAAiB,EAAEC,QAAsB,EAAE;IAChD,MAAMC,QAAQ,GAAGZ,aAAa,CAACW,QAAQ,CAACE,SAAS,CAAC;IAClD;IACA,IAAIH,IAAI,IAAIE,QAAQ,CAACE,MAAM,GAAG,CAAC,IAAIH,QAAQ,CAACD,IAAI,EAAEK,MAAM,KAAK,OAAO,EAAE;IACtE,MAAMC,IAAI,GAAGN,IAAI,IAAIE,QAAQ,CAACE,MAAM,GAAG,CAAC,GAAGf,YAAY,CAACW,IAAI,CAACM,IAAI,EAAEJ,QAAQ,CAAC,GAAG,IAAI;IACnF,MAAMV,GAAG,GAAGQ,IAAI,IAAIM,IAAI,GAAG,GAAGN,IAAI,CAACO,QAAQ,SAASP,IAAI,CAACQ,KAAK,SAASpB,aAAa,CAACkB,IAAI,CAAC,EAAE,GAAG,EAAE;IACjG,IAAId,GAAG,KAAK,IAAI,CAACA,GAAG,EAAE;IACtB,IAAI,CAACA,GAAG,GAAGA,GAAG;IACd,IAAI,CAACC,KAAK,EAAEA,KAAK,CAAC,CAAC;IACnB,IAAI,CAACA,KAAK,GAAG,IAAI;IACjB,IAAI,CAACO,IAAI,IAAI,CAACM,IAAI,EAAE;MAClB,IAAIL,QAAQ,CAACQ,MAAM,EAAE,IAAI,CAACb,IAAI,CAAC,IAAI,CAAC;MACpC;IACF;IACA,MAAMH,KAAK,GAAG,IAAIiB,eAAe,CAAC,CAAC;IACnC,IAAI,CAACjB,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACE,OAAO,CAACW,IAAI,EAAEN,IAAI,CAACO,QAAQ,EAAEd,KAAK,CAACkB,MAAM,CAAC,CAC5CC,IAAI,CACFH,MAAM,IAAK;MACV,IAAI,CAAChB,KAAK,CAACkB,MAAM,CAACE,OAAO,EAAE,IAAI,CAACjB,IAAI,CAACa,MAAM,CAAC;IAC9C,CAAC,EACAK,KAAK,IAAK;MACT,IAAI,CAACrB,KAAK,CAACkB,MAAM,CAACE,OAAO,EAAE,IAAI,CAAChB,IAAI,CAACiB,KAAK,CAAC;IAC7C,CACF,CAAC,CACAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;EACpB;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
type Color = "primary" | "secondary" | "tertiary" | "error";
|
|
2
|
+
/** The time to give `track` as the start of an entry. */
|
|
3
|
+
export declare function now(): number;
|
|
4
|
+
/** Adds an entry from `start` to now to one of the grid's tracks. */
|
|
5
|
+
export declare function track(label: string, start: number, lane: "requests" | "commands" | "canvas", color?: Color): void;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/core/trace.ts"],"names":[],"mappings":"AAgBA,KAAK,KAAK,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAc5D,yDAAyD;AACzD,wBAAgB,GAAG,IAAI,MAAM,CAE5B;AAED,qEAAqE;AACrE,wBAAgB,KAAK,CACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,QAAQ,EACxC,KAAK,GAAE,KAAiB,QAGzB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The grid's tracks in the Performance panel of Chrome's DevTools, next to React's (§9 of react.md):
|
|
3
|
+
* requests, commands and canvas frames, in development builds only. `console.timeStamp` costs little when
|
|
4
|
+
* nothing records.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Whether this is a development build: bundlers replace `process.env.NODE_ENV`, as they do for React. */
|
|
8
|
+
function development() {
|
|
9
|
+
try {
|
|
10
|
+
return process.env.NODE_ENV !== "production";
|
|
11
|
+
} catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const stamp = typeof console !== "undefined" && typeof console.timeStamp === "function" && development() ? console.timeStamp : null;
|
|
16
|
+
|
|
17
|
+
/** The time to give `track` as the start of an entry. */
|
|
18
|
+
export function now() {
|
|
19
|
+
return typeof performance === "undefined" ? 0 : performance.now();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Adds an entry from `start` to now to one of the grid's tracks. */
|
|
23
|
+
export function track(label, start, lane, color = "primary") {
|
|
24
|
+
stamp?.(label, start, now(), lane, "vastgrid", color);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["development","process","env","NODE_ENV","stamp","console","timeStamp","now","performance","track","label","start","lane","color"],"sources":["trace.ts"],"sourcesContent":["/**\n * The grid's tracks in the Performance panel of Chrome's DevTools, next to React's (§9 of react.md):\n * requests, commands and canvas frames, in development builds only. `console.timeStamp` costs little when\n * nothing records.\n */\ndeclare const process: { env: { NODE_ENV?: string } };\n\n/** Whether this is a development build: bundlers replace `process.env.NODE_ENV`, as they do for React. */\nfunction development(): boolean {\n try {\n return process.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n}\n\ntype Color = \"primary\" | \"secondary\" | \"tertiary\" | \"error\";\n\nconst stamp =\n typeof console !== \"undefined\" && typeof console.timeStamp === \"function\" && development()\n ? (console.timeStamp as unknown as (\n label: string,\n start: number,\n end: number,\n track: string,\n group: string,\n color: Color,\n ) => void)\n : null;\n\n/** The time to give `track` as the start of an entry. */\nexport function now(): number {\n return typeof performance === \"undefined\" ? 0 : performance.now();\n}\n\n/** Adds an entry from `start` to now to one of the grid's tracks. */\nexport function track(\n label: string,\n start: number,\n lane: \"requests\" | \"commands\" | \"canvas\",\n color: Color = \"primary\",\n) {\n stamp?.(label, start, now(), lane, \"vastgrid\", color);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;;AAGA;AACA,SAASA,WAAWA,CAAA,EAAY;EAC9B,IAAI;IACF,OAAOC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY;EAC9C,CAAC,CAAC,MAAM;IACN,OAAO,KAAK;EACd;AACF;AAIA,MAAMC,KAAK,GACT,OAAOC,OAAO,KAAK,WAAW,IAAI,OAAOA,OAAO,CAACC,SAAS,KAAK,UAAU,IAAIN,WAAW,CAAC,CAAC,GACrFK,OAAO,CAACC,SAAS,GAQlB,IAAI;;AAEV;AACA,OAAO,SAASC,GAAGA,CAAA,EAAW;EAC5B,OAAO,OAAOC,WAAW,KAAK,WAAW,GAAG,CAAC,GAAGA,WAAW,CAACD,GAAG,CAAC,CAAC;AACnE;;AAEA;AACA,OAAO,SAASE,KAAKA,CACnBC,KAAa,EACbC,KAAa,EACbC,IAAwC,EACxCC,KAAY,GAAG,SAAS,EACxB;EACAT,KAAK,GAAGM,KAAK,EAAEC,KAAK,EAAEJ,GAAG,CAAC,CAAC,EAAEK,IAAI,EAAE,UAAU,EAAEC,KAAK,CAAC;AACvD","ignoreList":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Transport } from "./client.js";
|
|
2
|
+
import type { RequestMessage } from "./types.js";
|
|
3
|
+
/** An engine in the same thread: it answers request messages, and may send events (§8.5). */
|
|
4
|
+
export interface Engine {
|
|
5
|
+
handle(message: unknown): Promise<unknown>;
|
|
6
|
+
subscribe?(listener: (event: unknown) => void): () => void;
|
|
7
|
+
}
|
|
8
|
+
/** Carries messages to an engine in the same thread, as function calls with blocks as bytes (§8.8). */
|
|
9
|
+
export declare function localTransport(engine: Engine): Transport;
|
|
10
|
+
/**
|
|
11
|
+
* The side of a worker that `workerTransport` talks to: `self` in a worker, a `MessagePort`, or anything that carries
|
|
12
|
+
* messages as they do (VS Code's webview, a notebook widget's messages).
|
|
13
|
+
*/
|
|
14
|
+
export interface WorkerLike {
|
|
15
|
+
postMessage(message: unknown, transfer?: Transferable[]): void;
|
|
16
|
+
addEventListener(type: "message", listener: (event: MessageEvent) => void): void;
|
|
17
|
+
removeEventListener(type: "message", listener: (event: MessageEvent) => void): void;
|
|
18
|
+
start?(): void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Carries messages to an engine in a Web Worker (or behind a `MessagePort`), which answers with
|
|
22
|
+
* `serveEngine`. Blocks travel as bytes and their buffers are transferred (§8.8).
|
|
23
|
+
*/
|
|
24
|
+
export declare function workerTransport(worker: WorkerLike): Transport & {
|
|
25
|
+
close(): void;
|
|
26
|
+
};
|
|
27
|
+
/** Answers the requests that `workerTransport` sends, in a worker (`serveEngine(engine, self)`). */
|
|
28
|
+
export declare function serveEngine(engine: Engine, scope: WorkerLike): () => void;
|
|
29
|
+
export interface HttpTransportOptions {
|
|
30
|
+
/** `fetch`, by default the global one. */
|
|
31
|
+
fetch?: typeof fetch;
|
|
32
|
+
/** Headers sent with every request, such as an authorization. */
|
|
33
|
+
headers?: Record<string, string>;
|
|
34
|
+
/** A URL of Server-Sent Events that carries the engine's events (§8.8). */
|
|
35
|
+
events?: string;
|
|
36
|
+
/** The URL under which exports without a target are downloaded; `<url>/exports/` by default. */
|
|
37
|
+
exports?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Carries messages over HTTP (§8.8): each request is a `POST` of its JSON, and the answers of `rows` and `export`
|
|
41
|
+
* come with their blocks attached. Aborting a request aborts its HTTP request.
|
|
42
|
+
*/
|
|
43
|
+
export declare function httpTransport(url: string, options?: HttpTransportOptions): Transport;
|
|
44
|
+
/**
|
|
45
|
+
* Carries messages through a Server Function (`"use server"`), which passes each to an engine on the server and
|
|
46
|
+
* returns its answer (§7 of react.md). The function receives what any client may send: it checks every
|
|
47
|
+
* request with `checkRequest`, as engines do.
|
|
48
|
+
*/
|
|
49
|
+
export declare function serverFunctionTransport(action: (request: RequestMessage) => Promise<unknown>): Transport;
|
|
50
|
+
//# sourceMappingURL=transports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transports.d.ts","sourceRoot":"","sources":["../../src/core/transports.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,6FAA6F;AAC7F,MAAM,WAAW,MAAM;IACrB,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CAC5D;AAED,uGAAuG;AACvG,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAOxD;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC/D,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;IACjF,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI,CAAC;IACpF,KAAK,CAAC,IAAI,IAAI,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG;IAAE,KAAK,IAAI,IAAI,CAAA;CAAE,CAwCjF;AAED,oGAAoG;AACpG,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,IAAI,CAgBzE;AAED,MAAM,WAAW,oBAAoB;IACnC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gGAAgG;IAChG,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,SAAS,CAwDxF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAExG"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { ARROW_MEDIA_TYPE, readAttached, toStructuredEncoding } from "vastgrid-spec";
|
|
2
|
+
|
|
3
|
+
/** An engine in the same thread: it answers request messages, and may send events (§8.5). */
|
|
4
|
+
|
|
5
|
+
/** Carries messages to an engine in the same thread, as function calls with blocks as bytes (§8.8). */
|
|
6
|
+
export function localTransport(engine) {
|
|
7
|
+
const transport = {
|
|
8
|
+
send: request => engine.handle(request)
|
|
9
|
+
};
|
|
10
|
+
if (engine.subscribe) {
|
|
11
|
+
const subscribe = engine.subscribe.bind(engine);
|
|
12
|
+
transport.subscribe = listener => subscribe(listener);
|
|
13
|
+
}
|
|
14
|
+
return transport;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The side of a worker that `workerTransport` talks to: `self` in a worker, a `MessagePort`, or anything that carries
|
|
19
|
+
* messages as they do (VS Code's webview, a notebook widget's messages).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Carries messages to an engine in a Web Worker (or behind a `MessagePort`), which answers with
|
|
24
|
+
* `serveEngine`. Blocks travel as bytes and their buffers are transferred (§8.8).
|
|
25
|
+
*/
|
|
26
|
+
export function workerTransport(worker) {
|
|
27
|
+
const waiting = new Map();
|
|
28
|
+
const listeners = new Set();
|
|
29
|
+
const receive = event => {
|
|
30
|
+
const data = event.data;
|
|
31
|
+
if (data === null || typeof data !== "object") return;
|
|
32
|
+
if (typeof data.event === "string") {
|
|
33
|
+
for (const listener of listeners) listener(data);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (typeof data.id !== "number") return;
|
|
37
|
+
const resolve = waiting.get(data.id);
|
|
38
|
+
waiting.delete(data.id);
|
|
39
|
+
resolve?.(data);
|
|
40
|
+
};
|
|
41
|
+
worker.addEventListener("message", receive);
|
|
42
|
+
worker.start?.();
|
|
43
|
+
return {
|
|
44
|
+
send(request) {
|
|
45
|
+
if (request.op === "cancel") {
|
|
46
|
+
worker.postMessage(request);
|
|
47
|
+
return Promise.resolve(undefined);
|
|
48
|
+
}
|
|
49
|
+
return new Promise(resolve => {
|
|
50
|
+
waiting.set(request.id, resolve);
|
|
51
|
+
worker.postMessage(request);
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
subscribe(listener) {
|
|
55
|
+
listeners.add(listener);
|
|
56
|
+
return () => {
|
|
57
|
+
listeners.delete(listener);
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
close() {
|
|
61
|
+
worker.removeEventListener("message", receive);
|
|
62
|
+
waiting.clear();
|
|
63
|
+
listeners.clear();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Answers the requests that `workerTransport` sends, in a worker (`serveEngine(engine, self)`). */
|
|
69
|
+
export function serveEngine(engine, scope) {
|
|
70
|
+
const receive = event => {
|
|
71
|
+
void engine.handle(event.data).then(response => {
|
|
72
|
+
if (response === undefined) return;
|
|
73
|
+
const block = response.result;
|
|
74
|
+
const bytes = block?.block?.bytes ?? block?.data?.bytes;
|
|
75
|
+
scope.postMessage(response, bytes instanceof Uint8Array ? [bytes.buffer] : []);
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
scope.addEventListener("message", receive);
|
|
79
|
+
scope.start?.();
|
|
80
|
+
const stop = engine.subscribe?.(event => scope.postMessage(event));
|
|
81
|
+
return () => {
|
|
82
|
+
scope.removeEventListener("message", receive);
|
|
83
|
+
stop?.();
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Carries messages over HTTP (§8.8): each request is a `POST` of its JSON, and the answers of `rows` and `export`
|
|
88
|
+
* come with their blocks attached. Aborting a request aborts its HTTP request.
|
|
89
|
+
*/
|
|
90
|
+
export function httpTransport(url, options = {}) {
|
|
91
|
+
const request = options.fetch ?? ((...args) => fetch(...args));
|
|
92
|
+
const exports = options.exports ?? `${url.replace(/\/+$/, "")}/exports/`;
|
|
93
|
+
// While the event stream connects, requests wait: an engine sends each event to the streams open at the time, so
|
|
94
|
+
// a table opened before would finish loading without the client hearing it.
|
|
95
|
+
let connecting = null;
|
|
96
|
+
const transport = {
|
|
97
|
+
cancels: "signal",
|
|
98
|
+
exportUrl: target => `${exports}${encodeURIComponent(target)}`,
|
|
99
|
+
async send(message, {
|
|
100
|
+
signal
|
|
101
|
+
}) {
|
|
102
|
+
if (connecting) await connecting;
|
|
103
|
+
const response = await request(url, {
|
|
104
|
+
method: "POST",
|
|
105
|
+
headers: {
|
|
106
|
+
"content-type": "application/json",
|
|
107
|
+
accept: `${ARROW_MEDIA_TYPE}, application/json`,
|
|
108
|
+
...options.headers
|
|
109
|
+
},
|
|
110
|
+
body: JSON.stringify(message),
|
|
111
|
+
signal
|
|
112
|
+
});
|
|
113
|
+
const type = response.headers.get("content-type") ?? "";
|
|
114
|
+
if (type.startsWith(ARROW_MEDIA_TYPE)) return readAttached(new Uint8Array(await response.arrayBuffer()));
|
|
115
|
+
return toStructuredEncoding(await response.json());
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const events = options.events;
|
|
119
|
+
if (events !== undefined) {
|
|
120
|
+
transport.subscribe = listener => {
|
|
121
|
+
const source = new EventSource(events);
|
|
122
|
+
let open = () => {};
|
|
123
|
+
const opening = new Promise(resolve => {
|
|
124
|
+
open = resolve;
|
|
125
|
+
});
|
|
126
|
+
connecting = opening;
|
|
127
|
+
// Open, or failed: a stream that cannot connect does not hold the requests back.
|
|
128
|
+
const settle = () => {
|
|
129
|
+
open();
|
|
130
|
+
if (connecting === opening) connecting = null;
|
|
131
|
+
};
|
|
132
|
+
source.onopen = settle;
|
|
133
|
+
source.onerror = settle;
|
|
134
|
+
source.onmessage = event => {
|
|
135
|
+
try {
|
|
136
|
+
listener(JSON.parse(event.data));
|
|
137
|
+
} catch {
|
|
138
|
+
// An event that is not JSON is not an event of §8.5.
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
return () => {
|
|
142
|
+
settle();
|
|
143
|
+
source.close();
|
|
144
|
+
};
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return transport;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Carries messages through a Server Function (`"use server"`), which passes each to an engine on the server and
|
|
152
|
+
* returns its answer (§7 of react.md). The function receives what any client may send: it checks every
|
|
153
|
+
* request with `checkRequest`, as engines do.
|
|
154
|
+
*/
|
|
155
|
+
export function serverFunctionTransport(action) {
|
|
156
|
+
return {
|
|
157
|
+
send: request => action(request)
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=transports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ARROW_MEDIA_TYPE","readAttached","toStructuredEncoding","localTransport","engine","transport","send","request","handle","subscribe","bind","listener","workerTransport","worker","waiting","Map","listeners","Set","receive","event","data","id","resolve","get","delete","addEventListener","start","op","postMessage","Promise","undefined","set","add","close","removeEventListener","clear","serveEngine","scope","then","response","block","result","bytes","Uint8Array","buffer","stop","httpTransport","url","options","fetch","args","exports","replace","connecting","cancels","exportUrl","target","encodeURIComponent","message","signal","method","headers","accept","body","JSON","stringify","type","startsWith","arrayBuffer","json","events","source","EventSource","open","opening","settle","onopen","onerror","onmessage","parse","serverFunctionTransport","action"],"sources":["transports.ts"],"sourcesContent":["import { ARROW_MEDIA_TYPE, readAttached, toStructuredEncoding } from \"vastgrid-spec\";\nimport type { Transport } from \"./client.js\";\nimport type { RequestMessage } from \"./types.js\";\n\n/** An engine in the same thread: it answers request messages, and may send events (§8.5). */\nexport interface Engine {\n handle(message: unknown): Promise<unknown>;\n subscribe?(listener: (event: unknown) => void): () => void;\n}\n\n/** Carries messages to an engine in the same thread, as function calls with blocks as bytes (§8.8). */\nexport function localTransport(engine: Engine): Transport {\n const transport: Transport = { send: (request) => engine.handle(request) };\n if (engine.subscribe) {\n const subscribe = engine.subscribe.bind(engine);\n transport.subscribe = (listener) => subscribe(listener);\n }\n return transport;\n}\n\n/**\n * The side of a worker that `workerTransport` talks to: `self` in a worker, a `MessagePort`, or anything that carries\n * messages as they do (VS Code's webview, a notebook widget's messages).\n */\nexport interface WorkerLike {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: \"message\", listener: (event: MessageEvent) => void): void;\n removeEventListener(type: \"message\", listener: (event: MessageEvent) => void): void;\n start?(): void;\n}\n\n/**\n * Carries messages to an engine in a Web Worker (or behind a `MessagePort`), which answers with\n * `serveEngine`. Blocks travel as bytes and their buffers are transferred (§8.8).\n */\nexport function workerTransport(worker: WorkerLike): Transport & { close(): void } {\n const waiting = new Map<number, (response: unknown) => void>();\n const listeners = new Set<(event: unknown) => void>();\n const receive = (event: MessageEvent) => {\n const data = event.data as { id?: unknown; event?: unknown } | null;\n if (data === null || typeof data !== \"object\") return;\n if (typeof data.event === \"string\") {\n for (const listener of listeners) listener(data);\n return;\n }\n if (typeof data.id !== \"number\") return;\n const resolve = waiting.get(data.id);\n waiting.delete(data.id);\n resolve?.(data);\n };\n worker.addEventListener(\"message\", receive);\n worker.start?.();\n return {\n send(request: RequestMessage) {\n if (request.op === \"cancel\") {\n worker.postMessage(request);\n return Promise.resolve(undefined);\n }\n return new Promise((resolve) => {\n waiting.set(request.id, resolve);\n worker.postMessage(request);\n });\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n close() {\n worker.removeEventListener(\"message\", receive);\n waiting.clear();\n listeners.clear();\n },\n };\n}\n\n/** Answers the requests that `workerTransport` sends, in a worker (`serveEngine(engine, self)`). */\nexport function serveEngine(engine: Engine, scope: WorkerLike): () => void {\n const receive = (event: MessageEvent) => {\n void engine.handle(event.data).then((response) => {\n if (response === undefined) return;\n const block = (response as { result?: { block?: { bytes?: unknown }; data?: { bytes?: unknown } } }).result;\n const bytes = block?.block?.bytes ?? block?.data?.bytes;\n scope.postMessage(response, bytes instanceof Uint8Array ? [bytes.buffer as ArrayBuffer] : []);\n });\n };\n scope.addEventListener(\"message\", receive);\n scope.start?.();\n const stop = engine.subscribe?.((event) => scope.postMessage(event));\n return () => {\n scope.removeEventListener(\"message\", receive);\n stop?.();\n };\n}\n\nexport interface HttpTransportOptions {\n /** `fetch`, by default the global one. */\n fetch?: typeof fetch;\n /** Headers sent with every request, such as an authorization. */\n headers?: Record<string, string>;\n /** A URL of Server-Sent Events that carries the engine's events (§8.8). */\n events?: string;\n /** The URL under which exports without a target are downloaded; `<url>/exports/` by default. */\n exports?: string;\n}\n\n/**\n * Carries messages over HTTP (§8.8): each request is a `POST` of its JSON, and the answers of `rows` and `export`\n * come with their blocks attached. Aborting a request aborts its HTTP request.\n */\nexport function httpTransport(url: string, options: HttpTransportOptions = {}): Transport {\n const request = options.fetch ?? ((...args: Parameters<typeof fetch>) => fetch(...args));\n const exports = options.exports ?? `${url.replace(/\\/+$/, \"\")}/exports/`;\n // While the event stream connects, requests wait: an engine sends each event to the streams open at the time, so\n // a table opened before would finish loading without the client hearing it.\n let connecting: Promise<void> | null = null;\n const transport: Transport = {\n cancels: \"signal\",\n exportUrl: (target) => `${exports}${encodeURIComponent(target)}`,\n async send(message, { signal }) {\n if (connecting) await connecting;\n const response = await request(url, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: `${ARROW_MEDIA_TYPE}, application/json`,\n ...options.headers,\n },\n body: JSON.stringify(message),\n signal,\n });\n const type = response.headers.get(\"content-type\") ?? \"\";\n if (type.startsWith(ARROW_MEDIA_TYPE)) return readAttached(new Uint8Array(await response.arrayBuffer()));\n return toStructuredEncoding((await response.json()) as Record<string, unknown>);\n },\n };\n const events = options.events;\n if (events !== undefined) {\n transport.subscribe = (listener) => {\n const source = new EventSource(events);\n let open = () => {};\n const opening = new Promise<void>((resolve) => {\n open = resolve;\n });\n connecting = opening;\n // Open, or failed: a stream that cannot connect does not hold the requests back.\n const settle = () => {\n open();\n if (connecting === opening) connecting = null;\n };\n source.onopen = settle;\n source.onerror = settle;\n source.onmessage = (event) => {\n try {\n listener(JSON.parse(event.data as string));\n } catch {\n // An event that is not JSON is not an event of §8.5.\n }\n };\n return () => {\n settle();\n source.close();\n };\n };\n }\n return transport;\n}\n\n/**\n * Carries messages through a Server Function (`\"use server\"`), which passes each to an engine on the server and\n * returns its answer (§7 of react.md). The function receives what any client may send: it checks every\n * request with `checkRequest`, as engines do.\n */\nexport function serverFunctionTransport(action: (request: RequestMessage) => Promise<unknown>): Transport {\n return { send: (request) => action(request) };\n}\n"],"mappings":"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","ignoreList":[]}
|