vastgrid 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas/geometry.d.ts.map +1 -1
- package/dist/canvas/geometry.js +4 -1
- package/dist/canvas/geometry.js.map +1 -1
- package/dist/core/format.d.ts.map +1 -1
- package/dist/core/format.js +4 -1
- package/dist/core/format.js.map +1 -1
- package/dist/react/grid-body.d.ts +2 -0
- package/dist/react/grid-body.d.ts.map +1 -1
- package/dist/react/grid-body.js +3 -4
- package/dist/react/grid-body.js.map +1 -1
- package/package.json +3 -3
- package/src/canvas/geometry.ts +6 -1
- package/src/core/format.ts +4 -3
- package/src/react/grid-body.tsx +3 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/canvas/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,4FAA4F;AAC5F,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,mFAAmF;AACnF,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,yCAAyC;AACzC,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjE,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,OAAO,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,QAAQ;IACnB,QAAQ,CAAC,OAAO,aAAoB;IACpC,QAAQ,CAAC,OAAO,aAAoB;IACpC,KAAK,SAAK;IACV,MAAM,SAAK;IACX,SAAS,SAAM;IACf,YAAY,SAAM;IAClB,8FAA8F;IAC9F,UAAU,SAAM;IAChB,WAAW,SAAM;IACjB,6CAA6C;IAC7C,SAAS,SAAK;IACd,wFAAwF;IACxF,UAAU,EAAE,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAM;IAC3D,WAAW,SAAM;IACjB,uDAAuD;IACvD,UAAU,UAAS;IACnB,gGAAgG;IAChG,MAAM,SAAK;IACX,sCAAsC;IACtC,QAAQ,SAAK;IACb,gEAAgE;IAChE,MAAM,eAAwB;IAC9B,0EAA0E;IAC1E,UAAU,SAAK;IACf,WAAW,SAAK;IAEhB,2EAA2E;IAC3E,IAAI,QAAQ,WAEX;IAED,+BAA+B;IAC/B,MAAM,WAEL;IAED,sCAAsC;IACtC,WAAW,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAM9B;IAED,yDAAyD;IACzD,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,UAAU,WAEb;IAED,IAAI,gBAAgB,WAEnB;IAED,0FAA0F;IAC1F,oBAAoB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAYvC;IAED,6DAA6D;IAC7D,OAAO,CAAC,MAAM,EAAE,MAAM,UAMrB;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,UAEf;IAED,uCAAuC;IACvC,WAAW,CAAC,MAAM,EAAE,MAAM,UAEzB;IAED;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAUjH;IAED,qEAAqE;IACrE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/canvas/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,4FAA4F;AAC5F,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,mFAAmF;AACnF,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,yCAAyC;AACzC,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjE,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,IAAI,EAAE,OAAO,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,qBAAa,QAAQ;IACnB,QAAQ,CAAC,OAAO,aAAoB;IACpC,QAAQ,CAAC,OAAO,aAAoB;IACpC,KAAK,SAAK;IACV,MAAM,SAAK;IACX,SAAS,SAAM;IACf,YAAY,SAAM;IAClB,8FAA8F;IAC9F,UAAU,SAAM;IAChB,WAAW,SAAM;IACjB,6CAA6C;IAC7C,SAAS,SAAK;IACd,wFAAwF;IACxF,UAAU,EAAE,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAM;IAC3D,WAAW,SAAM;IACjB,uDAAuD;IACvD,UAAU,UAAS;IACnB,gGAAgG;IAChG,MAAM,SAAK;IACX,sCAAsC;IACtC,QAAQ,SAAK;IACb,gEAAgE;IAChE,MAAM,eAAwB;IAC9B,0EAA0E;IAC1E,UAAU,SAAK;IACf,WAAW,SAAK;IAEhB,2EAA2E;IAC3E,IAAI,QAAQ,WAEX;IAED,+BAA+B;IAC/B,MAAM,WAEL;IAED,sCAAsC;IACtC,WAAW,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAM9B;IAED,yDAAyD;IACzD,IAAI,MAAM,WAET;IAED,IAAI,WAAW,WAEd;IAED,IAAI,UAAU,WAEb;IAED,IAAI,gBAAgB,WAEnB;IAED,0FAA0F;IAC1F,oBAAoB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAYvC;IAED,6DAA6D;IAC7D,OAAO,CAAC,MAAM,EAAE,MAAM,UAMrB;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,UAEf;IAED,uCAAuC;IACvC,WAAW,CAAC,MAAM,EAAE,MAAM,UAEzB;IAED;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAUjH;IAED,qEAAqE;IACrE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,CA2C7B;IAED,uFAAuF;IACvF,QAAQ,CAAC,CAAC,EAAE,MAAM,UAUjB;CACF"}
|
package/dist/canvas/geometry.js
CHANGED
|
@@ -137,7 +137,10 @@ export class Geometry {
|
|
|
137
137
|
};
|
|
138
138
|
if (x < 0 || y < 0 || x > this.width || y > this.height || y >= this.bottom) return none;
|
|
139
139
|
const row = Math.max(0, Math.min(rowCount - 1, Math.floor((y - this.headerHeight + this.scrollY.position) / this.rowHeight)));
|
|
140
|
+
// Below the last row, the gutter and the cells are empty.
|
|
141
|
+
const empty = y >= this.headerHeight && (rowCount === 0 || y - this.headerHeight + this.scrollY.position >= rowCount * this.rowHeight);
|
|
140
142
|
if (x < this.gutterWidth) {
|
|
143
|
+
if (empty) return none;
|
|
141
144
|
return {
|
|
142
145
|
area: y < this.headerHeight ? "corner" : "gutter",
|
|
143
146
|
row,
|
|
@@ -171,7 +174,7 @@ export class Geometry {
|
|
|
171
174
|
menu: !edge && x >= right - MENU_WIDTH - 4
|
|
172
175
|
};
|
|
173
176
|
}
|
|
174
|
-
if (
|
|
177
|
+
if (empty) return none;
|
|
175
178
|
return {
|
|
176
179
|
area: "cell",
|
|
177
180
|
row,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ColumnLayout","ScrollAxis","CHECK_WIDTH","MENU_WIDTH","Geometry","scrollX","scrollY","width","height","rowHeight","headerHeight","nameHeight","groupHeight","groupRows","groupPaths","gutterWidth","checkboxes","footer","rowCount","layout","frozenLeft","frozenRight","groupTop","topRow","Math","max","floor","position","visibleRows","body","bottom","first","min","last","ceil","frozenWidth","left","rightStart","count","frozenRightWidth","total","visibleScrollColumns","start","end","indexAt","columnX","column","rowY","row","columnWidth","cellBox","top","scrolls","from","to","shown","hit","x","y","none","area","edge","menu","check","columnAt","right","abs","level","rightX","local"],"sources":["geometry.ts"],"sourcesContent":["import { ColumnLayout } from \"./layout.js\";\nimport { ScrollAxis } from \"./scroll.js\";\n\n/** The width of the check boxes at the left of the gutter (§5.2.1 of the specification). */\nexport const CHECK_WIDTH = 24;\n/** The width of the button at the right of a header that opens the column menu. */\nexport const MENU_WIDTH = 16;\n\n/** What is under a point of the grid. */\nexport interface Hit {\n area: \"cell\" | \"header\" | \"group\" | \"gutter\" | \"corner\" | \"none\";\n /** A view position, for cells and the gutter; clamped to the rows. */\n row: number;\n /** A display position, for cells and headers. */\n column: number;\n /** Within a few pixels of the right edge of a header, where dragging resizes the column. */\n edge: boolean;\n /** On the button of a header that opens the column menu. */\n menu: boolean;\n /** On the check box of a row (the gutter) or of every row (the corner). */\n check?: boolean;\n /** For a group header: its row of groups, from the top. */\n level?: number;\n}\n\n/**\n * Where the parts of the grid are on the canvas (§6 of react.md): the rows of groups and the column names at the\n * top, the gutter at the left, the rows, the totals row at the bottom, and the columns pinned at each side with those\n * that scroll between them. The canvas lays it out and draws with it; React places what it puts over the canvas\n * with it.\n */\nexport class Geometry {\n readonly scrollX = new ScrollAxis();\n readonly scrollY = new ScrollAxis();\n width = 0;\n height = 0;\n rowHeight = 24;\n headerHeight = 32;\n /** The height of the row of column names; `headerHeight` adds the rows of groups above it. */\n nameHeight = 32;\n groupHeight = 24;\n /** Rows of groups above the column names. */\n groupRows = 0;\n /** By display position: its group in each row of groups (an id and a name), or null. */\n groupPaths: ({ id: number; name: string } | null)[][] = [];\n gutterWidth = 48;\n /** Whether the gutter has a check box for each row. */\n checkboxes = false;\n /** The height of the totals row at the bottom (§5.1 of the specification), 0 without totals. */\n footer = 0;\n /** The rows of the view on screen. */\n rowCount = 0;\n /** The widths of the displayed columns, by display position. */\n layout = new ColumnLayout([]);\n /** How many displayed columns are pinned at the left and at the right. */\n frozenLeft = 0;\n frozenRight = 0;\n\n /** The top of the row of column names: the rows of groups are above it. */\n get groupTop() {\n return this.groupRows * this.groupHeight;\n }\n\n /** The first row on screen. */\n topRow() {\n return Math.max(0, Math.floor(this.scrollY.position / this.rowHeight));\n }\n\n /** Rows on screen `[first, last)`. */\n visibleRows(): [number, number] {\n const rowCount = this.rowCount;\n const body = Math.max(0, this.bottom - this.headerHeight);\n const first = Math.min(rowCount, this.topRow());\n const last = Math.min(rowCount, Math.ceil((this.scrollY.position + body) / this.rowHeight));\n return [first, Math.max(first, last)];\n }\n\n /** The bottom of the rows: the top of the totals row. */\n get bottom() {\n return this.height - this.footer;\n }\n\n get frozenWidth() {\n return this.layout.left(this.frozenLeft);\n }\n\n get rightStart() {\n return this.layout.count - this.frozenRight;\n }\n\n get frozenRightWidth() {\n return this.layout.total - this.layout.left(this.rightStart);\n }\n\n /** Display positions `[first, last]` of the scrolling columns on screen, or `[0, -1]`. */\n visibleScrollColumns(): [number, number] {\n const rightStart = this.rightStart;\n if (rightStart <= this.frozenLeft) return [0, -1];\n const start = this.frozenWidth + this.scrollX.position;\n const end = Math.min(\n this.scrollX.position + this.width - this.gutterWidth - this.frozenRightWidth,\n this.layout.left(rightStart),\n );\n if (start >= this.layout.left(rightStart) || end <= start) return [0, -1];\n const first = Math.max(this.frozenLeft, this.layout.indexAt(start));\n const last = Math.min(rightStart - 1, this.layout.indexAt(Math.max(start, end - 0.001)));\n return [first, last];\n }\n\n /** The x of a displayed column's left edge on the canvas. */\n columnX(column: number) {\n if (column < this.frozenLeft) return this.gutterWidth + this.layout.left(column);\n if (column >= this.rightStart) {\n return this.width - this.frozenRightWidth + this.layout.left(column) - this.layout.left(this.rightStart);\n }\n return this.gutterWidth + this.layout.left(column) - this.scrollX.position;\n }\n\n rowY(row: number) {\n return this.headerHeight + row * this.rowHeight - this.scrollY.position;\n }\n\n /** The width of a displayed column. */\n columnWidth(column: number) {\n return this.layout.width(column);\n }\n\n /**\n * Where a cell is, in the body's coordinates, and whether it is on screen: outside the header and the gutter,\n * and for a scrolling column, between the columns pinned at each side.\n */\n cellBox(row: number, column: number): { left: number; top: number; width: number; height: number; shown: boolean } {\n const left = this.columnX(column);\n const top = this.rowY(row);\n const width = this.layout.width(column);\n const height = this.rowHeight;\n const scrolls = column >= this.frozenLeft && column < this.rightStart;\n const from = scrolls ? this.gutterWidth + this.frozenWidth : this.gutterWidth;\n const to = scrolls ? this.width - this.frozenRightWidth : this.width;\n const shown = top + height > this.headerHeight && top < this.bottom && left + width > from && left < to;\n return { left, top, width, height, shown };\n }\n\n /** What is at a point given in the scroller's client coordinates. */\n hit(x: number, y: number): Hit {\n const rowCount = this.rowCount;\n const none: Hit = { area: \"none\", row: 0, column: 0, edge: false, menu: false };\n if (x < 0 || y < 0 || x > this.width || y > this.height || y >= this.bottom) return none;\n const row = Math.max(\n 0,\n Math.min(rowCount - 1, Math.floor((y - this.headerHeight + this.scrollY.position) / this.rowHeight)),\n );\n if (x < this.gutterWidth) {\n return {\n area: y < this.headerHeight ? \"corner\" : \"gutter\",\n row,\n column: 0,\n edge: false,\n menu: false,\n check: this.checkboxes && x < CHECK_WIDTH,\n };\n }\n const column = this.columnAt(x);\n if (column < 0) return none;\n const right = this.columnX(column) + this.layout.width(column);\n const edge = Math.abs(x - right) <= 4;\n if (y < this.groupTop) {\n const level = Math.floor(y / this.groupHeight);\n return {\n area: this.groupPaths[column]?.[level] ? \"group\" : \"none\",\n row: 0,\n column,\n edge: false,\n menu: false,\n level,\n };\n }\n if (y < this.headerHeight) {\n return { area: \"header\", row: 0, column, edge, menu: !edge && x >= right - MENU_WIDTH - 4 };\n }\n if (rowCount === 0 || y - this.headerHeight + this.scrollY.position >= rowCount * this.rowHeight) return none;\n return { area: \"cell\", row, column, edge: false, menu: false };\n }\n\n /** The display position of the column at an x of the canvas; -1 when there is none. */\n columnAt(x: number) {\n if (this.layout.count === 0) return -1;\n const rightX = this.width - this.frozenRightWidth;\n if (this.frozenRight > 0 && x >= rightX) {\n return Math.max(this.rightStart, this.layout.indexAt(this.layout.left(this.rightStart) + x - rightX));\n }\n const local = x - this.gutterWidth;\n if (this.frozenLeft > 0 && local < this.frozenWidth) return this.layout.indexAt(local);\n const column = this.layout.indexAt(local + this.scrollX.position);\n return Math.min(column, this.rightStart - 1);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["ColumnLayout","ScrollAxis","CHECK_WIDTH","MENU_WIDTH","Geometry","scrollX","scrollY","width","height","rowHeight","headerHeight","nameHeight","groupHeight","groupRows","groupPaths","gutterWidth","checkboxes","footer","rowCount","layout","frozenLeft","frozenRight","groupTop","topRow","Math","max","floor","position","visibleRows","body","bottom","first","min","last","ceil","frozenWidth","left","rightStart","count","frozenRightWidth","total","visibleScrollColumns","start","end","indexAt","columnX","column","rowY","row","columnWidth","cellBox","top","scrolls","from","to","shown","hit","x","y","none","area","edge","menu","empty","check","columnAt","right","abs","level","rightX","local"],"sources":["geometry.ts"],"sourcesContent":["import { ColumnLayout } from \"./layout.js\";\nimport { ScrollAxis } from \"./scroll.js\";\n\n/** The width of the check boxes at the left of the gutter (§5.2.1 of the specification). */\nexport const CHECK_WIDTH = 24;\n/** The width of the button at the right of a header that opens the column menu. */\nexport const MENU_WIDTH = 16;\n\n/** What is under a point of the grid. */\nexport interface Hit {\n area: \"cell\" | \"header\" | \"group\" | \"gutter\" | \"corner\" | \"none\";\n /** A view position, for cells and the gutter; clamped to the rows. */\n row: number;\n /** A display position, for cells and headers. */\n column: number;\n /** Within a few pixels of the right edge of a header, where dragging resizes the column. */\n edge: boolean;\n /** On the button of a header that opens the column menu. */\n menu: boolean;\n /** On the check box of a row (the gutter) or of every row (the corner). */\n check?: boolean;\n /** For a group header: its row of groups, from the top. */\n level?: number;\n}\n\n/**\n * Where the parts of the grid are on the canvas (§6 of react.md): the rows of groups and the column names at the\n * top, the gutter at the left, the rows, the totals row at the bottom, and the columns pinned at each side with those\n * that scroll between them. The canvas lays it out and draws with it; React places what it puts over the canvas\n * with it.\n */\nexport class Geometry {\n readonly scrollX = new ScrollAxis();\n readonly scrollY = new ScrollAxis();\n width = 0;\n height = 0;\n rowHeight = 24;\n headerHeight = 32;\n /** The height of the row of column names; `headerHeight` adds the rows of groups above it. */\n nameHeight = 32;\n groupHeight = 24;\n /** Rows of groups above the column names. */\n groupRows = 0;\n /** By display position: its group in each row of groups (an id and a name), or null. */\n groupPaths: ({ id: number; name: string } | null)[][] = [];\n gutterWidth = 48;\n /** Whether the gutter has a check box for each row. */\n checkboxes = false;\n /** The height of the totals row at the bottom (§5.1 of the specification), 0 without totals. */\n footer = 0;\n /** The rows of the view on screen. */\n rowCount = 0;\n /** The widths of the displayed columns, by display position. */\n layout = new ColumnLayout([]);\n /** How many displayed columns are pinned at the left and at the right. */\n frozenLeft = 0;\n frozenRight = 0;\n\n /** The top of the row of column names: the rows of groups are above it. */\n get groupTop() {\n return this.groupRows * this.groupHeight;\n }\n\n /** The first row on screen. */\n topRow() {\n return Math.max(0, Math.floor(this.scrollY.position / this.rowHeight));\n }\n\n /** Rows on screen `[first, last)`. */\n visibleRows(): [number, number] {\n const rowCount = this.rowCount;\n const body = Math.max(0, this.bottom - this.headerHeight);\n const first = Math.min(rowCount, this.topRow());\n const last = Math.min(rowCount, Math.ceil((this.scrollY.position + body) / this.rowHeight));\n return [first, Math.max(first, last)];\n }\n\n /** The bottom of the rows: the top of the totals row. */\n get bottom() {\n return this.height - this.footer;\n }\n\n get frozenWidth() {\n return this.layout.left(this.frozenLeft);\n }\n\n get rightStart() {\n return this.layout.count - this.frozenRight;\n }\n\n get frozenRightWidth() {\n return this.layout.total - this.layout.left(this.rightStart);\n }\n\n /** Display positions `[first, last]` of the scrolling columns on screen, or `[0, -1]`. */\n visibleScrollColumns(): [number, number] {\n const rightStart = this.rightStart;\n if (rightStart <= this.frozenLeft) return [0, -1];\n const start = this.frozenWidth + this.scrollX.position;\n const end = Math.min(\n this.scrollX.position + this.width - this.gutterWidth - this.frozenRightWidth,\n this.layout.left(rightStart),\n );\n if (start >= this.layout.left(rightStart) || end <= start) return [0, -1];\n const first = Math.max(this.frozenLeft, this.layout.indexAt(start));\n const last = Math.min(rightStart - 1, this.layout.indexAt(Math.max(start, end - 0.001)));\n return [first, last];\n }\n\n /** The x of a displayed column's left edge on the canvas. */\n columnX(column: number) {\n if (column < this.frozenLeft) return this.gutterWidth + this.layout.left(column);\n if (column >= this.rightStart) {\n return this.width - this.frozenRightWidth + this.layout.left(column) - this.layout.left(this.rightStart);\n }\n return this.gutterWidth + this.layout.left(column) - this.scrollX.position;\n }\n\n rowY(row: number) {\n return this.headerHeight + row * this.rowHeight - this.scrollY.position;\n }\n\n /** The width of a displayed column. */\n columnWidth(column: number) {\n return this.layout.width(column);\n }\n\n /**\n * Where a cell is, in the body's coordinates, and whether it is on screen: outside the header and the gutter,\n * and for a scrolling column, between the columns pinned at each side.\n */\n cellBox(row: number, column: number): { left: number; top: number; width: number; height: number; shown: boolean } {\n const left = this.columnX(column);\n const top = this.rowY(row);\n const width = this.layout.width(column);\n const height = this.rowHeight;\n const scrolls = column >= this.frozenLeft && column < this.rightStart;\n const from = scrolls ? this.gutterWidth + this.frozenWidth : this.gutterWidth;\n const to = scrolls ? this.width - this.frozenRightWidth : this.width;\n const shown = top + height > this.headerHeight && top < this.bottom && left + width > from && left < to;\n return { left, top, width, height, shown };\n }\n\n /** What is at a point given in the scroller's client coordinates. */\n hit(x: number, y: number): Hit {\n const rowCount = this.rowCount;\n const none: Hit = { area: \"none\", row: 0, column: 0, edge: false, menu: false };\n if (x < 0 || y < 0 || x > this.width || y > this.height || y >= this.bottom) return none;\n const row = Math.max(\n 0,\n Math.min(rowCount - 1, Math.floor((y - this.headerHeight + this.scrollY.position) / this.rowHeight)),\n );\n // Below the last row, the gutter and the cells are empty.\n const empty =\n y >= this.headerHeight &&\n (rowCount === 0 || y - this.headerHeight + this.scrollY.position >= rowCount * this.rowHeight);\n if (x < this.gutterWidth) {\n if (empty) return none;\n return {\n area: y < this.headerHeight ? \"corner\" : \"gutter\",\n row,\n column: 0,\n edge: false,\n menu: false,\n check: this.checkboxes && x < CHECK_WIDTH,\n };\n }\n const column = this.columnAt(x);\n if (column < 0) return none;\n const right = this.columnX(column) + this.layout.width(column);\n const edge = Math.abs(x - right) <= 4;\n if (y < this.groupTop) {\n const level = Math.floor(y / this.groupHeight);\n return {\n area: this.groupPaths[column]?.[level] ? \"group\" : \"none\",\n row: 0,\n column,\n edge: false,\n menu: false,\n level,\n };\n }\n if (y < this.headerHeight) {\n return { area: \"header\", row: 0, column, edge, menu: !edge && x >= right - MENU_WIDTH - 4 };\n }\n if (empty) return none;\n return { area: \"cell\", row, column, edge: false, menu: false };\n }\n\n /** The display position of the column at an x of the canvas; -1 when there is none. */\n columnAt(x: number) {\n if (this.layout.count === 0) return -1;\n const rightX = this.width - this.frozenRightWidth;\n if (this.frozenRight > 0 && x >= rightX) {\n return Math.max(this.rightStart, this.layout.indexAt(this.layout.left(this.rightStart) + x - rightX));\n }\n const local = x - this.gutterWidth;\n if (this.frozenLeft > 0 && local < this.frozenWidth) return this.layout.indexAt(local);\n const column = this.layout.indexAt(local + this.scrollX.position);\n return Math.min(column, this.rightStart - 1);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/core/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAc,SAAS,EAAgB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/core/format.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAc,SAAS,EAAgB,MAAM,eAAe,CAAC;AAyQ/F,sCAAsC;AACtC,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,WAEvC;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,CAAC,CAAC,KAAK,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAwB9C"}
|
package/dist/core/format.js
CHANGED
|
@@ -232,7 +232,10 @@ function dateFormatter(locale, format) {
|
|
|
232
232
|
part = String(shown.second);
|
|
233
233
|
break;
|
|
234
234
|
default:
|
|
235
|
-
|
|
235
|
+
if (token.startsWith("S")) part = shown.fraction.slice(0, token.length).padEnd(token.length, "0");
|
|
236
|
+
// Text in quotes, with a doubled quote for a quote; two quotes alone are a quote too, as in the
|
|
237
|
+
// Excel export.
|
|
238
|
+
else part = token === "''" ? "'" : token.slice(1, -1).replaceAll("''", "'");
|
|
236
239
|
}
|
|
237
240
|
text += part + texts[index + 1];
|
|
238
241
|
});
|
package/dist/core/format.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["decimalLiteral","numberInput","value","Number","isFinite","text","trim","test","numberFormatter","locale","format","grouping","style","currency","RangeError","options","useGrouping","minimumFractionDigits","fractionDigits","maximumFractionDigits","currencyDisplay","notation","signDisplay","undefined","Math","min","Intl","NumberFormat","resolvedOptions","intl","prefix","suffix","isoDateTime","isoTime","parseOffset","toUpperCase","sign","startsWith","digits","slice","replace","parseDate","date","exec","year","month","day","hour","minute","second","fraction","offset","hasDate","hasTime","time","wallClock","parts","Date","setUTCFullYear","setUTCHours","padEnd","patternToken","dateFormatter","pattern","timeZone","DateTimeFormat","custom","Object","keys","length","formats","Map","key","make","item","get","set","local","instant","getTime","fields","hourCycle","era","formatToParts","field","type","find","part","bc","tokens","match","texts","split","name","pad","String","padStart","shown","forEach","token","index","abs","weekday","hour12","replaceAll","zone","shape","defaults","assign","isNumeric","column","TEMPORAL","Set","formatterFor","number","has","error","input"],"sources":["format.ts"],"sourcesContent":["/**\n * How cells show their values with the `number` and `date` of a column's format (§5.1 of the specification): 0.1's\n * `NumberFormat` and `DateFormat`, ported from `vastgrid-core` (Intl formats, with the exact digits of decimals,\n * and date patterns such as `yyyy/MM/dd`).\n */\nimport type { Column, ColumnFormat, DateFormat, JsonValue, NumberFormat } from \"vastgrid-spec\";\n\nconst decimalLiteral = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * A value as input for `Intl.NumberFormat`, or null when it is not a finite number. Numeric strings\n * stay strings, which `Intl.NumberFormat` formats from their exact digits.\n */\nfunction numberInput(value: JsonValue): number | string | null {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value !== \"string\") return null;\n const text = value.trim();\n return decimalLiteral.test(text) ? text : null;\n}\n\nfunction numberFormatter(locale: string | undefined, format: NumberFormat, grouping: boolean) {\n const style = format.style ?? \"decimal\";\n if (style === \"currency\" && !format.currency) throw new RangeError(\"A currency format needs `currency`.\");\n const options: Intl.NumberFormatOptions = {\n style,\n useGrouping: format.grouping ?? grouping,\n minimumFractionDigits: format.fractionDigits ?? format.minimumFractionDigits,\n maximumFractionDigits: format.fractionDigits ?? format.maximumFractionDigits,\n };\n if (style === \"currency\") {\n options.currency = format.currency;\n if (format.currencyDisplay) options.currencyDisplay = format.currencyDisplay;\n }\n if (format.notation) options.notation = format.notation;\n if (format.signDisplay) options.signDisplay = format.signDisplay;\n // A maximum below the style's default minimum (2 for USD, 0 for percent) lowers the minimum too.\n if (options.maximumFractionDigits !== undefined && options.minimumFractionDigits === undefined) {\n options.minimumFractionDigits = Math.min(\n options.maximumFractionDigits,\n new Intl.NumberFormat(locale, { ...options, maximumFractionDigits: undefined }).resolvedOptions()\n .minimumFractionDigits ?? 0,\n );\n }\n const intl = new Intl.NumberFormat(locale, options);\n const prefix = format.prefix ?? \"\";\n const suffix = format.suffix ?? \"\";\n // `format` takes exact decimal strings (Intl.NumberFormat v3); the types only list numbers.\n return (value: number | string) => `${prefix}${intl.format(value as number)}${suffix}`;\n}\n\n/** The parts of an ISO-like date, time or timestamp. */\ninterface DateParts {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n /** Fraction digits of the second, as written. */\n fraction: string;\n hasDate: boolean;\n hasTime: boolean;\n /** Offset from UTC in minutes, for values with one. */\n offset: number | null;\n}\n\nconst isoDateTime =\n /^([+-]?\\d{4,})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?)?\\s*(Z|[+-]\\d{2}(?::?\\d{2})?)?$/i;\nconst isoTime = /^(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?$/;\n\nfunction parseOffset(text: string | undefined) {\n if (!text) return null;\n if (text.toUpperCase() === \"Z\") return 0;\n const sign = text.startsWith(\"-\") ? -1 : 1;\n const digits = text.slice(1).replace(\":\", \"\");\n return sign * (Number(digits.slice(0, 2)) * 60 + Number(digits.slice(2) || 0));\n}\n\nfunction parseDate(text: string): DateParts | null {\n const date = isoDateTime.exec(text.trim());\n if (date) {\n const [, year, month, day, hour, minute, second, fraction, offset] = date;\n return {\n year: Number(year),\n month: Number(month),\n day: Number(day),\n hour: Number(hour ?? 0),\n minute: Number(minute ?? 0),\n second: Number(second ?? 0),\n fraction: fraction ?? \"\",\n hasDate: true,\n hasTime: hour !== undefined,\n offset: parseOffset(offset),\n };\n }\n const time = isoTime.exec(text.trim());\n if (!time) return null;\n const [, hour, minute, second, fraction] = time;\n return {\n year: 1970,\n month: 1,\n day: 1,\n hour: Number(hour),\n minute: Number(minute),\n second: Number(second ?? 0),\n fraction: fraction ?? \"\",\n hasDate: false,\n hasTime: true,\n offset: null,\n };\n}\n\n/** The UTC time of the parts' wall clock (ignoring their offset). Years below 100 are kept. */\nfunction wallClock(parts: DateParts) {\n const date = new Date(0);\n date.setUTCFullYear(parts.year, parts.month - 1, parts.day);\n date.setUTCHours(parts.hour, parts.minute, parts.second, Number(parts.fraction.slice(0, 3).padEnd(3, \"0\")));\n return date;\n}\n\nconst patternToken = /'(?:[^']|'')*'|yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE|HH|H|hh|h|mm|m|ss|s|S+|a/g;\n\nfunction dateFormatter(locale: string | undefined, format: DateFormat) {\n const { pattern, timeZone, ...options } = format;\n // Checks the time zone and the options now, not on the first value.\n new Intl.DateTimeFormat(locale, { ...options, timeZone });\n const custom = Object.keys(options).length > 0;\n const formats = new Map<string, Intl.DateTimeFormat>();\n const intl = (key: string, make: () => Intl.DateTimeFormat) => {\n let item = formats.get(key);\n if (!item) {\n item = make();\n formats.set(key, item);\n }\n return item;\n };\n /** The parts in the shown time zone: values with an offset move to `timeZone`. */\n const local = (parts: DateParts): DateParts => {\n if (parts.offset === null) return parts;\n const instant = new Date(wallClock(parts).getTime() - parts.offset * 60_000);\n const fields = intl(\n \"parts\",\n () =>\n new Intl.DateTimeFormat(\"en-US-u-nu-latn\", {\n timeZone,\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n hourCycle: \"h23\",\n era: \"short\",\n }),\n ).formatToParts(instant);\n const field = (type: string) => Number(fields.find((part) => part.type === type)?.value ?? 0);\n const bc = fields.find((part) => part.type === \"era\")?.value.startsWith(\"B\");\n return {\n ...parts,\n year: bc ? 1 - field(\"year\") : field(\"year\"),\n month: field(\"month\"),\n day: field(\"day\"),\n hour: field(\"hour\"),\n minute: field(\"minute\"),\n second: field(\"second\"),\n offset: null,\n };\n };\n\n if (pattern !== undefined) {\n const tokens = pattern.match(patternToken) ?? [];\n const texts = pattern.split(patternToken);\n const name = (key: string, options: Intl.DateTimeFormatOptions, date: Date) =>\n intl(key, () => new Intl.DateTimeFormat(locale, { ...options, timeZone: \"UTC\" })).format(date);\n const pad = (value: number, length: number) =>\n value < 0 ? `-${String(-value).padStart(length, \"0\")}` : String(value).padStart(length, \"0\");\n return (parts: DateParts) => {\n const shown = local(parts);\n const date = wallClock(shown);\n let text = texts[0];\n tokens.forEach((token, index) => {\n let part: string;\n switch (token) {\n case \"yyyy\":\n part = pad(shown.year, 4);\n break;\n case \"yy\":\n part = pad(Math.abs(shown.year) % 100, 2);\n break;\n case \"MMMM\":\n part = name(\"MMMM\", { month: \"long\" }, date);\n break;\n case \"MMM\":\n part = name(\"MMM\", { month: \"short\" }, date);\n break;\n case \"MM\":\n part = pad(shown.month, 2);\n break;\n case \"M\":\n part = String(shown.month);\n break;\n case \"dd\":\n part = pad(shown.day, 2);\n break;\n case \"d\":\n part = String(shown.day);\n break;\n case \"EEEE\":\n part = name(\"EEEE\", { weekday: \"long\" }, date);\n break;\n case \"EEE\":\n part = name(\"EEE\", { weekday: \"short\" }, date);\n break;\n case \"HH\":\n part = pad(shown.hour, 2);\n break;\n case \"H\":\n part = String(shown.hour);\n break;\n case \"hh\":\n part = pad(shown.hour % 12 || 12, 2);\n break;\n case \"h\":\n part = String(shown.hour % 12 || 12);\n break;\n case \"a\":\n part =\n intl(\"a\", () => new Intl.DateTimeFormat(locale, { hour: \"numeric\", hour12: true, timeZone: \"UTC\" }))\n .formatToParts(date)\n .find((item) => item.type === \"dayPeriod\")?.value ?? (shown.hour < 12 ? \"AM\" : \"PM\");\n break;\n case \"mm\":\n part = pad(shown.minute, 2);\n break;\n case \"m\":\n part = String(shown.minute);\n break;\n case \"ss\":\n part = pad(shown.second, 2);\n break;\n case \"s\":\n part = String(shown.second);\n break;\n default:\n part = token.startsWith(\"S\")\n ? shown.fraction.slice(0, token.length).padEnd(token.length, \"0\")\n : token.slice(1, -1).replaceAll(\"''\", \"'\");\n }\n text += part + texts[index + 1];\n });\n return text;\n };\n }\n\n return (parts: DateParts) => {\n const zone = parts.offset !== null ? \"z\" : \"\";\n const shape = custom ? `custom${zone}` : `${parts.hasDate ? \"d\" : \"\"}${parts.hasTime ? \"t\" : \"\"}${zone}`;\n const item = intl(shape, () => {\n const defaults: Intl.DateTimeFormatOptions = custom ? options : {};\n if (!custom && parts.hasDate) Object.assign(defaults, { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" });\n if (!custom && parts.hasTime) Object.assign(defaults, { hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\" });\n // Values without an offset are wall-clock times: show them as they are.\n return new Intl.DateTimeFormat(locale, { ...defaults, timeZone: parts.offset !== null ? timeZone : \"UTC\" });\n });\n const time = wallClock(parts).getTime() - (parts.offset ?? 0) * 60_000;\n return item.format(time);\n };\n}\n\n/** Whether a column holds numbers. */\nexport function isNumeric(column: Column) {\n return column.type === \"integer\" || column.type === \"bigint\" || column.type === \"decimal\" || column.type === \"float\";\n}\n\nconst TEMPORAL = new Set([\"date\", \"time\", \"timestamp\", \"timestamptz\"]);\n\n/**\n * The text of values of a column by its format, or null where the format says nothing about a value (the grid then\n * shows its text form, §2.4). Formats that Intl refuses (an unknown currency or time zone) give null for every value.\n */\nexport function formatterFor(\n column: Column,\n format: ColumnFormat | undefined,\n locale: string | undefined,\n): ((value: JsonValue) => string | null) | null {\n if (!format?.number && !format?.date) return null;\n let number: ((value: number | string) => string) | null = null;\n let date: ((parts: DateParts) => string) | null = null;\n try {\n if (format.number && isNumeric(column)) number = numberFormatter(locale, format.number, true);\n if (format.date && TEMPORAL.has(column.type)) date = dateFormatter(locale, format.date);\n } catch (error) {\n if (error instanceof RangeError) return null;\n throw error;\n }\n if (!number && !date) return null;\n return (value) => {\n if (value === null) return null;\n if (number) {\n const input = numberInput(value);\n return input === null ? null : number(input);\n }\n if (date && typeof value === \"string\") {\n const parts = parseDate(value.replace(/\\+00$/, \"Z\"));\n return parts ? date(parts) : null;\n }\n return null;\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["decimalLiteral","numberInput","value","Number","isFinite","text","trim","test","numberFormatter","locale","format","grouping","style","currency","RangeError","options","useGrouping","minimumFractionDigits","fractionDigits","maximumFractionDigits","currencyDisplay","notation","signDisplay","undefined","Math","min","Intl","NumberFormat","resolvedOptions","intl","prefix","suffix","isoDateTime","isoTime","parseOffset","toUpperCase","sign","startsWith","digits","slice","replace","parseDate","date","exec","year","month","day","hour","minute","second","fraction","offset","hasDate","hasTime","time","wallClock","parts","Date","setUTCFullYear","setUTCHours","padEnd","patternToken","dateFormatter","pattern","timeZone","DateTimeFormat","custom","Object","keys","length","formats","Map","key","make","item","get","set","local","instant","getTime","fields","hourCycle","era","formatToParts","field","type","find","part","bc","tokens","match","texts","split","name","pad","String","padStart","shown","forEach","token","index","abs","weekday","hour12","replaceAll","zone","shape","defaults","assign","isNumeric","column","TEMPORAL","Set","formatterFor","number","has","error","input"],"sources":["format.ts"],"sourcesContent":["/**\n * How cells show their values with the `number` and `date` of a column's format (§5.1 of the specification): 0.1's\n * `NumberFormat` and `DateFormat`, ported from `vastgrid-core` (Intl formats, with the exact digits of decimals,\n * and date patterns such as `yyyy/MM/dd`).\n */\nimport type { Column, ColumnFormat, DateFormat, JsonValue, NumberFormat } from \"vastgrid-spec\";\n\nconst decimalLiteral = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * A value as input for `Intl.NumberFormat`, or null when it is not a finite number. Numeric strings\n * stay strings, which `Intl.NumberFormat` formats from their exact digits.\n */\nfunction numberInput(value: JsonValue): number | string | null {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : null;\n if (typeof value !== \"string\") return null;\n const text = value.trim();\n return decimalLiteral.test(text) ? text : null;\n}\n\nfunction numberFormatter(locale: string | undefined, format: NumberFormat, grouping: boolean) {\n const style = format.style ?? \"decimal\";\n if (style === \"currency\" && !format.currency) throw new RangeError(\"A currency format needs `currency`.\");\n const options: Intl.NumberFormatOptions = {\n style,\n useGrouping: format.grouping ?? grouping,\n minimumFractionDigits: format.fractionDigits ?? format.minimumFractionDigits,\n maximumFractionDigits: format.fractionDigits ?? format.maximumFractionDigits,\n };\n if (style === \"currency\") {\n options.currency = format.currency;\n if (format.currencyDisplay) options.currencyDisplay = format.currencyDisplay;\n }\n if (format.notation) options.notation = format.notation;\n if (format.signDisplay) options.signDisplay = format.signDisplay;\n // A maximum below the style's default minimum (2 for USD, 0 for percent) lowers the minimum too.\n if (options.maximumFractionDigits !== undefined && options.minimumFractionDigits === undefined) {\n options.minimumFractionDigits = Math.min(\n options.maximumFractionDigits,\n new Intl.NumberFormat(locale, { ...options, maximumFractionDigits: undefined }).resolvedOptions()\n .minimumFractionDigits ?? 0,\n );\n }\n const intl = new Intl.NumberFormat(locale, options);\n const prefix = format.prefix ?? \"\";\n const suffix = format.suffix ?? \"\";\n // `format` takes exact decimal strings (Intl.NumberFormat v3); the types only list numbers.\n return (value: number | string) => `${prefix}${intl.format(value as number)}${suffix}`;\n}\n\n/** The parts of an ISO-like date, time or timestamp. */\ninterface DateParts {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n /** Fraction digits of the second, as written. */\n fraction: string;\n hasDate: boolean;\n hasTime: boolean;\n /** Offset from UTC in minutes, for values with one. */\n offset: number | null;\n}\n\nconst isoDateTime =\n /^([+-]?\\d{4,})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?)?\\s*(Z|[+-]\\d{2}(?::?\\d{2})?)?$/i;\nconst isoTime = /^(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?$/;\n\nfunction parseOffset(text: string | undefined) {\n if (!text) return null;\n if (text.toUpperCase() === \"Z\") return 0;\n const sign = text.startsWith(\"-\") ? -1 : 1;\n const digits = text.slice(1).replace(\":\", \"\");\n return sign * (Number(digits.slice(0, 2)) * 60 + Number(digits.slice(2) || 0));\n}\n\nfunction parseDate(text: string): DateParts | null {\n const date = isoDateTime.exec(text.trim());\n if (date) {\n const [, year, month, day, hour, minute, second, fraction, offset] = date;\n return {\n year: Number(year),\n month: Number(month),\n day: Number(day),\n hour: Number(hour ?? 0),\n minute: Number(minute ?? 0),\n second: Number(second ?? 0),\n fraction: fraction ?? \"\",\n hasDate: true,\n hasTime: hour !== undefined,\n offset: parseOffset(offset),\n };\n }\n const time = isoTime.exec(text.trim());\n if (!time) return null;\n const [, hour, minute, second, fraction] = time;\n return {\n year: 1970,\n month: 1,\n day: 1,\n hour: Number(hour),\n minute: Number(minute),\n second: Number(second ?? 0),\n fraction: fraction ?? \"\",\n hasDate: false,\n hasTime: true,\n offset: null,\n };\n}\n\n/** The UTC time of the parts' wall clock (ignoring their offset). Years below 100 are kept. */\nfunction wallClock(parts: DateParts) {\n const date = new Date(0);\n date.setUTCFullYear(parts.year, parts.month - 1, parts.day);\n date.setUTCHours(parts.hour, parts.minute, parts.second, Number(parts.fraction.slice(0, 3).padEnd(3, \"0\")));\n return date;\n}\n\nconst patternToken = /'(?:[^']|'')*'|yyyy|yy|MMMM|MMM|MM|M|dd|d|EEEE|EEE|HH|H|hh|h|mm|m|ss|s|S+|a/g;\n\nfunction dateFormatter(locale: string | undefined, format: DateFormat) {\n const { pattern, timeZone, ...options } = format;\n // Checks the time zone and the options now, not on the first value.\n new Intl.DateTimeFormat(locale, { ...options, timeZone });\n const custom = Object.keys(options).length > 0;\n const formats = new Map<string, Intl.DateTimeFormat>();\n const intl = (key: string, make: () => Intl.DateTimeFormat) => {\n let item = formats.get(key);\n if (!item) {\n item = make();\n formats.set(key, item);\n }\n return item;\n };\n /** The parts in the shown time zone: values with an offset move to `timeZone`. */\n const local = (parts: DateParts): DateParts => {\n if (parts.offset === null) return parts;\n const instant = new Date(wallClock(parts).getTime() - parts.offset * 60_000);\n const fields = intl(\n \"parts\",\n () =>\n new Intl.DateTimeFormat(\"en-US-u-nu-latn\", {\n timeZone,\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"numeric\",\n second: \"numeric\",\n hourCycle: \"h23\",\n era: \"short\",\n }),\n ).formatToParts(instant);\n const field = (type: string) => Number(fields.find((part) => part.type === type)?.value ?? 0);\n const bc = fields.find((part) => part.type === \"era\")?.value.startsWith(\"B\");\n return {\n ...parts,\n year: bc ? 1 - field(\"year\") : field(\"year\"),\n month: field(\"month\"),\n day: field(\"day\"),\n hour: field(\"hour\"),\n minute: field(\"minute\"),\n second: field(\"second\"),\n offset: null,\n };\n };\n\n if (pattern !== undefined) {\n const tokens = pattern.match(patternToken) ?? [];\n const texts = pattern.split(patternToken);\n const name = (key: string, options: Intl.DateTimeFormatOptions, date: Date) =>\n intl(key, () => new Intl.DateTimeFormat(locale, { ...options, timeZone: \"UTC\" })).format(date);\n const pad = (value: number, length: number) =>\n value < 0 ? `-${String(-value).padStart(length, \"0\")}` : String(value).padStart(length, \"0\");\n return (parts: DateParts) => {\n const shown = local(parts);\n const date = wallClock(shown);\n let text = texts[0];\n tokens.forEach((token, index) => {\n let part: string;\n switch (token) {\n case \"yyyy\":\n part = pad(shown.year, 4);\n break;\n case \"yy\":\n part = pad(Math.abs(shown.year) % 100, 2);\n break;\n case \"MMMM\":\n part = name(\"MMMM\", { month: \"long\" }, date);\n break;\n case \"MMM\":\n part = name(\"MMM\", { month: \"short\" }, date);\n break;\n case \"MM\":\n part = pad(shown.month, 2);\n break;\n case \"M\":\n part = String(shown.month);\n break;\n case \"dd\":\n part = pad(shown.day, 2);\n break;\n case \"d\":\n part = String(shown.day);\n break;\n case \"EEEE\":\n part = name(\"EEEE\", { weekday: \"long\" }, date);\n break;\n case \"EEE\":\n part = name(\"EEE\", { weekday: \"short\" }, date);\n break;\n case \"HH\":\n part = pad(shown.hour, 2);\n break;\n case \"H\":\n part = String(shown.hour);\n break;\n case \"hh\":\n part = pad(shown.hour % 12 || 12, 2);\n break;\n case \"h\":\n part = String(shown.hour % 12 || 12);\n break;\n case \"a\":\n part =\n intl(\"a\", () => new Intl.DateTimeFormat(locale, { hour: \"numeric\", hour12: true, timeZone: \"UTC\" }))\n .formatToParts(date)\n .find((item) => item.type === \"dayPeriod\")?.value ?? (shown.hour < 12 ? \"AM\" : \"PM\");\n break;\n case \"mm\":\n part = pad(shown.minute, 2);\n break;\n case \"m\":\n part = String(shown.minute);\n break;\n case \"ss\":\n part = pad(shown.second, 2);\n break;\n case \"s\":\n part = String(shown.second);\n break;\n default:\n if (token.startsWith(\"S\")) part = shown.fraction.slice(0, token.length).padEnd(token.length, \"0\");\n // Text in quotes, with a doubled quote for a quote; two quotes alone are a quote too, as in the\n // Excel export.\n else part = token === \"''\" ? \"'\" : token.slice(1, -1).replaceAll(\"''\", \"'\");\n }\n text += part + texts[index + 1];\n });\n return text;\n };\n }\n\n return (parts: DateParts) => {\n const zone = parts.offset !== null ? \"z\" : \"\";\n const shape = custom ? `custom${zone}` : `${parts.hasDate ? \"d\" : \"\"}${parts.hasTime ? \"t\" : \"\"}${zone}`;\n const item = intl(shape, () => {\n const defaults: Intl.DateTimeFormatOptions = custom ? options : {};\n if (!custom && parts.hasDate) Object.assign(defaults, { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" });\n if (!custom && parts.hasTime) Object.assign(defaults, { hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\" });\n // Values without an offset are wall-clock times: show them as they are.\n return new Intl.DateTimeFormat(locale, { ...defaults, timeZone: parts.offset !== null ? timeZone : \"UTC\" });\n });\n const time = wallClock(parts).getTime() - (parts.offset ?? 0) * 60_000;\n return item.format(time);\n };\n}\n\n/** Whether a column holds numbers. */\nexport function isNumeric(column: Column) {\n return column.type === \"integer\" || column.type === \"bigint\" || column.type === \"decimal\" || column.type === \"float\";\n}\n\nconst TEMPORAL = new Set([\"date\", \"time\", \"timestamp\", \"timestamptz\"]);\n\n/**\n * The text of values of a column by its format, or null where the format says nothing about a value (the grid then\n * shows its text form, §2.4). Formats that Intl refuses (an unknown currency or time zone) give null for every value.\n */\nexport function formatterFor(\n column: Column,\n format: ColumnFormat | undefined,\n locale: string | undefined,\n): ((value: JsonValue) => string | null) | null {\n if (!format?.number && !format?.date) return null;\n let number: ((value: number | string) => string) | null = null;\n let date: ((parts: DateParts) => string) | null = null;\n try {\n if (format.number && isNumeric(column)) number = numberFormatter(locale, format.number, true);\n if (format.date && TEMPORAL.has(column.type)) date = dateFormatter(locale, format.date);\n } catch (error) {\n if (error instanceof RangeError) return null;\n throw error;\n }\n if (!number && !date) return null;\n return (value) => {\n if (value === null) return null;\n if (number) {\n const input = numberInput(value);\n return input === null ? null : number(input);\n }\n if (date && typeof value === \"string\") {\n const parts = parseDate(value.replace(/\\+00$/, \"Z\"));\n return parts ? date(parts) : null;\n }\n return null;\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type RefObject } from "react";
|
|
2
2
|
import { type RowKey } from "vastgrid-spec";
|
|
3
3
|
import type { CellAction, CellHooks, ColumnGroup, GridCell } from "../canvas/hooks.js";
|
|
4
|
+
/** The cells of a copy: its TSV's fields. */
|
|
5
|
+
export declare function countCells(output: unknown): number;
|
|
4
6
|
/** A click or Space on a cell that is a link or a button (`cellAction`). */
|
|
5
7
|
export interface CellActionEvent extends GridCell {
|
|
6
8
|
action: CellAction;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grid-body.d.ts","sourceRoot":"","sources":["../../src/react/grid-body.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EASf,MAAM,OAAO,CAAC;AAEf,OAAO,
|
|
1
|
+
{"version":3,"file":"grid-body.d.ts","sourceRoot":"","sources":["../../src/react/grid-body.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EASf,MAAM,OAAO,CAAC;AAEf,OAAO,EAA4C,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAGtF,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA4HvF,6CAA6C;AAC7C,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,UAGzC;AAED,4EAA4E;AAC5E,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC/C,MAAM,EAAE,UAAU,CAAC;IACnB,yDAAyD;IACzD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAChD,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,WAAW,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EACvB,SAAS,EACT,YAAY,EACZ,UAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,KAAK,EACL,YAAY,EACZ,MAAM,EACN,KAAK,EACL,WAAW,EACX,QAAQ,GACT,EAAE,aAAa,+BAsiBf"}
|
package/dist/react/grid-body.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { c as _c } from "react/compiler-runtime";
|
|
2
2
|
import { lazy, Suspense, use, useEffect, useEffectEvent, useId, useLayoutEffect, useRef, useState } from "react";
|
|
3
3
|
import { browser } from "react-dom";
|
|
4
|
-
import { CommandError } from "vastgrid-spec";
|
|
4
|
+
import { CommandError, parseTsv } from "vastgrid-spec";
|
|
5
5
|
import { GridCanvas } from "../canvas/grid-canvas.js";
|
|
6
6
|
import { isApple, keyCommand, typesText } from "../canvas/keys.js";
|
|
7
7
|
import { allState, checkedCount, checkState } from "../core/checked.js";
|
|
@@ -170,12 +170,11 @@ function useClipboard(store, scroller, announce) {
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
/** The cells of a copy: its TSV's fields. */
|
|
173
|
-
function countCells(output) {
|
|
173
|
+
export function countCells(output) {
|
|
174
174
|
const {
|
|
175
175
|
tsv
|
|
176
176
|
} = output;
|
|
177
|
-
|
|
178
|
-
return tsv.split("\n").reduce((count, line) => count + line.split("\t").length, 0);
|
|
177
|
+
return parseTsv(tsv).reduce((count, row) => count + row.length, 0);
|
|
179
178
|
}
|
|
180
179
|
|
|
181
180
|
/** A click or Space on a cell that is a link or a button (`cellAction`). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["lazy","Suspense","use","useEffect","useEffectEvent","useId","useLayoutEffect","useRef","useState","browser","CommandError","GridCanvas","isApple","keyCommand","typesText","allState","checkedCount","checkState","AccessibleRows","cellId","CellEditor","LocaleContext","SaveContext","useGridSelector","useGridStore","jsx","_jsx","jsxs","_jsxs","ColumnMenu","then","module","default","CellMenu","pick","event","key","shiftKey","altKey","ctrlKey","metaKey","writeClipboard","data","output","tsv","html","setData","writeClipboardLater","clipboard","navigator","undefined","ClipboardItem","write","Blob","type","writeText","useClipboard","store","scroller","announce","$","_c","messages","number","t0","failure","copied","format","countCells","failed","report","t1","current","element","onBeforeCopy","document","activeElement","preventDefault","onCopy","event_0","clipboardData","outcome","dispatchSync","command","ok","error","reason","message","dispatch","later","addEventListener","onPaste","event_1","text","getData","outcome_0","removeEventListener","t2","split","reduce","count","line","length","GridBody","rowHeight","headerHeight","checkboxes","columnGroups","groupHeaderHeight","wrapLines","hooks","onCellAction","onFind","label","scrollerRef","canvas","geometry","rootRef","canvasRef","sizerRef","drag","editor","locale","saving","follow","id","rowCount","_temp","columns","_temp2","busy","_temp3","active","_temp4","menu","setMenu","totalsRow","_temp6","pressed","cellMenu","setCellMenu","t3","t4","setSizes","t5","t6","setLocale","t7","t8","setCheckboxes","t10","t9","setWrapLines","t11","t12","setColumnGroups","cellText","cellStyle","drawCell","cellAction","t13","t14","setHooks","t15","t16","root","sizer","detach","attach","draw","cancelAnimationFrame","frame","point","_temp7","t17","column","getSnapshot","displayed","name","nameOf","onPointerDown","onPointerMove","onPointerUp","toggleCheck","buttons","button","scroller_0","currentTarget","x","y","clientWidth","clientHeight","focus","preventScroll","hit","primary","mode","start","kind","last","t18","extra","pointer","pointerId","width","clientX","setPointerCapture","area","column_0","row","check","session","view","all","checked","plan","dispatchCheck","level","span","groupSpan","from","to","names","slice","map","_temp8","String","column_1","edge","columnWidth","movedWith","shift","t19","scroller_1","x_0","y_0","hit_0","Math","max","gutterWidth","min","bottom","column_2","key_0","anchor","extendTo","t20","Symbol","for","stopFollowing","t21","scroller_2","x_1","y_1","beyondY","beyondX","state","step","current_0","dy","dx","scrollTop","sign","abs","scrollLeft","requestAnimationFrame","followPointer","current_1","x_2","y_2","hit_1","action","actionAt","style","cursor","previewWidth","moving","target","dropAt","before","previewDrop","t22","event_2","current_2","releasePointerCapture","add","name_0","round","checkedUnknown","session_0","document_0","view_0","checkedRows","key_1","rowKey","session_1","document_1","state_0","keys","name_1","last_0","selection","at","rows","includes","_temp9","filter","item_2","item","x_3","names_0","columnAt","middle","columnX","index","moved","name_2","findIndex","item_3","every","item_4","i","lineX","column_3","index_0","scroller_3","rect_0","getBoundingClientRect","rect","left","top","openMenu","act","onClick","event_3","rect_1","hit_2","clientY","column_4","row_0","column_5","found","cell","onContextMenu","event_4","rect_2","hit_3","column_6","at_0","open","isSelected","row_1","column_7","active_0","some","range","Error","copySelection","scroller_4","active_1","index_1","item_5","box","cellBox","rect_3","height","openCellMenu","closeCellMenu","closeMenu","onDoubleClick","startEditing","event_5","rect_4","hit_4","name_3","outcome_1","readOnly","t23","event_6","composing","nativeEvent","isComposing","keyCode","active_2","column_8","item_6","table","capabilities","find","open_0","detail","column_9","index_2","item_7","command_0","save","onKeyDown","t24","t25","t26","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","activeColumn","item_8","activeRow","activeShown","className","t37","t38","t39","role","tabIndex","children","t40","t41","fallback","t42","t43","item_1","item_0","snapshot_3","snapshot","aggregate","_temp5","setting","total","snapshot_2","snapshot_1","pending","snapshot_0"],"sources":["grid-body.tsx"],"sourcesContent":["import {\n type KeyboardEvent,\n lazy,\n type MouseEvent,\n type PointerEvent,\n type RefObject,\n Suspense,\n use,\n useEffect,\n useEffectEvent,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { browser } from \"react-dom\";\nimport { CommandError, type GridCommand, type RowKey } from \"vastgrid-spec\";\nimport type { Hit } from \"../canvas/geometry.js\";\nimport { GridCanvas } from \"../canvas/grid-canvas.js\";\nimport type { CellAction, CellHooks, ColumnGroup, GridCell } from \"../canvas/hooks.js\";\nimport { isApple, type KeyInput, keyCommand, typesText } from \"../canvas/keys.js\";\nimport { allState, checkedCount, checkState } from \"../core/checked.js\";\nimport type { GridStore } from \"../core/store.js\";\nimport { AccessibleRows, cellId } from \"./accessible-rows.js\";\nimport { CellEditor, type EditorControl } from \"./cell-editor.js\";\nimport type { CellMenuTarget } from \"./cell-menu.js\";\nimport type { MenuTarget } from \"./column-menu.js\";\nimport { LocaleContext, SaveContext } from \"./context.js\";\nimport { useGridSelector, useGridStore } from \"./hooks.js\";\n\n// The menus load when they first open (§10 of react.md).\nconst ColumnMenu = lazy(() => import(\"./column-menu.js\").then((module) => ({ default: module.ColumnMenu })));\nconst CellMenu = lazy(() => import(\"./cell-menu.js\").then((module) => ({ default: module.CellMenu })));\n\ninterface Drag {\n kind: \"cells\" | \"rows\" | \"resize\" | \"move\";\n pointer: number;\n /** The last cell or row the pointer was over, so that moves within it dispatch nothing. */\n last: string;\n /** For a resize: the column, its width and the pointer's x when the drag started. */\n column: number;\n width: number;\n x: number;\n /** For a move: the columns dragged, whether the pointer moved enough to drag, and where they would go. */\n names?: string[];\n moving?: boolean;\n before?: string | null;\n /** Shift was held when a header was pressed: a click adds a sort key. */\n shift?: boolean;\n}\n\n/** The members of a keyboard event that the grid's keys read. */\nfunction pick(event: KeyInput): KeyInput {\n return {\n key: event.key,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n };\n}\n\n/** Writes the output of `copy` (§6.6) into a clipboard. */\nfunction writeClipboard(data: DataTransfer, output: unknown) {\n const { tsv, html } = output as { tsv: string; html: string };\n data.setData(\"text/plain\", tsv);\n data.setData(\"text/html\", html);\n}\n\nasync function writeClipboardLater(output: unknown) {\n const { tsv, html } = output as { tsv: string; html: string };\n const clipboard = typeof navigator === \"undefined\" ? undefined : navigator.clipboard;\n if (!clipboard) return;\n if (typeof ClipboardItem === \"function\" && clipboard.write) {\n await clipboard.write([\n new ClipboardItem({\n \"text/plain\": new Blob([tsv], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n }),\n ]);\n } else {\n await clipboard.writeText(tsv);\n }\n}\n\n/** Copies the selection: at once when its rows are read, after reading them otherwise. */\nfunction useClipboard(store: GridStore, scroller: RefObject<HTMLDivElement | null>, announce: (text: string) => void) {\n const { messages, number } = use(LocaleContext);\n const report = useEffectEvent((output: unknown, failure: string | null) => {\n announce(failure === null ? messages.copied(number.format(countCells(output))) : messages.failed(failure));\n });\n useEffect(() => {\n const element = scroller.current;\n if (!element) return;\n // Without selected text, browsers disable copying unless \"beforecopy\" is cancelled.\n const onBeforeCopy = (event: Event) => {\n if (document.activeElement === element) event.preventDefault();\n };\n const onCopy = (event: ClipboardEvent) => {\n if (document.activeElement !== element || !event.clipboardData) return;\n event.preventDefault();\n const outcome = store.dispatchSync({ command: \"copy\" });\n if (outcome.ok) {\n writeClipboard(event.clipboardData, outcome.output);\n report(outcome.output, null);\n return;\n }\n if (!(outcome.error instanceof CommandError) || outcome.error.reason !== \"not_loaded\") {\n report(null, outcome.error.message);\n return;\n }\n // The rows are read first; the clipboard is then written through the asynchronous API.\n void store.dispatch({ command: \"copy\" }).then(async (later) => {\n if (!later.ok) {\n report(null, later.error.message);\n return;\n }\n await writeClipboardLater(later.output);\n report(later.output, null);\n });\n };\n document.addEventListener(\"beforecopy\", onBeforeCopy);\n // Pasting writes the clipboard into the selection (§6.5.1).\n const onPaste = (event: ClipboardEvent) => {\n if (document.activeElement !== element || !event.clipboardData) return;\n event.preventDefault();\n const text = event.clipboardData.getData(\"text/plain\");\n const html = event.clipboardData.getData(\"text/html\");\n const clipboard = text ? { text } : html ? { html } : {};\n void store.dispatch({ command: \"edit.paste\" }, { clipboard }).then((outcome) => {\n if (!outcome.ok) report(null, outcome.error.message);\n });\n };\n document.addEventListener(\"copy\", onCopy);\n document.addEventListener(\"paste\", onPaste);\n return () => {\n document.removeEventListener(\"beforecopy\", onBeforeCopy);\n document.removeEventListener(\"copy\", onCopy);\n document.removeEventListener(\"paste\", onPaste);\n };\n }, [store, scroller]);\n}\n\n/** The cells of a copy: its TSV's fields. */\nfunction countCells(output: unknown) {\n const { tsv } = output as { tsv: string };\n if (tsv === \"\") return 0;\n return tsv.split(\"\\n\").reduce((count, line) => count + line.split(\"\\t\").length, 0);\n}\n\n/** A click or Space on a cell that is a link or a button (`cellAction`). */\nexport interface CellActionEvent extends GridCell {\n action: CellAction;\n /** The key of the cell's row (§5.3), when it is read. */\n key: RowKey | undefined;\n}\n\nexport interface GridBodyProps {\n rowHeight?: number;\n headerHeight?: number;\n /** A check box for each row in the gutter (§5.2.1 of the specification). */\n checkboxes?: boolean;\n columnGroups?: readonly ColumnGroup[];\n groupHeaderHeight?: number;\n wrapLines?: number;\n hooks: CellHooks;\n onCellAction?: (event: CellActionEvent) => void;\n /** Opens the find bar (⌘F or Ctrl+F). */\n onFind?: () => void;\n label: string;\n /** Receives the scroller, which has the focus of the grid. */\n scrollerRef: RefObject<HTMLDivElement | null>;\n announce: (text: string) => void;\n}\n\n/**\n * The canvas and the scroller over it (§6 of react.md): keys and pointers become commands, the canvas draws\n * the store without rendering React, and the accessibility rows follow when scrolling pauses. Rendered only in\n * the browser: on the server, the nearest Suspense boundary sends its fallback, the first rows as HTML.\n */\nexport function GridBody({\n rowHeight,\n headerHeight,\n checkboxes = false,\n columnGroups,\n groupHeaderHeight,\n wrapLines,\n hooks,\n onCellAction,\n onFind,\n label,\n scrollerRef,\n announce,\n}: GridBodyProps) {\n use(browser(\"The grid draws on a canvas, which only the browser has.\"));\n const store = useGridStore();\n const [canvas] = useState(() => new GridCanvas({ rowHeight, headerHeight }));\n const { geometry } = canvas;\n const rootRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const sizerRef = useRef<HTMLDivElement>(null);\n const drag = useRef<Drag | null>(null);\n const editor = useRef<EditorControl>(null);\n const { messages, locale, number } = use(LocaleContext);\n const saving = use(SaveContext);\n const follow = useRef<{ frame: number; x: number; y: number } | null>(null);\n const id = useId();\n const rowCount = useGridSelector((snapshot) => snapshot.view?.rowCount ?? 0);\n const columns = useGridSelector((snapshot) => snapshot.displayed);\n const busy = useGridSelector((snapshot) => snapshot.view === null || snapshot.pending !== null);\n const active = useGridSelector((snapshot) => snapshot.session.active);\n const [menu, setMenu] = useState<MenuTarget | null>(null);\n const totalsRow = useGridSelector(\n (snapshot) =>\n !snapshot.document.plan?.aggregate && snapshot.displayed.some((item) => item.setting.total !== undefined),\n );\n const pressed = useRef(false);\n const later = useRef<(() => void) | null>(null);\n const [cellMenu, setCellMenu] = useState<CellMenuTarget | null>(null);\n\n useLayoutEffect(() => {\n canvas.setSizes(rowHeight, headerHeight);\n }, [canvas, rowHeight, headerHeight]);\n\n useLayoutEffect(() => {\n canvas.setLocale(locale);\n }, [canvas, locale]);\n\n useLayoutEffect(() => {\n canvas.setCheckboxes(checkboxes);\n }, [canvas, checkboxes]);\n\n useLayoutEffect(() => {\n canvas.setWrapLines(wrapLines);\n }, [canvas, wrapLines]);\n\n useLayoutEffect(() => {\n canvas.setColumnGroups(columnGroups, groupHeaderHeight);\n }, [canvas, columnGroups, groupHeaderHeight]);\n\n const { cellText, cellStyle, drawCell, cellAction } = hooks;\n useLayoutEffect(() => {\n canvas.setHooks({ cellText, cellStyle, drawCell, cellAction });\n }, [canvas, cellText, cellStyle, drawCell, cellAction]);\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n const element = canvasRef.current;\n const scroller = scrollerRef.current;\n const sizer = sizerRef.current;\n if (!root || !element || !scroller || !sizer) return;\n const detach = canvas.attach({ root, canvas: element, scroller, sizer }, store);\n // The first frame is drawn before the browser paints, with the rows the store already has.\n canvas.draw();\n return () => {\n if (follow.current) cancelAnimationFrame(follow.current.frame);\n follow.current = null;\n detach();\n };\n }, [canvas, store, scrollerRef]);\n\n useClipboard(store, scrollerRef, announce);\n\n const point = (event: PointerEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const nameOf = (column: number) => store.getSnapshot().displayed[column]?.column.name;\n\n const onPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n pressed.current = event.buttons !== 0;\n if (event.button !== 0) return;\n const scroller = event.currentTarget;\n const { x, y } = point(event);\n // Clicks on the scroll bars scroll.\n if (x > scroller.clientWidth || y > scroller.clientHeight) return;\n scroller.focus({ preventScroll: true });\n event.preventDefault();\n const hit: Hit = geometry.hit(x, y);\n const primary = isApple() ? event.metaKey : event.ctrlKey;\n const mode = event.shiftKey ? \"extend\" : primary ? \"add\" : \"replace\";\n const start = (kind: Drag[\"kind\"], last: string, extra: Partial<Drag> = {}) => {\n drag.current = { kind, pointer: event.pointerId, last, column: 0, width: 0, x: event.clientX, ...extra };\n scroller.setPointerCapture(event.pointerId);\n };\n if (hit.area === \"cell\") {\n const column = nameOf(hit.column);\n if (column === undefined) return;\n void store.dispatch({ command: \"select\", row: hit.row, column, mode });\n start(\"cells\", `${hit.row}:${hit.column}`);\n } else if (hit.area === \"gutter\" && hit.check) {\n toggleCheck(hit.row);\n } else if (hit.area === \"corner\" && hit.check) {\n const { session, document, view } = store.getSnapshot();\n const all = allState(session.checked, document.plan, view?.rowCount ?? 0);\n // The header's box checks every row of the view, or none once they all are.\n dispatchCheck(all === \"all\" ? { command: \"check.clear\" } : { command: \"check.all\" });\n } else if (hit.area === \"group\" && hit.level !== undefined) {\n // A group's header selects its columns.\n const span = canvas.groupSpan(hit.column, hit.level);\n const from = span && nameOf(span[0]);\n const to = span && nameOf(span[1]);\n if (from && to && span) {\n void store.dispatch({ command: \"select.columns\", from, to, mode });\n // Dragging a group's header moves its columns.\n const names = columns.slice(span[0], span[1] + 1).map((item) => item.column.name);\n start(\"move\", \"\", { column: span[0], names });\n }\n } else if (hit.area === \"gutter\") {\n void store.dispatch({ command: \"select.rows\", from: hit.row, to: hit.row, mode });\n start(\"rows\", String(hit.row));\n } else if (hit.area === \"corner\") {\n void store.dispatch({ command: \"select.all\" });\n } else if (hit.area === \"header\") {\n const column = nameOf(hit.column);\n if (column === undefined) return;\n // The menu opens on the click, after the pointer is up: a popover shown before closes as the pointer goes up.\n if (hit.menu) return;\n if (hit.edge) start(\"resize\", \"\", { column: hit.column, width: geometry.columnWidth(hit.column) });\n // A click sorts by the column; dragging it moves it (with the other columns selected whole with it).\n else start(\"move\", \"\", { column: hit.column, names: movedWith(column), shift: event.shiftKey });\n }\n };\n\n /** Extends the selection being dragged to the cell or the row at a point, kept within the body. */\n const extendTo = (scroller: HTMLElement, current: Drag, x: number, y: number) => {\n const hit = geometry.hit(\n Math.max(geometry.gutterWidth + 1, Math.min(scroller.clientWidth - 1, x)),\n Math.max(geometry.headerHeight + 1, Math.min(geometry.bottom - 1, y)),\n );\n if (current.kind === \"cells\" && hit.area === \"cell\") {\n const key = `${hit.row}:${hit.column}`;\n const column = nameOf(hit.column);\n if (key === current.last || column === undefined) return;\n current.last = key;\n void store.dispatch({ command: \"select\", row: hit.row, column, mode: \"extend\" });\n } else if (current.kind === \"rows\" && (hit.area === \"cell\" || hit.area === \"gutter\")) {\n const key = String(hit.row);\n if (key === current.last) return;\n current.last = key;\n const anchor = store.getSnapshot().session.anchor?.row ?? hit.row;\n void store.dispatch({ command: \"select.rows\", from: anchor, to: hit.row, mode: \"extend\" });\n }\n };\n\n const stopFollowing = () => {\n if (follow.current) cancelAnimationFrame(follow.current.frame);\n follow.current = null;\n };\n\n /** While a drag is beyond the body, scrolls towards the pointer every frame and extends the selection. */\n const followPointer = (scroller: HTMLElement, x: number, y: number) => {\n const beyondY =\n y < geometry.headerHeight ? y - geometry.headerHeight : y > geometry.bottom ? y - geometry.bottom : 0;\n const beyondX =\n x < geometry.gutterWidth ? x - geometry.gutterWidth : x > scroller.clientWidth ? x - scroller.clientWidth : 0;\n if (beyondX === 0 && beyondY === 0) {\n stopFollowing();\n return;\n }\n if (follow.current) {\n follow.current.x = x;\n follow.current.y = y;\n return;\n }\n const state = { frame: 0, x, y };\n follow.current = state;\n const step = () => {\n const current = drag.current;\n if (follow.current !== state || !current) return;\n const dy =\n state.y < geometry.headerHeight ? state.y - geometry.headerHeight : Math.max(0, state.y - geometry.bottom);\n const dx =\n state.x < geometry.gutterWidth ? state.x - geometry.gutterWidth : Math.max(0, state.x - scroller.clientWidth);\n // Faster the farther the pointer is.\n scroller.scrollTop += Math.sign(dy) * Math.min(80, Math.abs(dy) / 2 + 4);\n if (current.kind === \"cells\") scroller.scrollLeft += Math.sign(dx) * Math.min(80, Math.abs(dx) / 2 + 4);\n extendTo(scroller, current, state.x, state.y);\n state.frame = requestAnimationFrame(step);\n };\n state.frame = requestAnimationFrame(step);\n };\n\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n const current = drag.current;\n const { x, y } = point(event);\n if (!current) {\n const hit = geometry.hit(x, y);\n const action = hit.area === \"cell\" ? canvas.actionAt(hit.row, hit.column)?.action : undefined;\n event.currentTarget.style.cursor =\n hit.area === \"header\" && hit.edge ? \"col-resize\" : action ? (action.cursor ?? \"pointer\") : \"\";\n return;\n }\n if (current.kind === \"resize\") {\n canvas.previewWidth(current.column, current.width + event.clientX - current.x);\n return;\n }\n if (current.kind === \"move\") {\n if (!current.moving && Math.abs(event.clientX - current.x) < 5) return;\n current.moving = true;\n const target = dropAt(x, current.names ?? []);\n current.before = target?.before;\n canvas.previewDrop(target ? target.x : null);\n return;\n }\n extendTo(event.currentTarget, current, x, y);\n followPointer(event.currentTarget, x, y);\n };\n\n const onPointerUp = (event: PointerEvent<HTMLDivElement>) => {\n pressed.current = false;\n if (later.current && event.type === \"pointerup\") later.current();\n later.current = null;\n const current = drag.current;\n if (!current || current.pointer !== event.pointerId) return;\n drag.current = null;\n stopFollowing();\n event.currentTarget.releasePointerCapture(event.pointerId);\n if (current.kind === \"move\") {\n canvas.previewDrop(null);\n const name = nameOf(current.column);\n if (!current.moving) {\n // A click on a column's name sorts by it; a click on a group's header only selected its columns.\n if (current.names?.length === 1 && name !== undefined && event.type === \"pointerup\") {\n void store.dispatch({ command: \"sort.toggle\", column: name, ...(current.shift ? { add: true } : {}) });\n }\n return;\n }\n if (current.before !== undefined && current.names && event.type === \"pointerup\") {\n void store.dispatch({ command: \"column.move\", names: current.names, before: current.before });\n }\n return;\n }\n if (current.kind !== \"resize\") return;\n const name = nameOf(current.column);\n const width = Math.max(40, Math.min(100_000, Math.round(current.width + event.clientX - current.x)));\n if (name !== undefined) {\n void store\n .dispatch({ command: \"column.resize\", name, width })\n .then(() => canvas.previewWidth(current.column, null));\n } else {\n canvas.previewWidth(current.column, null);\n }\n };\n\n /** Dispatches a command of checked rows, and announces how many rows are checked, or why it failed. */\n const dispatchCheck = (command: GridCommand) => {\n void store.dispatch(command).then((outcome) => {\n if (!outcome.ok) {\n announce(\n outcome.error instanceof CommandError && outcome.error.reason === \"unknown_state\"\n ? messages.checkedUnknown\n : messages.failed(outcome.error.message),\n );\n return;\n }\n const { session, document, view } = store.getSnapshot();\n const count = checkedCount(session.checked, document.plan, view?.rowCount ?? 0);\n announce(count === null ? messages.checkedUnknown : messages.checkedRows(number.format(count)));\n });\n };\n\n /** Checks a row of the view, or unchecks it when it is checked. */\n const toggleCheck = (row: number) => {\n const key = store.rowKey(row);\n if (!key) return;\n const { session, document } = store.getSnapshot();\n const state = checkState(session.checked, document.plan, key);\n dispatchCheck({ command: state === \"checked\" ? \"uncheck\" : \"check\", keys: [key] });\n };\n\n /** The columns a header drags: the column, or every column of a selection of whole columns that holds it. */\n const movedWith = (name: string): string[] => {\n const last = store.getSnapshot().session.selection?.at(-1);\n if (last && last.rows === \"all\" && last.columns !== \"all\" && last.columns.includes(name)) {\n return columns.map((item) => item.column.name).filter((item) => (last.columns as string[]).includes(item));\n }\n return [name];\n };\n\n /**\n * Where dragged columns would go for a pointer at `x`: before the column under it (after it past its middle), as\n * `column.move`'s `before` (null after the last), and the x of the line that shows it; undefined where they stay.\n */\n const dropAt = (x: number, names: readonly string[]): { before: string | null; x: number } | undefined => {\n if (columns.length === 0) return undefined;\n let at = geometry.columnAt(Math.max(geometry.gutterWidth, x));\n if (at < 0) at = x < geometry.gutterWidth ? 0 : columns.length - 1;\n const middle = geometry.columnX(at) + geometry.columnWidth(at) / 2;\n const index = x < middle ? at : at + 1;\n const before = index < columns.length ? columns[index].column.name : null;\n const moved = names.map((name) => columns.findIndex((item) => item.column.name === name));\n // Before one of the moved columns, or right after the last of them, they stay.\n if (before !== null && names.includes(before)) return undefined;\n if (moved.length > 0 && index === Math.max(...moved) + 1 && moved.every((item, i) => item === moved[0] + i)) {\n return undefined;\n }\n const lineX = index < columns.length ? geometry.columnX(index) : geometry.columnX(at) + geometry.columnWidth(at);\n return { before, x: lineX };\n };\n\n /** Opens the menu of a column under its header. */\n const openMenu = (column: string, index: number) => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n const rect = scroller.getBoundingClientRect();\n setMenu({\n column,\n x: rect.left + Math.max(0, geometry.columnX(index) + geometry.columnWidth(index) - 200),\n y: rect.top + geometry.headerHeight,\n });\n };\n\n const onClick = (event: MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const hit = geometry.hit(event.clientX - rect.left, event.clientY - rect.top);\n const column = nameOf(hit.column);\n if (hit.area === \"header\" && hit.menu && column !== undefined) openMenu(column, hit.column);\n // A click on a link or a button of a cell acts, after selecting the cell.\n if (hit.area === \"cell\" && !event.shiftKey && !event.metaKey && !event.ctrlKey) act(hit.row, hit.column);\n };\n\n /** Calls `onCellAction` for a cell that is a link or a button. */\n const act = (row: number, column: number) => {\n const found = canvas.actionAt(row, column);\n if (!found || !onCellAction) return false;\n onCellAction({ ...found.cell, action: found.action, key: store.rowKey(row) });\n return true;\n };\n\n const onContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const hit = geometry.hit(event.clientX - rect.left, event.clientY - rect.top);\n const column = nameOf(hit.column);\n if ((hit.area !== \"header\" && hit.area !== \"cell\") || column === undefined) return;\n event.preventDefault();\n const at = { x: event.clientX, y: event.clientY };\n let open: () => void;\n if (hit.area === \"header\") {\n open = () => setMenu({ column, ...at });\n } else {\n // A cell outside the selection is selected first, as spreadsheets do.\n if (!isSelected(hit.row, column)) void store.dispatch({ command: \"select\", row: hit.row, column });\n open = () => setCellMenu({ row: hit.row, column, ...at });\n }\n // Where the menu comes as the button goes down (macOS), it opens once the button is up.\n if (pressed.current) later.current = open;\n else open();\n };\n\n /** Whether a cell is in the selection. */\n const isSelected = (row: number, column: string) => {\n const { selection, active } = store.getSnapshot().session;\n if (!selection) return active?.row === row && active.column === column;\n return selection.some(\n (range) =>\n (range.rows === \"all\" || (row >= range.rows[0] && row < range.rows[1])) &&\n (range.columns === \"all\" || range.columns.includes(column)),\n );\n };\n\n /** Copies the selection from a menu, through the asynchronous clipboard. */\n const copySelection = () => {\n void store.dispatch({ command: \"copy\" }).then(async (outcome) => {\n if (!outcome.ok) {\n announce(messages.failed(outcome.error.message));\n return;\n }\n try {\n await writeClipboardLater(outcome.output);\n announce(messages.copied(number.format(countCells(outcome.output))));\n } catch (error) {\n announce(messages.failed(error instanceof Error ? error.message : String(error)));\n }\n });\n };\n\n /** Opens the cell menu of the active cell, under it. */\n const openCellMenu = () => {\n const scroller = scrollerRef.current;\n const active = store.getSnapshot().session.active;\n if (!scroller || !active) return;\n const index = columns.findIndex((item) => item.column.name === active.column);\n if (index < 0) return;\n const box = geometry.cellBox(active.row, index);\n const rect = scroller.getBoundingClientRect();\n setCellMenu({\n row: active.row,\n column: active.column,\n x: rect.left + box.left,\n y: rect.top + box.top + box.height,\n });\n };\n\n const closeCellMenu = () => {\n setCellMenu(null);\n scrollerRef.current?.focus({ preventScroll: true });\n };\n\n const closeMenu = () => {\n setMenu(null);\n scrollerRef.current?.focus({ preventScroll: true });\n };\n\n const onDoubleClick = (event: MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const hit = geometry.hit(event.clientX - rect.left, event.clientY - rect.top);\n const name = nameOf(hit.column);\n // Double-clicking a column's edge fits it to its values again; double-clicking a cell edits it.\n if (hit.area === \"header\" && hit.edge && name !== undefined)\n void store.dispatch({ command: \"column.resize\", name, width: null });\n else if (hit.area === \"cell\") startEditing(undefined);\n };\n\n /**\n * Opens the editor on the active cell (`edit.begin`, §6.5): with its value, or empty for a key that types text,\n * whose text, an IME's included, then goes into the editor, which takes the focus before the browser handles\n * the key. Tells why when the cell is not written.\n */\n const startEditing = (text: string | undefined) => {\n const outcome = store.dispatchSync(\n text === undefined ? { command: \"edit.begin\" } : { command: \"edit.begin\", text },\n );\n if (outcome.ok) {\n if (store.getSnapshot().session.editor) editor.current?.open();\n return true;\n }\n if (outcome.error instanceof CommandError && outcome.error.reason === \"read_only\") announce(messages.readOnly);\n else announce(messages.failed(outcome.error.message));\n return false;\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return;\n // While an IME composes, keys are its own (the editor takes them, §6.6 of react.md).\n const composing = event.nativeEvent.isComposing || event.keyCode === 229;\n // Space acts on a link or a button of the active cell; otherwise it checks the active row, or unchecks it.\n if (!composing && event.key === \" \" && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {\n const active = store.getSnapshot().session.active;\n if (!active) return;\n const column = columns.findIndex((item) => item.column.name === active.column);\n if (act(active.row, column)) {\n event.preventDefault();\n return;\n }\n if (!checkboxes) return;\n event.preventDefault();\n toggleCheck(active.row);\n return;\n }\n // ⌘F or Ctrl+F opens the find bar, when the engine finds.\n if ((isApple() ? event.metaKey : event.ctrlKey) && (event.key === \"f\" || event.key === \"F\") && !event.altKey) {\n if (!onFind || store.getSnapshot().table?.capabilities.find !== true) return;\n event.preventDefault();\n onFind();\n return;\n }\n // Shift+F10 and the context menu key open the menu of the active cell.\n if (event.key === \"ContextMenu\" || (event.key === \"F10\" && event.shiftKey)) {\n event.preventDefault();\n openCellMenu();\n return;\n }\n // Alt+Enter opens the detail panel of the active row, or closes it.\n if (!composing && event.altKey && event.key === \"Enter\" && !event.ctrlKey && !event.metaKey && !event.shiftKey) {\n event.preventDefault();\n const open = store.getSnapshot().session.detail?.open === true;\n void store.dispatch({ command: open ? \"detail.close\" : \"detail.open\" });\n return;\n }\n // Alt+↓ opens the menu of the active cell's column.\n if (event.altKey && event.key === \"ArrowDown\" && !event.ctrlKey && !event.metaKey) {\n const column = store.getSnapshot().session.active?.column;\n const index = columns.findIndex((item) => item.column.name === column);\n if (column === undefined || index < 0) return;\n event.preventDefault();\n openMenu(column, index);\n return;\n }\n if (typesText({ ...pick(event), keyCode: event.keyCode, isComposing: event.nativeEvent.isComposing })) {\n // Not prevented: the key's text goes into the editor that now has the focus.\n if (!startEditing(\"\")) event.preventDefault();\n return;\n }\n const command = keyCommand(event, isApple());\n if (!command) return;\n if (command.command === \"save\") {\n // Without saving, the key is the browser's.\n if (!saving || store.getSnapshot().table?.capabilities.save !== true) return;\n event.preventDefault();\n saving.save();\n return;\n }\n event.preventDefault();\n void store.dispatch(command);\n };\n\n // The accessibility rows always hold the active cell (§6.4).\n const activeColumn = active ? columns.findIndex((item) => item.column.name === active.column) : 0;\n const activeRow = active?.row ?? 0;\n const activeShown = rowCount > 0 && activeColumn >= 0;\n\n return (\n <div className=\"vg-body\" ref={rootRef}>\n <canvas className=\"vg-canvas\" ref={canvasRef} />\n {/* biome-ignore lint/a11y/useSemanticElements: a canvas grid cannot use table elements; ARIA grid roles describe it. */}\n <div\n className=\"vg-scroller\"\n ref={scrollerRef}\n role=\"grid\"\n tabIndex={0}\n aria-label={label}\n aria-rowcount={rowCount + 1 + (totalsRow ? 1 : 0)}\n aria-colcount={columns.length}\n aria-multiselectable=\"true\"\n aria-busy={busy}\n aria-activedescendant={activeShown ? cellId(id, activeRow, activeColumn) : undefined}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onDoubleClick={onDoubleClick}\n onClick={onClick}\n onContextMenu={onContextMenu}\n >\n <div className=\"vg-sizer\" ref={sizerRef} />\n <AccessibleRows canvas={canvas} id={id} />\n </div>\n <CellEditor canvas={canvas} scrollerRef={scrollerRef} announce={announce} ref={editor} />\n {menu && (\n <Suspense fallback={null}>\n <ColumnMenu target={menu} onClose={closeMenu} />\n </Suspense>\n )}\n {cellMenu && (\n <Suspense fallback={null}>\n <CellMenu target={cellMenu} onClose={closeCellMenu} copy={copySelection} />\n </Suspense>\n )}\n </div>\n );\n}\n"],"mappings":";AAAA,SAEEA,IAAI,EAIJC,QAAQ,EACRC,GAAG,EACHC,SAAS,EACTC,cAAc,EACdC,KAAK,EACLC,eAAe,EACfC,MAAM,EACNC,QAAQ,QACH,OAAO;AACd,SAASC,OAAO,QAAQ,WAAW;AACnC,SAASC,YAAY,QAAuC,eAAe;AAE3E,SAASC,UAAU,QAAQ,0BAA0B;AAErD,SAASC,OAAO,EAAiBC,UAAU,EAAEC,SAAS,QAAQ,mBAAmB;AACjF,SAASC,QAAQ,EAAEC,YAAY,EAAEC,UAAU,QAAQ,oBAAoB;AAEvE,SAASC,cAAc,EAAEC,MAAM,QAAQ,sBAAsB;AAC7D,SAASC,UAAU,QAA4B,kBAAkB;AAGjE,SAASC,aAAa,EAAEC,WAAW,QAAQ,cAAc;AACzD,SAASC,eAAe,EAAEC,YAAY,QAAQ,YAAY;;AAE1D;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AACA,MAAMC,UAAU,gBAAG7B,IAAI,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC8B,IAAI,CAAEC,MAAM,KAAM;EAAEC,OAAO,EAAED,MAAM,CAACF;AAAW,CAAC,CAAC,CAAC,CAAC;AAC5G,MAAMI,QAAQ,gBAAGjC,IAAI,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC8B,IAAI,CAAEC,MAAM,KAAM;EAAEC,OAAO,EAAED,MAAM,CAACE;AAAS,CAAC,CAAC,CAAC,CAAC;AAmBtG;AACA,SAASC,IAAIA,CAACC,KAAe,EAAY;EACvC,OAAO;IACLC,GAAG,EAAED,KAAK,CAACC,GAAG;IACdC,QAAQ,EAAEF,KAAK,CAACE,QAAQ;IACxBC,MAAM,EAAEH,KAAK,CAACG,MAAM;IACpBC,OAAO,EAAEJ,KAAK,CAACI,OAAO;IACtBC,OAAO,EAAEL,KAAK,CAACK;EACjB,CAAC;AACH;;AAEA;AACA,SAASC,cAAcA,CAACC,IAAkB,EAAEC,MAAe,EAAE;EAC3D,MAAM;IAAEC,GAAG;IAAEC;EAAK,CAAC,GAAGF,MAAuC;EAC7DD,IAAI,CAACI,OAAO,CAAC,YAAY,EAAEF,GAAG,CAAC;EAC/BF,IAAI,CAACI,OAAO,CAAC,WAAW,EAAED,IAAI,CAAC;AACjC;AAEA,eAAeE,mBAAmBA,CAACJ,MAAe,EAAE;EAClD,MAAM;IAAEC,GAAG;IAAEC;EAAK,CAAC,GAAGF,MAAuC;EAC7D,MAAMK,SAAS,GAAG,OAAOC,SAAS,KAAK,WAAW,GAAGC,SAAS,GAAGD,SAAS,CAACD,SAAS;EACpF,IAAI,CAACA,SAAS,EAAE;EAChB,IAAI,OAAOG,aAAa,KAAK,UAAU,IAAIH,SAAS,CAACI,KAAK,EAAE;IAC1D,MAAMJ,SAAS,CAACI,KAAK,CAAC,CACpB,IAAID,aAAa,CAAC;MAChB,YAAY,EAAE,IAAIE,IAAI,CAAC,CAACT,GAAG,CAAC,EAAE;QAAEU,IAAI,EAAE;MAAa,CAAC,CAAC;MACrD,WAAW,EAAE,IAAID,IAAI,CAAC,CAACR,IAAI,CAAC,EAAE;QAAES,IAAI,EAAE;MAAY,CAAC;IACrD,CAAC,CAAC,CACH,CAAC;EACJ,CAAC,MAAM;IACL,MAAMN,SAAS,CAACO,SAAS,CAACX,GAAG,CAAC;EAChC;AACF;;AAEA;AACA,SAAAY,aAAAC,KAAA,EAAAC,QAAA,EAAAC,QAAA;EAAA,MAAAC,CAAA,GAAAC,EAAA;EACE;IAAAC,QAAA;IAAAC;EAAA,IAA6B7D,GAAG,CAACmB,aAAa,CAAC;EAAC,IAAA2C,EAAA;EAAA,IAAAJ,CAAA,QAAAD,QAAA,IAAAC,CAAA,QAAAE,QAAA,IAAAF,CAAA,QAAAG,MAAA;IAClBC,EAAA,GAAAA,CAAArB,MAAA,EAAAsB,OAAA;MAC5BN,QAAQ,CAACM,OAAO,KAAK,IAAoF,GAA7EH,QAAQ,CAAAI,MAAO,CAACH,MAAM,CAAAI,MAAO,CAACC,UAAU,CAACzB,MAAM,CAAC,CAA4B,CAAC,GAAxBmB,QAAQ,CAAAO,MAAO,CAACJ,OAAO,CAAC,CAAC;IAAA,CAC3G;IAAAL,CAAA,MAAAD,QAAA;IAAAC,CAAA,MAAAE,QAAA;IAAAF,CAAA,MAAAG,MAAA;IAAAH,CAAA,MAAAI,EAAA;EAAA;IAAAA,EAAA,GAAAJ,CAAA;EAAA;EAFD,MAAAU,MAAA,GAAelE,cAAc,CAAC4D,EAE7B,CAAC;EAAC,IAAAO,EAAA;EAAA,IAAAX,CAAA,QAAAU,MAAA,IAAAV,CAAA,QAAAF,QAAA,CAAAc,OAAA,IAAAZ,CAAA,QAAAH,KAAA;IACOc,EAAA,GAAAA,CAAA;MACR,MAAAE,OAAA,GAAgBf,QAAQ,CAAAc,OAAQ;MAChC,IAAI,CAACC,OAAO;QAAA;MAAA;MAEZ,MAAAC,YAAA,GAAqBvC,KAAA;QACnB,IAAIwC,QAAQ,CAAAC,aAAc,KAAKH,OAAO;UAAEtC,KAAK,CAAA0C,cAAe,CAAC,CAAC;QAAA;MAAC,CAChE;MACD,MAAAC,MAAA,GAAeC,OAAA;QACb,IAAIJ,QAAQ,CAAAC,aAAc,KAAKH,OAA+B,IAA1D,CAAuCtC,OAAK,CAAA6C,aAAc;UAAA;QAAA;QAC9D7C,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtB,MAAAI,OAAA,GAAgBxB,KAAK,CAAAyB,YAAa,CAAC;UAAAC,OAAA,EAAW;QAAO,CAAC,CAAC;QACvD,IAAIF,OAAO,CAAAG,EAAG;UACZ3C,cAAc,CAACN,OAAK,CAAA6C,aAAc,EAAEC,OAAO,CAAAtC,MAAO,CAAC;UACnD2B,MAAM,CAACW,OAAO,CAAAtC,MAAO,EAAE,IAAI,CAAC;UAAA;QAAA;QAG9B,IAAI,EAAEsC,OAAO,CAAAI,KAAM,YAAY3E,YAAY,CAA0C,IAArCuE,OAAO,CAAAI,KAAM,CAAAC,MAAO,KAAK,YAAY;UACnFhB,MAAM,CAAC,IAAI,EAAEW,OAAO,CAAAI,KAAM,CAAAE,OAAQ,CAAC;UAAA;QAAA;QAIhC9B,KAAK,CAAA+B,QAAS,CAAC;UAAAL,OAAA,EAAW;QAAO,CAAC,CAAC,CAAArD,IAAK,CAAC,MAAA2D,KAAA;UAC5C,IAAI,CAACA,KAAK,CAAAL,EAAG;YACXd,MAAM,CAAC,IAAI,EAAEmB,KAAK,CAAAJ,KAAM,CAAAE,OAAQ,CAAC;YAAA;UAAA;UAGnC,MAAMxC,mBAAmB,CAAC0C,KAAK,CAAA9C,MAAO,CAAC;UACvC2B,MAAM,CAACmB,KAAK,CAAA9C,MAAO,EAAE,IAAI,CAAC;QAAA,CAC3B,CAAC;MAAA,CACH;MACDgC,QAAQ,CAAAe,gBAAiB,CAAC,YAAY,EAAEhB,YAAY,CAAC;MAErD,MAAAiB,OAAA,GAAgBC,OAAA;QACd,IAAIjB,QAAQ,CAAAC,aAAc,KAAKH,OAA+B,IAA1D,CAAuCtC,OAAK,CAAA6C,aAAc;UAAA;QAAA;QAC9D7C,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtB,MAAAgB,IAAA,GAAa1D,OAAK,CAAA6C,aAAc,CAAAc,OAAQ,CAAC,YAAY,CAAC;QACtD,MAAAjD,IAAA,GAAaV,OAAK,CAAA6C,aAAc,CAAAc,OAAQ,CAAC,WAAW,CAAC;QACrD,MAAA9C,SAAA,GAAkB6C,IAAI,GAAJ;UAAAA;QAAqC,CAAC,GAApBhD,IAAI,GAAJ;UAAAA;QAAmB,CAAC,GAApB,CAAmB,CAAC;QACnDY,KAAK,CAAA+B,QAAS,CAAC;UAAAL,OAAA,EAAW;QAAa,CAAC,EAAE;UAAAnC;QAAY,CAAC,CAAC,CAAAlB,IAAK,CAACiE,SAAA;UACjE,IAAI,CAACd,SAAO,CAAAG,EAAG;YAAEd,MAAM,CAAC,IAAI,EAAEW,SAAO,CAAAI,KAAM,CAAAE,OAAQ,CAAC;UAAA;QAAC,CACtD,CAAC;MAAA,CACH;MACDZ,QAAQ,CAAAe,gBAAiB,CAAC,MAAM,EAAEZ,MAAM,CAAC;MACzCH,QAAQ,CAAAe,gBAAiB,CAAC,OAAO,EAAEC,OAAO,CAAC;MAAA,OACpC;QACLhB,QAAQ,CAAAqB,mBAAoB,CAAC,YAAY,EAAEtB,YAAY,CAAC;QACxDC,QAAQ,CAAAqB,mBAAoB,CAAC,MAAM,EAAElB,MAAM,CAAC;QAC5CH,QAAQ,CAAAqB,mBAAoB,CAAC,OAAO,EAAEL,OAAO,CAAC;MAAA,CAC/C;IAAA,CACF;IAAA/B,CAAA,MAAAU,MAAA;IAAAV,CAAA,MAAAF,QAAA,CAAAc,OAAA;IAAAZ,CAAA,MAAAH,KAAA;IAAAG,CAAA,MAAAW,EAAA;EAAA;IAAAA,EAAA,GAAAX,CAAA;EAAA;EAAA,IAAAqC,EAAA;EAAA,IAAArC,CAAA,QAAAF,QAAA,IAAAE,CAAA,QAAAH,KAAA;IAAEwC,EAAA,IAACxC,KAAK,EAAEC,QAAQ,CAAC;IAAAE,CAAA,MAAAF,QAAA;IAAAE,CAAA,MAAAH,KAAA;IAAAG,CAAA,OAAAqC,EAAA;EAAA;IAAAA,EAAA,GAAArC,CAAA;EAAA;EAjDpBzD,SAAS,CAACoE,EAiDT,EAAE0B,EAAiB,CAAC;AAAA;;AAGvB;AACA,SAAS7B,UAAUA,CAACzB,MAAe,EAAE;EACnC,MAAM;IAAEC;EAAI,CAAC,GAAGD,MAAyB;EACzC,IAAIC,GAAG,KAAK,EAAE,EAAE,OAAO,CAAC;EACxB,OAAOA,GAAG,CAACsD,KAAK,CAAC,IAAI,CAAC,CAACC,MAAM,CAAC,CAACC,KAAK,EAAEC,IAAI,KAAKD,KAAK,GAAGC,IAAI,CAACH,KAAK,CAAC,IAAI,CAAC,CAACI,MAAM,EAAE,CAAC,CAAC;AACpF;;AAEA;;AAyBA;AACA;AACA;AACA;AACA;AACA,OAAO,SAAAC,SAAAvC,EAAA;EAAA,MAAAJ,CAAA,GAAAC,EAAA;EAAkB;IAAA2C,SAAA;IAAAC,YAAA;IAAAC,UAAA,EAAAnC,EAAA;IAAAoC,YAAA;IAAAC,iBAAA;IAAAC,SAAA;IAAAC,KAAA;IAAAC,YAAA;IAAAC,MAAA;IAAAC,KAAA;IAAAC,WAAA;IAAAvD;EAAA,IAAAK,EAaT;EAVd,MAAA0C,UAAA,GAAAnC,EAAkB,KAAlBrB,SAAkB,GAAlB,KAAkB,GAAlBqB,EAAkB;EAWlBrE,GAAG,CAACO,OAAO,CAAC,yDAAyD,CAAC,CAAC;EACvE,MAAAgD,KAAA,GAAcjC,YAAY,CAAC,CAAC;EAAC,IAAAyE,EAAA;EAAA,IAAArC,CAAA,QAAA6C,YAAA,IAAA7C,CAAA,QAAA4C,SAAA;IACHP,EAAA,GAAAA,CAAA,KAAM,IAAItF,UAAU,CAAC;MAAA6F,SAAA;MAAAC;IAA0B,CAAC,CAAC;IAAA7C,CAAA,MAAA6C,YAAA;IAAA7C,CAAA,MAAA4C,SAAA;IAAA5C,CAAA,MAAAqC,EAAA;EAAA;IAAAA,EAAA,GAAArC,CAAA;EAAA;EAA3E,OAAAuD,MAAA,IAAiB3G,QAAQ,CAACyF,EAAiD,CAAC;EAC5E;IAAAmB;EAAA,IAAqBD,MAAM;EAC3B,MAAAE,OAAA,GAAgB9G,MAAM,CAAiB,IAAI,CAAC;EAC5C,MAAA+G,SAAA,GAAkB/G,MAAM,CAAoB,IAAI,CAAC;EACjD,MAAAgH,QAAA,GAAiBhH,MAAM,CAAiB,IAAI,CAAC;EAC7C,MAAAiH,IAAA,GAAajH,MAAM,CAAc,IAAI,CAAC;EACtC,MAAAkH,MAAA,GAAelH,MAAM,CAAgB,IAAI,CAAC;EAC1C;IAAAuD,QAAA;IAAA4D,MAAA;IAAA3D;EAAA,IAAqC7D,GAAG,CAACmB,aAAa,CAAC;EACvD,MAAAsG,MAAA,GAAezH,GAAG,CAACoB,WAAW,CAAC;EAC/B,MAAAsG,MAAA,GAAerH,MAAM,CAAiD,IAAI,CAAC;EAC3E,MAAAsH,EAAA,GAAWxH,KAAK,CAAC,CAAC;EAClB,MAAAyH,QAAA,GAAiBvG,eAAe,CAACwG,KAA0C,CAAC;EAC5E,MAAAC,OAAA,GAAgBzG,eAAe,CAAC0G,MAAgC,CAAC;EACjE,MAAAC,IAAA,GAAa3G,eAAe,CAAC4G,MAAiE,CAAC;EAC/F,MAAAC,MAAA,GAAe7G,eAAe,CAAC8G,MAAqC,CAAC;EACrE,OAAAC,IAAA,EAAAC,OAAA,IAAwB/H,QAAQ,CAAoB,IAAI,CAAC;EACzD,MAAAgI,SAAA,GAAkBjH,eAAe,CAC/BkH,MAEF,CAAC;EACD,MAAAC,OAAA,GAAgBnI,MAAM,CAAC,KAAK,CAAC;EAC7B,MAAAkF,KAAA,GAAclF,MAAM,CAAsB,IAAI,CAAC;EAC/C,OAAAoI,QAAA,EAAAC,WAAA,IAAgCpI,QAAQ,CAAwB,IAAI,CAAC;EAAC,IAAAqI,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAlF,CAAA,QAAAuD,MAAA,IAAAvD,CAAA,QAAA6C,YAAA,IAAA7C,CAAA,QAAA4C,SAAA;IAEtDqC,EAAA,GAAAA,CAAA;MACd1B,MAAM,CAAA4B,QAAS,CAACvC,SAAS,EAAEC,YAAY,CAAC;IAAA,CACzC;IAAEqC,EAAA,IAAC3B,MAAM,EAAEX,SAAS,EAAEC,YAAY,CAAC;IAAA7C,CAAA,MAAAuD,MAAA;IAAAvD,CAAA,MAAA6C,YAAA;IAAA7C,CAAA,MAAA4C,SAAA;IAAA5C,CAAA,MAAAiF,EAAA;IAAAjF,CAAA,MAAAkF,EAAA;EAAA;IAAAD,EAAA,GAAAjF,CAAA;IAAAkF,EAAA,GAAAlF,CAAA;EAAA;EAFpCtD,eAAe,CAACuI,EAEf,EAAEC,EAAiC,CAAC;EAAA,IAAAE,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAArF,CAAA,QAAAuD,MAAA,IAAAvD,CAAA,QAAA8D,MAAA;IAErBsB,EAAA,GAAAA,CAAA;MACd7B,MAAM,CAAA+B,SAAU,CAACxB,MAAM,CAAC;IAAA,CACzB;IAAEuB,EAAA,IAAC9B,MAAM,EAAEO,MAAM,CAAC;IAAA9D,CAAA,MAAAuD,MAAA;IAAAvD,CAAA,MAAA8D,MAAA;IAAA9D,CAAA,OAAAoF,EAAA;IAAApF,CAAA,OAAAqF,EAAA;EAAA;IAAAD,EAAA,GAAApF,CAAA;IAAAqF,EAAA,GAAArF,CAAA;EAAA;EAFnBtD,eAAe,CAAC0I,EAEf,EAAEC,EAAgB,CAAC;EAAA,IAAAE,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAxF,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAA8C,UAAA;IAEJyC,EAAA,GAAAA,CAAA;MACdhC,MAAM,CAAAkC,aAAc,CAAC3C,UAAU,CAAC;IAAA,CACjC;IAAE0C,EAAA,IAACjC,MAAM,EAAET,UAAU,CAAC;IAAA9C,CAAA,OAAAuD,MAAA;IAAAvD,CAAA,OAAA8C,UAAA;IAAA9C,CAAA,OAAAuF,EAAA;IAAAvF,CAAA,OAAAwF,EAAA;EAAA;IAAAD,EAAA,GAAAvF,CAAA;IAAAwF,EAAA,GAAAxF,CAAA;EAAA;EAFvBtD,eAAe,CAAC6I,EAEf,EAAEC,EAAoB,CAAC;EAAA,IAAAE,GAAA;EAAA,IAAAC,EAAA;EAAA,IAAA3F,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAAiD,SAAA;IAER0C,EAAA,GAAAA,CAAA;MACdpC,MAAM,CAAAqC,YAAa,CAAC3C,SAAS,CAAC;IAAA,CAC/B;IAAEyC,GAAA,IAACnC,MAAM,EAAEN,SAAS,CAAC;IAAAjD,CAAA,OAAAuD,MAAA;IAAAvD,CAAA,OAAAiD,SAAA;IAAAjD,CAAA,OAAA0F,GAAA;IAAA1F,CAAA,OAAA2F,EAAA;EAAA;IAAAD,GAAA,GAAA1F,CAAA;IAAA2F,EAAA,GAAA3F,CAAA;EAAA;EAFtBtD,eAAe,CAACiJ,EAEf,EAAED,GAAmB,CAAC;EAAA,IAAAG,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAA9F,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAA+C,YAAA,IAAA/C,CAAA,SAAAgD,iBAAA;IAEP6C,GAAA,GAAAA,CAAA;MACdtC,MAAM,CAAAwC,eAAgB,CAAChD,YAAY,EAAEC,iBAAiB,CAAC;IAAA,CACxD;IAAE8C,GAAA,IAACvC,MAAM,EAAER,YAAY,EAAEC,iBAAiB,CAAC;IAAAhD,CAAA,OAAAuD,MAAA;IAAAvD,CAAA,OAAA+C,YAAA;IAAA/C,CAAA,OAAAgD,iBAAA;IAAAhD,CAAA,OAAA6F,GAAA;IAAA7F,CAAA,OAAA8F,GAAA;EAAA;IAAAD,GAAA,GAAA7F,CAAA;IAAA8F,GAAA,GAAA9F,CAAA;EAAA;EAF5CtD,eAAe,CAACmJ,GAEf,EAAEC,GAAyC,CAAC;EAE7C;IAAAE,QAAA;IAAAC,SAAA;IAAAC,QAAA;IAAAC;EAAA,IAAsDjD,KAAK;EAAC,IAAAkD,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAArG,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAAmG,UAAA,IAAAnG,CAAA,SAAAiG,SAAA,IAAAjG,CAAA,SAAAgG,QAAA,IAAAhG,CAAA,SAAAkG,QAAA;IAC5CE,GAAA,GAAAA,CAAA;MACd7C,MAAM,CAAA+C,QAAS,CAAC;QAAAN,QAAA;QAAAC,SAAA;QAAAC,QAAA;QAAAC;MAA4C,CAAC,CAAC;IAAA,CAC/D;IAAEE,GAAA,IAAC9C,MAAM,EAAEyC,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,UAAU,CAAC;IAAAnG,CAAA,OAAAuD,MAAA;IAAAvD,CAAA,OAAAmG,UAAA;IAAAnG,CAAA,OAAAiG,SAAA;IAAAjG,CAAA,OAAAgG,QAAA;IAAAhG,CAAA,OAAAkG,QAAA;IAAAlG,CAAA,OAAAoG,GAAA;IAAApG,CAAA,OAAAqG,GAAA;EAAA;IAAAD,GAAA,GAAApG,CAAA;IAAAqG,GAAA,GAAArG,CAAA;EAAA;EAFtDtD,eAAe,CAAC0J,GAEf,EAAEC,GAAmD,CAAC;EAAA,IAAAE,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAxG,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAAsD,WAAA,IAAAtD,CAAA,SAAAH,KAAA;IAEvC0G,GAAA,GAAAA,CAAA;MACd,MAAAE,IAAA,GAAahD,OAAO,CAAA7C,OAAQ;MAC5B,MAAAC,OAAA,GAAgB6C,SAAS,CAAA9C,OAAQ;MACjC,MAAAd,QAAA,GAAiBwD,WAAW,CAAA1C,OAAQ;MACpC,MAAA8F,KAAA,GAAc/C,QAAQ,CAAA/C,OAAQ;MAC9B,IAAI,CAAC6F,IAAgB,IAAjB,CAAU5F,OAAoB,IAA9B,CAAsBf,QAAkB,IAAxC,CAAmC4G,KAAK;QAAA;MAAA;MAC5C,MAAAC,MAAA,GAAepD,MAAM,CAAAqD,MAAO,CAAC;QAAAH,IAAA;QAAAlD,MAAA,EAAgB1C,OAAO;QAAAf,QAAA;QAAA4G;MAAkB,CAAC,EAAE7G,KAAK,CAAC;MAE/E0D,MAAM,CAAAsD,IAAK,CAAC,CAAC;MAAA,OACN;QACL,IAAI7C,MAAM,CAAApD,OAAQ;UAAEkG,oBAAoB,CAAC9C,MAAM,CAAApD,OAAQ,CAAAmG,KAAM,CAAC;QAAA;QAC9D/C,MAAM,CAAApD,OAAA,GAAW,IAAH;QACd+F,MAAM,CAAC,CAAC;MAAA,CACT;IAAA,CACF;IAAEH,GAAA,IAACjD,MAAM,EAAE1D,KAAK,EAAEyD,WAAW,CAAC;IAAAtD,CAAA,OAAAuD,MAAA;IAAAvD,CAAA,OAAAsD,WAAA;IAAAtD,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAAuG,GAAA;IAAAvG,CAAA,OAAAwG,GAAA;EAAA;IAAAD,GAAA,GAAAvG,CAAA;IAAAwG,GAAA,GAAAxG,CAAA;EAAA;EAd/BtD,eAAe,CAAC6J,GAcf,EAAEC,GAA4B,CAAC;EAEhC5G,YAAY,CAACC,KAAK,EAAEyD,WAAW,EAAEvD,QAAQ,CAAC;EAE1C,MAAAiH,KAAA,GAAcC,MAGb;EAAC,IAAAC,GAAA;EAAA,IAAAlH,CAAA,SAAAH,KAAA;IAEaqH,GAAA,GAAAC,MAAA,IAAoBtH,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAC,SAAU,CAACF,MAAM,CAAS,EAAAA,MAAK,CAAAG,IAAA;IAAAtH,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAAkH,GAAA;EAAA;IAAAA,GAAA,GAAAlH,CAAA;EAAA;EAArF,MAAAuH,MAAA,GAAeL,GAAsE;EAAC,IAAAM,aAAA;EAAA,IAAAC,aAAA;EAAA,IAAAC,WAAA;EAAA,IAAAC,WAAA;EAAA,IAAA3H,CAAA,SAAAD,QAAA,IAAAC,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAAoE,OAAA,IAAApE,CAAA,SAAAwD,QAAA,IAAAxD,CAAA,SAAAE,QAAA,IAAAF,CAAA,SAAAuH,MAAA,IAAAvH,CAAA,SAAAG,MAAA,IAAAH,CAAA,SAAAH,KAAA;IAEtF2H,aAAA,GAAsBrG,OAAA;MACpB2D,OAAO,CAAAlE,OAAA,GAAWrC,OAAK,CAAAqJ,OAAQ,KAAK,CAArB;MACf,IAAIrJ,OAAK,CAAAsJ,MAAO,KAAK,CAAC;QAAA;MAAA;MACtB,MAAAC,UAAA,GAAiBvJ,OAAK,CAAAwJ,aAAc;MACpC;QAAAC,CAAA;QAAAC;MAAA,IAAiBjB,KAAK,CAACzI,OAAK,CAAC;MAE7B,IAAIyJ,CAAC,GAAGlI,UAAQ,CAAAoI,WAAyC,IAAzBD,CAAC,GAAGnI,UAAQ,CAAAqI,YAAa;QAAA;MAAA;MACzDrI,UAAQ,CAAAsI,KAAM,CAAC;QAAAC,aAAA,EAAiB;MAAK,CAAC,CAAC;MACvC9J,OAAK,CAAA0C,cAAe,CAAC,CAAC;MACtB,MAAAqH,GAAA,GAAiB9E,QAAQ,CAAA8E,GAAI,CAACN,CAAC,EAAEC,CAAC,CAAC;MACnC,MAAAM,OAAA,GAAgBvL,OAAO,CAAiC,CAAC,GAA7BuB,OAAK,CAAAK,OAAwB,GAAbL,OAAK,CAAAI,OAAQ;MACzD,MAAA6J,IAAA,GAAajK,OAAK,CAAAE,QAAkD,GAAvD,QAAuD,GAA3B8J,OAAO,GAAP,KAA2B,GAA3B,SAA2B;MACpE,MAAAE,KAAA,GAAcA,CAAAC,IAAA,EAAAC,IAAA,EAAAC,GAAA;QAAmC,MAAAC,KAAA,GAAAD,GAAyB,KAAzBtJ,SAAyB,GAAzB,CAAwB,CAAC,GAAzBsJ,GAAyB;QACxEhF,IAAI,CAAAhD,OAAA,GAAW;UAAA8H,IAAA;UAAAI,OAAA,EAAiBvK,OAAK,CAAAwK,SAAU;UAAAJ,IAAA;UAAAxB,MAAA,EAAgB,CAAC;UAAA6B,KAAA,EAAS,CAAC;UAAAhB,CAAA,EAAKzJ,OAAK,CAAA0K,OAAQ;UAAA,GAAKJ;QAAM,CAA3F;QACZ/I,UAAQ,CAAAoJ,iBAAkB,CAAC3K,OAAK,CAAAwK,SAAU,CAAC;MAAA,CAC5C;MACD,IAAIT,GAAG,CAAAa,IAAK,KAAK,MAAM;QACrB,MAAAC,QAAA,GAAe7B,MAAM,CAACe,GAAG,CAAAnB,MAAO,CAAC;QACjC,IAAIA,QAAM,KAAK7H,SAAS;UAAA;QAAA;QACnBO,KAAK,CAAA+B,QAAS,CAAC;UAAAL,OAAA,EAAW,QAAQ;UAAA8H,GAAA,EAAOf,GAAG,CAAAe,GAAI;UAAAlC,MAAA,EAAEA,QAAM;UAAAqB;QAAO,CAAC,CAAC;QACtEC,KAAK,CAAC,OAAO,EAAE,GAAGH,GAAG,CAAAe,GAAI,IAAIf,GAAG,CAAAnB,MAAO,EAAE,CAAC;MAAA;QACrC,IAAImB,GAAG,CAAAa,IAAK,KAAK,QAAqB,IAATb,GAAG,CAAAgB,KAAM;UAC3C3B,WAAW,CAACW,GAAG,CAAAe,GAAI,CAAC;QAAA;UACf,IAAIf,GAAG,CAAAa,IAAK,KAAK,QAAqB,IAATb,GAAG,CAAAgB,KAAM;YAC3C;cAAAC,OAAA;cAAAxI,QAAA;cAAAyI;YAAA,IAAoC3J,KAAK,CAAAuH,WAAY,CAAC,CAAC;YACvD,MAAAqC,GAAA,GAAYtM,QAAQ,CAACoM,OAAO,CAAAG,OAAQ,EAAE3I,QAAQ,CAAA4I,IAAK,EAAEH,IAAI,EAAAtF,QAAe,IAAnB,CAAmB,CAAC;YAEzE0F,aAAa,CAACH,GAAG,KAAK,KAA6D,GAArE;cAAAlI,OAAA,EAA2B;YAAyC,CAAC,GAArE;cAAAA,OAAA,EAAwD;YAAY,CAAC,CAAC;UAAA;YAC/E,IAAI+G,GAAG,CAAAa,IAAK,KAAK,OAAkC,IAAvBb,GAAG,CAAAuB,KAAM,KAAKvK,SAAS;cAExD,MAAAwK,IAAA,GAAavG,MAAM,CAAAwG,SAAU,CAACzB,GAAG,CAAAnB,MAAO,EAAEmB,GAAG,CAAAuB,KAAM,CAAC;cACpD,MAAAG,IAAA,GAAaF,IAAuB,IAAfvC,MAAM,CAACuC,IAAI,GAAG,CAAC;cACpC,MAAAG,EAAA,GAAWH,IAAuB,IAAfvC,MAAM,CAACuC,IAAI,GAAG,CAAC;cAClC,IAAIE,IAAU,IAAVC,EAAkB,IAAlBH,IAAkB;gBACfjK,KAAK,CAAA+B,QAAS,CAAC;kBAAAL,OAAA,EAAW,gBAAgB;kBAAAyI,IAAA;kBAAAC,EAAA;kBAAAzB;gBAAiB,CAAC,CAAC;gBAElE,MAAA0B,KAAA,GAAc9F,OAAO,CAAA+F,KAAM,CAACL,IAAI,GAAG,EAAEA,IAAI,GAAG,GAAG,CAAC,CAAC,CAAAM,GAAI,CAACC,MAA0B,CAAC;gBACjF5B,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE;kBAAAtB,MAAA,EAAU2C,IAAI,GAAG;kBAAAI;gBAAQ,CAAC,CAAC;cAAA;YAC9C;cACI,IAAI5B,GAAG,CAAAa,IAAK,KAAK,QAAQ;gBACzBtJ,KAAK,CAAA+B,QAAS,CAAC;kBAAAL,OAAA,EAAW,aAAa;kBAAAyI,IAAA,EAAQ1B,GAAG,CAAAe,GAAI;kBAAAY,EAAA,EAAM3B,GAAG,CAAAe,GAAI;kBAAAb;gBAAO,CAAC,CAAC;gBACjFC,KAAK,CAAC,MAAM,EAAE6B,MAAM,CAAChC,GAAG,CAAAe,GAAI,CAAC,CAAC;cAAA;gBACzB,IAAIf,GAAG,CAAAa,IAAK,KAAK,QAAQ;kBACzBtJ,KAAK,CAAA+B,QAAS,CAAC;oBAAAL,OAAA,EAAW;kBAAa,CAAC,CAAC;gBAAA;kBACzC,IAAI+G,GAAG,CAAAa,IAAK,KAAK,QAAQ;oBAC9B,MAAAoB,QAAA,GAAehD,MAAM,CAACe,GAAG,CAAAnB,MAAO,CAAC;oBACjC,IAAIA,QAAM,KAAK7H,SAAS;sBAAA;oBAAA;oBAExB,IAAIgJ,GAAG,CAAA5D,IAAK;sBAAA;oBAAA;oBACZ,IAAI4D,GAAG,CAAAkC,IAAK;sBAAE/B,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE;wBAAAtB,MAAA,EAAUmB,GAAG,CAAAnB,MAAO;wBAAA6B,KAAA,EAASxF,QAAQ,CAAAiH,WAAY,CAACnC,GAAG,CAAAnB,MAAO;sBAAE,CAAC,CAAC;oBAAA;sBAE7FsB,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE;wBAAAtB,MAAA,EAAUmB,GAAG,CAAAnB,MAAO;wBAAA+C,KAAA,EAASQ,SAAS,CAACvD,QAAM,CAAC;wBAAAwD,KAAA,EAASpM,OAAK,CAAAE;sBAAU,CAAC,CAAC;oBAAA;kBAAC;gBACjG;cAAA;YAAA;UAAA;QAAA;MAAA;IAAA,CACF;IAAC,IAAAmM,GAAA;IAAA,IAAA5K,CAAA,SAAAwD,QAAA,IAAAxD,CAAA,SAAAuH,MAAA,IAAAvH,CAAA,SAAAH,KAAA;MAGe+K,GAAA,GAAAA,CAAAC,UAAA,EAAAjK,OAAA,EAAAkK,GAAA,EAAAC,GAAA;QACf,MAAAC,KAAA,GAAYxH,QAAQ,CAAA8E,GAAI,CACtB2C,IAAI,CAAAC,GAAI,CAAC1H,QAAQ,CAAA2H,WAAY,GAAG,CAAC,EAAEF,IAAI,CAAAG,GAAI,CAACtL,UAAQ,CAAAoI,WAAY,GAAG,CAAC,EAAEF,GAAC,CAAC,CAAC,EACzEiD,IAAI,CAAAC,GAAI,CAAC1H,QAAQ,CAAAX,YAAa,GAAG,CAAC,EAAEoI,IAAI,CAAAG,GAAI,CAAC5H,QAAQ,CAAA6H,MAAO,GAAG,CAAC,EAAEpD,GAAC,CAAC,CACtE,CAAC;QACD,IAAIrH,OAAO,CAAA8H,IAAK,KAAK,OAA8B,IAAnBJ,KAAG,CAAAa,IAAK,KAAK,MAAM;UACjD,MAAA3K,GAAA,GAAY,GAAG8J,KAAG,CAAAe,GAAI,IAAIf,KAAG,CAAAnB,MAAO,EAAE;UACtC,MAAAmE,QAAA,GAAe/D,MAAM,CAACe,KAAG,CAAAnB,MAAO,CAAC;UACjC,IAAI3I,GAAG,KAAKoC,OAAO,CAAA+H,IAA6B,IAApBxB,QAAM,KAAK7H,SAAS;YAAA;UAAA;UAChDsB,OAAO,CAAA+H,IAAA,GAAQnK,GAAH;UACPqB,KAAK,CAAA+B,QAAS,CAAC;YAAAL,OAAA,EAAW,QAAQ;YAAA8H,GAAA,EAAOf,KAAG,CAAAe,GAAI;YAAAlC,MAAA,EAAEA,QAAM;YAAAqB,IAAA,EAAQ;UAAS,CAAC,CAAC;QAAA;UAC3E,IAAI5H,OAAO,CAAA8H,IAAK,KAAK,MAAwD,KAA7CJ,KAAG,CAAAa,IAAK,KAAK,MAA+B,IAArBb,KAAG,CAAAa,IAAK,KAAK,QAAS;YAClF,MAAAoC,KAAA,GAAYjB,MAAM,CAAChC,KAAG,CAAAe,GAAI,CAAC;YAC3B,IAAI7K,KAAG,KAAKoC,OAAO,CAAA+H,IAAK;cAAA;YAAA;YACxB/H,OAAO,CAAA+H,IAAA,GAAQnK,KAAH;YACZ,MAAAgN,MAAA,GAAe3L,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ,CAAAiC,MAAY,EAAAnC,GAAW,IAAPf,KAAG,CAAAe,GAAI;YAC5DxJ,KAAK,CAAA+B,QAAS,CAAC;cAAAL,OAAA,EAAW,aAAa;cAAAyI,IAAA,EAAQwB,MAAM;cAAAvB,EAAA,EAAM3B,KAAG,CAAAe,GAAI;cAAAb,IAAA,EAAQ;YAAS,CAAC,CAAC;UAAA;QAC3F;MAAA,CACF;MAAAxI,CAAA,OAAAwD,QAAA;MAAAxD,CAAA,OAAAuH,MAAA;MAAAvH,CAAA,OAAAH,KAAA;MAAAG,CAAA,OAAA4K,GAAA;IAAA;MAAAA,GAAA,GAAA5K,CAAA;IAAA;IAlBD,MAAAyL,QAAA,GAAiBb,GAkBhB;IAAC,IAAAc,GAAA;IAAA,IAAA1L,CAAA,SAAA2L,MAAA,CAAAC,GAAA;MAEoBF,GAAA,GAAAA,CAAA;QACpB,IAAI1H,MAAM,CAAApD,OAAQ;UAAEkG,oBAAoB,CAAC9C,MAAM,CAAApD,OAAQ,CAAAmG,KAAM,CAAC;QAAA;QAC9D/C,MAAM,CAAApD,OAAA,GAAW,IAAH;MAAA,CACf;MAAAZ,CAAA,OAAA0L,GAAA;IAAA;MAAAA,GAAA,GAAA1L,CAAA;IAAA;IAHD,MAAA6L,aAAA,GAAsBH,GAGrB;IAAC,IAAAI,GAAA;IAAA,IAAA9L,CAAA,SAAAyL,QAAA,IAAAzL,CAAA,SAAAwD,QAAA,CAAA6H,MAAA,IAAArL,CAAA,SAAAwD,QAAA,CAAA2H,WAAA,IAAAnL,CAAA,SAAAwD,QAAA,CAAAX,YAAA;MAGoBiJ,GAAA,GAAAA,CAAAC,UAAA,EAAAC,GAAA,EAAAC,GAAA;QACpB,MAAAC,OAAA,GACEjE,GAAC,GAAGzE,QAAQ,CAAAX,YAAyF,GAAzEoF,GAAC,GAAGzE,QAAQ,CAAAX,YAA6D,GAA7CoF,GAAC,GAAGzE,QAAQ,CAAA6H,MAAiC,GAAvBpD,GAAC,GAAGzE,QAAQ,CAAA6H,MAAW,GAA7C,CAA6C;QACvG,MAAAc,OAAA,GACEnE,GAAC,GAAGxE,QAAQ,CAAA2H,WAAiG,GAAlFnD,GAAC,GAAGxE,QAAQ,CAAA2H,WAAsE,GAAvDnD,GAAC,GAAGlI,UAAQ,CAAAoI,WAA2C,GAA5BF,GAAC,GAAGlI,UAAQ,CAAAoI,WAAgB,GAAvD,CAAuD;QAC/G,IAAIiE,OAAO,KAAK,CAAkB,IAAbD,OAAO,KAAK,CAAC;UAChCL,aAAa,CAAC,CAAC;UAAA;QAAA;QAGjB,IAAI7H,MAAM,CAAApD,OAAQ;UAChBoD,MAAM,CAAApD,OAAQ,CAAAoH,CAAA,GAAKA,GAAH;UAChBhE,MAAM,CAAApD,OAAQ,CAAAqH,CAAA,GAAKA,GAAH;UAAA;QAAA;QAGlB,MAAAmE,KAAA,GAAc;UAAArF,KAAA,EAAS,CAAC;UAAAiB,CAAA,EAAEA,GAAC;UAAAC,CAAA,EAAEA;QAAE,CAAC;QAChCjE,MAAM,CAAApD,OAAA,GAAWwL,KAAH;QACd,MAAAC,IAAA,GAAaA,CAAA;UACX,MAAAC,SAAA,GAAgB1I,IAAI,CAAAhD,OAAQ;UAC5B,IAAIoD,MAAM,CAAApD,OAAQ,KAAKwL,KAAiB,IAApC,CAA6BxL,SAAO;YAAA;UAAA;UACxC,MAAA2L,EAAA,GACEH,KAAK,CAAAnE,CAAE,GAAGzE,QAAQ,CAAAX,YAAwF,GAAxEuJ,KAAK,CAAAnE,CAAE,GAAGzE,QAAQ,CAAAX,YAAsD,GAAtCoI,IAAI,CAAAC,GAAI,CAAC,CAAC,EAAEkB,KAAK,CAAAnE,CAAE,GAAGzE,QAAQ,CAAA6H,MAAO,CAAC;UAC5G,MAAAmB,EAAA,GACEJ,KAAK,CAAApE,CAAE,GAAGxE,QAAQ,CAAA2H,WAA2F,GAA5EiB,KAAK,CAAApE,CAAE,GAAGxE,QAAQ,CAAA2H,WAA0D,GAA3CF,IAAI,CAAAC,GAAI,CAAC,CAAC,EAAEkB,KAAK,CAAApE,CAAE,GAAGlI,UAAQ,CAAAoI,WAAY,CAAC;UAE/GpI,UAAQ,CAAA2M,SAAA,GAAR3M,UAAQ,CAAA2M,SAAU,GAAIxB,IAAI,CAAAyB,IAAK,CAACH,EAAE,CAAC,GAAGtB,IAAI,CAAAG,GAAI,CAAC,EAAE,EAAEH,IAAI,CAAA0B,GAAI,CAACJ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAArD;UAClB,IAAI3L,SAAO,CAAA8H,IAAK,KAAK,OAAO;YAAE5I,UAAQ,CAAA8M,UAAA,GAAR9M,UAAQ,CAAA8M,UAAW,GAAI3B,IAAI,CAAAyB,IAAK,CAACF,EAAE,CAAC,GAAGvB,IAAI,CAAAG,GAAI,CAAC,EAAE,EAAEH,IAAI,CAAA0B,GAAI,CAACH,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAArD;UAAA;UACjDf,QAAQ,CAAC3L,UAAQ,EAAEc,SAAO,EAAEwL,KAAK,CAAApE,CAAE,EAAEoE,KAAK,CAAAnE,CAAE,CAAC;UAC7CmE,KAAK,CAAArF,KAAA,GAAS8F,qBAAqB,CAACR,IAAI,CAA7B;QAAA,CACZ;QACDD,KAAK,CAAArF,KAAA,GAAS8F,qBAAqB,CAACR,IAAI,CAA7B;MAAA,CACZ;MAAArM,CAAA,OAAAyL,QAAA;MAAAzL,CAAA,OAAAwD,QAAA,CAAA6H,MAAA;MAAArL,CAAA,OAAAwD,QAAA,CAAA2H,WAAA;MAAAnL,CAAA,OAAAwD,QAAA,CAAAX,YAAA;MAAA7C,CAAA,OAAA8L,GAAA;IAAA;MAAAA,GAAA,GAAA9L,CAAA;IAAA;IA9BD,MAAA8M,aAAA,GAAsBhB,GA8BrB;IAEDrE,aAAA,GAAsBzF,OAAA;MACpB,MAAA+K,SAAA,GAAgBnJ,IAAI,CAAAhD,OAAQ;MAC5B;QAAAoH,CAAA,EAAAgF,GAAA;QAAA/E,CAAA,EAAAgF;MAAA,IAAiBjG,KAAK,CAACzI,OAAK,CAAC;MAC7B,IAAI,CAACqC,SAAO;QACV,MAAAsM,KAAA,GAAY1J,QAAQ,CAAA8E,GAAI,CAACN,GAAC,EAAEC,GAAC,CAAC;QAC9B,MAAAkF,MAAA,GAAe7E,KAAG,CAAAa,IAAK,KAAK,MAAiE,GAAxD5F,MAAM,CAAA6J,QAAS,CAAC9E,KAAG,CAAAe,GAAI,EAAEf,KAAG,CAAAnB,MAAe,CAAC,EAAAgG,MAAY,GAA9E7N,SAA8E;QAC7Ff,OAAK,CAAAwJ,aAAc,CAAAsF,KAAM,CAAAC,MAAA,GACvBhF,KAAG,CAAAa,IAAK,KAAK,QAAoB,IAARb,KAAG,CAAAkC,IAAiE,GAA7F,YAA6F,GAA1C2C,MAAM,GAAIA,MAAM,CAAAG,MAAoB,IAA1B,SAAgC,GAA1C,EADrB;QAAA;MAAA;MAIlC,IAAI1M,SAAO,CAAA8H,IAAK,KAAK,QAAQ;QAC3BnF,MAAM,CAAAgK,YAAa,CAAC3M,SAAO,CAAAuG,MAAO,EAAEvG,SAAO,CAAAoI,KAAM,GAAGzK,OAAK,CAAA0K,OAAQ,GAAGrI,SAAO,CAAAoH,CAAE,CAAC;QAAA;MAAA;MAGhF,IAAIpH,SAAO,CAAA8H,IAAK,KAAK,MAAM;QACzB,IAAI,CAAC9H,SAAO,CAAA4M,MAAkD,IAAvCvC,IAAI,CAAA0B,GAAI,CAACpO,OAAK,CAAA0K,OAAQ,GAAGrI,SAAO,CAAAoH,CAAE,CAAC,GAAG,CAAC;UAAA;QAAA;QAC9DpH,SAAO,CAAA4M,MAAA,GAAU,IAAH;QACd,MAAAC,MAAA,GAAeC,MAAM,CAAC1F,GAAC,EAAEpH,SAAO,CAAAsJ,KAAY,IAAnB,EAAmB,CAAC;QAC7CtJ,SAAO,CAAA+M,MAAA,GAAUF,MAAM,EAAAE,MAAT;QACdpK,MAAM,CAAAqK,WAAY,CAACH,MAAM,GAAGA,MAAM,CAAAzF,CAAS,GAAxB,IAAwB,CAAC;QAAA;MAAA;MAG9CyD,QAAQ,CAAClN,OAAK,CAAAwJ,aAAc,EAAEnH,SAAO,EAAEoH,GAAC,EAAEC,GAAC,CAAC;MAC5C6E,aAAa,CAACvO,OAAK,CAAAwJ,aAAc,EAAEC,GAAC,EAAEC,GAAC,CAAC;IAAA,CACzC;IAAC,IAAA4F,GAAA;IAAA,IAAA7N,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAAuH,MAAA,IAAAvH,CAAA,SAAAH,KAAA;MAEkBgO,GAAA,GAAAC,OAAA;QAClBhJ,OAAO,CAAAlE,OAAA,GAAW,KAAH;QACf,IAAIiB,KAAK,CAAAjB,OAAsC,IAA1BrC,OAAK,CAAAmB,IAAK,KAAK,WAAW;UAAEmC,KAAK,CAAAjB,OAAQ,CAAC,CAAC;QAAA;QAChEiB,KAAK,CAAAjB,OAAA,GAAW,IAAH;QACb,MAAAmN,SAAA,GAAgBnK,IAAI,CAAAhD,OAAQ;QAC5B,IAAI,CAACA,SAA8C,IAAnCA,SAAO,CAAAkI,OAAQ,KAAKvK,OAAK,CAAAwK,SAAU;UAAA;QAAA;QACnDnF,IAAI,CAAAhD,OAAA,GAAW,IAAH;QACZiL,aAAa,CAAC,CAAC;QACftN,OAAK,CAAAwJ,aAAc,CAAAiG,qBAAsB,CAACzP,OAAK,CAAAwK,SAAU,CAAC;QAC1D,IAAInI,SAAO,CAAA8H,IAAK,KAAK,MAAM;UACzBnF,MAAM,CAAAqK,WAAY,CAAC,IAAI,CAAC;UACxB,MAAAtG,IAAA,GAAaC,MAAM,CAAC3G,SAAO,CAAAuG,MAAO,CAAC;UACnC,IAAI,CAACvG,SAAO,CAAA4M,MAAO;YAEjB,IAAI5M,SAAO,CAAAsJ,KAAc,EAAAxH,MAAA,KAAK,CAAuB,IAAlB4E,IAAI,KAAKhI,SAAuC,IAA1Bf,OAAK,CAAAmB,IAAK,KAAK,WAAW;cAC5EG,KAAK,CAAA+B,QAAS,CAAC;gBAAAL,OAAA,EAAW,aAAa;gBAAA4F,MAAA,EAAUG,IAAI;gBAAA,IAAM1G,SAAO,CAAA+J,KAA2B,GAAlC;kBAAAsD,GAAA,EAAuB;gBAAU,CAAC,GAAlC,CAAiC,CAAC;cAAE,CAAC,CAAC;YAAA;YACvG;UAAA;UAGH,IAAIrN,SAAO,CAAA+M,MAAO,KAAKrO,SAA0B,IAAbsB,SAAO,CAAAsJ,KAAoC,IAA1B3L,OAAK,CAAAmB,IAAK,KAAK,WAAW;YACxEG,KAAK,CAAA+B,QAAS,CAAC;cAAAL,OAAA,EAAW,aAAa;cAAA2I,KAAA,EAAStJ,SAAO,CAAAsJ,KAAM;cAAAyD,MAAA,EAAU/M,SAAO,CAAA+M;YAAQ,CAAC,CAAC;UAAA;UAC9F;QAAA;QAGH,IAAI/M,SAAO,CAAA8H,IAAK,KAAK,QAAQ;UAAA;QAAA;QAC7B,MAAAwF,MAAA,GAAa3G,MAAM,CAAC3G,SAAO,CAAAuG,MAAO,CAAC;QACnC,MAAA6B,KAAA,GAAciC,IAAI,CAAAC,GAAI,CAAC,EAAE,EAAED,IAAI,CAAAG,GAAI,CAAC,MAAO,EAAEH,IAAI,CAAAkD,KAAM,CAACvN,SAAO,CAAAoI,KAAM,GAAGzK,OAAK,CAAA0K,OAAQ,GAAGrI,SAAO,CAAAoH,CAAE,CAAC,CAAC,CAAC;QACpG,IAAIV,MAAI,KAAKhI,SAAS;UACfO,KAAK,CAAA+B,QACC,CAAC;YAAAL,OAAA,EAAW,eAAe;YAAA+F,IAAA,EAAEA,MAAI;YAAA0B;UAAQ,CAAC,CAAC,CAAA9K,IAC/C,CAAC,MAAMqF,MAAM,CAAAgK,YAAa,CAAC3M,SAAO,CAAAuG,MAAO,EAAE,IAAI,CAAC,CAAC;QAAA;UAExD5D,MAAM,CAAAgK,YAAa,CAAC3M,SAAO,CAAAuG,MAAO,EAAE,IAAI,CAAC;QAAA;MAC1C,CACF;MAAAnH,CAAA,OAAAuD,MAAA;MAAAvD,CAAA,OAAAuH,MAAA;MAAAvH,CAAA,OAAAH,KAAA;MAAAG,CAAA,OAAA6N,GAAA;IAAA;MAAAA,GAAA,GAAA7N,CAAA;IAAA;IAlCD0H,WAAA,GAAoBmG,GAkCnB;IAGD,MAAAjE,aAAA,GAAsBrI,OAAA;MACf1B,KAAK,CAAA+B,QAAS,CAACL,OAAO,CAAC,CAAArD,IAAK,CAACmD,OAAA;QAChC,IAAI,CAACA,OAAO,CAAAG,EAAG;UACbzB,QAAQ,CACNsB,OAAO,CAAAI,KAAM,YAAY3E,YAAwD,IAAxCuE,OAAO,CAAAI,KAAM,CAAAC,MAAO,KAAK,eAExB,GADtCxB,QAAQ,CAAAkO,cAC8B,GAAtClO,QAAQ,CAAAO,MAAO,CAACY,OAAO,CAAAI,KAAM,CAAAE,OAAQ,CAC3C,CAAC;UAAA;QAAA;QAGH;UAAA4H,OAAA,EAAA8E,SAAA;UAAAtN,QAAA,EAAAuN,UAAA;UAAA9E,IAAA,EAAA+E;QAAA,IAAoC1O,KAAK,CAAAuH,WAAY,CAAC,CAAC;QACvD,MAAA5E,KAAA,GAAcpF,YAAY,CAACmM,SAAO,CAAAG,OAAQ,EAAE3I,UAAQ,CAAA4I,IAAK,EAAEH,MAAI,EAAAtF,QAAe,IAAnB,CAAmB,CAAC;QAC/EnE,QAAQ,CAACyC,KAAK,KAAK,IAA2E,GAApEtC,QAAQ,CAAAkO,cAA4D,GAA1ClO,QAAQ,CAAAsO,WAAY,CAACrO,MAAM,CAAAI,MAAO,CAACiC,KAAK,CAAC,CAAC,CAAC;MAAA,CAChG,CAAC;IAAA,CACH;IAGDmF,WAAA,GAAoB0B,GAAA;MAClB,MAAAoF,KAAA,GAAY5O,KAAK,CAAA6O,MAAO,CAACrF,GAAG,CAAC;MAC7B,IAAI,CAAC7K,KAAG;QAAA;MAAA;MACR;QAAA+K,OAAA,EAAAoF,SAAA;QAAA5N,QAAA,EAAA6N;MAAA,IAA8B/O,KAAK,CAAAuH,WAAY,CAAC,CAAC;MACjD,MAAAyH,OAAA,GAAcxR,UAAU,CAACkM,SAAO,CAAAG,OAAQ,EAAE3I,UAAQ,CAAA4I,IAAK,EAAEnL,KAAG,CAAC;MAC7DoL,aAAa,CAAC;QAAArI,OAAA,EAAW6K,OAAK,KAAK,SAA+B,GAAzC,SAAyC,GAAzC,OAAyC;QAAA0C,IAAA,EAAQ,CAACtQ,KAAG;MAAE,CAAC,CAAC;IAAA,CACnF;IAGD,MAAAkM,SAAA,GAAkBqE,MAAA;MAChB,MAAAC,MAAA,GAAanP,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ,CAAA0F,SAAc,EAAAC,EAAI,CAAH,EAAE,CAAC;MAC1D,IAAIF,MAA2B,IAAnBrG,MAAI,CAAAwG,IAAK,KAAK,KAA+B,IAAtBxG,MAAI,CAAAvE,OAAQ,KAAK,KAAoC,IAA3BuE,MAAI,CAAAvE,OAAQ,CAAAgL,QAAS,CAAC9H,MAAI,CAAC;QAAA,OAC/ElD,OAAO,CAAAgG,GAAI,CAACiF,MAA0B,CAAC,CAAAC,MAAO,CAACC,MAAA,IAAW5G,MAAI,CAAAvE,OAAQ,CAAAgL,QAAsB,CAACI,MAAI,CAAC,CAAC;MAAA;MAC3G,OACM,CAAClI,MAAI,CAAC;IAAA,CACd;IAMD,MAAAoG,MAAA,GAAeA,CAAA+B,GAAA,EAAAC,OAAA;MACb,IAAItL,OAAO,CAAA1B,MAAO,KAAK,CAAC;QAAA;MAAA;MACxB,IAAAwM,EAAA,GAAS1L,QAAQ,CAAAmM,QAAS,CAAC1E,IAAI,CAAAC,GAAI,CAAC1H,QAAQ,CAAA2H,WAAY,EAAEnD,GAAC,CAAC,CAAC;MAC7D,IAAIkH,EAAE,GAAG,CAAC;QAAEA,EAAA,CAAAA,CAAA,CAAKlH,GAAC,GAAGxE,QAAQ,CAAA2H,WAAqC,GAAjD,CAAiD,GAAlB/G,OAAO,CAAA1B,MAAO,GAAG,CAAC;MAApD;MACd,MAAAkN,MAAA,GAAepM,QAAQ,CAAAqM,OAAQ,CAACX,EAAE,CAAC,GAAG1L,QAAQ,CAAAiH,WAAY,CAACyE,EAAE,CAAC,GAAG,CAAC;MAClE,MAAAY,KAAA,GAAc9H,GAAC,GAAG4H,MAAoB,GAAxBV,EAAwB,GAANA,EAAE,GAAG,CAAC;MACtC,MAAAvB,MAAA,GAAemC,KAAK,GAAG1L,OAAO,CAAA1B,MAA2C,GAAjC0B,OAAO,CAAC0L,KAAK,CAAC,CAAA3I,MAAO,CAAAG,IAAY,GAA1D,IAA0D;MACzE,MAAAyI,KAAA,GAAc7F,OAAK,CAAAE,GAAI,CAAC4F,MAAA,IAAU5L,OAAO,CAAA6L,SAAU,CAACC,MAAA,IAAUV,MAAI,CAAArI,MAAO,CAAAG,IAAK,KAAKA,MAAI,CAAC,CAAC;MAEzF,IAAIqG,MAAM,KAAK,IAA8B,IAAtBzD,OAAK,CAAAkF,QAAS,CAACzB,MAAM,CAAC;QAAA;MAAA;MAC7C,IAAIoC,KAAK,CAAArN,MAAO,GAAG,CAAqC,IAAhCoN,KAAK,KAAK7E,IAAI,CAAAC,GAAI,IAAI6E,KAAK,CAAC,GAAG,CAAoD,IAA/CA,KAAK,CAAAI,KAAM,CAAC,CAAAC,MAAA,EAAAC,CAAA,KAAab,MAAI,KAAKO,KAAK,GAAG,GAAGM,CAAC,CAAC;QAAA;MAAA;MAG3G,MAAAC,KAAA,GAAcR,KAAK,GAAG1L,OAAO,CAAA1B,MAAmF,GAAzEc,QAAQ,CAAAqM,OAAQ,CAACC,KAAuD,CAAC,GAA/CtM,QAAQ,CAAAqM,OAAQ,CAACX,EAAE,CAAC,GAAG1L,QAAQ,CAAAiH,WAAY,CAACyE,EAAE,CAAC;MAAC,OAC1G;QAAAvB,MAAA;QAAA3F,CAAA,EAAasI;MAAM,CAAC;IAAA,CAC5B;IAACtQ,CAAA,OAAAD,QAAA;IAAAC,CAAA,OAAAuD,MAAA;IAAAvD,CAAA,OAAAoE,OAAA;IAAApE,CAAA,OAAAwD,QAAA;IAAAxD,CAAA,OAAAE,QAAA;IAAAF,CAAA,OAAAuH,MAAA;IAAAvH,CAAA,OAAAG,MAAA;IAAAH,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAAwH,aAAA;IAAAxH,CAAA,OAAAyH,aAAA;IAAAzH,CAAA,OAAA0H,WAAA;IAAA1H,CAAA,OAAA2H,WAAA;EAAA;IAAAH,aAAA,GAAAxH,CAAA;IAAAyH,aAAA,GAAAzH,CAAA;IAAA0H,WAAA,GAAA1H,CAAA;IAAA2H,WAAA,GAAA3H,CAAA;EAAA;EAAA,IAAA4I,GAAA;EAAA,IAAA5I,CAAA,SAAAwD,QAAA,IAAAxD,CAAA,SAAAsD,WAAA;IAGesF,GAAA,GAAAA,CAAA2H,QAAA,EAAAC,OAAA;MACf,MAAAC,UAAA,GAAiBnN,WAAW,CAAA1C,OAAQ;MACpC,IAAI,CAACd,UAAQ;QAAA;MAAA;MACb,MAAA4Q,MAAA,GAAa5Q,UAAQ,CAAA6Q,qBAAsB,CAAC,CAAC;MAC7ChM,OAAO,CAAC;QAAAwC,MAAA,EACNA,QAAM;QAAAa,CAAA,EACH4I,MAAI,CAAAC,IAAK,GAAG5F,IAAI,CAAAC,GAAI,CAAC,CAAC,EAAE1H,QAAQ,CAAAqM,OAAQ,CAACC,OAAK,CAAC,GAAGtM,QAAQ,CAAAiH,WAAY,CAACqF,OAAK,CAAC,GAAG,GAAG,CAAC;QAAA7H,CAAA,EACpF2I,MAAI,CAAAE,GAAI,GAAGtN,QAAQ,CAAAX;MACxB,CAAC,CAAC;IAAA,CACH;IAAA7C,CAAA,OAAAwD,QAAA;IAAAxD,CAAA,OAAAsD,WAAA;IAAAtD,CAAA,OAAA4I,GAAA;EAAA;IAAAA,GAAA,GAAA5I,CAAA;EAAA;EATD,MAAA+Q,QAAA,GAAiBnI,GAShB;EAAC,IAAAoI,GAAA;EAAA,IAAAC,OAAA;EAAA,IAAAjR,CAAA,SAAAuD,MAAA,IAAAvD,CAAA,SAAAwD,QAAA,IAAAxD,CAAA,SAAAuH,MAAA,IAAAvH,CAAA,SAAAmD,YAAA,IAAAnD,CAAA,SAAA+Q,QAAA,IAAA/Q,CAAA,SAAAH,KAAA;IAEFoR,OAAA,GAAgBC,OAAA;MACd,MAAAC,MAAA,GAAa5S,OAAK,CAAAwJ,aAAc,CAAA4I,qBAAsB,CAAC,CAAC;MACxD,MAAAS,KAAA,GAAY5N,QAAQ,CAAA8E,GAAI,CAAC/J,OAAK,CAAA0K,OAAQ,GAAG2H,MAAI,CAAAC,IAAK,EAAEtS,OAAK,CAAA8S,OAAQ,GAAGT,MAAI,CAAAE,GAAI,CAAC;MAC7E,MAAAQ,QAAA,GAAe/J,MAAM,CAACe,KAAG,CAAAnB,MAAO,CAAC;MACjC,IAAImB,KAAG,CAAAa,IAAK,KAAK,QAAoB,IAARb,KAAG,CAAA5D,IAA6B,IAApByC,QAAM,KAAK7H,SAAS;QAAEyR,QAAQ,CAAC5J,QAAM,EAAEmB,KAAG,CAAAnB,MAAO,CAAC;MAAA;MAE3F,IAAImB,KAAG,CAAAa,IAAK,KAAK,MAAyB,IAAtC,CAAwB5K,OAAK,CAAAE,QAA2B,IAAxD,CAA2CF,OAAK,CAAAK,OAA0B,IAA1E,CAA6DL,OAAK,CAAAI,OAAQ;QAAEqS,GAAG,CAAC1I,KAAG,CAAAe,GAAI,EAAEf,KAAG,CAAAnB,MAAO,CAAC;MAAA;IAAC,CAC1G;IAGD6J,GAAA,GAAYA,CAAAO,KAAA,EAAAC,QAAA;MACV,MAAAC,KAAA,GAAclO,MAAM,CAAA6J,QAAS,CAAC/D,KAAG,EAAElC,QAAM,CAAC;MAC1C,IAAI,CAACsK,KAAsB,IAAvB,CAAWtO,YAAY;QAAA,OAAS,KAAK;MAAA;MACzCA,YAAY,CAAC;QAAA,GAAKsO,KAAK,CAAAC,IAAK;QAAAvE,MAAA,EAAUsE,KAAK,CAAAtE,MAAO;QAAA3O,GAAA,EAAOqB,KAAK,CAAA6O,MAAO,CAACrF,KAAG;MAAE,CAAC,CAAC;MAAA,OACtE,IAAI;IAAA,CACZ;IAACrJ,CAAA,OAAAuD,MAAA;IAAAvD,CAAA,OAAAwD,QAAA;IAAAxD,CAAA,OAAAuH,MAAA;IAAAvH,CAAA,OAAAmD,YAAA;IAAAnD,CAAA,OAAA+Q,QAAA;IAAA/Q,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAAgR,GAAA;IAAAhR,CAAA,OAAAiR,OAAA;EAAA;IAAAD,GAAA,GAAAhR,CAAA;IAAAiR,OAAA,GAAAjR,CAAA;EAAA;EAAA,IAAA2R,aAAA;EAAA,IAAA3R,CAAA,SAAAwD,QAAA,IAAAxD,CAAA,SAAAuH,MAAA,IAAAvH,CAAA,SAAAH,KAAA;IAEF8R,aAAA,GAAsBC,OAAA;MACpB,MAAAC,MAAA,GAAatT,OAAK,CAAAwJ,aAAc,CAAA4I,qBAAsB,CAAC,CAAC;MACxD,MAAAmB,KAAA,GAAYtO,QAAQ,CAAA8E,GAAI,CAAC/J,OAAK,CAAA0K,OAAQ,GAAG2H,MAAI,CAAAC,IAAK,EAAEtS,OAAK,CAAA8S,OAAQ,GAAGT,MAAI,CAAAE,GAAI,CAAC;MAC7E,MAAAiB,QAAA,GAAexK,MAAM,CAACe,KAAG,CAAAnB,MAAO,CAAC;MACjC,IAAKmB,KAAG,CAAAa,IAAK,KAAK,QAA+B,IAAnBb,KAAG,CAAAa,IAAK,KAAK,MAA+B,IAApBhC,QAAM,KAAK7H,SAAS;QAAA;MAAA;MAC1Ef,OAAK,CAAA0C,cAAe,CAAC,CAAC;MACtB,MAAA+Q,IAAA,GAAW;QAAAhK,CAAA,EAAKzJ,OAAK,CAAA0K,OAAQ;QAAAhB,CAAA,EAAK1J,OAAK,CAAA8S;MAAS,CAAC;MAC7CY,GAAA,CAAAA,IAAA;MACJ,IAAI3J,KAAG,CAAAa,IAAK,KAAK,QAAQ;QACvB8I,IAAA,CAAAA,CAAA,CAAOA,EAAA,CAAAA,EAAA,CAAMtN,OAAO,CAAC;UAAAwC,MAAA,EAAEA,QAAM;UAAA,GAAK+H;QAAG,CAAC,CAAC;MAAnC;QAGJ,IAAI,CAACgD,UAAU,CAAC5J,KAAG,CAAAe,GAAI,EAAElC,QAAM,CAAC;UAAOtH,KAAK,CAAA+B,QAAS,CAAC;YAAAL,OAAA,EAAW,QAAQ;YAAA8H,GAAA,EAAOf,KAAG,CAAAe,GAAI;YAAAlC,MAAA,EAAEA;UAAO,CAAC,CAAC;QAAA;QAClG8K,IAAA,CAAAA,CAAA,CAAOA,EAAA,CAAAA,EAAA,CAAMjN,WAAW,CAAC;UAAAqE,GAAA,EAAOf,KAAG,CAAAe,GAAI;UAAAlC,MAAA,EAAEA,QAAM;UAAA,GAAK+H;QAAG,CAAC,CAAC;MAArD;MAGN,IAAIpK,OAAO,CAAAlE,OAAQ;QAAEiB,KAAK,CAAAjB,OAAA,GAAWqR,IAAH;MAAA;QAC7BA,IAAI,CAAC,CAAC;MAAA;IAAC,CACb;IAGD,MAAAC,UAAA,GAAmBA,CAAAC,KAAA,EAAAC,QAAA;MACjB;QAAAnD,SAAA;QAAAzK,MAAA,EAAA6N;MAAA,IAA8BxS,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ;MACzD,IAAI,CAAC0F,SAAS;QAAA,OAASzK,QAAM,EAAA6E,GAAK,KAAKA,KAA+B,IAAxB7E,QAAM,CAAA2C,MAAO,KAAKA,QAAM;MAAA;MAAC,OAChE8H,SAAS,CAAAqD,IAAK,CACnBC,KAAA,IACE,CAACA,KAAK,CAAApD,IAAK,KAAK,KAAsD,IAA5C9F,KAAG,IAAIkJ,KAAK,CAAApD,IAAK,GAA0B,IAAnB9F,KAAG,GAAGkJ,KAAK,CAAApD,IAAK,GACP,MAA1DoD,KAAK,CAAAnO,OAAQ,KAAK,KAAuC,IAA9BmO,KAAK,CAAAnO,OAAQ,CAAAgL,QAAS,CAACjI,QAAM,CAAE,CAC/D,CAAC;IAAA,CACF;IAACnH,CAAA,OAAAwD,QAAA;IAAAxD,CAAA,OAAAuH,MAAA;IAAAvH,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAA2R,aAAA;EAAA;IAAAA,aAAA,GAAA3R,CAAA;EAAA;EAAA,IAAA4K,GAAA;EAAA,IAAA5K,CAAA,SAAAD,QAAA,IAAAC,CAAA,SAAAE,QAAA,IAAAF,CAAA,SAAAG,MAAA,IAAAH,CAAA,SAAAH,KAAA;IAGoB+K,GAAA,GAAAA,CAAA;MACf/K,KAAK,CAAA+B,QAAS,CAAC;QAAAL,OAAA,EAAW;MAAO,CAAC,CAAC,CAAArD,IAAK,CAAC,MAAAiE,SAAA;QAC5C,IAAI,CAACd,SAAO,CAAAG,EAAG;UACbzB,QAAQ,CAACG,QAAQ,CAAAO,MAAO,CAACY,SAAO,CAAAI,KAAM,CAAAE,OAAQ,CAAC,CAAC;UAAA;QAAA;QAEjD;QACD;UACE,MAAMxC,mBAAmB,CAACkC,SAAO,CAAAtC,MAAO,CAAC;UACzCgB,QAAQ,CAACG,QAAQ,CAAAI,MAAO,CAACH,MAAM,CAAAI,MAAO,CAACC,UAAU,CAACa,SAAO,CAAAtC,MAAO,CAAC,CAAC,CAAC,CAAC;QAAA,SAAA2M,GAAA;UAC7DjK,KAAA,CAAAA,KAAA,CAAAA,CAAA,CAAAA,GAAK;UACZ1B,QAAQ,CAACG,QAAQ,CAAAO,MAAO,CAACgB,KAAK,YAAY+Q,KAAqC,GAA7B/Q,KAAK,CAAAE,OAAwB,GAAb2I,MAAM,CAAC7I,KAAK,CAAC,CAAC,CAAC;QAAA;MAClF,CACF,CAAC;IAAA,CACH;IAAAzB,CAAA,OAAAD,QAAA;IAAAC,CAAA,OAAAE,QAAA;IAAAF,CAAA,OAAAG,MAAA;IAAAH,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAA4K,GAAA;EAAA;IAAAA,GAAA,GAAA5K,CAAA;EAAA;EAbD,MAAAyS,aAAA,GAAsB7H,GAarB;EAAC,IAAAc,GAAA;EAAA,IAAA1L,CAAA,SAAAoE,OAAA,IAAApE,CAAA,SAAAwD,QAAA,IAAAxD,CAAA,SAAAsD,WAAA,IAAAtD,CAAA,SAAAH,KAAA;IAGmB6L,GAAA,GAAAA,CAAA;MACnB,MAAAgH,UAAA,GAAiBpP,WAAW,CAAA1C,OAAQ;MACpC,MAAA+R,QAAA,GAAe9S,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ,CAAA/E,MAAO;MACjD,IAAI,CAAC1E,UAAmB,IAApB,CAAc0E,QAAM;QAAA;MAAA;MACxB,MAAAoO,OAAA,GAAcxO,OAAO,CAAA6L,SAAU,CAAC4C,MAAA,IAAUrD,MAAI,CAAArI,MAAO,CAAAG,IAAK,KAAK9C,QAAM,CAAA2C,MAAO,CAAC;MAC7E,IAAI2I,OAAK,GAAG,CAAC;QAAA;MAAA;MACb,MAAAgD,GAAA,GAAYtP,QAAQ,CAAAuP,OAAQ,CAACvO,QAAM,CAAA6E,GAAI,EAAEyG,OAAK,CAAC;MAC/C,MAAAkD,MAAA,GAAalT,UAAQ,CAAA6Q,qBAAsB,CAAC,CAAC;MAC7C3L,WAAW,CAAC;QAAAqE,GAAA,EACL7E,QAAM,CAAA6E,GAAI;QAAAlC,MAAA,EACP3C,QAAM,CAAA2C,MAAO;QAAAa,CAAA,EAClB4I,MAAI,CAAAC,IAAK,GAAGiC,GAAG,CAAAjC,IAAK;QAAA5I,CAAA,EACpB2I,MAAI,CAAAE,GAAI,GAAGgC,GAAG,CAAAhC,GAAI,GAAGgC,GAAG,CAAAG;MAC7B,CAAC,CAAC;IAAA,CACH;IAAAjT,CAAA,OAAAoE,OAAA;IAAApE,CAAA,OAAAwD,QAAA;IAAAxD,CAAA,OAAAsD,WAAA;IAAAtD,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAA0L,GAAA;EAAA;IAAAA,GAAA,GAAA1L,CAAA;EAAA;EAdD,MAAAkT,YAAA,GAAqBxH,GAcpB;EAAC,IAAAI,GAAA;EAAA,IAAA9L,CAAA,SAAAsD,WAAA;IAEoBwI,GAAA,GAAAA,CAAA;MACpB9G,WAAW,CAAC,IAAI,CAAC;MACjB1B,WAAW,CAAA1C,OAAe,EAAAwH,KAAyB,CAAxB;QAAAC,aAAA,EAAiB;MAAK,CAAC,CAAC;IAAA,CACpD;IAAArI,CAAA,OAAAsD,WAAA;IAAAtD,CAAA,OAAA8L,GAAA;EAAA;IAAAA,GAAA,GAAA9L,CAAA;EAAA;EAHD,MAAAmT,aAAA,GAAsBrH,GAGrB;EAAC,IAAA+B,GAAA;EAAA,IAAA7N,CAAA,SAAAsD,WAAA;IAEgBuK,GAAA,GAAAA,CAAA;MAChBlJ,OAAO,CAAC,IAAI,CAAC;MACbrB,WAAW,CAAA1C,OAAe,EAAAwH,KAAyB,CAAxB;QAAAC,aAAA,EAAiB;MAAK,CAAC,CAAC;IAAA,CACpD;IAAArI,CAAA,OAAAsD,WAAA;IAAAtD,CAAA,OAAA6N,GAAA;EAAA;IAAAA,GAAA,GAAA7N,CAAA;EAAA;EAHD,MAAAoT,SAAA,GAAkBvF,GAGjB;EAAC,IAAAwF,aAAA;EAAA,IAAAC,YAAA;EAAA,IAAAtT,CAAA,SAAAD,QAAA,IAAAC,CAAA,SAAAwD,QAAA,IAAAxD,CAAA,SAAAE,QAAA,IAAAF,CAAA,SAAAuH,MAAA,IAAAvH,CAAA,SAAAH,KAAA;IAEFwT,aAAA,GAAsBE,OAAA;MACpB,MAAAC,MAAA,GAAajV,OAAK,CAAAwJ,aAAc,CAAA4I,qBAAsB,CAAC,CAAC;MACxD,MAAA8C,KAAA,GAAYjQ,QAAQ,CAAA8E,GAAI,CAAC/J,OAAK,CAAA0K,OAAQ,GAAG2H,MAAI,CAAAC,IAAK,EAAEtS,OAAK,CAAA8S,OAAQ,GAAGT,MAAI,CAAAE,GAAI,CAAC;MAC7E,MAAA4C,MAAA,GAAanM,MAAM,CAACe,KAAG,CAAAnB,MAAO,CAAC;MAE/B,IAAImB,KAAG,CAAAa,IAAK,KAAK,QAAoB,IAARb,KAAG,CAAAkC,IAA2B,IAAlBlD,MAAI,KAAKhI,SAAS;QACpDO,KAAK,CAAA+B,QAAS,CAAC;UAAAL,OAAA,EAAW,eAAe;UAAA+F,IAAA,EAAEA,MAAI;UAAA0B,KAAA,EAAS;QAAK,CAAC,CAAC;MAAA;QACjE,IAAIV,KAAG,CAAAa,IAAK,KAAK,MAAM;UAAEmK,YAAY,CAAChU,SAAS,CAAC;QAAA;MAAC;IAAA,CACvD;IAODgU,YAAA,GAAqBrR,IAAA;MACnB,MAAA0R,SAAA,GAAgB9T,KAAK,CAAAyB,YAAa,CAChCW,IAAI,KAAK3C,SAAuE,GAAhF;QAAAiC,OAAA,EAAgC;MAA+C,CAAC,GAAhF;QAAAA,OAAA,EAA4D,YAAY;QAAAU;MAAO,CACjF,CAAC;MACD,IAAIZ,SAAO,CAAAG,EAAG;QACZ,IAAI3B,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ,CAAA1F,MAAO;UAAEA,MAAM,CAAAjD,OAAc,EAAAqR,IAAE,CAAD,CAAC;QAAA;QAAC,OACxD,IAAI;MAAA;MAEb,IAAI5Q,SAAO,CAAAI,KAAM,YAAY3E,YAAoD,IAApCuE,SAAO,CAAAI,KAAM,CAAAC,MAAO,KAAK,WAAW;QAAE3B,QAAQ,CAACG,QAAQ,CAAA0T,QAAS,CAAC;MAAA;QACzG7T,QAAQ,CAACG,QAAQ,CAAAO,MAAO,CAACY,SAAO,CAAAI,KAAM,CAAAE,OAAQ,CAAC,CAAC;MAAA;MAAC,OAC/C,KAAK;IAAA,CACb;IAAC3B,CAAA,OAAAD,QAAA;IAAAC,CAAA,OAAAwD,QAAA;IAAAxD,CAAA,OAAAE,QAAA;IAAAF,CAAA,OAAAuH,MAAA;IAAAvH,CAAA,OAAAH,KAAA;IAAAG,CAAA,OAAAqT,aAAA;IAAArT,CAAA,QAAAsT,YAAA;EAAA;IAAAD,aAAA,GAAArT,CAAA;IAAAsT,YAAA,GAAAtT,CAAA;EAAA;EAAA,IAAA6T,GAAA;EAAA,IAAA7T,CAAA,UAAAgR,GAAA,IAAAhR,CAAA,UAAA8C,UAAA,IAAA9C,CAAA,UAAAoE,OAAA,IAAApE,CAAA,UAAAoD,MAAA,IAAApD,CAAA,UAAAkT,YAAA,IAAAlT,CAAA,UAAA+Q,QAAA,IAAA/Q,CAAA,UAAA+D,MAAA,IAAA/D,CAAA,UAAAsT,YAAA,IAAAtT,CAAA,UAAAH,KAAA,IAAAG,CAAA,UAAA2H,WAAA;IAEgBkM,GAAA,GAAAC,OAAA;MAChB,IAAIvV,OAAK,CAAAkP,MAAO,KAAKlP,OAAK,CAAAwJ,aAAc;QAAA;MAAA;MAExC,MAAAgM,SAAA,GAAkBxV,OAAK,CAAAyV,WAAY,CAAAC,WAAqC,IAArB1V,OAAK,CAAA2V,OAAQ,KAAK,GAAG;MAExE,IAAI,CAACH,SAA8B,IAAjBxV,OAAK,CAAAC,GAAI,KAAK,GAAoB,IAAhD,CAAoCD,OAAK,CAAAG,MAAyB,IAAlE,CAAqDH,OAAK,CAAAI,OAA0B,IAApF,CAAuEJ,OAAK,CAAAK,OAA2B,IAAvG,CAAyFL,OAAK,CAAAE,QAAS;QACzG,MAAA0V,QAAA,GAAetU,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ,CAAA/E,MAAO;QACjD,IAAI,CAACA,QAAM;UAAA;QAAA;QACX,MAAA4P,QAAA,GAAehQ,OAAO,CAAA6L,SAAU,CAACoE,MAAA,IAAU7E,MAAI,CAAArI,MAAO,CAAAG,IAAK,KAAK9C,QAAM,CAAA2C,MAAO,CAAC;QAC9E,IAAI6J,GAAG,CAACxM,QAAM,CAAA6E,GAAI,EAAElC,QAAM,CAAC;UACzB5I,OAAK,CAAA0C,cAAe,CAAC,CAAC;UAAA;QAAA;QAGxB,IAAI,CAAC6B,UAAU;UAAA;QAAA;QACfvE,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtB0G,WAAW,CAACnD,QAAM,CAAA6E,GAAI,CAAC;QAAA;MAAA;MAIzB,IAAI,CAACrM,OAAO,CAAiC,CAAC,GAA7BuB,OAAK,CAAAK,OAAwB,GAAbL,OAAK,CAAAI,OAAqD,MAAvCJ,OAAK,CAAAC,GAAI,KAAK,GAAwB,IAAjBD,OAAK,CAAAC,GAAI,KAAK,GAAI,CAAiB,IAAxG,CAA4FD,OAAK,CAAAG,MAAO;QAC1G,IAAI,CAAC0E,MAA+D,IAArDvD,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAkN,KAAoB,EAAAC,YAAK,CAAAC,IAAA,KAAK,IAAI;UAAA;QAAA;QACpEjW,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtBmC,MAAM,CAAC,CAAC;QAAA;MAAA;MAIV,IAAI7E,OAAK,CAAAC,GAAI,KAAK,aAAwD,IAAtCD,OAAK,CAAAC,GAAI,KAAK,KAAuB,IAAdD,OAAK,CAAAE,QAAU;QACxEF,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtBiS,YAAY,CAAC,CAAC;QAAA;MAAA;MAIhB,IAAI,CAACa,SAAyB,IAAZxV,OAAK,CAAAG,MAAgC,IAArBH,OAAK,CAAAC,GAAI,KAAK,OAAyB,IAArE,CAAwDD,OAAK,CAAAI,OAA0B,IAAvF,CAA0EJ,OAAK,CAAAK,OAA2B,IAA1G,CAA4FL,OAAK,CAAAE,QAAS;QAC5GF,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtB,MAAAwT,MAAA,GAAa5U,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ,CAAAmL,MAAa,EAAAzC,IAAA,KAAK,IAAI;QACzDpS,KAAK,CAAA+B,QAAS,CAAC;UAAAL,OAAA,EAAW0Q,MAAI,GAAJ,cAAqC,GAArC;QAAsC,CAAC,CAAC;QAAA;MAAA;MAIzE,IAAI1T,OAAK,CAAAG,MAAoC,IAAzBH,OAAK,CAAAC,GAAI,KAAK,WAA6B,IAA3D,CAA8CD,OAAK,CAAAI,OAA0B,IAA7E,CAAgEJ,OAAK,CAAAK,OAAQ;QAC/E,MAAA+V,QAAA,GAAe9U,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAmC,OAAQ,CAAA/E,MAAe,EAAA2C,MAAA;QACzD,MAAAyN,OAAA,GAAcxQ,OAAO,CAAA6L,SAAU,CAAC4E,MAAA,IAAUrF,MAAI,CAAArI,MAAO,CAAAG,IAAK,KAAKH,QAAM,CAAC;QACtE,IAAIA,QAAM,KAAK7H,SAAsB,IAATwQ,OAAK,GAAG,CAAC;UAAA;QAAA;QACrCvR,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtB8P,QAAQ,CAAC5J,QAAM,EAAE2I,OAAK,CAAC;QAAA;MAAA;MAGzB,IAAI5S,SAAS,CAAC;QAAA,GAAKoB,IAAI,CAACC,OAAK,CAAC;QAAA2V,OAAA,EAAW3V,OAAK,CAAA2V,OAAQ;QAAAD,WAAA,EAAe1V,OAAK,CAAAyV,WAAY,CAAAC;MAAa,CAAC,CAAC;QAEnG,IAAI,CAACX,YAAY,CAAC,EAAE,CAAC;UAAE/U,OAAK,CAAA0C,cAAe,CAAC,CAAC;QAAA;QAAC;MAAA;MAGhD,MAAA6T,SAAA,GAAgB7X,UAAU,CAACsB,OAAK,EAAEvB,OAAO,CAAC,CAAC,CAAC;MAC5C,IAAI,CAACuE,SAAO;QAAA;MAAA;MACZ,IAAIA,SAAO,CAAAA,OAAQ,KAAK,MAAM;QAE5B,IAAI,CAACwC,MAA+D,IAArDlE,KAAK,CAAAuH,WAAY,CAAC,CAAC,CAAAkN,KAAoB,EAAAC,YAAK,CAAAQ,IAAA,KAAK,IAAI;UAAA;QAAA;QACpExW,OAAK,CAAA0C,cAAe,CAAC,CAAC;QACtB8C,MAAM,CAAAgR,IAAK,CAAC,CAAC;QAAA;MAAA;MAGfxW,OAAK,CAAA0C,cAAe,CAAC,CAAC;MACjBpB,KAAK,CAAA+B,QAAS,CAACL,SAAO,CAAC;IAAA,CAC7B;IAAAvB,CAAA,QAAAgR,GAAA;IAAAhR,CAAA,QAAA8C,UAAA;IAAA9C,CAAA,QAAAoE,OAAA;IAAApE,CAAA,QAAAoD,MAAA;IAAApD,CAAA,QAAAkT,YAAA;IAAAlT,CAAA,QAAA+Q,QAAA;IAAA/Q,CAAA,QAAA+D,MAAA;IAAA/D,CAAA,QAAAsT,YAAA;IAAAtT,CAAA,QAAAH,KAAA;IAAAG,CAAA,QAAA2H,WAAA;IAAA3H,CAAA,QAAA6T,GAAA;EAAA;IAAAA,GAAA,GAAA7T,CAAA;EAAA;EA/DD,MAAAgV,SAAA,GAAkBnB,GA+DjB;EAAC,IAAAoB,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAAC,GAAA;EAAA,IAAA7V,CAAA,UAAAwE,MAAA,IAAAxE,CAAA,UAAAsE,IAAA,IAAAtE,CAAA,UAAAoE,OAAA,IAAApE,CAAA,UAAAiE,EAAA,IAAAjE,CAAA,UAAAqD,KAAA,IAAArD,CAAA,UAAAkE,QAAA,IAAAlE,CAAA,UAAAsD,WAAA,IAAAtD,CAAA,UAAA4E,SAAA;IAGF,MAAAkR,YAAA,GAAqBtR,MAAM,GAAGJ,OAAO,CAAA6L,SAAU,CAAC8F,MAAA,IAAUvG,MAAI,CAAArI,MAAO,CAAAG,IAAK,KAAK9C,MAAM,CAAA2C,MAAW,CAAC,GAA5E,CAA4E;IACjG,MAAA6O,SAAA,GAAkBxR,MAAM,EAAA6E,GAAU,IAAhB,CAAgB;IAClC,MAAA4M,WAAA,GAAoB/R,QAAQ,GAAG,CAAsB,IAAjB4R,YAAY,IAAI,CAAC;IAGpCH,GAAA,YAAS;IAAMlS,GAAA,CAAAA,CAAA,CAAAA,OAAO;IAAA,IAAAzD,CAAA,UAAA2L,MAAA,CAAAC,GAAA;MACnCiK,GAAA,gBAAA/X,IAAA;QAAkBoY,SAAW,EAAX,WAAW;QAAMxS,GAAS,EAATA;MAAS,CAAG,CAAC;MAAA1D,CAAA,QAAA6V,GAAA;IAAA;MAAAA,GAAA,GAAA7V,CAAA;IAAA;IAGpCiV,GAAA,gBAAa;IAClB3R,GAAA,CAAAA,CAAA,CAAAA,WAAW;IACX6R,GAAA,SAAM;IACDC,GAAA,IAAC;IACC/R,GAAA,CAAAA,CAAA,CAAAA,KAAK;IACFiS,GAAA,GAAApR,QAAQ,GAAG,CAAC,IAAIU,SAAS,GAAT,CAAiB,GAAjB,CAAiB,CAAC;IAClC2Q,GAAA,GAAAnR,OAAO,CAAA1B,MAAO;IACR8S,GAAA,SAAM;IAChBlR,GAAA,CAAAA,CAAA,CAAAA,IAAI;IACQoR,GAAA,GAAAO,WAAW,GAAG1Y,MAAM,CAAC0G,EAAE,EAAE+R,SAAS,EAAEF,YAAwB,CAAC,GAA7DxW,SAA6D;IAAAU,CAAA,QAAAwE,MAAA;IAAAxE,CAAA,QAAAsE,IAAA;IAAAtE,CAAA,QAAAoE,OAAA;IAAApE,CAAA,QAAAiE,EAAA;IAAAjE,CAAA,QAAAqD,KAAA;IAAArD,CAAA,QAAAkE,QAAA;IAAAlE,CAAA,QAAAsD,WAAA;IAAAtD,CAAA,QAAA4E,SAAA;IAAA5E,CAAA,QAAAiV,GAAA;IAAAjV,CAAA,QAAAkV,GAAA;IAAAlV,CAAA,QAAAmV,GAAA;IAAAnV,CAAA,QAAAoV,GAAA;IAAApV,CAAA,QAAAqV,GAAA;IAAArV,CAAA,QAAAsV,GAAA;IAAAtV,CAAA,QAAAuV,GAAA;IAAAvV,CAAA,QAAAwV,GAAA;IAAAxV,CAAA,QAAAyV,GAAA;IAAAzV,CAAA,QAAA0V,GAAA;IAAA1V,CAAA,QAAA2V,GAAA;IAAA3V,CAAA,QAAA4V,GAAA;IAAA5V,CAAA,QAAA6V,GAAA;EAAA;IAAAZ,GAAA,GAAAjV,CAAA;IAAAkV,GAAA,GAAAlV,CAAA;IAAAmV,GAAA,GAAAnV,CAAA;IAAAoV,GAAA,GAAApV,CAAA;IAAAqV,GAAA,GAAArV,CAAA;IAAAsV,GAAA,GAAAtV,CAAA;IAAAuV,GAAA,GAAAvV,CAAA;IAAAwV,GAAA,GAAAxV,CAAA;IAAAyV,GAAA,GAAAzV,CAAA;IAAA0V,GAAA,GAAA1V,CAAA;IAAA2V,GAAA,GAAA3V,CAAA;IAAA4V,GAAA,GAAA5V,CAAA;IAAA6V,GAAA,GAAA7V,CAAA;EAAA;EAAA,IAAAmW,GAAA;EAAA,IAAAnW,CAAA,UAAA2L,MAAA,CAAAC,GAAA;IAUpFuK,GAAA,gBAAArY,IAAA;MAAeoY,SAAU,EAAV,UAAU;MAAMvS,GAAQ,EAARA;IAAQ,CAAG,CAAC;IAAA3D,CAAA,QAAAmW,GAAA;EAAA;IAAAA,GAAA,GAAAnW,CAAA;EAAA;EAAA,IAAAoW,GAAA;EAAA,IAAApW,CAAA,UAAAuD,MAAA,IAAAvD,CAAA,UAAAiE,EAAA;IAC3CmS,GAAA,gBAAAtY,IAAA,CAACR,cAAc;MAASiG,MAAM,EAANA,MAAM;MAAMU,EAAE,EAAFA;IAAE,CAAG,CAAC;IAAAjE,CAAA,QAAAuD,MAAA;IAAAvD,CAAA,QAAAiE,EAAA;IAAAjE,CAAA,QAAAoW,GAAA;EAAA;IAAAA,GAAA,GAAApW,CAAA;EAAA;EAAA,IAAAqW,GAAA;EAAA,IAAArW,CAAA,UAAAiR,OAAA,IAAAjR,CAAA,UAAA2R,aAAA,IAAA3R,CAAA,UAAAqT,aAAA,IAAArT,CAAA,UAAAgV,SAAA,IAAAhV,CAAA,UAAAwH,aAAA,IAAAxH,CAAA,UAAAyH,aAAA,IAAAzH,CAAA,UAAA0H,WAAA,IAAA1H,CAAA,UAAAiV,GAAA,IAAAjV,CAAA,UAAAkV,GAAA,IAAAlV,CAAA,UAAAmV,GAAA,IAAAnV,CAAA,UAAAoV,GAAA,IAAApV,CAAA,UAAAqV,GAAA,IAAArV,CAAA,UAAAsV,GAAA,IAAAtV,CAAA,UAAAuV,GAAA,IAAAvV,CAAA,UAAAwV,GAAA,IAAAxV,CAAA,UAAAyV,GAAA,IAAAzV,CAAA,UAAA0V,GAAA,IAAA1V,CAAA,UAAAoW,GAAA;IArB5CC,GAAA,gBAAArY,KAAA;MACYkY,SAAa,EAAbjB,GAAa;MAClB3R,GAAW,EAAXA,GAAW;MACXgT,IAAM,EAANnB,GAAM;MACDoB,QAAC,EAADnB,GAAC;MACC/R,aAAA,CAAAA,GAAK;MACF,iBAAAiS,GAAkC;MAClC,iBAAAC,GAAc;MACR,wBAAAC,GAAM;MAChBlR,YAAA,CAAAA,GAAI;MACQ,yBAAAoR,GAA6D;MACzEV,SAAS,EAATA,SAAS;MACLxN,aAAa,EAAbA,aAAa;MACbC,aAAa,EAAbA,aAAa;MACfC,WAAW,EAAXA,WAAW;MACPA,eAAW,EAAXA,WAAW;MACb2L,aAAa,EAAbA,aAAa;MACnBpC,OAAO,EAAPA,OAAO;MACDU,aAAa,EAAbA,aAAa;MAAA6E,QAAA,GAE5BL,GAA2C,EAC3CC,GAA0C;IAAA,CACvC,CAAC;IAAApW,CAAA,QAAAiR,OAAA;IAAAjR,CAAA,QAAA2R,aAAA;IAAA3R,CAAA,QAAAqT,aAAA;IAAArT,CAAA,QAAAgV,SAAA;IAAAhV,CAAA,QAAAwH,aAAA;IAAAxH,CAAA,QAAAyH,aAAA;IAAAzH,CAAA,QAAA0H,WAAA;IAAA1H,CAAA,QAAAiV,GAAA;IAAAjV,CAAA,QAAAkV,GAAA;IAAAlV,CAAA,QAAAmV,GAAA;IAAAnV,CAAA,QAAAoV,GAAA;IAAApV,CAAA,QAAAqV,GAAA;IAAArV,CAAA,QAAAsV,GAAA;IAAAtV,CAAA,QAAAuV,GAAA;IAAAvV,CAAA,QAAAwV,GAAA;IAAAxV,CAAA,QAAAyV,GAAA;IAAAzV,CAAA,QAAA0V,GAAA;IAAA1V,CAAA,QAAAoW,GAAA;IAAApW,CAAA,QAAAqW,GAAA;EAAA;IAAAA,GAAA,GAAArW,CAAA;EAAA;EAAA,IAAAyW,GAAA;EAAA,IAAAzW,CAAA,UAAAD,QAAA,IAAAC,CAAA,UAAAuD,MAAA,IAAAvD,CAAA,UAAAsD,WAAA;IACNmT,GAAA,gBAAA3Y,IAAA,CAACN,UAAU;MAAS+F,MAAM,EAANA,MAAM;MAAeD,WAAW,EAAXA,WAAW;MAAYvD,QAAQ,EAARA,QAAQ;MAAO8D,GAAM,EAANA;IAAM,CAAG,CAAC;IAAA7D,CAAA,QAAAD,QAAA;IAAAC,CAAA,QAAAuD,MAAA;IAAAvD,CAAA,QAAAsD,WAAA;IAAAtD,CAAA,QAAAyW,GAAA;EAAA;IAAAA,GAAA,GAAAzW,CAAA;EAAA;EAAA,IAAA0W,GAAA;EAAA,IAAA1W,CAAA,UAAAoT,SAAA,IAAApT,CAAA,UAAA0E,IAAA;IACxFgS,GAAA,GAAAhS,IAIA,iBAJA5G,IAAA,CACEzB,QAAQ;MAAWsa,QAAI,EAAJ,IAAI;MAAAH,QAAA,eACtB1Y,IAAA,CAACG,UAAU;QAASyG,MAAI,EAAJA,IAAI;QAAW0O,OAAS,EAATA;MAAS,CAAG;IAAC,CAEpD,CAAC;IAAApT,CAAA,QAAAoT,SAAA;IAAApT,CAAA,QAAA0E,IAAA;IAAA1E,CAAA,QAAA0W,GAAA;EAAA;IAAAA,GAAA,GAAA1W,CAAA;EAAA;EAAA,IAAA4W,GAAA;EAAA,IAAA5W,CAAA,UAAA+E,QAAA,IAAA/E,CAAA,UAAAmT,aAAA,IAAAnT,CAAA,UAAAyS,aAAA;IACAmE,GAAA,GAAA7R,QAIA,iBAJAjH,IAAA,CACEzB,QAAQ;MAAWsa,QAAI,EAAJ,IAAI;MAAAH,QAAA,eACtB1Y,IAAA,CAACO,QAAQ;QAAS0G,MAAQ,EAARA,QAAQ;QAAWoO,OAAa,EAAbA,aAAa;QAAQV,IAAa,EAAbA;MAAa,CAAG;IAAC,CAE/E,CAAC;IAAAzS,CAAA,QAAA+E,QAAA;IAAA/E,CAAA,QAAAmT,aAAA;IAAAnT,CAAA,QAAAyS,aAAA;IAAAzS,CAAA,QAAA4W,GAAA;EAAA;IAAAA,GAAA,GAAA5W,CAAA;EAAA;EAAA,IAAA6W,GAAA;EAAA,IAAA7W,CAAA,UAAA2V,GAAA,IAAA3V,CAAA,UAAA4V,GAAA,IAAA5V,CAAA,UAAA6V,GAAA,IAAA7V,CAAA,UAAAqW,GAAA,IAAArW,CAAA,UAAAyW,GAAA,IAAAzW,CAAA,UAAA0W,GAAA,IAAA1W,CAAA,UAAA4W,GAAA;IApCHC,GAAA,gBAAA7Y,KAAA;MAAekY,SAAS,EAATP,GAAS;MAAMlS,GAAO,EAAPA,GAAO;MAAA+S,QAAA,GACnCX,GAAgD,EAEhDQ,GAsBM,EACNI,GAAyF,EACxFC,GAIA,EACAE,GAIA;IAAA,CACE,CAAC;IAAA5W,CAAA,QAAA2V,GAAA;IAAA3V,CAAA,QAAA4V,GAAA;IAAA5V,CAAA,QAAA6V,GAAA;IAAA7V,CAAA,QAAAqW,GAAA;IAAArW,CAAA,QAAAyW,GAAA;IAAAzW,CAAA,QAAA0W,GAAA;IAAA1W,CAAA,QAAA4W,GAAA;IAAA5W,CAAA,QAAA6W,GAAA;EAAA;IAAAA,GAAA,GAAA7W,CAAA;EAAA;EAAA,OArCN6W,GAqCM;AAAA;AAjjBH,SAAAxH,OAAAyH,MAAA;EAAA,OAwS4BtH,MAAI,CAAArI,MAAO,CAAAG,IAAK;AAAA;AAxS5C,SAAA+C,OAAA0M,MAAA;EAAA,OA8HiEvH,MAAI,CAAArI,MAAO,CAAAG,IAAK;AAAA;AA9HjF,SAAAL,OAAA1I,KAAA;EAoFH,MAAAqS,IAAA,GAAarS,KAAK,CAAAwJ,aAAc,CAAA4I,qBAAsB,CAAC,CAAC;EAAC,OAClD;IAAA3I,CAAA,EAAKzJ,KAAK,CAAA0K,OAAQ,GAAG2H,IAAI,CAAAC,IAAK;IAAA5I,CAAA,EAAK1J,KAAK,CAAA8S,OAAQ,GAAGT,IAAI,CAAAE;EAAK,CAAC;AAAA;AArFjE,SAAAjM,OAAAmS,UAAA;EAAA,OAkCD,CAACC,UAAQ,CAAAlW,QAAS,CAAA4I,IAAgB,EAAAuN,SAAuE,IAAnED,UAAQ,CAAA5P,SAAU,CAAAiL,IAAK,CAAC6E,MAA0C,CAAC;AAAA;AAlCxG,SAAAA,OAAA3H,IAAA;EAAA,OAkCuEA,IAAI,CAAA4H,OAAQ,CAAAC,KAAM,KAAK/X,SAAS;AAAA;AAlCvG,SAAAmF,OAAA6S,UAAA;EAAA,OA8BwCL,UAAQ,CAAA1N,OAAQ,CAAA/E,MAAO;AAAA;AA9B/D,SAAAD,OAAAgT,UAAA;EAAA,OA6BsCN,UAAQ,CAAAzN,IAAK,KAAK,IAAiC,IAAzByN,UAAQ,CAAAO,OAAQ,KAAK,IAAI;AAAA;AA7BzF,SAAAnT,OAAAoT,UAAA;EAAA,OA4ByCR,UAAQ,CAAA5P,SAAU;AAAA;AA5B3D,SAAAlD,MAAA8S,QAAA;EAAA,OA2B0CA,QAAQ,CAAAzN,IAAe,EAAAtF,QAAK,IAA5B,CAA4B;AAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["lazy","Suspense","use","useEffect","useEffectEvent","useId","useLayoutEffect","useRef","useState","browser","CommandError","parseTsv","GridCanvas","isApple","keyCommand","typesText","allState","checkedCount","checkState","AccessibleRows","cellId","CellEditor","LocaleContext","SaveContext","useGridSelector","useGridStore","jsx","_jsx","jsxs","_jsxs","ColumnMenu","then","module","default","CellMenu","pick","event","key","shiftKey","altKey","ctrlKey","metaKey","writeClipboard","data","output","tsv","html","setData","writeClipboardLater","clipboard","navigator","undefined","ClipboardItem","write","Blob","type","writeText","useClipboard","store","scroller","announce","$","_c","messages","number","t0","failure","copied","format","countCells","failed","report","t1","current","element","onBeforeCopy","document","activeElement","preventDefault","onCopy","event_0","clipboardData","outcome","dispatchSync","command","ok","error","reason","message","dispatch","later","addEventListener","onPaste","event_1","text","getData","outcome_0","removeEventListener","t2","reduce","count","row","length","GridBody","rowHeight","headerHeight","checkboxes","columnGroups","groupHeaderHeight","wrapLines","hooks","onCellAction","onFind","label","scrollerRef","canvas","geometry","rootRef","canvasRef","sizerRef","drag","editor","locale","saving","follow","id","rowCount","_temp","columns","_temp2","busy","_temp3","active","_temp4","menu","setMenu","totalsRow","_temp6","pressed","cellMenu","setCellMenu","t3","t4","setSizes","t5","t6","setLocale","t7","t8","setCheckboxes","t10","t9","setWrapLines","t11","t12","setColumnGroups","cellText","cellStyle","drawCell","cellAction","t13","t14","setHooks","t15","t16","root","sizer","detach","attach","draw","cancelAnimationFrame","frame","point","_temp7","t17","column","getSnapshot","displayed","name","nameOf","onPointerDown","onPointerMove","onPointerUp","toggleCheck","buttons","button","scroller_0","currentTarget","x","y","clientWidth","clientHeight","focus","preventScroll","hit","primary","mode","start","kind","last","t18","extra","pointer","pointerId","width","clientX","setPointerCapture","area","column_0","check","session","view","all","checked","plan","dispatchCheck","level","span","groupSpan","from","to","names","slice","map","_temp8","String","column_1","edge","columnWidth","movedWith","shift","t19","scroller_1","x_0","y_0","hit_0","Math","max","gutterWidth","min","bottom","column_2","key_0","anchor","extendTo","t20","Symbol","for","stopFollowing","t21","scroller_2","x_1","y_1","beyondY","beyondX","state","step","current_0","dy","dx","scrollTop","sign","abs","scrollLeft","requestAnimationFrame","followPointer","current_1","x_2","y_2","hit_1","action","actionAt","style","cursor","previewWidth","moving","target","dropAt","before","previewDrop","t22","event_2","current_2","releasePointerCapture","add","name_0","round","checkedUnknown","session_0","document_0","view_0","checkedRows","key_1","rowKey","session_1","document_1","state_0","keys","name_1","last_0","selection","at","rows","includes","_temp9","filter","item_2","item","x_3","names_0","columnAt","middle","columnX","index","moved","name_2","findIndex","item_3","every","item_4","i","lineX","column_3","index_0","scroller_3","rect_0","getBoundingClientRect","rect","left","top","openMenu","act","onClick","event_3","rect_1","hit_2","clientY","column_4","row_0","column_5","found","cell","onContextMenu","event_4","rect_2","hit_3","column_6","at_0","open","isSelected","row_1","column_7","active_0","some","range","Error","copySelection","scroller_4","active_1","index_1","item_5","box","cellBox","rect_3","height","openCellMenu","closeCellMenu","closeMenu","onDoubleClick","startEditing","event_5","rect_4","hit_4","name_3","outcome_1","readOnly","t23","event_6","composing","nativeEvent","isComposing","keyCode","active_2","column_8","item_6","table","capabilities","find","open_0","detail","column_9","index_2","item_7","command_0","save","onKeyDown","t24","t25","t26","t27","t28","t29","t30","t31","t32","t33","t34","t35","t36","activeColumn","item_8","activeRow","activeShown","className","t37","t38","t39","role","tabIndex","children","t40","t41","fallback","t42","t43","item_1","item_0","snapshot_3","snapshot","aggregate","_temp5","setting","total","snapshot_2","snapshot_1","pending","snapshot_0"],"sources":["grid-body.tsx"],"sourcesContent":["import {\n type KeyboardEvent,\n lazy,\n type MouseEvent,\n type PointerEvent,\n type RefObject,\n Suspense,\n use,\n useEffect,\n useEffectEvent,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { browser } from \"react-dom\";\nimport { CommandError, type GridCommand, parseTsv, type RowKey } from \"vastgrid-spec\";\nimport type { Hit } from \"../canvas/geometry.js\";\nimport { GridCanvas } from \"../canvas/grid-canvas.js\";\nimport type { CellAction, CellHooks, ColumnGroup, GridCell } from \"../canvas/hooks.js\";\nimport { isApple, type KeyInput, keyCommand, typesText } from \"../canvas/keys.js\";\nimport { allState, checkedCount, checkState } from \"../core/checked.js\";\nimport type { GridStore } from \"../core/store.js\";\nimport { AccessibleRows, cellId } from \"./accessible-rows.js\";\nimport { CellEditor, type EditorControl } from \"./cell-editor.js\";\nimport type { CellMenuTarget } from \"./cell-menu.js\";\nimport type { MenuTarget } from \"./column-menu.js\";\nimport { LocaleContext, SaveContext } from \"./context.js\";\nimport { useGridSelector, useGridStore } from \"./hooks.js\";\n\n// The menus load when they first open (§10 of react.md).\nconst ColumnMenu = lazy(() => import(\"./column-menu.js\").then((module) => ({ default: module.ColumnMenu })));\nconst CellMenu = lazy(() => import(\"./cell-menu.js\").then((module) => ({ default: module.CellMenu })));\n\ninterface Drag {\n kind: \"cells\" | \"rows\" | \"resize\" | \"move\";\n pointer: number;\n /** The last cell or row the pointer was over, so that moves within it dispatch nothing. */\n last: string;\n /** For a resize: the column, its width and the pointer's x when the drag started. */\n column: number;\n width: number;\n x: number;\n /** For a move: the columns dragged, whether the pointer moved enough to drag, and where they would go. */\n names?: string[];\n moving?: boolean;\n before?: string | null;\n /** Shift was held when a header was pressed: a click adds a sort key. */\n shift?: boolean;\n}\n\n/** The members of a keyboard event that the grid's keys read. */\nfunction pick(event: KeyInput): KeyInput {\n return {\n key: event.key,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n };\n}\n\n/** Writes the output of `copy` (§6.6) into a clipboard. */\nfunction writeClipboard(data: DataTransfer, output: unknown) {\n const { tsv, html } = output as { tsv: string; html: string };\n data.setData(\"text/plain\", tsv);\n data.setData(\"text/html\", html);\n}\n\nasync function writeClipboardLater(output: unknown) {\n const { tsv, html } = output as { tsv: string; html: string };\n const clipboard = typeof navigator === \"undefined\" ? undefined : navigator.clipboard;\n if (!clipboard) return;\n if (typeof ClipboardItem === \"function\" && clipboard.write) {\n await clipboard.write([\n new ClipboardItem({\n \"text/plain\": new Blob([tsv], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], { type: \"text/html\" }),\n }),\n ]);\n } else {\n await clipboard.writeText(tsv);\n }\n}\n\n/** Copies the selection: at once when its rows are read, after reading them otherwise. */\nfunction useClipboard(store: GridStore, scroller: RefObject<HTMLDivElement | null>, announce: (text: string) => void) {\n const { messages, number } = use(LocaleContext);\n const report = useEffectEvent((output: unknown, failure: string | null) => {\n announce(failure === null ? messages.copied(number.format(countCells(output))) : messages.failed(failure));\n });\n useEffect(() => {\n const element = scroller.current;\n if (!element) return;\n // Without selected text, browsers disable copying unless \"beforecopy\" is cancelled.\n const onBeforeCopy = (event: Event) => {\n if (document.activeElement === element) event.preventDefault();\n };\n const onCopy = (event: ClipboardEvent) => {\n if (document.activeElement !== element || !event.clipboardData) return;\n event.preventDefault();\n const outcome = store.dispatchSync({ command: \"copy\" });\n if (outcome.ok) {\n writeClipboard(event.clipboardData, outcome.output);\n report(outcome.output, null);\n return;\n }\n if (!(outcome.error instanceof CommandError) || outcome.error.reason !== \"not_loaded\") {\n report(null, outcome.error.message);\n return;\n }\n // The rows are read first; the clipboard is then written through the asynchronous API.\n void store.dispatch({ command: \"copy\" }).then(async (later) => {\n if (!later.ok) {\n report(null, later.error.message);\n return;\n }\n await writeClipboardLater(later.output);\n report(later.output, null);\n });\n };\n document.addEventListener(\"beforecopy\", onBeforeCopy);\n // Pasting writes the clipboard into the selection (§6.5.1).\n const onPaste = (event: ClipboardEvent) => {\n if (document.activeElement !== element || !event.clipboardData) return;\n event.preventDefault();\n const text = event.clipboardData.getData(\"text/plain\");\n const html = event.clipboardData.getData(\"text/html\");\n const clipboard = text ? { text } : html ? { html } : {};\n void store.dispatch({ command: \"edit.paste\" }, { clipboard }).then((outcome) => {\n if (!outcome.ok) report(null, outcome.error.message);\n });\n };\n document.addEventListener(\"copy\", onCopy);\n document.addEventListener(\"paste\", onPaste);\n return () => {\n document.removeEventListener(\"beforecopy\", onBeforeCopy);\n document.removeEventListener(\"copy\", onCopy);\n document.removeEventListener(\"paste\", onPaste);\n };\n }, [store, scroller]);\n}\n\n/** The cells of a copy: its TSV's fields. */\nexport function countCells(output: unknown) {\n const { tsv } = output as { tsv: string };\n return parseTsv(tsv).reduce((count, row) => count + row.length, 0);\n}\n\n/** A click or Space on a cell that is a link or a button (`cellAction`). */\nexport interface CellActionEvent extends GridCell {\n action: CellAction;\n /** The key of the cell's row (§5.3), when it is read. */\n key: RowKey | undefined;\n}\n\nexport interface GridBodyProps {\n rowHeight?: number;\n headerHeight?: number;\n /** A check box for each row in the gutter (§5.2.1 of the specification). */\n checkboxes?: boolean;\n columnGroups?: readonly ColumnGroup[];\n groupHeaderHeight?: number;\n wrapLines?: number;\n hooks: CellHooks;\n onCellAction?: (event: CellActionEvent) => void;\n /** Opens the find bar (⌘F or Ctrl+F). */\n onFind?: () => void;\n label: string;\n /** Receives the scroller, which has the focus of the grid. */\n scrollerRef: RefObject<HTMLDivElement | null>;\n announce: (text: string) => void;\n}\n\n/**\n * The canvas and the scroller over it (§6 of react.md): keys and pointers become commands, the canvas draws\n * the store without rendering React, and the accessibility rows follow when scrolling pauses. Rendered only in\n * the browser: on the server, the nearest Suspense boundary sends its fallback, the first rows as HTML.\n */\nexport function GridBody({\n rowHeight,\n headerHeight,\n checkboxes = false,\n columnGroups,\n groupHeaderHeight,\n wrapLines,\n hooks,\n onCellAction,\n onFind,\n label,\n scrollerRef,\n announce,\n}: GridBodyProps) {\n use(browser(\"The grid draws on a canvas, which only the browser has.\"));\n const store = useGridStore();\n const [canvas] = useState(() => new GridCanvas({ rowHeight, headerHeight }));\n const { geometry } = canvas;\n const rootRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const sizerRef = useRef<HTMLDivElement>(null);\n const drag = useRef<Drag | null>(null);\n const editor = useRef<EditorControl>(null);\n const { messages, locale, number } = use(LocaleContext);\n const saving = use(SaveContext);\n const follow = useRef<{ frame: number; x: number; y: number } | null>(null);\n const id = useId();\n const rowCount = useGridSelector((snapshot) => snapshot.view?.rowCount ?? 0);\n const columns = useGridSelector((snapshot) => snapshot.displayed);\n const busy = useGridSelector((snapshot) => snapshot.view === null || snapshot.pending !== null);\n const active = useGridSelector((snapshot) => snapshot.session.active);\n const [menu, setMenu] = useState<MenuTarget | null>(null);\n const totalsRow = useGridSelector(\n (snapshot) =>\n !snapshot.document.plan?.aggregate && snapshot.displayed.some((item) => item.setting.total !== undefined),\n );\n const pressed = useRef(false);\n const later = useRef<(() => void) | null>(null);\n const [cellMenu, setCellMenu] = useState<CellMenuTarget | null>(null);\n\n useLayoutEffect(() => {\n canvas.setSizes(rowHeight, headerHeight);\n }, [canvas, rowHeight, headerHeight]);\n\n useLayoutEffect(() => {\n canvas.setLocale(locale);\n }, [canvas, locale]);\n\n useLayoutEffect(() => {\n canvas.setCheckboxes(checkboxes);\n }, [canvas, checkboxes]);\n\n useLayoutEffect(() => {\n canvas.setWrapLines(wrapLines);\n }, [canvas, wrapLines]);\n\n useLayoutEffect(() => {\n canvas.setColumnGroups(columnGroups, groupHeaderHeight);\n }, [canvas, columnGroups, groupHeaderHeight]);\n\n const { cellText, cellStyle, drawCell, cellAction } = hooks;\n useLayoutEffect(() => {\n canvas.setHooks({ cellText, cellStyle, drawCell, cellAction });\n }, [canvas, cellText, cellStyle, drawCell, cellAction]);\n\n useLayoutEffect(() => {\n const root = rootRef.current;\n const element = canvasRef.current;\n const scroller = scrollerRef.current;\n const sizer = sizerRef.current;\n if (!root || !element || !scroller || !sizer) return;\n const detach = canvas.attach({ root, canvas: element, scroller, sizer }, store);\n // The first frame is drawn before the browser paints, with the rows the store already has.\n canvas.draw();\n return () => {\n if (follow.current) cancelAnimationFrame(follow.current.frame);\n follow.current = null;\n detach();\n };\n }, [canvas, store, scrollerRef]);\n\n useClipboard(store, scrollerRef, announce);\n\n const point = (event: PointerEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const nameOf = (column: number) => store.getSnapshot().displayed[column]?.column.name;\n\n const onPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n pressed.current = event.buttons !== 0;\n if (event.button !== 0) return;\n const scroller = event.currentTarget;\n const { x, y } = point(event);\n // Clicks on the scroll bars scroll.\n if (x > scroller.clientWidth || y > scroller.clientHeight) return;\n scroller.focus({ preventScroll: true });\n event.preventDefault();\n const hit: Hit = geometry.hit(x, y);\n const primary = isApple() ? event.metaKey : event.ctrlKey;\n const mode = event.shiftKey ? \"extend\" : primary ? \"add\" : \"replace\";\n const start = (kind: Drag[\"kind\"], last: string, extra: Partial<Drag> = {}) => {\n drag.current = { kind, pointer: event.pointerId, last, column: 0, width: 0, x: event.clientX, ...extra };\n scroller.setPointerCapture(event.pointerId);\n };\n if (hit.area === \"cell\") {\n const column = nameOf(hit.column);\n if (column === undefined) return;\n void store.dispatch({ command: \"select\", row: hit.row, column, mode });\n start(\"cells\", `${hit.row}:${hit.column}`);\n } else if (hit.area === \"gutter\" && hit.check) {\n toggleCheck(hit.row);\n } else if (hit.area === \"corner\" && hit.check) {\n const { session, document, view } = store.getSnapshot();\n const all = allState(session.checked, document.plan, view?.rowCount ?? 0);\n // The header's box checks every row of the view, or none once they all are.\n dispatchCheck(all === \"all\" ? { command: \"check.clear\" } : { command: \"check.all\" });\n } else if (hit.area === \"group\" && hit.level !== undefined) {\n // A group's header selects its columns.\n const span = canvas.groupSpan(hit.column, hit.level);\n const from = span && nameOf(span[0]);\n const to = span && nameOf(span[1]);\n if (from && to && span) {\n void store.dispatch({ command: \"select.columns\", from, to, mode });\n // Dragging a group's header moves its columns.\n const names = columns.slice(span[0], span[1] + 1).map((item) => item.column.name);\n start(\"move\", \"\", { column: span[0], names });\n }\n } else if (hit.area === \"gutter\") {\n void store.dispatch({ command: \"select.rows\", from: hit.row, to: hit.row, mode });\n start(\"rows\", String(hit.row));\n } else if (hit.area === \"corner\") {\n void store.dispatch({ command: \"select.all\" });\n } else if (hit.area === \"header\") {\n const column = nameOf(hit.column);\n if (column === undefined) return;\n // The menu opens on the click, after the pointer is up: a popover shown before closes as the pointer goes up.\n if (hit.menu) return;\n if (hit.edge) start(\"resize\", \"\", { column: hit.column, width: geometry.columnWidth(hit.column) });\n // A click sorts by the column; dragging it moves it (with the other columns selected whole with it).\n else start(\"move\", \"\", { column: hit.column, names: movedWith(column), shift: event.shiftKey });\n }\n };\n\n /** Extends the selection being dragged to the cell or the row at a point, kept within the body. */\n const extendTo = (scroller: HTMLElement, current: Drag, x: number, y: number) => {\n const hit = geometry.hit(\n Math.max(geometry.gutterWidth + 1, Math.min(scroller.clientWidth - 1, x)),\n Math.max(geometry.headerHeight + 1, Math.min(geometry.bottom - 1, y)),\n );\n if (current.kind === \"cells\" && hit.area === \"cell\") {\n const key = `${hit.row}:${hit.column}`;\n const column = nameOf(hit.column);\n if (key === current.last || column === undefined) return;\n current.last = key;\n void store.dispatch({ command: \"select\", row: hit.row, column, mode: \"extend\" });\n } else if (current.kind === \"rows\" && (hit.area === \"cell\" || hit.area === \"gutter\")) {\n const key = String(hit.row);\n if (key === current.last) return;\n current.last = key;\n const anchor = store.getSnapshot().session.anchor?.row ?? hit.row;\n void store.dispatch({ command: \"select.rows\", from: anchor, to: hit.row, mode: \"extend\" });\n }\n };\n\n const stopFollowing = () => {\n if (follow.current) cancelAnimationFrame(follow.current.frame);\n follow.current = null;\n };\n\n /** While a drag is beyond the body, scrolls towards the pointer every frame and extends the selection. */\n const followPointer = (scroller: HTMLElement, x: number, y: number) => {\n const beyondY =\n y < geometry.headerHeight ? y - geometry.headerHeight : y > geometry.bottom ? y - geometry.bottom : 0;\n const beyondX =\n x < geometry.gutterWidth ? x - geometry.gutterWidth : x > scroller.clientWidth ? x - scroller.clientWidth : 0;\n if (beyondX === 0 && beyondY === 0) {\n stopFollowing();\n return;\n }\n if (follow.current) {\n follow.current.x = x;\n follow.current.y = y;\n return;\n }\n const state = { frame: 0, x, y };\n follow.current = state;\n const step = () => {\n const current = drag.current;\n if (follow.current !== state || !current) return;\n const dy =\n state.y < geometry.headerHeight ? state.y - geometry.headerHeight : Math.max(0, state.y - geometry.bottom);\n const dx =\n state.x < geometry.gutterWidth ? state.x - geometry.gutterWidth : Math.max(0, state.x - scroller.clientWidth);\n // Faster the farther the pointer is.\n scroller.scrollTop += Math.sign(dy) * Math.min(80, Math.abs(dy) / 2 + 4);\n if (current.kind === \"cells\") scroller.scrollLeft += Math.sign(dx) * Math.min(80, Math.abs(dx) / 2 + 4);\n extendTo(scroller, current, state.x, state.y);\n state.frame = requestAnimationFrame(step);\n };\n state.frame = requestAnimationFrame(step);\n };\n\n const onPointerMove = (event: PointerEvent<HTMLDivElement>) => {\n const current = drag.current;\n const { x, y } = point(event);\n if (!current) {\n const hit = geometry.hit(x, y);\n const action = hit.area === \"cell\" ? canvas.actionAt(hit.row, hit.column)?.action : undefined;\n event.currentTarget.style.cursor =\n hit.area === \"header\" && hit.edge ? \"col-resize\" : action ? (action.cursor ?? \"pointer\") : \"\";\n return;\n }\n if (current.kind === \"resize\") {\n canvas.previewWidth(current.column, current.width + event.clientX - current.x);\n return;\n }\n if (current.kind === \"move\") {\n if (!current.moving && Math.abs(event.clientX - current.x) < 5) return;\n current.moving = true;\n const target = dropAt(x, current.names ?? []);\n current.before = target?.before;\n canvas.previewDrop(target ? target.x : null);\n return;\n }\n extendTo(event.currentTarget, current, x, y);\n followPointer(event.currentTarget, x, y);\n };\n\n const onPointerUp = (event: PointerEvent<HTMLDivElement>) => {\n pressed.current = false;\n if (later.current && event.type === \"pointerup\") later.current();\n later.current = null;\n const current = drag.current;\n if (!current || current.pointer !== event.pointerId) return;\n drag.current = null;\n stopFollowing();\n event.currentTarget.releasePointerCapture(event.pointerId);\n if (current.kind === \"move\") {\n canvas.previewDrop(null);\n const name = nameOf(current.column);\n if (!current.moving) {\n // A click on a column's name sorts by it; a click on a group's header only selected its columns.\n if (current.names?.length === 1 && name !== undefined && event.type === \"pointerup\") {\n void store.dispatch({ command: \"sort.toggle\", column: name, ...(current.shift ? { add: true } : {}) });\n }\n return;\n }\n if (current.before !== undefined && current.names && event.type === \"pointerup\") {\n void store.dispatch({ command: \"column.move\", names: current.names, before: current.before });\n }\n return;\n }\n if (current.kind !== \"resize\") return;\n const name = nameOf(current.column);\n const width = Math.max(40, Math.min(100_000, Math.round(current.width + event.clientX - current.x)));\n if (name !== undefined) {\n void store\n .dispatch({ command: \"column.resize\", name, width })\n .then(() => canvas.previewWidth(current.column, null));\n } else {\n canvas.previewWidth(current.column, null);\n }\n };\n\n /** Dispatches a command of checked rows, and announces how many rows are checked, or why it failed. */\n const dispatchCheck = (command: GridCommand) => {\n void store.dispatch(command).then((outcome) => {\n if (!outcome.ok) {\n announce(\n outcome.error instanceof CommandError && outcome.error.reason === \"unknown_state\"\n ? messages.checkedUnknown\n : messages.failed(outcome.error.message),\n );\n return;\n }\n const { session, document, view } = store.getSnapshot();\n const count = checkedCount(session.checked, document.plan, view?.rowCount ?? 0);\n announce(count === null ? messages.checkedUnknown : messages.checkedRows(number.format(count)));\n });\n };\n\n /** Checks a row of the view, or unchecks it when it is checked. */\n const toggleCheck = (row: number) => {\n const key = store.rowKey(row);\n if (!key) return;\n const { session, document } = store.getSnapshot();\n const state = checkState(session.checked, document.plan, key);\n dispatchCheck({ command: state === \"checked\" ? \"uncheck\" : \"check\", keys: [key] });\n };\n\n /** The columns a header drags: the column, or every column of a selection of whole columns that holds it. */\n const movedWith = (name: string): string[] => {\n const last = store.getSnapshot().session.selection?.at(-1);\n if (last && last.rows === \"all\" && last.columns !== \"all\" && last.columns.includes(name)) {\n return columns.map((item) => item.column.name).filter((item) => (last.columns as string[]).includes(item));\n }\n return [name];\n };\n\n /**\n * Where dragged columns would go for a pointer at `x`: before the column under it (after it past its middle), as\n * `column.move`'s `before` (null after the last), and the x of the line that shows it; undefined where they stay.\n */\n const dropAt = (x: number, names: readonly string[]): { before: string | null; x: number } | undefined => {\n if (columns.length === 0) return undefined;\n let at = geometry.columnAt(Math.max(geometry.gutterWidth, x));\n if (at < 0) at = x < geometry.gutterWidth ? 0 : columns.length - 1;\n const middle = geometry.columnX(at) + geometry.columnWidth(at) / 2;\n const index = x < middle ? at : at + 1;\n const before = index < columns.length ? columns[index].column.name : null;\n const moved = names.map((name) => columns.findIndex((item) => item.column.name === name));\n // Before one of the moved columns, or right after the last of them, they stay.\n if (before !== null && names.includes(before)) return undefined;\n if (moved.length > 0 && index === Math.max(...moved) + 1 && moved.every((item, i) => item === moved[0] + i)) {\n return undefined;\n }\n const lineX = index < columns.length ? geometry.columnX(index) : geometry.columnX(at) + geometry.columnWidth(at);\n return { before, x: lineX };\n };\n\n /** Opens the menu of a column under its header. */\n const openMenu = (column: string, index: number) => {\n const scroller = scrollerRef.current;\n if (!scroller) return;\n const rect = scroller.getBoundingClientRect();\n setMenu({\n column,\n x: rect.left + Math.max(0, geometry.columnX(index) + geometry.columnWidth(index) - 200),\n y: rect.top + geometry.headerHeight,\n });\n };\n\n const onClick = (event: MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const hit = geometry.hit(event.clientX - rect.left, event.clientY - rect.top);\n const column = nameOf(hit.column);\n if (hit.area === \"header\" && hit.menu && column !== undefined) openMenu(column, hit.column);\n // A click on a link or a button of a cell acts, after selecting the cell.\n if (hit.area === \"cell\" && !event.shiftKey && !event.metaKey && !event.ctrlKey) act(hit.row, hit.column);\n };\n\n /** Calls `onCellAction` for a cell that is a link or a button. */\n const act = (row: number, column: number) => {\n const found = canvas.actionAt(row, column);\n if (!found || !onCellAction) return false;\n onCellAction({ ...found.cell, action: found.action, key: store.rowKey(row) });\n return true;\n };\n\n const onContextMenu = (event: MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const hit = geometry.hit(event.clientX - rect.left, event.clientY - rect.top);\n const column = nameOf(hit.column);\n if ((hit.area !== \"header\" && hit.area !== \"cell\") || column === undefined) return;\n event.preventDefault();\n const at = { x: event.clientX, y: event.clientY };\n let open: () => void;\n if (hit.area === \"header\") {\n open = () => setMenu({ column, ...at });\n } else {\n // A cell outside the selection is selected first, as spreadsheets do.\n if (!isSelected(hit.row, column)) void store.dispatch({ command: \"select\", row: hit.row, column });\n open = () => setCellMenu({ row: hit.row, column, ...at });\n }\n // Where the menu comes as the button goes down (macOS), it opens once the button is up.\n if (pressed.current) later.current = open;\n else open();\n };\n\n /** Whether a cell is in the selection. */\n const isSelected = (row: number, column: string) => {\n const { selection, active } = store.getSnapshot().session;\n if (!selection) return active?.row === row && active.column === column;\n return selection.some(\n (range) =>\n (range.rows === \"all\" || (row >= range.rows[0] && row < range.rows[1])) &&\n (range.columns === \"all\" || range.columns.includes(column)),\n );\n };\n\n /** Copies the selection from a menu, through the asynchronous clipboard. */\n const copySelection = () => {\n void store.dispatch({ command: \"copy\" }).then(async (outcome) => {\n if (!outcome.ok) {\n announce(messages.failed(outcome.error.message));\n return;\n }\n try {\n await writeClipboardLater(outcome.output);\n announce(messages.copied(number.format(countCells(outcome.output))));\n } catch (error) {\n announce(messages.failed(error instanceof Error ? error.message : String(error)));\n }\n });\n };\n\n /** Opens the cell menu of the active cell, under it. */\n const openCellMenu = () => {\n const scroller = scrollerRef.current;\n const active = store.getSnapshot().session.active;\n if (!scroller || !active) return;\n const index = columns.findIndex((item) => item.column.name === active.column);\n if (index < 0) return;\n const box = geometry.cellBox(active.row, index);\n const rect = scroller.getBoundingClientRect();\n setCellMenu({\n row: active.row,\n column: active.column,\n x: rect.left + box.left,\n y: rect.top + box.top + box.height,\n });\n };\n\n const closeCellMenu = () => {\n setCellMenu(null);\n scrollerRef.current?.focus({ preventScroll: true });\n };\n\n const closeMenu = () => {\n setMenu(null);\n scrollerRef.current?.focus({ preventScroll: true });\n };\n\n const onDoubleClick = (event: MouseEvent<HTMLDivElement>) => {\n const rect = event.currentTarget.getBoundingClientRect();\n const hit = geometry.hit(event.clientX - rect.left, event.clientY - rect.top);\n const name = nameOf(hit.column);\n // Double-clicking a column's edge fits it to its values again; double-clicking a cell edits it.\n if (hit.area === \"header\" && hit.edge && name !== undefined)\n void store.dispatch({ command: \"column.resize\", name, width: null });\n else if (hit.area === \"cell\") startEditing(undefined);\n };\n\n /**\n * Opens the editor on the active cell (`edit.begin`, §6.5): with its value, or empty for a key that types text,\n * whose text, an IME's included, then goes into the editor, which takes the focus before the browser handles\n * the key. Tells why when the cell is not written.\n */\n const startEditing = (text: string | undefined) => {\n const outcome = store.dispatchSync(\n text === undefined ? { command: \"edit.begin\" } : { command: \"edit.begin\", text },\n );\n if (outcome.ok) {\n if (store.getSnapshot().session.editor) editor.current?.open();\n return true;\n }\n if (outcome.error instanceof CommandError && outcome.error.reason === \"read_only\") announce(messages.readOnly);\n else announce(messages.failed(outcome.error.message));\n return false;\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return;\n // While an IME composes, keys are its own (the editor takes them, §6.6 of react.md).\n const composing = event.nativeEvent.isComposing || event.keyCode === 229;\n // Space acts on a link or a button of the active cell; otherwise it checks the active row, or unchecks it.\n if (!composing && event.key === \" \" && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {\n const active = store.getSnapshot().session.active;\n if (!active) return;\n const column = columns.findIndex((item) => item.column.name === active.column);\n if (act(active.row, column)) {\n event.preventDefault();\n return;\n }\n if (!checkboxes) return;\n event.preventDefault();\n toggleCheck(active.row);\n return;\n }\n // ⌘F or Ctrl+F opens the find bar, when the engine finds.\n if ((isApple() ? event.metaKey : event.ctrlKey) && (event.key === \"f\" || event.key === \"F\") && !event.altKey) {\n if (!onFind || store.getSnapshot().table?.capabilities.find !== true) return;\n event.preventDefault();\n onFind();\n return;\n }\n // Shift+F10 and the context menu key open the menu of the active cell.\n if (event.key === \"ContextMenu\" || (event.key === \"F10\" && event.shiftKey)) {\n event.preventDefault();\n openCellMenu();\n return;\n }\n // Alt+Enter opens the detail panel of the active row, or closes it.\n if (!composing && event.altKey && event.key === \"Enter\" && !event.ctrlKey && !event.metaKey && !event.shiftKey) {\n event.preventDefault();\n const open = store.getSnapshot().session.detail?.open === true;\n void store.dispatch({ command: open ? \"detail.close\" : \"detail.open\" });\n return;\n }\n // Alt+↓ opens the menu of the active cell's column.\n if (event.altKey && event.key === \"ArrowDown\" && !event.ctrlKey && !event.metaKey) {\n const column = store.getSnapshot().session.active?.column;\n const index = columns.findIndex((item) => item.column.name === column);\n if (column === undefined || index < 0) return;\n event.preventDefault();\n openMenu(column, index);\n return;\n }\n if (typesText({ ...pick(event), keyCode: event.keyCode, isComposing: event.nativeEvent.isComposing })) {\n // Not prevented: the key's text goes into the editor that now has the focus.\n if (!startEditing(\"\")) event.preventDefault();\n return;\n }\n const command = keyCommand(event, isApple());\n if (!command) return;\n if (command.command === \"save\") {\n // Without saving, the key is the browser's.\n if (!saving || store.getSnapshot().table?.capabilities.save !== true) return;\n event.preventDefault();\n saving.save();\n return;\n }\n event.preventDefault();\n void store.dispatch(command);\n };\n\n // The accessibility rows always hold the active cell (§6.4).\n const activeColumn = active ? columns.findIndex((item) => item.column.name === active.column) : 0;\n const activeRow = active?.row ?? 0;\n const activeShown = rowCount > 0 && activeColumn >= 0;\n\n return (\n <div className=\"vg-body\" ref={rootRef}>\n <canvas className=\"vg-canvas\" ref={canvasRef} />\n {/* biome-ignore lint/a11y/useSemanticElements: a canvas grid cannot use table elements; ARIA grid roles describe it. */}\n <div\n className=\"vg-scroller\"\n ref={scrollerRef}\n role=\"grid\"\n tabIndex={0}\n aria-label={label}\n aria-rowcount={rowCount + 1 + (totalsRow ? 1 : 0)}\n aria-colcount={columns.length}\n aria-multiselectable=\"true\"\n aria-busy={busy}\n aria-activedescendant={activeShown ? cellId(id, activeRow, activeColumn) : undefined}\n onKeyDown={onKeyDown}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onDoubleClick={onDoubleClick}\n onClick={onClick}\n onContextMenu={onContextMenu}\n >\n <div className=\"vg-sizer\" ref={sizerRef} />\n <AccessibleRows canvas={canvas} id={id} />\n </div>\n <CellEditor canvas={canvas} scrollerRef={scrollerRef} announce={announce} ref={editor} />\n {menu && (\n <Suspense fallback={null}>\n <ColumnMenu target={menu} onClose={closeMenu} />\n </Suspense>\n )}\n {cellMenu && (\n <Suspense fallback={null}>\n <CellMenu target={cellMenu} onClose={closeCellMenu} copy={copySelection} />\n </Suspense>\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vastgrid",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "A canvas data grid for React that opens tables of any size like a spreadsheet: sort, filter, group, pivot, edit, undo and export, driven by a typed document, session and commands.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"node": ">=20"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"vastgrid-spec": "0.2.
|
|
62
|
+
"vastgrid-spec": "0.2.2"
|
|
63
63
|
},
|
|
64
64
|
"peerDependencies": {
|
|
65
65
|
"react": "^19.3.0",
|
|
@@ -74,6 +74,6 @@
|
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
|
-
"vastgrid-js": "0.2.
|
|
77
|
+
"vastgrid-js": "0.2.2"
|
|
78
78
|
}
|
|
79
79
|
}
|
package/src/canvas/geometry.ts
CHANGED
|
@@ -150,7 +150,12 @@ export class Geometry {
|
|
|
150
150
|
0,
|
|
151
151
|
Math.min(rowCount - 1, Math.floor((y - this.headerHeight + this.scrollY.position) / this.rowHeight)),
|
|
152
152
|
);
|
|
153
|
+
// Below the last row, the gutter and the cells are empty.
|
|
154
|
+
const empty =
|
|
155
|
+
y >= this.headerHeight &&
|
|
156
|
+
(rowCount === 0 || y - this.headerHeight + this.scrollY.position >= rowCount * this.rowHeight);
|
|
153
157
|
if (x < this.gutterWidth) {
|
|
158
|
+
if (empty) return none;
|
|
154
159
|
return {
|
|
155
160
|
area: y < this.headerHeight ? "corner" : "gutter",
|
|
156
161
|
row,
|
|
@@ -178,7 +183,7 @@ export class Geometry {
|
|
|
178
183
|
if (y < this.headerHeight) {
|
|
179
184
|
return { area: "header", row: 0, column, edge, menu: !edge && x >= right - MENU_WIDTH - 4 };
|
|
180
185
|
}
|
|
181
|
-
if (
|
|
186
|
+
if (empty) return none;
|
|
182
187
|
return { area: "cell", row, column, edge: false, menu: false };
|
|
183
188
|
}
|
|
184
189
|
|
package/src/core/format.ts
CHANGED
|
@@ -242,9 +242,10 @@ function dateFormatter(locale: string | undefined, format: DateFormat) {
|
|
|
242
242
|
part = String(shown.second);
|
|
243
243
|
break;
|
|
244
244
|
default:
|
|
245
|
-
part = token.
|
|
246
|
-
|
|
247
|
-
|
|
245
|
+
if (token.startsWith("S")) part = shown.fraction.slice(0, token.length).padEnd(token.length, "0");
|
|
246
|
+
// Text in quotes, with a doubled quote for a quote; two quotes alone are a quote too, as in the
|
|
247
|
+
// Excel export.
|
|
248
|
+
else part = token === "''" ? "'" : token.slice(1, -1).replaceAll("''", "'");
|
|
248
249
|
}
|
|
249
250
|
text += part + texts[index + 1];
|
|
250
251
|
});
|
package/src/react/grid-body.tsx
CHANGED
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
useState,
|
|
15
15
|
} from "react";
|
|
16
16
|
import { browser } from "react-dom";
|
|
17
|
-
import { CommandError, type GridCommand, type RowKey } from "vastgrid-spec";
|
|
17
|
+
import { CommandError, type GridCommand, parseTsv, type RowKey } from "vastgrid-spec";
|
|
18
18
|
import type { Hit } from "../canvas/geometry.js";
|
|
19
19
|
import { GridCanvas } from "../canvas/grid-canvas.js";
|
|
20
20
|
import type { CellAction, CellHooks, ColumnGroup, GridCell } from "../canvas/hooks.js";
|
|
@@ -142,10 +142,9 @@ function useClipboard(store: GridStore, scroller: RefObject<HTMLDivElement | nul
|
|
|
142
142
|
}
|
|
143
143
|
|
|
144
144
|
/** The cells of a copy: its TSV's fields. */
|
|
145
|
-
function countCells(output: unknown) {
|
|
145
|
+
export function countCells(output: unknown) {
|
|
146
146
|
const { tsv } = output as { tsv: string };
|
|
147
|
-
|
|
148
|
-
return tsv.split("\n").reduce((count, line) => count + line.split("\t").length, 0);
|
|
147
|
+
return parseTsv(tsv).reduce((count, row) => count + row.length, 0);
|
|
149
148
|
}
|
|
150
149
|
|
|
151
150
|
/** A click or Space on a cell that is a link or a button (`cellAction`). */
|