@supalive/core 1.11.0 → 1.13.0

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 (228) hide show
  1. package/dist/db-ClCicssQ.js.map +1 -1
  2. package/dist/helper-zdJT5FUc.js +58 -0
  3. package/dist/helper-zdJT5FUc.js.map +1 -0
  4. package/dist/index-BIIcgvu8.d.ts +2300 -0
  5. package/dist/index-BIIcgvu8.d.ts.map +1 -0
  6. package/dist/index-BedlCLem.d.ts +2292 -0
  7. package/dist/index-BedlCLem.d.ts.map +1 -0
  8. package/dist/index-BnV8LnOf.d.ts +2286 -0
  9. package/dist/index-BnV8LnOf.d.ts.map +1 -0
  10. package/dist/index-BziK63TZ.d.ts +2271 -0
  11. package/dist/index-BziK63TZ.d.ts.map +1 -0
  12. package/dist/index-D31hMBDE.d.ts +2288 -0
  13. package/dist/index-D31hMBDE.d.ts.map +1 -0
  14. package/dist/index-DDDAcnJj.d.ts +2208 -0
  15. package/dist/index-DDDAcnJj.d.ts.map +1 -0
  16. package/dist/index-DZhReQWB.d.ts +2288 -0
  17. package/dist/index-DZhReQWB.d.ts.map +1 -0
  18. package/dist/index-DlG8HDCO.d.ts +2215 -0
  19. package/dist/index-DlG8HDCO.d.ts.map +1 -0
  20. package/dist/index-Wgi_dGzj.d.ts +2215 -0
  21. package/dist/index-Wgi_dGzj.d.ts.map +1 -0
  22. package/dist/index-j3YTMNlF.d.ts +2223 -0
  23. package/dist/index-j3YTMNlF.d.ts.map +1 -0
  24. package/dist/mysql-BBbilD4I.js +614 -0
  25. package/dist/mysql-BBbilD4I.js.map +1 -0
  26. package/dist/mysql-BHJ2mrwZ.d.ts +113 -0
  27. package/dist/mysql-BHJ2mrwZ.d.ts.map +1 -0
  28. package/dist/mysql-BQbHJ_rK.js +617 -0
  29. package/dist/mysql-BQbHJ_rK.js.map +1 -0
  30. package/dist/mysql-BXoAON7c.d.ts +113 -0
  31. package/dist/mysql-BXoAON7c.d.ts.map +1 -0
  32. package/dist/mysql-BgfCUYGt.d.ts +113 -0
  33. package/dist/mysql-BgfCUYGt.d.ts.map +1 -0
  34. package/dist/mysql-Br7MqUXg.js +620 -0
  35. package/dist/mysql-Br7MqUXg.js.map +1 -0
  36. package/dist/mysql-BrueWtO9.d.ts +113 -0
  37. package/dist/mysql-BrueWtO9.d.ts.map +1 -0
  38. package/dist/mysql-CCo--z6n.d.ts +113 -0
  39. package/dist/mysql-CCo--z6n.d.ts.map +1 -0
  40. package/dist/mysql-CQcbcZB8.d.ts +113 -0
  41. package/dist/mysql-CQcbcZB8.d.ts.map +1 -0
  42. package/dist/mysql-CbgCY89y.d.ts +113 -0
  43. package/dist/mysql-CbgCY89y.d.ts.map +1 -0
  44. package/dist/mysql-CqD1ZnNY.js +619 -0
  45. package/dist/mysql-CqD1ZnNY.js.map +1 -0
  46. package/dist/mysql-D3Db2q3_.js +619 -0
  47. package/dist/mysql-D3Db2q3_.js.map +1 -0
  48. package/dist/mysql-DBrhTmYm.js +619 -0
  49. package/dist/mysql-DBrhTmYm.js.map +1 -0
  50. package/dist/mysql-DF8eJO-v.d.ts +113 -0
  51. package/dist/mysql-DF8eJO-v.d.ts.map +1 -0
  52. package/dist/mysql-DX7YA7IS.d.ts +113 -0
  53. package/dist/mysql-DX7YA7IS.d.ts.map +1 -0
  54. package/dist/mysql-DZ0_Rsjc.js +614 -0
  55. package/dist/mysql-DZ0_Rsjc.js.map +1 -0
  56. package/dist/mysql-Dko1MJqQ.js +619 -0
  57. package/dist/mysql-Dko1MJqQ.js.map +1 -0
  58. package/dist/mysql-F831ycnw.d.ts +113 -0
  59. package/dist/mysql-F831ycnw.d.ts.map +1 -0
  60. package/dist/mysql-TLPG62tv.js +618 -0
  61. package/dist/mysql-TLPG62tv.js.map +1 -0
  62. package/dist/mysql-XUkTkefP.js +610 -0
  63. package/dist/mysql-XUkTkefP.js.map +1 -0
  64. package/dist/mysql-e-ii74yG.js +613 -0
  65. package/dist/mysql-e-ii74yG.js.map +1 -0
  66. package/dist/overlap-checker-BBkqRdcs.js +259 -0
  67. package/dist/overlap-checker-BBkqRdcs.js.map +1 -0
  68. package/dist/overlap-checker-BdNoCPtA.js +259 -0
  69. package/dist/overlap-checker-BdNoCPtA.js.map +1 -0
  70. package/dist/overlap-checker-DHUJe-Yy.js +259 -0
  71. package/dist/overlap-checker-DHUJe-Yy.js.map +1 -0
  72. package/dist/overlap-checker-DWeQLpSD.js +259 -0
  73. package/dist/overlap-checker-DWeQLpSD.js.map +1 -0
  74. package/dist/overlap-checker-Kz7B_jsp.js +259 -0
  75. package/dist/overlap-checker-Kz7B_jsp.js.map +1 -0
  76. package/dist/postgres-7hJuQX4Y.d.ts +117 -0
  77. package/dist/postgres-7hJuQX4Y.d.ts.map +1 -0
  78. package/dist/postgres-B4H78IkW.js +864 -0
  79. package/dist/postgres-B4H78IkW.js.map +1 -0
  80. package/dist/postgres-B4h8D5U2.d.ts +117 -0
  81. package/dist/postgres-B4h8D5U2.d.ts.map +1 -0
  82. package/dist/postgres-BXFPamkP.js +864 -0
  83. package/dist/postgres-BXFPamkP.js.map +1 -0
  84. package/dist/postgres-C7CHroi9.js +865 -0
  85. package/dist/postgres-C7CHroi9.js.map +1 -0
  86. package/dist/postgres-CoR3TUMd.js +865 -0
  87. package/dist/postgres-CoR3TUMd.js.map +1 -0
  88. package/dist/postgres-D-RsG12a.d.ts +117 -0
  89. package/dist/postgres-D-RsG12a.d.ts.map +1 -0
  90. package/dist/postgres-D5Z1S3J9.d.ts +117 -0
  91. package/dist/postgres-D5Z1S3J9.d.ts.map +1 -0
  92. package/dist/postgres-DHs89iWT.js +864 -0
  93. package/dist/postgres-DHs89iWT.js.map +1 -0
  94. package/dist/postgres-DvBIRnYA.d.ts +117 -0
  95. package/dist/postgres-DvBIRnYA.d.ts.map +1 -0
  96. package/dist/postgres-EXjuHMUi.d.ts +117 -0
  97. package/dist/postgres-EXjuHMUi.d.ts.map +1 -0
  98. package/dist/postgres-Eo-lpUiX.d.ts +117 -0
  99. package/dist/postgres-Eo-lpUiX.d.ts.map +1 -0
  100. package/dist/postgres-VLAGIFLR.d.ts +117 -0
  101. package/dist/postgres-VLAGIFLR.d.ts.map +1 -0
  102. package/dist/postgres-hrQmDPUp.d.ts +117 -0
  103. package/dist/postgres-hrQmDPUp.d.ts.map +1 -0
  104. package/dist/postgres-pXrP9Fx0.d.ts +117 -0
  105. package/dist/postgres-pXrP9Fx0.d.ts.map +1 -0
  106. package/dist/query-Bpw8wO6L.js +730 -0
  107. package/dist/query-Bpw8wO6L.js.map +1 -0
  108. package/dist/query-BuOs9w-U.js +730 -0
  109. package/dist/query-BuOs9w-U.js.map +1 -0
  110. package/dist/query-Xw2hi6TB.js +730 -0
  111. package/dist/query-Xw2hi6TB.js.map +1 -0
  112. package/dist/read-routing-BUcQAwnd.js +62 -0
  113. package/dist/read-routing-BUcQAwnd.js.map +1 -0
  114. package/dist/read-routing-BXflWzQI.js +61 -0
  115. package/dist/read-routing-BXflWzQI.js.map +1 -0
  116. package/dist/read-routing-CcsLp0ow.js +61 -0
  117. package/dist/read-routing-CcsLp0ow.js.map +1 -0
  118. package/dist/realtime_db-B70vqtRZ.js +272 -0
  119. package/dist/realtime_db-B70vqtRZ.js.map +1 -0
  120. package/dist/realtime_db-BMysrWym.js +312 -0
  121. package/dist/realtime_db-BMysrWym.js.map +1 -0
  122. package/dist/realtime_db-Bi7S938D.js +312 -0
  123. package/dist/realtime_db-Bi7S938D.js.map +1 -0
  124. package/dist/realtime_db-CVze3gM0.js +312 -0
  125. package/dist/realtime_db-CVze3gM0.js.map +1 -0
  126. package/dist/realtime_db-DMipkUmD.js +312 -0
  127. package/dist/realtime_db-DMipkUmD.js.map +1 -0
  128. package/dist/realtime_db-XWzuq2JS.js +272 -0
  129. package/dist/realtime_db-XWzuq2JS.js.map +1 -0
  130. package/dist/realtime_db-e3TztUUT.js +272 -0
  131. package/dist/realtime_db-e3TztUUT.js.map +1 -0
  132. package/dist/router-Kgrlci8X.js +337 -0
  133. package/dist/router-Kgrlci8X.js.map +1 -0
  134. package/dist/router-g8qSQb8m.js +314 -0
  135. package/dist/router-g8qSQb8m.js.map +1 -0
  136. package/dist/schema-CWdfWuIj.js +105 -0
  137. package/dist/schema-CWdfWuIj.js.map +1 -0
  138. package/dist/schema-DLue3K2s.js +134 -0
  139. package/dist/schema-DLue3K2s.js.map +1 -0
  140. package/dist/schema-DfowI0ip.js +134 -0
  141. package/dist/schema-DfowI0ip.js.map +1 -0
  142. package/dist/schema-fKldWzwc.js +134 -0
  143. package/dist/schema-fKldWzwc.js.map +1 -0
  144. package/dist/src/client/index.d.ts +1 -1
  145. package/dist/src/client/index.js +69 -29
  146. package/dist/src/client/index.js.map +1 -1
  147. package/dist/src/exports/mysql.d.ts +1 -1
  148. package/dist/src/exports/mysql.js +1 -1
  149. package/dist/src/exports/postgres.d.ts +1 -1
  150. package/dist/src/exports/postgres.js +1 -1
  151. package/dist/src/exports/procedure.d.ts +1 -1
  152. package/dist/src/exports/procedure.js +5 -5
  153. package/dist/src/exports/schema-sql.d.ts +18 -1
  154. package/dist/src/exports/schema-sql.d.ts.map +1 -1
  155. package/dist/src/exports/schema-sql.js +91 -15
  156. package/dist/src/exports/schema-sql.js.map +1 -1
  157. package/dist/src/exports/server.d.ts +11 -4
  158. package/dist/src/exports/server.d.ts.map +1 -1
  159. package/dist/src/exports/server.js +136 -59
  160. package/dist/src/exports/server.js.map +1 -1
  161. package/dist/src/exports/sub-manager-worker-entry.js +1 -1
  162. package/dist/src/exports/types.d.ts +2 -2
  163. package/dist/src/exports/types.js +4 -4
  164. package/dist/sub-worker-dispatch-CO9nVdSG.js +813 -0
  165. package/dist/sub-worker-dispatch-CO9nVdSG.js.map +1 -0
  166. package/dist/sub-worker-dispatch-CQBknEL7.js +813 -0
  167. package/dist/sub-worker-dispatch-CQBknEL7.js.map +1 -0
  168. package/dist/sub-worker-dispatch-CQHeit6D.js +813 -0
  169. package/dist/sub-worker-dispatch-CQHeit6D.js.map +1 -0
  170. package/dist/sub-worker-dispatch-Cl-XnBwq.js +810 -0
  171. package/dist/sub-worker-dispatch-Cl-XnBwq.js.map +1 -0
  172. package/dist/sub-worker-dispatch-CmEW10it.js +813 -0
  173. package/dist/sub-worker-dispatch-CmEW10it.js.map +1 -0
  174. package/dist/sub-worker-dispatch-CunxuOPT.js +823 -0
  175. package/dist/sub-worker-dispatch-CunxuOPT.js.map +1 -0
  176. package/dist/sub-worker-dispatch-CvvFm40r.js +817 -0
  177. package/dist/sub-worker-dispatch-CvvFm40r.js.map +1 -0
  178. package/dist/sub-worker-dispatch-D15UHo1g.js +813 -0
  179. package/dist/sub-worker-dispatch-D15UHo1g.js.map +1 -0
  180. package/dist/sub-worker-dispatch-D8DY56ry.js +817 -0
  181. package/dist/sub-worker-dispatch-D8DY56ry.js.map +1 -0
  182. package/dist/sub-worker-dispatch-DJgWxtSQ.js +823 -0
  183. package/dist/sub-worker-dispatch-DJgWxtSQ.js.map +1 -0
  184. package/dist/sub-worker-dispatch-Dplqeubd.js +813 -0
  185. package/dist/sub-worker-dispatch-Dplqeubd.js.map +1 -0
  186. package/dist/sub-worker-dispatch-dXjUmSMN.js +813 -0
  187. package/dist/sub-worker-dispatch-dXjUmSMN.js.map +1 -0
  188. package/dist/table-id-BJdmctEQ.js +91 -0
  189. package/dist/table-id-BJdmctEQ.js.map +1 -0
  190. package/dist/table-id-DyrJBKAQ.js +105 -0
  191. package/dist/table-id-DyrJBKAQ.js.map +1 -0
  192. package/dist/table-id-x9y1eHUr.js +91 -0
  193. package/dist/table-id-x9y1eHUr.js.map +1 -0
  194. package/dist/types_client_rpc-BGMwPJst.js +123 -0
  195. package/dist/types_client_rpc-BGMwPJst.js.map +1 -0
  196. package/dist/types_client_rpc-ByGwoRCL.js +132 -0
  197. package/dist/types_client_rpc-ByGwoRCL.js.map +1 -0
  198. package/dist/types_db-BsR02Sph.js +171 -0
  199. package/dist/types_db-BsR02Sph.js.map +1 -0
  200. package/dist/types_db-CgGlOMmr.js +187 -0
  201. package/dist/types_db-CgGlOMmr.js.map +1 -0
  202. package/dist/types_db-CmxFWgU3.js +171 -0
  203. package/dist/types_db-CmxFWgU3.js.map +1 -0
  204. package/dist/types_db-OUou3o2Z.js +172 -0
  205. package/dist/types_db-OUou3o2Z.js.map +1 -0
  206. package/dist/types_server-B3z8hi-Z.d.ts +523 -0
  207. package/dist/types_server-B3z8hi-Z.d.ts.map +1 -0
  208. package/dist/types_server-BF5Y0s__.d.ts +521 -0
  209. package/dist/types_server-BF5Y0s__.d.ts.map +1 -0
  210. package/dist/types_server-BXBvz4T8.d.ts +523 -0
  211. package/dist/types_server-BXBvz4T8.d.ts.map +1 -0
  212. package/dist/types_server-BhC19R2a.js +27 -0
  213. package/dist/types_server-BhC19R2a.js.map +1 -0
  214. package/dist/types_server-CClUPZn1.d.ts +521 -0
  215. package/dist/types_server-CClUPZn1.d.ts.map +1 -0
  216. package/dist/types_server-CnYTSPhM.d.ts +523 -0
  217. package/dist/types_server-CnYTSPhM.d.ts.map +1 -0
  218. package/dist/types_server-DHpGUHB_.d.ts +521 -0
  219. package/dist/types_server-DHpGUHB_.d.ts.map +1 -0
  220. package/dist/types_server-Ded1u3bL.d.ts +521 -0
  221. package/dist/types_server-Ded1u3bL.d.ts.map +1 -0
  222. package/dist/types_server-fons7nmo.d.ts +523 -0
  223. package/dist/types_server-fons7nmo.d.ts.map +1 -0
  224. package/dist/types_server-okvBG4v_.d.ts +521 -0
  225. package/dist/types_server-okvBG4v_.d.ts.map +1 -0
  226. package/dist/types_server-pD8DiI7s.d.ts +521 -0
  227. package/dist/types_server-pD8DiI7s.d.ts.map +1 -0
  228. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-Bpw8wO6L.js","names":["formatComment","z"],"sources":["../src/db/sqlcommenter.ts","../src/db/query.ts"],"sourcesContent":["export function comment(input: string | Record<string, string>): string {\n if (!input) return \"\";\n if (typeof input === \"string\") return `/*${input}*/`;\n const entries = Object.entries(input).filter(([_, v]) => v != null);\n if (entries.length === 0) return \"\";\n const pairs = entries\n .map(([k, v]) => `${encodeURIComponent(k)}='${encodeURIComponent(v)}'`)\n .sort();\n return `/*${pairs.join(\",\")}*/`;\n}\n","import { z, ZodRawShape } from \"zod\";\nimport { Predicate, LeafPredicate, CompareOperator, QuerySpec, RangeRead } from \"./types_db\";\nimport {\n ColumnCodec, ComputedCodec, ComputedDataType, ComputedField, ComputedFieldConfig,\n InferSchema, Model, OverrideField, Prettify, SchemaDefinition\n} from \"./schema\";\nimport { TxContext } from \"./context\";\nimport { normalizeCodec } from \"./codec\";\nimport { SqlBuilder } from \"./db\";\nimport { bytesEqual } from \"./bytes\";\nimport { comment as formatComment } from \"./sqlcommenter\";\n\n// Decoded value type of a schema field (codec-applied), narrowed to the\n// caller's key. `K` is not constrained to `keyof InferSchema<S>` so callers\n// can pass a key constrained to a subset (e.g. StringFieldKeys) without\n// TypeScript widening the resulting value type.\ntype FieldValue<S extends SchemaDefinition<string, ZodRawShape>, K> =\n K extends keyof InferSchema<S> ? InferSchema<S>[K] : never;\n\ntype OrderableValue = number | bigint | string | Date;\n\n// Keys whose decoded value is string-like (covers `string`, string literal\n// unions like enums, and `string | null | undefined`).\ntype StringFieldKeys<S extends SchemaDefinition<string, ZodRawShape>> = {\n [K in keyof InferSchema<S>]: NonNullable<InferSchema<S>[K]> extends string ? K : never;\n}[keyof InferSchema<S>];\n\n// Keys whose decoded value supports SQL ordering (gt/gte/lt/lte/between).\ntype OrderableFieldKeys<S extends SchemaDefinition<string, ZodRawShape>> = {\n [K in keyof InferSchema<S>]: NonNullable<InferSchema<S>[K]> extends OrderableValue ? K : never;\n}[keyof InferSchema<S>];\n\n// Keys whose decoded value is shaped like a JSON/JSONB column (object/array/unknown).\n// Used to constrain jsonContains / jsonContainedBy / jsonHasKey / jsonArrayContains\n// so they can't be invoked on plain scalar fields.\ntype JsonFieldKeys<S extends SchemaDefinition<string, ZodRawShape>> = {\n [K in keyof InferSchema<S>]:\n NonNullable<InferSchema<S>[K]> extends OrderableValue ? never :\n NonNullable<InferSchema<S>[K]> extends boolean ? never :\n NonNullable<InferSchema<S>[K]> extends (object | unknown[]) ? K :\n unknown extends NonNullable<InferSchema<S>[K]> ? K :\n never;\n}[keyof InferSchema<S>];\n\nexport interface JsonOpOptions {\n /**\n * Skip client-side preparation of the value (no JSON-stringify, no key\n * escaping). The caller is responsible for the exact form the dialect\n * expects: a JSON path string for jsonHasKey, a JSON-encoded string for\n * the contains family.\n */\n raw?: true;\n}\n\nexport interface JsonContainsOptions extends JsonOpOptions {\n /**\n * Sub-path into the target JSON to scope the check to. `string` is a\n * single literal top-level key; `string[]` is a nested literal-key path\n * compiled to `$.\"a\".\"b\"`. Mutually exclusive with `pathRaw`.\n */\n path?: string | string[];\n /**\n * Raw jsonpath expression used verbatim by the dialect (PG `jsonpath`,\n * MySQL JSON path). Mutually exclusive with `path`.\n */\n pathRaw?: string;\n}\n\nexport interface JsonHasKeyMultiOptions extends JsonOpOptions {\n /** Required for the multi-path overload — chooses any vs every. */\n mode: \"one\" | \"all\";\n}\n\n// Escape and join a key path into a JSON path expression usable by both\n// PG (`jsonb_path_exists`) and MySQL (`JSON_CONTAINS_PATH`):\n// [\"a\", \"b.c\"] → `$.\"a\".\"b.c\"`\nfunction jsonKeysToPath(keys: string[]): string {\n let out = \"$\";\n for (const k of keys) {\n out += `.\"${k.replace(/\"/g, '\\\\\"')}\"`;\n }\n return out;\n}\n\n// Resolve the `path` / `pathRaw` option pair down to a single jsonpath\n// expression. Returns a string in `$.\"...\"` form for structured `path`,\n// or the caller's `pathRaw` verbatim. Returns `undefined` when neither is\n// set. Throws when both are supplied.\nfunction resolveJsonPath(opts: JsonContainsOptions | undefined): string | undefined {\n if (opts?.path !== undefined && opts?.pathRaw !== undefined) {\n throw new Error(\"jsonContains: pass either `path` or `pathRaw`, not both\");\n }\n if (opts?.pathRaw !== undefined) return opts.pathRaw;\n if (opts?.path !== undefined) {\n const arr = Array.isArray(opts.path) ? opts.path : [opts.path];\n return jsonKeysToPath(arr);\n }\n return undefined;\n}\n\nexport class QueryBuilder<S extends SchemaDefinition<string, ZodRawShape>> {\n constructor(\n protected ctx: TxContext,\n protected model: Model\n ) { }\n\n protected getColumnName(key: string): string {\n return this.model.columns[key] ?? key;\n }\n\n select(): SelectQueryBuilder<S, keyof InferSchema<S>>;\n select<K extends keyof InferSchema<S>>(...columns: K[]): SelectQueryBuilder<S, K>;\n select<K extends keyof InferSchema<S>>(...columns: K[]): SelectQueryBuilder<S, K> {\n const selectedProps = (columns.length > 0 ? columns : Object.keys(this.model.columns)) as K[];\n return new SelectQueryBuilder<S, K>(this.ctx, this.model, [], null, null, null, selectedProps);\n }\n}\n\nexport type IdAndCommitTs = { id: string; commitTs: bigint };\n\n// Row type returned by `.get()`, `.find()`, `.first()`. Selected schema keys\n// plus the always-included id/commitTs and any computed fields, flattened so\n// the IDE renders a plain object literal instead of an intersection chain.\ntype SelectRow<\n S extends SchemaDefinition<string, ZodRawShape>,\n K extends keyof InferSchema<S>,\n C extends Record<string, unknown>,\n> = Prettify<Pick<InferSchema<S>, Extract<K | \"id\" | \"commitTs\", keyof InferSchema<S>>> & C>;\n\nexport type OrderDirection = \"ASC\" | \"DESC\";\n\nexport interface OrderByOptions {\n direction?: OrderDirection;\n nulls?: \"first\" | \"last\";\n collate?: string;\n}\n\n/**\n * Cursor-based pagination using a timestamp column and a unique ID column.\n *\n * Generates a stable cursor predicate:\n *\n * DESC (default):\n * ```sql\n * WHERE (timeCol < ? OR (timeCol = ? AND idCol < ?))\n * ORDER BY timeCol DESC, idCol DESC\n * ```\n *\n * ASC:\n * ```sql\n * WHERE (timeCol > ? OR (timeCol = ? AND idCol > ?))\n * ORDER BY timeCol ASC, idCol ASC\n * ```\n */\nexport interface PaginationClause<\n S extends SchemaDefinition<string, ZodRawShape>,\n Time extends OrderableFieldKeys<S>,\n Id extends OrderableFieldKeys<S>,\n> {\n /** Timestamp column used for cursor pagination. */\n timeCol: Time;\n\n /**\n * Unique tie-breaker column.\n *\n * @default \"id\"\n */\n idCol?: Id;\n\n /**\n * Pagination direction.\n *\n * - `\"desc\"` (default): Newest → oldest.\n * - `\"asc\"`: Oldest → newest.\n *\n * @default \"desc\"\n */\n direction?: OrderDirection;\n\n /**\n * Maximum number of rows to return.\n */\n limit?: number;\n\n /**\n * Cursor returned from the previous page.\n *\n * Omit or set to `null` to fetch the first page.\n */\n cursor?: {\n time: FieldValue<S, Time>;\n id: FieldValue<S, Id>;\n } | null;\n}\n\nclass SelectQueryBuilder<\n S extends SchemaDefinition<string, ZodRawShape>,\n K extends keyof InferSchema<S> = never,\n C extends Record<string, unknown> = {},\n> {\n private filters: ((fb: FilterBuilder<S>) => void)[] = [];\n private paginationClause: PaginationClause<S, OrderableFieldKeys<S>, OrderableFieldKeys<S>> | null = null;\n private orderByClause: string[] | null = null;\n private limitVal: number | null = null;\n private offsetVal: number | null = null;\n private selectedProps: (keyof InferSchema<S>)[] = [];\n private computedFields: ComputedField[] = [];\n private commentStr: string = \"\";\n\n constructor(\n private ctx: TxContext,\n private model: Model,\n filters: ((fb: FilterBuilder<S>) => void)[] = [],\n orderByClause: string[] | null = null,\n limitVal: number | null = null,\n offsetVal: number | null = null,\n selectedProps: (keyof InferSchema<S>)[] = [],\n computedFields: ComputedField[] = [],\n commentStr: string = \"\",\n ) {\n this.filters = filters;\n this.orderByClause = orderByClause;\n this.limitVal = limitVal;\n this.offsetVal = offsetVal;\n this.selectedProps = selectedProps;\n this.computedFields = computedFields;\n this.commentStr = commentStr;\n }\n\n private getColumnName(key: string): string {\n return this.model.columns[key] ?? key;\n }\n\n private getPropertyName(column: string): string {\n return this.model.reverseColumns[column] ?? this.computedFields.find(f => f.alias === column)?.field ?? column;\n }\n\n private mapRowToSchema(row: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [col, value] of Object.entries(row)) {\n const prop = this.getPropertyName(col)\n const codec = this.model.codecs[prop] ?? this.computedFields.find((f) => f.alias === col)?.codec;\n result[prop] = codec?.decode && value !== undefined && value !== null ? codec.decode(value) : value;\n }\n return result;\n }\n\n where(filterFn: (fb: FilterBuilder<S>) => void): SelectQueryBuilder<S, K, C> {\n this.filters.push(filterFn);\n return this;\n }\n\n paginate<Time extends OrderableFieldKeys<S>, Id extends OrderableFieldKeys<S>>(\n clause: PaginationClause<S, Time, Id>\n ): SelectQueryBuilder<S, K, C> {\n this.paginationClause = clause;\n return this;\n }\n\n orderBy(column: keyof InferSchema<S> | keyof C, direction?: OrderDirection): SelectQueryBuilder<S, K, C>;\n\n orderBy(column: keyof InferSchema<S> | keyof C, options?: OrderByOptions): SelectQueryBuilder<S, K, C>\n\n orderBy(\n column: keyof InferSchema<S> | keyof C,\n directionOrOptions: OrderByOptions | OrderDirection = \"ASC\",\n ): SelectQueryBuilder<S, K, C> {\n const sql = this.buildOrderBySql(column, directionOrOptions);\n\n if (!this.orderByClause) {\n this.orderByClause = [];\n }\n\n this.orderByClause.push(sql);\n return this;\n }\n\n private buildOrderBySql(\n column: keyof InferSchema<S> | keyof C,\n directionOrOptions: OrderByOptions | OrderDirection = \"ASC\",\n ) {\n const options: OrderByOptions =\n typeof directionOrOptions === \"string\"\n ? { direction: directionOrOptions }\n : directionOrOptions;\n\n let sql = this.getColumnName(column as string);\n if (options?.collate) {\n sql += ` COLLATE ${options.collate}`;\n }\n\n sql += ` ${(options?.direction ?? \"ASC\").toUpperCase()}`;\n if (this.ctx.db.dbType === \"postgres\") {\n if (options?.nulls) {\n sql += ` NULLS ${options.nulls.toUpperCase()}`;\n }\n }\n\n return sql;\n }\n\n orderByRaw(sql: string): SelectQueryBuilder<S, K, C> {\n if (!this.orderByClause) {\n this.orderByClause = [];\n }\n\n this.orderByClause.push(sql);\n return this;\n }\n\n limit(n: number): SelectQueryBuilder<S, K, C> {\n this.limitVal = n;\n return this;\n }\n\n offset(n: number): SelectQueryBuilder<S, K, C> {\n this.offsetVal = n;\n return this;\n }\n computed<\n TField extends string,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n TDecode extends (value: any) => any = (value: unknown) => unknown,\n >(\n config: ComputedFieldConfig<TField, ReturnType<TDecode>, Parameters<TDecode>[0], TZodType> & {\n codec: {\n decode: TDecode;\n encode?: (value: ReturnType<TDecode>) => Parameters<TDecode>[0];\n };\n }\n ): SelectQueryBuilder<S, K | TField, OverrideField<C, TField, ComputedDataType<ComputedCodec<ReturnType<TDecode>, Parameters<TDecode>[0]>, TZodType>>>;\n computed<\n TField extends string,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n >(\n config: ComputedFieldConfig<TField, unknown, unknown, TZodType> & {\n codec?: undefined;\n }\n ): SelectQueryBuilder<S, K | TField, OverrideField<C, TField, ComputedDataType<undefined, TZodType>>>;\n computed<\n TField extends string,\n TZodType extends z.ZodTypeAny | undefined = undefined,\n TCodec extends ComputedCodec<any, any> | undefined = undefined,\n >(\n config: ComputedFieldConfig<TField, unknown, unknown, TZodType> & {\n codec?: TCodec;\n }\n ): SelectQueryBuilder<S, K | TField, OverrideField<C, TField, ComputedDataType<TCodec, TZodType>>> {\n const computed: ComputedField = {\n field: config.field,\n sql: config.sql,\n alias: config.alias ?? config.field,\n codec: normalizeCodec(config.codec, config.type),\n };\n this.computedFields.push(computed);\n return new SelectQueryBuilder<S, K | TField, OverrideField<C, TField, ComputedDataType<TCodec, TZodType>>>(\n this.ctx, this.model, this.filters, this.orderByClause,\n this.limitVal, this.offsetVal, [...this.selectedProps, config.field], this.computedFields,\n this.commentStr,\n );\n }\n\n comment(input: string | Record<string, string>): SelectQueryBuilder<S, K, C> {\n this.commentStr = formatComment(input);\n return this;\n }\n\n async first(): Promise<SelectRow<S, K, C> | null> {\n const rows = await this.limit(1).get();\n return (rows[0] ?? null) as any;\n }\n\n async exists(): Promise<boolean> {\n return await this.count() > 0;\n }\n\n private static defaultCountType = z.coerce.number();\n\n async count(): Promise<number>;\n async count<T extends z.ZodType>(parser: T): Promise<z.output<T>>;\n async count<T extends z.ZodType>(parser?: T): Promise<z.output<T>> {\n const predicate = this.buildPredicate(false) ?? { kind: \"leaf\" as const, column: \"1\", operator: \"=\" as const, value: \"1\" };\n const table = this.model.table;\n\n // Build query spec for read tracking (without totalTs)\n const querySpec: RangeRead = {\n kind: \"range\",\n table: table,\n predicate: predicate,\n columns: [\"count\"],\n orderBy: null,\n limit: null,\n offset: null,\n };\n\n // Execute query\n const params: unknown[] = [];\n const whereSql = buildPredicateSql(predicate, params, this.ctx.db.sqlBuilder);\n\n const sql = `SELECT COUNT(*) as count FROM ${table} WHERE (${whereSql})${this.commentStr ? \" \" + this.commentStr : \"\"}`;\n const result = await this.ctx.db.query(sql, params);\n const raw = result.rows[0]?.count ?? \"0\";\n\n // Record read with totalTs for OCC validation\n this.ctx.internalGetReadSet().push({ ...querySpec });\n\n if (parser) {\n return parser.parse(raw) as z.output<T>;\n } else {\n return SelectQueryBuilder.defaultCountType.parse(raw) as z.output<T>;\n }\n }\n\n async find(id: string): Promise<SelectRow<S, K, C> | null> {\n if (this.filters.length > 0) {\n throw new Error(`Cannot use find() after where() - find() is meant for primary key lookups without additional filters`);\n }\n\n const table = this.model.table;\n const tableId = this.model.tableId;\n\n // Check pending writes first\n const pendingWrite = this.ctx.internalGetWriteSet().find(w => w.id === id && bytesEqual(w.tableId, tableId));\n\n if (pendingWrite) {\n if (pendingWrite.op === \"delete\") {\n // Don't cache pending writes, just return\n return null;\n }\n const row = this.mapRowToSchema({ ...pendingWrite.data, id, commit_ts: this.ctx.beginTs });\n return row as SelectRow<S, K, C>;\n }\n\n const computedCols = this.computedFields.map(f => `${f.sql} as ${f.alias}`);\n const selectPropsWithComputed = this.selectedProps.slice(0, this.selectedProps.length - this.computedFields.length);\n const selectCols = selectPropsWithComputed.length > 0\n ? [\"id\", ...selectPropsWithComputed.map(p => this.getColumnName(p as string)), ...computedCols, \"commit_ts\"].join(\", \")\n : \"*\";\n let sql = `SELECT ${selectCols} FROM ${table} WHERE id = ${this.ctx.db.sqlBuilder.placeholder(1)}`;\n if (this.commentStr) sql += ` ${this.commentStr}`;\n const result = await this.ctx.db.query(sql, [id]);\n\n const row = result.rows[0] ?? null;\n\n // Capture commit_ts as the per-row OCC fingerprint. `null` means\n // \"no row at read time\" — a later concurrent insert with this id\n // becomes a conflict at commit time.\n const expectedCommitTs: bigint | null = row ? BigInt(row.commit_ts) : null;\n this.ctx.internalGetReadSet().push({\n kind: \"point\",\n table,\n id,\n expectedCommitTs,\n });\n\n const mappedRow = row ? this.mapRowToSchema(row) as SelectRow<S, K, C> : null;\n\n return mappedRow;\n }\n\n async get(): Promise<SelectRow<S, K, C>[]> {\n const predicate = this.buildPredicate(true) ?? { kind: \"leaf\" as const, column: \"1\", operator: \"=\" as const, value: \"1\" };\n const table = this.model.table;\n\n // Build query spec for read tracking (without totalTs)\n const querySpec: RangeRead = {\n kind: \"range\",\n table: table,\n predicate: predicate,\n columns: this.selectedProps as string[],\n orderBy: this.orderByClause,\n limit: this.limitVal,\n offset: this.offsetVal,\n };\n\n // Execute query\n const params: unknown[] = [];\n const whereSql = buildPredicateSql(predicate, params, this.ctx.db.sqlBuilder);\n\n const computedCols = this.computedFields.map(f => `${f.sql} as ${f.alias}`);\n const selectPropsWithComputed = this.selectedProps.slice(0, this.selectedProps.length - this.computedFields.length);\n const selectColsNames = selectPropsWithComputed.length > 0\n ? [\"id\", ...selectPropsWithComputed.map(p => this.getColumnName(p as string)), ...computedCols, \"commit_ts\"]\n : \"*\";\n const selectCols = Array.from(new Set(selectColsNames).values()).join(\", \")\n let sql = `SELECT ${selectCols} FROM ${table} WHERE (${whereSql})`;\n\n let orderByClause: string[] | undefined;\n const paginateClause = this.paginationClause;\n\n if (paginateClause) {\n const idField = (paginateClause.idCol ?? \"id\") as OrderableFieldKeys<S>;\n const orderDir = paginateClause.direction ?? \"DESC\"\n\n orderByClause = [\n this.buildOrderBySql(paginateClause.timeCol, orderDir),\n this.buildOrderBySql(idField, orderDir),\n ];\n\n if (this.orderByClause) {\n orderByClause.push(...this.orderByClause);\n }\n } else if (this.orderByClause) {\n orderByClause = this.orderByClause;\n }\n\n if (orderByClause) {\n sql += ` ORDER BY ${orderByClause.join(\", \")}`;\n }\n\n const limit = paginateClause?.limit ?? this.limitVal;\n if (limit !== null) {\n sql += ` LIMIT ${limit}`;\n }\n if (this.offsetVal !== null && !this.paginationClause) {\n sql += ` OFFSET ${this.offsetVal}`;\n }\n if (this.commentStr) sql += ` ${this.commentStr}`;\n\n const result = await this.ctx.db.query(sql, params);\n\n // Record read with totalTs for OCC validation\n this.ctx.internalGetReadSet().push({ ...querySpec });\n\n const rows = result.rows.map(row => this.mapRowToSchema(row)) as SelectRow<S, K, C>[];\n\n return rows;\n }\n\n private buildPredicate(includePagination: boolean): Predicate | null {\n if (this.filters.length === 0) return null;\n\n const predicates: Predicate[] = [];\n const fb = new FilterBuilder<S>(this.model.columns, this.model.codecs);\n let paginateFilter: ((fb: FilterBuilder<S>) => void) | undefined;\n\n const clause = this.paginationClause;\n const cursor = clause?.cursor;\n if (clause && cursor != null) {\n const orderDir = clause.direction ?? \"DESC\"\n const descending = orderDir === \"DESC\";\n const idField = (clause.idCol ?? \"id\") as OrderableFieldKeys<S>;\n\n paginateFilter = (f) => {\n f.or([\n (f1) => {\n return descending ?\n f1.lt(clause.timeCol, cursor.time) :\n f1.gt(clause.timeCol, cursor.time);\n },\n (f2) => {\n const q = f2.eq(clause.timeCol, cursor.time);\n return descending ?\n q.lt(idField, cursor.id) :\n q.gt(idField, cursor.id);\n }\n ]);\n };\n\n }\n\n\n const count = this.filters.length + (paginateFilter ? 1 : 0);\n for (let i = 0; i < count; i++) {\n const filterFn = i == this.filters.length\n ? paginateFilter!\n : this.filters[i];\n\n filterFn(fb);\n if (fb.predicates.length > 0) {\n const hasOr = fb.predicates.some(p => p.kind === \"or\");\n if (hasOr) {\n predicates.push(...fb.predicates);\n } else {\n predicates.push({ kind: \"and\", children: fb.predicates });\n }\n fb.predicates = [];\n }\n }\n\n if (predicates.length === 0) return null;\n if (predicates.length === 1) return predicates[0] ?? null;\n return { kind: \"and\", children: predicates };\n }\n}\n\n// ─── Filter Builder ──────────────────────────────────────────────────────────────\n\nclass FilterBuilder<S extends SchemaDefinition<string, ZodRawShape>> {\n predicates: Predicate[] = [];\n\n constructor(\n private columns: Record<string, string>,\n private codecs: Record<string, ColumnCodec<unknown, unknown>>\n ) { }\n\n private add(column: string, operator: CompareOperator, value: unknown, value2?: unknown, raw?: boolean): void {\n const leaf: LeafPredicate = { kind: \"leaf\", column, operator: operator as any, value, value2 };\n if (raw) leaf.raw = true;\n this.predicates.push(leaf);\n }\n\n private addJsonContains(operator: CompareOperator, key: string, value: unknown, opts: JsonContainsOptions | undefined): void {\n const col = this.getColumnName(key);\n const leaf: LeafPredicate = {\n kind: \"leaf\",\n column: col,\n operator: operator as any,\n value: this.encodeJson(value, opts?.raw),\n };\n if (opts?.raw) leaf.raw = true;\n const path = resolveJsonPath(opts);\n if (path !== undefined) leaf.path = path;\n this.predicates.push(leaf);\n }\n\n private getColumnName(key: string): string {\n return this.columns[key] ?? key;\n }\n\n private encode(key: string, value: unknown): unknown {\n const codec = this.codecs[key];\n if (!codec?.encode || value === undefined || value === null) return value;\n return codec.encode(value);\n }\n\n private encodeJson(value: unknown, raw: boolean | undefined): unknown {\n if (value === null || value === undefined) return value;\n // raw=true: caller has already produced the dialect-native form\n // (typically a JSON-encoded string or a path expression). Pass through.\n if (raw) return value;\n // Otherwise serialize the JS value to a JSON literal so the SQL\n // emitter can hand a single text param to the driver.\n return JSON.stringify(value);\n }\n\n eq<K extends keyof InferSchema<S>>(key: K, value: FieldValue<S, K>): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"=\", this.encode(key as string, value));\n return this;\n }\n\n neq<K extends keyof InferSchema<S>>(key: K, value: FieldValue<S, K>): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"!=\", this.encode(key as string, value));\n return this;\n }\n\n gt<K extends OrderableFieldKeys<S>>(key: K, value: FieldValue<S, K>): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \">\", this.encode(key as string, value));\n return this;\n }\n\n gte<K extends OrderableFieldKeys<S>>(key: K, value: FieldValue<S, K>): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \">=\", this.encode(key as string, value));\n return this;\n }\n\n lt<K extends OrderableFieldKeys<S>>(key: K, value: FieldValue<S, K>): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"<\", this.encode(key as string, value));\n return this;\n }\n\n lte<K extends OrderableFieldKeys<S>>(key: K, value: FieldValue<S, K>): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"<=\", this.encode(key as string, value));\n return this;\n }\n\n like<K extends StringFieldKeys<S>>(key: K, pattern: string): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"like\", this.encode(key as string, pattern));\n return this;\n }\n\n ilike<K extends StringFieldKeys<S>>(key: K, pattern: string): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"ilike\", this.encode(key as string, pattern));\n return this;\n }\n\n contains<K extends StringFieldKeys<S>>(key: K, value: string): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"contains\", this.encode(key as string, value));\n return this;\n }\n\n icontains<K extends StringFieldKeys<S>>(key: K, value: string): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"icontains\", this.encode(key as string, value));\n return this;\n }\n\n /**\n * JSON containment. Targets a JSON/JSONB column and asserts the document\n * contains the given candidate (object-key subset for objects,\n * element-subset for arrays — see dialect-specific docs for edge cases).\n * Pass `{ raw: true }` if `value` is already a JSON-encoded string.\n * Pass `{ path: ... }` to scope the check to a sub-document of the\n * target (jsonb_path_query_first on PG, JSON_CONTAINS path arg on MySQL).\n */\n jsonContains<K extends JsonFieldKeys<S>>(key: K, value: unknown, opts?: JsonContainsOptions): FilterBuilder<S> {\n this.addJsonContains(\"jsonContains\", key as string, value, opts);\n return this;\n }\n\n /** Inverse of {@link jsonContains}: column is contained in the given value. */\n jsonContainedBy<K extends JsonFieldKeys<S>>(key: K, value: unknown, opts?: JsonContainsOptions): FilterBuilder<S> {\n this.addJsonContains(\"jsonContainedBy\", key as string, value, opts);\n return this;\n }\n\n /**\n * Key/path existence check on a JSON column.\n *\n * - String form (top-level key): `jsonHasKey(\"meta\", \"color\")`. On PG\n * also matches when the column is a string array and `value` is one of\n * its elements (PG `?` semantics); MySQL stays strict to object keys.\n * - Array form (nested path): `jsonHasKey(\"meta\", [\"a\", \"b\"])` compiles\n * to a path expression `$.\"a\".\"b\"` on both dialects.\n * - Raw form: `jsonHasKey(\"meta\", \"$.foo[*]\", { raw: true })` passes the\n * string through as a dialect path expression (PG `jsonb_path_exists`\n * jsonpath, MySQL `JSON_CONTAINS_PATH`). Caller owns the syntax.\n * - Multi-path form: `jsonHasKey(\"meta\", [[\"a\",\"b\"], \"color\"], { mode: \"all\" })`\n * compiles each entry to a jsonpath and emits PG OR/AND of\n * `jsonb_path_exists` or MySQL `JSON_CONTAINS_PATH('all', ...)`.\n */\n jsonHasKey<K extends JsonFieldKeys<S>>(key: K, value: string): FilterBuilder<S>;\n jsonHasKey<K extends JsonFieldKeys<S>>(key: K, value: string[]): FilterBuilder<S>;\n jsonHasKey<K extends JsonFieldKeys<S>>(key: K, value: string, opts: { raw: true }): FilterBuilder<S>;\n jsonHasKey<K extends JsonFieldKeys<S>>(key: K, paths: (string | string[])[], opts: JsonHasKeyMultiOptions): FilterBuilder<S>;\n jsonHasKey<K extends JsonFieldKeys<S>>(key: K, paths: string[], opts: JsonHasKeyMultiOptions & { raw: true }): FilterBuilder<S>;\n jsonHasKey<K extends JsonFieldKeys<S>>(\n key: K,\n value: string | string[] | (string | string[])[],\n opts?: JsonOpOptions & { mode?: \"one\" | \"all\" }\n ): FilterBuilder<S> {\n const col = this.getColumnName(key as string);\n // Multi-path mode: array of (string|string[]) entries with explicit mode.\n if (opts?.mode && Array.isArray(value)) {\n const paths = (value as (string | string[])[]).map((p) =>\n opts.raw && typeof p === \"string\" ? p : jsonKeysToPath(Array.isArray(p) ? p : [p])\n );\n const leaf: LeafPredicate = {\n kind: \"leaf\",\n column: col,\n operator: \"jsonHasKey\",\n value: paths,\n mode: opts.mode,\n };\n this.predicates.push(leaf);\n return this;\n }\n // Single-key/path mode.\n if (Array.isArray(value)) {\n this.add(col, \"jsonHasKey\", jsonKeysToPath(value as string[]), undefined, true);\n } else if (opts?.raw) {\n this.add(col, \"jsonHasKey\", value, undefined, true);\n } else {\n this.add(col, \"jsonHasKey\", value, undefined, false);\n }\n return this;\n }\n\n /**\n * Array element containment: target column is a JSON array; the given\n * `value` (any JSON-encodable type) must appear as one of its elements.\n * Pass `{ raw: true }` if `value` is already a JSON-encoded string.\n * Pass `{ path: ... }` to scope the check to a sub-array of the column.\n */\n jsonArrayContains<K extends JsonFieldKeys<S>>(key: K, value: unknown, opts?: JsonContainsOptions): FilterBuilder<S> {\n this.addJsonContains(\"jsonArrayContains\", key as string, value, opts);\n return this;\n }\n\n between<K extends OrderableFieldKeys<S>>(key: K, lo: FieldValue<S, K>, hi: FieldValue<S, K>): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"between\", this.encode(key as string, lo), this.encode(key as string, hi));\n return this;\n }\n\n /**\n * Set membership: `key` equals any of `values` (SQL `IN`). Each value is\n * codec-encoded like `eq`. An empty `values` matches no rows. Bound as one\n * parameter per element, so keep the list within the driver's parameter\n * limit (chunk very large sets at the call site).\n */\n in<K extends keyof InferSchema<S>>(key: K, values: readonly FieldValue<S, K>[]): FilterBuilder<S> {\n const col = this.getColumnName(key as string);\n this.add(col, \"in\", values.map((v) => this.encode(key as string, v)));\n return this;\n }\n\n isNull<K extends keyof InferSchema<S>>(key: K): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"isNull\", null);\n return this;\n }\n\n notNull<K extends keyof InferSchema<S>>(key: K): FilterBuilder<S> {\n this.add(this.getColumnName(key as string), \"isNotNull\", null);\n return this;\n }\n\n /**\n * Compose an OR clause. Each callback fills a fresh sub-FilterBuilder\n * with predicates that are AND-ed together within that branch; the\n * branches themselves are OR-ed. Example:\n * f.or([\n * b => b.eq(\"tag\", \"a\"),\n * b => b.eq(\"tag\", \"b\").gt(\"qty\", 3), // (tag=b AND qty>3)\n * ])\n * produces (tag=a) OR (tag=b AND qty>3).\n */\n or(branches: ((fb: FilterBuilder<S>) => void)[]): FilterBuilder<S> {\n const children: Predicate[] = [];\n for (const fn of branches) {\n const sub = new FilterBuilder<S>(this.columns, this.codecs);\n fn(sub);\n if (sub.predicates.length === 1) {\n children.push(sub.predicates[0]);\n } else if (sub.predicates.length > 1) {\n children.push({ kind: \"and\", children: sub.predicates });\n }\n }\n if (children.length > 0) {\n this.predicates.push({ kind: \"or\", children });\n }\n return this;\n }\n}\n\n\nexport function buildPredicateSql(predicate: Predicate, params: unknown[], sql: SqlBuilder): string {\n switch (predicate.kind) {\n case \"and\": {\n const parts = predicate.children.map((c) => buildPredicateSql(c, params, sql));\n return `(${parts.join(\" AND \")})`;\n }\n case \"or\": {\n const parts = predicate.children.map((c) => buildPredicateSql(c, params, sql));\n return `(${parts.join(\" OR \")})`;\n }\n case \"leaf\": {\n return buildLeafSql(predicate, params, sql);\n }\n }\n}\n\nfunction buildLeafSql(leaf: LeafPredicate, params: unknown[], sql: SqlBuilder): string {\n const col = leaf.column;\n switch (leaf.operator) {\n case \"=\": case \"!=\": case \">\": case \">=\": case \"<\": case \"<=\": {\n params.push(leaf.value);\n return `${col} ${leaf.operator} ${sql.placeholder(params.length)}`;\n }\n case \"between\": {\n params.push(leaf.value);\n const p1 = sql.placeholder(params.length);\n params.push(leaf.value2);\n const p2 = sql.placeholder(params.length);\n return `${col} BETWEEN ${p1} AND ${p2}`;\n }\n case \"in\": {\n const values = (leaf.value ?? []) as unknown[];\n // `col IN ()` is invalid SQL; an empty set matches nothing.\n if (values.length === 0) return \"1 = 0\";\n const placeholders = values.map((v) => {\n params.push(v);\n return sql.placeholder(params.length);\n });\n return `${col} IN (${placeholders.join(\", \")})`;\n }\n case \"like\": {\n params.push(leaf.value);\n return `${col} LIKE ${sql.placeholder(params.length)}`;\n }\n case \"ilike\": {\n params.push(leaf.value);\n return sql.ilike(col, params.length);\n }\n case \"contains\": {\n params.push(`%${leaf.value}%`);\n return `${col} LIKE ${sql.placeholder(params.length)}`;\n }\n case \"icontains\": {\n params.push(`%${leaf.value}%`);\n return sql.icontains(col, params.length);\n }\n case \"jsonContains\": {\n params.push(leaf.value);\n const valIdx = params.length;\n let pathIndex: number | undefined;\n if (leaf.path !== undefined) {\n params.push(leaf.path);\n pathIndex = params.length;\n }\n return sql.jsonContains(col, valIdx, { raw: leaf.raw, pathIndex });\n }\n case \"jsonContainedBy\": {\n params.push(leaf.value);\n const valIdx = params.length;\n let pathIndex: number | undefined;\n if (leaf.path !== undefined) {\n params.push(leaf.path);\n pathIndex = params.length;\n }\n return sql.jsonContainedBy(col, valIdx, { raw: leaf.raw, pathIndex });\n }\n case \"jsonHasKey\": {\n if (leaf.mode && Array.isArray(leaf.value)) {\n const paths = leaf.value as string[];\n const startIdx = params.length + 1;\n for (const p of paths) params.push(p);\n return sql.jsonHasKey(col, startIdx, {\n raw: true,\n mode: leaf.mode,\n pathCount: paths.length,\n });\n }\n params.push(leaf.value);\n return sql.jsonHasKey(col, params.length, { raw: leaf.raw });\n }\n case \"jsonArrayContains\": {\n params.push(leaf.value);\n const valIdx = params.length;\n let pathIndex: number | undefined;\n if (leaf.path !== undefined) {\n params.push(leaf.path);\n pathIndex = params.length;\n }\n return sql.jsonArrayContains(col, valIdx, { raw: leaf.raw, pathIndex });\n }\n case \"isNull\": return `${col} IS NULL`;\n case \"isNotNull\": return `${col} IS NOT NULL`;\n }\n}\n\nexport function matchesPredicate(row: Record<string, unknown>, predicate: Predicate): boolean {\n switch (predicate.kind) {\n case \"and\": return predicate.children.every((c) => matchesPredicate(row, c));\n case \"or\": return predicate.children.some((c) => matchesPredicate(row, c));\n case \"leaf\": return matchesLeaf(row, predicate);\n }\n}\n\nfunction matchesLeaf(row: Record<string, unknown>, leaf: LeafPredicate): boolean {\n const val = row[leaf.column];\n\n switch (leaf.operator) {\n case \"=\": return val === leaf.value;\n case \"!=\": return val !== leaf.value;\n case \">\": return (val as number) > (leaf.value as number);\n case \">=\": return (val as number) >= (leaf.value as number);\n case \"<\": return (val as number) < (leaf.value as number);\n case \"<=\": return (val as number) <= (leaf.value as number);\n\n case \"between\":\n return (val as number) >= (leaf.value as number) &&\n (val as number) <= (leaf.value2 as number);\n\n case \"in\":\n return Array.isArray(leaf.value) && (leaf.value as unknown[]).includes(val);\n\n case \"like\":\n case \"contains\":\n case \"ilike\":\n case \"icontains\": {\n if (typeof val !== \"string\" || typeof leaf.value !== \"string\") return false;\n const haystack = (leaf.operator === \"ilike\" || leaf.operator === \"icontains\")\n ? (val as string).toLowerCase()\n : val as string;\n const raw = leaf.value as string;\n const needle = (leaf.operator === \"ilike\" || leaf.operator === \"icontains\")\n ? raw.toLowerCase()\n : raw;\n const pattern = (leaf.operator === \"contains\" || leaf.operator === \"icontains\")\n ? `%${needle}%`\n : needle;\n const regex = new RegExp(\n \"^\" + pattern.replace(/%/g, \".*\").replace(/_/g, \".\") + \"$\"\n );\n return regex.test(haystack);\n }\n\n case \"jsonContains\": {\n const candidate = decodeJsonLeafValue(leaf);\n const target = leaf.path !== undefined ? jsonPathExtract(val, leaf.path) : val;\n if (target === undefined) return false;\n return jsonContains(target, candidate);\n }\n\n case \"jsonContainedBy\": {\n const candidate = decodeJsonLeafValue(leaf);\n const target = leaf.path !== undefined ? jsonPathExtract(val, leaf.path) : val;\n if (target === undefined) return false;\n return jsonContains(candidate, target);\n }\n\n case \"jsonHasKey\": {\n if (leaf.mode && Array.isArray(leaf.value)) {\n const paths = leaf.value as string[];\n if (paths.length === 0) return false;\n return leaf.mode === \"all\"\n ? paths.every((p) => jsonPathExists(val, p))\n : paths.some((p) => jsonPathExists(val, p));\n }\n if (leaf.raw) {\n return jsonPathExists(val, leaf.value as string);\n }\n const key = leaf.value as string;\n if (val === null || typeof val !== \"object\") return false;\n if (Array.isArray(val)) return (val as unknown[]).includes(key);\n return key in (val as object);\n }\n\n case \"jsonArrayContains\": {\n const candidate = decodeJsonLeafValue(leaf);\n const target = leaf.path !== undefined ? jsonPathExtract(val, leaf.path) : val;\n if (!Array.isArray(target)) return false;\n return (target as unknown[]).some((el) => jsonContains(el, candidate));\n }\n\n case \"isNull\":\n return val === null;\n\n case \"isNotNull\":\n return val !== null;\n\n default:\n return false;\n }\n}\n\n// When raw=true the leaf.value is a JSON-encoded string; decode for in-memory\n// comparison. Otherwise the value is the original JS value as passed.\nfunction decodeJsonLeafValue(leaf: LeafPredicate): unknown {\n if (!leaf.raw) return leaf.value;\n if (typeof leaf.value !== \"string\") return leaf.value;\n try { return JSON.parse(leaf.value); } catch { return leaf.value; }\n}\n\n// PG `@>` / MySQL `JSON_CONTAINS` semantics. Recursive containment:\n// - scalars: strict equality\n// - object: every candidate key matches target's value recursively\n// - array: every candidate element is contained in some target element\n// - scalar candidate vs array target: candidate equals some element\nexport function jsonContains(target: unknown, candidate: unknown): boolean {\n if (candidate === target) return true;\n if (target === null || candidate === null) return target === candidate;\n if (target === undefined || candidate === undefined) return false;\n\n const tArr = Array.isArray(target);\n const cArr = Array.isArray(candidate);\n const tObj = !tArr && typeof target === \"object\";\n const cObj = !cArr && typeof candidate === \"object\";\n\n // Scalar candidate in array target.\n if (!cArr && !cObj && tArr) {\n return (target as unknown[]).some((el) => jsonContains(el, candidate));\n }\n // Both arrays: every candidate element matches some target element.\n if (cArr && tArr) {\n const t = target as unknown[];\n return (candidate as unknown[]).every((c) => t.some((el) => jsonContains(el, c)));\n }\n // Both objects.\n if (cObj && tObj) {\n const t = target as Record<string, unknown>;\n const c = candidate as Record<string, unknown>;\n for (const k of Object.keys(c)) {\n if (!(k in t)) return false;\n if (!jsonContains(t[k], c[k])) return false;\n }\n return true;\n }\n return false;\n}\n\n// Walk the JSON path and return the value at it, or `undefined` if any\n// segment is missing or unresolvable. Same syntax subset as\n// {@link jsonPathExists}.\nexport function jsonPathExtract(val: unknown, path: string): unknown {\n let p = path;\n if (p.startsWith(\"$\")) p = p.slice(1);\n let cur: unknown = val;\n while (p.length > 0) {\n if (p.startsWith('.\"')) {\n let end = 2;\n while (end < p.length) {\n if (p[end] === \"\\\\\" && end + 1 < p.length) { end += 2; continue; }\n if (p[end] === '\"') break;\n end++;\n }\n if (end >= p.length) return undefined;\n const key = p.slice(2, end).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n if (cur === null || typeof cur !== \"object\" || Array.isArray(cur)) return undefined;\n if (!(key in (cur as object))) return undefined;\n cur = (cur as Record<string, unknown>)[key];\n p = p.slice(end + 1);\n } else if (p.startsWith(\".\")) {\n const m = p.slice(1).match(/^([^.[]+)/);\n if (!m) return undefined;\n const key = m[1];\n if (cur === null || typeof cur !== \"object\" || Array.isArray(cur)) return undefined;\n if (!(key in (cur as object))) return undefined;\n cur = (cur as Record<string, unknown>)[key];\n p = p.slice(1 + key.length);\n } else if (p.startsWith(\"[\")) {\n const end = p.indexOf(\"]\");\n if (end === -1) return undefined;\n const idx = parseInt(p.slice(1, end), 10);\n if (!Array.isArray(cur) || idx < 0 || idx >= (cur as unknown[]).length) return undefined;\n cur = (cur as unknown[])[idx];\n p = p.slice(end + 1);\n } else {\n return undefined;\n }\n }\n return cur;\n}\n\n// Best-effort JSON path evaluator for the in-memory predicate match.\n// Supports the path syntax this module emits (`$.\"key\".\"nested\"`) plus the\n// common shorthands `$.key` and `$.key[0]`. Anything more exotic (filters,\n// wildcards) returns false — DB will still evaluate it correctly server-side.\nexport function jsonPathExists(val: unknown, path: string): boolean {\n let p = path;\n if (p.startsWith(\"$\")) p = p.slice(1);\n let cur: unknown = val;\n while (p.length > 0) {\n if (p.startsWith('.\"')) {\n let end = 2;\n while (end < p.length) {\n if (p[end] === \"\\\\\" && end + 1 < p.length) { end += 2; continue; }\n if (p[end] === '\"') break;\n end++;\n }\n if (end >= p.length) return false;\n const key = p.slice(2, end).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n if (cur === null || typeof cur !== \"object\" || Array.isArray(cur)) return false;\n if (!(key in (cur as object))) return false;\n cur = (cur as Record<string, unknown>)[key];\n p = p.slice(end + 1);\n } else if (p.startsWith(\".\")) {\n const m = p.slice(1).match(/^([^.[]+)/);\n if (!m) return false;\n const key = m[1];\n if (cur === null || typeof cur !== \"object\" || Array.isArray(cur)) return false;\n if (!(key in (cur as object))) return false;\n cur = (cur as Record<string, unknown>)[key];\n p = p.slice(1 + key.length);\n } else if (p.startsWith(\"[\")) {\n const end = p.indexOf(\"]\");\n if (end === -1) return false;\n const idx = parseInt(p.slice(1, end), 10);\n if (!Array.isArray(cur) || idx < 0 || idx >= (cur as unknown[]).length) return false;\n cur = (cur as unknown[])[idx];\n p = p.slice(end + 1);\n } else {\n return false;\n }\n }\n return cur !== undefined;\n}\n"],"mappings":";;;;AAAA,SAAgB,QAAQ,OAAgD;CACpE,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,OAAO,UAAU,UAAU,OAAO,KAAK,MAAM;CACjD,MAAM,UAAU,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,KAAK,IAAI;CAClE,IAAI,QAAQ,WAAW,GAAG,OAAO;CAIjC,OAAO,KAHO,QACT,KAAK,CAAC,GAAG,OAAO,GAAG,mBAAmB,CAAC,EAAE,IAAI,mBAAmB,CAAC,EAAE,EAAE,CAAC,CACtE,KACW,CAAC,CAAC,KAAK,GAAG,EAAE;AAChC;;;ACmEA,SAAS,eAAe,MAAwB;CAC5C,IAAI,MAAM;CACV,KAAK,MAAM,KAAK,MACZ,OAAO,KAAK,EAAE,QAAQ,MAAM,MAAK,EAAE;CAEvC,OAAO;AACX;AAMA,SAAS,gBAAgB,MAA2D;CAChF,IAAI,MAAM,SAAS,KAAA,KAAa,MAAM,YAAY,KAAA,GAC9C,MAAM,IAAI,MAAM,yDAAyD;CAE7E,IAAI,MAAM,YAAY,KAAA,GAAW,OAAO,KAAK;CAC7C,IAAI,MAAM,SAAS,KAAA,GAEf,OAAO,eADK,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,OAAO,CAAC,KAAK,IAAI,CACpC;AAGjC;AAEA,IAAa,eAAb,MAA2E;CAEzD;CACA;CAFd,YACI,KACA,OACF;EAFY,KAAA,MAAA;EACA,KAAA,QAAA;CACV;CAEJ,cAAwB,KAAqB;EACzC,OAAO,KAAK,MAAM,QAAQ,QAAQ;CACtC;CAIA,OAAuC,GAAG,SAAwC;EAC9E,MAAM,gBAAiB,QAAQ,SAAS,IAAI,UAAU,OAAO,KAAK,KAAK,MAAM,OAAO;EACpF,OAAO,IAAI,mBAAyB,KAAK,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,MAAM,MAAM,aAAa;CACjG;AACJ;AA+EA,IAAM,qBAAN,MAAM,mBAIJ;CAWc;CACA;CAXZ,UAAsD,CAAC;CACvD,mBAAqG;CACrG,gBAAyC;CACzC,WAAkC;CAClC,YAAmC;CACnC,gBAAkD,CAAC;CACnD,iBAA0C,CAAC;CAC3C,aAA6B;CAE7B,YACI,KACA,OACA,UAA8C,CAAC,GAC/C,gBAAiC,MACjC,WAA0B,MAC1B,YAA2B,MAC3B,gBAA0C,CAAC,GAC3C,iBAAkC,CAAC,GACnC,aAAqB,IACvB;EATU,KAAA,MAAA;EACA,KAAA,QAAA;EASR,KAAK,UAAU;EACf,KAAK,gBAAgB;EACrB,KAAK,WAAW;EAChB,KAAK,YAAY;EACjB,KAAK,gBAAgB;EACrB,KAAK,iBAAiB;EACtB,KAAK,aAAa;CACtB;CAEA,cAAsB,KAAqB;EACvC,OAAO,KAAK,MAAM,QAAQ,QAAQ;CACtC;CAEA,gBAAwB,QAAwB;EAC5C,OAAO,KAAK,MAAM,eAAe,WAAW,KAAK,eAAe,MAAK,MAAK,EAAE,UAAU,MAAM,CAAC,EAAE,SAAS;CAC5G;CAEA,eAAuB,KAA+C;EAClE,MAAM,SAA8B,CAAC;EACrC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAAG;GAC5C,MAAM,OAAO,KAAK,gBAAgB,GAAG;GACrC,MAAM,QAAQ,KAAK,MAAM,OAAO,SAAS,KAAK,eAAe,MAAM,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE;GAC3F,OAAO,QAAQ,OAAO,UAAU,UAAU,KAAA,KAAa,UAAU,OAAO,MAAM,OAAO,KAAK,IAAI;EAClG;EACA,OAAO;CACX;CAEA,MAAM,UAAuE;EACzE,KAAK,QAAQ,KAAK,QAAQ;EAC1B,OAAO;CACX;CAEA,SACI,QAC2B;EAC3B,KAAK,mBAAmB;EACxB,OAAO;CACX;CAMA,QACI,QACA,qBAAsD,OAC3B;EAC3B,MAAM,MAAM,KAAK,gBAAgB,QAAQ,kBAAkB;EAE3D,IAAI,CAAC,KAAK,eACN,KAAK,gBAAgB,CAAC;EAG1B,KAAK,cAAc,KAAK,GAAG;EAC3B,OAAO;CACX;CAEA,gBACI,QACA,qBAAsD,OACxD;EACE,MAAM,UACF,OAAO,uBAAuB,WACxB,EAAE,WAAW,mBAAmB,IAChC;EAEV,IAAI,MAAM,KAAK,cAAc,MAAgB;EAC7C,IAAI,SAAS,SACT,OAAO,YAAY,QAAQ;EAG/B,OAAO,KAAK,SAAS,aAAa,MAAA,CAAO,YAAY;EACrD,IAAI,KAAK,IAAI,GAAG,WAAW;OACnB,SAAS,OACT,OAAO,UAAU,QAAQ,MAAM,YAAY;EAAA;EAInD,OAAO;CACX;CAEA,WAAW,KAA0C;EACjD,IAAI,CAAC,KAAK,eACN,KAAK,gBAAgB,CAAC;EAG1B,KAAK,cAAc,KAAK,GAAG;EAC3B,OAAO;CACX;CAEA,MAAM,GAAwC;EAC1C,KAAK,WAAW;EAChB,OAAO;CACX;CAEA,OAAO,GAAwC;EAC3C,KAAK,YAAY;EACjB,OAAO;CACX;CAqBA,SAKI,QAG+F;EAC/F,MAAM,WAA0B;GAC5B,OAAO,OAAO;GACd,KAAK,OAAO;GACZ,OAAO,OAAO,SAAS,OAAO;GAC9B,OAAO,eAAe,OAAO,OAAO,OAAO,IAAI;EACnD;EACA,KAAK,eAAe,KAAK,QAAQ;EACjC,OAAO,IAAI,mBACP,KAAK,KAAK,KAAK,OAAO,KAAK,SAAS,KAAK,eACzC,KAAK,UAAU,KAAK,WAAW,CAAC,GAAG,KAAK,eAAe,OAAO,KAAK,GAAG,KAAK,gBAC3E,KAAK,UACT;CACJ;CAEA,QAAQ,OAAqE;EACzE,KAAK,aAAaA,QAAc,KAAK;EACrC,OAAO;CACX;CAEA,MAAM,QAA4C;EAE9C,QAAQ,MADW,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,EAAA,CACxB,MAAM;CACvB;CAEA,MAAM,SAA2B;EAC7B,OAAO,MAAM,KAAK,MAAM,IAAI;CAChC;CAEA,OAAe,mBAAmBC,IAAE,OAAO,OAAO;CAIlD,MAAM,MAA2B,QAAkC;EAC/D,MAAM,YAAY,KAAK,eAAe,KAAK,KAAK;GAAE,MAAM;GAAiB,QAAQ;GAAK,UAAU;GAAc,OAAO;EAAI;EACzH,MAAM,QAAQ,KAAK,MAAM;EAGzB,MAAM,YAAuB;GACzB,MAAM;GACC;GACI;GACX,SAAS,CAAC,OAAO;GACjB,SAAS;GACT,OAAO;GACP,QAAQ;EACZ;EAGA,MAAM,SAAoB,CAAC;EAG3B,MAAM,MAAM,iCAAiC,MAAM,UAFlC,kBAAkB,WAAW,QAAQ,KAAK,IAAI,GAAG,UAEE,EAAE,GAAG,KAAK,aAAa,MAAM,KAAK,aAAa;EAEnH,MAAM,OAAM,MADS,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM,EAAA,CAC/B,KAAK,EAAE,EAAE,SAAS;EAGrC,KAAK,IAAI,mBAAmB,CAAC,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC;EAEnD,IAAI,QACA,OAAO,OAAO,MAAM,GAAG;OAEvB,OAAO,mBAAmB,iBAAiB,MAAM,GAAG;CAE5D;CAEA,MAAM,KAAK,IAAgD;EACvD,IAAI,KAAK,QAAQ,SAAS,GACtB,MAAM,IAAI,MAAM,sGAAsG;EAG1H,MAAM,QAAQ,KAAK,MAAM;EACzB,MAAM,UAAU,KAAK,MAAM;EAG3B,MAAM,eAAe,KAAK,IAAI,oBAAoB,CAAC,CAAC,MAAK,MAAK,EAAE,OAAO,MAAM,WAAW,EAAE,SAAS,OAAO,CAAC;EAE3G,IAAI,cAAc;GACd,IAAI,aAAa,OAAO,UAEpB,OAAO;GAGX,OADY,KAAK,eAAe;IAAE,GAAG,aAAa;IAAM;IAAI,WAAW,KAAK,IAAI;GAAQ,CAC/E;EACb;EAEA,MAAM,eAAe,KAAK,eAAe,KAAI,MAAK,GAAG,EAAE,IAAI,MAAM,EAAE,OAAO;EAC1E,MAAM,0BAA0B,KAAK,cAAc,MAAM,GAAG,KAAK,cAAc,SAAS,KAAK,eAAe,MAAM;EAIlH,IAAI,MAAM,UAHS,wBAAwB,SAAS,IAC9C;GAAC;GAAM,GAAG,wBAAwB,KAAI,MAAK,KAAK,cAAc,CAAW,CAAC;GAAG,GAAG;GAAc;EAAW,CAAC,CAAC,KAAK,IAAI,IACpH,IACyB,QAAQ,MAAM,cAAc,KAAK,IAAI,GAAG,WAAW,YAAY,CAAC;EAC/F,IAAI,KAAK,YAAY,OAAO,IAAI,KAAK;EAGrC,MAAM,OAAM,MAFS,KAAK,IAAI,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,EAAA,CAE7B,KAAK,MAAM;EAK9B,MAAM,mBAAkC,MAAM,OAAO,IAAI,SAAS,IAAI;EACtE,KAAK,IAAI,mBAAmB,CAAC,CAAC,KAAK;GAC/B,MAAM;GACN;GACA;GACA;EACJ,CAAC;EAID,OAFkB,MAAM,KAAK,eAAe,GAAG,IAA0B;CAG7E;CAEA,MAAM,MAAqC;EACvC,MAAM,YAAY,KAAK,eAAe,IAAI,KAAK;GAAE,MAAM;GAAiB,QAAQ;GAAK,UAAU;GAAc,OAAO;EAAI;EACxH,MAAM,QAAQ,KAAK,MAAM;EAGzB,MAAM,YAAuB;GACzB,MAAM;GACC;GACI;GACX,SAAS,KAAK;GACd,SAAS,KAAK;GACd,OAAO,KAAK;GACZ,QAAQ,KAAK;EACjB;EAGA,MAAM,SAAoB,CAAC;EAC3B,MAAM,WAAW,kBAAkB,WAAW,QAAQ,KAAK,IAAI,GAAG,UAAU;EAE5E,MAAM,eAAe,KAAK,eAAe,KAAI,MAAK,GAAG,EAAE,IAAI,MAAM,EAAE,OAAO;EAC1E,MAAM,0BAA0B,KAAK,cAAc,MAAM,GAAG,KAAK,cAAc,SAAS,KAAK,eAAe,MAAM;EAClH,MAAM,kBAAkB,wBAAwB,SAAS,IACnD;GAAC;GAAM,GAAG,wBAAwB,KAAI,MAAK,KAAK,cAAc,CAAW,CAAC;GAAG,GAAG;GAAc;EAAW,IACzG;EAEN,IAAI,MAAM,UADS,MAAM,KAAK,IAAI,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IACzC,EAAE,QAAQ,MAAM,UAAU,SAAS;EAEhE,IAAI;EACJ,MAAM,iBAAiB,KAAK;EAE5B,IAAI,gBAAgB;GAChB,MAAM,UAAW,eAAe,SAAS;GACzC,MAAM,WAAW,eAAe,aAAa;GAE7C,gBAAgB,CACZ,KAAK,gBAAgB,eAAe,SAAS,QAAQ,GACrD,KAAK,gBAAgB,SAAS,QAAQ,CAC1C;GAEA,IAAI,KAAK,eACL,cAAc,KAAK,GAAG,KAAK,aAAa;EAEhD,OAAO,IAAI,KAAK,eACZ,gBAAgB,KAAK;EAGzB,IAAI,eACA,OAAO,aAAa,cAAc,KAAK,IAAI;EAG/C,MAAM,QAAQ,gBAAgB,SAAS,KAAK;EAC5C,IAAI,UAAU,MACV,OAAO,UAAU;EAErB,IAAI,KAAK,cAAc,QAAQ,CAAC,KAAK,kBACjC,OAAO,WAAW,KAAK;EAE3B,IAAI,KAAK,YAAY,OAAO,IAAI,KAAK;EAErC,MAAM,SAAS,MAAM,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM;EAGlD,KAAK,IAAI,mBAAmB,CAAC,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC;EAInD,OAFa,OAAO,KAAK,KAAI,QAAO,KAAK,eAAe,GAAG,CAEjD;CACd;CAEA,eAAuB,mBAA8C;EACjE,IAAI,KAAK,QAAQ,WAAW,GAAG,OAAO;EAEtC,MAAM,aAA0B,CAAC;EACjC,MAAM,KAAK,IAAI,cAAiB,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM;EACrE,IAAI;EAEJ,MAAM,SAAS,KAAK;EACpB,MAAM,SAAS,QAAQ;EACvB,IAAI,UAAU,UAAU,MAAM;GAE1B,MAAM,cADW,OAAO,aAAa,YACL;GAChC,MAAM,UAAW,OAAO,SAAS;GAEjC,kBAAkB,MAAM;IACpB,EAAE,GAAG,EACA,OAAO;KACJ,OAAO,aACH,GAAG,GAAG,OAAO,SAAS,OAAO,IAAI,IACjC,GAAG,GAAG,OAAO,SAAS,OAAO,IAAI;IACzC,IACC,OAAO;KACJ,MAAM,IAAI,GAAG,GAAG,OAAO,SAAS,OAAO,IAAI;KAC3C,OAAO,aACH,EAAE,GAAG,SAAS,OAAO,EAAE,IACvB,EAAE,GAAG,SAAS,OAAO,EAAE;IAC/B,CACJ,CAAC;GACL;EAEJ;EAGA,MAAM,QAAQ,KAAK,QAAQ,UAAU,iBAAiB,IAAI;EAC1D,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;GAK5B,CAJiB,KAAK,KAAK,QAAQ,SAC7B,iBACA,KAAK,QAAQ,GAAA,CAEV,EAAE;GACX,IAAI,GAAG,WAAW,SAAS,GAAG;IAE1B,IADc,GAAG,WAAW,MAAK,MAAK,EAAE,SAAS,IACzC,GACJ,WAAW,KAAK,GAAG,GAAG,UAAU;SAEhC,WAAW,KAAK;KAAE,MAAM;KAAO,UAAU,GAAG;IAAW,CAAC;IAE5D,GAAG,aAAa,CAAC;GACrB;EACJ;EAEA,IAAI,WAAW,WAAW,GAAG,OAAO;EACpC,IAAI,WAAW,WAAW,GAAG,OAAO,WAAW,MAAM;EACrD,OAAO;GAAE,MAAM;GAAO,UAAU;EAAW;CAC/C;AACJ;AAIA,IAAM,gBAAN,MAAM,cAA+D;CAIrD;CACA;CAJZ,aAA0B,CAAC;CAE3B,YACI,SACA,QACF;EAFU,KAAA,UAAA;EACA,KAAA,SAAA;CACR;CAEJ,IAAY,QAAgB,UAA2B,OAAgB,QAAkB,KAAqB;EAC1G,MAAM,OAAsB;GAAE,MAAM;GAAQ;GAAkB;GAAiB;GAAO;EAAO;EAC7F,IAAI,KAAK,KAAK,MAAM;EACpB,KAAK,WAAW,KAAK,IAAI;CAC7B;CAEA,gBAAwB,UAA2B,KAAa,OAAgB,MAA6C;EAEzH,MAAM,OAAsB;GACxB,MAAM;GACN,QAHQ,KAAK,cAAc,GAGjB;GACA;GACV,OAAO,KAAK,WAAW,OAAO,MAAM,GAAG;EAC3C;EACA,IAAI,MAAM,KAAK,KAAK,MAAM;EAC1B,MAAM,OAAO,gBAAgB,IAAI;EACjC,IAAI,SAAS,KAAA,GAAW,KAAK,OAAO;EACpC,KAAK,WAAW,KAAK,IAAI;CAC7B;CAEA,cAAsB,KAAqB;EACvC,OAAO,KAAK,QAAQ,QAAQ;CAChC;CAEA,OAAe,KAAa,OAAyB;EACjD,MAAM,QAAQ,KAAK,OAAO;EAC1B,IAAI,CAAC,OAAO,UAAU,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO;EACpE,OAAO,MAAM,OAAO,KAAK;CAC7B;CAEA,WAAmB,OAAgB,KAAmC;EAClE,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;EAGlD,IAAI,KAAK,OAAO;EAGhB,OAAO,KAAK,UAAU,KAAK;CAC/B;CAEA,GAAmC,KAAQ,OAA2C;EAClF,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,KAAK,KAAK,OAAO,KAAe,KAAK,CAAC;EAClF,OAAO;CACX;CAEA,IAAoC,KAAQ,OAA2C;EACnF,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,MAAM,KAAK,OAAO,KAAe,KAAK,CAAC;EACnF,OAAO;CACX;CAEA,GAAoC,KAAQ,OAA2C;EACnF,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,KAAK,KAAK,OAAO,KAAe,KAAK,CAAC;EAClF,OAAO;CACX;CAEA,IAAqC,KAAQ,OAA2C;EACpF,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,MAAM,KAAK,OAAO,KAAe,KAAK,CAAC;EACnF,OAAO;CACX;CAEA,GAAoC,KAAQ,OAA2C;EACnF,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,KAAK,KAAK,OAAO,KAAe,KAAK,CAAC;EAClF,OAAO;CACX;CAEA,IAAqC,KAAQ,OAA2C;EACpF,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,MAAM,KAAK,OAAO,KAAe,KAAK,CAAC;EACnF,OAAO;CACX;CAEA,KAAmC,KAAQ,SAAmC;EAC1E,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,QAAQ,KAAK,OAAO,KAAe,OAAO,CAAC;EACvF,OAAO;CACX;CAEA,MAAoC,KAAQ,SAAmC;EAC3E,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,SAAS,KAAK,OAAO,KAAe,OAAO,CAAC;EACxF,OAAO;CACX;CAEA,SAAuC,KAAQ,OAAiC;EAC5E,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,YAAY,KAAK,OAAO,KAAe,KAAK,CAAC;EACzF,OAAO;CACX;CAEA,UAAwC,KAAQ,OAAiC;EAC7E,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,aAAa,KAAK,OAAO,KAAe,KAAK,CAAC;EAC1F,OAAO;CACX;;;;;;;;;CAUA,aAAyC,KAAQ,OAAgB,MAA8C;EAC3G,KAAK,gBAAgB,gBAAgB,KAAe,OAAO,IAAI;EAC/D,OAAO;CACX;;CAGA,gBAA4C,KAAQ,OAAgB,MAA8C;EAC9G,KAAK,gBAAgB,mBAAmB,KAAe,OAAO,IAAI;EAClE,OAAO;CACX;CAsBA,WACI,KACA,OACA,MACgB;EAChB,MAAM,MAAM,KAAK,cAAc,GAAa;EAE5C,IAAI,MAAM,QAAQ,MAAM,QAAQ,KAAK,GAAG;GAIpC,MAAM,OAAsB;IACxB,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAPW,MAAgC,KAAK,MAChD,KAAK,OAAO,OAAO,MAAM,WAAW,IAAI,eAAe,MAAM,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAMtE;IACX,MAAM,KAAK;GACf;GACA,KAAK,WAAW,KAAK,IAAI;GACzB,OAAO;EACX;EAEA,IAAI,MAAM,QAAQ,KAAK,GACnB,KAAK,IAAI,KAAK,cAAc,eAAe,KAAiB,GAAG,KAAA,GAAW,IAAI;OAC3E,IAAI,MAAM,KACb,KAAK,IAAI,KAAK,cAAc,OAAO,KAAA,GAAW,IAAI;OAElD,KAAK,IAAI,KAAK,cAAc,OAAO,KAAA,GAAW,KAAK;EAEvD,OAAO;CACX;;;;;;;CAQA,kBAA8C,KAAQ,OAAgB,MAA8C;EAChH,KAAK,gBAAgB,qBAAqB,KAAe,OAAO,IAAI;EACpE,OAAO;CACX;CAEA,QAAyC,KAAQ,IAAsB,IAAwC;EAC3G,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,WAAW,KAAK,OAAO,KAAe,EAAE,GAAG,KAAK,OAAO,KAAe,EAAE,CAAC;EACrH,OAAO;CACX;;;;;;;CAQA,GAAmC,KAAQ,QAAuD;EAC9F,MAAM,MAAM,KAAK,cAAc,GAAa;EAC5C,KAAK,IAAI,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK,OAAO,KAAe,CAAC,CAAC,CAAC;EACpE,OAAO;CACX;CAEA,OAAuC,KAA0B;EAC7D,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,UAAU,IAAI;EAC1D,OAAO;CACX;CAEA,QAAwC,KAA0B;EAC9D,KAAK,IAAI,KAAK,cAAc,GAAa,GAAG,aAAa,IAAI;EAC7D,OAAO;CACX;;;;;;;;;;;CAYA,GAAG,UAAgE;EAC/D,MAAM,WAAwB,CAAC;EAC/B,KAAK,MAAM,MAAM,UAAU;GACvB,MAAM,MAAM,IAAI,cAAiB,KAAK,SAAS,KAAK,MAAM;GAC1D,GAAG,GAAG;GACN,IAAI,IAAI,WAAW,WAAW,GAC1B,SAAS,KAAK,IAAI,WAAW,EAAE;QAC5B,IAAI,IAAI,WAAW,SAAS,GAC/B,SAAS,KAAK;IAAE,MAAM;IAAO,UAAU,IAAI;GAAW,CAAC;EAE/D;EACA,IAAI,SAAS,SAAS,GAClB,KAAK,WAAW,KAAK;GAAE,MAAM;GAAM;EAAS,CAAC;EAEjD,OAAO;CACX;AACJ;AAGA,SAAgB,kBAAkB,WAAsB,QAAmB,KAAyB;CAChG,QAAQ,UAAU,MAAlB;EACI,KAAK,OAED,OAAO,IADO,UAAU,SAAS,KAAK,MAAM,kBAAkB,GAAG,QAAQ,GAAG,CAC7D,CAAC,CAAC,KAAK,OAAO,EAAE;EAEnC,KAAK,MAED,OAAO,IADO,UAAU,SAAS,KAAK,MAAM,kBAAkB,GAAG,QAAQ,GAAG,CAC7D,CAAC,CAAC,KAAK,MAAM,EAAE;EAElC,KAAK,QACD,OAAO,aAAa,WAAW,QAAQ,GAAG;CAElD;AACJ;AAEA,SAAS,aAAa,MAAqB,QAAmB,KAAyB;CACnF,MAAM,MAAM,KAAK;CACjB,QAAQ,KAAK,UAAb;EACI,KAAK;EAAK,KAAK;EAAM,KAAK;EAAK,KAAK;EAAM,KAAK;EAAK,KAAK;GACrD,OAAO,KAAK,KAAK,KAAK;GACtB,OAAO,GAAG,IAAI,GAAG,KAAK,SAAS,GAAG,IAAI,YAAY,OAAO,MAAM;EAEnE,KAAK,WAAW;GACZ,OAAO,KAAK,KAAK,KAAK;GACtB,MAAM,KAAK,IAAI,YAAY,OAAO,MAAM;GACxC,OAAO,KAAK,KAAK,MAAM;GAEvB,OAAO,GAAG,IAAI,WAAW,GAAG,OADjB,IAAI,YAAY,OAAO,MACE;EACxC;EACA,KAAK,MAAM;GACP,MAAM,SAAU,KAAK,SAAS,CAAC;GAE/B,IAAI,OAAO,WAAW,GAAG,OAAO;GAKhC,OAAO,GAAG,IAAI,OAJO,OAAO,KAAK,MAAM;IACnC,OAAO,KAAK,CAAC;IACb,OAAO,IAAI,YAAY,OAAO,MAAM;GACxC,CACgC,CAAC,CAAC,KAAK,IAAI,EAAE;EACjD;EACA,KAAK;GACD,OAAO,KAAK,KAAK,KAAK;GACtB,OAAO,GAAG,IAAI,QAAQ,IAAI,YAAY,OAAO,MAAM;EAEvD,KAAK;GACD,OAAO,KAAK,KAAK,KAAK;GACtB,OAAO,IAAI,MAAM,KAAK,OAAO,MAAM;EAEvC,KAAK;GACD,OAAO,KAAK,IAAI,KAAK,MAAM,EAAE;GAC7B,OAAO,GAAG,IAAI,QAAQ,IAAI,YAAY,OAAO,MAAM;EAEvD,KAAK;GACD,OAAO,KAAK,IAAI,KAAK,MAAM,EAAE;GAC7B,OAAO,IAAI,UAAU,KAAK,OAAO,MAAM;EAE3C,KAAK,gBAAgB;GACjB,OAAO,KAAK,KAAK,KAAK;GACtB,MAAM,SAAS,OAAO;GACtB,IAAI;GACJ,IAAI,KAAK,SAAS,KAAA,GAAW;IACzB,OAAO,KAAK,KAAK,IAAI;IACrB,YAAY,OAAO;GACvB;GACA,OAAO,IAAI,aAAa,KAAK,QAAQ;IAAE,KAAK,KAAK;IAAK;GAAU,CAAC;EACrE;EACA,KAAK,mBAAmB;GACpB,OAAO,KAAK,KAAK,KAAK;GACtB,MAAM,SAAS,OAAO;GACtB,IAAI;GACJ,IAAI,KAAK,SAAS,KAAA,GAAW;IACzB,OAAO,KAAK,KAAK,IAAI;IACrB,YAAY,OAAO;GACvB;GACA,OAAO,IAAI,gBAAgB,KAAK,QAAQ;IAAE,KAAK,KAAK;IAAK;GAAU,CAAC;EACxE;EACA,KAAK;GACD,IAAI,KAAK,QAAQ,MAAM,QAAQ,KAAK,KAAK,GAAG;IACxC,MAAM,QAAQ,KAAK;IACnB,MAAM,WAAW,OAAO,SAAS;IACjC,KAAK,MAAM,KAAK,OAAO,OAAO,KAAK,CAAC;IACpC,OAAO,IAAI,WAAW,KAAK,UAAU;KACjC,KAAK;KACL,MAAM,KAAK;KACX,WAAW,MAAM;IACrB,CAAC;GACL;GACA,OAAO,KAAK,KAAK,KAAK;GACtB,OAAO,IAAI,WAAW,KAAK,OAAO,QAAQ,EAAE,KAAK,KAAK,IAAI,CAAC;EAE/D,KAAK,qBAAqB;GACtB,OAAO,KAAK,KAAK,KAAK;GACtB,MAAM,SAAS,OAAO;GACtB,IAAI;GACJ,IAAI,KAAK,SAAS,KAAA,GAAW;IACzB,OAAO,KAAK,KAAK,IAAI;IACrB,YAAY,OAAO;GACvB;GACA,OAAO,IAAI,kBAAkB,KAAK,QAAQ;IAAE,KAAK,KAAK;IAAK;GAAU,CAAC;EAC1E;EACA,KAAK,UAAU,OAAO,GAAG,IAAI;EAC7B,KAAK,aAAa,OAAO,GAAG,IAAI;CACpC;AACJ;AAEA,SAAgB,iBAAiB,KAA8B,WAA+B;CAC1F,QAAQ,UAAU,MAAlB;EACI,KAAK,OAAO,OAAO,UAAU,SAAS,OAAO,MAAM,iBAAiB,KAAK,CAAC,CAAC;EAC3E,KAAK,MAAM,OAAO,UAAU,SAAS,MAAM,MAAM,iBAAiB,KAAK,CAAC,CAAC;EACzE,KAAK,QAAQ,OAAO,YAAY,KAAK,SAAS;CAClD;AACJ;AAEA,SAAS,YAAY,KAA8B,MAA8B;CAC7E,MAAM,MAAM,IAAI,KAAK;CAErB,QAAQ,KAAK,UAAb;EACI,KAAK,KAAK,OAAO,QAAQ,KAAK;EAC9B,KAAK,MAAM,OAAO,QAAQ,KAAK;EAC/B,KAAK,KAAK,OAAQ,MAAkB,KAAK;EACzC,KAAK,MAAM,OAAQ,OAAmB,KAAK;EAC3C,KAAK,KAAK,OAAQ,MAAkB,KAAK;EACzC,KAAK,MAAM,OAAQ,OAAmB,KAAK;EAE3C,KAAK,WACD,OAAQ,OAAmB,KAAK,SAC3B,OAAmB,KAAK;EAEjC,KAAK,MACD,OAAO,MAAM,QAAQ,KAAK,KAAK,KAAM,KAAK,MAAoB,SAAS,GAAG;EAE9E,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,aAAa;GACd,IAAI,OAAO,QAAQ,YAAY,OAAO,KAAK,UAAU,UAAU,OAAO;GACtE,MAAM,WAAY,KAAK,aAAa,WAAW,KAAK,aAAa,cAC1D,IAAe,YAAY,IAC5B;GACN,MAAM,MAAM,KAAK;GACjB,MAAM,SAAU,KAAK,aAAa,WAAW,KAAK,aAAa,cACzD,IAAI,YAAY,IAChB;GACN,MAAM,UAAW,KAAK,aAAa,cAAc,KAAK,aAAa,cAC7D,IAAI,OAAO,KACX;GAIN,OAAO,IAHW,OACd,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC,CAAC,QAAQ,MAAM,GAAG,IAAI,GAEhD,CAAC,CAAC,KAAK,QAAQ;EAC9B;EAEA,KAAK,gBAAgB;GACjB,MAAM,YAAY,oBAAoB,IAAI;GAC1C,MAAM,SAAS,KAAK,SAAS,KAAA,IAAY,gBAAgB,KAAK,KAAK,IAAI,IAAI;GAC3E,IAAI,WAAW,KAAA,GAAW,OAAO;GACjC,OAAO,aAAa,QAAQ,SAAS;EACzC;EAEA,KAAK,mBAAmB;GACpB,MAAM,YAAY,oBAAoB,IAAI;GAC1C,MAAM,SAAS,KAAK,SAAS,KAAA,IAAY,gBAAgB,KAAK,KAAK,IAAI,IAAI;GAC3E,IAAI,WAAW,KAAA,GAAW,OAAO;GACjC,OAAO,aAAa,WAAW,MAAM;EACzC;EAEA,KAAK,cAAc;GACf,IAAI,KAAK,QAAQ,MAAM,QAAQ,KAAK,KAAK,GAAG;IACxC,MAAM,QAAQ,KAAK;IACnB,IAAI,MAAM,WAAW,GAAG,OAAO;IAC/B,OAAO,KAAK,SAAS,QACf,MAAM,OAAO,MAAM,eAAe,KAAK,CAAC,CAAC,IACzC,MAAM,MAAM,MAAM,eAAe,KAAK,CAAC,CAAC;GAClD;GACA,IAAI,KAAK,KACL,OAAO,eAAe,KAAK,KAAK,KAAe;GAEnD,MAAM,MAAM,KAAK;GACjB,IAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU,OAAO;GACpD,IAAI,MAAM,QAAQ,GAAG,GAAG,OAAQ,IAAkB,SAAS,GAAG;GAC9D,OAAO,OAAQ;EACnB;EAEA,KAAK,qBAAqB;GACtB,MAAM,YAAY,oBAAoB,IAAI;GAC1C,MAAM,SAAS,KAAK,SAAS,KAAA,IAAY,gBAAgB,KAAK,KAAK,IAAI,IAAI;GAC3E,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG,OAAO;GACnC,OAAQ,OAAqB,MAAM,OAAO,aAAa,IAAI,SAAS,CAAC;EACzE;EAEA,KAAK,UACD,OAAO,QAAQ;EAEnB,KAAK,aACD,OAAO,QAAQ;EAEnB,SACI,OAAO;CACf;AACJ;AAIA,SAAS,oBAAoB,MAA8B;CACvD,IAAI,CAAC,KAAK,KAAK,OAAO,KAAK;CAC3B,IAAI,OAAO,KAAK,UAAU,UAAU,OAAO,KAAK;CAChD,IAAI;EAAE,OAAO,KAAK,MAAM,KAAK,KAAK;CAAG,QAAQ;EAAE,OAAO,KAAK;CAAO;AACtE;AAOA,SAAgB,aAAa,QAAiB,WAA6B;CACvE,IAAI,cAAc,QAAQ,OAAO;CACjC,IAAI,WAAW,QAAQ,cAAc,MAAM,OAAO,WAAW;CAC7D,IAAI,WAAW,KAAA,KAAa,cAAc,KAAA,GAAW,OAAO;CAE5D,MAAM,OAAO,MAAM,QAAQ,MAAM;CACjC,MAAM,OAAO,MAAM,QAAQ,SAAS;CACpC,MAAM,OAAO,CAAC,QAAQ,OAAO,WAAW;CACxC,MAAM,OAAO,CAAC,QAAQ,OAAO,cAAc;CAG3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,MAClB,OAAQ,OAAqB,MAAM,OAAO,aAAa,IAAI,SAAS,CAAC;CAGzE,IAAI,QAAQ,MAAM;EACd,MAAM,IAAI;EACV,OAAQ,UAAwB,OAAO,MAAM,EAAE,MAAM,OAAO,aAAa,IAAI,CAAC,CAAC,CAAC;CACpF;CAEA,IAAI,QAAQ,MAAM;EACd,MAAM,IAAI;EACV,MAAM,IAAI;EACV,KAAK,MAAM,KAAK,OAAO,KAAK,CAAC,GAAG;GAC5B,IAAI,EAAE,KAAK,IAAI,OAAO;GACtB,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO;EAC1C;EACA,OAAO;CACX;CACA,OAAO;AACX;AAKA,SAAgB,gBAAgB,KAAc,MAAuB;CACjE,IAAI,IAAI;CACR,IAAI,EAAE,WAAW,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC;CACpC,IAAI,MAAe;CACnB,OAAO,EAAE,SAAS,GACd,IAAI,EAAE,WAAW,KAAI,GAAG;EACpB,IAAI,MAAM;EACV,OAAO,MAAM,EAAE,QAAQ;GACnB,IAAI,EAAE,SAAS,QAAQ,MAAM,IAAI,EAAE,QAAQ;IAAE,OAAO;IAAG;GAAU;GACjE,IAAI,EAAE,SAAS,MAAK;GACpB;EACJ;EACA,IAAI,OAAO,EAAE,QAAQ,OAAO,KAAA;EAC5B,MAAM,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,QAAQ,IAAG,CAAC,CAAC,QAAQ,SAAS,IAAI;EACtE,IAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG,OAAO,KAAA;EAC1E,IAAI,EAAE,OAAQ,MAAiB,OAAO,KAAA;EACtC,MAAO,IAAgC;EACvC,IAAI,EAAE,MAAM,MAAM,CAAC;CACvB,OAAO,IAAI,EAAE,WAAW,GAAG,GAAG;EAC1B,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW;EACtC,IAAI,CAAC,GAAG,OAAO,KAAA;EACf,MAAM,MAAM,EAAE;EACd,IAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG,OAAO,KAAA;EAC1E,IAAI,EAAE,OAAQ,MAAiB,OAAO,KAAA;EACtC,MAAO,IAAgC;EACvC,IAAI,EAAE,MAAM,IAAI,IAAI,MAAM;CAC9B,OAAO,IAAI,EAAE,WAAW,GAAG,GAAG;EAC1B,MAAM,MAAM,EAAE,QAAQ,GAAG;EACzB,IAAI,QAAQ,IAAI,OAAO,KAAA;EACvB,MAAM,MAAM,SAAS,EAAE,MAAM,GAAG,GAAG,GAAG,EAAE;EACxC,IAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,MAAM,KAAK,OAAQ,IAAkB,QAAQ,OAAO,KAAA;EAC/E,MAAO,IAAkB;EACzB,IAAI,EAAE,MAAM,MAAM,CAAC;CACvB,OACI;CAGR,OAAO;AACX;AAMA,SAAgB,eAAe,KAAc,MAAuB;CAChE,IAAI,IAAI;CACR,IAAI,EAAE,WAAW,GAAG,GAAG,IAAI,EAAE,MAAM,CAAC;CACpC,IAAI,MAAe;CACnB,OAAO,EAAE,SAAS,GACd,IAAI,EAAE,WAAW,KAAI,GAAG;EACpB,IAAI,MAAM;EACV,OAAO,MAAM,EAAE,QAAQ;GACnB,IAAI,EAAE,SAAS,QAAQ,MAAM,IAAI,EAAE,QAAQ;IAAE,OAAO;IAAG;GAAU;GACjE,IAAI,EAAE,SAAS,MAAK;GACpB;EACJ;EACA,IAAI,OAAO,EAAE,QAAQ,OAAO;EAC5B,MAAM,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,QAAQ,IAAG,CAAC,CAAC,QAAQ,SAAS,IAAI;EACtE,IAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG,OAAO;EAC1E,IAAI,EAAE,OAAQ,MAAiB,OAAO;EACtC,MAAO,IAAgC;EACvC,IAAI,EAAE,MAAM,MAAM,CAAC;CACvB,OAAO,IAAI,EAAE,WAAW,GAAG,GAAG;EAC1B,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW;EACtC,IAAI,CAAC,GAAG,OAAO;EACf,MAAM,MAAM,EAAE;EACd,IAAI,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG,OAAO;EAC1E,IAAI,EAAE,OAAQ,MAAiB,OAAO;EACtC,MAAO,IAAgC;EACvC,IAAI,EAAE,MAAM,IAAI,IAAI,MAAM;CAC9B,OAAO,IAAI,EAAE,WAAW,GAAG,GAAG;EAC1B,MAAM,MAAM,EAAE,QAAQ,GAAG;EACzB,IAAI,QAAQ,IAAI,OAAO;EACvB,MAAM,MAAM,SAAS,EAAE,MAAM,GAAG,GAAG,GAAG,EAAE;EACxC,IAAI,CAAC,MAAM,QAAQ,GAAG,KAAK,MAAM,KAAK,OAAQ,IAAkB,QAAQ,OAAO;EAC/E,MAAO,IAAkB;EACzB,IAAI,EAAE,MAAM,MAAM,CAAC;CACvB,OACI,OAAO;CAGf,OAAO,QAAQ,KAAA;AACnB"}