@gridsheet/preact-core 3.0.4 → 3.0.6

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.
@@ -147,6 +147,7 @@ const reducer = (store, action) => {
147
147
  const _CoreAction = class _CoreAction {
148
148
  constructor() {
149
149
  this.actionId = 1;
150
+ this.mutation = false;
150
151
  }
151
152
  reduce(store, payload) {
152
153
  return store;
@@ -165,6 +166,10 @@ const _CoreAction = class _CoreAction {
165
166
  };
166
167
  _CoreAction.head = 1;
167
168
  let CoreAction = _CoreAction;
169
+ const isMutationAction = (type) => {
170
+ var _a;
171
+ return ((_a = actions[type]) == null ? void 0 : _a.mutation) === true;
172
+ };
168
173
  class SetSearchQueryAction extends CoreAction {
169
174
  reduce(store, payload) {
170
175
  const searchQuery = payload;
@@ -356,6 +361,10 @@ class CopyAction extends CoreAction {
356
361
  }
357
362
  const copy = new CopyAction().bind();
358
363
  class CutAction extends CoreAction {
364
+ constructor() {
365
+ super(...arguments);
366
+ this.mutation = true;
367
+ }
359
368
  reduce(store, payload) {
360
369
  const { sheetReactive: sheetRef } = store;
361
370
  const sheet = sheetRef.current;
@@ -376,6 +385,10 @@ class CutAction extends CoreAction {
376
385
  }
377
386
  const cut = new CutAction().bind();
378
387
  class PasteAction extends CoreAction {
388
+ constructor() {
389
+ super(...arguments);
390
+ this.mutation = true;
391
+ }
379
392
  reduce(store, payload) {
380
393
  const { choosing, selectingZone, sheetReactive: dstSheetRef } = store;
381
394
  const dstSheet = dstSheetRef.current;
@@ -688,6 +701,10 @@ class WriteAction extends CoreAction {
688
701
  }
689
702
  const write = new WriteAction().bind();
690
703
  class ClearAction extends CoreAction {
704
+ constructor() {
705
+ super(...arguments);
706
+ this.mutation = true;
707
+ }
691
708
  reduce(store, payload) {
692
709
  var _a;
693
710
  const { choosing, selectingZone, sheetReactive: sheetRef } = store;
@@ -749,6 +766,10 @@ class ClearAction extends CoreAction {
749
766
  }
750
767
  const clear = new ClearAction().bind();
751
768
  class UndoAction extends CoreAction {
769
+ constructor() {
770
+ super(...arguments);
771
+ this.mutation = true;
772
+ }
752
773
  reduce(store, payload) {
753
774
  const { sheetReactive: sheetRef } = store;
754
775
  const sheet = sheetRef.current;
@@ -789,6 +810,10 @@ class UndoAction extends CoreAction {
789
810
  }
790
811
  const undo = new UndoAction().bind();
791
812
  class RedoAction extends CoreAction {
813
+ constructor() {
814
+ super(...arguments);
815
+ this.mutation = true;
816
+ }
792
817
  reduce(store, payload) {
793
818
  const { sheetReactive: sheetRef } = store;
794
819
  const sheet = sheetRef.current;
@@ -1013,6 +1038,10 @@ class SetInputtingAction extends CoreAction {
1013
1038
  }
1014
1039
  const setInputting = new SetInputtingAction().bind();
1015
1040
  class InsertRowsAboveAction extends CoreAction {
1041
+ constructor() {
1042
+ super(...arguments);
1043
+ this.mutation = true;
1044
+ }
1016
1045
  reduce(store, payload) {
1017
1046
  const { numRows, y, operator } = payload;
1018
1047
  const { sheetReactive: sheetRef, selectingZone, choosing } = store;
@@ -1044,6 +1073,10 @@ class InsertRowsAboveAction extends CoreAction {
1044
1073
  }
1045
1074
  const insertRowsAbove = new InsertRowsAboveAction().bind();
1046
1075
  class InsertRowsBelowAction extends CoreAction {
1076
+ constructor() {
1077
+ super(...arguments);
1078
+ this.mutation = true;
1079
+ }
1047
1080
  reduce(store, payload) {
1048
1081
  const { numRows, y, operator } = payload;
1049
1082
  const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;
@@ -1083,6 +1116,10 @@ class InsertRowsBelowAction extends CoreAction {
1083
1116
  }
1084
1117
  const insertRowsBelow = new InsertRowsBelowAction().bind();
1085
1118
  class InsertColsLeftAction extends CoreAction {
1119
+ constructor() {
1120
+ super(...arguments);
1121
+ this.mutation = true;
1122
+ }
1086
1123
  reduce(store, payload) {
1087
1124
  const { numCols, x, operator } = payload;
1088
1125
  const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;
@@ -1114,6 +1151,10 @@ class InsertColsLeftAction extends CoreAction {
1114
1151
  }
1115
1152
  const insertColsLeft = new InsertColsLeftAction().bind();
1116
1153
  class InsertColsRightAction extends CoreAction {
1154
+ constructor() {
1155
+ super(...arguments);
1156
+ this.mutation = true;
1157
+ }
1117
1158
  reduce(store, payload) {
1118
1159
  const { numCols, x, operator } = payload;
1119
1160
  const { sheetReactive: sheetRef, selectingZone, choosing } = store;
@@ -1155,6 +1196,10 @@ class InsertColsRightAction extends CoreAction {
1155
1196
  }
1156
1197
  const insertColsRight = new InsertColsRightAction().bind();
1157
1198
  class RemoveRowsAction extends CoreAction {
1199
+ constructor() {
1200
+ super(...arguments);
1201
+ this.mutation = true;
1202
+ }
1158
1203
  reduce(store, payload) {
1159
1204
  const { numRows, y, operator } = payload;
1160
1205
  const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;
@@ -1186,6 +1231,10 @@ class RemoveRowsAction extends CoreAction {
1186
1231
  }
1187
1232
  const removeRows = new RemoveRowsAction().bind();
1188
1233
  class RemoveColsAction extends CoreAction {
1234
+ constructor() {
1235
+ super(...arguments);
1236
+ this.mutation = true;
1237
+ }
1189
1238
  reduce(store, payload) {
1190
1239
  const { numCols, x, operator } = payload;
1191
1240
  const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;
@@ -1217,6 +1266,10 @@ class RemoveColsAction extends CoreAction {
1217
1266
  }
1218
1267
  const removeCols = new RemoveColsAction().bind();
1219
1268
  class SortRowsAction extends CoreAction {
1269
+ constructor() {
1270
+ super(...arguments);
1271
+ this.mutation = true;
1272
+ }
1220
1273
  reduce(store, payload) {
1221
1274
  const { x, direction } = payload;
1222
1275
  const { sheetReactive: sheetRef, selectingZone, choosing } = store;
@@ -1238,6 +1291,10 @@ class SortRowsAction extends CoreAction {
1238
1291
  }
1239
1292
  const sortRows = new SortRowsAction().bind();
1240
1293
  class FilterRowsAction extends CoreAction {
1294
+ constructor() {
1295
+ super(...arguments);
1296
+ this.mutation = true;
1297
+ }
1241
1298
  reduce(store, payload) {
1242
1299
  const { x, filter } = payload;
1243
1300
  const { sheetReactive: sheetRef, selectingZone, choosing } = store;
@@ -1403,7 +1460,8 @@ export {
1403
1460
  setSearchRange as T,
1404
1461
  useBook as U,
1405
1462
  reducer as V,
1406
- userActions as W,
1463
+ isMutationAction as W,
1464
+ userActions as X,
1407
1465
  setInputting as a,
1408
1466
  updateSheet as b,
1409
1467
  undo as c,
@@ -1431,4 +1489,4 @@ export {
1431
1489
  removeRows as y,
1432
1490
  insertColsRight as z
1433
1491
  };
1434
- //# sourceMappingURL=hooks-DPIr6WaL.mjs.map
1492
+ //# sourceMappingURL=hooks-DKULalw8.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-DKULalw8.mjs","sources":["../../react-core/src/store/helpers.ts","../../react-core/src/store/actions.ts","../../react-core/src/lib/hooks.ts"],"sourcesContent":["import { a2p, x2c, y2r } from '@gridsheet/core';\nimport { Sheet } from '@gridsheet/core';\nimport type { Address, PointType, StorePatchType, StoreType } from '../types';\n\n/**\n * Strip redundant fields from a StorePatchType before recording in history.\n * - selectingZone with endY === -1 && endX === -1 is a no-selection sentinel and need not be stored.\n */\nexport const compactReflection = (reflection: StorePatchType): StorePatchType => {\n const result = { ...reflection };\n if (result.selectingZone != null && result.selectingZone.endY === -1 && result.selectingZone.endX === -1) {\n delete result.selectingZone;\n }\n return result;\n};\n\nexport const restrictPoints = (store: StoreType, sheet: Sheet) => {\n const { choosing, selectingZone } = store;\n let { y, x } = choosing;\n let { startY: y1, startX: x1, endY: y2, endX: x2 } = selectingZone;\n const [numRows, numCols] = [sheet.numRows, sheet.numCols];\n if (y > numRows) {\n y = numRows;\n }\n if (x > numCols) {\n x = numCols;\n }\n if (y1 > numRows) {\n y1 = numRows;\n }\n if (y2 > numRows) {\n y2 = numRows;\n }\n if (x1 > numCols) {\n x1 = numCols;\n }\n if (x2 > numCols) {\n x2 = numCols;\n }\n return {\n choosing: { y, x } as PointType,\n selectingZone: { startY: y1, startX: x1, endY: y2, endX: x2 },\n };\n};\n\nconst FLASH_CLASS = 'gs-flash-overlay--active';\nconst FLASH_DURATION_MS = 600;\nexport const flashSheet = (el: HTMLElement | null) => {\n if (!el) {\n return;\n }\n el.classList.remove(FLASH_CLASS);\n // force reflow to restart animation when called consecutively\n void el.offsetWidth;\n el.classList.add(FLASH_CLASS);\n setTimeout(() => el.classList.remove(FLASH_CLASS), FLASH_DURATION_MS);\n};\n\nexport const flashWithCallback = (\n store: StoreType,\n sheet: Sheet,\n callback: ((s: StoreType) => void) | undefined,\n): StoreType & { callback?: (store: StoreType) => void } => ({\n ...store,\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n});\n\nexport const initSearchStatement = (sheet: Sheet, store: StoreType) => {\n const { searchQuery, searchCaseSensitive, searchRegex, searchRange } = store;\n let { choosing } = store;\n if (!searchQuery) {\n return { matchingCells: [] };\n }\n const matchingCells: Address[] = [];\n\n let matcher: (value: string) => boolean;\n if (searchRegex) {\n try {\n const flags = searchCaseSensitive ? '' : 'i';\n const regex = new RegExp(searchQuery, flags);\n matcher = (v: string) => regex.test(v);\n } catch (e) {\n // Invalid regex, treat as literal string\n const q = searchCaseSensitive ? searchQuery : searchQuery.toLowerCase();\n matcher = (v: string) => {\n const s = searchCaseSensitive ? v : v.toLowerCase();\n return s.indexOf(q) !== -1;\n };\n }\n } else {\n const q = searchCaseSensitive ? searchQuery : searchQuery.toLowerCase();\n matcher = (v: string) => {\n const s = searchCaseSensitive ? v : v.toLowerCase();\n return s.indexOf(q) !== -1;\n };\n }\n\n // Determine search range\n let startY = 1,\n endY = sheet.bottom;\n let startX = 1,\n endX = sheet.right;\n if (searchRange) {\n startY = searchRange.startY;\n endY = searchRange.endY;\n startX = searchRange.startX;\n endX = searchRange.endX;\n }\n\n for (let y = startY; y <= endY; y++) {\n for (let x = startX; x <= endX; x++) {\n const v = sheet.getSerializedValue({ point: { y, x } });\n if (matcher(v)) {\n matchingCells.push(`${x2c(x)}${y2r(y)}`);\n }\n }\n }\n const matchingCellIndex = matchingCells.length === store.matchingCells.length ? store.matchingCellIndex : 0;\n if (matchingCells.length > 0) {\n const address = matchingCells[matchingCellIndex];\n choosing = a2p(address);\n }\n return { matchingCells, searchQuery, matchingCellIndex, choosing };\n};\n\nexport const isXSheetFocused = (store: StoreType) => {\n const { sheetId, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return false;\n }\n if (sheetId === sheet.registry.editingSheetId) {\n return false;\n }\n return !!sheet.registry.editingAddress;\n};\n","import {\n StoreType,\n RectType,\n ZoneType,\n PointType,\n RangeType,\n FeedbackType,\n CellsByAddressType,\n AreaType,\n PositionType,\n ModeType,\n RawCellType,\n OperatorType,\n FilterConfig,\n} from '../types';\nimport { zoneToArea, superposeArea, matrixShape, areaShape, areaDiff, areaToZone, restrictZone } from '@gridsheet/core';\nimport { Sheet } from '@gridsheet/core';\n\nimport { p2a, a2p } from '@gridsheet/core';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '@gridsheet/core';\nimport { initSearchStatement, restrictPoints, flashSheet, flashWithCallback, compactReflection } from './helpers';\nimport { smartScroll } from '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { Autofill } from '@gridsheet/core';\n\nconst resetZone: ZoneType = { startY: -1, startX: -1, endY: -1, endX: -1 };\n\nconst actions: { [s: string]: CoreAction<any> } = {};\n\ntype StoreWithCallback = StoreType & {\n callback?: (store: StoreType) => void;\n};\n\nexport const reducer = <T>(store: StoreType, action: { type: number; value: T }): StoreType => {\n const act: CoreAction<T> | undefined = actions[action.type];\n if (act == null) {\n return store;\n }\n\n // React StrictMode calls reducers twice per dispatch to detect side effects.\n // Since Sheet is a mutable object, the second call re-applies operations (double undo, etc.).\n // Guard: React passes the SAME action object reference to both calls, so we use object identity\n // to distinguish a StrictMode second-call (same reference) from a new dispatch (new reference).\n // Using a Map allows multiple batched dispatches to each have their own cached result,\n // preventing the single-slot cache from being overwritten when actions are processed together.\n const registry = store.sheetReactive.current?.registry;\n if (registry?._strictModeCache?.has(action)) {\n const cached = registry._strictModeCache.get(action) as StoreType;\n registry._strictModeCache.delete(action);\n return cached;\n }\n\n const { callback, ...newStore } = act.reduce(store, action.value);\n callback?.(newStore);\n const result = { ...store, ...newStore };\n\n if (registry) {\n if (!registry._strictModeCache) {\n registry._strictModeCache = new Map();\n }\n registry._strictModeCache.set(action, result);\n queueMicrotask(() => {\n registry._strictModeCache?.delete(action);\n });\n }\n\n return result;\n};\n\nexport class CoreAction<T> {\n static head = 1;\n private actionId: number = 1;\n /** Whether this action mutates sheet data (triggers loading indicator). */\n public mutation = false;\n\n public reduce(store: StoreType, payload: T): StoreWithCallback {\n return store;\n }\n public call(payload: T): { type: number; value: T } {\n return {\n type: this.actionId,\n value: payload,\n };\n }\n public bind() {\n this.actionId = CoreAction.head++;\n actions[this.actionId] = this;\n return this.call.bind(this);\n }\n}\n\n/** Returns true if the given action type is a mutation (heavy operation). */\nexport const isMutationAction = (type: number): boolean => {\n return actions[type]?.mutation === true;\n};\n\nclass SetSearchQueryAction<T extends string | undefined> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchQuery = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchQuery }),\n searchQuery,\n };\n }\n}\nexport const setSearchQuery = new SetSearchQueryAction().bind();\n\nclass SetSearchCaseSensitiveAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchCaseSensitive = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchCaseSensitive }),\n searchCaseSensitive,\n };\n }\n}\nexport const setSearchCaseSensitive = new SetSearchCaseSensitiveAction().bind();\n\nclass SetSearchRegexAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchRegex = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchRegex }),\n searchRegex,\n };\n }\n}\nexport const setSearchRegex = new SetSearchRegexAction().bind();\n\nclass SetSearchRangeAction<T extends ZoneType | undefined> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchRange = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchRange }),\n searchRange,\n };\n }\n}\nexport const setSearchRange = new SetSearchRangeAction().bind();\n\nclass SetEditingAddressAction<T extends string> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editingAddress: payload,\n };\n }\n}\nexport const setEditingAddress = new SetEditingAddressAction().bind();\n\nclass SetAutofillDraggingToAction<T extends PointType | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n autofillDraggingTo: payload,\n };\n }\n}\nexport const setAutofillDraggingTo = new SetAutofillDraggingToAction().bind();\n\nclass SubmitAutofillAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const autofill = new Autofill(store, payload);\n const sheet = autofill.applied;\n const selectingZone = areaToZone(autofill.wholeArea);\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n ...initSearchStatement(sheet, store),\n ...restrictPoints(store, sheet),\n selectingZone,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n autofillDraggingTo: null,\n };\n }\n}\nexport const submitAutofill = new SubmitAutofillAction().bind();\n\nclass SetContextMenuPositionAction<T extends PositionType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n contextMenuPosition: payload,\n };\n }\n}\nexport const setContextMenuPosition = new SetContextMenuPositionAction().bind();\n\nclass SetResizingPositionYAction<T extends [number, number, number]> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n resizingPositionY: payload,\n };\n }\n}\nexport const setResizingPositionY = new SetResizingPositionYAction().bind();\n\nclass SetResizingPositionXAction<T extends [number, number, number]> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n resizingPositionX: payload,\n };\n }\n}\nexport const setResizingPositionX = new SetResizingPositionXAction().bind();\n\nclass SetEnteringAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n entering: payload,\n };\n }\n}\nexport const setEntering = new SetEnteringAction().bind();\n\nclass UpdateSheetAction<T extends Sheet> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n sheetReactive: { current: payload },\n ...initSearchStatement(payload, store),\n ...restrictPoints(store, payload),\n };\n }\n}\nexport const updateSheet = new UpdateSheetAction().bind();\n\nclass SetEditorRectAction<T extends RectType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editorRect: payload,\n };\n }\n}\nexport const setEditorRect = new SetEditorRectAction().bind();\n\nclass SetDragging<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n dragging: payload,\n };\n }\n}\nexport const setDragging = new SetDragging().bind();\n\nclass BlurAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editingAddress: '',\n };\n }\n}\nexport const blur = new BlurAction().bind();\n\nclass CopyAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n return {\n ...store,\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingSheetId: sheet.id,\n copyingZone: payload,\n cutting: false,\n });\n },\n };\n }\n}\nexport const copy = new CopyAction().bind();\n\nclass CutAction<T extends ZoneType> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n return {\n ...store,\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingSheetId: sheet.id,\n copyingZone: payload,\n cutting: true,\n });\n },\n };\n }\n}\nexport const cut = new CutAction().bind();\n\nclass PasteAction<T extends { matrix: RawCellType[][]; onlyValue: boolean }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { choosing, selectingZone, sheetReactive: dstSheetRef } = store;\n const dstSheet = dstSheetRef.current;\n if (!dstSheet) {\n return store;\n }\n const { registry } = dstSheet;\n const { copyingSheetId, copyingZone, cutting } = registry;\n const srcSheet = dstSheet.getSheetBySheetId(copyingSheetId);\n\n let selectingArea = zoneToArea(selectingZone);\n const copyingArea = zoneToArea(copyingZone);\n const { matrix, onlyValue } = payload;\n\n if (cutting) {\n if (!srcSheet) {\n return store;\n }\n const src = copyingArea;\n const { rows: dy, cols: dx } = areaDiff(copyingArea);\n const dst: AreaType =\n selectingArea.top !== -1\n ? {\n top: selectingArea.top,\n left: selectingArea.left,\n bottom: selectingArea.top + dy,\n right: selectingArea.left + dx,\n }\n : {\n top: choosing.y,\n left: choosing.x,\n bottom: choosing.y + dy,\n right: choosing.x + dx,\n };\n\n const nextSelectingZone = restrictZone(areaToZone(dst));\n const newSheet = dstSheet.move({\n srcSheet,\n src,\n dst,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: srcSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n transmit: { copyingSheetId: srcSheet.id, copyingZone, cutting: true },\n }),\n redoReflection: compactReflection({\n sheetId: srcSheet.id,\n choosing,\n transmit: { copyingSheetId: srcSheet.id, copyingZone: resetZone },\n }),\n });\n\n return {\n ...store,\n ...initSearchStatement(newSheet, store),\n sheetReactive: { current: newSheet },\n selectingZone: nextSelectingZone,\n inputting: newSheet.getSerializedValue({ point: choosing, resolution: 'RAW' }),\n callback: ({ sheetReactive: sheetRef }) => {\n registry.transmit({\n cutting: false,\n copyingZone: resetZone,\n });\n },\n };\n }\n\n let newSheet: Sheet;\n let { y, x } = choosing;\n\n if (copyingArea.top === -1) {\n const { rows: height, cols: width } = matrixShape({ matrix, base: -1 });\n selectingArea = {\n top: y,\n left: x,\n bottom: y + height,\n right: x + width,\n };\n const nextSelectingZone = restrictZone(areaToZone(selectingArea));\n newSheet = dstSheet.writeRawCellMatrix({\n point: { y, x },\n matrix,\n onlyValue,\n undoReflection: compactReflection({\n sheetId: dstSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: dstSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n }),\n });\n } else {\n if (srcSheet == null) {\n return store;\n }\n let { rows: dy, cols: dx } = areaDiff(copyingArea);\n if (selectingArea.top !== -1) {\n y = selectingArea.top;\n x = selectingArea.left;\n const superposed = superposeArea(selectingArea, copyingArea);\n dy = superposed.rows;\n dx = superposed.cols;\n }\n selectingArea = { top: y, left: x, bottom: y + dy, right: x + dx };\n newSheet = dstSheet.copy({\n srcSheet,\n src: copyingArea,\n dst: selectingArea,\n onlyValue,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: srcSheet.id,\n transmit: { copyingZone },\n choosing,\n selectingZone,\n }),\n redoReflection: compactReflection({\n sheetId: srcSheet.id,\n transmit: { copyingSheetId: srcSheet.id, copyingZone: resetZone },\n choosing,\n selectingZone: areaToZone(selectingArea),\n }),\n });\n }\n\n const nextSelectingZone = restrictZone(areaToZone(selectingArea));\n nextSelectingZone.endX = Math.min(nextSelectingZone.endX, newSheet.numCols);\n nextSelectingZone.endY = Math.min(nextSelectingZone.endY, newSheet.numRows);\n return {\n ...store,\n sheetReactive: { current: newSheet },\n selectingZone: nextSelectingZone,\n inputting: newSheet.getSerializedValue({ point: choosing, resolution: 'RAW' }),\n ...initSearchStatement(newSheet, store),\n callback: ({ sheetReactive: sheetRef }) => {\n registry.transmit({\n copyingZone: resetZone,\n });\n },\n };\n }\n}\nexport const paste = new PasteAction().bind();\n\nclass EscapeAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n return {\n ...store,\n editingAddress: '',\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n callback: ({ sheetReactive: sheetRef }) => {\n sheetRef.current!.registry.transmit({\n copyingZone: resetZone,\n cutting: false,\n });\n },\n };\n }\n}\nexport const escape = new EscapeAction().bind();\n\nclass ChooseAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n choosing: payload,\n entering: true,\n };\n }\n}\nexport const choose = new ChooseAction().bind();\n\nclass SelectAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n selectingZone: payload,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n };\n }\n}\nexport const select = new SelectAction().bind();\n\nclass SelectRowsAction<T extends { range: RangeType; numCols: number }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { range, numCols } = payload;\n const { start, end } = range;\n const sheet = store.sheetReactive.current;\n const selectingZone = {\n startY: start,\n startX: 1,\n endY: end,\n endX: numCols,\n };\n // Find the first non-filtered row in the selection for choosing\n let choosingY = start;\n if (sheet) {\n for (let y = start; y <= end; y++) {\n if (!sheet.isRowFiltered(y)) {\n choosingY = y;\n break;\n }\n }\n }\n return {\n ...store,\n selectingZone,\n choosing: { y: choosingY, x: 1 },\n leftHeaderSelecting: true,\n topHeaderSelecting: false,\n };\n }\n}\nexport const selectRows = new SelectRowsAction().bind();\n\nclass SelectColsAction<T extends { range: RangeType; numRows: number }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { range, numRows } = payload;\n const { start, end } = range;\n const sheet = store.sheetReactive.current;\n const selectingZone = {\n startY: 1,\n startX: start,\n endY: numRows,\n endX: end,\n };\n // Find the first non-filtered row (y=1 is always visible for columns, use y=1)\n // For columns there is no column-level filter, so choosing y=1 (first data row visible)\n let choosingY = 1;\n if (sheet) {\n for (let y = 1; y <= numRows; y++) {\n if (!sheet.isRowFiltered(y)) {\n choosingY = y;\n break;\n }\n }\n }\n return {\n ...store,\n selectingZone,\n choosing: { y: choosingY, x: start },\n leftHeaderSelecting: false,\n topHeaderSelecting: true,\n };\n }\n}\nexport const selectCols = new SelectColsAction().bind();\n\nclass DragAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { startY, startX } = store.selectingZone;\n const selectingZone = {\n startY,\n startX,\n endY: payload.y,\n endX: payload.x,\n };\n if (startY === payload.y && startX === payload.x) {\n selectingZone.endY = -1;\n selectingZone.endX = -1;\n }\n return { ...store, selectingZone };\n }\n}\nexport const drag = new DragAction().bind();\n\nclass SearchAction<T extends number> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { matchingCells } = store;\n let { matchingCellIndex, choosing } = store;\n matchingCellIndex += payload;\n if (matchingCellIndex >= matchingCells.length) {\n matchingCellIndex = 0;\n } else if (matchingCellIndex < 0) {\n matchingCellIndex = matchingCells.length - 1;\n }\n\n if (matchingCells.length > 0) {\n const address = matchingCells[matchingCellIndex];\n choosing = a2p(address);\n }\n return { ...store, matchingCells, matchingCellIndex, choosing };\n }\n}\nexport const search = new SearchAction().bind();\n\nclass WriteAction<T extends { value: string; point?: PointType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n let { value, point } = payload;\n const { choosing, selectingZone, sheetReactive: sheetRef } = store;\n if (point == null) {\n point = choosing;\n }\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n const newSheet = sheet.write({\n point: point,\n value,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing: point,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing: point,\n }),\n });\n return {\n ...store,\n ...initSearchStatement(newSheet, store),\n sheetReactive: { current: newSheet },\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingZone: resetZone,\n });\n },\n };\n }\n}\nexport const write = new WriteAction().bind();\n\nclass ClearAction<T extends null> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { choosing, selectingZone, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n\n let selectingArea = zoneToArea(selectingZone);\n if (selectingArea.top === -1) {\n const { y, x } = choosing;\n selectingArea = { top: y, left: x, bottom: y, right: x };\n }\n const { top, left, bottom, right } = selectingArea;\n const diff: CellsByAddressType = {};\n let diffCount = 0;\n for (let y = top; y <= bottom; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution: 'SYSTEM' });\n const address = p2a({ y, x });\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n continue;\n }\n // Spilled cells are derived from the origin cell's formula and should\n // not be cleared independently — doing so would blank the FormulaBar\n // while the spill re-populates the value on next evaluation.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n continue;\n }\n if (cell?.value != null) {\n diff[address] = { value: undefined };\n diffCount++;\n }\n }\n }\n if (diffCount === 0) {\n return store;\n }\n sheet.update({\n diff,\n partial: true,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const clear = new ClearAction().bind();\n\nclass UndoAction<T extends null> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n const { history, callback } = sheet.undo();\n if (history == null) {\n return store;\n }\n if (history.dstSheetId !== sheet.id) {\n const { dispatch, store: dstStore } = sheet.registry.contextsBySheetId[history.dstSheetId];\n dispatch(\n setStore({\n ...dstStore,\n ...history.undoReflection,\n sheetReactive: { current: dstStore.sheetReactive.current },\n }),\n );\n flashSheet(dstStore.flashRef.current);\n // For cross-sheet MOVE: the src (current) sheet's lastChangedAddresses was also updated.\n // Return updated sheetReactive so this sheet's Emitter fires onChange.\n if (history.srcSheetId === sheet.id) {\n return flashWithCallback(store, sheet, callback);\n }\n return store;\n }\n return {\n ...store,\n ...restrictPoints(store, sheet),\n ...history.undoReflection,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n };\n }\n}\nexport const undo = new UndoAction().bind();\n\nclass RedoAction<T extends null> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const { history, newSheet, callback } = sheet.redo();\n if (history == null) {\n return store;\n }\n if (history.dstSheetId !== sheet.id) {\n const { dispatch, store: dstStore } = sheet.registry.contextsBySheetId[history.dstSheetId];\n dispatch(\n setStore({\n ...dstStore,\n ...history.redoReflection,\n sheetReactive: { current: dstStore.sheetReactive.current },\n }),\n );\n flashSheet(dstStore.flashRef.current);\n // For cross-sheet MOVE: the src (current) sheet's lastChangedAddresses was also updated.\n // Return updated sheetReactive so this sheet's Emitter fires onChange.\n if (history.srcSheetId === sheet.id) {\n return flashWithCallback(store, sheet, callback);\n }\n return store;\n }\n return {\n ...store,\n ...restrictPoints(store, sheet),\n ...history.redoReflection,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n };\n }\n}\nexport const redo = new RedoAction().bind();\n\nclass ArrowAction<\n T extends {\n shiftKey: boolean;\n deltaY: number;\n deltaX: number;\n numRows: number;\n numCols: number;\n },\n> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { shiftKey, deltaY, deltaX, numRows, numCols } = payload;\n const { choosing, sheetReactive: sheetRef, tabularRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n let { selectingZone } = store;\n const { y, x } = choosing;\n if (shiftKey) {\n const [dragEndY, dragEndX] = [\n selectingZone.endY === -1 ? y : selectingZone.endY,\n selectingZone.endX === -1 ? x : selectingZone.endX,\n ];\n const [nextY, nextX] = [dragEndY + deltaY, dragEndX + deltaX];\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n selectingZone =\n y === nextY && x === nextX\n ? { startY: -1, startX: -1, endY: -1, endX: -1 }\n : { startY: y, startX: x, endY: nextY, endX: nextX };\n return {\n ...store,\n selectingZone,\n };\n }\n const [nextY, nextX] = [y + deltaY, x + deltaX];\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n // Skip hidden rows\n let resolvedY = nextY;\n if (sheet.isRowFiltered(resolvedY)) {\n const dir = deltaY >= 0 ? 1 : -1;\n while (resolvedY >= 1 && resolvedY <= numRows && sheet.isRowFiltered(resolvedY)) {\n resolvedY += dir;\n }\n if (resolvedY < 1 || resolvedY > numRows) {\n return store; // no visible row in that direction\n }\n }\n let { y: editorTop, x: editorLeft, height, width } = store.editorRect;\n if (deltaY > 0) {\n for (let i = y; i < resolvedY; i++) {\n editorTop += sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n } else if (deltaY < 0) {\n for (let i = y - 1; i >= resolvedY; i--) {\n editorTop -= sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n }\n if (deltaX > 0) {\n for (let i = x; i < nextX; i++) {\n editorLeft += sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n } else if (deltaX < 0) {\n for (let i = x - 1; i >= nextX; i--) {\n editorLeft -= sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n }\n\n const cell = sheet.getCell({ y: resolvedY, x: nextX }, { resolution: 'SYSTEM' });\n height = cell?.height || DEFAULT_HEIGHT;\n width = cell?.width || DEFAULT_WIDTH;\n\n smartScroll(sheet, tabularRef.current, { y: resolvedY, x: nextX });\n return {\n ...store,\n selectingZone: { startY: -1, startX: -1, endY: -1, endX: -1 },\n choosing: { y: resolvedY, x: nextX } as PointType,\n editorRect: { y: editorTop, x: editorLeft, height, width },\n };\n }\n}\nexport const arrow = new ArrowAction().bind();\n\nclass WalkAction<\n T extends {\n deltaY: number;\n deltaX: number;\n numRows: number;\n numCols: number;\n },\n> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, numCols } = payload;\n let { deltaY, deltaX } = payload;\n const { choosing, selectingZone, sheetReactive: sheetRef, tabularRef: gridOuterRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n let { y: editorTop, x: editorLeft, height, width } = store.editorRect;\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n const { top, left, bottom, right } = selectingArea;\n let [nextY, nextX] = [y + deltaY, x + deltaX];\n if (nextY < top && top !== -1) {\n deltaY = bottom - nextY;\n nextY = bottom;\n if (nextX > left) {\n nextX--;\n deltaX--;\n } else {\n deltaX = right - nextX;\n nextX = right;\n }\n }\n if (nextY > bottom && bottom !== -1) {\n deltaY = top - nextY;\n nextY = top;\n if (nextX < right) {\n nextX++;\n deltaX++;\n } else {\n deltaX = left - nextX;\n nextX = left;\n }\n }\n if (nextX < left && left !== -1) {\n deltaX = right - nextX;\n nextX = right;\n if (nextY > top) {\n nextY--;\n deltaY--;\n } else {\n deltaY = bottom - nextY;\n nextY = bottom;\n }\n }\n if (nextX > right && right !== -1) {\n deltaX = left - nextX;\n nextX = left;\n if (nextY < bottom) {\n nextY++;\n deltaY++;\n } else {\n deltaY = top - nextY;\n nextY = top;\n }\n }\n\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n\n // Skip hidden rows\n if (sheet.isRowFiltered(nextY)) {\n const dir = deltaY >= 0 ? 1 : -1;\n const lo = top !== -1 ? top : 1;\n const hi = bottom !== -1 ? bottom : numRows;\n while (nextY >= lo && nextY <= hi && sheet.isRowFiltered(nextY)) {\n nextY += dir;\n }\n if (nextY < lo || nextY > hi || sheet.isRowFiltered(nextY)) {\n return store; // no visible row in range\n }\n }\n\n if (deltaY > 0) {\n for (let i = y; i < nextY; i++) {\n editorTop += sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n } else if (deltaY < 0) {\n for (let i = y - 1; i >= nextY; i--) {\n editorTop -= sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n }\n if (deltaX > 0) {\n for (let i = x; i < nextX; i++) {\n editorLeft += sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n } else if (deltaX < 0) {\n for (let i = x - 1; i >= nextX; i--) {\n editorLeft -= sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n }\n const cell = sheet.getCell({ y: nextY, x: nextX }, { resolution: 'SYSTEM' });\n height = cell?.height || DEFAULT_HEIGHT;\n width = cell?.width || DEFAULT_WIDTH;\n smartScroll(sheet, gridOuterRef.current, { y: nextY, x: nextX });\n return {\n ...store,\n choosing: { y: nextY, x: nextX } as PointType,\n editorRect: { y: editorTop, x: editorLeft, height, width },\n };\n }\n}\nexport const walk = new WalkAction().bind();\n\nclass SetInputtingAction<T extends string> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n inputting: payload,\n };\n }\n}\n\nexport const setInputting = new SetInputtingAction().bind();\n\nclass InsertRowsAboveAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.insertRows({\n y,\n numRows,\n baseY: y,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertRowsAbove = new InsertRowsAboveAction().bind();\n\nclass InsertRowsBelowAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const nextSelectingZone = {\n ...selectingZone,\n startY: selectingZone.startY + numRows,\n endY: selectingZone.endY + numRows,\n };\n const nextChoosing = { ...choosing, y: choosing.y + numRows };\n\n sheet.insertRows({\n y: y + 1,\n numRows,\n baseY: y,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n }),\n });\n return {\n ...store,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertRowsBelow = new InsertRowsBelowAction().bind();\n\nclass InsertColsLeftAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.insertCols({\n x,\n numCols,\n baseX: x,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertColsLeft = new InsertColsLeftAction().bind();\n\nclass InsertColsRightAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const nextSelectingZone = {\n ...selectingZone,\n startX: selectingZone.startX + numCols,\n endX: selectingZone.endX + numCols,\n };\n const nextChoosing = { ...choosing, x: choosing.x + numCols };\n\n selectingZone.startX += numCols;\n selectingZone.endX += numCols;\n\n sheet.insertCols({\n x: x + 1,\n numCols,\n baseX: x,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n }),\n });\n return {\n ...store,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertColsRight = new InsertColsRightAction().bind();\n\nclass RemoveRowsAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.removeRows({\n y,\n numRows,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n sheetHeight: store.sheetHeight,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const removeRows = new RemoveRowsAction().bind();\n\nclass RemoveColsAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.removeCols({\n x,\n numCols,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n sheetWidth: store.sheetWidth,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const removeCols = new RemoveColsAction().bind();\n\nclass SortRowsAction<T extends { x: number; direction: 'asc' | 'desc' }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { x, direction } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.sortRows({ x, direction });\n const reflection = compactReflection({ sheetId: sheet.id, selectingZone, choosing });\n if (sheet.registry.lastHistory) {\n sheet.registry.lastHistory.undoReflection = reflection;\n sheet.registry.lastHistory.redoReflection = reflection;\n }\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const sortRows = new SortRowsAction().bind();\n\nclass FilterRowsAction<T extends { x?: number; filter?: FilterConfig }> extends CoreAction<T> {\n mutation = true;\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { x, filter } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.filterRows({ x, filter });\n const reflection = compactReflection({ sheetId: sheet.id, selectingZone, choosing });\n if (sheet.registry.lastHistory) {\n sheet.registry.lastHistory.undoReflection = reflection;\n sheet.registry.lastHistory.redoReflection = reflection;\n }\n let newChoosing = choosing;\n if (sheet.isRowFiltered(choosing.y)) {\n for (let y = 1; y <= sheet.numRows; y++) {\n if (!sheet.isRowFiltered(y)) {\n newChoosing = { y, x: choosing.x };\n break;\n }\n }\n }\n return {\n ...store,\n choosing: newChoosing,\n selectingZone: newChoosing !== choosing ? resetZone : selectingZone,\n sheetReactive: { current: sheet },\n callback: ({ sheetReactive: sheetRef }) => {\n const t = sheetRef.current;\n if (t) {\n t.registry.transmit({\n cutting: false,\n copyingZone: resetZone,\n });\n }\n },\n };\n }\n}\nexport const filterRows = new FilterRowsAction().bind();\n\nclass SetColumnMenuAction<T extends { x: number; position: { y: number; x: number } } | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n columnMenuState: payload,\n };\n }\n}\nexport const setColumnMenu = new SetColumnMenuAction().bind();\n\nclass SetRowMenuAction<T extends { y: number; position: { y: number; x: number } } | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n rowMenuState: payload,\n };\n }\n}\nexport const setRowMenu = new SetRowMenuAction().bind();\n\nclass SetEditorHoveringAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editorHovering: payload,\n };\n }\n}\nexport const setEditorHovering = new SetEditorHoveringAction().bind();\n\nclass setStoreAction<T extends Partial<StoreType>> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n ...payload,\n };\n }\n}\nexport const setStore = new setStoreAction().bind();\n\nexport const userActions = {\n blur,\n copy,\n cut,\n paste,\n escape,\n choose,\n select,\n selectRows,\n selectCols,\n drag,\n search,\n write,\n clear,\n undo,\n redo,\n arrow,\n walk,\n insertRowsAbove,\n insertRowsBelow,\n insertColsLeft,\n insertColsRight,\n removeRows,\n removeCols,\n sortRows,\n filterRows,\n};\n","import { useEffect, useState, useRef } from 'react';\nimport { createBook, type BookType, type RegistryProps, type TransmitProps } from '@gridsheet/core';\nimport { updateSheet } from '../store/actions';\n\n// Return the document object with SSR.\nexport const useBrowser = () => {\n const [ok, setOk] = useState(false);\n useEffect(() => {\n setOk(true);\n }, []);\n if (ok && typeof window !== 'undefined') {\n return { window, document };\n }\n return { window: null, document: null };\n};\n\nexport const useDebounce = <T>(value: T, delay = 100) => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n const timerRef = useRef<number>();\n\n useEffect(() => {\n timerRef.current = window.setTimeout(() => setDebouncedValue(value), delay);\n return () => {\n window.clearTimeout(timerRef.current);\n };\n }, [value, delay]);\n return debouncedValue;\n};\n\nexport const useDebounceCallback = (callback: (...args: any[]) => void, delay = 100) => {\n const debouncedCallback = useRef(callback);\n const timerRef = useRef<number>();\n\n useEffect(() => {\n debouncedCallback.current = callback;\n }, [callback]);\n\n return (...args: any[]) => {\n window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n debouncedCallback.current(...args);\n }, delay);\n };\n};\n\nexport const useBook = (props: RegistryProps = {}) => {\n const [book, setBook] = useState<BookType>(() => createBook(props));\n const { registry } = book;\n registry.updateSheet = updateSheet;\n registry.transmit = (patch?: TransmitProps) => {\n Object.assign(registry, patch);\n if (!registry.ready) {\n return;\n }\n requestAnimationFrame(() => setBook({ registry }));\n };\n useEffect(() => {\n Object.assign(registry, props);\n }, [props]);\n return book;\n};\n"],"names":["_a","sheetRef","nextSelectingZone","newSheet","prevention","nextY","nextX"],"mappings":";;AAQa,MAAA,oBAAoB,CAAC,eAA+C;AACzE,QAAA,SAAS,EAAE,GAAG,WAAW;AAC3B,MAAA,OAAO,iBAAiB,QAAQ,OAAO,cAAc,SAAS,MAAM,OAAO,cAAc,SAAS,IAAI;AACxG,WAAO,OAAO;AAAA,EAAA;AAET,SAAA;AACT;AAEa,MAAA,iBAAiB,CAAC,OAAkB,UAAiB;AAC1D,QAAA,EAAE,UAAU,cAAA,IAAkB;AAChC,MAAA,EAAE,GAAG,EAAA,IAAM;AACX,MAAA,EAAE,QAAQ,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,GAAA,IAAO;AAC/C,QAAA,CAAC,SAAS,OAAO,IAAI,CAAC,MAAM,SAAS,MAAM,OAAO;AACxD,MAAI,IAAI,SAAS;AACX,QAAA;AAAA,EAAA;AAEN,MAAI,IAAI,SAAS;AACX,QAAA;AAAA,EAAA;AAEN,MAAI,KAAK,SAAS;AACX,SAAA;AAAA,EAAA;AAEP,MAAI,KAAK,SAAS;AACX,SAAA;AAAA,EAAA;AAEP,MAAI,KAAK,SAAS;AACX,SAAA;AAAA,EAAA;AAEP,MAAI,KAAK,SAAS;AACX,SAAA;AAAA,EAAA;AAEA,SAAA;AAAA,IACL,UAAU,EAAE,GAAG,EAAE;AAAA,IACjB,eAAe,EAAE,QAAQ,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,GAAG;AAAA,EAC9D;AACF;AAEA,MAAM,cAAc;AACpB,MAAM,oBAAoB;AACb,MAAA,aAAa,CAAC,OAA2B;AACpD,MAAI,CAAC,IAAI;AACP;AAAA,EAAA;AAEC,KAAA,UAAU,OAAO,WAAW;AAE/B,OAAK,GAAG;AACL,KAAA,UAAU,IAAI,WAAW;AAC5B,aAAW,MAAM,GAAG,UAAU,OAAO,WAAW,GAAG,iBAAiB;AACtE;AAEO,MAAM,oBAAoB,CAC/B,OACA,OACA,cAC2D;AAAA,EAC3D,GAAG;AAAA,EACH,eAAe,EAAE,SAAS,MAAM;AAAA,EAChC,UAAU,CAAC,MAAiB;AAC1B,yCAAW;AACA,eAAA,MAAM,SAAS,OAAO;AAAA,EAAA;AAErC;AAEa,MAAA,sBAAsB,CAAC,OAAc,UAAqB;AACrE,QAAM,EAAE,aAAa,qBAAqB,aAAa,YAAgB,IAAA;AACnE,MAAA,EAAE,aAAa;AACnB,MAAI,CAAC,aAAa;AACT,WAAA,EAAE,eAAe,GAAG;AAAA,EAAA;AAE7B,QAAM,gBAA2B,CAAC;AAE9B,MAAA;AACJ,MAAI,aAAa;AACX,QAAA;AACI,YAAA,QAAQ,sBAAsB,KAAK;AACzC,YAAM,QAAQ,IAAI,OAAO,aAAa,KAAK;AAC3C,gBAAU,CAAC,MAAc,MAAM,KAAK,CAAC;AAAA,aAC9B,GAAG;AAEV,YAAM,IAAI,sBAAsB,cAAc,YAAY,YAAY;AACtE,gBAAU,CAAC,MAAc;AACvB,cAAM,IAAI,sBAAsB,IAAI,EAAE,YAAY;AAC3C,eAAA,EAAE,QAAQ,CAAC,MAAM;AAAA,MAC1B;AAAA,IAAA;AAAA,EACF,OACK;AACL,UAAM,IAAI,sBAAsB,cAAc,YAAY,YAAY;AACtE,cAAU,CAAC,MAAc;AACvB,YAAM,IAAI,sBAAsB,IAAI,EAAE,YAAY;AAC3C,aAAA,EAAE,QAAQ,CAAC,MAAM;AAAA,IAC1B;AAAA,EAAA;AAIE,MAAA,SAAS,GACX,OAAO,MAAM;AACX,MAAA,SAAS,GACX,OAAO,MAAM;AACf,MAAI,aAAa;AACf,aAAS,YAAY;AACrB,WAAO,YAAY;AACnB,aAAS,YAAY;AACrB,WAAO,YAAY;AAAA,EAAA;AAGrB,WAAS,IAAI,QAAQ,KAAK,MAAM,KAAK;AACnC,aAAS,IAAI,QAAQ,KAAK,MAAM,KAAK;AAC7B,YAAA,IAAI,MAAM,mBAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;AAClD,UAAA,QAAQ,CAAC,GAAG;AACA,sBAAA,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE;AAAA,MAAA;AAAA,IACzC;AAAA,EACF;AAEF,QAAM,oBAAoB,cAAc,WAAW,MAAM,cAAc,SAAS,MAAM,oBAAoB;AACtG,MAAA,cAAc,SAAS,GAAG;AACtB,UAAA,UAAU,cAAc,iBAAiB;AAC/C,eAAW,IAAI,OAAO;AAAA,EAAA;AAExB,SAAO,EAAE,eAAe,aAAa,mBAAmB,SAAS;AACnE;AAEa,MAAA,kBAAkB,CAAC,UAAqB;AACnD,QAAM,EAAE,SAAS,eAAe,SAAa,IAAA;AAC7C,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,OAAO;AACH,WAAA;AAAA,EAAA;AAEL,MAAA,YAAY,MAAM,SAAS,gBAAgB;AACtC,WAAA;AAAA,EAAA;AAEF,SAAA,CAAC,CAAC,MAAM,SAAS;AAC1B;AClHA,MAAM,YAAsB,EAAE,QAAQ,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,GAAG;AAEzE,MAAM,UAA4C,CAAC;AAMtC,MAAA,UAAU,CAAI,OAAkB,WAAkD;;AACvF,QAAA,MAAiC,QAAQ,OAAO,IAAI;AAC1D,MAAI,OAAO,MAAM;AACR,WAAA;AAAA,EAAA;AASH,QAAA,YAAW,WAAM,cAAc,YAApB,mBAA6B;AAC9C,OAAI,0CAAU,qBAAV,mBAA4B,IAAI,SAAS;AAC3C,UAAM,SAAS,SAAS,iBAAiB,IAAI,MAAM;AAC1C,aAAA,iBAAiB,OAAO,MAAM;AAChC,WAAA;AAAA,EAAA;AAGH,QAAA,EAAE,UAAU,GAAG,aAAa,IAAI,OAAO,OAAO,OAAO,KAAK;AAChE,uCAAW;AACX,QAAM,SAAS,EAAE,GAAG,OAAO,GAAG,SAAS;AAEvC,MAAI,UAAU;AACR,QAAA,CAAC,SAAS,kBAAkB;AACrB,eAAA,uCAAuB,IAAI;AAAA,IAAA;AAE7B,aAAA,iBAAiB,IAAI,QAAQ,MAAM;AAC5C,mBAAe,MAAM;;AACV,OAAAA,MAAA,SAAA,qBAAA,gBAAAA,IAAkB,OAAO;AAAA,IAAM,CACzC;AAAA,EAAA;AAGI,SAAA;AACT;AAEO,MAAM,cAAN,MAAM,YAAc;AAAA,EAApB,cAAA;AAEL,SAAQ,WAAmB;AAE3B,SAAO,WAAW;AAAA,EAAA;AAAA,EAEX,OAAO,OAAkB,SAA+B;AACtD,WAAA;AAAA,EAAA;AAAA,EAEF,KAAK,SAAwC;AAC3C,WAAA;AAAA,MACL,MAAM,KAAK;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EAAA;AAAA,EAEK,OAAO;AACZ,SAAK,WAAW,YAAW;AACnB,YAAA,KAAK,QAAQ,IAAI;AAClB,WAAA,KAAK,KAAK,KAAK,IAAI;AAAA,EAAA;AAE9B;AAnBE,YAAO,OAAO;AADT,IAAM,aAAN;AAuBM,MAAA,mBAAmB,CAAC,SAA0B;;AAClD,WAAA,aAAQ,IAAI,MAAZ,mBAAe,cAAa;AACrC;AAEA,MAAM,6BAA2D,WAAc;AAAA,EAC7E,OAAO,OAAkB,SAA+B;AACtD,UAAM,cAAc;AACd,UAAA,EAAE,eAAe,SAAA,IAAa;AAChC,QAAA,SAAS,WAAW,MAAM;AACrB,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,oBAAoB,SAAS,SAAS,EAAE,GAAG,OAAO,aAAa;AAAA,MAClE;AAAA,IACF;AAAA,EAAA;AAEJ;AACO,MAAM,iBAAiB,IAAI,qBAAqB,EAAE,KAAK;AAE9D,MAAM,qCAAwD,WAAc;AAAA,EAC1E,OAAO,OAAkB,SAA+B;AACtD,UAAM,sBAAsB;AACtB,UAAA,EAAE,eAAe,SAAA,IAAa;AAChC,QAAA,SAAS,WAAW,MAAM;AACrB,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,oBAAoB,SAAS,SAAS,EAAE,GAAG,OAAO,qBAAqB;AAAA,MAC1E;AAAA,IACF;AAAA,EAAA;AAEJ;AACO,MAAM,yBAAyB,IAAI,6BAA6B,EAAE,KAAK;AAE9E,MAAM,6BAAgD,WAAc;AAAA,EAClE,OAAO,OAAkB,SAA+B;AACtD,UAAM,cAAc;AACd,UAAA,EAAE,eAAe,SAAA,IAAa;AAChC,QAAA,SAAS,WAAW,MAAM;AACrB,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,oBAAoB,SAAS,SAAS,EAAE,GAAG,OAAO,aAAa;AAAA,MAClE;AAAA,IACF;AAAA,EAAA;AAEJ;AACO,MAAM,iBAAiB,IAAI,qBAAqB,EAAE,KAAK;AAE9D,MAAM,6BAA6D,WAAc;AAAA,EAC/E,OAAO,OAAkB,SAA+B;AACtD,UAAM,cAAc;AACd,UAAA,EAAE,eAAe,SAAA,IAAa;AAChC,QAAA,SAAS,WAAW,MAAM;AACrB,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,oBAAoB,SAAS,SAAS,EAAE,GAAG,OAAO,aAAa;AAAA,MAClE;AAAA,IACF;AAAA,EAAA;AAEJ;AACO,MAAM,iBAAiB,IAAI,qBAAqB,EAAE,KAAK;AAE9D,MAAM,gCAAkD,WAAc;AAAA,EACpE,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,IAClB;AAAA,EAAA;AAEJ;AACO,MAAM,oBAAoB,IAAI,wBAAwB,EAAE,KAAK;AAEpE,MAAM,oCAAgE,WAAc;AAAA,EAClF,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,oBAAoB;AAAA,IACtB;AAAA,EAAA;AAEJ;AACO,MAAM,wBAAwB,IAAI,4BAA4B,EAAE,KAAK;AAE5E,MAAM,6BAAkD,WAAc;AAAA,EACpE,OAAO,OAAkB,SAA+B;AACtD,UAAM,WAAW,IAAI,SAAS,OAAO,OAAO;AAC5C,UAAM,QAAQ,SAAS;AACjB,UAAA,gBAAgB,WAAW,SAAS,SAAS;AAE5C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,MAAM;AAAA,MAChC,GAAG,oBAAoB,OAAO,KAAK;AAAA,MACnC,GAAG,eAAe,OAAO,KAAK;AAAA,MAC9B;AAAA,MACA,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACtB;AAAA,EAAA;AAEJ;AACO,MAAM,iBAAiB,IAAI,qBAAqB,EAAE,KAAK;AAE9D,MAAM,qCAA6D,WAAc;AAAA,EAC/E,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,qBAAqB;AAAA,IACvB;AAAA,EAAA;AAEJ;AACO,MAAM,yBAAyB,IAAI,6BAA6B,EAAE,KAAK;AAE9E,MAAM,mCAAuE,WAAc;AAAA,EACzF,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,mBAAmB;AAAA,IACrB;AAAA,EAAA;AAEJ;AACO,MAAM,uBAAuB,IAAI,2BAA2B,EAAE,KAAK;AAE1E,MAAM,mCAAuE,WAAc;AAAA,EACzF,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,mBAAmB;AAAA,IACrB;AAAA,EAAA;AAEJ;AACO,MAAM,uBAAuB,IAAI,2BAA2B,EAAE,KAAK;AAE1E,MAAM,0BAA6C,WAAc;AAAA,EAC/D,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,IACZ;AAAA,EAAA;AAEJ;AACO,MAAM,cAAc,IAAI,kBAAkB,EAAE,KAAK;AAExD,MAAM,0BAA2C,WAAc;AAAA,EAC7D,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,QAAQ;AAAA,MAClC,GAAG,oBAAoB,SAAS,KAAK;AAAA,MACrC,GAAG,eAAe,OAAO,OAAO;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,cAAc,IAAI,kBAAkB,EAAE,KAAK;AAExD,MAAM,4BAAgD,WAAc;AAAA,EAClE,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,IACd;AAAA,EAAA;AAEJ;AACO,MAAM,gBAAgB,IAAI,oBAAoB,EAAE,KAAK;AAE5D,MAAM,oBAAuC,WAAc;AAAA,EACzD,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,IACZ;AAAA,EAAA;AAEJ;AACO,MAAM,cAAc,IAAI,YAAY,EAAE,KAAK;AAElD,MAAM,mBAAmC,WAAc;AAAA,EACrD,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,IAClB;AAAA,EAAA;AAEJ;AACO,MAAM,OAAO,IAAI,WAAW,EAAE,KAAK;AAE1C,MAAM,mBAAuC,WAAc;AAAA,EACzD,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,eAAe,SAAA,IAAa;AACpC,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO;AACH,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,UAAU,CAAC,EAAE,eAAeC,gBAAe;AACzC,cAAM,SAAS,SAAS;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,aAAa;AAAA,UACb,SAAS;AAAA,QAAA,CACV;AAAA,MAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;AACO,MAAM,OAAO,IAAI,WAAW,EAAE,KAAK;AAE1C,MAAM,kBAAsC,WAAc;AAAA,EAA1D,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,eAAe,SAAA,IAAa;AACpC,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO;AACH,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,UAAU,CAAC,EAAE,eAAeA,gBAAe;AACzC,cAAM,SAAS,SAAS;AAAA,UACtB,gBAAgB,MAAM;AAAA,UACtB,aAAa;AAAA,UACb,SAAS;AAAA,QAAA,CACV;AAAA,MAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;AACO,MAAM,MAAM,IAAI,UAAU,EAAE,KAAK;AAExC,MAAM,oBAA+E,WAAc;AAAA,EAAnG,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,UAAU,eAAe,eAAe,YAAgB,IAAA;AAChE,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,UAAU;AACN,aAAA;AAAA,IAAA;AAEH,UAAA,EAAE,aAAa;AACrB,UAAM,EAAE,gBAAgB,aAAa,QAAY,IAAA;AAC3C,UAAA,WAAW,SAAS,kBAAkB,cAAc;AAEtD,QAAA,gBAAgB,WAAW,aAAa;AACtC,UAAA,cAAc,WAAW,WAAW;AACpC,UAAA,EAAE,QAAQ,UAAA,IAAc;AAE9B,QAAI,SAAS;AACX,UAAI,CAAC,UAAU;AACN,eAAA;AAAA,MAAA;AAET,YAAM,MAAM;AACZ,YAAM,EAAE,MAAM,IAAI,MAAM,GAAG,IAAI,SAAS,WAAW;AAC7C,YAAA,MACJ,cAAc,QAAQ,KAClB;AAAA,QACE,KAAK,cAAc;AAAA,QACnB,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc,MAAM;AAAA,QAC5B,OAAO,cAAc,OAAO;AAAA,MAAA,IAE9B;AAAA,QACE,KAAK,SAAS;AAAA,QACd,MAAM,SAAS;AAAA,QACf,QAAQ,SAAS,IAAI;AAAA,QACrB,OAAO,SAAS,IAAI;AAAA,MACtB;AAEN,YAAMC,qBAAoB,aAAa,WAAW,GAAG,CAAC;AAChDC,YAAAA,YAAW,SAAS,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,gBAAgB,kBAAkB;AAAA,UAChC,SAAS,SAAS;AAAA,UAClB,eAAeD;AAAAA,UACf;AAAA,UACA,UAAU,EAAE,gBAAgB,SAAS,IAAI,aAAa,SAAS,KAAK;AAAA,QAAA,CACrE;AAAA,QACD,gBAAgB,kBAAkB;AAAA,UAChC,SAAS,SAAS;AAAA,UAClB;AAAA,UACA,UAAU,EAAE,gBAAgB,SAAS,IAAI,aAAa,UAAU;AAAA,QACjE,CAAA;AAAA,MAAA,CACF;AAEM,aAAA;AAAA,QACL,GAAG;AAAA,QACH,GAAG,oBAAoBC,WAAU,KAAK;AAAA,QACtC,eAAe,EAAE,SAASA,UAAS;AAAA,QACnC,eAAeD;AAAAA,QACf,WAAWC,UAAS,mBAAmB,EAAE,OAAO,UAAU,YAAY,OAAO;AAAA,QAC7E,UAAU,CAAC,EAAE,eAAe,eAAe;AACzC,mBAAS,SAAS;AAAA,YAChB,SAAS;AAAA,YACT,aAAa;AAAA,UAAA,CACd;AAAA,QAAA;AAAA,MAEL;AAAA,IAAA;AAGE,QAAA;AACA,QAAA,EAAE,GAAG,EAAA,IAAM;AAEX,QAAA,YAAY,QAAQ,IAAI;AACpB,YAAA,EAAE,MAAM,QAAQ,MAAM,MAAA,IAAU,YAAY,EAAE,QAAQ,MAAM,IAAI;AACtD,sBAAA;AAAA,QACd,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,IAAI;AAAA,QACZ,OAAO,IAAI;AAAA,MACb;AACA,YAAMD,qBAAoB,aAAa,WAAW,aAAa,CAAC;AAChE,iBAAW,SAAS,mBAAmB;AAAA,QACrC,OAAO,EAAE,GAAG,EAAE;AAAA,QACd;AAAA,QACA;AAAA,QACA,gBAAgB,kBAAkB;AAAA,UAChC,SAAS,SAAS;AAAA,UAClB,eAAeA;AAAAA,UACf;AAAA,QAAA,CACD;AAAA,QACD,gBAAgB,kBAAkB;AAAA,UAChC,SAAS,SAAS;AAAA,UAClB,eAAeA;AAAAA,UACf;AAAA,QACD,CAAA;AAAA,MAAA,CACF;AAAA,IAAA,OACI;AACL,UAAI,YAAY,MAAM;AACb,eAAA;AAAA,MAAA;AAET,UAAI,EAAE,MAAM,IAAI,MAAM,GAAG,IAAI,SAAS,WAAW;AAC7C,UAAA,cAAc,QAAQ,IAAI;AAC5B,YAAI,cAAc;AAClB,YAAI,cAAc;AACZ,cAAA,aAAa,cAAc,eAAe,WAAW;AAC3D,aAAK,WAAW;AAChB,aAAK,WAAW;AAAA,MAAA;AAEF,sBAAA,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,IAAI,IAAI,OAAO,IAAI,GAAG;AACjE,iBAAW,SAAS,KAAK;AAAA,QACvB;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,gBAAgB,kBAAkB;AAAA,UAChC,SAAS,SAAS;AAAA,UAClB,UAAU,EAAE,YAAY;AAAA,UACxB;AAAA,UACA;AAAA,QAAA,CACD;AAAA,QACD,gBAAgB,kBAAkB;AAAA,UAChC,SAAS,SAAS;AAAA,UAClB,UAAU,EAAE,gBAAgB,SAAS,IAAI,aAAa,UAAU;AAAA,UAChE;AAAA,UACA,eAAe,WAAW,aAAa;AAAA,QACxC,CAAA;AAAA,MAAA,CACF;AAAA,IAAA;AAGH,UAAM,oBAAoB,aAAa,WAAW,aAAa,CAAC;AAChE,sBAAkB,OAAO,KAAK,IAAI,kBAAkB,MAAM,SAAS,OAAO;AAC1E,sBAAkB,OAAO,KAAK,IAAI,kBAAkB,MAAM,SAAS,OAAO;AACnE,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,SAAS;AAAA,MACnC,eAAe;AAAA,MACf,WAAW,SAAS,mBAAmB,EAAE,OAAO,UAAU,YAAY,OAAO;AAAA,MAC7E,GAAG,oBAAoB,UAAU,KAAK;AAAA,MACtC,UAAU,CAAC,EAAE,eAAe,eAAe;AACzC,iBAAS,SAAS;AAAA,UAChB,aAAa;AAAA,QAAA,CACd;AAAA,MAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;AACO,MAAM,QAAQ,IAAI,YAAY,EAAE,KAAK;AAE5C,MAAM,qBAAqC,WAAc;AAAA,EACvD,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,eAAe,SAAA,IAAa;AAC7B,WAAA;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,MACpB,UAAU,CAAC,EAAE,eAAeD,gBAAe;AACzCA,kBAAS,QAAS,SAAS,SAAS;AAAA,UAClC,aAAa;AAAA,UACb,SAAS;AAAA,QAAA,CACV;AAAA,MAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;AACO,MAAM,SAAS,IAAI,aAAa,EAAE,KAAK;AAE9C,MAAM,qBAA0C,WAAc;AAAA,EAC5D,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EAAA;AAEJ;AACO,MAAM,SAAS,IAAI,aAAa,EAAE,KAAK;AAE9C,MAAM,qBAAyC,WAAc;AAAA,EAC3D,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,IACtB;AAAA,EAAA;AAEJ;AACO,MAAM,SAAS,IAAI,aAAa,EAAE,KAAK;AAE9C,MAAM,yBAA0E,WAAc;AAAA,EAC5F,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,OAAO,QAAA,IAAY;AACrB,UAAA,EAAE,OAAO,IAAA,IAAQ;AACjB,UAAA,QAAQ,MAAM,cAAc;AAClC,UAAM,gBAAgB;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,QAAI,YAAY;AAChB,QAAI,OAAO;AACT,eAAS,IAAI,OAAO,KAAK,KAAK,KAAK;AACjC,YAAI,CAAC,MAAM,cAAc,CAAC,GAAG;AACf,sBAAA;AACZ;AAAA,QAAA;AAAA,MACF;AAAA,IACF;AAEK,WAAA;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,UAAU,EAAE,GAAG,WAAW,GAAG,EAAE;AAAA,MAC/B,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,IACtB;AAAA,EAAA;AAEJ;AACO,MAAM,aAAa,IAAI,iBAAiB,EAAE,KAAK;AAEtD,MAAM,yBAA0E,WAAc;AAAA,EAC5F,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,OAAO,QAAA,IAAY;AACrB,UAAA,EAAE,OAAO,IAAA,IAAQ;AACjB,UAAA,QAAQ,MAAM,cAAc;AAClC,UAAM,gBAAgB;AAAA,MACpB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAGA,QAAI,YAAY;AAChB,QAAI,OAAO;AACT,eAAS,IAAI,GAAG,KAAK,SAAS,KAAK;AACjC,YAAI,CAAC,MAAM,cAAc,CAAC,GAAG;AACf,sBAAA;AACZ;AAAA,QAAA;AAAA,MACF;AAAA,IACF;AAEK,WAAA;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA,UAAU,EAAE,GAAG,WAAW,GAAG,MAAM;AAAA,MACnC,qBAAqB;AAAA,MACrB,oBAAoB;AAAA,IACtB;AAAA,EAAA;AAEJ;AACO,MAAM,aAAa,IAAI,iBAAiB,EAAE,KAAK;AAEtD,MAAM,mBAAwC,WAAc;AAAA,EAC1D,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM;AACjC,UAAM,gBAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,IAChB;AACA,QAAI,WAAW,QAAQ,KAAK,WAAW,QAAQ,GAAG;AAChD,oBAAc,OAAO;AACrB,oBAAc,OAAO;AAAA,IAAA;AAEhB,WAAA,EAAE,GAAG,OAAO,cAAc;AAAA,EAAA;AAErC;AACO,MAAM,OAAO,IAAI,WAAW,EAAE,KAAK;AAE1C,MAAM,qBAAuC,WAAc;AAAA,EACzD,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,kBAAkB;AACtB,QAAA,EAAE,mBAAmB,SAAA,IAAa;AACjB,yBAAA;AACjB,QAAA,qBAAqB,cAAc,QAAQ;AACzB,0BAAA;AAAA,IAAA,WACX,oBAAoB,GAAG;AAChC,0BAAoB,cAAc,SAAS;AAAA,IAAA;AAGzC,QAAA,cAAc,SAAS,GAAG;AACtB,YAAA,UAAU,cAAc,iBAAiB;AAC/C,iBAAW,IAAI,OAAO;AAAA,IAAA;AAExB,WAAO,EAAE,GAAG,OAAO,eAAe,mBAAmB,SAAS;AAAA,EAAA;AAElE;AACO,MAAM,SAAS,IAAI,aAAa,EAAE,KAAK;AAE9C,MAAM,oBAAoE,WAAc;AAAA,EACtF,OAAO,OAAkB,SAA+B;AAClD,QAAA,EAAE,OAAO,MAAA,IAAU;AACvB,UAAM,EAAE,UAAU,eAAe,eAAe,SAAa,IAAA;AAC7D,QAAI,SAAS,MAAM;AACT,cAAA;AAAA,IAAA;AAEV,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO;AACH,aAAA;AAAA,IAAA;AAEH,UAAA,WAAW,MAAM,MAAM;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,MAAA,CACX;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA,UAAU;AAAA,MACX,CAAA;AAAA,IAAA,CACF;AACM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,oBAAoB,UAAU,KAAK;AAAA,MACtC,eAAe,EAAE,SAAS,SAAS;AAAA,MACnC,UAAU,CAAC,EAAE,eAAeA,gBAAe;AACzC,cAAM,SAAS,SAAS;AAAA,UACtB,aAAa;AAAA,QAAA,CACd;AAAA,MAAA;AAAA,IAEL;AAAA,EAAA;AAEJ;AACO,MAAM,QAAQ,IAAI,YAAY,EAAE,KAAK;AAE5C,MAAM,oBAAoC,WAAc;AAAA,EAAxD,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;;AACtD,UAAM,EAAE,UAAU,eAAe,eAAe,SAAa,IAAA;AAC7D,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO;AACH,aAAA;AAAA,IAAA;AAGL,QAAA,gBAAgB,WAAW,aAAa;AACxC,QAAA,cAAc,QAAQ,IAAI;AACtB,YAAA,EAAE,GAAG,EAAA,IAAM;AACD,sBAAA,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,EAAE;AAAA,IAAA;AAEzD,UAAM,EAAE,KAAK,MAAM,QAAQ,MAAU,IAAA;AACrC,UAAM,OAA2B,CAAC;AAClC,QAAI,YAAY;AAChB,aAAS,IAAI,KAAK,KAAK,QAAQ,KAAK;AAC9B,UAAA,MAAM,cAAc,CAAC,GAAG;AAC1B;AAAA,MAAA;AAEF,eAAS,IAAI,MAAM,KAAK,OAAO,KAAK;AAC5B,cAAA,OAAO,MAAM,QAAQ,EAAE,GAAG,KAAK,EAAE,YAAY,UAAU;AAC7D,cAAM,UAAU,IAAI,EAAE,GAAG,GAAG;AAC5B,YAAIG,WAAW,aAAa,6BAAM,YAAYA,WAAW,KAAK,GAAG;AAC/D;AAAA,QAAA;AAKE,cAAA,WAAM,UAAU,EAAE,GAAG,GAAG,MAAxB,mBAA2B,gBAAe,MAAM;AAClD;AAAA,QAAA;AAEE,aAAA,6BAAM,UAAS,MAAM;AACvB,eAAK,OAAO,IAAI,EAAE,OAAO,OAAU;AACnC;AAAA,QAAA;AAAA,MACF;AAAA,IACF;AAEF,QAAI,cAAc,GAAG;AACZ,aAAA;AAAA,IAAA;AAET,UAAM,OAAO;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MACD,CAAA;AAAA,IAAA,CACF;AACM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,oBAAoB,OAAO,KAAK;AAAA,MACnC,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,QAAQ,IAAI,YAAY,EAAE,KAAK;AAE5C,MAAM,mBAAmC,WAAc;AAAA,EAAvD,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,eAAe,SAAA,IAAa;AACpC,UAAM,QAAQ,SAAS;AACvB,QAAI,CAAC,OAAO;AACH,aAAA;AAAA,IAAA;AAET,UAAM,EAAE,SAAS,aAAa,MAAM,KAAK;AACzC,QAAI,WAAW,MAAM;AACZ,aAAA;AAAA,IAAA;AAEL,QAAA,QAAQ,eAAe,MAAM,IAAI;AAC7B,YAAA,EAAE,UAAU,OAAO,aAAa,MAAM,SAAS,kBAAkB,QAAQ,UAAU;AACzF;AAAA,QACE,SAAS;AAAA,UACP,GAAG;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,eAAe,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,QAC1D,CAAA;AAAA,MACH;AACW,iBAAA,SAAS,SAAS,OAAO;AAGhC,UAAA,QAAQ,eAAe,MAAM,IAAI;AAC5B,eAAA,kBAAkB,OAAO,OAAO,QAAQ;AAAA,MAAA;AAE1C,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,eAAe,OAAO,KAAK;AAAA,MAC9B,GAAG,QAAQ;AAAA,MACX,GAAG,oBAAoB,OAAO,KAAK;AAAA,MACnC,eAAe,EAAE,SAAS,MAAM;AAAA,MAChC,UAAU,CAAC,MAAiB;AAC1B,6CAAW;AACA,mBAAA,MAAM,SAAS,OAAO;AAAA,MAAA;AAAA,IAErC;AAAA,EAAA;AAEJ;AACO,MAAM,OAAO,IAAI,WAAW,EAAE,KAAK;AAE1C,MAAM,mBAAmC,WAAc;AAAA,EAAvD,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,eAAe,SAAA,IAAa;AACpC,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAET,UAAM,EAAE,SAAS,UAAU,SAAS,IAAI,MAAM,KAAK;AACnD,QAAI,WAAW,MAAM;AACZ,aAAA;AAAA,IAAA;AAEL,QAAA,QAAQ,eAAe,MAAM,IAAI;AAC7B,YAAA,EAAE,UAAU,OAAO,aAAa,MAAM,SAAS,kBAAkB,QAAQ,UAAU;AACzF;AAAA,QACE,SAAS;AAAA,UACP,GAAG;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,eAAe,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,QAC1D,CAAA;AAAA,MACH;AACW,iBAAA,SAAS,SAAS,OAAO;AAGhC,UAAA,QAAQ,eAAe,MAAM,IAAI;AAC5B,eAAA,kBAAkB,OAAO,OAAO,QAAQ;AAAA,MAAA;AAE1C,aAAA;AAAA,IAAA;AAEF,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG,eAAe,OAAO,KAAK;AAAA,MAC9B,GAAG,QAAQ;AAAA,MACX,GAAG,oBAAoB,OAAO,KAAK;AAAA,MACnC,eAAe,EAAE,SAAS,MAAM;AAAA,MAChC,UAAU,CAAC,MAAiB;AAC1B,6CAAW;AACA,mBAAA,MAAM,SAAS,OAAO;AAAA,MAAA;AAAA,IAErC;AAAA,EAAA;AAEJ;AACO,MAAM,OAAO,IAAI,WAAW,EAAE,KAAK;AAE1C,MAAM,oBAQI,WAAc;AAAA,EACtB,OAAO,OAAkB,SAA+B;;AACtD,UAAM,EAAE,UAAU,QAAQ,QAAQ,SAAS,YAAY;AACvD,UAAM,EAAE,UAAU,eAAe,UAAU,WAAe,IAAA;AAC1D,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAEL,QAAA,EAAE,kBAAkB;AAClB,UAAA,EAAE,GAAG,EAAA,IAAM;AACjB,QAAI,UAAU;AACN,YAAA,CAAC,UAAU,QAAQ,IAAI;AAAA,QAC3B,cAAc,SAAS,KAAK,IAAI,cAAc;AAAA,QAC9C,cAAc,SAAS,KAAK,IAAI,cAAc;AAAA,MAChD;AACM,YAAA,CAACC,QAAOC,MAAK,IAAI,CAAC,WAAW,QAAQ,WAAW,MAAM;AAC5D,UAAID,SAAQ,KAAK,UAAUA,UAASC,SAAQ,KAAK,UAAUA,QAAO;AACzD,eAAA;AAAA,MAAA;AAGP,sBAAA,MAAMD,UAAS,MAAMC,SACjB,EAAE,QAAQ,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,GAAG,IAC7C,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAMD,QAAO,MAAMC,OAAM;AAChD,aAAA;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IAAA;AAEI,UAAA,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,QAAQ,IAAI,MAAM;AAC9C,QAAI,QAAQ,KAAK,UAAU,SAAS,QAAQ,KAAK,UAAU,OAAO;AACzD,aAAA;AAAA,IAAA;AAGT,QAAI,YAAY;AACZ,QAAA,MAAM,cAAc,SAAS,GAAG;AAC5B,YAAA,MAAM,UAAU,IAAI,IAAI;AAC9B,aAAO,aAAa,KAAK,aAAa,WAAW,MAAM,cAAc,SAAS,GAAG;AAClE,qBAAA;AAAA,MAAA;AAEX,UAAA,YAAY,KAAK,YAAY,SAAS;AACjC,eAAA;AAAA,MAAA;AAAA,IACT;AAEE,QAAA,EAAE,GAAG,WAAW,GAAG,YAAY,QAAQ,UAAU,MAAM;AAC3D,QAAI,SAAS,GAAG;AACd,eAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,uBAAa,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,WAAU;AAAA,MAAA;AAAA,IAClF,WACS,SAAS,GAAG;AACrB,eAAS,IAAI,IAAI,GAAG,KAAK,WAAW,KAAK;AACvC,uBAAa,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,WAAU;AAAA,MAAA;AAAA,IAClF;AAEF,QAAI,SAAS,GAAG;AACd,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,wBAAc,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,UAAS;AAAA,MAAA;AAAA,IAClF,WACS,SAAS,GAAG;AACrB,eAAS,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;AACnC,wBAAc,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,UAAS;AAAA,MAAA;AAAA,IAClF;AAGF,UAAM,OAAO,MAAM,QAAQ,EAAE,GAAG,WAAW,GAAG,MAAS,GAAA,EAAE,YAAY,SAAA,CAAU;AAC/E,cAAS,6BAAM,WAAU;AACzB,aAAQ,6BAAM,UAAS;AAEX,gBAAA,OAAO,WAAW,SAAS,EAAE,GAAG,WAAW,GAAG,OAAO;AAC1D,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,QAAQ,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,GAAG;AAAA,MAC5D,UAAU,EAAE,GAAG,WAAW,GAAG,MAAM;AAAA,MACnC,YAAY,EAAE,GAAG,WAAW,GAAG,YAAY,QAAQ,MAAM;AAAA,IAC3D;AAAA,EAAA;AAEJ;AACO,MAAM,QAAQ,IAAI,YAAY,EAAE,KAAK;AAE5C,MAAM,mBAOI,WAAc;AAAA,EACtB,OAAO,OAAkB,SAA+B;;AAChD,UAAA,EAAE,SAAS,QAAA,IAAY;AACzB,QAAA,EAAE,QAAQ,OAAA,IAAW;AACzB,UAAM,EAAE,UAAU,eAAe,eAAe,UAAU,YAAY,iBAAiB;AACvF,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAGL,QAAA,EAAE,GAAG,WAAW,GAAG,YAAY,QAAQ,UAAU,MAAM;AACrD,UAAA,EAAE,GAAG,EAAA,IAAM;AACX,UAAA,gBAAgB,WAAW,aAAa;AAC9C,UAAM,EAAE,KAAK,MAAM,QAAQ,MAAU,IAAA;AACjC,QAAA,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,QAAQ,IAAI,MAAM;AACxC,QAAA,QAAQ,OAAO,QAAQ,IAAI;AAC7B,eAAS,SAAS;AACV,cAAA;AACR,UAAI,QAAQ,MAAM;AAChB;AACA;AAAA,MAAA,OACK;AACL,iBAAS,QAAQ;AACT,gBAAA;AAAA,MAAA;AAAA,IACV;AAEE,QAAA,QAAQ,UAAU,WAAW,IAAI;AACnC,eAAS,MAAM;AACP,cAAA;AACR,UAAI,QAAQ,OAAO;AACjB;AACA;AAAA,MAAA,OACK;AACL,iBAAS,OAAO;AACR,gBAAA;AAAA,MAAA;AAAA,IACV;AAEE,QAAA,QAAQ,QAAQ,SAAS,IAAI;AAC/B,eAAS,QAAQ;AACT,cAAA;AACR,UAAI,QAAQ,KAAK;AACf;AACA;AAAA,MAAA,OACK;AACL,iBAAS,SAAS;AACV,gBAAA;AAAA,MAAA;AAAA,IACV;AAEE,QAAA,QAAQ,SAAS,UAAU,IAAI;AACjC,eAAS,OAAO;AACR,cAAA;AACR,UAAI,QAAQ,QAAQ;AAClB;AACA;AAAA,MAAA,OACK;AACL,iBAAS,MAAM;AACP,gBAAA;AAAA,MAAA;AAAA,IACV;AAGF,QAAI,QAAQ,KAAK,UAAU,SAAS,QAAQ,KAAK,UAAU,OAAO;AACzD,aAAA;AAAA,IAAA;AAIL,QAAA,MAAM,cAAc,KAAK,GAAG;AACxB,YAAA,MAAM,UAAU,IAAI,IAAI;AACxB,YAAA,KAAK,QAAQ,KAAK,MAAM;AACxB,YAAA,KAAK,WAAW,KAAK,SAAS;AACpC,aAAO,SAAS,MAAM,SAAS,MAAM,MAAM,cAAc,KAAK,GAAG;AACtD,iBAAA;AAAA,MAAA;AAEX,UAAI,QAAQ,MAAM,QAAQ,MAAM,MAAM,cAAc,KAAK,GAAG;AACnD,eAAA;AAAA,MAAA;AAAA,IACT;AAGF,QAAI,SAAS,GAAG;AACd,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,uBAAa,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,WAAU;AAAA,MAAA;AAAA,IAClF,WACS,SAAS,GAAG;AACrB,eAAS,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;AACnC,uBAAa,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,WAAU;AAAA,MAAA;AAAA,IAClF;AAEF,QAAI,SAAS,GAAG;AACd,eAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,wBAAc,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,UAAS;AAAA,MAAA;AAAA,IAClF,WACS,SAAS,GAAG;AACrB,eAAS,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;AACnC,wBAAc,WAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,YAAY,SAAS,CAAC,MAAtD,mBAAyD,UAAS;AAAA,MAAA;AAAA,IAClF;AAEF,UAAM,OAAO,MAAM,QAAQ,EAAE,GAAG,OAAO,GAAG,MAAS,GAAA,EAAE,YAAY,SAAA,CAAU;AAC3E,cAAS,6BAAM,WAAU;AACzB,aAAQ,6BAAM,UAAS;AACX,gBAAA,OAAO,aAAa,SAAS,EAAE,GAAG,OAAO,GAAG,OAAO;AACxD,WAAA;AAAA,MACL,GAAG;AAAA,MACH,UAAU,EAAE,GAAG,OAAO,GAAG,MAAM;AAAA,MAC/B,YAAY,EAAE,GAAG,WAAW,GAAG,YAAY,QAAQ,MAAM;AAAA,IAC3D;AAAA,EAAA;AAEJ;AACO,MAAM,OAAO,IAAI,WAAW,EAAE,KAAK;AAE1C,MAAM,2BAA6C,WAAc;AAAA,EAC/D,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,WAAW;AAAA,IACb;AAAA,EAAA;AAEJ;AAEO,MAAM,eAAe,IAAI,mBAAmB,EAAE,KAAK;AAE1D,MAAM,8BAAiG,WAAc;AAAA,EAArH,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,SAAS,GAAG,SAAa,IAAA;AACjC,UAAM,EAAE,eAAe,UAAU,eAAe,SAAa,IAAA;AAC7D,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAET,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MACD,CAAA;AAAA,IAAA,CACF;AACM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,kBAAkB,IAAI,sBAAsB,EAAE,KAAK;AAEhE,MAAM,8BAAiG,WAAc;AAAA,EAArH,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,SAAS,GAAG,SAAa,IAAA;AACjC,UAAM,EAAE,eAAe,UAAU,eAAe,UAAU,cAAc;AACxE,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAET,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,QAAQ,cAAc,SAAS;AAAA,MAC/B,MAAM,cAAc,OAAO;AAAA,IAC7B;AACA,UAAM,eAAe,EAAE,GAAG,UAAU,GAAG,SAAS,IAAI,QAAQ;AAE5D,UAAM,WAAW;AAAA,MACf,GAAG,IAAI;AAAA,MACP;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf,eAAe;AAAA,QACf,UAAU;AAAA,MACX,CAAA;AAAA,IAAA,CACF;AACM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe;AAAA,MACf,UAAU;AAAA,MACV,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,kBAAkB,IAAI,sBAAsB,EAAE,KAAK;AAEhE,MAAM,6BAAgG,WAAc;AAAA,EAApH,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,SAAS,GAAG,SAAa,IAAA;AACjC,UAAM,EAAE,eAAe,UAAU,eAAe,UAAU,cAAc;AACxE,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAGT,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MACD,CAAA;AAAA,IAAA,CACF;AACM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,iBAAiB,IAAI,qBAAqB,EAAE,KAAK;AAE9D,MAAM,8BAAiG,WAAc;AAAA,EAArH,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,SAAS,GAAG,SAAa,IAAA;AACjC,UAAM,EAAE,eAAe,UAAU,eAAe,SAAa,IAAA;AAC7D,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAET,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,QAAQ,cAAc,SAAS;AAAA,MAC/B,MAAM,cAAc,OAAO;AAAA,IAC7B;AACA,UAAM,eAAe,EAAE,GAAG,UAAU,GAAG,SAAS,IAAI,QAAQ;AAE5D,kBAAc,UAAU;AACxB,kBAAc,QAAQ;AAEtB,UAAM,WAAW;AAAA,MACf,GAAG,IAAI;AAAA,MACP;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MAAA,CACD;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf,eAAe;AAAA,QACf,UAAU;AAAA,MACX,CAAA;AAAA,IAAA,CACF;AACM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe;AAAA,MACf,UAAU;AAAA,MACV,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,kBAAkB,IAAI,sBAAsB,EAAE,KAAK;AAEhE,MAAM,yBAA4F,WAAc;AAAA,EAAhH,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,SAAS,GAAG,SAAa,IAAA;AACjC,UAAM,EAAE,eAAe,UAAU,eAAe,UAAU,cAAc;AACxE,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAGT,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,QACA,aAAa,MAAM;AAAA,MAAA,CACpB;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MACD,CAAA;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,aAAa,IAAI,iBAAiB,EAAE,KAAK;AAEtD,MAAM,yBAA4F,WAAc;AAAA,EAAhH,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AACtD,UAAM,EAAE,SAAS,GAAG,SAAa,IAAA;AACjC,UAAM,EAAE,eAAe,UAAU,eAAe,UAAU,cAAc;AACxE,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAGT,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,MAAA,CACnB;AAAA,MACD,gBAAgB,kBAAkB;AAAA,QAChC,SAAS,MAAM;AAAA,QACf;AAAA,QACA;AAAA,MACD,CAAA;AAAA,IAAA,CACF;AAEM,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,aAAa,IAAI,iBAAiB,EAAE,KAAK;AAEtD,MAAM,uBAA2E,WAAc;AAAA,EAA/F,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,GAAG,UAAA,IAAc;AACzB,UAAM,EAAE,eAAe,UAAU,eAAe,SAAa,IAAA;AAC7D,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAET,UAAM,SAAS,EAAE,GAAG,UAAA,CAAW;AACzB,UAAA,aAAa,kBAAkB,EAAE,SAAS,MAAM,IAAI,eAAe,UAAU;AAC/E,QAAA,MAAM,SAAS,aAAa;AACxB,YAAA,SAAS,YAAY,iBAAiB;AACtC,YAAA,SAAS,YAAY,iBAAiB;AAAA,IAAA;AAEvC,WAAA;AAAA,MACL,GAAG;AAAA,MACH,eAAe,EAAE,SAAS,MAAM;AAAA,IAClC;AAAA,EAAA;AAEJ;AACO,MAAM,WAAW,IAAI,eAAe,EAAE,KAAK;AAElD,MAAM,yBAA0E,WAAc;AAAA,EAA9F,cAAA;AAAA,UAAA,GAAA,SAAA;AACa,SAAA,WAAA;AAAA,EAAA;AAAA,EACX,OAAO,OAAkB,SAA+B;AAChD,UAAA,EAAE,GAAG,OAAA,IAAW;AACtB,UAAM,EAAE,eAAe,UAAU,eAAe,SAAa,IAAA;AAC7D,UAAM,QAAQ,SAAS;AACvB,QAAI,SAAS,MAAM;AACV,aAAA;AAAA,IAAA;AAET,UAAM,WAAW,EAAE,GAAG,OAAA,CAAQ;AACxB,UAAA,aAAa,kBAAkB,EAAE,SAAS,MAAM,IAAI,eAAe,UAAU;AAC/E,QAAA,MAAM,SAAS,aAAa;AACxB,YAAA,SAAS,YAAY,iBAAiB;AACtC,YAAA,SAAS,YAAY,iBAAiB;AAAA,IAAA;AAE9C,QAAI,cAAc;AAClB,QAAI,MAAM,cAAc,SAAS,CAAC,GAAG;AACnC,eAAS,IAAI,GAAG,KAAK,MAAM,SAAS,KAAK;AACvC,YAAI,CAAC,MAAM,cAAc,CAAC,GAAG;AAC3B,wBAAc,EAAE,GAAG,GAAG,SAAS,EAAE;AACjC;AAAA,QAAA;AAAA,MACF;AAAA,IACF;AAEK,WAAA;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,eAAe,gBAAgB,WAAW,YAAY;AAAA,MACtD,eAAe,EAAE,SAAS,MAAM;AAAA,MAChC,UAAU,CAAC,EAAE,eAAeL,gBAAe;AACzC,cAAM,IAAIA,UAAS;AACnB,YAAI,GAAG;AACL,YAAE,SAAS,SAAS;AAAA,YAClB,SAAS;AAAA,YACT,aAAa;AAAA,UAAA,CACd;AAAA,QAAA;AAAA,MACH;AAAA,IAEJ;AAAA,EAAA;AAEJ;AACO,MAAM,aAAa,IAAI,iBAAiB,EAAE,KAAK;AAEtD,MAAM,4BAAgG,WAAc;AAAA,EAClH,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,iBAAiB;AAAA,IACnB;AAAA,EAAA;AAEJ;AACO,MAAM,gBAAgB,IAAI,oBAAoB,EAAE,KAAK;AAE5D,MAAM,yBAA6F,WAAc;AAAA,EAC/G,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,cAAc;AAAA,IAChB;AAAA,EAAA;AAEJ;AACO,MAAM,aAAa,IAAI,iBAAiB,EAAE,KAAK;AAEtD,MAAM,gCAAmD,WAAc;AAAA,EACrE,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,gBAAgB;AAAA,IAClB;AAAA,EAAA;AAEJ;AACO,MAAM,oBAAoB,IAAI,wBAAwB,EAAE,KAAK;AAEpE,MAAM,uBAAqD,WAAc;AAAA,EACvE,OAAO,OAAkB,SAA+B;AAC/C,WAAA;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EAAA;AAEJ;AACO,MAAM,WAAW,IAAI,eAAe,EAAE,KAAK;AAE3C,MAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;ACl2CO,MAAM,aAAa,MAAM;AAC9B,QAAM,CAAC,IAAI,KAAK,IAAI,SAAS,KAAK;AAClC,YAAU,MAAM;AACd,UAAM,IAAI;AAAA,EACZ,GAAG,EAAE;AACD,MAAA,MAAM,OAAO,WAAW,aAAa;AAChC,WAAA,EAAE,QAAQ,SAAS;AAAA,EAAA;AAE5B,SAAO,EAAE,QAAQ,MAAM,UAAU,KAAK;AACxC;AAeO,MAAM,sBAAsB,CAAC,UAAoC,QAAQ,QAAQ;AAChF,QAAA,oBAAoB,OAAO,QAAQ;AACzC,QAAM,WAAW,OAAe;AAEhC,YAAU,MAAM;AACd,sBAAkB,UAAU;AAAA,EAAA,GAC3B,CAAC,QAAQ,CAAC;AAEb,SAAO,IAAI,SAAgB;AAClB,WAAA,aAAa,SAAS,OAAO;AAC3B,aAAA,UAAU,OAAO,WAAW,MAAM;AACvB,wBAAA,QAAQ,GAAG,IAAI;AAAA,OAChC,KAAK;AAAA,EACV;AACF;AAEO,MAAM,UAAU,CAAC,QAAuB,OAAO;AAC9C,QAAA,CAAC,MAAM,OAAO,IAAI,SAAmB,MAAM,WAAW,KAAK,CAAC;AAC5D,QAAA,EAAE,aAAa;AACrB,WAAS,cAAc;AACd,WAAA,WAAW,CAAC,UAA0B;AACtC,WAAA,OAAO,UAAU,KAAK;AACzB,QAAA,CAAC,SAAS,OAAO;AACnB;AAAA,IAAA;AAEF,0BAAsB,MAAM,QAAQ,EAAE,SAAU,CAAA,CAAC;AAAA,EACnD;AACA,YAAU,MAAM;AACP,WAAA,OAAO,UAAU,KAAK;AAAA,EAAA,GAC5B,CAAC,KAAK,CAAC;AACH,SAAA;AACT;"}
package/dist/index.js CHANGED
@@ -4,8 +4,8 @@ import { BaseFunction, BaseFunctionAsync, DEFAULT_HISTORY_LIMIT, FormulaError as
4
4
  import { jsxs, jsx, Fragment } from "preact/compat/jsx-runtime";
5
5
  import React, { createContext, useRef, useContext, useLayoutEffect, useState, useMemo, useCallback, createPortal, memo, useEffect, createRef, useReducer } from "preact/compat";
6
6
  import { Children, Component, Fragment as Fragment2, PureComponent, StrictMode, Suspense, SuspenseList, cloneElement, render as render2, createContext as createContext2, createElement, createFactory, createPortal as createPortal2, createRef as createRef2, findDOMNode, forwardRef, hydrate, isValidElement, lazy, memo as memo2, unmountComponentAtNode, unstable_batchedUpdates, useCallback as useCallback2, useContext as useContext2, useDebugValue, useEffect as useEffect2, useImperativeHandle, useLayoutEffect as useLayoutEffect2, useMemo as useMemo2, useReducer as useReducer2, useRef as useRef2, useState as useState2, version } from "preact/compat";
7
- import { u as useBrowser, s as setEditingAddress, w as write, a as setInputting, b as updateSheet, r as redo, c as undo, d as cut, e as setSearchQuery, f as setEntering, g as copy, h as select, i as arrow, j as escape, k as clear, l as walk, p as paste, m as setEditorHovering, n as setStore, o as setResizingPositionY, q as setResizingPositionX, t as filterRows, v as sortRows, x as removeCols, y as removeRows, z as insertColsRight, A as insertColsLeft, B as insertRowsBelow, C as insertRowsAbove, D as setContextMenuPosition, E as setColumnMenu, F as setRowMenu, G as isXSheetFocused, H as setEditorRect, I as choose, J as drag, K as setDragging, L as submitAutofill, M as setAutofillDraggingTo, N as selectCols, O as useDebounceCallback, P as selectRows, Q as search, R as setSearchCaseSensitive, S as setSearchRegex, T as setSearchRange, U as useBook, V as reducer } from "./hooks-DPIr6WaL.mjs";
8
- import { W } from "./hooks-DPIr6WaL.mjs";
7
+ import { u as useBrowser, s as setEditingAddress, w as write, a as setInputting, b as updateSheet, r as redo, c as undo, d as cut, e as setSearchQuery, f as setEntering, g as copy, h as select, i as arrow, j as escape, k as clear, l as walk, p as paste, m as setEditorHovering, n as setStore, o as setResizingPositionY, q as setResizingPositionX, t as filterRows, v as sortRows, x as removeCols, y as removeRows, z as insertColsRight, A as insertColsLeft, B as insertRowsBelow, C as insertRowsAbove, D as setContextMenuPosition, E as setColumnMenu, F as setRowMenu, G as isXSheetFocused, H as setEditorRect, I as choose, J as drag, K as setDragging, L as submitAutofill, M as setAutofillDraggingTo, N as selectCols, O as useDebounceCallback, P as selectRows, Q as search, R as setSearchCaseSensitive, S as setSearchRegex, T as setSearchRange, U as useBook, V as reducer, W as isMutationAction } from "./hooks-DKULalw8.mjs";
8
+ import { X } from "./hooks-DKULalw8.mjs";
9
9
  const Context = createContext(
10
10
  {}
11
11
  );
@@ -720,6 +720,7 @@ const Editor = ({ mode }) => {
720
720
  const [shiftKey, setShiftKey] = useState(false);
721
721
  const [selectionStart, setSelectionStart] = useState(0);
722
722
  const [isFocused, setIsFocused] = useState(false);
723
+ const composingRef = useRef(false);
723
724
  const {
724
725
  choosing,
725
726
  inputting,
@@ -889,6 +890,9 @@ const Editor = ({ mode }) => {
889
890
  if (!sheet) {
890
891
  return;
891
892
  }
893
+ if (e.nativeEvent.isComposing || composingRef.current) {
894
+ return;
895
+ }
892
896
  if (isKeyDown) {
893
897
  return;
894
898
  }
@@ -1367,6 +1371,17 @@ const Editor = ({ mode }) => {
1367
1371
  onPaste: handlePaste,
1368
1372
  onKeyDown: handleKeyDown,
1369
1373
  onKeyUp: handleKeyUpInternal,
1374
+ onCompositionStart: () => {
1375
+ composingRef.current = true;
1376
+ if (!editing) {
1377
+ dispatch(setEditingAddress(address));
1378
+ dispatch(setInputting(""));
1379
+ }
1380
+ },
1381
+ onCompositionEnd: (e) => {
1382
+ composingRef.current = false;
1383
+ dispatch(setInputting(e.currentTarget.value));
1384
+ },
1370
1385
  onMouseEnter: () => {
1371
1386
  dispatch(setEditorHovering(true));
1372
1387
  },
@@ -4246,7 +4261,14 @@ const Tabular = () => {
4246
4261
  return;
4247
4262
  }
4248
4263
  setVirtualized(virtualize(sheet, tabularRef.current));
4249
- }, [tabularRef.current, sheetReactive, (_a = mainRef.current) == null ? void 0 : _a.clientHeight, (_b = mainRef.current) == null ? void 0 : _b.clientWidth]);
4264
+ }, [
4265
+ tabularRef.current,
4266
+ sheetReactive,
4267
+ (_a = mainRef.current) == null ? void 0 : _a.clientHeight,
4268
+ (_b = mainRef.current) == null ? void 0 : _b.clientWidth,
4269
+ sheetHeight,
4270
+ sheetWidth
4271
+ ]);
4250
4272
  useEffect(() => {
4251
4273
  const el = tabularRef.current;
4252
4274
  if (!el) {
@@ -4266,8 +4288,8 @@ const Tabular = () => {
4266
4288
  {
4267
4289
  className: "gs-tabular",
4268
4290
  style: {
4269
- width: sheetWidth === -1 ? void 0 : sheetWidth,
4270
- height: sheetHeight === -1 ? void 0 : sheetHeight
4291
+ width: sheetWidth === -1 ? void 0 : Math.min(sheetWidth, sheet.totalWidth),
4292
+ height: sheetHeight === -1 ? void 0 : Math.min(sheetHeight, sheet.totalHeight)
4271
4293
  },
4272
4294
  ref: tabularRef,
4273
4295
  onMouseMove: handleMouseMove,
@@ -4443,6 +4465,7 @@ const FormulaBar = ({ ready }) => {
4443
4465
  optionsAll,
4444
4466
  functions: sheet == null ? void 0 : sheet.registry.functions
4445
4467
  });
4468
+ const composingRef = useRef(false);
4446
4469
  const largeInput = largeEditorRef.current;
4447
4470
  const handleInput = useCallback((e) => {
4448
4471
  dispatch(setInputting(e.currentTarget.value));
@@ -4485,6 +4508,9 @@ const FormulaBar = ({ ready }) => {
4485
4508
  );
4486
4509
  const handleKeyDown = useCallback(
4487
4510
  (e) => {
4511
+ if (e.nativeEvent.isComposing || composingRef.current) {
4512
+ return;
4513
+ }
4488
4514
  if (e.ctrlKey || !sheet) {
4489
4515
  return true;
4490
4516
  }
@@ -4716,6 +4742,13 @@ const FormulaBar = ({ ready }) => {
4716
4742
  },
4717
4743
  onKeyDown: handleKeyDown,
4718
4744
  onKeyUp: updateScroll,
4745
+ onCompositionStart: () => {
4746
+ composingRef.current = true;
4747
+ },
4748
+ onCompositionEnd: (e) => {
4749
+ composingRef.current = false;
4750
+ dispatch(setInputting(e.currentTarget.value));
4751
+ },
4719
4752
  onScroll: updateScroll,
4720
4753
  onMouseEnter: (e) => {
4721
4754
  dispatch(setEditorHovering(true));
@@ -4960,7 +4993,7 @@ function GridSheet({
4960
4993
  style,
4961
4994
  book: initialBook
4962
4995
  }) {
4963
- var _a, _b, _c, _d;
4996
+ var _a, _b, _c;
4964
4997
  const { sheetResize, showFormulaBar = true, mode = "light" } = options;
4965
4998
  const rootRef = useRef(null);
4966
4999
  const flashRef = useRef(null);
@@ -5065,12 +5098,9 @@ function GridSheet({
5065
5098
  first = false;
5066
5099
  return;
5067
5100
  }
5068
- if (!options.sheetHeight) {
5069
- setSheetHeight(el.clientHeight);
5070
- }
5071
- if (!options.sheetWidth) {
5072
- setSheetWidth(el.clientWidth);
5073
- }
5101
+ const root = rootRef.current;
5102
+ setSheetHeight(root ? Math.min(el.clientHeight, root.clientHeight) : el.clientHeight);
5103
+ setSheetWidth(root ? Math.min(el.clientWidth, root.clientWidth) : el.clientWidth);
5074
5104
  });
5075
5105
  ro.observe(el);
5076
5106
  return () => ro.disconnect();
@@ -5085,7 +5115,26 @@ function GridSheet({
5085
5115
  setSheetWidth(options.sheetWidth);
5086
5116
  }
5087
5117
  }, [options.sheetWidth]);
5088
- return /* @__PURE__ */ jsx(Context.Provider, { value: { store, dispatch }, children: /* @__PURE__ */ jsxs(
5118
+ const [loading, setLoading] = useState(false);
5119
+ useEffect(() => {
5120
+ if (loading) {
5121
+ setLoading(false);
5122
+ }
5123
+ });
5124
+ const wrappedDispatch = useCallback(
5125
+ (action) => {
5126
+ if (!isMutationAction(action.type)) {
5127
+ dispatch(action);
5128
+ return;
5129
+ }
5130
+ setLoading(true);
5131
+ requestAnimationFrame(() => {
5132
+ dispatch(action);
5133
+ });
5134
+ },
5135
+ [dispatch]
5136
+ );
5137
+ return /* @__PURE__ */ jsx(Context.Provider, { value: { store, dispatch: wrappedDispatch }, children: /* @__PURE__ */ jsxs(
5089
5138
  "div",
5090
5139
  {
5091
5140
  className: `gs-root1 ${registry.ready ? "gs-initialized" : ""}`,
@@ -5107,8 +5156,8 @@ function GridSheet({
5107
5156
  ref: mainRef,
5108
5157
  style: {
5109
5158
  //width: '100%',
5110
- maxWidth: (((_c = store.sheetReactive.current) == null ? void 0 : _c.totalWidth) || 0) + 2,
5111
- maxHeight: (((_d = store.sheetReactive.current) == null ? void 0 : _d.fullHeight) || 0) + 2,
5159
+ maxWidth: "100%",
5160
+ maxHeight: mainRef.current ? window.innerHeight - mainRef.current.getBoundingClientRect().top : (((_c = store.sheetReactive.current) == null ? void 0 : _c.fullHeight) || 0) + 2,
5112
5161
  resize: sheetResize,
5113
5162
  ...style
5114
5163
  },
@@ -5120,7 +5169,8 @@ function GridSheet({
5120
5169
  /* @__PURE__ */ jsx(ColumnMenu, {}),
5121
5170
  /* @__PURE__ */ jsx(RowMenu, {}),
5122
5171
  /* @__PURE__ */ jsx(Resizer, {}),
5123
- /* @__PURE__ */ jsx(Emitter, {})
5172
+ /* @__PURE__ */ jsx(Emitter, {}),
5173
+ loading && /* @__PURE__ */ jsx("div", { className: "gs-loading-overlay", children: /* @__PURE__ */ jsx("div", { className: "gs-loading-spinner" }) })
5124
5174
  ]
5125
5175
  }
5126
5176
  )
@@ -5299,7 +5349,7 @@ export {
5299
5349
  useSheetRef,
5300
5350
  useState2 as useState,
5301
5351
  useStoreRef,
5302
- W as userActions,
5352
+ X as userActions,
5303
5353
  version,
5304
5354
  x2c2 as x2c,
5305
5355
  y2r2 as y2r,