@dou-ui/sheet 0.0.0-stage → 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/dist/cell-types.js +20 -0
  4. package/dist/cell-types.js.map +1 -0
  5. package/dist/code/code-formula-bar.js +6 -0
  6. package/dist/code/code-formula-bar.js.map +1 -0
  7. package/dist/code/code-formula-bar.vue_vue_type_script_setup_true_lang.js +192 -0
  8. package/dist/code/code-formula-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  9. package/dist/code/index.js +12 -0
  10. package/dist/code/index.js.map +1 -0
  11. package/dist/code/language.js +51 -0
  12. package/dist/code/language.js.map +1 -0
  13. package/dist/code/style.d.ts +1 -0
  14. package/dist/code/style.js +2 -0
  15. package/dist/collaboration/anchor.js +143 -0
  16. package/dist/collaboration/anchor.js.map +1 -0
  17. package/dist/collaboration/index.js +770 -0
  18. package/dist/collaboration/index.js.map +1 -0
  19. package/dist/collaboration/peers.js +87 -0
  20. package/dist/collaboration/peers.js.map +1 -0
  21. package/dist/collaboration/shared.js +450 -0
  22. package/dist/collaboration/shared.js.map +1 -0
  23. package/dist/components/cell-panel.js +6 -0
  24. package/dist/components/cell-panel.js.map +1 -0
  25. package/dist/components/cell-panel.vue_vue_type_script_setup_true_lang.js +70 -0
  26. package/dist/components/cell-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  27. package/dist/components/cell-renders.js +40 -0
  28. package/dist/components/cell-renders.js.map +1 -0
  29. package/dist/components/date-panel.js +6 -0
  30. package/dist/components/date-panel.js.map +1 -0
  31. package/dist/components/date-panel.vue_vue_type_script_setup_true_lang.js +48 -0
  32. package/dist/components/date-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  33. package/dist/components/filter-panel.js +6 -0
  34. package/dist/components/filter-panel.js.map +1 -0
  35. package/dist/components/filter-panel.vue_vue_type_script_setup_true_lang.js +259 -0
  36. package/dist/components/filter-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  37. package/dist/components/format-dialog.js +6 -0
  38. package/dist/components/format-dialog.js.map +1 -0
  39. package/dist/components/format-dialog.vue_vue_type_script_setup_true_lang.js +432 -0
  40. package/dist/components/format-dialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  41. package/dist/components/format-list.js +6 -0
  42. package/dist/components/format-list.js.map +1 -0
  43. package/dist/components/format-list.vue_vue_type_script_setup_true_lang.js +187 -0
  44. package/dist/components/format-list.vue_vue_type_script_setup_true_lang.js.map +1 -0
  45. package/dist/components/format-presets.js +97 -0
  46. package/dist/components/format-presets.js.map +1 -0
  47. package/dist/components/option-panel.js +6 -0
  48. package/dist/components/option-panel.js.map +1 -0
  49. package/dist/components/option-panel.vue_vue_type_script_setup_true_lang.js +117 -0
  50. package/dist/components/option-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  51. package/dist/components/sheet-comment.js +6 -0
  52. package/dist/components/sheet-comment.js.map +1 -0
  53. package/dist/components/sheet-comment.vue_vue_type_script_setup_true_lang.js +104 -0
  54. package/dist/components/sheet-comment.vue_vue_type_script_setup_true_lang.js.map +1 -0
  55. package/dist/components/sheet-formula-bar.js +6 -0
  56. package/dist/components/sheet-formula-bar.js.map +1 -0
  57. package/dist/components/sheet-formula-bar.vue_vue_type_script_setup_true_lang.js +124 -0
  58. package/dist/components/sheet-formula-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  59. package/dist/components/sheet-link.js +6 -0
  60. package/dist/components/sheet-link.js.map +1 -0
  61. package/dist/components/sheet-link.vue_vue_type_script_setup_true_lang.js +249 -0
  62. package/dist/components/sheet-link.vue_vue_type_script_setup_true_lang.js.map +1 -0
  63. package/dist/components/sheet-menu.js +6 -0
  64. package/dist/components/sheet-menu.js.map +1 -0
  65. package/dist/components/sheet-menu.vue_vue_type_script_setup_true_lang.js +115 -0
  66. package/dist/components/sheet-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  67. package/dist/components/sheet-name-box.js +6 -0
  68. package/dist/components/sheet-name-box.js.map +1 -0
  69. package/dist/components/sheet-name-box.vue_vue_type_script_setup_true_lang.js +91 -0
  70. package/dist/components/sheet-name-box.vue_vue_type_script_setup_true_lang.js.map +1 -0
  71. package/dist/components/sheet-note.js +6 -0
  72. package/dist/components/sheet-note.js.map +1 -0
  73. package/dist/components/sheet-note.vue_vue_type_script_setup_true_lang.js +146 -0
  74. package/dist/components/sheet-note.vue_vue_type_script_setup_true_lang.js.map +1 -0
  75. package/dist/components/sheet-outline.js +6 -0
  76. package/dist/components/sheet-outline.js.map +1 -0
  77. package/dist/components/sheet-outline.vue_vue_type_script_setup_true_lang.js +237 -0
  78. package/dist/components/sheet-outline.vue_vue_type_script_setup_true_lang.js.map +1 -0
  79. package/dist/components/sheet-tabs.js +6 -0
  80. package/dist/components/sheet-tabs.js.map +1 -0
  81. package/dist/components/sheet-tabs.vue_vue_type_script_setup_true_lang.js +487 -0
  82. package/dist/components/sheet-tabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
  83. package/dist/components/sheet-toolbar.js +6 -0
  84. package/dist/components/sheet-toolbar.js.map +1 -0
  85. package/dist/components/sheet-toolbar.vue_vue_type_script_setup_true_lang.js +1562 -0
  86. package/dist/components/sheet-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  87. package/dist/components/validation-dialog.js +6 -0
  88. package/dist/components/validation-dialog.js.map +1 -0
  89. package/dist/components/validation-dialog.vue_vue_type_script_setup_true_lang.js +370 -0
  90. package/dist/components/validation-dialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
  91. package/dist/context.js +12 -0
  92. package/dist/context.js.map +1 -0
  93. package/dist/core/address.js +256 -0
  94. package/dist/core/address.js.map +1 -0
  95. package/dist/core/axis.js +72 -0
  96. package/dist/core/axis.js.map +1 -0
  97. package/dist/core/cell-type.js +30 -0
  98. package/dist/core/cell-type.js.map +1 -0
  99. package/dist/core/clipboard.js +141 -0
  100. package/dist/core/clipboard.js.map +1 -0
  101. package/dist/core/commands.js +63 -0
  102. package/dist/core/commands.js.map +1 -0
  103. package/dist/core/comments.js +74 -0
  104. package/dist/core/comments.js.map +1 -0
  105. package/dist/core/conditional.js +362 -0
  106. package/dist/core/conditional.js.map +1 -0
  107. package/dist/core/csv.js +191 -0
  108. package/dist/core/csv.js.map +1 -0
  109. package/dist/core/data.js +118 -0
  110. package/dist/core/data.js.map +1 -0
  111. package/dist/core/document.js +187 -0
  112. package/dist/core/document.js.map +1 -0
  113. package/dist/core/extension.js +60 -0
  114. package/dist/core/extension.js.map +1 -0
  115. package/dist/core/file.js +336 -0
  116. package/dist/core/file.js.map +1 -0
  117. package/dist/core/fill.js +153 -0
  118. package/dist/core/fill.js.map +1 -0
  119. package/dist/core/find.js +42 -0
  120. package/dist/core/find.js.map +1 -0
  121. package/dist/core/format.js +404 -0
  122. package/dist/core/format.js.map +1 -0
  123. package/dist/core/group.js +134 -0
  124. package/dist/core/group.js.map +1 -0
  125. package/dist/core/history.js +68 -0
  126. package/dist/core/history.js.map +1 -0
  127. package/dist/core/index.js +17 -0
  128. package/dist/core/link.js +34 -0
  129. package/dist/core/link.js.map +1 -0
  130. package/dist/core/merge.js +105 -0
  131. package/dist/core/merge.js.map +1 -0
  132. package/dist/core/model.js +48 -0
  133. package/dist/core/model.js.map +1 -0
  134. package/dist/core/nav.js +44 -0
  135. package/dist/core/nav.js.map +1 -0
  136. package/dist/core/paint.js +106 -0
  137. package/dist/core/paint.js.map +1 -0
  138. package/dist/core/plain-cell-types.js +54 -0
  139. package/dist/core/plain-cell-types.js.map +1 -0
  140. package/dist/core/protect.js +246 -0
  141. package/dist/core/protect.js.map +1 -0
  142. package/dist/core/selection.js +37 -0
  143. package/dist/core/selection.js.map +1 -0
  144. package/dist/core/transaction.js +1582 -0
  145. package/dist/core/transaction.js.map +1 -0
  146. package/dist/core/validation.js +135 -0
  147. package/dist/core/validation.js.map +1 -0
  148. package/dist/core/versions.js +161 -0
  149. package/dist/core/versions.js.map +1 -0
  150. package/dist/export/color.js +36 -0
  151. package/dist/export/color.js.map +1 -0
  152. package/dist/export/draw.js +316 -0
  153. package/dist/export/draw.js.map +1 -0
  154. package/dist/export/index.js +390 -0
  155. package/dist/export/index.js.map +1 -0
  156. package/dist/formula/edit.js +210 -0
  157. package/dist/formula/edit.js.map +1 -0
  158. package/dist/formula/engine.js +526 -0
  159. package/dist/formula/engine.js.map +1 -0
  160. package/dist/formula/error.js +39 -0
  161. package/dist/formula/error.js.map +1 -0
  162. package/dist/formula/functions.js +1493 -0
  163. package/dist/formula/functions.js.map +1 -0
  164. package/dist/formula/help.js +408 -0
  165. package/dist/formula/help.js.map +1 -0
  166. package/dist/formula/index.js +7 -0
  167. package/dist/formula/parse.js +369 -0
  168. package/dist/formula/parse.js.map +1 -0
  169. package/dist/formula/values.js +123 -0
  170. package/dist/formula/values.js.map +1 -0
  171. package/dist/formulas.js +30 -0
  172. package/dist/formulas.js.map +1 -0
  173. package/dist/index.js +39 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/locale.js +1312 -0
  176. package/dist/locale.js.map +1 -0
  177. package/dist/sheet.js +6 -0
  178. package/dist/sheet.js.map +1 -0
  179. package/dist/sheet.vue_vue_type_script_setup_true_lang.js +7166 -0
  180. package/dist/sheet.vue_vue_type_script_setup_true_lang.js.map +1 -0
  181. package/dist/style.css +1 -0
  182. package/dist/style.d.ts +1 -0
  183. package/dist/style.js +17 -0
  184. package/dist/types/cell-types.d.ts +2 -0
  185. package/dist/types/code/code-formula-bar.vue.d.ts +3 -0
  186. package/dist/types/code/index.d.ts +12 -0
  187. package/dist/types/code/language.d.ts +13 -0
  188. package/dist/types/collaboration/anchor.d.ts +65 -0
  189. package/dist/types/collaboration/index.d.ts +59 -0
  190. package/dist/types/collaboration/peers.d.ts +21 -0
  191. package/dist/types/collaboration/shared.d.ts +75 -0
  192. package/dist/types/components/cell-panel.vue.d.ts +20 -0
  193. package/dist/types/components/cell-renders.d.ts +9 -0
  194. package/dist/types/components/date-panel.vue.d.ts +9 -0
  195. package/dist/types/components/filter-panel.vue.d.ts +21 -0
  196. package/dist/types/components/format-dialog.vue.d.ts +24 -0
  197. package/dist/types/components/format-list.vue.d.ts +25 -0
  198. package/dist/types/components/format-presets.d.ts +30 -0
  199. package/dist/types/components/option-panel.vue.d.ts +13 -0
  200. package/dist/types/components/sheet-comment.vue.d.ts +29 -0
  201. package/dist/types/components/sheet-formula-bar.vue.d.ts +3 -0
  202. package/dist/types/components/sheet-link.vue.d.ts +32 -0
  203. package/dist/types/components/sheet-menu.vue.d.ts +20 -0
  204. package/dist/types/components/sheet-name-box.vue.d.ts +3 -0
  205. package/dist/types/components/sheet-note.vue.d.ts +22 -0
  206. package/dist/types/components/sheet-outline.vue.d.ts +36 -0
  207. package/dist/types/components/sheet-tabs.vue.d.ts +9 -0
  208. package/dist/types/components/sheet-toolbar.vue.d.ts +11 -0
  209. package/dist/types/components/validation-dialog.vue.d.ts +25 -0
  210. package/dist/types/context.d.ts +189 -0
  211. package/dist/types/core/address.d.ts +109 -0
  212. package/dist/types/core/axis.d.ts +23 -0
  213. package/dist/types/core/cell-type.d.ts +157 -0
  214. package/dist/types/core/clipboard.d.ts +48 -0
  215. package/dist/types/core/commands.d.ts +76 -0
  216. package/dist/types/core/comments.d.ts +22 -0
  217. package/dist/types/core/conditional.d.ts +114 -0
  218. package/dist/types/core/csv.d.ts +93 -0
  219. package/dist/types/core/data.d.ts +26 -0
  220. package/dist/types/core/document.d.ts +49 -0
  221. package/dist/types/core/extension.d.ts +177 -0
  222. package/dist/types/core/file.d.ts +301 -0
  223. package/dist/types/core/fill.d.ts +23 -0
  224. package/dist/types/core/find.d.ts +39 -0
  225. package/dist/types/core/format.d.ts +47 -0
  226. package/dist/types/core/group.d.ts +76 -0
  227. package/dist/types/core/history.d.ts +27 -0
  228. package/dist/types/core/index.d.ts +33 -0
  229. package/dist/types/core/link.d.ts +14 -0
  230. package/dist/types/core/merge.d.ts +26 -0
  231. package/dist/types/core/model.d.ts +363 -0
  232. package/dist/types/core/nav.d.ts +15 -0
  233. package/dist/types/core/paint.d.ts +19 -0
  234. package/dist/types/core/plain-cell-types.d.ts +6 -0
  235. package/dist/types/core/protect.d.ts +34 -0
  236. package/dist/types/core/selection.d.ts +25 -0
  237. package/dist/types/core/transaction.d.ts +470 -0
  238. package/dist/types/core/validation.d.ts +55 -0
  239. package/dist/types/core/versions.d.ts +38 -0
  240. package/dist/types/export/color.d.ts +7 -0
  241. package/dist/types/export/draw.d.ts +98 -0
  242. package/dist/types/export/index.d.ts +47 -0
  243. package/dist/types/formula/edit.d.ts +62 -0
  244. package/dist/types/formula/engine.d.ts +99 -0
  245. package/dist/types/formula/error.d.ts +30 -0
  246. package/dist/types/formula/functions.d.ts +62 -0
  247. package/dist/types/formula/help.d.ts +12 -0
  248. package/dist/types/formula/index.d.ts +13 -0
  249. package/dist/types/formula/parse.d.ts +92 -0
  250. package/dist/types/formula/values.d.ts +65 -0
  251. package/dist/types/formulas.d.ts +32 -0
  252. package/dist/types/index.d.ts +225 -0
  253. package/dist/types/locale.d.ts +531 -0
  254. package/dist/types/sheet.vue.d.ts +60 -0
  255. package/dist/types/types.d.ts +498 -0
  256. package/dist/types/use-comments.d.ts +47 -0
  257. package/dist/types/use-messages.d.ts +7 -0
  258. package/dist/use-comments.js +130 -0
  259. package/dist/use-comments.js.map +1 -0
  260. package/dist/use-messages.js +29 -0
  261. package/dist/use-messages.js.map +1 -0
  262. package/package.json +93 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","names":[],"sources":["../../src/formula/functions.ts"],"sourcesContent":["import { formatValue, isDateFormat, parseInput } from '../core/format'\nimport { DIV0, isSheetError, NA, NUM, SheetError, VALUE } from './error'\nimport {\n compareValues,\n dateParts,\n dateText,\n isDateText,\n isRange,\n isTimeText,\n serialOf,\n timeOrDays,\n timeText,\n toBoolean,\n toNumber,\n toText,\n type SheetArg,\n type SheetRangeArg,\n type SheetResult,\n} from './values'\n\n/** What every function call is given besides its arguments. */\nexport interface SheetFunctionContext {\n /** When the calculation started; `TODAY()` and `NOW()` read it. */\n now: Date\n /** The language dates are written in, for `TEXT`. */\n locale?: string\n /**\n * Makes the cell whose formula is running a link to `target`, as\n * `HYPERLINK` does: an address as a cell's `link` takes.\n */\n link?: (target: string) => void\n}\n\ninterface FunctionBase {\n /** The name formulas call it by; matched in any case. */\n name: string\n /** The fewest and most arguments it takes; `#VALUE!` otherwise. */\n minArgs?: number\n maxArgs?: number\n /** Gives a new result on every recalculation, like `TODAY()`. */\n volatile?: boolean\n /**\n * The arguments' names, shown while typing a call: `[name]` may be left\n * out and `…` repeats the one before, e.g. `['金额', '[税率]']`.\n */\n args?: string[]\n /** What it does, in a few words, shown in the list of functions. */\n description?: string\n}\n\n/**\n * A formula function. `run` gets each argument as a value, or as a range\n * for a reference to more than one cell (see `numbersOf`, `toNumber` and\n * the other helpers), and returns the result, or a range as `CHOOSE` can.\n * With `lazy`, it gets each argument as a function to call when needed, as\n * `IF` does to work out only the branch it takes.\n */\nexport type SheetFunction =\n | (FunctionBase & {\n lazy?: false\n run: (args: SheetArg[], context: SheetFunctionContext) => SheetArg\n })\n | (FunctionBase & {\n lazy: true\n run: (args: (() => SheetArg)[], context: SheetFunctionContext) => SheetArg\n })\n\n/** Declares a formula function; only gives it a type. */\nexport function defineSheetFunction<T extends SheetFunction>(definition: T): T {\n return definition\n}\n\n// Helpers --------------------------------------------------------------------------------\n\n/** A single value from an argument: a range of one cell is that cell, a bigger one `#VALUE!`. */\nexport function scalarOf(arg: SheetArg): SheetResult {\n if (!isRange(arg)) return arg\n return arg.rows === 1 && arg.cols === 1 ? arg.at(0, 0) : VALUE\n}\n\n/** A date or time written in a cell, as its day number; `null` for anything else. */\nconst serialIn = (value: SheetResult) =>\n typeof value === 'string' && (isDateText(value) || isTimeText(value)) ? serialOf(value) : null\n\n/**\n * The numbers in some arguments, the way sums count them: in ranges only\n * numbers, dates and times count (other text, `TRUE` / `FALSE` and empty cells are skipped);\n * given directly, text that reads as a number and `TRUE` / `FALSE` count\n * too. The first error found is returned instead.\n */\nexport function numbersOf(args: SheetArg[]): number[] | SheetError {\n const out: number[] = []\n for (const arg of args) {\n if (isRange(arg)) {\n for (const [, , value] of arg.entries()) {\n if (isSheetError(value)) return value\n if (typeof value === 'number') out.push(value)\n else {\n const serial = serialIn(value)\n if (serial != null) out.push(serial)\n }\n }\n } else if (arg != null) {\n const n = toNumber(arg)\n if (isSheetError(n)) return n\n out.push(n)\n }\n }\n return out\n}\n\n/** Every value in some arguments, ranges cell by cell (their empty cells left out). */\nfunction* valuesOf(args: SheetArg[]): Generator<SheetResult> {\n for (const arg of args) {\n if (isRange(arg)) for (const [, , value] of arg.entries()) yield value\n else yield arg\n }\n}\n\n/**\n * Whether all the numbers `numbersOf` takes from some arguments are dates,\n * or all times, so `SUM` of times is a time and `MAX` of dates a date.\n */\nfunction kindOf(args: SheetArg[]): 'date' | 'time' | null {\n let kind: 'date' | 'time' | null = null\n for (const value of valuesOf(args)) {\n if (value == null || isSheetError(value)) continue\n const k = isDateText(value) ? 'date' : isTimeText(value) ? 'time' : null\n // other text is skipped in ranges; a number makes it numbers\n if (!k && typeof value === 'string') continue\n if (!k || (kind && kind !== k)) return null\n kind = k\n }\n return kind\n}\n\nconst num = (arg: SheetArg) => toNumber(scalarOf(arg))\nconst text = (arg: SheetArg) => toText(scalarOf(arg))\nconst bool = (arg: SheetArg) => toBoolean(scalarOf(arg))\nconst finite = (n: number) => (Number.isFinite(n) ? n : NUM)\n\n/** Rounds half away from zero, in decimal, so 1.005 rounds to 1.01. */\nfunction roundTo(n: number, digits: number, mode: 'round' | 'up' | 'down' = 'round') {\n const d = Math.trunc(digits)\n const scaled = Math.abs(n) * 10 ** d\n const fixed = Number(scaled.toPrecision(15))\n const r =\n mode === 'round' ? Math.round(fixed) : mode === 'up' ? Math.ceil(fixed) : Math.floor(fixed)\n return Math.sign(n) * Number((r / 10 ** d).toPrecision(15))\n}\n\nconst firstError = (...values: unknown[]) => values.find(isSheetError) as SheetError | undefined\n\n/** Whether a lazy argument was given: not left out, nor left empty between commas. */\nconst given = (arg: (() => SheetArg) | undefined) => arg != null && arg() != null\n\n/** A branch's value as `IF` and `CHOOSE` give it: a range stays one, for `SUM(IF(…, A1:A3, B1:B3))`. */\nconst passOn = (arg: SheetArg): SheetArg => (isRange(arg) ? arg : (arg ?? 0))\n\nfunction math(\n name: string,\n run: (...n: number[]) => SheetResult,\n minArgs: number,\n maxArgs = minArgs,\n) {\n return defineSheetFunction({\n name,\n minArgs,\n maxArgs,\n run: (args) => {\n const ns = args.map((arg) => (arg == null ? 0 : num(arg)))\n const error = firstError(...ns)\n if (error) return error\n const out = run(...(ns as number[]))\n return typeof out === 'number' ? finite(out) : out\n },\n })\n}\n\nfunction textFn(\n name: string,\n run: (...s: string[]) => SheetResult,\n minArgs = 1,\n maxArgs = minArgs,\n) {\n return defineSheetFunction({\n name,\n minArgs,\n maxArgs,\n run: (args) => {\n const ss = args.map(text)\n const error = firstError(...ss)\n return error ?? run(...(ss as string[]))\n },\n })\n}\n\n/** Wildcards `*` and `?` (`~` before one keeps it) as a regular expression matching whole text. */\nfunction wildcard(pattern: string) {\n let source = ''\n for (let i = 0; i < pattern.length; i++) {\n const c = pattern[i]!\n if (c === '~' && i + 1 < pattern.length)\n source += pattern[++i]!.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n else if (c === '*') source += '.*'\n else if (c === '?') source += '.'\n else source += c.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n }\n return new RegExp(`^${source}$`, 'is')\n}\n\n/**\n * A condition as `SUMIF` and `COUNTIF` take it: a value to equal, or text\n * such as `\">5\"`, `\"<>完成\"`, `\"上海*\"` (with `*` and `?`), `\"\"` for empty.\n */\nexport function criteriaOf(criteria: SheetResult): (value: SheetResult) => boolean {\n if (typeof criteria !== 'string')\n return (value) => value != null && compareValues(value, criteria) === 0\n const op = /^(<>|<=|>=|=|<|>)?(.*)$/s.exec(criteria)!\n const how = op[1] ?? '='\n const rest = op[2]!\n const asNumber =\n rest.trim() === ''\n ? null\n : (serialOf(rest.trim()) ??\n (() => {\n const n = toNumber(rest)\n return typeof n === 'number' ? n : null\n })())\n if (asNumber != null) {\n const test = (n: number) =>\n how === '='\n ? n === asNumber\n : how === '<>'\n ? n !== asNumber\n : how === '<'\n ? n < asNumber\n : how === '>'\n ? n > asNumber\n : how === '<='\n ? n <= asNumber\n : n >= asNumber\n return (value) => {\n if (typeof value === 'number') return test(value)\n if (typeof value === 'string') {\n const serial = serialOf(value)\n if (serial != null) return test(serial)\n }\n return how === '<>'\n }\n }\n if (how === '=' || how === '<>') {\n const match =\n rest === ''\n ? (value: SheetResult) => value == null || value === ''\n : /[*?~]/.test(rest)\n ? (\n (re) => (value: SheetResult) =>\n typeof value === 'string' && re.test(value)\n )(wildcard(rest))\n : (value: SheetResult) =>\n typeof value === 'string' && value.toLowerCase() === rest.toLowerCase()\n return how === '=' ? match : (value) => !match(value)\n }\n return (value) => {\n if (typeof value !== 'string') return false\n const c = compareValues(value, rest)\n return how === '<' ? c < 0 : how === '>' ? c > 0 : how === '<=' ? c <= 0 : c >= 0\n }\n}\n\n/** The ranges and conditions of `SUMIFS`-like functions, as the positions that meet all of them. */\nfunction matching(ranges: SheetRangeArg[], criteria: SheetResult[]) {\n const first = ranges[0]!\n for (const range of ranges)\n if (range.rows !== first.rows || range.cols !== first.cols) return VALUE\n const tests = criteria.map(criteriaOf)\n const out: [number, number][] = []\n // blank cells meet some conditions too (`\"\"`, `\"<>x\"`), so every cell is checked\n for (let r = 0; r < first.rows; r++)\n for (let c = 0; c < first.cols; c++)\n if (tests.every((test, i) => test(ranges[i]!.at(r, c)))) out.push([r, c])\n return out\n}\n\n/** For `SUMIF` and the like on sparse data: only cells with data, unless the condition takes empty ones. */\nfunction matchingOne(range: SheetRangeArg, criteria: SheetResult) {\n const test = criteriaOf(criteria)\n if (test(null)) return matching([range], [criteria])\n const out: [number, number][] = []\n for (const [r, c, value] of range.entries()) if (test(value)) out.push([r, c])\n return out\n}\n\nfunction lookupIndex(\n value: SheetResult,\n length: number,\n at: (i: number) => SheetResult,\n mode: 'exact' | 'below' | 'above' | 'wildcard',\n reverse = false,\n) {\n if (mode === 'wildcard' && typeof value === 'string') {\n const re = wildcard(value)\n for (let k = 0; k < length; k++) {\n const i = reverse ? length - 1 - k : k\n const v = at(i)\n if (typeof v === 'string' && re.test(v)) return i\n }\n return -1\n }\n let best = -1\n let bestValue: SheetResult = null\n for (let k = 0; k < length; k++) {\n const i = reverse ? length - 1 - k : k\n const v = at(i)\n if (v == null || isSheetError(v)) continue\n const c = compareValues(v, value)\n if (c === 0 && (typeof v === typeof value || (v === '' && value == null))) return i\n if (\n mode === 'below' &&\n c < 0 &&\n typeof v === typeof value &&\n (best === -1 || compareValues(v, bestValue) > 0)\n ) {\n best = i\n bestValue = v\n }\n if (\n mode === 'above' &&\n c > 0 &&\n typeof v === typeof value &&\n (best === -1 || compareValues(v, bestValue) < 0)\n ) {\n best = i\n bestValue = v\n }\n }\n return best\n}\n\n/** The last position in sorted data whose value isn't above `value`, as approximate lookups find it. */\nfunction sortedIndex(value: SheetResult, length: number, at: (i: number) => SheetResult) {\n let lo = 0\n let hi = length - 1\n let found = -1\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n const v = at(mid)\n if (v == null) {\n hi = mid - 1\n continue\n }\n if (compareValues(v, value) <= 0) {\n found = mid\n lo = mid + 1\n } else hi = mid - 1\n }\n return found\n}\n\n/** `XMATCH` in sorted data, halving it each step: exact, or the nearest below or above. */\nfunction halvingIndex(\n value: SheetResult,\n length: number,\n at: (i: number) => SheetResult,\n how: 'exact' | 'below' | 'above',\n descending: boolean,\n) {\n const get = (i: number) => at(descending ? length - 1 - i : i)\n const comparable = (v: SheetResult) => v != null && !isSheetError(v) && typeof v === typeof value\n // the last value not above the one looked for\n let lo = 0\n let hi = length - 1\n let last = -1\n while (lo <= hi) {\n const mid = (lo + hi) >> 1\n const v = get(mid)\n if (comparable(v) && compareValues(v, value) <= 0) {\n last = mid\n lo = mid + 1\n } else hi = mid - 1\n }\n let i = -1\n if (last !== -1 && compareValues(get(last), value) === 0) i = last\n else if (how === 'below') i = last\n else if (how === 'above' && last + 1 < length) i = last + 1\n return i === -1 ? -1 : descending ? length - 1 - i : i\n}\n\nconst asRange = (arg: SheetArg): SheetRangeArg =>\n isRange(arg)\n ? arg\n : {\n kind: 'range',\n rows: 1,\n cols: 1,\n at: () => arg,\n entries: () => (arg == null ? [] : [[0, 0, arg]]),\n }\n\nconst pad = (n: number) => String(n).padStart(2, '0')\nfunction localDay(now: Date) {\n return `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`\n}\n\nfunction daysInMonth(year: number, month: number) {\n return new Date(Date.UTC(year, month, 0)).getUTCDate()\n}\n\n// Helpers of the second batch ------------------------------------------------------------\n\n/** Keeps a result to 15 significant digits, so `CEILING(2.3, 0.1)` is 2.3, not 2.3000000000000003. */\nconst tidy = (n: number) => (Number.isFinite(n) ? Number(n.toPrecision(15)) : NUM)\n\n/** Numbers from ranges and values for the statistics, at least `least` of them, else `few`. */\nfunction statsOf(args: SheetArg[], least: number, few: SheetError): number[] | SheetError {\n const ns = numbersOf(args)\n if (isSheetError(ns)) return ns\n return ns.length < least ? few : ns\n}\n\nconst mean = (ns: number[]) => sum(ns) / ns.length\n\n/** The variance of numbers: of a sample (divided by n - 1), or of all of them. */\nfunction variance(ns: number[], sample: boolean) {\n const m = mean(ns)\n let squares = 0\n for (const n of ns) squares += (n - m) ** 2\n return squares / (ns.length - (sample ? 1 : 0))\n}\n\n/** Sorted from smallest, without changing the list given. */\nconst ascending = (ns: number[]) => {\n const out = ns.slice()\n // oxlint-disable-next-line unicorn/no-array-sort -- sorts its own copy\n out.sort((a, b) => a - b)\n return out\n}\n\n/** The value `k` (0–1) of the way through sorted numbers, between the two nearest. */\nfunction percentile(sorted: number[], k: number) {\n const at = (sorted.length - 1) * k\n const lo = Math.floor(at)\n const hi = Math.min(lo + 1, sorted.length - 1)\n return sorted[lo]! + (sorted[hi]! - sorted[lo]!) * (at - lo)\n}\n\n/** A day number from a date argument; `null` when it isn't one. */\nfunction serialArg(arg: SheetArg): number | SheetError | null {\n const v = scalarOf(arg)\n if (isSheetError(v)) return v\n if (typeof v === 'number') return v\n if (typeof v === 'string') return serialOf(v.trim())\n return v == null ? 0 : null\n}\n\n/** A day number as a date, without its time. */\nconst dayText = (serial: number) => dateText(Math.floor(serial))\n\n/** The day number of a year, month and day, months past 12 or below 1 rolling over. */\nconst serialFor = (year: number, month: number, day: number) =>\n (Date.UTC(year, month - 1, day) - Date.UTC(1899, 11, 30)) / 86_400_000\n\n/** 0 for Sunday to 6 for Saturday. */\nconst weekdayOf = (serial: number) => (((Math.floor(serial) + 6) % 7) + 7) % 7\n\n/** The holidays of `NETWORKDAYS` and `WORKDAY`, as day numbers. */\nfunction holidaysOf(arg: SheetArg | undefined): Set<number> | SheetError {\n const out = new Set<number>()\n if (arg == null) return out\n for (const value of valuesOf([arg])) {\n if (isSheetError(value)) return value\n if (value == null || value === '') continue\n const serial = typeof value === 'number' ? value : serialOf(String(value).trim())\n if (serial == null) return VALUE\n out.add(Math.floor(serial))\n }\n return out\n}\n\nconst isWeekday = (serial: number) => {\n const day = weekdayOf(serial)\n return day !== 0 && day !== 6\n}\n\n/** The last day number dates can have, 9999-12-31. */\nconst LAST_DAY = 2_958_465\n\n/** Monday to Friday from `from` to `to`, both counted, by whole weeks: any seven days hold five. */\nfunction weekdaysBetween(from: number, to: number) {\n const weeks = Math.floor((to - from + 1) / 7)\n let count = weeks * 5\n for (let day = from + weeks * 7; day <= to; day++) if (isWeekday(day)) count++\n return count\n}\n\n/** The day `n` weekdays after `day` (before it when negative), by whole weeks. */\nfunction weekdaysOn(day: number, n: number) {\n const step = n < 0 ? -1 : 1\n let left = Math.abs(n)\n const weeks = left > 0 ? Math.floor((left - 1) / 5) : 0\n day += step * weeks * 7\n left -= weeks * 5\n while (left > 0) {\n day += step\n if (isWeekday(day)) left--\n }\n return day\n}\n\n/** Holidays on weekdays from `from` to `to`, both counted. */\nfunction holidaysBetween(holidays: Set<number>, from: number, to: number) {\n let count = 0\n for (const day of holidays) if (day >= from && day <= to && isWeekday(day)) count++\n return count\n}\n\n/** The day `WEEKNUM`'s weeks start on for each type, 0 for Sunday. */\nconst WEEK_STARTS: Record<number, number> = {\n 1: 0,\n 2: 1,\n 11: 1,\n 12: 2,\n 13: 3,\n 14: 4,\n 15: 5,\n 16: 6,\n 17: 0,\n}\n\n/** The ISO week number: weeks start on Monday, the first holds the year's first Thursday. */\nfunction isoWeek(serial: number) {\n const day = Math.floor(serial)\n const thursday = day - ((weekdayOf(day) + 6) % 7) + 3\n const year = new Date(thursday * 86_400_000 + Date.UTC(1899, 11, 30)).getUTCFullYear()\n return Math.floor((thursday - serialFor(year, 1, 1)) / 7) + 1\n}\n\n/** Where a delimiter is in text, every time, for `TEXTBEFORE` and `TEXTAFTER`. */\nfunction positionsOf(t: string, delimiter: string, ignoreCase: boolean) {\n const hay = ignoreCase ? t.toLowerCase() : t\n const needle = ignoreCase ? delimiter.toLowerCase() : delimiter\n const out: number[] = []\n // nothing is found before every character and at the end\n if (!needle) {\n for (let at = 0; at <= t.length; at++) out.push(at)\n return out\n }\n for (let at = hay.indexOf(needle); at !== -1; at = hay.indexOf(needle, at + needle.length))\n out.push(at)\n return out\n}\n\n/** The payment of a loan or saving each period, as `PMT` works it out. */\nfunction payment(rate: number, nper: number, pv: number, fv: number, type: number) {\n if (rate === 0) return -(pv + fv) / nper\n const grow = (1 + rate) ** nper\n return (-(pv * grow + fv) * rate) / ((1 + rate * type) * (grow - 1))\n}\n\n// The functions ---------------------------------------------------------------------------\n\n/** One of the numbers taken from some arguments, written as they are: a date or a time when they all are. */\nfunction asInputs(args: SheetArg[], n: number): SheetResult {\n const kind = kindOf(args)\n return kind === 'date' ? dateText(n) : kind === 'time' ? timeText(n) : n\n}\n\nconst sum = (ns: number[]) => ns.reduce((a, b) => a + b, 0)\n\nexport const builtinFunctions: SheetFunction[] = [\n // math\n defineSheetFunction({\n name: 'SUM',\n run: (args) => {\n const ns = numbersOf(args)\n if (isSheetError(ns)) return ns\n const total = finite(sum(ns))\n // times add up to a time, as `+` adds them\n return typeof total === 'number' && kindOf(args) === 'time' ? timeOrDays(total) : total\n },\n }),\n defineSheetFunction({\n name: 'PRODUCT',\n run: (args) => {\n const ns = numbersOf(args)\n return isSheetError(ns) ? ns : finite(ns.reduce((a, b) => a * b, 1))\n },\n }),\n defineSheetFunction({\n name: 'AVERAGE',\n minArgs: 1,\n run: (args) => {\n const ns = numbersOf(args)\n if (isSheetError(ns)) return ns\n return ns.length ? asInputs(args, sum(ns) / ns.length) : DIV0\n },\n }),\n defineSheetFunction({\n name: 'MIN',\n run: (args) => {\n const ns = numbersOf(args)\n return isSheetError(ns) ? ns : ns.length ? asInputs(args, Math.min(...ns)) : 0\n },\n }),\n defineSheetFunction({\n name: 'MAX',\n run: (args) => {\n const ns = numbersOf(args)\n return isSheetError(ns) ? ns : ns.length ? asInputs(args, Math.max(...ns)) : 0\n },\n }),\n defineSheetFunction({\n name: 'COUNT',\n run: (args) => {\n let n = 0\n for (const arg of args) {\n if (isRange(arg)) {\n for (const [, , v] of arg.entries()) if (typeof v === 'number' || serialIn(v) != null) n++\n } else if (arg != null && !isSheetError(toNumber(arg))) n++\n }\n return n\n },\n }),\n defineSheetFunction({\n name: 'COUNTA',\n run: (args) => {\n let n = 0\n for (const value of valuesOf(args)) if (value != null && value !== '') n++\n return n\n },\n }),\n defineSheetFunction({\n name: 'COUNTBLANK',\n minArgs: 1,\n maxArgs: 1,\n run: ([arg]) => {\n const range = asRange(arg!)\n let filled = 0\n for (const [, , v] of range.entries()) if (v != null && v !== '') filled++\n return range.rows * range.cols - filled\n },\n }),\n math('ABS', Math.abs, 1),\n math('INT', Math.floor, 1),\n math('SQRT', (n) => (n < 0 ? NUM : Math.sqrt(n)), 1),\n math('POWER', (a, b) => a ** b, 2),\n math('MOD', (a, b) => (b === 0 ? DIV0 : a - b * Math.floor(a / b)), 2),\n math('ROUND', (n, d = 0) => roundTo(n, d), 1, 2),\n math('ROUNDUP', (n, d = 0) => roundTo(n, d, 'up'), 1, 2),\n math('ROUNDDOWN', (n, d = 0) => roundTo(n, d, 'down'), 1, 2),\n\n // logic\n defineSheetFunction({\n name: 'IF',\n lazy: true,\n minArgs: 2,\n maxArgs: 3,\n run: ([test, then, otherwise]) => {\n const b = bool(test!())\n if (isSheetError(b)) return b\n if (b) return passOn(then!())\n return otherwise ? passOn(otherwise()) : false\n },\n }),\n defineSheetFunction({\n name: 'IFS',\n lazy: true,\n minArgs: 2,\n run: (args) => {\n if (args.length % 2) return VALUE\n for (let i = 0; i < args.length; i += 2) {\n const b = bool(args[i]!())\n if (isSheetError(b)) return b\n if (b) return passOn(args[i + 1]!())\n }\n return NA\n },\n }),\n defineSheetFunction({\n name: 'IFERROR',\n lazy: true,\n minArgs: 2,\n maxArgs: 2,\n run: ([value, fallback]) => {\n const v = scalarOf(value!())\n return isSheetError(v) ? (scalarOf(fallback!()) ?? 0) : (v ?? 0)\n },\n }),\n defineSheetFunction({\n name: 'IFNA',\n lazy: true,\n minArgs: 2,\n maxArgs: 2,\n run: ([value, fallback]) => {\n const v = scalarOf(value!())\n return v === NA ? (scalarOf(fallback!()) ?? 0) : (v ?? 0)\n },\n }),\n ...(['AND', 'OR'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 1,\n run: (args) => {\n let seen = false\n let out = name === 'AND'\n for (const arg of args) {\n const values = isRange(arg) ? arg.entries() : [[0, 0, arg] as const]\n for (const [, , value] of values) {\n // in ranges only numbers and TRUE / FALSE count\n if (value == null || (isRange(arg) && typeof value === 'string')) continue\n const b = toBoolean(value)\n if (isSheetError(b)) return b\n seen = true\n if (name === 'AND' && !b) out = false\n if (name === 'OR' && b) out = true\n }\n }\n return seen ? out : VALUE\n },\n }),\n ),\n defineSheetFunction({\n name: 'NOT',\n minArgs: 1,\n maxArgs: 1,\n run: ([a]) => {\n const b = bool(a!)\n return isSheetError(b) ? b : !b\n },\n }),\n ...(\n [\n ['ISBLANK', (v: SheetResult) => v == null],\n ['ISNUMBER', (v: SheetResult) => typeof v === 'number'],\n ['ISTEXT', (v: SheetResult) => typeof v === 'string'],\n ['ISERROR', (v: SheetResult) => isSheetError(v)],\n ['ISNA', (v: SheetResult) => v === NA],\n ] as const\n ).map(([name, test]) =>\n defineSheetFunction({ name, minArgs: 1, maxArgs: 1, run: ([a]) => test(scalarOf(a!)) }),\n ),\n\n // text\n defineSheetFunction({\n name: 'HYPERLINK',\n minArgs: 1,\n maxArgs: 2,\n run: ([location, name], context) => {\n const target = toText(scalarOf(location!))\n if (isSheetError(target)) return target\n const shown = name === undefined ? target : scalarOf(name)\n if (!isSheetError(shown)) context.link?.(target)\n return shown ?? ''\n },\n }),\n defineSheetFunction({\n name: 'CONCAT',\n run: (args) => {\n let out = ''\n for (const value of valuesOf(args)) {\n const t = toText(value)\n if (isSheetError(t)) return t\n out += t\n }\n return out\n },\n }),\n defineSheetFunction({\n name: 'CONCATENATE',\n minArgs: 1,\n run: (args) => {\n let out = ''\n for (const arg of args) {\n const t = text(arg)\n if (isSheetError(t)) return t\n out += t\n }\n return out\n },\n }),\n defineSheetFunction({\n name: 'TEXTJOIN',\n minArgs: 3,\n run: ([delimiter, ignoreEmpty, ...rest]) => {\n const d = text(delimiter!)\n const skip = bool(ignoreEmpty!)\n const error = firstError(d, skip)\n if (error) return error\n const parts: string[] = []\n for (const value of valuesOf(rest)) {\n const t = toText(value)\n if (isSheetError(t)) return t\n if (t !== '' || !skip) parts.push(t)\n }\n return parts.join(d as string)\n },\n }),\n defineSheetFunction({\n name: 'LEFT',\n minArgs: 1,\n maxArgs: 2,\n run: ([s, n]) => {\n const t = text(s!)\n const count = n == null ? 1 : num(n)\n const error = firstError(t, count)\n if (error) return error\n return (count as number) < 0 ? VALUE : [...(t as string)].slice(0, count as number).join('')\n },\n }),\n defineSheetFunction({\n name: 'RIGHT',\n minArgs: 1,\n maxArgs: 2,\n run: ([s, n]) => {\n const t = text(s!)\n const count = n == null ? 1 : num(n)\n const error = firstError(t, count)\n if (error) return error\n const chars = [...(t as string)]\n return (count as number) < 0\n ? VALUE\n : chars.slice(Math.max(0, chars.length - (count as number))).join('')\n },\n }),\n defineSheetFunction({\n name: 'MID',\n minArgs: 3,\n maxArgs: 3,\n run: ([s, start, n]) => {\n const t = text(s!)\n const from = num(start!)\n const count = num(n!)\n const error = firstError(t, from, count)\n if (error) return error\n if ((from as number) < 1 || (count as number) < 0) return VALUE\n return [...(t as string)]\n .slice((from as number) - 1, (from as number) - 1 + (count as number))\n .join('')\n },\n }),\n textFn('LEN', (s) => [...s].length),\n textFn('TRIM', (s) => s.trim().replace(/ {2,}/g, ' ')),\n textFn('UPPER', (s) => s.toUpperCase()),\n textFn('LOWER', (s) => s.toLowerCase()),\n textFn('EXACT', (a, b) => a === b, 2),\n defineSheetFunction({\n name: 'REPT',\n minArgs: 2,\n maxArgs: 2,\n run: ([s, n]) => {\n const t = text(s!)\n const count = num(n!)\n const error = firstError(t, count)\n if (error) return error\n return (count as number) < 0 ? VALUE : (t as string).repeat(Math.floor(count as number))\n },\n }),\n defineSheetFunction({\n name: 'SUBSTITUTE',\n minArgs: 3,\n maxArgs: 4,\n run: ([s, from, to, which]) => {\n const t = text(s!)\n const a = text(from!)\n const b = text(to!)\n const nth = which == null ? null : num(which)\n const error = firstError(t, a, b, nth)\n if (error) return error\n if (a === '') return t\n if (nth == null) return (t as string).split(a as string).join(b as string)\n let at = -1\n for (let i = 0; i < (nth as number); i++) {\n at = (t as string).indexOf(a as string, at + 1)\n if (at === -1) return t\n }\n return (t as string).slice(0, at) + b + (t as string).slice(at + (a as string).length)\n },\n }),\n ...(['FIND', 'SEARCH'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 2,\n maxArgs: 3,\n run: ([what, within, start]) => {\n const a = text(what!)\n const t = text(within!)\n const from = start == null ? 1 : num(start)\n const error = firstError(a, t, from)\n if (error) return error\n const at =\n name === 'FIND'\n ? (t as string).indexOf(a as string, (from as number) - 1)\n : (t as string).toLowerCase().indexOf((a as string).toLowerCase(), (from as number) - 1)\n return at === -1 ? VALUE : at + 1\n },\n }),\n ),\n defineSheetFunction({\n name: 'TEXT',\n minArgs: 2,\n maxArgs: 2,\n run: ([value, format], context) => {\n const v = scalarOf(value!)\n const f = text(format!)\n const error = firstError(v, f)\n if (error) return error\n // a number in a date or time format is a day number, as `TEXT(B2 + 1/24, \"hh:mm\")` gives\n const shown = typeof v === 'number' && isDateFormat(f as string) ? dateText(v) : v\n return formatValue(shown as string | number | boolean | null, f as string, context.locale)\n },\n }),\n defineSheetFunction({\n name: 'VALUE',\n minArgs: 1,\n maxArgs: 1,\n run: ([value]) => {\n const v = scalarOf(value!)\n return typeof v === 'boolean' ? VALUE : toNumber(v)\n },\n }),\n\n // dates\n defineSheetFunction({\n name: 'TODAY',\n maxArgs: 0,\n volatile: true,\n run: (_, c) => localDay(c.now),\n }),\n defineSheetFunction({\n name: 'NOW',\n maxArgs: 0,\n volatile: true,\n run: (_, c) => `${localDay(c.now)} ${pad(c.now.getHours())}:${pad(c.now.getMinutes())}`,\n }),\n math(\n 'DATE',\n (y, m, d) => {\n const year = Math.floor(y) < 1900 ? Math.floor(y) + 1900 : Math.floor(y)\n const ms = Date.UTC(year, Math.floor(m) - 1, Math.floor(d))\n return Number.isNaN(ms) ? NUM : dateText((ms - Date.UTC(1899, 11, 30)) / 86_400_000)\n },\n 3,\n ),\n ...(['YEAR', 'MONTH', 'DAY'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 1,\n maxArgs: 1,\n run: ([value]) => {\n const v = scalarOf(value!)\n if (isSheetError(v)) return v\n const parts = dateParts(v)\n if (!parts) return VALUE\n return name === 'YEAR' ? parts.year : name === 'MONTH' ? parts.month : parts.day\n },\n }),\n ),\n defineSheetFunction({\n name: 'WEEKDAY',\n minArgs: 1,\n maxArgs: 2,\n run: ([value, type]) => {\n const parts = dateParts(scalarOf(value!))\n const t = type == null ? 1 : num(type)\n if (isSheetError(t)) return t\n if (!parts) return VALUE\n // 1899-12-30 was a Saturday\n const sunday0 = (((Math.floor(parts.serial) + 6) % 7) + 7) % 7\n if (t === 1) return sunday0 + 1\n if (t === 2) return ((sunday0 + 6) % 7) + 1\n if (t === 3) return (sunday0 + 6) % 7\n return NUM\n },\n }),\n defineSheetFunction({\n name: 'DATEDIF',\n minArgs: 3,\n maxArgs: 3,\n run: ([start, end, unit]) => {\n const a = dateParts(scalarOf(start!))\n const b = dateParts(scalarOf(end!))\n const u = text(unit!)\n if (isSheetError(u)) return u\n if (!a || !b) return VALUE\n if (a.serial > b.serial) return NUM\n const months = (b.year - a.year) * 12 + (b.month - a.month) - (b.day < a.day ? 1 : 0)\n switch ((u as string).toUpperCase()) {\n case 'Y':\n return Math.floor(months / 12)\n case 'M':\n return months\n case 'D':\n return Math.floor(b.serial) - Math.floor(a.serial)\n case 'MD':\n return b.day >= a.day ? b.day - a.day : daysInMonth(b.year, b.month - 1) - a.day + b.day\n case 'YM':\n return months % 12\n case 'YD': {\n const year =\n b.month > a.month || (b.month === a.month && b.day >= a.day) ? b.year : b.year - 1\n const from = Date.UTC(year, a.month - 1, a.day)\n const to = Date.UTC(b.year, b.month - 1, b.day)\n return Math.round((to - from) / 86_400_000)\n }\n default:\n return NUM\n }\n },\n }),\n\n // conditions\n ...(['SUMIF', 'AVERAGEIF'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 2,\n maxArgs: 3,\n run: ([range, criteria, sumRange]) => {\n const where = asRange(range!)\n const c = scalarOf(criteria!)\n if (isSheetError(c)) return c\n const values = sumRange == null ? where : asRange(sumRange)\n let total = 0\n let count = 0\n for (const [r, col] of matchingOne(where, c) as [number, number][]) {\n const v = r < values.rows && col < values.cols ? values.at(r, col) : null\n if (isSheetError(v)) return v\n if (typeof v === 'number') {\n total += v\n count++\n }\n }\n if (name === 'SUMIF') return total\n return count ? total / count : DIV0\n },\n }),\n ),\n defineSheetFunction({\n name: 'COUNTIF',\n minArgs: 2,\n maxArgs: 2,\n run: ([range, criteria]) => {\n const c = scalarOf(criteria!)\n if (isSheetError(c)) return c\n return (matchingOne(asRange(range!), c) as [number, number][]).length\n },\n }),\n ...(['SUMIFS', 'AVERAGEIFS'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 3,\n run: ([target, ...pairs]) => {\n if (pairs.length % 2) return VALUE\n const ranges = [asRange(target!)]\n const criteria: SheetResult[] = [null]\n for (let i = 0; i < pairs.length; i += 2) {\n ranges.push(asRange(pairs[i]!))\n const c = scalarOf(pairs[i + 1]!)\n if (isSheetError(c)) return c\n criteria.push(c)\n }\n const found = matching(ranges.slice(1), criteria.slice(1))\n if (isSheetError(found)) return found\n if (ranges[0]!.rows !== ranges[1]!.rows || ranges[0]!.cols !== ranges[1]!.cols) return VALUE\n let total = 0\n let count = 0\n for (const [r, c] of found) {\n const v = ranges[0]!.at(r, c)\n if (isSheetError(v)) return v\n if (typeof v === 'number') {\n total += v\n count++\n }\n }\n if (name === 'SUMIFS') return total\n return count ? total / count : DIV0\n },\n }),\n ),\n defineSheetFunction({\n name: 'COUNTIFS',\n minArgs: 2,\n run: (args) => {\n if (args.length % 2) return VALUE\n const ranges: SheetRangeArg[] = []\n const criteria: SheetResult[] = []\n for (let i = 0; i < args.length; i += 2) {\n ranges.push(asRange(args[i]!))\n const c = scalarOf(args[i + 1]!)\n if (isSheetError(c)) return c\n criteria.push(c)\n }\n const found = matching(ranges, criteria)\n return isSheetError(found) ? found : found.length\n },\n }),\n\n // lookups\n ...(['VLOOKUP', 'HLOOKUP'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 3,\n maxArgs: 4,\n run: ([value, table, index, approximate]) => {\n const v = scalarOf(value!)\n if (isSheetError(v)) return v\n const t = asRange(table!)\n const i = num(index!)\n const approx = approximate == null ? true : bool(approximate)\n const error = firstError(i, approx)\n if (error) return error\n const n = Math.floor(i as number)\n const vertical = name === 'VLOOKUP'\n const length = vertical ? t.rows : t.cols\n if (n < 1 || n > (vertical ? t.cols : t.rows)) return n < 1 ? VALUE : SheetError.of('#REF!')\n const key = (k: number) => (vertical ? t.at(k, 0) : t.at(0, k))\n const found = approx\n ? sortedIndex(v, length, key)\n : lookupIndex(v, length, key, /[*?]/.test(String(v)) ? 'wildcard' : 'exact')\n if (found === -1) return NA\n return vertical ? t.at(found, n - 1) : t.at(n - 1, found)\n },\n }),\n ),\n defineSheetFunction({\n name: 'MATCH',\n minArgs: 2,\n maxArgs: 3,\n run: ([value, range, type]) => {\n const v = scalarOf(value!)\n if (isSheetError(v)) return v\n const r = asRange(range!)\n if (r.rows > 1 && r.cols > 1) return NA\n const t = type == null ? 1 : num(type)\n if (isSheetError(t)) return t\n const length = Math.max(r.rows, r.cols)\n const at = (i: number) => (r.rows > 1 ? r.at(i, 0) : r.at(0, i))\n let found: number\n if (t === 0)\n found = lookupIndex(\n v,\n length,\n at,\n typeof v === 'string' && /[*?]/.test(v) ? 'wildcard' : 'exact',\n )\n else if ((t as number) > 0) found = sortedIndex(v, length, at)\n else {\n // sorted from largest: the last value not below it\n found = -1\n for (let i = 0; i < length; i++) {\n const x = at(i)\n if (x == null) break\n if (compareValues(x, v) >= 0) found = i\n else break\n }\n }\n return found === -1 ? NA : found + 1\n },\n }),\n defineSheetFunction({\n name: 'INDEX',\n minArgs: 2,\n maxArgs: 3,\n run: ([range, row, col]) => {\n const r = asRange(range!)\n const ri = num(row!)\n const ci = col == null ? 1 : num(col)\n const error = firstError(ri, ci)\n if (error) return error\n let y = Math.floor(ri as number)\n let x = Math.floor(ci as number)\n // one row given one number: it counts along the row\n if (col == null && r.rows === 1) [y, x] = [1, y]\n if (y < 1 || x < 1) return VALUE\n if (y > r.rows || x > r.cols) return SheetError.of('#REF!')\n return r.at(y - 1, x - 1)\n },\n }),\n defineSheetFunction({\n name: 'XLOOKUP',\n lazy: true,\n minArgs: 3,\n maxArgs: 6,\n run: ([value, lookup, results, notFound, matchMode, searchMode]) => {\n const v = scalarOf(value!())\n if (isSheetError(v)) return v\n const l = asRange(lookup!())\n const out = asRange(results!())\n if (l.rows > 1 && l.cols > 1) return VALUE\n const mode = matchMode ? num(matchMode()) : 0\n const search = searchMode ? num(searchMode()) : 1\n const error = firstError(mode, search)\n if (error) return error\n const vertical = l.rows > 1 || l.cols === 1\n const length = vertical ? l.rows : l.cols\n if ((vertical ? out.rows : out.cols) !== length) return VALUE\n const at = (i: number) => (vertical ? l.at(i, 0) : l.at(0, i))\n const how =\n mode === 0\n ? 'exact'\n : mode === -1\n ? 'below'\n : mode === 1\n ? 'above'\n : mode === 2\n ? 'wildcard'\n : null\n if (!how) return VALUE\n const found = lookupIndex(v, length, at, how, (search as number) < 0)\n if (found === -1) return notFound ? (scalarOf(notFound()) ?? 0) : NA\n return vertical ? out.at(found, 0) : out.at(0, found)\n },\n }),\n // math and statistics, the second batch\n defineSheetFunction({\n name: 'SUMPRODUCT',\n minArgs: 1,\n run: (args) => {\n const ranges = args.map(asRange)\n const first = ranges[0]!\n if (ranges.some((r) => r.rows !== first.rows || r.cols !== first.cols)) return VALUE\n let total = 0\n for (let r = 0; r < first.rows; r++)\n for (let c = 0; c < first.cols; c++) {\n let product = 1\n for (const range of ranges) {\n const v = range.at(r, c)\n if (isSheetError(v)) return v\n // only numbers count; anything else is 0\n product *= typeof v === 'number' ? v : 0\n }\n total += product\n }\n return finite(total)\n },\n }),\n defineSheetFunction({\n name: 'MEDIAN',\n minArgs: 1,\n run: (args) => {\n const ns = statsOf(args, 1, NUM)\n return isSheetError(ns) ? ns : asInputs(args, percentile(ascending(ns), 0.5))\n },\n }),\n ...(['LARGE', 'SMALL'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 2,\n maxArgs: 2,\n run: ([values, nth]) => {\n const ns = numbersOf([values!])\n const k = num(nth!)\n const error = firstError(ns, k)\n if (error) return error\n const list = ascending(ns as number[])\n const i = Math.ceil(k as number)\n if (i < 1 || i > list.length) return NUM\n return name === 'SMALL' ? list[i - 1]! : list[list.length - i]!\n },\n }),\n ),\n ...(['RANK', 'RANK.EQ'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 2,\n maxArgs: 3,\n run: ([value, values, order]) => {\n const v = num(value!)\n const ns = numbersOf([asRange(values!)])\n const ascendingOrder = order == null ? false : bool(order)\n const error = firstError(v, ns, ascendingOrder)\n if (error) return error\n if (!(ns as number[]).includes(v as number)) return NA\n let rank = 1\n for (const n of ns as number[])\n if (ascendingOrder ? n < (v as number) : n > (v as number)) rank++\n return rank\n },\n }),\n ),\n ...(\n [\n ['STDEV', true, true],\n ['STDEV.S', true, true],\n ['STDEV.P', true, false],\n ['VAR', false, true],\n ['VAR.S', false, true],\n ['VAR.P', false, false],\n ] as const\n ).map(([name, root, sample]) =>\n defineSheetFunction({\n name,\n minArgs: 1,\n run: (args) => {\n const ns = statsOf(args, sample ? 2 : 1, DIV0)\n if (isSheetError(ns)) return ns\n const v = variance(ns, sample)\n return root ? Math.sqrt(v) : v\n },\n }),\n ),\n ...(['PERCENTILE', 'PERCENTILE.INC'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 2,\n maxArgs: 2,\n run: ([values, k]) => {\n const ns = numbersOf([values!])\n const at = num(k!)\n const error = firstError(ns, at)\n if (error) return error\n if (!(ns as number[]).length || (at as number) < 0 || (at as number) > 1) return NUM\n return tidy(percentile(ascending(ns as number[]), at as number))\n },\n }),\n ),\n ...(['MAXIFS', 'MINIFS'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 3,\n run: ([target, ...pairs]) => {\n if (pairs.length % 2) return VALUE\n const values = asRange(target!)\n const ranges: SheetRangeArg[] = []\n const criteria: SheetResult[] = []\n for (let i = 0; i < pairs.length; i += 2) {\n ranges.push(asRange(pairs[i]!))\n const c = scalarOf(pairs[i + 1]!)\n if (isSheetError(c)) return c\n criteria.push(c)\n }\n const found = matching(ranges, criteria)\n if (isSheetError(found)) return found\n if (values.rows !== ranges[0]!.rows || values.cols !== ranges[0]!.cols) return VALUE\n let best: number | null = null\n for (const [r, c] of found) {\n const v = values.at(r, c)\n if (isSheetError(v)) return v\n if (typeof v !== 'number') continue\n if (best == null || (name === 'MAXIFS' ? v > best : v < best)) best = v\n }\n return best ?? 0\n },\n }),\n ),\n math(\n 'CEILING',\n (n, step = 1) => {\n if (step === 0) return 0\n if (n > 0 && step < 0) return NUM\n return tidy(Math.ceil(Number((n / step).toPrecision(15))) * step)\n },\n 1,\n 2,\n ),\n math(\n 'FLOOR',\n (n, step = 1) => {\n if (step === 0) return n === 0 ? 0 : DIV0\n if (n > 0 && step < 0) return NUM\n return tidy(Math.floor(Number((n / step).toPrecision(15))) * step)\n },\n 1,\n 2,\n ),\n math(\n 'MROUND',\n (n, step) => {\n if (step === 0 || n === 0) return 0\n if (Math.sign(n) !== Math.sign(step)) return NUM\n return tidy(roundTo(n / step, 0) * step)\n },\n 2,\n ),\n math('TRUNC', (n, d = 0) => roundTo(n, d, 'down'), 1, 2),\n math('SIGN', Math.sign, 1),\n math('PI', () => Math.PI, 0),\n math('EXP', Math.exp, 1),\n math('LN', (n) => (n <= 0 ? NUM : Math.log(n)), 1),\n math('LOG10', (n) => (n <= 0 ? NUM : Math.log10(n)), 1),\n math(\n 'LOG',\n (n, base = 10) => {\n if (n <= 0 || base <= 0) return NUM\n return base === 1 ? DIV0 : tidy(Math.log(n) / Math.log(base))\n },\n 1,\n 2,\n ),\n defineSheetFunction({\n name: 'RAND',\n maxArgs: 0,\n volatile: true,\n run: () => Math.random(),\n }),\n defineSheetFunction({\n name: 'RANDBETWEEN',\n minArgs: 2,\n maxArgs: 2,\n volatile: true,\n run: ([low, high]) => {\n const a = num(low!)\n const b = num(high!)\n const error = firstError(a, b)\n if (error) return error\n const lo = Math.ceil(a as number)\n const hi = Math.floor(b as number)\n if (lo > hi) return NUM\n return lo + Math.floor(Math.random() * (hi - lo + 1))\n },\n }),\n\n // logic, the second batch\n defineSheetFunction({\n name: 'XOR',\n minArgs: 1,\n run: (args) => {\n let seen = false\n let out = false\n for (const arg of args) {\n const values = isRange(arg) ? arg.entries() : [[0, 0, arg] as const]\n for (const [, , value] of values) {\n if (value == null || (isRange(arg) && typeof value === 'string')) continue\n const b = toBoolean(value)\n if (isSheetError(b)) return b\n seen = true\n if (b) out = !out\n }\n }\n return seen ? out : VALUE\n },\n }),\n defineSheetFunction({\n name: 'SWITCH',\n lazy: true,\n minArgs: 3,\n run: ([value, ...cases]) => {\n const v = scalarOf(value!())\n if (isSheetError(v)) return v\n for (let i = 0; i + 1 < cases.length; i += 2) {\n const c = scalarOf(cases[i]!())\n if (isSheetError(c)) return c\n // the same as `=` finds them: an empty cell is 0 and empty text\n if (compareValues(c, v) === 0) return passOn(cases[i + 1]!())\n }\n // an odd one at the end is the default\n return cases.length % 2 ? passOn(cases[cases.length - 1]!()) : NA\n },\n }),\n defineSheetFunction({\n name: 'CHOOSE',\n lazy: true,\n minArgs: 2,\n run: ([index, ...values]) => {\n const i = num(index!())\n if (isSheetError(i)) return i\n const at = Math.floor(i)\n if (at < 1 || at > values.length) return VALUE\n return passOn(values[at - 1]!())\n },\n }),\n defineSheetFunction({ name: 'NA', maxArgs: 0, run: () => NA }),\n ...(\n [\n ['ISLOGICAL', (v: SheetResult) => typeof v === 'boolean'],\n ['ISERR', (v: SheetResult) => isSheetError(v) && v !== NA],\n ] as const\n ).map(([name, test]) =>\n defineSheetFunction({ name, minArgs: 1, maxArgs: 1, run: ([a]) => test(scalarOf(a!)) }),\n ),\n ...(['ISEVEN', 'ISODD'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 1,\n maxArgs: 1,\n run: ([a]) => {\n const v = scalarOf(a!)\n if (typeof v === 'boolean') return VALUE\n const n = toNumber(v)\n if (isSheetError(n)) return n\n const even = Math.abs(Math.trunc(n)) % 2 === 0\n return name === 'ISEVEN' ? even : !even\n },\n }),\n ),\n\n // text, the second batch\n textFn('PROPER', (s) =>\n s\n .toLowerCase()\n .replace(\n /(^|[^\\p{L}])(\\p{L})/gu,\n (_, before: string, letter: string) => before + letter.toUpperCase(),\n ),\n ),\n // oxlint-disable-next-line no-control-regex -- CLEAN takes out exactly these\n textFn('CLEAN', (s) => s.replace(/[\\u0000-\\u001f]/g, '')),\n defineSheetFunction({\n name: 'REPLACE',\n minArgs: 4,\n maxArgs: 4,\n run: ([old, start, count, replacement]) => {\n const t = text(old!)\n const from = num(start!)\n const n = num(count!)\n const r = text(replacement!)\n const error = firstError(t, from, n, r)\n if (error) return error\n if ((from as number) < 1 || (n as number) < 0) return VALUE\n const chars = [...(t as string)]\n const at = Math.floor(from as number) - 1\n return [...chars.slice(0, at), r, ...chars.slice(at + Math.floor(n as number))].join('')\n },\n }),\n ...(['TEXTBEFORE', 'TEXTAFTER'] as const).map((name) =>\n defineSheetFunction({\n name,\n lazy: true,\n minArgs: 2,\n maxArgs: 6,\n run: ([value, delimiter, instance, matchMode, matchEnd, ifNotFound]) => {\n const t = text(value!())\n const d = text(delimiter!())\n // an argument left out, also between commas, takes its default\n const nth = given(instance) ? num(instance!()) : 1\n const mode = given(matchMode) ? num(matchMode!()) : 0\n const end = given(matchEnd) ? bool(matchEnd!()) : false\n const error = firstError(t, d, nth, mode, end)\n if (error) return error\n const source = t as string\n const k = Math.trunc(nth as number)\n if (k === 0 || Math.abs(k) > source.length + 1) return VALUE\n const found = positionsOf(source, d as string, mode === 1)\n // with `matchEnd` the end of the text counts as one more delimiter\n const starts = end ? [...found, source.length] : found\n const ends = end ? [0, ...found] : found\n const width = (d as string).length\n let at: number\n let after: number\n if (k > 0) {\n if (k > starts.length) return given(ifNotFound) ? (scalarOf(ifNotFound!()) ?? 0) : NA\n at = starts[k - 1]!\n after = at === source.length ? at : at + width\n } else {\n if (-k > ends.length) return given(ifNotFound) ? (scalarOf(ifNotFound!()) ?? 0) : NA\n at = ends[ends.length + k]!\n after = end && at === 0 && ends.length + k === 0 ? 0 : at + width\n }\n return name === 'TEXTBEFORE' ? source.slice(0, at) : source.slice(after)\n },\n }),\n ),\n ...(\n [\n ['CHAR', 255],\n ['UNICHAR', 0x10ffff],\n ] as const\n ).map(([name, most]) =>\n math(\n name,\n (n) => {\n const code = Math.trunc(n)\n return code < 1 || code > most ? VALUE : String.fromCodePoint(code)\n },\n 1,\n ),\n ),\n ...(['CODE', 'UNICODE'] as const).map((name) =>\n textFn(name, (s) => (s === '' ? VALUE : s.codePointAt(0)!)),\n ),\n\n // dates and times, the second batch\n math(\n 'TIME',\n (h, m, s) => {\n const seconds = Math.trunc(h) * 3600 + Math.trunc(m) * 60 + Math.trunc(s)\n return seconds < 0 ? NUM : timeText(seconds / 86_400)\n },\n 3,\n ),\n ...(['HOUR', 'MINUTE', 'SECOND'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 1,\n maxArgs: 1,\n run: ([value]) => {\n const serial = serialArg(value!)\n if (isSheetError(serial)) return serial\n if (serial == null || serial < 0) return VALUE\n const seconds = Math.round((serial % 1) * 86_400) % 86_400\n if (name === 'HOUR') return Math.floor(seconds / 3600)\n if (name === 'MINUTE') return Math.floor((seconds % 3600) / 60)\n return seconds % 60\n },\n }),\n ),\n ...(['EDATE', 'EOMONTH'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 2,\n maxArgs: 2,\n run: ([start, months]) => {\n const parts = dateParts(scalarOf(start!))\n const n = num(months!)\n if (isSheetError(n)) return n\n if (!parts) return VALUE\n const month = parts.month + Math.trunc(n)\n if (name === 'EOMONTH') return dayText(serialFor(parts.year, month + 1, 0))\n // the same day, or the month's last when it is shorter\n const last = new Date(Date.UTC(parts.year, month, 0)).getUTCDate()\n return dayText(serialFor(parts.year, month, Math.min(parts.day, last)))\n },\n }),\n ),\n defineSheetFunction({\n name: 'DAYS',\n minArgs: 2,\n maxArgs: 2,\n run: ([end, start]) => {\n const b = serialArg(end!)\n const a = serialArg(start!)\n const error = firstError(a, b)\n if (error) return error\n if (a == null || b == null) return VALUE\n return Math.floor(b as number) - Math.floor(a as number)\n },\n }),\n defineSheetFunction({\n name: 'NETWORKDAYS',\n minArgs: 2,\n maxArgs: 3,\n run: ([start, end, holidays]) => {\n const a = serialArg(start!)\n const b = serialArg(end!)\n const off = holidaysOf(holidays)\n const error = firstError(a, b, off)\n if (error) return error\n if (a == null || b == null) return VALUE\n const from = Math.floor(Math.min(a as number, b as number))\n const to = Math.floor(Math.max(a as number, b as number))\n const count = weekdaysBetween(from, to) - holidaysBetween(off as Set<number>, from, to)\n return (a as number) > (b as number) ? -count : count\n },\n }),\n defineSheetFunction({\n name: 'WORKDAY',\n minArgs: 2,\n maxArgs: 3,\n run: ([start, days, holidays]) => {\n const a = serialArg(start!)\n const n = num(days!)\n const off = holidaysOf(holidays)\n const error = firstError(a, n, off)\n if (error) return error\n if (a == null) return VALUE\n const count = Math.trunc(n as number)\n if (!Number.isFinite(count) || Math.abs(count) > LAST_DAY) return NUM\n const step = count < 0 ? -1 : 1\n let from = Math.floor(a as number)\n let day = weekdaysOn(from, count)\n // each holiday passed on the way puts the day one weekday further\n for (;;) {\n const lo = Math.min(from, day)\n const hi = Math.max(from, day)\n const passed = holidaysBetween(\n off as Set<number>,\n lo + (step > 0 ? 1 : 0),\n hi - (step < 0 ? 1 : 0),\n )\n if (!passed) break\n from = day\n day = weekdaysOn(day, passed * step)\n }\n return day < 0 || day > LAST_DAY ? NUM : dayText(day)\n },\n }),\n defineSheetFunction({\n name: 'WEEKNUM',\n minArgs: 1,\n maxArgs: 2,\n run: ([value, type]) => {\n const serial = serialArg(value!)\n const t = type == null ? 1 : num(type)\n const error = firstError(serial, t)\n if (error) return error\n if (serial == null) return VALUE\n if (t === 21) return isoWeek(serial as number)\n // the day the week starts on, 0 for Sunday; the first week holds January 1\n const start = WEEK_STARTS[t as number]\n if (start == null) return NUM\n const day = Math.floor(serial as number)\n const year = new Date(day * 86_400_000 + Date.UTC(1899, 11, 30)).getUTCFullYear()\n const first = serialFor(year, 1, 1)\n const shift = (weekdayOf(first) - start + 7) % 7\n return Math.floor((day - first + shift) / 7) + 1\n },\n }),\n defineSheetFunction({\n name: 'ISOWEEKNUM',\n minArgs: 1,\n maxArgs: 1,\n run: ([value]) => {\n const serial = serialArg(value!)\n if (isSheetError(serial)) return serial\n return serial == null ? VALUE : isoWeek(serial)\n },\n }),\n ...(['DATEVALUE', 'TIMEVALUE'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 1,\n maxArgs: 1,\n run: ([value]) => {\n const t = text(value!)\n if (isSheetError(t)) return t\n // read as a cell reads what is typed into it: 2026/3/5, 2026-03-05 09:30, 9:30\n const typed = parseInput(t.trim()).value\n const serial = typeof typed === 'string' ? serialOf(typed) : null\n if (serial == null) return VALUE\n return name === 'DATEVALUE' ? dayText(serial) : timeText(serial % 1)\n },\n }),\n ),\n\n // lookups, the second batch\n defineSheetFunction({\n name: 'XMATCH',\n minArgs: 2,\n maxArgs: 4,\n run: ([value, values, matchMode, searchMode]) => {\n const v = scalarOf(value!)\n if (isSheetError(v)) return v\n const r = asRange(values!)\n if (r.rows > 1 && r.cols > 1) return VALUE\n const mode = matchMode == null ? 0 : num(matchMode)\n const search = searchMode == null ? 1 : num(searchMode)\n const error = firstError(mode, search)\n if (error) return error\n const how =\n mode === 0\n ? 'exact'\n : mode === -1\n ? 'below'\n : mode === 1\n ? 'above'\n : mode === 2\n ? 'wildcard'\n : null\n if (!how || ![1, -1, 2, -2].includes(search as number)) return VALUE\n const length = Math.max(r.rows, r.cols)\n const at = (i: number) => (r.rows > 1 ? r.at(i, 0) : r.at(0, i))\n // 2 and -2 search data sorted from smallest or from largest, by halves\n if (Math.abs(search as number) === 2 && how === 'wildcard') return VALUE\n const found =\n Math.abs(search as number) === 2\n ? halvingIndex(v, length, at, how as 'exact' | 'below' | 'above', search === -2)\n : lookupIndex(v, length, at, how, search === -1)\n return found === -1 ? NA : found + 1\n },\n }),\n ...(['ROWS', 'COLUMNS'] as const).map((name) =>\n defineSheetFunction({\n name,\n minArgs: 1,\n maxArgs: 1,\n run: ([range]) => {\n if (isSheetError(range)) return range\n const r = asRange(range!)\n return name === 'ROWS' ? r.rows : r.cols\n },\n }),\n ),\n\n // money\n math(\n 'PMT',\n (rate, nper, pv, fv = 0, type = 0) =>\n nper === 0 ? NUM : payment(rate, nper, pv, fv, type ? 1 : 0),\n 3,\n 5,\n ),\n math(\n 'FV',\n (rate, nper, pmt, pv = 0, type = 0) => {\n if (rate === 0) return -(pv + pmt * nper)\n const grow = (1 + rate) ** nper\n return -(pv * grow + (pmt * (1 + rate * (type ? 1 : 0)) * (grow - 1)) / rate)\n },\n 3,\n 5,\n ),\n math(\n 'PV',\n (rate, nper, pmt, fv = 0, type = 0) => {\n if (rate === 0) return -(fv + pmt * nper)\n const grow = (1 + rate) ** nper\n return -(fv + (pmt * (1 + rate * (type ? 1 : 0)) * (grow - 1)) / rate) / grow\n },\n 3,\n 5,\n ),\n defineSheetFunction({\n name: 'NPV',\n minArgs: 2,\n run: ([rate, ...values]) => {\n const r = num(rate!)\n const ns = numbersOf(values)\n const error = firstError(r, ns)\n if (error) return error\n if (r === -1) return DIV0\n let total = 0\n ;(ns as number[]).forEach((n, i) => {\n total += n / (1 + (r as number)) ** (i + 1)\n })\n return finite(total)\n },\n }),\n]\n"],"mappings":";;;;;AAoEA,SAAgB,oBAA6C,YAAkB;CAC7E,OAAO;AACT;;AAKA,SAAgB,SAAS,KAA4B;CACnD,IAAI,CAAC,QAAQ,GAAG,GAAG,OAAO;CAC1B,OAAO,IAAI,SAAS,KAAK,IAAI,SAAS,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI;AAC3D;;AAGA,IAAM,YAAY,UAChB,OAAO,UAAU,aAAa,WAAW,KAAK,KAAK,WAAW,KAAK,KAAK,SAAS,KAAK,IAAI;;;;;;;AAQ5F,SAAgB,UAAU,MAAyC;CACjE,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,OAAO,MAChB,IAAI,QAAQ,GAAG,GACb,KAAK,MAAM,KAAK,UAAU,IAAI,QAAQ,GAAG;EACvC,IAAI,aAAa,KAAK,GAAG,OAAO;EAChC,IAAI,OAAO,UAAU,UAAU,IAAI,KAAK,KAAK;OACxC;GACH,MAAM,SAAS,SAAS,KAAK;GAC7B,IAAI,UAAU,MAAM,IAAI,KAAK,MAAM;EACrC;CACF;MACK,IAAI,OAAO,MAAM;EACtB,MAAM,IAAI,SAAS,GAAG;EACtB,IAAI,aAAa,CAAC,GAAG,OAAO;EAC5B,IAAI,KAAK,CAAC;CACZ;CAEF,OAAO;AACT;;AAGA,UAAU,SAAS,MAA0C;CAC3D,KAAK,MAAM,OAAO,MAChB,IAAI,QAAQ,GAAG,GAAG,KAAK,MAAM,KAAK,UAAU,IAAI,QAAQ,GAAG,MAAM;MAC5D,MAAM;AAEf;;;;;AAMA,SAAS,OAAO,MAA0C;CACxD,IAAI,OAA+B;CACnC,KAAK,MAAM,SAAS,SAAS,IAAI,GAAG;EAClC,IAAI,SAAS,QAAQ,aAAa,KAAK,GAAG;EAC1C,MAAM,IAAI,WAAW,KAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS;EAEpE,IAAI,CAAC,KAAK,OAAO,UAAU,UAAU;EACrC,IAAI,CAAC,KAAM,QAAQ,SAAS,GAAI,OAAO;EACvC,OAAO;CACT;CACA,OAAO;AACT;AAEA,IAAM,OAAO,QAAkB,SAAS,SAAS,GAAG,CAAC;AACrD,IAAM,QAAQ,QAAkB,OAAO,SAAS,GAAG,CAAC;AACpD,IAAM,QAAQ,QAAkB,UAAU,SAAS,GAAG,CAAC;AACvD,IAAM,UAAU,MAAe,OAAO,SAAS,CAAC,IAAI,IAAI;;AAGxD,SAAS,QAAQ,GAAW,QAAgB,OAAgC,SAAS;CACnF,MAAM,IAAI,KAAK,MAAM,MAAM;CAC3B,MAAM,SAAS,KAAK,IAAI,CAAC,IAAI,MAAM;CACnC,MAAM,QAAQ,OAAO,OAAO,YAAY,EAAE,CAAC;CAG3C,OAAO,KAAK,KAAK,CAAC,IAAI,SADpB,SAAS,UAAU,KAAK,MAAM,KAAK,IAAI,SAAS,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,KAC1D,MAAM,EAAA,CAAG,YAAY,EAAE,CAAC;AAC5D;AAEA,IAAM,cAAc,GAAG,WAAsB,OAAO,KAAK,YAAY;;AAGrE,IAAM,SAAS,QAAsC,OAAO,QAAQ,IAAI,KAAK;;AAG7E,IAAM,UAAU,QAA6B,QAAQ,GAAG,IAAI,MAAO,OAAO;AAE1E,SAAS,KACP,MACA,KACA,SACA,UAAU,SACV;CACA,OAAO,oBAAoB;EACzB;EACA;EACA;EACA,MAAM,SAAS;GACb,MAAM,KAAK,KAAK,KAAK,QAAS,OAAO,OAAO,IAAI,IAAI,GAAG,CAAE;GACzD,MAAM,QAAQ,WAAW,GAAG,EAAE;GAC9B,IAAI,OAAO,OAAO;GAClB,MAAM,MAAM,IAAI,GAAI,EAAe;GACnC,OAAO,OAAO,QAAQ,WAAW,OAAO,GAAG,IAAI;EACjD;CACF,CAAC;AACH;AAEA,SAAS,OACP,MACA,KACA,UAAU,GACV,UAAU,SACV;CACA,OAAO,oBAAoB;EACzB;EACA;EACA;EACA,MAAM,SAAS;GACb,MAAM,KAAK,KAAK,IAAI,IAAI;GAExB,OADc,WAAW,GAAG,EACrB,KAAS,IAAI,GAAI,EAAe;EACzC;CACF,CAAC;AACH;;AAGA,SAAS,SAAS,SAAiB;CACjC,IAAI,SAAS;CACb,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;EACvC,MAAM,IAAI,QAAQ;EAClB,IAAI,MAAM,OAAO,IAAI,IAAI,QAAQ,QAC/B,UAAU,QAAQ,EAAE,EAAE,CAAE,QAAQ,uBAAuB,MAAM;OAC1D,IAAI,MAAM,KAAK,UAAU;OACzB,IAAI,MAAM,KAAK,UAAU;OACzB,UAAU,EAAE,QAAQ,uBAAuB,MAAM;CACxD;CACA,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,IAAI;AACvC;;;;;AAMA,SAAgB,WAAW,UAAwD;CACjF,IAAI,OAAO,aAAa,UACtB,QAAQ,UAAU,SAAS,QAAQ,cAAc,OAAO,QAAQ,MAAM;CACxE,MAAM,KAAK,2BAA2B,KAAK,QAAQ;CACnD,MAAM,MAAM,GAAG,MAAM;CACrB,MAAM,OAAO,GAAG;CAChB,MAAM,WACJ,KAAK,KAAK,MAAM,KACZ,OACC,SAAS,KAAK,KAAK,CAAC,YACd;EACL,MAAM,IAAI,SAAS,IAAI;EACvB,OAAO,OAAO,MAAM,WAAW,IAAI;CACrC,EAAA,CAAG;CACT,IAAI,YAAY,MAAM;EACpB,MAAM,QAAQ,MACZ,QAAQ,MACJ,MAAM,WACN,QAAQ,OACN,MAAM,WACN,QAAQ,MACN,IAAI,WACJ,QAAQ,MACN,IAAI,WACJ,QAAQ,OACN,KAAK,WACL,KAAK;EACnB,QAAQ,UAAU;GAChB,IAAI,OAAO,UAAU,UAAU,OAAO,KAAK,KAAK;GAChD,IAAI,OAAO,UAAU,UAAU;IAC7B,MAAM,SAAS,SAAS,KAAK;IAC7B,IAAI,UAAU,MAAM,OAAO,KAAK,MAAM;GACxC;GACA,OAAO,QAAQ;EACjB;CACF;CACA,IAAI,QAAQ,OAAO,QAAQ,MAAM;EAC/B,MAAM,QACJ,SAAS,MACJ,UAAuB,SAAS,QAAQ,UAAU,KACnD,QAAQ,KAAK,IAAI,MAEZ,QAAQ,UACP,OAAO,UAAU,YAAY,GAAG,KAAK,KAAK,EAAA,CAC5C,SAAS,IAAI,CAAC,KACf,UACC,OAAO,UAAU,YAAY,MAAM,YAAY,MAAM,KAAK,YAAY;EAChF,OAAO,QAAQ,MAAM,SAAS,UAAU,CAAC,MAAM,KAAK;CACtD;CACA,QAAQ,UAAU;EAChB,IAAI,OAAO,UAAU,UAAU,OAAO;EACtC,MAAM,IAAI,cAAc,OAAO,IAAI;EACnC,OAAO,QAAQ,MAAM,IAAI,IAAI,QAAQ,MAAM,IAAI,IAAI,QAAQ,OAAO,KAAK,IAAI,KAAK;CAClF;AACF;;AAGA,SAAS,SAAS,QAAyB,UAAyB;CAClE,MAAM,QAAQ,OAAO;CACrB,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,MAAM,OAAO;CACrE,MAAM,QAAQ,SAAS,IAAI,UAAU;CACrC,MAAM,MAA0B,CAAC;CAEjC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,KAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,KAC9B,IAAI,MAAM,OAAO,MAAM,MAAM,KAAK,OAAO,EAAE,CAAE,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;CAC5E,OAAO;AACT;;AAGA,SAAS,YAAY,OAAsB,UAAuB;CAChE,MAAM,OAAO,WAAW,QAAQ;CAChC,IAAI,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC;CACnD,MAAM,MAA0B,CAAC;CACjC,KAAK,MAAM,CAAC,GAAG,GAAG,UAAU,MAAM,QAAQ,GAAG,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;CAC7E,OAAO;AACT;AAEA,SAAS,YACP,OACA,QACA,IACA,MACA,UAAU,OACV;CACA,IAAI,SAAS,cAAc,OAAO,UAAU,UAAU;EACpD,MAAM,KAAK,SAAS,KAAK;EACzB,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;GAC/B,MAAM,IAAI,UAAU,SAAS,IAAI,IAAI;GACrC,MAAM,IAAI,GAAG,CAAC;GACd,IAAI,OAAO,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,OAAO;EAClD;EACA,OAAO;CACT;CACA,IAAI,OAAO;CACX,IAAI,YAAyB;CAC7B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAC/B,MAAM,IAAI,UAAU,SAAS,IAAI,IAAI;EACrC,MAAM,IAAI,GAAG,CAAC;EACd,IAAI,KAAK,QAAQ,aAAa,CAAC,GAAG;EAClC,MAAM,IAAI,cAAc,GAAG,KAAK;EAChC,IAAI,MAAM,MAAM,OAAO,MAAM,OAAO,SAAU,MAAM,MAAM,SAAS,OAAQ,OAAO;EAClF,IACE,SAAS,WACT,IAAI,KACJ,OAAO,MAAM,OAAO,UACnB,SAAS,MAAM,cAAc,GAAG,SAAS,IAAI,IAC9C;GACA,OAAO;GACP,YAAY;EACd;EACA,IACE,SAAS,WACT,IAAI,KACJ,OAAO,MAAM,OAAO,UACnB,SAAS,MAAM,cAAc,GAAG,SAAS,IAAI,IAC9C;GACA,OAAO;GACP,YAAY;EACd;CACF;CACA,OAAO;AACT;;AAGA,SAAS,YAAY,OAAoB,QAAgB,IAAgC;CACvF,IAAI,KAAK;CACT,IAAI,KAAK,SAAS;CAClB,IAAI,QAAQ;CACZ,OAAO,MAAM,IAAI;EACf,MAAM,MAAO,KAAK,MAAO;EACzB,MAAM,IAAI,GAAG,GAAG;EAChB,IAAI,KAAK,MAAM;GACb,KAAK,MAAM;GACX;EACF;EACA,IAAI,cAAc,GAAG,KAAK,KAAK,GAAG;GAChC,QAAQ;GACR,KAAK,MAAM;EACb,OAAO,KAAK,MAAM;CACpB;CACA,OAAO;AACT;;AAGA,SAAS,aACP,OACA,QACA,IACA,KACA,YACA;CACA,MAAM,OAAO,MAAc,GAAG,aAAa,SAAS,IAAI,IAAI,CAAC;CAC7D,MAAM,cAAc,MAAmB,KAAK,QAAQ,CAAC,aAAa,CAAC,KAAK,OAAO,MAAM,OAAO;CAE5F,IAAI,KAAK;CACT,IAAI,KAAK,SAAS;CAClB,IAAI,OAAO;CACX,OAAO,MAAM,IAAI;EACf,MAAM,MAAO,KAAK,MAAO;EACzB,MAAM,IAAI,IAAI,GAAG;EACjB,IAAI,WAAW,CAAC,KAAK,cAAc,GAAG,KAAK,KAAK,GAAG;GACjD,OAAO;GACP,KAAK,MAAM;EACb,OAAO,KAAK,MAAM;CACpB;CACA,IAAI,IAAI;CACR,IAAI,SAAS,MAAM,cAAc,IAAI,IAAI,GAAG,KAAK,MAAM,GAAG,IAAI;MACzD,IAAI,QAAQ,SAAS,IAAI;MACzB,IAAI,QAAQ,WAAW,OAAO,IAAI,QAAQ,IAAI,OAAO;CAC1D,OAAO,MAAM,KAAK,KAAK,aAAa,SAAS,IAAI,IAAI;AACvD;AAEA,IAAM,WAAW,QACf,QAAQ,GAAG,IACP,MACA;CACE,MAAM;CACN,MAAM;CACN,MAAM;CACN,UAAU;CACV,eAAgB,OAAO,OAAO,CAAC,IAAI,CAAC;EAAC;EAAG;EAAG;CAAG,CAAC;AACjD;AAEN,IAAM,OAAO,MAAc,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;AACpD,SAAS,SAAS,KAAW;CAC3B,OAAO,GAAG,IAAI,YAAY,EAAE,GAAG,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE,GAAG,IAAI,IAAI,QAAQ,CAAC;AAC7E;AAEA,SAAS,YAAY,MAAc,OAAe;CAChD,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW;AACvD;;AAKA,IAAM,QAAQ,MAAe,OAAO,SAAS,CAAC,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC,IAAI;;AAG9E,SAAS,QAAQ,MAAkB,OAAe,KAAwC;CACxF,MAAM,KAAK,UAAU,IAAI;CACzB,IAAI,aAAa,EAAE,GAAG,OAAO;CAC7B,OAAO,GAAG,SAAS,QAAQ,MAAM;AACnC;AAEA,IAAM,QAAQ,OAAiB,IAAI,EAAE,IAAI,GAAG;;AAG5C,SAAS,SAAS,IAAc,QAAiB;CAC/C,MAAM,IAAI,KAAK,EAAE;CACjB,IAAI,UAAU;CACd,KAAK,MAAM,KAAK,IAAI,YAAY,IAAI,MAAM;CAC1C,OAAO,WAAW,GAAG,UAAU,SAAS,IAAI;AAC9C;;AAGA,IAAM,aAAa,OAAiB;CAClC,MAAM,MAAM,GAAG,MAAM;CAErB,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC;CACxB,OAAO;AACT;;AAGA,SAAS,WAAW,QAAkB,GAAW;CAC/C,MAAM,MAAM,OAAO,SAAS,KAAK;CACjC,MAAM,KAAK,KAAK,MAAM,EAAE;CACxB,MAAM,KAAK,KAAK,IAAI,KAAK,GAAG,OAAO,SAAS,CAAC;CAC7C,OAAO,OAAO,OAAQ,OAAO,MAAO,OAAO,QAAS,KAAK;AAC3D;;AAGA,SAAS,UAAU,KAA2C;CAC5D,MAAM,IAAI,SAAS,GAAG;CACtB,IAAI,aAAa,CAAC,GAAG,OAAO;CAC5B,IAAI,OAAO,MAAM,UAAU,OAAO;CAClC,IAAI,OAAO,MAAM,UAAU,OAAO,SAAS,EAAE,KAAK,CAAC;CACnD,OAAO,KAAK,OAAO,IAAI;AACzB;;AAGA,IAAM,WAAW,WAAmB,SAAS,KAAK,MAAM,MAAM,CAAC;;AAG/D,IAAM,aAAa,MAAc,OAAe,SAC7C,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG,IAAI,KAAK,IAAI,MAAM,IAAI,EAAE,KAAK;;AAG9D,IAAM,aAAa,aAAsB,KAAK,MAAM,MAAM,IAAI,KAAK,IAAK,KAAK;;AAG7E,SAAS,WAAW,KAAqD;CACvE,MAAM,sBAAM,IAAI,IAAY;CAC5B,IAAI,OAAO,MAAM,OAAO;CACxB,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG,CAAC,GAAG;EACnC,IAAI,aAAa,KAAK,GAAG,OAAO;EAChC,IAAI,SAAS,QAAQ,UAAU,IAAI;EACnC,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC;EAChF,IAAI,UAAU,MAAM,OAAO;EAC3B,IAAI,IAAI,KAAK,MAAM,MAAM,CAAC;CAC5B;CACA,OAAO;AACT;AAEA,IAAM,aAAa,WAAmB;CACpC,MAAM,MAAM,UAAU,MAAM;CAC5B,OAAO,QAAQ,KAAK,QAAQ;AAC9B;;AAGA,IAAM,WAAW;;AAGjB,SAAS,gBAAgB,MAAc,IAAY;CACjD,MAAM,QAAQ,KAAK,OAAO,KAAK,OAAO,KAAK,CAAC;CAC5C,IAAI,QAAQ,QAAQ;CACpB,KAAK,IAAI,MAAM,OAAO,QAAQ,GAAG,OAAO,IAAI,OAAO,IAAI,UAAU,GAAG,GAAG;CACvE,OAAO;AACT;;AAGA,SAAS,WAAW,KAAa,GAAW;CAC1C,MAAM,OAAO,IAAI,IAAI,KAAK;CAC1B,IAAI,OAAO,KAAK,IAAI,CAAC;CACrB,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,OAAO,KAAK,CAAC,IAAI;CACtD,OAAO,OAAO,QAAQ;CACtB,QAAQ,QAAQ;CAChB,OAAO,OAAO,GAAG;EACf,OAAO;EACP,IAAI,UAAU,GAAG,GAAG;CACtB;CACA,OAAO;AACT;;AAGA,SAAS,gBAAgB,UAAuB,MAAc,IAAY;CACxE,IAAI,QAAQ;CACZ,KAAK,MAAM,OAAO,UAAU,IAAI,OAAO,QAAQ,OAAO,MAAM,UAAU,GAAG,GAAG;CAC5E,OAAO;AACT;;AAGA,IAAM,cAAsC;CAC1C,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,SAAS,QAAQ,QAAgB;CAC/B,MAAM,MAAM,KAAK,MAAM,MAAM;CAC7B,MAAM,WAAW,OAAQ,UAAU,GAAG,IAAI,KAAK,IAAK;CACpD,MAAM,OAAO,IAAI,KAAK,WAAW,QAAa,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,eAAe;CACrF,OAAO,KAAK,OAAO,WAAW,UAAU,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI;AAC9D;;AAGA,SAAS,YAAY,GAAW,WAAmB,YAAqB;CACtE,MAAM,MAAM,aAAa,EAAE,YAAY,IAAI;CAC3C,MAAM,SAAS,aAAa,UAAU,YAAY,IAAI;CACtD,MAAM,MAAgB,CAAC;CAEvB,IAAI,CAAC,QAAQ;EACX,KAAK,IAAI,KAAK,GAAG,MAAM,EAAE,QAAQ,MAAM,IAAI,KAAK,EAAE;EAClD,OAAO;CACT;CACA,KAAK,IAAI,KAAK,IAAI,QAAQ,MAAM,GAAG,OAAO,IAAI,KAAK,IAAI,QAAQ,QAAQ,KAAK,OAAO,MAAM,GACvF,IAAI,KAAK,EAAE;CACb,OAAO;AACT;;AAGA,SAAS,QAAQ,MAAc,MAAc,IAAY,IAAY,MAAc;CACjF,IAAI,SAAS,GAAG,OAAO,EAAE,KAAK,MAAM;CACpC,MAAM,QAAQ,IAAI,SAAS;CAC3B,OAAQ,EAAE,KAAK,OAAO,MAAM,SAAU,IAAI,OAAO,SAAS,OAAO;AACnE;;AAKA,SAAS,SAAS,MAAkB,GAAwB;CAC1D,MAAM,OAAO,OAAO,IAAI;CACxB,OAAO,SAAS,SAAS,SAAS,CAAC,IAAI,SAAS,SAAS,SAAS,CAAC,IAAI;AACzE;AAEA,IAAM,OAAO,OAAiB,GAAG,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC;AAE1D,IAAa,mBAAoC;CAE/C,oBAAoB;EAClB,MAAM;EACN,MAAM,SAAS;GACb,MAAM,KAAK,UAAU,IAAI;GACzB,IAAI,aAAa,EAAE,GAAG,OAAO;GAC7B,MAAM,QAAQ,OAAO,IAAI,EAAE,CAAC;GAE5B,OAAO,OAAO,UAAU,YAAY,OAAO,IAAI,MAAM,SAAS,WAAW,KAAK,IAAI;EACpF;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM,SAAS;GACb,MAAM,KAAK,UAAU,IAAI;GACzB,OAAO,aAAa,EAAE,IAAI,KAAK,OAAO,GAAG,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC;EACrE;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,SAAS;GACb,MAAM,KAAK,UAAU,IAAI;GACzB,IAAI,aAAa,EAAE,GAAG,OAAO;GAC7B,OAAO,GAAG,SAAS,SAAS,MAAM,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI;EAC3D;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM,SAAS;GACb,MAAM,KAAK,UAAU,IAAI;GACzB,OAAO,aAAa,EAAE,IAAI,KAAK,GAAG,SAAS,SAAS,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI;EAC/E;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM,SAAS;GACb,MAAM,KAAK,UAAU,IAAI;GACzB,OAAO,aAAa,EAAE,IAAI,KAAK,GAAG,SAAS,SAAS,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC,IAAI;EAC/E;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM,SAAS;GACb,IAAI,IAAI;GACR,KAAK,MAAM,OAAO,MAChB,IAAI,QAAQ,GAAG,GACR;SAAA,MAAM,KAAK,MAAM,IAAI,QAAQ,GAAG,IAAI,OAAO,MAAM,YAAY,SAAS,CAAC,KAAK,MAAM;GAAA,OAClF,IAAI,OAAO,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC,GAAG;GAE1D,OAAO;EACT;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM,SAAS;GACb,IAAI,IAAI;GACR,KAAK,MAAM,SAAS,SAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,UAAU,IAAI;GACvE,OAAO;EACT;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,SAAS;GACd,MAAM,QAAQ,QAAQ,GAAI;GAC1B,IAAI,SAAS;GACb,KAAK,MAAM,KAAK,MAAM,MAAM,QAAQ,GAAG,IAAI,KAAK,QAAQ,MAAM,IAAI;GAClE,OAAO,MAAM,OAAO,MAAM,OAAO;EACnC;CACF,CAAC;CACD,KAAK,OAAO,KAAK,KAAK,CAAC;CACvB,KAAK,OAAO,KAAK,OAAO,CAAC;CACzB,KAAK,SAAS,MAAO,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,GAAI,CAAC;CACnD,KAAK,UAAU,GAAG,MAAM,KAAK,GAAG,CAAC;CACjC,KAAK,QAAQ,GAAG,MAAO,MAAM,IAAI,OAAO,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,GAAI,CAAC;CACrE,KAAK,UAAU,GAAG,IAAI,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC;CAC/C,KAAK,YAAY,GAAG,IAAI,MAAM,QAAQ,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;CACvD,KAAK,cAAc,GAAG,IAAI,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC;CAG3D,oBAAoB;EAClB,MAAM;EACN,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,MAAM,MAAM,eAAe;GAChC,MAAM,IAAI,KAAK,KAAM,CAAC;GACtB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,IAAI,GAAG,OAAO,OAAO,KAAM,CAAC;GAC5B,OAAO,YAAY,OAAO,UAAU,CAAC,IAAI;EAC3C;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM;EACN,SAAS;EACT,MAAM,SAAS;GACb,IAAI,KAAK,SAAS,GAAG,OAAO;GAC5B,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;IACvC,MAAM,IAAI,KAAK,KAAK,EAAE,CAAE,CAAC;IACzB,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,IAAI,GAAG,OAAO,OAAO,KAAK,IAAI,EAAE,CAAE,CAAC;GACrC;GACA,OAAO;EACT;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,cAAc;GAC1B,MAAM,IAAI,SAAS,MAAO,CAAC;GAC3B,OAAO,aAAa,CAAC,IAAK,SAAS,SAAU,CAAC,KAAK,IAAM,KAAK;EAChE;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,cAAc;GAC1B,MAAM,IAAI,SAAS,MAAO,CAAC;GAC3B,OAAO,MAAM,KAAM,SAAS,SAAU,CAAC,KAAK,IAAM,KAAK;EACzD;CACF,CAAC;CACD,GAAI,CAAC,OAAO,IAAI,CAAC,CAAW,KAAK,SAC/B,oBAAoB;EAClB;EACA,SAAS;EACT,MAAM,SAAS;GACb,IAAI,OAAO;GACX,IAAI,MAAM,SAAS;GACnB,KAAK,MAAM,OAAO,MAAM;IACtB,MAAM,SAAS,QAAQ,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC;KAAC;KAAG;KAAG;IAAG,CAAU;IACnE,KAAK,MAAM,KAAK,UAAU,QAAQ;KAEhC,IAAI,SAAS,QAAS,QAAQ,GAAG,KAAK,OAAO,UAAU,UAAW;KAClE,MAAM,IAAI,UAAU,KAAK;KACzB,IAAI,aAAa,CAAC,GAAG,OAAO;KAC5B,OAAO;KACP,IAAI,SAAS,SAAS,CAAC,GAAG,MAAM;KAChC,IAAI,SAAS,QAAQ,GAAG,MAAM;IAChC;GACF;GACA,OAAO,OAAO,MAAM;EACtB;CACF,CAAC,CACH;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO;GACZ,MAAM,IAAI,KAAK,CAAE;GACjB,OAAO,aAAa,CAAC,IAAI,IAAI,CAAC;EAChC;CACF,CAAC;CACD,GACE;EACE,CAAC,YAAY,MAAmB,KAAK,IAAI;EACzC,CAAC,aAAa,MAAmB,OAAO,MAAM,QAAQ;EACtD,CAAC,WAAW,MAAmB,OAAO,MAAM,QAAQ;EACpD,CAAC,YAAY,MAAmB,aAAa,CAAC,CAAC;EAC/C,CAAC,SAAS,MAAmB,MAAM,EAAE;CACvC,CAAC,CACD,KAAK,CAAC,MAAM,UACZ,oBAAoB;EAAE;EAAM,SAAS;EAAG,SAAS;EAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAE,CAAC;CAAE,CAAC,CACxF;CAGA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,UAAU,OAAO,YAAY;GAClC,MAAM,SAAS,OAAO,SAAS,QAAS,CAAC;GACzC,IAAI,aAAa,MAAM,GAAG,OAAO;GACjC,MAAM,QAAQ,SAAS,KAAA,IAAY,SAAS,SAAS,IAAI;GACzD,IAAI,CAAC,aAAa,KAAK,GAAG,QAAQ,OAAO,MAAM;GAC/C,OAAO,SAAS;EAClB;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM,SAAS;GACb,IAAI,MAAM;GACV,KAAK,MAAM,SAAS,SAAS,IAAI,GAAG;IAClC,MAAM,IAAI,OAAO,KAAK;IACtB,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,OAAO;GACT;GACA,OAAO;EACT;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,SAAS;GACb,IAAI,MAAM;GACV,KAAK,MAAM,OAAO,MAAM;IACtB,MAAM,IAAI,KAAK,GAAG;IAClB,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,OAAO;GACT;GACA,OAAO;EACT;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW,aAAa,GAAG,UAAU;GAC1C,MAAM,IAAI,KAAK,SAAU;GACzB,MAAM,OAAO,KAAK,WAAY;GAC9B,MAAM,QAAQ,WAAW,GAAG,IAAI;GAChC,IAAI,OAAO,OAAO;GAClB,MAAM,QAAkB,CAAC;GACzB,KAAK,MAAM,SAAS,SAAS,IAAI,GAAG;IAClC,MAAM,IAAI,OAAO,KAAK;IACtB,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,IAAI,MAAM,MAAM,CAAC,MAAM,MAAM,KAAK,CAAC;GACrC;GACA,OAAO,MAAM,KAAK,CAAW;EAC/B;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,GAAG,OAAO;GACf,MAAM,IAAI,KAAK,CAAE;GACjB,MAAM,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC;GACnC,MAAM,QAAQ,WAAW,GAAG,KAAK;GACjC,IAAI,OAAO,OAAO;GAClB,OAAQ,QAAmB,IAAI,QAAQ,CAAC,GAAI,CAAY,CAAC,CAAC,MAAM,GAAG,KAAe,CAAC,CAAC,KAAK,EAAE;EAC7F;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,GAAG,OAAO;GACf,MAAM,IAAI,KAAK,CAAE;GACjB,MAAM,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC;GACnC,MAAM,QAAQ,WAAW,GAAG,KAAK;GACjC,IAAI,OAAO,OAAO;GAClB,MAAM,QAAQ,CAAC,GAAI,CAAY;GAC/B,OAAQ,QAAmB,IACvB,QACA,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,SAAU,KAAgB,CAAC,CAAC,CAAC,KAAK,EAAE;EACxE;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,GAAG,OAAO,OAAO;GACtB,MAAM,IAAI,KAAK,CAAE;GACjB,MAAM,OAAO,IAAI,KAAM;GACvB,MAAM,QAAQ,IAAI,CAAE;GACpB,MAAM,QAAQ,WAAW,GAAG,MAAM,KAAK;GACvC,IAAI,OAAO,OAAO;GAClB,IAAK,OAAkB,KAAM,QAAmB,GAAG,OAAO;GAC1D,OAAO,CAAC,GAAI,CAAY,CAAC,CACtB,MAAO,OAAkB,GAAI,OAAkB,IAAK,KAAgB,CAAC,CACrE,KAAK,EAAE;EACZ;CACF,CAAC;CACD,OAAO,QAAQ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;CAClC,OAAO,SAAS,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,UAAU,GAAG,CAAC;CACrD,OAAO,UAAU,MAAM,EAAE,YAAY,CAAC;CACtC,OAAO,UAAU,MAAM,EAAE,YAAY,CAAC;CACtC,OAAO,UAAU,GAAG,MAAM,MAAM,GAAG,CAAC;CACpC,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,GAAG,OAAO;GACf,MAAM,IAAI,KAAK,CAAE;GACjB,MAAM,QAAQ,IAAI,CAAE;GACpB,MAAM,QAAQ,WAAW,GAAG,KAAK;GACjC,IAAI,OAAO,OAAO;GAClB,OAAQ,QAAmB,IAAI,QAAS,EAAa,OAAO,KAAK,MAAM,KAAe,CAAC;EACzF;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,GAAG,MAAM,IAAI,WAAW;GAC7B,MAAM,IAAI,KAAK,CAAE;GACjB,MAAM,IAAI,KAAK,IAAK;GACpB,MAAM,IAAI,KAAK,EAAG;GAClB,MAAM,MAAM,SAAS,OAAO,OAAO,IAAI,KAAK;GAC5C,MAAM,QAAQ,WAAW,GAAG,GAAG,GAAG,GAAG;GACrC,IAAI,OAAO,OAAO;GAClB,IAAI,MAAM,IAAI,OAAO;GACrB,IAAI,OAAO,MAAM,OAAQ,EAAa,MAAM,CAAW,CAAC,CAAC,KAAK,CAAW;GACzE,IAAI,KAAK;GACT,KAAK,IAAI,IAAI,GAAG,IAAK,KAAgB,KAAK;IACxC,KAAM,EAAa,QAAQ,GAAa,KAAK,CAAC;IAC9C,IAAI,OAAO,IAAI,OAAO;GACxB;GACA,OAAQ,EAAa,MAAM,GAAG,EAAE,IAAI,IAAK,EAAa,MAAM,KAAM,EAAa,MAAM;EACvF;CACF,CAAC;CACD,GAAI,CAAC,QAAQ,QAAQ,CAAC,CAAW,KAAK,SACpC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,MAAM,QAAQ,WAAW;GAC9B,MAAM,IAAI,KAAK,IAAK;GACpB,MAAM,IAAI,KAAK,MAAO;GACtB,MAAM,OAAO,SAAS,OAAO,IAAI,IAAI,KAAK;GAC1C,MAAM,QAAQ,WAAW,GAAG,GAAG,IAAI;GACnC,IAAI,OAAO,OAAO;GAClB,MAAM,KACJ,SAAS,SACJ,EAAa,QAAQ,GAAc,OAAkB,CAAC,IACtD,EAAa,YAAY,CAAC,CAAC,QAAS,EAAa,YAAY,GAAI,OAAkB,CAAC;GAC3F,OAAO,OAAO,KAAK,QAAQ,KAAK;EAClC;CACF,CAAC,CACH;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,SAAS,YAAY;GACjC,MAAM,IAAI,SAAS,KAAM;GACzB,MAAM,IAAI,KAAK,MAAO;GACtB,MAAM,QAAQ,WAAW,GAAG,CAAC;GAC7B,IAAI,OAAO,OAAO;GAElB,MAAM,QAAQ,OAAO,MAAM,YAAY,aAAa,CAAW,IAAI,SAAS,CAAC,IAAI;GACjF,OAAO,YAAY,OAA2C,GAAa,QAAQ,MAAM;EAC3F;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,WAAW;GAChB,MAAM,IAAI,SAAS,KAAM;GACzB,OAAO,OAAO,MAAM,YAAY,QAAQ,SAAS,CAAC;EACpD;CACF,CAAC;CAGD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM,GAAG,MAAM,SAAS,EAAE,GAAG;CAC/B,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,UAAU;EACV,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,WAAW,CAAC;CACtF,CAAC;CACD,KACE,SACC,GAAG,GAAG,MAAM;EACX,MAAM,OAAO,KAAK,MAAM,CAAC,IAAI,OAAO,KAAK,MAAM,CAAC,IAAI,OAAO,KAAK,MAAM,CAAC;EACvE,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC;EAC1D,OAAO,OAAO,MAAM,EAAE,IAAI,MAAM,UAAU,KAAK,KAAK,IAAI,MAAM,IAAI,EAAE,KAAK,KAAU;CACrF,GACA,CACF;CACA,GAAI;EAAC;EAAQ;EAAS;CAAK,CAAC,CAAW,KAAK,SAC1C,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,WAAW;GAChB,MAAM,IAAI,SAAS,KAAM;GACzB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,QAAQ,UAAU,CAAC;GACzB,IAAI,CAAC,OAAO,OAAO;GACnB,OAAO,SAAS,SAAS,MAAM,OAAO,SAAS,UAAU,MAAM,QAAQ,MAAM;EAC/E;CACF,CAAC,CACH;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,UAAU;GACtB,MAAM,QAAQ,UAAU,SAAS,KAAM,CAAC;GACxC,MAAM,IAAI,QAAQ,OAAO,IAAI,IAAI,IAAI;GACrC,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,IAAI,CAAC,OAAO,OAAO;GAEnB,MAAM,YAAa,KAAK,MAAM,MAAM,MAAM,IAAI,KAAK,IAAK,KAAK;GAC7D,IAAI,MAAM,GAAG,OAAO,UAAU;GAC9B,IAAI,MAAM,GAAG,QAAS,UAAU,KAAK,IAAK;GAC1C,IAAI,MAAM,GAAG,QAAQ,UAAU,KAAK;GACpC,OAAO;EACT;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,KAAK,UAAU;GAC3B,MAAM,IAAI,UAAU,SAAS,KAAM,CAAC;GACpC,MAAM,IAAI,UAAU,SAAS,GAAI,CAAC;GAClC,MAAM,IAAI,KAAK,IAAK;GACpB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO;GACrB,IAAI,EAAE,SAAS,EAAE,QAAQ,OAAO;GAChC,MAAM,UAAU,EAAE,OAAO,EAAE,QAAQ,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI;GACnF,QAAS,EAAa,YAAY,GAAlC;IACE,KAAK,KACH,OAAO,KAAK,MAAM,SAAS,EAAE;IAC/B,KAAK,KACH,OAAO;IACT,KAAK,KACH,OAAO,KAAK,MAAM,EAAE,MAAM,IAAI,KAAK,MAAM,EAAE,MAAM;IACnD,KAAK,MACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE;IACvF,KAAK,MACH,OAAO,SAAS;IAClB,KAAK,MAAM;KACT,MAAM,OACJ,EAAE,QAAQ,EAAE,SAAU,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAO,EAAE,OAAO,EAAE,OAAO;KACnF,MAAM,OAAO,KAAK,IAAI,MAAM,EAAE,QAAQ,GAAG,EAAE,GAAG;KAC9C,MAAM,KAAK,KAAK,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAG,EAAE,GAAG;KAC9C,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAU;IAC5C;IACA,SACE,OAAO;GACX;EACF;CACF,CAAC;CAGD,GAAI,CAAC,SAAS,WAAW,CAAC,CAAW,KAAK,SACxC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,UAAU,cAAc;GACpC,MAAM,QAAQ,QAAQ,KAAM;GAC5B,MAAM,IAAI,SAAS,QAAS;GAC5B,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,SAAS,YAAY,OAAO,QAAQ,QAAQ,QAAQ;GAC1D,IAAI,QAAQ;GACZ,IAAI,QAAQ;GACZ,KAAK,MAAM,CAAC,GAAG,QAAQ,YAAY,OAAO,CAAC,GAAyB;IAClE,MAAM,IAAI,IAAI,OAAO,QAAQ,MAAM,OAAO,OAAO,OAAO,GAAG,GAAG,GAAG,IAAI;IACrE,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,IAAI,OAAO,MAAM,UAAU;KACzB,SAAS;KACT;IACF;GACF;GACA,IAAI,SAAS,SAAS,OAAO;GAC7B,OAAO,QAAQ,QAAQ,QAAQ;EACjC;CACF,CAAC,CACH;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,cAAc;GAC1B,MAAM,IAAI,SAAS,QAAS;GAC5B,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,OAAQ,YAAY,QAAQ,KAAM,GAAG,CAAC,CAAC,CAAwB;EACjE;CACF,CAAC;CACD,GAAI,CAAC,UAAU,YAAY,CAAC,CAAW,KAAK,SAC1C,oBAAoB;EAClB;EACA,SAAS;EACT,MAAM,CAAC,QAAQ,GAAG,WAAW;GAC3B,IAAI,MAAM,SAAS,GAAG,OAAO;GAC7B,MAAM,SAAS,CAAC,QAAQ,MAAO,CAAC;GAChC,MAAM,WAA0B,CAAC,IAAI;GACrC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;IACxC,OAAO,KAAK,QAAQ,MAAM,EAAG,CAAC;IAC9B,MAAM,IAAI,SAAS,MAAM,IAAI,EAAG;IAChC,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,SAAS,KAAK,CAAC;GACjB;GACA,MAAM,QAAQ,SAAS,OAAO,MAAM,CAAC,GAAG,SAAS,MAAM,CAAC,CAAC;GACzD,IAAI,aAAa,KAAK,GAAG,OAAO;GAChC,IAAI,OAAO,EAAE,CAAE,SAAS,OAAO,EAAE,CAAE,QAAQ,OAAO,EAAE,CAAE,SAAS,OAAO,EAAE,CAAE,MAAM,OAAO;GACvF,IAAI,QAAQ;GACZ,IAAI,QAAQ;GACZ,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO;IAC1B,MAAM,IAAI,OAAO,EAAE,CAAE,GAAG,GAAG,CAAC;IAC5B,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,IAAI,OAAO,MAAM,UAAU;KACzB,SAAS;KACT;IACF;GACF;GACA,IAAI,SAAS,UAAU,OAAO;GAC9B,OAAO,QAAQ,QAAQ,QAAQ;EACjC;CACF,CAAC,CACH;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,SAAS;GACb,IAAI,KAAK,SAAS,GAAG,OAAO;GAC5B,MAAM,SAA0B,CAAC;GACjC,MAAM,WAA0B,CAAC;GACjC,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;IACvC,OAAO,KAAK,QAAQ,KAAK,EAAG,CAAC;IAC7B,MAAM,IAAI,SAAS,KAAK,IAAI,EAAG;IAC/B,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,SAAS,KAAK,CAAC;GACjB;GACA,MAAM,QAAQ,SAAS,QAAQ,QAAQ;GACvC,OAAO,aAAa,KAAK,IAAI,QAAQ,MAAM;EAC7C;CACF,CAAC;CAGD,GAAI,CAAC,WAAW,SAAS,CAAC,CAAW,KAAK,SACxC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,OAAO,OAAO,iBAAiB;GAC3C,MAAM,IAAI,SAAS,KAAM;GACzB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,IAAI,QAAQ,KAAM;GACxB,MAAM,IAAI,IAAI,KAAM;GACpB,MAAM,SAAS,eAAe,OAAO,OAAO,KAAK,WAAW;GAC5D,MAAM,QAAQ,WAAW,GAAG,MAAM;GAClC,IAAI,OAAO,OAAO;GAClB,MAAM,IAAI,KAAK,MAAM,CAAW;GAChC,MAAM,WAAW,SAAS;GAC1B,MAAM,SAAS,WAAW,EAAE,OAAO,EAAE;GACrC,IAAI,IAAI,KAAK,KAAK,WAAW,EAAE,OAAO,EAAE,OAAO,OAAO,IAAI,IAAI,QAAQ,WAAW,GAAG,OAAO;GAC3F,MAAM,OAAO,MAAe,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC;GAC7D,MAAM,QAAQ,SACV,YAAY,GAAG,QAAQ,GAAG,IAC1B,YAAY,GAAG,QAAQ,KAAK,OAAO,KAAK,OAAO,CAAC,CAAC,IAAI,aAAa,OAAO;GAC7E,IAAI,UAAU,IAAI,OAAO;GACzB,OAAO,WAAW,EAAE,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,KAAK;EAC1D;CACF,CAAC,CACH;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,OAAO,UAAU;GAC7B,MAAM,IAAI,SAAS,KAAM;GACzB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,IAAI,QAAQ,KAAM;GACxB,IAAI,EAAE,OAAO,KAAK,EAAE,OAAO,GAAG,OAAO;GACrC,MAAM,IAAI,QAAQ,OAAO,IAAI,IAAI,IAAI;GACrC,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;GACtC,MAAM,MAAM,MAAe,EAAE,OAAO,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC;GAC9D,IAAI;GACJ,IAAI,MAAM,GACR,QAAQ,YACN,GACA,QACA,IACA,OAAO,MAAM,YAAY,OAAO,KAAK,CAAC,IAAI,aAAa,OACzD;QACG,IAAK,IAAe,GAAG,QAAQ,YAAY,GAAG,QAAQ,EAAE;QACxD;IAEH,QAAQ;IACR,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;KAC/B,MAAM,IAAI,GAAG,CAAC;KACd,IAAI,KAAK,MAAM;KACf,IAAI,cAAc,GAAG,CAAC,KAAK,GAAG,QAAQ;UACjC;IACP;GACF;GACA,OAAO,UAAU,KAAK,KAAK,QAAQ;EACrC;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,KAAK,SAAS;GAC1B,MAAM,IAAI,QAAQ,KAAM;GACxB,MAAM,KAAK,IAAI,GAAI;GACnB,MAAM,KAAK,OAAO,OAAO,IAAI,IAAI,GAAG;GACpC,MAAM,QAAQ,WAAW,IAAI,EAAE;GAC/B,IAAI,OAAO,OAAO;GAClB,IAAI,IAAI,KAAK,MAAM,EAAY;GAC/B,IAAI,IAAI,KAAK,MAAM,EAAY;GAE/B,IAAI,OAAO,QAAQ,EAAE,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC;GAC/C,IAAI,IAAI,KAAK,IAAI,GAAG,OAAO;GAC3B,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM,OAAO,WAAW,GAAG,OAAO;GAC1D,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;EAC1B;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,QAAQ,SAAS,UAAU,WAAW,gBAAgB;GAClE,MAAM,IAAI,SAAS,MAAO,CAAC;GAC3B,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,IAAI,QAAQ,OAAQ,CAAC;GAC3B,MAAM,MAAM,QAAQ,QAAS,CAAC;GAC9B,IAAI,EAAE,OAAO,KAAK,EAAE,OAAO,GAAG,OAAO;GACrC,MAAM,OAAO,YAAY,IAAI,UAAU,CAAC,IAAI;GAC5C,MAAM,SAAS,aAAa,IAAI,WAAW,CAAC,IAAI;GAChD,MAAM,QAAQ,WAAW,MAAM,MAAM;GACrC,IAAI,OAAO,OAAO;GAClB,MAAM,WAAW,EAAE,OAAO,KAAK,EAAE,SAAS;GAC1C,MAAM,SAAS,WAAW,EAAE,OAAO,EAAE;GACrC,KAAK,WAAW,IAAI,OAAO,IAAI,UAAU,QAAQ,OAAO;GACxD,MAAM,MAAM,MAAe,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC;GAC5D,MAAM,MACJ,SAAS,IACL,UACA,SAAS,KACP,UACA,SAAS,IACP,UACA,SAAS,IACP,aACA;GACZ,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,YAAY,GAAG,QAAQ,IAAI,KAAM,SAAoB,CAAC;GACpE,IAAI,UAAU,IAAI,OAAO,WAAY,SAAS,SAAS,CAAC,KAAK,IAAK;GAClE,OAAO,WAAW,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG,GAAG,KAAK;EACtD;CACF,CAAC;CAED,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,SAAS;GACb,MAAM,SAAS,KAAK,IAAI,OAAO;GAC/B,MAAM,QAAQ,OAAO;GACrB,IAAI,OAAO,MAAM,MAAM,EAAE,SAAS,MAAM,QAAQ,EAAE,SAAS,MAAM,IAAI,GAAG,OAAO;GAC/E,IAAI,QAAQ;GACZ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,KAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,KAAK;IACnC,IAAI,UAAU;IACd,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,IAAI,MAAM,GAAG,GAAG,CAAC;KACvB,IAAI,aAAa,CAAC,GAAG,OAAO;KAE5B,WAAW,OAAO,MAAM,WAAW,IAAI;IACzC;IACA,SAAS;GACX;GACF,OAAO,OAAO,KAAK;EACrB;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,SAAS;GACb,MAAM,KAAK,QAAQ,MAAM,GAAG,GAAG;GAC/B,OAAO,aAAa,EAAE,IAAI,KAAK,SAAS,MAAM,WAAW,UAAU,EAAE,GAAG,EAAG,CAAC;EAC9E;CACF,CAAC;CACD,GAAI,CAAC,SAAS,OAAO,CAAC,CAAW,KAAK,SACpC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,QAAQ,SAAS;GACtB,MAAM,KAAK,UAAU,CAAC,MAAO,CAAC;GAC9B,MAAM,IAAI,IAAI,GAAI;GAClB,MAAM,QAAQ,WAAW,IAAI,CAAC;GAC9B,IAAI,OAAO,OAAO;GAClB,MAAM,OAAO,UAAU,EAAc;GACrC,MAAM,IAAI,KAAK,KAAK,CAAW;GAC/B,IAAI,IAAI,KAAK,IAAI,KAAK,QAAQ,OAAO;GACrC,OAAO,SAAS,UAAU,KAAK,IAAI,KAAM,KAAK,KAAK,SAAS;EAC9D;CACF,CAAC,CACH;CACA,GAAI,CAAC,QAAQ,SAAS,CAAC,CAAW,KAAK,SACrC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,QAAQ,WAAW;GAC/B,MAAM,IAAI,IAAI,KAAM;GACpB,MAAM,KAAK,UAAU,CAAC,QAAQ,MAAO,CAAC,CAAC;GACvC,MAAM,iBAAiB,SAAS,OAAO,QAAQ,KAAK,KAAK;GACzD,MAAM,QAAQ,WAAW,GAAG,IAAI,cAAc;GAC9C,IAAI,OAAO,OAAO;GAClB,IAAI,CAAE,GAAgB,SAAS,CAAW,GAAG,OAAO;GACpD,IAAI,OAAO;GACX,KAAK,MAAM,KAAK,IACd,IAAI,iBAAiB,IAAK,IAAe,IAAK,GAAc;GAC9D,OAAO;EACT;CACF,CAAC,CACH;CACA,GACE;EACE;GAAC;GAAS;GAAM;EAAI;EACpB;GAAC;GAAW;GAAM;EAAI;EACtB;GAAC;GAAW;GAAM;EAAK;EACvB;GAAC;GAAO;GAAO;EAAI;EACnB;GAAC;GAAS;GAAO;EAAI;EACrB;GAAC;GAAS;GAAO;EAAK;CACxB,CAAC,CACD,KAAK,CAAC,MAAM,MAAM,YAClB,oBAAoB;EAClB;EACA,SAAS;EACT,MAAM,SAAS;GACb,MAAM,KAAK,QAAQ,MAAM,SAAS,IAAI,GAAG,IAAI;GAC7C,IAAI,aAAa,EAAE,GAAG,OAAO;GAC7B,MAAM,IAAI,SAAS,IAAI,MAAM;GAC7B,OAAO,OAAO,KAAK,KAAK,CAAC,IAAI;EAC/B;CACF,CAAC,CACH;CACA,GAAI,CAAC,cAAc,gBAAgB,CAAC,CAAW,KAAK,SAClD,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,QAAQ,OAAO;GACpB,MAAM,KAAK,UAAU,CAAC,MAAO,CAAC;GAC9B,MAAM,KAAK,IAAI,CAAE;GACjB,MAAM,QAAQ,WAAW,IAAI,EAAE;GAC/B,IAAI,OAAO,OAAO;GAClB,IAAI,CAAE,GAAgB,UAAW,KAAgB,KAAM,KAAgB,GAAG,OAAO;GACjF,OAAO,KAAK,WAAW,UAAU,EAAc,GAAG,EAAY,CAAC;EACjE;CACF,CAAC,CACH;CACA,GAAI,CAAC,UAAU,QAAQ,CAAC,CAAW,KAAK,SACtC,oBAAoB;EAClB;EACA,SAAS;EACT,MAAM,CAAC,QAAQ,GAAG,WAAW;GAC3B,IAAI,MAAM,SAAS,GAAG,OAAO;GAC7B,MAAM,SAAS,QAAQ,MAAO;GAC9B,MAAM,SAA0B,CAAC;GACjC,MAAM,WAA0B,CAAC;GACjC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;IACxC,OAAO,KAAK,QAAQ,MAAM,EAAG,CAAC;IAC9B,MAAM,IAAI,SAAS,MAAM,IAAI,EAAG;IAChC,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,SAAS,KAAK,CAAC;GACjB;GACA,MAAM,QAAQ,SAAS,QAAQ,QAAQ;GACvC,IAAI,aAAa,KAAK,GAAG,OAAO;GAChC,IAAI,OAAO,SAAS,OAAO,EAAE,CAAE,QAAQ,OAAO,SAAS,OAAO,EAAE,CAAE,MAAM,OAAO;GAC/E,IAAI,OAAsB;GAC1B,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO;IAC1B,MAAM,IAAI,OAAO,GAAG,GAAG,CAAC;IACxB,IAAI,aAAa,CAAC,GAAG,OAAO;IAC5B,IAAI,OAAO,MAAM,UAAU;IAC3B,IAAI,QAAQ,SAAS,SAAS,WAAW,IAAI,OAAO,IAAI,OAAO,OAAO;GACxE;GACA,OAAO,QAAQ;EACjB;CACF,CAAC,CACH;CACA,KACE,YACC,GAAG,OAAO,MAAM;EACf,IAAI,SAAS,GAAG,OAAO;EACvB,IAAI,IAAI,KAAK,OAAO,GAAG,OAAO;EAC9B,OAAO,KAAK,KAAK,KAAK,QAAQ,IAAI,KAAA,CAAM,YAAY,EAAE,CAAC,CAAC,IAAI,IAAI;CAClE,GACA,GACA,CACF;CACA,KACE,UACC,GAAG,OAAO,MAAM;EACf,IAAI,SAAS,GAAG,OAAO,MAAM,IAAI,IAAI;EACrC,IAAI,IAAI,KAAK,OAAO,GAAG,OAAO;EAC9B,OAAO,KAAK,KAAK,MAAM,QAAQ,IAAI,KAAA,CAAM,YAAY,EAAE,CAAC,CAAC,IAAI,IAAI;CACnE,GACA,GACA,CACF;CACA,KACE,WACC,GAAG,SAAS;EACX,IAAI,SAAS,KAAK,MAAM,GAAG,OAAO;EAClC,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,OAAO;EAC7C,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,IAAI;CACzC,GACA,CACF;CACA,KAAK,UAAU,GAAG,IAAI,MAAM,QAAQ,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC;CACvD,KAAK,QAAQ,KAAK,MAAM,CAAC;CACzB,KAAK,YAAY,KAAK,IAAI,CAAC;CAC3B,KAAK,OAAO,KAAK,KAAK,CAAC;CACvB,KAAK,OAAO,MAAO,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,GAAI,CAAC;CACjD,KAAK,UAAU,MAAO,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,GAAI,CAAC;CACtD,KACE,QACC,GAAG,OAAO,OAAO;EAChB,IAAI,KAAK,KAAK,QAAQ,GAAG,OAAO;EAChC,OAAO,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC;CAC9D,GACA,GACA,CACF;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,UAAU;EACV,WAAW,KAAK,OAAO;CACzB,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,UAAU;EACV,MAAM,CAAC,KAAK,UAAU;GACpB,MAAM,IAAI,IAAI,GAAI;GAClB,MAAM,IAAI,IAAI,IAAK;GACnB,MAAM,QAAQ,WAAW,GAAG,CAAC;GAC7B,IAAI,OAAO,OAAO;GAClB,MAAM,KAAK,KAAK,KAAK,CAAW;GAChC,MAAM,KAAK,KAAK,MAAM,CAAW;GACjC,IAAI,KAAK,IAAI,OAAO;GACpB,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,KAAK,EAAE;EACtD;CACF,CAAC;CAGD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,SAAS;GACb,IAAI,OAAO;GACX,IAAI,MAAM;GACV,KAAK,MAAM,OAAO,MAAM;IACtB,MAAM,SAAS,QAAQ,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC;KAAC;KAAG;KAAG;IAAG,CAAU;IACnE,KAAK,MAAM,KAAK,UAAU,QAAQ;KAChC,IAAI,SAAS,QAAS,QAAQ,GAAG,KAAK,OAAO,UAAU,UAAW;KAClE,MAAM,IAAI,UAAU,KAAK;KACzB,IAAI,aAAa,CAAC,GAAG,OAAO;KAC5B,OAAO;KACP,IAAI,GAAG,MAAM,CAAC;IAChB;GACF;GACA,OAAO,OAAO,MAAM;EACtB;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO,GAAG,WAAW;GAC1B,MAAM,IAAI,SAAS,MAAO,CAAC;GAC3B,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK,GAAG;IAC5C,MAAM,IAAI,SAAS,MAAM,EAAE,CAAE,CAAC;IAC9B,IAAI,aAAa,CAAC,GAAG,OAAO;IAE5B,IAAI,cAAc,GAAG,CAAC,MAAM,GAAG,OAAO,OAAO,MAAM,IAAI,EAAE,CAAE,CAAC;GAC9D;GAEA,OAAO,MAAM,SAAS,IAAI,OAAO,MAAM,MAAM,SAAS,EAAE,CAAE,CAAC,IAAI;EACjE;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO,GAAG,YAAY;GAC3B,MAAM,IAAI,IAAI,MAAO,CAAC;GACtB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,KAAK,KAAK,MAAM,CAAC;GACvB,IAAI,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO;GACzC,OAAO,OAAO,OAAO,KAAK,EAAE,CAAE,CAAC;EACjC;CACF,CAAC;CACD,oBAAoB;EAAE,MAAM;EAAM,SAAS;EAAG,WAAW;CAAG,CAAC;CAC7D,GACE,CACE,CAAC,cAAc,MAAmB,OAAO,MAAM,SAAS,GACxD,CAAC,UAAU,MAAmB,aAAa,CAAC,KAAK,MAAM,EAAE,CAC3D,CAAC,CACD,KAAK,CAAC,MAAM,UACZ,oBAAoB;EAAE;EAAM,SAAS;EAAG,SAAS;EAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAE,CAAC;CAAE,CAAC,CACxF;CACA,GAAI,CAAC,UAAU,OAAO,CAAC,CAAW,KAAK,SACrC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO;GACZ,MAAM,IAAI,SAAS,CAAE;GACrB,IAAI,OAAO,MAAM,WAAW,OAAO;GACnC,MAAM,IAAI,SAAS,CAAC;GACpB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,OAAO,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI,MAAM;GAC7C,OAAO,SAAS,WAAW,OAAO,CAAC;EACrC;CACF,CAAC,CACH;CAGA,OAAO,WAAW,MAChB,EACG,YAAY,CAAC,CACb,QACC,0BACC,GAAG,QAAgB,WAAmB,SAAS,OAAO,YAAY,CACrE,CACJ;CAEA,OAAO,UAAU,MAAM,EAAE,QAAQ,oBAAoB,EAAE,CAAC;CACxD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,KAAK,OAAO,OAAO,iBAAiB;GACzC,MAAM,IAAI,KAAK,GAAI;GACnB,MAAM,OAAO,IAAI,KAAM;GACvB,MAAM,IAAI,IAAI,KAAM;GACpB,MAAM,IAAI,KAAK,WAAY;GAC3B,MAAM,QAAQ,WAAW,GAAG,MAAM,GAAG,CAAC;GACtC,IAAI,OAAO,OAAO;GAClB,IAAK,OAAkB,KAAM,IAAe,GAAG,OAAO;GACtD,MAAM,QAAQ,CAAC,GAAI,CAAY;GAC/B,MAAM,KAAK,KAAK,MAAM,IAAc,IAAI;GACxC,OAAO;IAAC,GAAG,MAAM,MAAM,GAAG,EAAE;IAAG;IAAG,GAAG,MAAM,MAAM,KAAK,KAAK,MAAM,CAAW,CAAC;GAAC,CAAC,CAAC,KAAK,EAAE;EACzF;CACF,CAAC;CACD,GAAI,CAAC,cAAc,WAAW,CAAC,CAAW,KAAK,SAC7C,oBAAoB;EAClB;EACA,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,WAAW,UAAU,WAAW,UAAU,gBAAgB;GACtE,MAAM,IAAI,KAAK,MAAO,CAAC;GACvB,MAAM,IAAI,KAAK,UAAW,CAAC;GAE3B,MAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,SAAU,CAAC,IAAI;GACjD,MAAM,OAAO,MAAM,SAAS,IAAI,IAAI,UAAW,CAAC,IAAI;GACpD,MAAM,MAAM,MAAM,QAAQ,IAAI,KAAK,SAAU,CAAC,IAAI;GAClD,MAAM,QAAQ,WAAW,GAAG,GAAG,KAAK,MAAM,GAAG;GAC7C,IAAI,OAAO,OAAO;GAClB,MAAM,SAAS;GACf,MAAM,IAAI,KAAK,MAAM,GAAa;GAClC,IAAI,MAAM,KAAK,KAAK,IAAI,CAAC,IAAI,OAAO,SAAS,GAAG,OAAO;GACvD,MAAM,QAAQ,YAAY,QAAQ,GAAa,SAAS,CAAC;GAEzD,MAAM,SAAS,MAAM,CAAC,GAAG,OAAO,OAAO,MAAM,IAAI;GACjD,MAAM,OAAO,MAAM,CAAC,GAAG,GAAG,KAAK,IAAI;GACnC,MAAM,QAAS,EAAa;GAC5B,IAAI;GACJ,IAAI;GACJ,IAAI,IAAI,GAAG;IACT,IAAI,IAAI,OAAO,QAAQ,OAAO,MAAM,UAAU,IAAK,SAAS,WAAY,CAAC,KAAK,IAAK;IACnF,KAAK,OAAO,IAAI;IAChB,QAAQ,OAAO,OAAO,SAAS,KAAK,KAAK;GAC3C,OAAO;IACL,IAAI,CAAC,IAAI,KAAK,QAAQ,OAAO,MAAM,UAAU,IAAK,SAAS,WAAY,CAAC,KAAK,IAAK;IAClF,KAAK,KAAK,KAAK,SAAS;IACxB,QAAQ,OAAO,OAAO,KAAK,KAAK,SAAS,MAAM,IAAI,IAAI,KAAK;GAC9D;GACA,OAAO,SAAS,eAAe,OAAO,MAAM,GAAG,EAAE,IAAI,OAAO,MAAM,KAAK;EACzE;CACF,CAAC,CACH;CACA,GACE,CACE,CAAC,QAAQ,GAAG,GACZ,CAAC,WAAW,OAAQ,CACtB,CAAC,CACD,KAAK,CAAC,MAAM,UACZ,KACE,OACC,MAAM;EACL,MAAM,OAAO,KAAK,MAAM,CAAC;EACzB,OAAO,OAAO,KAAK,OAAO,OAAO,QAAQ,OAAO,cAAc,IAAI;CACpE,GACA,CACF,CACF;CACA,GAAI,CAAC,QAAQ,SAAS,CAAC,CAAW,KAAK,SACrC,OAAO,OAAO,MAAO,MAAM,KAAK,QAAQ,EAAE,YAAY,CAAC,CAAG,CAC5D;CAGA,KACE,SACC,GAAG,GAAG,MAAM;EACX,MAAM,UAAU,KAAK,MAAM,CAAC,IAAI,OAAO,KAAK,MAAM,CAAC,IAAI,KAAK,KAAK,MAAM,CAAC;EACxE,OAAO,UAAU,IAAI,MAAM,SAAS,UAAU,KAAM;CACtD,GACA,CACF;CACA,GAAI;EAAC;EAAQ;EAAU;CAAQ,CAAC,CAAW,KAAK,SAC9C,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,WAAW;GAChB,MAAM,SAAS,UAAU,KAAM;GAC/B,IAAI,aAAa,MAAM,GAAG,OAAO;GACjC,IAAI,UAAU,QAAQ,SAAS,GAAG,OAAO;GACzC,MAAM,UAAU,KAAK,MAAO,SAAS,IAAK,KAAM,IAAI;GACpD,IAAI,SAAS,QAAQ,OAAO,KAAK,MAAM,UAAU,IAAI;GACrD,IAAI,SAAS,UAAU,OAAO,KAAK,MAAO,UAAU,OAAQ,EAAE;GAC9D,OAAO,UAAU;EACnB;CACF,CAAC,CACH;CACA,GAAI,CAAC,SAAS,SAAS,CAAC,CAAW,KAAK,SACtC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,YAAY;GACxB,MAAM,QAAQ,UAAU,SAAS,KAAM,CAAC;GACxC,MAAM,IAAI,IAAI,MAAO;GACrB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,IAAI,CAAC,OAAO,OAAO;GACnB,MAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,CAAC;GACxC,IAAI,SAAS,WAAW,OAAO,QAAQ,UAAU,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC;GAE1E,MAAM,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW;GACjE,OAAO,QAAQ,UAAU,MAAM,MAAM,OAAO,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC;EACxE;CACF,CAAC,CACH;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,KAAK,WAAW;GACrB,MAAM,IAAI,UAAU,GAAI;GACxB,MAAM,IAAI,UAAU,KAAM;GAC1B,MAAM,QAAQ,WAAW,GAAG,CAAC;GAC7B,IAAI,OAAO,OAAO;GAClB,IAAI,KAAK,QAAQ,KAAK,MAAM,OAAO;GACnC,OAAO,KAAK,MAAM,CAAW,IAAI,KAAK,MAAM,CAAW;EACzD;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,KAAK,cAAc;GAC/B,MAAM,IAAI,UAAU,KAAM;GAC1B,MAAM,IAAI,UAAU,GAAI;GACxB,MAAM,MAAM,WAAW,QAAQ;GAC/B,MAAM,QAAQ,WAAW,GAAG,GAAG,GAAG;GAClC,IAAI,OAAO,OAAO;GAClB,IAAI,KAAK,QAAQ,KAAK,MAAM,OAAO;GACnC,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI,GAAa,CAAW,CAAC;GAC1D,MAAM,KAAK,KAAK,MAAM,KAAK,IAAI,GAAa,CAAW,CAAC;GACxD,MAAM,QAAQ,gBAAgB,MAAM,EAAE,IAAI,gBAAgB,KAAoB,MAAM,EAAE;GACtF,OAAQ,IAAgB,IAAe,CAAC,QAAQ;EAClD;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,MAAM,cAAc;GAChC,MAAM,IAAI,UAAU,KAAM;GAC1B,MAAM,IAAI,IAAI,IAAK;GACnB,MAAM,MAAM,WAAW,QAAQ;GAC/B,MAAM,QAAQ,WAAW,GAAG,GAAG,GAAG;GAClC,IAAI,OAAO,OAAO;GAClB,IAAI,KAAK,MAAM,OAAO;GACtB,MAAM,QAAQ,KAAK,MAAM,CAAW;GACpC,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,UAAU,OAAO;GAClE,MAAM,OAAO,QAAQ,IAAI,KAAK;GAC9B,IAAI,OAAO,KAAK,MAAM,CAAW;GACjC,IAAI,MAAM,WAAW,MAAM,KAAK;GAEhC,SAAS;IACP,MAAM,KAAK,KAAK,IAAI,MAAM,GAAG;IAC7B,MAAM,KAAK,KAAK,IAAI,MAAM,GAAG;IAC7B,MAAM,SAAS,gBACb,KACA,MAAM,OAAO,IAAI,IAAI,IACrB,MAAM,OAAO,IAAI,IAAI,EACvB;IACA,IAAI,CAAC,QAAQ;IACb,OAAO;IACP,MAAM,WAAW,KAAK,SAAS,IAAI;GACrC;GACA,OAAO,MAAM,KAAK,MAAM,WAAW,MAAM,QAAQ,GAAG;EACtD;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,UAAU;GACtB,MAAM,SAAS,UAAU,KAAM;GAC/B,MAAM,IAAI,QAAQ,OAAO,IAAI,IAAI,IAAI;GACrC,MAAM,QAAQ,WAAW,QAAQ,CAAC;GAClC,IAAI,OAAO,OAAO;GAClB,IAAI,UAAU,MAAM,OAAO;GAC3B,IAAI,MAAM,IAAI,OAAO,QAAQ,MAAgB;GAE7C,MAAM,QAAQ,YAAY;GAC1B,IAAI,SAAS,MAAM,OAAO;GAC1B,MAAM,MAAM,KAAK,MAAM,MAAgB;GAEvC,MAAM,QAAQ,UADD,IAAI,KAAK,MAAM,QAAa,KAAK,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,eACzC,GAAM,GAAG,CAAC;GAClC,MAAM,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK;GAC/C,OAAO,KAAK,OAAO,MAAM,QAAQ,SAAS,CAAC,IAAI;EACjD;CACF,CAAC;CACD,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,WAAW;GAChB,MAAM,SAAS,UAAU,KAAM;GAC/B,IAAI,aAAa,MAAM,GAAG,OAAO;GACjC,OAAO,UAAU,OAAO,QAAQ,QAAQ,MAAM;EAChD;CACF,CAAC;CACD,GAAI,CAAC,aAAa,WAAW,CAAC,CAAW,KAAK,SAC5C,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,WAAW;GAChB,MAAM,IAAI,KAAK,KAAM;GACrB,IAAI,aAAa,CAAC,GAAG,OAAO;GAE5B,MAAM,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;GACnC,MAAM,SAAS,OAAO,UAAU,WAAW,SAAS,KAAK,IAAI;GAC7D,IAAI,UAAU,MAAM,OAAO;GAC3B,OAAO,SAAS,cAAc,QAAQ,MAAM,IAAI,SAAS,SAAS,CAAC;EACrE;CACF,CAAC,CACH;CAGA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM,CAAC,OAAO,QAAQ,WAAW,gBAAgB;GAC/C,MAAM,IAAI,SAAS,KAAM;GACzB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,MAAM,IAAI,QAAQ,MAAO;GACzB,IAAI,EAAE,OAAO,KAAK,EAAE,OAAO,GAAG,OAAO;GACrC,MAAM,OAAO,aAAa,OAAO,IAAI,IAAI,SAAS;GAClD,MAAM,SAAS,cAAc,OAAO,IAAI,IAAI,UAAU;GACtD,MAAM,QAAQ,WAAW,MAAM,MAAM;GACrC,IAAI,OAAO,OAAO;GAClB,MAAM,MACJ,SAAS,IACL,UACA,SAAS,KACP,UACA,SAAS,IACP,UACA,SAAS,IACP,aACA;GACZ,IAAI,CAAC,OAAO,CAAC;IAAC;IAAG;IAAI;IAAG;GAAE,CAAC,CAAC,SAAS,MAAgB,GAAG,OAAO;GAC/D,MAAM,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;GACtC,MAAM,MAAM,MAAe,EAAE,OAAO,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC;GAE9D,IAAI,KAAK,IAAI,MAAgB,MAAM,KAAK,QAAQ,YAAY,OAAO;GACnE,MAAM,QACJ,KAAK,IAAI,MAAgB,MAAM,IAC3B,aAAa,GAAG,QAAQ,IAAI,KAAoC,WAAW,EAAE,IAC7E,YAAY,GAAG,QAAQ,IAAI,KAAK,WAAW,EAAE;GACnD,OAAO,UAAU,KAAK,KAAK,QAAQ;EACrC;CACF,CAAC;CACD,GAAI,CAAC,QAAQ,SAAS,CAAC,CAAW,KAAK,SACrC,oBAAoB;EAClB;EACA,SAAS;EACT,SAAS;EACT,MAAM,CAAC,WAAW;GAChB,IAAI,aAAa,KAAK,GAAG,OAAO;GAChC,MAAM,IAAI,QAAQ,KAAM;GACxB,OAAO,SAAS,SAAS,EAAE,OAAO,EAAE;EACtC;CACF,CAAC,CACH;CAGA,KACE,QACC,MAAM,MAAM,IAAI,KAAK,GAAG,OAAO,MAC9B,SAAS,IAAI,MAAM,QAAQ,MAAM,MAAM,IAAI,IAAI,OAAO,IAAI,CAAC,GAC7D,GACA,CACF;CACA,KACE,OACC,MAAM,MAAM,KAAK,KAAK,GAAG,OAAO,MAAM;EACrC,IAAI,SAAS,GAAG,OAAO,EAAE,KAAK,MAAM;EACpC,MAAM,QAAQ,IAAI,SAAS;EAC3B,OAAO,EAAE,KAAK,OAAQ,OAAO,IAAI,QAAQ,OAAO,IAAI,OAAO,OAAO,KAAM;CAC1E,GACA,GACA,CACF;CACA,KACE,OACC,MAAM,MAAM,KAAK,KAAK,GAAG,OAAO,MAAM;EACrC,IAAI,SAAS,GAAG,OAAO,EAAE,KAAK,MAAM;EACpC,MAAM,QAAQ,IAAI,SAAS;EAC3B,OAAO,EAAE,KAAM,OAAO,IAAI,QAAQ,OAAO,IAAI,OAAO,OAAO,KAAM,QAAQ;CAC3E,GACA,GACA,CACF;CACA,oBAAoB;EAClB,MAAM;EACN,SAAS;EACT,MAAM,CAAC,MAAM,GAAG,YAAY;GAC1B,MAAM,IAAI,IAAI,IAAK;GACnB,MAAM,KAAK,UAAU,MAAM;GAC3B,MAAM,QAAQ,WAAW,GAAG,EAAE;GAC9B,IAAI,OAAO,OAAO;GAClB,IAAI,MAAM,IAAI,OAAO;GACrB,IAAI,QAAQ;GACX,GAAiB,SAAS,GAAG,MAAM;IAClC,SAAS,KAAK,IAAK,OAAkB,IAAI;GAC3C,CAAC;GACD,OAAO,OAAO,KAAK;EACrB;CACF,CAAC;AACH"}