@undefineds.co/xpod 0.3.6 → 0.3.15

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 (249) hide show
  1. package/config/cli.json +1 -1
  2. package/config/cloud.json +54 -22
  3. package/config/local.json +56 -12
  4. package/config/resolver.json +10 -2
  5. package/config/xpod.base.json +50 -0
  6. package/config/xpod.json +8 -8
  7. package/dist/agents/config/resolve.js +10 -10
  8. package/dist/agents/config/resolve.js.map +1 -1
  9. package/dist/api/chatkit/index.d.ts +1 -1
  10. package/dist/api/chatkit/index.js.map +1 -1
  11. package/dist/api/chatkit/pod-store.d.ts +14 -11
  12. package/dist/api/chatkit/pod-store.js +114 -78
  13. package/dist/api/chatkit/pod-store.js.map +1 -1
  14. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  15. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  16. package/dist/api/chatkit/service.js +1 -1
  17. package/dist/api/chatkit/service.js.map +1 -1
  18. package/dist/api/chatkit/types.d.ts +11 -11
  19. package/dist/api/chatkit/types.js +3 -3
  20. package/dist/api/chatkit/types.js.map +1 -1
  21. package/dist/api/container/cloud.js +0 -8
  22. package/dist/api/container/cloud.js.map +1 -1
  23. package/dist/api/container/index.js +2 -1
  24. package/dist/api/container/index.js.map +1 -1
  25. package/dist/api/container/local.js +0 -7
  26. package/dist/api/container/local.js.map +1 -1
  27. package/dist/api/container/routes.js +3 -17
  28. package/dist/api/container/routes.js.map +1 -1
  29. package/dist/api/container/types.d.ts +0 -2
  30. package/dist/api/container/types.js.map +1 -1
  31. package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
  32. package/dist/api/handlers/PodManagementHandler.js +71 -1
  33. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  34. package/dist/api/handlers/RunHandler.js +5 -5
  35. package/dist/api/handlers/RunHandler.js.map +1 -1
  36. package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
  37. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  38. package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
  39. package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
  40. package/dist/api/runs/ManagedRunWorker.js +6 -6
  41. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  42. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
  43. package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
  44. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  45. package/dist/api/runs/RunStateCenter.d.ts +3 -3
  46. package/dist/api/runs/RunStateCenter.js +13 -13
  47. package/dist/api/runs/RunStateCenter.js.map +1 -1
  48. package/dist/api/runs/store.d.ts +4 -4
  49. package/dist/api/runs/store.js +2 -2
  50. package/dist/api/runs/store.js.map +1 -1
  51. package/dist/api/service/VectorStoreService.d.ts +1 -1
  52. package/dist/api/service/VectorStoreService.js +16 -16
  53. package/dist/api/service/VectorStoreService.js.map +1 -1
  54. package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
  55. package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
  56. package/dist/api/tasks/TaskMaterializer.js +11 -11
  57. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  58. package/dist/api/tasks/TaskService.d.ts +3 -3
  59. package/dist/api/tasks/TaskService.js +11 -7
  60. package/dist/api/tasks/TaskService.js.map +1 -1
  61. package/dist/api/tasks/store.d.ts +10 -4
  62. package/dist/api/tasks/store.js +14 -4
  63. package/dist/api/tasks/store.js.map +1 -1
  64. package/dist/api/workspace/types.d.ts +3 -3
  65. package/dist/api/workspace/types.js +6 -6
  66. package/dist/api/workspace/types.js.map +1 -1
  67. package/dist/cli/commands/config.js +2 -2
  68. package/dist/cli/commands/config.js.map +1 -1
  69. package/dist/cli/commands/start.js +9 -3
  70. package/dist/cli/commands/start.js.map +1 -1
  71. package/dist/components/components.jsonld +8 -2
  72. package/dist/components/context.jsonld +308 -51
  73. package/dist/http/search/SearchHttpHandler.js +8 -8
  74. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  75. package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
  76. package/dist/identity/drizzle/PodLookupRepository.js +95 -4
  77. package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
  78. package/dist/identity/drizzle/db.js +4 -43
  79. package/dist/identity/drizzle/db.js.map +1 -1
  80. package/dist/identity/drizzle/schema.pg.d.ts +0 -5
  81. package/dist/identity/drizzle/schema.pg.js +2 -16
  82. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  83. package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
  84. package/dist/identity/drizzle/schema.sqlite.js +2 -16
  85. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  86. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
  87. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
  88. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  89. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
  90. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
  91. package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
  92. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  93. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
  94. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
  95. package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
  96. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
  97. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
  98. package/dist/index.d.ts +12 -2
  99. package/dist/index.js +16 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.js +8 -2
  102. package/dist/main.js.map +1 -1
  103. package/dist/provision/ProvisionPodCreator.d.ts +3 -4
  104. package/dist/provision/ProvisionPodCreator.js +8 -13
  105. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  106. package/dist/provision/ProvisionPodCreator.jsonld +7 -7
  107. package/dist/runtime/Proxy.d.ts +0 -1
  108. package/dist/runtime/Proxy.js +0 -9
  109. package/dist/runtime/Proxy.js.map +1 -1
  110. package/dist/runtime/bootstrap.d.ts +1 -0
  111. package/dist/runtime/bootstrap.js +5 -2
  112. package/dist/runtime/bootstrap.js.map +1 -1
  113. package/dist/runtime/css-process.d.ts +12 -4
  114. package/dist/runtime/css-process.js +61 -14
  115. package/dist/runtime/css-process.js.map +1 -1
  116. package/dist/runtime/oidc-issuer.d.ts +3 -2
  117. package/dist/runtime/oidc-issuer.js +3 -2
  118. package/dist/runtime/oidc-issuer.js.map +1 -1
  119. package/dist/runtime/runtime-types.d.ts +1 -0
  120. package/dist/runtime/runtime-types.js.map +1 -1
  121. package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
  122. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
  123. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
  124. package/dist/solidfs/LocalSolidFS.d.ts +18 -0
  125. package/dist/solidfs/LocalSolidFS.js +539 -0
  126. package/dist/solidfs/LocalSolidFS.js.map +1 -0
  127. package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
  128. package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
  129. package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
  130. package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
  131. package/dist/solidfs/PodSolidFsHydrator.js +127 -0
  132. package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
  133. package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
  134. package/dist/solidfs/PodSolidFsSyncer.js +78 -0
  135. package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
  136. package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
  137. package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
  138. package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
  139. package/dist/solidfs/index.d.ts +7 -0
  140. package/dist/solidfs/index.js +24 -0
  141. package/dist/solidfs/index.js.map +1 -0
  142. package/dist/solidfs/types.d.ts +131 -0
  143. package/dist/solidfs/types.js +19 -0
  144. package/dist/solidfs/types.js.map +1 -0
  145. package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
  146. package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
  147. package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
  148. package/dist/storage/SparqlUpdateResourceStore.js +13 -0
  149. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  150. package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
  151. package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
  152. package/dist/storage/accessors/MixDataAccessor.js +511 -16
  153. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  154. package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
  155. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
  156. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
  157. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  158. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
  159. package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
  160. package/dist/storage/quint/BaseQuintStore.js +51 -27
  161. package/dist/storage/quint/BaseQuintStore.js.map +1 -1
  162. package/dist/storage/quint/PgQuintStore.d.ts +1 -0
  163. package/dist/storage/quint/PgQuintStore.js +50 -32
  164. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  165. package/dist/storage/quint/PgQuintStore.jsonld +4 -3
  166. package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
  167. package/dist/storage/quint/SqliteQuintStore.js +100 -0
  168. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  169. package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
  170. package/dist/storage/quint/types.d.ts +16 -0
  171. package/dist/storage/quint/types.js.map +1 -1
  172. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
  173. package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
  174. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
  175. package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
  176. package/dist/storage/rdf/RdfContentTypes.js +79 -0
  177. package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
  178. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +79 -0
  179. package/dist/storage/rdf/RdfLocalQueryEngine.js +2705 -0
  180. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
  181. package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
  182. package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
  183. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
  184. package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
  185. package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
  186. package/dist/storage/rdf/RdfShadowComparator.js +47 -0
  187. package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
  188. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
  189. package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
  190. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
  191. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
  192. package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
  193. package/dist/storage/rdf/RdfTermDictionary.js +352 -0
  194. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
  195. package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
  196. package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
  197. package/dist/storage/rdf/RdfTermSemantics.js +40 -0
  198. package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
  199. package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
  200. package/dist/storage/rdf/RdfTextIndex.js +569 -0
  201. package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
  202. package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
  203. package/dist/storage/rdf/RdfVectorIndex.js +631 -0
  204. package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
  205. package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
  206. package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
  207. package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
  208. package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
  209. package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
  210. package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
  211. package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
  212. package/dist/storage/rdf/SolidRdfEngine.d.ts +56 -0
  213. package/dist/storage/rdf/SolidRdfEngine.js +292 -0
  214. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
  215. package/dist/storage/rdf/SolidRdfEngine.jsonld +372 -0
  216. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
  217. package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
  218. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
  219. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
  220. package/dist/storage/rdf/index.d.ts +15 -0
  221. package/dist/storage/rdf/index.js +61 -0
  222. package/dist/storage/rdf/index.js.map +1 -0
  223. package/dist/storage/rdf/models-benchmark.d.ts +260 -0
  224. package/dist/storage/rdf/models-benchmark.js +1405 -0
  225. package/dist/storage/rdf/models-benchmark.js.map +1 -0
  226. package/dist/storage/rdf/types.d.ts +726 -0
  227. package/dist/storage/rdf/types.js +3 -0
  228. package/dist/storage/rdf/types.js.map +1 -0
  229. package/dist/storage/rdf/types.jsonld +316 -0
  230. package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
  231. package/dist/storage/vector/VectorIndexingListener.js +19 -19
  232. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  233. package/package.json +3 -2
  234. package/templates/pod/acp/.acr.hbs +39 -0
  235. package/templates/pod/acp/README.acr +18 -0
  236. package/templates/pod/acp/profile/card.acr +22 -0
  237. package/templates/pod/base/README$.md.hbs +27 -0
  238. package/templates/pod/base/profile/card$.ttl.hbs +13 -0
  239. package/templates/pod/wac/.acl.hbs +26 -0
  240. package/templates/pod/wac/README.acl.hbs +14 -0
  241. package/templates/pod/wac/profile/card.acl.hbs +19 -0
  242. package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
  243. package/dist/api/handlers/WebIdProfileHandler.js +0 -423
  244. package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
  245. package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
  246. package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
  247. package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
  248. package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
  249. package/dist/storage/quint/BaseQuintStore.jsonld +0 -257
@@ -216,40 +216,58 @@ class PgQuintStore extends BaseQuintStore_1.BaseQuintStore {
216
216
  * 重写 open 方法,处理 PostgreSQL 特定的语法
217
217
  */
218
218
  async open() {
219
- if (this.executor) {
219
+ if (this.opened) {
220
220
  return;
221
221
  }
222
- this.executor = await this.createExecutor();
223
- // PostgreSQL 建表语法
224
- await this.executor.exec(`
225
- CREATE TABLE IF NOT EXISTS quints (
226
- object_kind TEXT,
227
- object_key TEXT,
228
- object_text TEXT,
229
- object_digest TEXT,
230
- graph TEXT NOT NULL,
231
- subject TEXT NOT NULL,
232
- predicate TEXT NOT NULL,
233
- object TEXT NOT NULL,
234
- vector TEXT
235
- )
236
- `);
237
- await this.ensureTypedObjectSchema();
238
- const indexes = [
239
- 'CREATE INDEX IF NOT EXISTS idx_quints_graph ON quints (graph)',
240
- 'CREATE INDEX IF NOT EXISTS idx_quints_subject ON quints (subject)',
241
- 'CREATE INDEX IF NOT EXISTS idx_quints_predicate ON quints (predicate)',
242
- 'CREATE INDEX IF NOT EXISTS idx_quints_object_key ON quints (object_kind, object_key)',
243
- 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_key ON quints (predicate, object_kind, object_key)',
244
- 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_digest ON quints (predicate, object_kind, object_digest)',
245
- 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_key ON quints (graph, subject, predicate, object_kind, object_key) WHERE object_key IS NOT NULL',
246
- 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_digest ON quints (graph, subject, predicate, object_kind, object_digest) WHERE object_digest IS NOT NULL',
247
- 'CREATE INDEX IF NOT EXISTS idx_quints_gsp ON quints (graph, subject, predicate)',
248
- 'CREATE INDEX IF NOT EXISTS idx_quints_sp ON quints (subject, predicate)',
249
- 'CREATE INDEX IF NOT EXISTS idx_quints_gp ON quints (graph, predicate)',
250
- ];
251
- for (const indexSql of indexes) {
252
- await this.executor.exec(indexSql);
222
+ this.opening ??= this.openOnce().finally(() => {
223
+ this.opening = null;
224
+ });
225
+ await this.opening;
226
+ }
227
+ async openOnce() {
228
+ const executor = await this.createExecutor();
229
+ this.executor = executor;
230
+ try {
231
+ // PostgreSQL 建表语法
232
+ await executor.exec(`
233
+ CREATE TABLE IF NOT EXISTS quints (
234
+ object_kind TEXT,
235
+ object_key TEXT,
236
+ object_text TEXT,
237
+ object_digest TEXT,
238
+ graph TEXT NOT NULL,
239
+ subject TEXT NOT NULL,
240
+ predicate TEXT NOT NULL,
241
+ object TEXT NOT NULL,
242
+ vector TEXT
243
+ )
244
+ `);
245
+ await this.ensureTypedObjectSchema();
246
+ const indexes = [
247
+ 'CREATE INDEX IF NOT EXISTS idx_quints_graph ON quints (graph)',
248
+ 'CREATE INDEX IF NOT EXISTS idx_quints_subject ON quints (subject)',
249
+ 'CREATE INDEX IF NOT EXISTS idx_quints_predicate ON quints (predicate)',
250
+ 'CREATE INDEX IF NOT EXISTS idx_quints_object_key ON quints (object_kind, object_key)',
251
+ 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_key ON quints (predicate, object_kind, object_key)',
252
+ 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_digest ON quints (predicate, object_kind, object_digest)',
253
+ 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_key ON quints (graph, subject, predicate, object_kind, object_key) WHERE object_key IS NOT NULL',
254
+ 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_digest ON quints (graph, subject, predicate, object_kind, object_digest) WHERE object_digest IS NOT NULL',
255
+ 'CREATE INDEX IF NOT EXISTS idx_quints_gsp ON quints (graph, subject, predicate)',
256
+ 'CREATE INDEX IF NOT EXISTS idx_quints_sp ON quints (subject, predicate)',
257
+ 'CREATE INDEX IF NOT EXISTS idx_quints_gp ON quints (graph, predicate)',
258
+ ];
259
+ for (const indexSql of indexes) {
260
+ await executor.exec(indexSql);
261
+ }
262
+ this.opened = true;
263
+ }
264
+ catch (error) {
265
+ await this.closeExecutor().catch(() => { });
266
+ if (this.executor === executor) {
267
+ this.executor = null;
268
+ }
269
+ this.opened = false;
270
+ throw error;
253
271
  }
254
272
  }
255
273
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"PgQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/PgQuintStore.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,iDAA8C;AAC9C,6CAAyC;AAGzC,qDAAoE;AACpE,mDAKyB;AAEzB,+CAMuB;AACvB,yEAAmF;AAiCnF;;;GAGG;AACH,MAAM,MAAM,GAAG,QAAQ,CAAC;AAExB;;GAEG;AACH,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAcD,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,cAAc;IAClB,YAAoB,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAElC,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,MAAc;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAI,KAAK,EAAE,UAAU,CAAC,CAAC;QACzD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAc;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,UAA6C;QACtE,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,KAAK,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEO,mBAAmB,CAAC,GAAW;QACrC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IAEO,UAAU,CAAI,GAAM;QAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QAEhD,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAU,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,CAAC;QACD,OAAO,MAAW,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU;IAGd,YAAY,IAAS;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,MAAc;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;QAC9F,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,MAAc;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,UAA6C;QACtE,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBACxG,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAEO,mBAAmB,CAAC,GAAW;QACrC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IAEO,UAAU,CAAI,GAAM;QAC1B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QAEhD,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAU,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,CAAC;QACD,OAAO,MAAW,CAAC;IACrB,CAAC;CACF;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,+BAAc;IAa9C,YAAY,OAA4B;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QAbT,WAAM,GAAkB,IAAI,CAAC;QAC7B,WAAM,GAAQ,IAAI,CAAC,CAAC,UAAU;QAE9B,qBAAgB,GAOb,IAAI,CAAC;QAId,IAAI,CAAC,SAAS,GAAG;YACf,MAAM,EAAE,QAAQ,EAAE,cAAc;YAChC,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,cAAc;QAC5B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACnC,sBAAsB;YACtB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YAED,2BAA2B;YAC3B,IAAI,CAAC,gBAAgB,GAAG;gBACtB,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB;gBACjD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;gBACzB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;gBACzB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;gBACjC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;gBACzB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;aAClC,CAAC;YACF,IAAI,CAAC,MAAM,GAAG,IAAA,mCAAa,EAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,YAAY;YACZ,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAC5B,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAES,KAAK,CAAC,aAAa;QAC3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAA,uCAAiB,EAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,IAAI;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5C,kBAAkB;QAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;KAYxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAErC,MAAM,OAAO,GAAG;YACd,+DAA+D;YAC/D,mEAAmE;YACnE,uEAAuE;YACvE,sFAAsF;YACtF,2GAA2G;YAC3G,iHAAiH;YACjH,mJAAmJ;YACnJ,4JAA4J;YAC5J,iFAAiF;YACjF,yEAAyE;YACzE,uEAAuE;SACxE,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,GAAG,CAAC,KAAY;QAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAErC,MAAM,IAAI,CAAC,QAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,QAAQ,CAAC,SAAkB;QACxC,OAAO,CAAC,GAAG,CAAC,qCAAqC,SAAS,CAAC,MAAM,SAAS,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,qCAAqC,UAAU,CAAC,MAAM,4BAA4B,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,QAAS,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,wCAAwC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;IAC9E,CAAC;IAEQ,KAAK,CAAC,QAAQ,CAAC,SAAkB;QACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEnC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO;gBACL,GAAG,EAAE;;;;;;SAMJ;gBACD,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC;aAC5D,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,QAAS,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAEQ,KAAK,CAAC,aAAa,CAC1B,QAAkB,EAClB,UAAoB,EACpB,KAAY;QAEZ,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,qBAAqB,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnE,IAAI,GAAG,GAAG;;;0BAGY,mBAAmB;4BACjB,qBAAqB;KAC5C,CAAC;QACF,MAAM,MAAM,GAAU,CAAC,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC;QAEnD,IAAI,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,CAAC;YACnC,GAAG,IAAI,gBAAgB,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,KAAK,CAAyD,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAiB,IAAI,GAAG,EAAE,CAAC;QAEvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACrC,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC;YACD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEkB,gBAAgB,CAAC,OAAqB;QACvD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IACjC,CAAC;IAEO,cAAc,CACpB,UAAoB,EACpB,MAAa,EACb,MAAyC,EACzC,KAA4B;QAE5B,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAA,wBAAQ,EAAC,KAAa,CAAC,CAAC;YACtC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,KAAY,CAAC;QACzB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3D,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IAEkB,oBAAoB,CACrC,UAAoB,EACpB,MAAa,EACb,KAAa,EACb,OAAY;QAEZ,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrF,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzF,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC7F,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IAEkB,kBAAkB,CAAC,QAAyB,EAAE,OAAsB;QACrF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAC9C,MAAM,MAAM,GAAU,EAAE,CAAC;QAEzB,IAAI,YAAY,GAAG,MAAM,MAAM,gBAAgB,CAAC;QAEhD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvB,YAAY,IAAI,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,YAAY,IAAI,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC;gBACjD,YAAY,IAAI,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC;YACzD,CAAC;QACH,CAAC;QAED,IAAI,UAAU,GAAG,WAAW,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,UAAU,IAAI,iBAAiB,CAAC,UAAU,MAAM,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;YACrE,UAAU,IAAI,oBAAoB,CAAC,QAAQ,CAAC;QAC9C,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;YAEtB,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,GAAG,GAAG,UAAU,YAAY,SAAS,UAAU,EAAE,CAAC;QAEtD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,IAAI,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAEkB,gBAAgB,CAAC,OAAqB,EAAE,OAAsB;QAC/E,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAE/D,IAAI,GAAG,GAAG,uBAAuB,WAAW,EAAE,CAAC;QAE/C,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC1C,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACvB,MAAM,UAAU,GAAG,IAAI,CAAC,+BAA+B,CAAC,OAAO,CAAC,CAAC;oBACjE,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;wBAC9B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;oBAC9E,CAAC;oBACD,OAAO,YAAY,CAAC;gBACtB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,GAAG,IAAI,aAAa,SAAS,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,GAAG,IAAI,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAEQ,KAAK,CAAC,KAAK,CAAC,OAAqB;QACxC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAEQ,KAAK,CAAC,KAAK;QAClB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;YACpC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;YACtC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;SACrC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,MAAM,UAAU,GAAG;YACjB,8DAA8D;YAC9D,6DAA6D;YAC7D,8DAA8D;YAC9D,gEAAgE;SACjE,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QAED,wEAAwE;QACxE,6EAA6E;QAC7E,MAAM,eAAe,GAAG;YACtB,UAAU;YACV,UAAU;YACV,UAAU;YACV,UAAU;YACV,UAAU;YACV,UAAU;YACV,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,aAAa;YACb,qBAAqB;YACrB,kCAAkC;YAClC,uBAAuB;YACvB,uBAAuB;YACvB,yBAAyB;YACzB,2BAA2B;YAC3B,wBAAwB;YACxB,qBAAqB;YACrB,oBAAoB;YACpB,oBAAoB;SACrB,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QAEtF,MAAM,eAAe,GAAG;YACtB,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,gBAAgB;YAChB,aAAa;SACd,CAAC;QAEF,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC,4CAA4C,UAAU,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAC9C,MAAM,IAAI,CAAC,QAAS,CAAC,IAAI,CAAC;;;;KAIzB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gCAAgC;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAS,CAAC,KAAK,CAKpC;;;;;KAKF,CAAC,CAAC;QAEH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7E,MAAM,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC;;;;;;;;;;OAU5B,EAAE;gBACD,WAAW,CAAC,UAAU;gBACtB,WAAW,CAAC,SAAS;gBACrB,WAAW,CAAC,UAAU;gBACtB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;gBAClD,GAAG,CAAC,KAAK;gBACT,GAAG,CAAC,OAAO;gBACX,GAAG,CAAC,SAAS;gBACb,GAAG,CAAC,MAAM;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,KAAY;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,MAAc,CAAC,CAAC;QACjF,OAAO;YACL,GAAG,GAAG;YACN,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,YAAY,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;SACjE,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,SAAiB,EAAE,MAAY;QACxD,OAAO,IAAA,uCAAyB,EAAC,MAAM,EAAE;YACvC,SAAS;YACT,wBAAwB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAC/D,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAEO,wBAAwB,CAAC,SAAiB,EAAE,MAAc;QAChE,OAAO,IAAA,6CAA+B,EAAC,MAAM,EAAE;YAC7C,SAAS;YACT,wBAAwB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAC/D,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB,CAAC,UAAkB,EAAE,MAAyB;QACxE,OAAO,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAEO,qBAAqB,CAAC,GAAe;QAC3C,MAAM,MAAM,GAAG;YACb,GAAG,CAAC,UAAU;YACd,GAAG,CAAC,SAAS;YACb,GAAG,CAAC,UAAU;YACd,GAAG,CAAC,YAAY;YAChB,GAAG,CAAC,KAAK;YACT,GAAG,CAAC,OAAO;YACX,GAAG,CAAC,SAAS;YACb,GAAG,CAAC,MAAM;YACV,GAAG,CAAC,MAAM;SACX,CAAC;QAEF,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC;oBACN,GAAG,EAAE;;;;;;;;;;;;;SAaJ;oBACD,MAAM;iBACP,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC;gBACN,GAAG,EAAE;;;;;;;;;;;;OAYJ;gBACD,MAAM;aACP,CAAC,CAAC;IACL,CAAC;IAEO,mBAAmB,CACzB,UAAoB,EACpB,MAAa,EACb,KAAyB,EACzB,KAAgB,EAChB,SAA6B;QAE7B,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAEnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACrD,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,KAAY,CAAC;QAEzB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAChG,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,UAAU,GAA6D,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;YACxK,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;oBACnC,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,YAAY,MAAM,CAAC,eAAe,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACzG,CAAC;gBACD,OAAO,IAAI,MAAM,CAAC,aAAa,CAAC,YAAY,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC;YAC1E,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAChH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC,CAAC;YAC3H,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACtE,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;YACnD,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,aAAa,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,GAAG,EAAE,SAAS,CAAC,CAAC;QACnG,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrE,IAAI,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,uBAAuB,CAC7B,UAAoB,EACpB,MAAa,EACb,MAAgC,EAChC,MAAY,EACZ,SAA6B;QAE7B,MAAM,UAAU,GAAG,IAAA,+BAAe,EAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,iCAAiC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACzF,CAAC;IAEO,4BAA4B,CAClC,UAAoB,EACpB,MAAa,EACb,MAAgC,EAChC,KAAU,EACV,EAAiB,EACjB,SAA6B;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QACxE,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iCAAiC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnG,CAAC;IAEO,iCAAiC,CACvC,UAAoB,EACpB,MAAa,EACb,MAAgC,EAChC,UAAkB,EAClB,MAAyB;QAEzB,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;IAEO,4BAA4B,CAClC,UAAoB,EACpB,MAAa,EACb,MAAgC,EAChC,WAAmB,EACnB,KAAU,EACV,EAAU,EACV,SAA6B;QAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,+BAA+B,CAAC,KAAK,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7C,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,WAAW,IAAI,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAEO,sBAAsB,CAC5B,UAAoB,EACpB,MAAa,EACb,MAAgC,EAChC,WAAmB,EACnB,KAAa,EACb,SAA6B;QAE7B,MAAM,YAAY,GAAG,IAAA,wCAA0B,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAClG,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,KAAK,CAAC,2CAA2C,YAAY,EAAE,CAAC,CAAC;YAC7E,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAEO,+BAA+B,CACrC,UAAoB,EACpB,MAAa,EACb,MAAgC,EAChC,EAAoD,EACpD,KAAa;QAEb,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE9C,IAAI,EAAE,KAAK,YAAY,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,aAAa,OAAO,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,SAAS,OAAO,kBAAkB,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CAAC,iBAAiB,OAAO,OAAO,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAEO,gBAAgB,CAAC,MAAgC;QACvD,OAAO;aACE,MAAM,CAAC,aAAa,CAAC,qBAAqB,MAAM,CAAC,aAAa,CAAC;aAC/D,MAAM,CAAC,aAAa,CAAC,iCAAiC,MAAM,CAAC,YAAY,CAAC;aAC1E,MAAM,CAAC,aAAa,CAAC,gCAAgC,MAAM,CAAC,QAAQ,CAAC,MAAM,MAAM;aACjF,MAAM,CAAC,aAAa,CAAC,iCAAiC,MAAM,CAAC,QAAQ,CAAC,MAAM,MAAM;;QAEvF,CAAC;IACP,CAAC;IAEO,0BAA0B,CAChC,UAAoB,EACpB,MAAa,EACb,MAAgC,EAChC,IAAY;QAEZ,MAAM,oBAAoB,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,qCAAqC,CAAC;QAE3F,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,UAAU,CAAC,IAAI,CAAC,IAAI,oBAAoB,QAAQ,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACzC,UAAU,CAAC,IAAI,CAAC,IAAI,oBAAoB,qBAAqB,MAAM,CAAC,QAAQ,CAAC,8BAA8B,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACzI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEO,+BAA+B,CACrC,KAAU,EACV,EAAU,EACV,SAA6B;QAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1D,OAAO;YACL,UAAU;YACV,MAAM,EAAE,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,SAAS,CAAC;SAC9D,CAAC;IACJ,CAAC;IAEO,mBAAmB,CAAC,MAAY,EAAE,SAA6B;QACrE,OAAO,IAAA,uCAAyB,EAAC,MAAM,EAAE;YACvC,SAAS;YACT,wBAAwB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAC/D,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAEO,yBAAyB,CAAC,UAAkB,EAAE,SAA6B;QACjF,OAAO,IAAA,6CAA+B,EAAC,UAAU,EAAE;YACjD,SAAS;YACT,wBAAwB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB;YAC/D,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY;SACxC,CAAC,CAAC;IACL,CAAC;IAEO,qBAAqB,CAAC,MAAc,EAAE,SAA6B;QACzE,MAAM,YAAY,GAAG,IAAA,wCAA0B,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAClG,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YACzE,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC3E,CAAC;QAED,IAAI,IAAA,0CAA0B,EAAC,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACxE,CAAC;QACD,IAAI,IAAA,2CAA2B,EAAC,MAAM,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACzE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACrE,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACpE,CAAC;IAEO,sBAAsB,CAAC,MAAyB,EAAE,EAAU;QAClE,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YAClE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,yBAAyB,MAAM,CAAC,UAAU,0DAA0D,CAAC,CAAC;IACpI,CAAC;IAEO,0BAA0B,CAChC,UAAoB,EACpB,MAAa,EACb,KAAa,EACb,OAAqB;QAErB,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAC5B,IAAI,CAAC,mBAAmB,CACtB,UAAU,EACV,MAAM,EACN,KAAK,EACL,OAAO,CAAC,MAAM,EACd,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAC9C,CAAC;IACJ,CAAC;IAEO,qBAAqB,CAAC,KAA4B;QACxD,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACrD,OAAO,IAAA,wBAAQ,EAAC,KAAa,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,GAAG,GAAG,KAAY,CAAC;QACzB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,+BAA+B,CAAC,OAAqB;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,IAAA,wCAA0B,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACzF,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAc,EAAE,SAAS,CAAC,CAAC,UAAU,CAAC;QAChF,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,qBAAqB,CAC3B,UAAoB,EACpB,MAAa,EACb,KAAa,EACb,MAAc,EACd,KAAU,EACV,QAAiB;QAEjB,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAA,wBAAQ,EAAC,KAAK,CAAC,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7D,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACvF,CAAC;IAEO,2BAA2B,CACjC,UAAoB,EACpB,MAAa,EACb,KAAa,EACb,MAAc,EACd,KAAU,EACV,QAAiB;QAEjB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,QAAQ,YAAY,GAAG,CAAC,CAAC;YAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;CACF;AAn8BD,oCAm8BC","sourcesContent":["/**\n * PgQuintStore - PostgreSQL implementation of QuintStore\n *\n * 支持两种连接方式:\n * - PGLite: 嵌入式 PostgreSQL,用于测试\n * - pg (node-postgres): 真正的 PostgreSQL 连接,用于生产\n *\n * PostgreSQL 不支持 TEXT 字段中的 \\0 (null) 字符,\n * 所以我们需要对序列化的字符串进行转换。\n */\n\nimport { PGlite } from '@electric-sql/pglite';\nimport { createHash } from 'node:crypto';\nimport type { Term } from '@rdfjs/types';\n\nimport { BaseQuintStore, type SqlExecutor } from './BaseQuintStore';\nimport {\n isSerializedDateTimeLiteral,\n isSerializedNumericLiteral,\n serializeObject,\n termToId,\n} from './serialization';\nimport type { AttributeMap, CompoundPattern, QuintStoreOptions, Quint, QuintPattern, QueryOptions, TermMatch } from './types';\nimport {\n getPredicateObjectDataType,\n objectIndexFieldsFromSerialized,\n objectIndexFieldsFromTerm,\n type ObjectIndexFields,\n type PredicateObjectDataType,\n} from './value-types';\nimport { getSharedPool, releaseSharedPool } from '../database/PostgresPoolManager';\n\n/**\n * PostgreSQL 连接配置\n */\nexport interface PgQuintStoreOptions extends QuintStoreOptions {\n /**\n * 连接方式:\n * - 'pglite': 使用 PGLite 嵌入式数据库(测试用)\n * - 'pg': 使用 node-postgres 连接真正的 PostgreSQL(生产用)\n */\n driver?: 'pglite' | 'pg';\n\n /** PGLite 数据目录,仅当 driver='pglite' 时使用 */\n dataDir?: string;\n\n /** PostgreSQL 连接字符串,仅当 driver='pg' 时使用 */\n connectionString?: string;\n\n /** PostgreSQL 连接配置,仅当 driver='pg' 时使用 */\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n\n /**\n * 共享的 pg Pool 实例(避免多个组件创建独立连接池导致死锁)\n * 如果提供,将忽略其他连接配置\n */\n pool?: any;\n}\n\n/**\n * PostgreSQL 兼容的分隔符\n * 使用 Unicode 控制字符 U+001F (Unit Separator) 代替 \\0\n */\nconst PG_SEP = '\\u001f';\n\n/**\n * 将使用 \\0 分隔符的字符串转换为使用 PG_SEP 的字符串\n */\nfunction toPgSafe(str: string): string {\n return str.replace(/\\u0000/g, PG_SEP);\n}\n\n/**\n * 将使用 PG_SEP 分隔符的字符串转换回使用 \\0 的字符串\n */\nfunction fromPgSafe(str: string): string {\n return str.replace(new RegExp(PG_SEP, 'g'), '\\u0000');\n}\n\ninterface PgQuintRow {\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n vector: string | null;\n objectKind: PredicateObjectDataType;\n objectKey: string | null;\n objectText: string | null;\n objectDigest: string | null;\n}\n\nfunction digestObject(value: string): string {\n return createHash('sha256').update(toPgSafe(value)).digest('hex');\n}\n\n/**\n * PGLite 执行器\n */\nclass PgliteExecutor implements SqlExecutor {\n constructor(private db: PGlite) {}\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query<T>(pgSql, safeParams);\n return result.rows.map(row => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query(pgSql, safeParams);\n return result.affectedRows ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n await this.db.query('BEGIN');\n try {\n for (const { sql, params } of statements) {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n await this.db.query(pgSql, safeParams);\n }\n await this.db.query('COMMIT');\n } catch (error) {\n await this.db.query('ROLLBACK');\n throw error;\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.db.exec(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n\n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * node-postgres 执行器(需要安装 pg 包)\n */\nclass PgExecutor implements SqlExecutor {\n private pool: any; // pg.Pool\n\n constructor(pool: any) {\n this.pool = pool;\n }\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Query: ${pgSql.slice(0, 60)}...`);\n const start = Date.now();\n const result = await this.pool.query(pgSql, safeParams);\n console.log(`[PgExecutor] Query done in ${Date.now() - start}ms, ${result.rows.length} rows`);\n return result.rows.map((row: any) => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.pool.query(pgSql, safeParams);\n return result.rowCount ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n console.log(`[PgExecutor] Getting connection from pool...`);\n const start = Date.now();\n const client = await this.pool.connect();\n console.log(`[PgExecutor] Got connection in ${Date.now() - start}ms`);\n try {\n console.log(`[PgExecutor] BEGIN transaction`);\n await client.query('BEGIN');\n for (let i = 0; i < statements.length; i++) {\n const { sql, params } = statements[i];\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Executing statement ${i + 1}/${statements.length}: ${pgSql.slice(0, 60)}...`);\n await client.query(pgSql, safeParams);\n }\n console.log(`[PgExecutor] COMMIT transaction`);\n await client.query('COMMIT');\n } catch (error) {\n console.error(`[PgExecutor] Error, rolling back:`, error);\n await client.query('ROLLBACK');\n throw error;\n } finally {\n console.log(`[PgExecutor] Releasing connection`);\n client.release();\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.pool.query(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n\n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * PostgreSQL QuintStore 实现\n */\nexport class PgQuintStore extends BaseQuintStore {\n private pglite: PGlite | null = null;\n private pgPool: any = null; // pg.Pool\n private pgOptions: PgQuintStoreOptions;\n private sharedPoolConfig: {\n connectionString?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n } | null = null;\n\n constructor(options: PgQuintStoreOptions) {\n super(options);\n this.pgOptions = {\n driver: 'pglite', // 默认使用 PGLite\n ...options,\n };\n }\n\n protected async createExecutor(): Promise<SqlExecutor> {\n if (this.pgOptions.driver === 'pg') {\n // 使用共享的连接池(如果提供),避免死锁\n if (this.pgOptions.pool) {\n this.pgPool = this.pgOptions.pool;\n this.sharedPoolConfig = null;\n return new PgExecutor(this.pgPool);\n }\n\n // 使用共享连接池管理器,避免多个组件创建独立连接池\n this.sharedPoolConfig = {\n connectionString: this.pgOptions.connectionString,\n host: this.pgOptions.host,\n port: this.pgOptions.port,\n database: this.pgOptions.database,\n user: this.pgOptions.user,\n password: this.pgOptions.password,\n };\n this.pgPool = getSharedPool(this.sharedPoolConfig);\n return new PgExecutor(this.pgPool);\n } else {\n // 使用 PGLite\n this.pglite = new PGlite(this.pgOptions.dataDir);\n await this.pglite.waitReady;\n return new PgliteExecutor(this.pglite);\n }\n }\n\n protected async closeExecutor(): Promise<void> {\n if (this.pglite) {\n await this.pglite.close();\n this.pglite = null;\n }\n if (this.pgPool) {\n if (this.sharedPoolConfig) {\n releaseSharedPool(this.sharedPoolConfig);\n } else {\n await this.pgPool.end();\n }\n this.pgPool = null;\n this.sharedPoolConfig = null;\n }\n }\n\n /**\n * 重写 open 方法,处理 PostgreSQL 特定的语法\n */\n override async open(): Promise<void> {\n if (this.executor) {\n return;\n }\n\n this.executor = await this.createExecutor();\n\n // PostgreSQL 建表语法\n await this.executor.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n object_kind TEXT,\n object_key TEXT,\n object_text TEXT,\n object_digest TEXT,\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT\n )\n `);\n\n await this.ensureTypedObjectSchema();\n\n const indexes = [\n 'CREATE INDEX IF NOT EXISTS idx_quints_graph ON quints (graph)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_subject ON quints (subject)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate ON quints (predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_object_key ON quints (object_kind, object_key)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_key ON quints (predicate, object_kind, object_key)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_digest ON quints (predicate, object_kind, object_digest)',\n 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_key ON quints (graph, subject, predicate, object_kind, object_key) WHERE object_key IS NOT NULL',\n 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_digest ON quints (graph, subject, predicate, object_kind, object_digest) WHERE object_digest IS NOT NULL',\n 'CREATE INDEX IF NOT EXISTS idx_quints_gsp ON quints (graph, subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_sp ON quints (subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_gp ON quints (graph, predicate)',\n ];\n\n for (const indexSql of indexes) {\n await this.executor.exec(indexSql);\n }\n }\n\n /**\n * 重写 put 方法,避免长文本对象进入 PostgreSQL btree 唯一键\n */\n override async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToPgRow(quint);\n\n await this.executor!.executeInTransaction(this.writeStatementsForRow(row));\n }\n\n /**\n * 重写 multiPut 方法,使用同一事务保持批量写入幂等\n */\n override async multiPut(quintList: Quint[]): Promise<void> {\n console.log(`[PgQuintStore.multiPut] Starting: ${quintList.length} quints`);\n this.ensureOpen();\n\n if (quintList.length === 0) {\n console.log(`[PgQuintStore.multiPut] Empty list, skipping`);\n return;\n }\n\n const statements = quintList.flatMap(quint => {\n const row = this.quintToPgRow(quint);\n return this.writeStatementsForRow(row);\n });\n\n console.log(`[PgQuintStore.multiPut] Executing ${statements.length} statements in transaction`);\n const start = Date.now();\n await this.executor!.executeInTransaction(statements);\n console.log(`[PgQuintStore.multiPut] Completed in ${Date.now() - start}ms`);\n }\n\n override async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const statements = quintList.map(quint => {\n const row = this.quintToPgRow(quint);\n return {\n sql: `\n DELETE FROM quints\n WHERE graph = $1\n AND subject = $2\n AND predicate = $3\n AND object = $4\n `,\n params: [row.graph, row.subject, row.predicate, row.object],\n };\n });\n\n await this.executor!.executeInTransaction(statements);\n }\n\n override async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term,\n ): Promise<AttributeMap> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n const subjectPlaceholders = subjects.map(() => '?').join(', ');\n const predicatePlaceholders = predicates.map(() => '?').join(', ');\n\n let sql = `\n SELECT subject, predicate, object\n FROM quints\n WHERE subject IN (${subjectPlaceholders})\n AND predicate IN (${predicatePlaceholders})\n `;\n const params: any[] = [...subjects, ...predicates];\n\n if (graph && graph.termType !== 'DefaultGraph') {\n const graphValue = termToId(graph);\n sql += ` AND graph = ?`;\n params.push(graphValue);\n }\n\n const rows = await this.executor!.query<{ subject: string; predicate: string; object: string }>(sql, params);\n const result: AttributeMap = new Map();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n predicateMap.get(row.predicate)!.push(this.deserializeObject(row.object));\n }\n\n return result;\n }\n\n protected override buildWhereClause(pattern: QuintPattern): { whereClause: string; params: any[] } {\n const conditions: string[] = [];\n const params: any[] = [];\n const predicate = this.extractExactPredicate(pattern.predicate);\n\n this.addPgCondition(conditions, params, 'graph', pattern.graph);\n this.addPgCondition(conditions, params, 'subject', pattern.subject);\n this.addPgCondition(conditions, params, 'predicate', pattern.predicate);\n if (pattern.object) {\n this.addObjectConditions(conditions, params, undefined, pattern.object, predicate);\n }\n\n const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';\n return { whereClause, params };\n }\n\n private addPgCondition(\n conditions: string[],\n params: any[],\n column: 'graph' | 'subject' | 'predicate',\n match: TermMatch | undefined,\n ): void {\n if (!match) return;\n\n if (typeof match === 'object' && 'termType' in match) {\n const value = termToId(match as Term);\n conditions.push(`${column} = ?`);\n params.push(value);\n return;\n }\n\n const ops = match as any;\n if (ops.$eq !== undefined) {\n const value = this.serializeOpValue(ops.$eq, false, '$eq');\n conditions.push(`${column} = ?`);\n params.push(String(value));\n return;\n }\n\n super.addConditions(conditions, params, column, match, false);\n }\n\n protected override addAliasedConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: any,\n ): void {\n this.addAliasedPgCondition(conditions, params, alias, 'graph', pattern.graph, false);\n this.addAliasedPgCondition(conditions, params, alias, 'subject', pattern.subject, false);\n this.addAliasedPgCondition(conditions, params, alias, 'predicate', pattern.predicate, false);\n this.addAliasedObjectConditions(conditions, params, alias, pattern);\n }\n\n protected override buildCompoundQuery(compound: CompoundPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { patterns, joinOn, select } = compound;\n const params: any[] = [];\n\n let selectClause = `q0.${joinOn} as join_value`;\n\n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinOn} = q${i}.${joinOn}`;\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n const whereParts: string[] = [];\n\n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n\n this.addAliasedConditions(whereParts, params, alias, pattern);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n\n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n protected override buildSelectQuery(pattern: QuintPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { whereClause, params } = this.buildWhereClause(pattern);\n\n let sql = `SELECT * FROM quints${whereClause}`;\n\n if (options?.order && options.order.length > 0) {\n const orderCols = options.order.map(field => {\n if (field === 'object') {\n const objectType = this.resolveObjectDataTypeForPattern(pattern);\n if (objectType === 'longText') {\n throw new Error('ORDER BY object is not supported for longText predicates');\n }\n return 'object_key';\n }\n return field;\n }).join(', ');\n sql += ` ORDER BY ${orderCols}`;\n if (options.reverse) {\n sql += ' DESC';\n }\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n override async count(pattern: QuintPattern): Promise<number> {\n const count = await super.count(pattern);\n return Number(count);\n }\n\n override async stats(): Promise<import('./types').StoreStats> {\n const stats = await super.stats();\n return {\n totalCount: Number(stats.totalCount),\n vectorCount: Number(stats.vectorCount),\n graphCount: Number(stats.graphCount),\n };\n }\n\n private async ensureTypedObjectSchema(): Promise<void> {\n const statements = [\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_kind TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_key TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_text TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_digest TEXT',\n ];\n\n for (const statement of statements) {\n await this.executor!.exec(statement);\n }\n\n // The old Postgres schema indexed complete RDF terms. Long literals can\n // exceed the btree tuple size and surface as 500s while creating containers.\n const obsoleteIndexes = [\n 'idx_spog',\n 'idx_ogsp',\n 'idx_gspo',\n 'idx_sopg',\n 'idx_pogs',\n 'idx_gpos',\n 'idx_pg_spog',\n 'idx_pg_ogsp',\n 'idx_pg_gspo',\n 'idx_pg_sopg',\n 'idx_pg_pogs',\n 'idx_pg_gpos',\n 'idx_pg_graph_prefix',\n 'idx_quints_predicate_object_text',\n 'idx_quints_quint_hash',\n 'idx_quints_graph_hash',\n 'idx_quints_subject_hash',\n 'idx_quints_predicate_hash',\n 'idx_quints_object_hash',\n 'idx_quints_gsp_hash',\n 'idx_quints_sp_hash',\n 'idx_quints_gp_hash',\n ];\n\n for (const indexName of obsoleteIndexes) {\n await this.executor!.exec(`DROP INDEX IF EXISTS ${indexName}`);\n }\n\n await this.executor!.exec('ALTER TABLE quints DROP CONSTRAINT IF EXISTS quints_pkey');\n\n const obsoleteColumns = [\n 'quint_hash',\n 'graph_hash',\n 'subject_hash',\n 'predicate_hash',\n 'object_hash',\n ];\n\n for (const columnName of obsoleteColumns) {\n await this.executor!.exec(`ALTER TABLE quints DROP COLUMN IF EXISTS ${columnName}`);\n }\n\n await this.backfillMissingObjectIndexFields();\n await this.executor!.exec(`\n UPDATE quints\n SET object_kind = 'text'\n WHERE object_kind = 'shortText'\n `);\n }\n\n private async backfillMissingObjectIndexFields(): Promise<void> {\n const rows = await this.executor!.query<{\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n }>(`\n SELECT graph, subject, predicate, object\n FROM quints\n WHERE object_kind IS NULL\n OR (object_key IS NULL AND object_digest IS NULL)\n `);\n\n for (const row of rows) {\n const objectIndex = this.objectIndexForSerialized(row.predicate, row.object);\n await this.executor!.execute(`\n UPDATE quints\n SET object_kind = $1,\n object_key = $2,\n object_text = $3,\n object_digest = $4\n WHERE graph = $5\n AND subject = $6\n AND predicate = $7\n AND object = $8\n `, [\n objectIndex.objectKind,\n objectIndex.objectKey,\n objectIndex.objectText,\n this.objectDigestForIndex(row.object, objectIndex),\n row.graph,\n row.subject,\n row.predicate,\n row.object,\n ]);\n }\n }\n\n private quintToPgRow(quint: Quint): PgQuintRow {\n const row = this.quintToRow(quint);\n const objectIndex = this.objectIndexForTerm(row.predicate, quint.object as Term);\n return {\n ...row,\n objectKind: objectIndex.objectKind,\n objectKey: objectIndex.objectKey,\n objectText: objectIndex.objectText,\n objectDigest: this.objectDigestForIndex(row.object, objectIndex),\n };\n }\n\n private objectIndexForTerm(predicate: string, object: Term): ObjectIndexFields {\n return objectIndexFieldsFromTerm(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectIndexForSerialized(predicate: string, object: string): ObjectIndexFields {\n return objectIndexFieldsFromSerialized(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectDigestForIndex(serialized: string, fields: ObjectIndexFields): string | null {\n return fields.objectKey === null ? digestObject(serialized) : null;\n }\n\n private writeStatementsForRow(row: PgQuintRow): { sql: string; params?: any[] }[] {\n const params = [\n row.objectKind,\n row.objectKey,\n row.objectText,\n row.objectDigest,\n row.graph,\n row.subject,\n row.predicate,\n row.object,\n row.vector,\n ];\n\n if (row.objectKey !== null) {\n return [{\n sql: `\n INSERT INTO quints (\n object_kind, object_key, object_text, object_digest,\n graph, subject, predicate, object, vector\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (graph, subject, predicate, object_kind, object_key)\n WHERE object_key IS NOT NULL\n DO UPDATE SET\n vector = EXCLUDED.vector,\n object_text = EXCLUDED.object_text,\n object_digest = EXCLUDED.object_digest\n WHERE quints.object = EXCLUDED.object\n `,\n params,\n }];\n }\n\n return [{\n sql: `\n INSERT INTO quints (\n object_kind, object_key, object_text, object_digest,\n graph, subject, predicate, object, vector\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (graph, subject, predicate, object_kind, object_digest)\n WHERE object_digest IS NOT NULL\n DO UPDATE SET\n object = CASE WHEN quints.object = EXCLUDED.object THEN EXCLUDED.object ELSE NULL END,\n vector = EXCLUDED.vector,\n object_text = EXCLUDED.object_text\n `,\n params,\n }];\n }\n\n private addObjectConditions(\n conditions: string[],\n params: any[],\n alias: string | undefined,\n match: TermMatch,\n predicate: string | undefined,\n ): void {\n const column = (name: string) => alias ? `${alias}.${name}` : name;\n\n if (typeof match === 'object' && 'termType' in match) {\n this.addObjectExactCondition(conditions, params, column, match, predicate);\n return;\n }\n\n const ops = match as any;\n\n if (ops.$eq !== undefined) {\n this.addObjectExactValueCondition(conditions, params, column, ops.$eq, '$eq', predicate);\n }\n if (ops.$ne !== undefined) {\n this.addObjectExactValueCondition(conditions, params, column, ops.$ne, '$ne', predicate);\n }\n if (ops.$gt !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '>', ops.$gt, '$gt', predicate);\n }\n if (ops.$gte !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '>=', ops.$gte, '$gte', predicate);\n }\n if (ops.$lt !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '<', ops.$lt, '$lt', predicate);\n }\n if (ops.$lte !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '<=', ops.$lte, '$lte', predicate);\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const predicates: Array<{ serialized: string; fields: ObjectIndexFields }> = ops.$in.map((value: any) => this.objectPredicateForOperatorValue(value, '$in', predicate));\n const placeholders = predicates.map((item) => {\n if (item.fields.objectKey === null) {\n return `(${column('object_kind')} = ? AND ${column('object_digest')} = ? AND ${column('object')} = ?)`;\n }\n return `(${column('object_kind')} = ? AND ${column('object_key')} = ?)`;\n }).join(' OR ');\n conditions.push(`(${placeholders})`);\n for (const item of predicates) {\n if (item.fields.objectKey === null) {\n params.push(item.fields.objectKind, this.objectDigestForIndex(item.serialized, item.fields), item.serialized);\n } else {\n params.push(item.fields.objectKind, item.fields.objectKey);\n }\n }\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const values = ops.$notIn.map((value: any) => this.objectPredicateForOperatorValue(value, '$notIn', predicate).serialized);\n for (const value of values) {\n conditions.push(`${column('object')} != ?`);\n params.push(value);\n }\n }\n if (ops.$startsWith !== undefined) {\n const fields = this.objectFieldsForPrefix(ops.$startsWith, predicate);\n this.assertComparableObject(fields, '$startsWith');\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_key')} >= ? AND ${column('object_key')} < ?`);\n params.push(ops.$startsWith, ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n this.addObjectTextCondition(conditions, params, column, 'LIKE', `%${ops.$endsWith}`, predicate);\n }\n if (ops.$contains !== undefined) {\n this.addObjectTextCondition(conditions, params, column, 'LIKE', `%${ops.$contains}%`, predicate);\n }\n if (ops.$regex !== undefined) {\n const pattern = ops.$regex.replace(/\\.\\*/g, '%').replace(/\\./g, '_');\n this.addObjectTextCondition(conditions, params, column, 'LIKE', pattern, predicate);\n }\n if (ops.$strStartsWith !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'startsWith', ops.$strStartsWith);\n }\n if (ops.$strEndsWith !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'endsWith', ops.$strEndsWith);\n }\n if (ops.$strContains !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'contains', ops.$strContains);\n }\n if (ops.$strRegex !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'regex', ops.$strRegex);\n }\n if (ops.$language !== undefined) {\n this.addObjectLanguageCondition(conditions, params, column, ops.$language);\n }\n if (ops.$isNull === true) {\n conditions.push(`${column('object')} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${column('object')} IS NOT NULL`);\n }\n }\n\n private addObjectExactCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n object: Term,\n predicate: string | undefined,\n ): void {\n const serialized = serializeObject(object);\n const fields = this.objectFieldsForTerm(object, predicate);\n this.addObjectExactSerializedCondition(conditions, params, column, serialized, fields);\n }\n\n private addObjectExactValueCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n value: any,\n op: '$eq' | '$ne',\n predicate: string | undefined,\n ): void {\n const item = this.objectPredicateForOperatorValue(value, op, predicate);\n if (op === '$ne') {\n conditions.push(`${column('object')} != ?`);\n params.push(item.serialized);\n return;\n }\n this.addObjectExactSerializedCondition(conditions, params, column, item.serialized, item.fields);\n }\n\n private addObjectExactSerializedCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n serialized: string,\n fields: ObjectIndexFields,\n ): void {\n if (fields.objectKey !== null) {\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_key')} = ?`);\n params.push(fields.objectKey);\n return;\n }\n\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_digest')} = ?`);\n params.push(this.objectDigestForIndex(serialized, fields));\n conditions.push(`${column('object')} = ?`);\n params.push(serialized);\n }\n\n private addObjectComparableCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n sqlOperator: string,\n value: any,\n op: string,\n predicate: string | undefined,\n ): void {\n const item = this.objectPredicateForOperatorValue(value, op, predicate);\n this.assertComparableObject(item.fields, op);\n conditions.push(`${column('object_kind')} = ?`);\n params.push(item.fields.objectKind);\n conditions.push(`${column('object_key')} ${sqlOperator} ?`);\n params.push(item.serialized);\n }\n\n private addObjectTextCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n sqlOperator: string,\n value: string,\n predicate: string | undefined,\n ): void {\n const declaredType = getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n if (declaredType) {\n if (!['text', 'longText', 'literal'].includes(declaredType)) {\n throw new Error(`Object text search is not supported for ${declaredType}`);\n }\n conditions.push(`${column('object_kind')} = ?`);\n params.push(declaredType);\n }\n conditions.push(`${column('object_text')} ${sqlOperator} ?`);\n params.push(value);\n }\n\n private addObjectLexicalStringCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n op: 'startsWith' | 'endsWith' | 'contains' | 'regex',\n value: string,\n ): void {\n const lexical = this.objectLexicalSql(column);\n\n if (op === 'startsWith') {\n conditions.push(`(${lexical} >= ? AND ${lexical} < ?)`);\n params.push(value, value + '\\uffff');\n return;\n }\n\n if (op === 'endsWith') {\n conditions.push(`RIGHT(${lexical}, LENGTH(?)) = ?`);\n params.push(value, value);\n return;\n }\n\n if (op === 'contains') {\n conditions.push(`POSITION(? IN ${lexical}) > 0`);\n params.push(value);\n return;\n }\n\n conditions.push(`${lexical} ~ ?`);\n params.push(value);\n }\n\n private objectLexicalSql(column: (name: string) => string): string {\n return `CASE\n WHEN ${column('object_text')} IS NOT NULL THEN ${column('object_text')}\n WHEN ${column('object_kind')} IN ('iri', 'blankNode') THEN ${column('object_key')}\n WHEN ${column('object_kind')} = 'numeric' THEN split_part(${column('object')}, '${PG_SEP}', 4)\n WHEN ${column('object_kind')} = 'dateTime' THEN split_part(${column('object')}, '${PG_SEP}', 3)\n ELSE NULL\n END`;\n }\n\n private addObjectLanguageCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n lang: string,\n ): void {\n const languageLiteralKinds = `${column('object_kind')} IN ('text', 'longText', 'literal')`;\n\n if (lang === '*') {\n conditions.push(`(${languageLiteralKinds} AND ${column('object')} ~ ?)`);\n params.push('\"@[A-Za-z]+(-[A-Za-z0-9]+)*$');\n return;\n }\n\n const suffix = `\"@${lang.toLowerCase()}`;\n conditions.push(`(${languageLiteralKinds} AND (RIGHT(LOWER(${column('object')}), LENGTH(?)) = ? OR LOWER(${column('object')}) LIKE ?))`);\n params.push(suffix, suffix, `%\"@${lang.toLowerCase()}-%`);\n }\n\n private objectPredicateForOperatorValue(\n value: any,\n op: string,\n predicate: string | undefined,\n ): { serialized: string; fields: ObjectIndexFields } {\n const serialized = this.serializeOpValue(value, true, op);\n return {\n serialized,\n fields: this.objectFieldsForSerialized(serialized, predicate),\n };\n }\n\n private objectFieldsForTerm(object: Term, predicate: string | undefined): ObjectIndexFields {\n return objectIndexFieldsFromTerm(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectFieldsForSerialized(serialized: string, predicate: string | undefined): ObjectIndexFields {\n return objectIndexFieldsFromSerialized(serialized, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectFieldsForPrefix(prefix: string, predicate: string | undefined): ObjectIndexFields {\n const declaredType = getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n if (declaredType) {\n if (declaredType === 'longText') {\n return { objectKind: 'longText', objectKey: null, objectText: prefix };\n }\n return { objectKind: declaredType, objectKey: prefix, objectText: null };\n }\n\n if (isSerializedNumericLiteral(prefix)) {\n return { objectKind: 'numeric', objectKey: prefix, objectText: null };\n }\n if (isSerializedDateTimeLiteral(prefix)) {\n return { objectKind: 'dateTime', objectKey: prefix, objectText: null };\n }\n if (prefix.startsWith('\"')) {\n return { objectKind: 'text', objectKey: prefix, objectText: null };\n }\n if (prefix.startsWith('_:')) {\n return { objectKind: 'blankNode', objectKey: prefix, objectText: null };\n }\n return { objectKind: 'iri', objectKey: prefix, objectText: null };\n }\n\n private assertComparableObject(fields: ObjectIndexFields, op: string): void {\n if (fields.objectKey !== null && fields.objectKind !== 'longText') {\n return;\n }\n throw new Error(`Object ${op} is not supported for ${fields.objectKind}; declare/use a comparable data type instead of longText`);\n }\n\n private addAliasedObjectConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: QuintPattern,\n ): void {\n if (!pattern.object) return;\n this.addObjectConditions(\n conditions,\n params,\n alias,\n pattern.object,\n this.extractExactPredicate(pattern.predicate),\n );\n }\n\n private extractExactPredicate(match: TermMatch | undefined): string | undefined {\n if (!match) return undefined;\n if (typeof match === 'object' && 'termType' in match) {\n return termToId(match as Term);\n }\n const ops = match as any;\n if (ops.$eq !== undefined) {\n return String(this.serializeOpValue(ops.$eq, false, '$eq'));\n }\n return undefined;\n }\n\n private resolveObjectDataTypeForPattern(pattern: QuintPattern): PredicateObjectDataType | undefined {\n const predicate = this.extractExactPredicate(pattern.predicate);\n if (predicate) {\n return getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n }\n if (pattern.object && typeof pattern.object === 'object' && 'termType' in pattern.object) {\n return this.objectFieldsForTerm(pattern.object as Term, predicate).objectKind;\n }\n return undefined;\n }\n\n private addAliasedPgCondition(\n conditions: string[],\n params: any[],\n alias: string,\n column: string,\n match: any,\n isObject: boolean,\n ): void {\n if (!match) return;\n\n if (isObject) {\n this.addObjectConditions(conditions, params, alias, match, undefined);\n return;\n }\n\n if (typeof match === 'object' && 'termType' in match) {\n const value = termToId(match);\n conditions.push(`${alias}.${column} = ?`);\n params.push(value);\n return;\n }\n\n if (match.$eq !== undefined) {\n const value = this.serializeOpValue(match.$eq, false, '$eq');\n conditions.push(`${alias}.${column} = ?`);\n params.push(value);\n return;\n }\n\n this.addFallbackAliasedCondition(conditions, params, alias, column, match, isObject);\n }\n\n private addFallbackAliasedCondition(\n conditions: string[],\n params: any[],\n alias: string,\n column: string,\n match: any,\n isObject: boolean,\n ): void {\n if (isObject) {\n this.addObjectConditions(conditions, params, alias, match, undefined);\n return;\n }\n if (match.$gt !== undefined) {\n conditions.push(`${alias}.${column} > ?`);\n params.push(this.serializeOpValue(match.$gt, false, '$gt'));\n }\n if (match.$gte !== undefined) {\n conditions.push(`${alias}.${column} >= ?`);\n params.push(this.serializeOpValue(match.$gte, false, '$gte'));\n }\n if (match.$lt !== undefined) {\n conditions.push(`${alias}.${column} < ?`);\n params.push(this.serializeOpValue(match.$lt, false, '$lt'));\n }\n if (match.$lte !== undefined) {\n conditions.push(`${alias}.${column} <= ?`);\n params.push(this.serializeOpValue(match.$lte, false, '$lte'));\n }\n if (match.$in !== undefined && match.$in.length > 0) {\n const placeholders = match.$in.map(() => '?').join(', ');\n conditions.push(`${alias}.${column} IN (${placeholders})`);\n params.push(...match.$in.map((value: any) => this.serializeOpValue(value, false, '$in')));\n }\n }\n}\n"]}
1
+ {"version":3,"file":"PgQuintStore.js","sourceRoot":"","sources":["../../../src/storage/quint/PgQuintStore.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PgQuintStore - PostgreSQL implementation of QuintStore\n *\n * 支持两种连接方式:\n * - PGLite: 嵌入式 PostgreSQL,用于测试\n * - pg (node-postgres): 真正的 PostgreSQL 连接,用于生产\n *\n * PostgreSQL 不支持 TEXT 字段中的 \\0 (null) 字符,\n * 所以我们需要对序列化的字符串进行转换。\n */\n\nimport { PGlite } from '@electric-sql/pglite';\nimport { createHash } from 'node:crypto';\nimport type { Term } from '@rdfjs/types';\n\nimport { BaseQuintStore, type SqlExecutor } from './BaseQuintStore';\nimport {\n isSerializedDateTimeLiteral,\n isSerializedNumericLiteral,\n serializeObject,\n termToId,\n} from './serialization';\nimport type { AttributeMap, CompoundPattern, QuintStoreOptions, Quint, QuintPattern, QueryOptions, TermMatch } from './types';\nimport {\n getPredicateObjectDataType,\n objectIndexFieldsFromSerialized,\n objectIndexFieldsFromTerm,\n type ObjectIndexFields,\n type PredicateObjectDataType,\n} from './value-types';\nimport { getSharedPool, releaseSharedPool } from '../database/PostgresPoolManager';\n\n/**\n * PostgreSQL 连接配置\n */\nexport interface PgQuintStoreOptions extends QuintStoreOptions {\n /**\n * 连接方式:\n * - 'pglite': 使用 PGLite 嵌入式数据库(测试用)\n * - 'pg': 使用 node-postgres 连接真正的 PostgreSQL(生产用)\n */\n driver?: 'pglite' | 'pg';\n\n /** PGLite 数据目录,仅当 driver='pglite' 时使用 */\n dataDir?: string;\n\n /** PostgreSQL 连接字符串,仅当 driver='pg' 时使用 */\n connectionString?: string;\n\n /** PostgreSQL 连接配置,仅当 driver='pg' 时使用 */\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n\n /**\n * 共享的 pg Pool 实例(避免多个组件创建独立连接池导致死锁)\n * 如果提供,将忽略其他连接配置\n */\n pool?: any;\n}\n\n/**\n * PostgreSQL 兼容的分隔符\n * 使用 Unicode 控制字符 U+001F (Unit Separator) 代替 \\0\n */\nconst PG_SEP = '\\u001f';\n\n/**\n * 将使用 \\0 分隔符的字符串转换为使用 PG_SEP 的字符串\n */\nfunction toPgSafe(str: string): string {\n return str.replace(/\\u0000/g, PG_SEP);\n}\n\n/**\n * 将使用 PG_SEP 分隔符的字符串转换回使用 \\0 的字符串\n */\nfunction fromPgSafe(str: string): string {\n return str.replace(new RegExp(PG_SEP, 'g'), '\\u0000');\n}\n\ninterface PgQuintRow {\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n vector: string | null;\n objectKind: PredicateObjectDataType;\n objectKey: string | null;\n objectText: string | null;\n objectDigest: string | null;\n}\n\nfunction digestObject(value: string): string {\n return createHash('sha256').update(toPgSafe(value)).digest('hex');\n}\n\n/**\n * PGLite 执行器\n */\nclass PgliteExecutor implements SqlExecutor {\n constructor(private db: PGlite) {}\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query<T>(pgSql, safeParams);\n return result.rows.map(row => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.db.query(pgSql, safeParams);\n return result.affectedRows ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n await this.db.query('BEGIN');\n try {\n for (const { sql, params } of statements) {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n await this.db.query(pgSql, safeParams);\n }\n await this.db.query('COMMIT');\n } catch (error) {\n await this.db.query('ROLLBACK');\n throw error;\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.db.exec(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n\n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * node-postgres 执行器(需要安装 pg 包)\n */\nclass PgExecutor implements SqlExecutor {\n private pool: any; // pg.Pool\n\n constructor(pool: any) {\n this.pool = pool;\n }\n\n async query<T = any>(sql: string, params?: any[]): Promise<T[]> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Query: ${pgSql.slice(0, 60)}...`);\n const start = Date.now();\n const result = await this.pool.query(pgSql, safeParams);\n console.log(`[PgExecutor] Query done in ${Date.now() - start}ms, ${result.rows.length} rows`);\n return result.rows.map((row: any) => this.restoreRow(row));\n }\n\n async execute(sql: string, params?: any[]): Promise<number> {\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n const result = await this.pool.query(pgSql, safeParams);\n return result.rowCount ?? 0;\n }\n\n async executeInTransaction(statements: { sql: string; params?: any[] }[]): Promise<void> {\n console.log(`[PgExecutor] Getting connection from pool...`);\n const start = Date.now();\n const client = await this.pool.connect();\n console.log(`[PgExecutor] Got connection in ${Date.now() - start}ms`);\n try {\n console.log(`[PgExecutor] BEGIN transaction`);\n await client.query('BEGIN');\n for (let i = 0; i < statements.length; i++) {\n const { sql, params } = statements[i];\n const pgSql = this.convertPlaceholders(sql);\n const safeParams = params?.map(p => typeof p === 'string' ? toPgSafe(p) : p);\n console.log(`[PgExecutor] Executing statement ${i + 1}/${statements.length}: ${pgSql.slice(0, 60)}...`);\n await client.query(pgSql, safeParams);\n }\n console.log(`[PgExecutor] COMMIT transaction`);\n await client.query('COMMIT');\n } catch (error) {\n console.error(`[PgExecutor] Error, rolling back:`, error);\n await client.query('ROLLBACK');\n throw error;\n } finally {\n console.log(`[PgExecutor] Releasing connection`);\n client.release();\n }\n }\n\n async exec(sql: string): Promise<void> {\n await this.pool.query(sql);\n }\n\n private convertPlaceholders(sql: string): string {\n let index = 0;\n return sql.replace(/\\?/g, () => `$${++index}`);\n }\n\n private restoreRow<T>(row: T): T {\n if (!row || typeof row !== 'object') return row;\n\n const result: any = {};\n for (const [key, value] of Object.entries(row as any)) {\n result[key] = typeof value === 'string' ? fromPgSafe(value) : value;\n }\n return result as T;\n }\n}\n\n/**\n * PostgreSQL QuintStore 实现\n */\nexport class PgQuintStore extends BaseQuintStore {\n private pglite: PGlite | null = null;\n private pgPool: any = null; // pg.Pool\n private pgOptions: PgQuintStoreOptions;\n private sharedPoolConfig: {\n connectionString?: string;\n host?: string;\n port?: number;\n database?: string;\n user?: string;\n password?: string;\n } | null = null;\n\n constructor(options: PgQuintStoreOptions) {\n super(options);\n this.pgOptions = {\n driver: 'pglite', // 默认使用 PGLite\n ...options,\n };\n }\n\n protected async createExecutor(): Promise<SqlExecutor> {\n if (this.pgOptions.driver === 'pg') {\n // 使用共享的连接池(如果提供),避免死锁\n if (this.pgOptions.pool) {\n this.pgPool = this.pgOptions.pool;\n this.sharedPoolConfig = null;\n return new PgExecutor(this.pgPool);\n }\n\n // 使用共享连接池管理器,避免多个组件创建独立连接池\n this.sharedPoolConfig = {\n connectionString: this.pgOptions.connectionString,\n host: this.pgOptions.host,\n port: this.pgOptions.port,\n database: this.pgOptions.database,\n user: this.pgOptions.user,\n password: this.pgOptions.password,\n };\n this.pgPool = getSharedPool(this.sharedPoolConfig);\n return new PgExecutor(this.pgPool);\n } else {\n // 使用 PGLite\n this.pglite = new PGlite(this.pgOptions.dataDir);\n await this.pglite.waitReady;\n return new PgliteExecutor(this.pglite);\n }\n }\n\n protected async closeExecutor(): Promise<void> {\n if (this.pglite) {\n await this.pglite.close();\n this.pglite = null;\n }\n if (this.pgPool) {\n if (this.sharedPoolConfig) {\n releaseSharedPool(this.sharedPoolConfig);\n } else {\n await this.pgPool.end();\n }\n this.pgPool = null;\n this.sharedPoolConfig = null;\n }\n }\n\n /**\n * 重写 open 方法,处理 PostgreSQL 特定的语法\n */\n override async open(): Promise<void> {\n if (this.opened) {\n return;\n }\n\n this.opening ??= this.openOnce().finally(() => {\n this.opening = null;\n });\n\n await this.opening;\n }\n\n protected override async openOnce(): Promise<void> {\n const executor = await this.createExecutor();\n this.executor = executor;\n\n try {\n // PostgreSQL 建表语法\n await executor.exec(`\n CREATE TABLE IF NOT EXISTS quints (\n object_kind TEXT,\n object_key TEXT,\n object_text TEXT,\n object_digest TEXT,\n graph TEXT NOT NULL,\n subject TEXT NOT NULL,\n predicate TEXT NOT NULL,\n object TEXT NOT NULL,\n vector TEXT\n )\n `);\n\n await this.ensureTypedObjectSchema();\n\n const indexes = [\n 'CREATE INDEX IF NOT EXISTS idx_quints_graph ON quints (graph)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_subject ON quints (subject)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate ON quints (predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_object_key ON quints (object_kind, object_key)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_key ON quints (predicate, object_kind, object_key)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_predicate_object_digest ON quints (predicate, object_kind, object_digest)',\n 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_key ON quints (graph, subject, predicate, object_kind, object_key) WHERE object_key IS NOT NULL',\n 'CREATE UNIQUE INDEX IF NOT EXISTS idx_quints_gspo_digest ON quints (graph, subject, predicate, object_kind, object_digest) WHERE object_digest IS NOT NULL',\n 'CREATE INDEX IF NOT EXISTS idx_quints_gsp ON quints (graph, subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_sp ON quints (subject, predicate)',\n 'CREATE INDEX IF NOT EXISTS idx_quints_gp ON quints (graph, predicate)',\n ];\n\n for (const indexSql of indexes) {\n await executor.exec(indexSql);\n }\n this.opened = true;\n } catch (error) {\n await this.closeExecutor().catch(() => {});\n if (this.executor === executor) {\n this.executor = null;\n }\n this.opened = false;\n throw error;\n }\n }\n\n /**\n * 重写 put 方法,避免长文本对象进入 PostgreSQL btree 唯一键\n */\n override async put(quint: Quint): Promise<void> {\n this.ensureOpen();\n\n const row = this.quintToPgRow(quint);\n\n await this.executor!.executeInTransaction(this.writeStatementsForRow(row));\n }\n\n /**\n * 重写 multiPut 方法,使用同一事务保持批量写入幂等\n */\n override async multiPut(quintList: Quint[]): Promise<void> {\n console.log(`[PgQuintStore.multiPut] Starting: ${quintList.length} quints`);\n this.ensureOpen();\n\n if (quintList.length === 0) {\n console.log(`[PgQuintStore.multiPut] Empty list, skipping`);\n return;\n }\n\n const statements = quintList.flatMap(quint => {\n const row = this.quintToPgRow(quint);\n return this.writeStatementsForRow(row);\n });\n\n console.log(`[PgQuintStore.multiPut] Executing ${statements.length} statements in transaction`);\n const start = Date.now();\n await this.executor!.executeInTransaction(statements);\n console.log(`[PgQuintStore.multiPut] Completed in ${Date.now() - start}ms`);\n }\n\n override async multiDel(quintList: Quint[]): Promise<void> {\n this.ensureOpen();\n\n if (quintList.length === 0) return;\n\n const statements = quintList.map(quint => {\n const row = this.quintToPgRow(quint);\n return {\n sql: `\n DELETE FROM quints\n WHERE graph = $1\n AND subject = $2\n AND predicate = $3\n AND object = $4\n `,\n params: [row.graph, row.subject, row.predicate, row.object],\n };\n });\n\n await this.executor!.executeInTransaction(statements);\n }\n\n override async getAttributes(\n subjects: string[],\n predicates: string[],\n graph?: Term,\n ): Promise<AttributeMap> {\n this.ensureOpen();\n\n if (subjects.length === 0 || predicates.length === 0) {\n return new Map();\n }\n\n const subjectPlaceholders = subjects.map(() => '?').join(', ');\n const predicatePlaceholders = predicates.map(() => '?').join(', ');\n\n let sql = `\n SELECT subject, predicate, object\n FROM quints\n WHERE subject IN (${subjectPlaceholders})\n AND predicate IN (${predicatePlaceholders})\n `;\n const params: any[] = [...subjects, ...predicates];\n\n if (graph && graph.termType !== 'DefaultGraph') {\n const graphValue = termToId(graph);\n sql += ` AND graph = ?`;\n params.push(graphValue);\n }\n\n const rows = await this.executor!.query<{ subject: string; predicate: string; object: string }>(sql, params);\n const result: AttributeMap = new Map();\n\n for (const row of rows) {\n if (!result.has(row.subject)) {\n result.set(row.subject, new Map());\n }\n const predicateMap = result.get(row.subject)!;\n if (!predicateMap.has(row.predicate)) {\n predicateMap.set(row.predicate, []);\n }\n predicateMap.get(row.predicate)!.push(this.deserializeObject(row.object));\n }\n\n return result;\n }\n\n protected override buildWhereClause(pattern: QuintPattern): { whereClause: string; params: any[] } {\n const conditions: string[] = [];\n const params: any[] = [];\n const predicate = this.extractExactPredicate(pattern.predicate);\n\n this.addPgCondition(conditions, params, 'graph', pattern.graph);\n this.addPgCondition(conditions, params, 'subject', pattern.subject);\n this.addPgCondition(conditions, params, 'predicate', pattern.predicate);\n if (pattern.object) {\n this.addObjectConditions(conditions, params, undefined, pattern.object, predicate);\n }\n\n const whereClause = conditions.length > 0 ? ` WHERE ${conditions.join(' AND ')}` : '';\n return { whereClause, params };\n }\n\n private addPgCondition(\n conditions: string[],\n params: any[],\n column: 'graph' | 'subject' | 'predicate',\n match: TermMatch | undefined,\n ): void {\n if (!match) return;\n\n if (typeof match === 'object' && 'termType' in match) {\n const value = termToId(match as Term);\n conditions.push(`${column} = ?`);\n params.push(value);\n return;\n }\n\n const ops = match as any;\n if (ops.$eq !== undefined) {\n const value = this.serializeOpValue(ops.$eq, false, '$eq');\n conditions.push(`${column} = ?`);\n params.push(String(value));\n return;\n }\n\n super.addConditions(conditions, params, column, match, false);\n }\n\n protected override addAliasedConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: any,\n ): void {\n this.addAliasedPgCondition(conditions, params, alias, 'graph', pattern.graph, false);\n this.addAliasedPgCondition(conditions, params, alias, 'subject', pattern.subject, false);\n this.addAliasedPgCondition(conditions, params, alias, 'predicate', pattern.predicate, false);\n this.addAliasedObjectConditions(conditions, params, alias, pattern);\n }\n\n protected override buildCompoundQuery(compound: CompoundPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { patterns, joinOn, select } = compound;\n const params: any[] = [];\n\n let selectClause = `q0.${joinOn} as join_value`;\n\n if (select) {\n for (const s of select) {\n selectClause += `, q${s.pattern}.${s.field} as ${s.alias}`;\n }\n } else {\n for (let i = 0; i < patterns.length; i++) {\n selectClause += `, q${i}.object as p${i}_object`;\n selectClause += `, q${i}.predicate as p${i}_predicate`;\n }\n }\n\n let fromClause = 'quints q0';\n for (let i = 1; i < patterns.length; i++) {\n fromClause += ` JOIN quints q${i} ON q0.${joinOn} = q${i}.${joinOn}`;\n fromClause += ` AND q0.graph = q${i}.graph`;\n }\n\n const whereParts: string[] = [];\n\n for (let i = 0; i < patterns.length; i++) {\n const pattern = patterns[i];\n const alias = `q${i}`;\n\n this.addAliasedConditions(whereParts, params, alias, pattern);\n }\n\n let sql = `SELECT ${selectClause} FROM ${fromClause}`;\n\n if (whereParts.length > 0) {\n sql += ` WHERE ${whereParts.join(' AND ')}`;\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n protected override buildSelectQuery(pattern: QuintPattern, options?: QueryOptions): { sql: string; params: any[] } {\n const { whereClause, params } = this.buildWhereClause(pattern);\n\n let sql = `SELECT * FROM quints${whereClause}`;\n\n if (options?.order && options.order.length > 0) {\n const orderCols = options.order.map(field => {\n if (field === 'object') {\n const objectType = this.resolveObjectDataTypeForPattern(pattern);\n if (objectType === 'longText') {\n throw new Error('ORDER BY object is not supported for longText predicates');\n }\n return 'object_key';\n }\n return field;\n }).join(', ');\n sql += ` ORDER BY ${orderCols}`;\n if (options.reverse) {\n sql += ' DESC';\n }\n }\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n if (options?.offset) {\n sql += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n return { sql, params };\n }\n\n override async count(pattern: QuintPattern): Promise<number> {\n const count = await super.count(pattern);\n return Number(count);\n }\n\n override async stats(): Promise<import('./types').StoreStats> {\n const stats = await super.stats();\n return {\n totalCount: Number(stats.totalCount),\n vectorCount: Number(stats.vectorCount),\n graphCount: Number(stats.graphCount),\n };\n }\n\n private async ensureTypedObjectSchema(): Promise<void> {\n const statements = [\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_kind TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_key TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_text TEXT',\n 'ALTER TABLE quints ADD COLUMN IF NOT EXISTS object_digest TEXT',\n ];\n\n for (const statement of statements) {\n await this.executor!.exec(statement);\n }\n\n // The old Postgres schema indexed complete RDF terms. Long literals can\n // exceed the btree tuple size and surface as 500s while creating containers.\n const obsoleteIndexes = [\n 'idx_spog',\n 'idx_ogsp',\n 'idx_gspo',\n 'idx_sopg',\n 'idx_pogs',\n 'idx_gpos',\n 'idx_pg_spog',\n 'idx_pg_ogsp',\n 'idx_pg_gspo',\n 'idx_pg_sopg',\n 'idx_pg_pogs',\n 'idx_pg_gpos',\n 'idx_pg_graph_prefix',\n 'idx_quints_predicate_object_text',\n 'idx_quints_quint_hash',\n 'idx_quints_graph_hash',\n 'idx_quints_subject_hash',\n 'idx_quints_predicate_hash',\n 'idx_quints_object_hash',\n 'idx_quints_gsp_hash',\n 'idx_quints_sp_hash',\n 'idx_quints_gp_hash',\n ];\n\n for (const indexName of obsoleteIndexes) {\n await this.executor!.exec(`DROP INDEX IF EXISTS ${indexName}`);\n }\n\n await this.executor!.exec('ALTER TABLE quints DROP CONSTRAINT IF EXISTS quints_pkey');\n\n const obsoleteColumns = [\n 'quint_hash',\n 'graph_hash',\n 'subject_hash',\n 'predicate_hash',\n 'object_hash',\n ];\n\n for (const columnName of obsoleteColumns) {\n await this.executor!.exec(`ALTER TABLE quints DROP COLUMN IF EXISTS ${columnName}`);\n }\n\n await this.backfillMissingObjectIndexFields();\n await this.executor!.exec(`\n UPDATE quints\n SET object_kind = 'text'\n WHERE object_kind = 'shortText'\n `);\n }\n\n private async backfillMissingObjectIndexFields(): Promise<void> {\n const rows = await this.executor!.query<{\n graph: string;\n subject: string;\n predicate: string;\n object: string;\n }>(`\n SELECT graph, subject, predicate, object\n FROM quints\n WHERE object_kind IS NULL\n OR (object_key IS NULL AND object_digest IS NULL)\n `);\n\n for (const row of rows) {\n const objectIndex = this.objectIndexForSerialized(row.predicate, row.object);\n await this.executor!.execute(`\n UPDATE quints\n SET object_kind = $1,\n object_key = $2,\n object_text = $3,\n object_digest = $4\n WHERE graph = $5\n AND subject = $6\n AND predicate = $7\n AND object = $8\n `, [\n objectIndex.objectKind,\n objectIndex.objectKey,\n objectIndex.objectText,\n this.objectDigestForIndex(row.object, objectIndex),\n row.graph,\n row.subject,\n row.predicate,\n row.object,\n ]);\n }\n }\n\n private quintToPgRow(quint: Quint): PgQuintRow {\n const row = this.quintToRow(quint);\n const objectIndex = this.objectIndexForTerm(row.predicate, quint.object as Term);\n return {\n ...row,\n objectKind: objectIndex.objectKind,\n objectKey: objectIndex.objectKey,\n objectText: objectIndex.objectText,\n objectDigest: this.objectDigestForIndex(row.object, objectIndex),\n };\n }\n\n private objectIndexForTerm(predicate: string, object: Term): ObjectIndexFields {\n return objectIndexFieldsFromTerm(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectIndexForSerialized(predicate: string, object: string): ObjectIndexFields {\n return objectIndexFieldsFromSerialized(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectDigestForIndex(serialized: string, fields: ObjectIndexFields): string | null {\n return fields.objectKey === null ? digestObject(serialized) : null;\n }\n\n private writeStatementsForRow(row: PgQuintRow): { sql: string; params?: any[] }[] {\n const params = [\n row.objectKind,\n row.objectKey,\n row.objectText,\n row.objectDigest,\n row.graph,\n row.subject,\n row.predicate,\n row.object,\n row.vector,\n ];\n\n if (row.objectKey !== null) {\n return [{\n sql: `\n INSERT INTO quints (\n object_kind, object_key, object_text, object_digest,\n graph, subject, predicate, object, vector\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (graph, subject, predicate, object_kind, object_key)\n WHERE object_key IS NOT NULL\n DO UPDATE SET\n vector = EXCLUDED.vector,\n object_text = EXCLUDED.object_text,\n object_digest = EXCLUDED.object_digest\n WHERE quints.object = EXCLUDED.object\n `,\n params,\n }];\n }\n\n return [{\n sql: `\n INSERT INTO quints (\n object_kind, object_key, object_text, object_digest,\n graph, subject, predicate, object, vector\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)\n ON CONFLICT (graph, subject, predicate, object_kind, object_digest)\n WHERE object_digest IS NOT NULL\n DO UPDATE SET\n object = CASE WHEN quints.object = EXCLUDED.object THEN EXCLUDED.object ELSE NULL END,\n vector = EXCLUDED.vector,\n object_text = EXCLUDED.object_text\n `,\n params,\n }];\n }\n\n private addObjectConditions(\n conditions: string[],\n params: any[],\n alias: string | undefined,\n match: TermMatch,\n predicate: string | undefined,\n ): void {\n const column = (name: string) => alias ? `${alias}.${name}` : name;\n\n if (typeof match === 'object' && 'termType' in match) {\n this.addObjectExactCondition(conditions, params, column, match, predicate);\n return;\n }\n\n const ops = match as any;\n\n if (ops.$eq !== undefined) {\n this.addObjectExactValueCondition(conditions, params, column, ops.$eq, '$eq', predicate);\n }\n if (ops.$ne !== undefined) {\n this.addObjectExactValueCondition(conditions, params, column, ops.$ne, '$ne', predicate);\n }\n if (ops.$gt !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '>', ops.$gt, '$gt', predicate);\n }\n if (ops.$gte !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '>=', ops.$gte, '$gte', predicate);\n }\n if (ops.$lt !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '<', ops.$lt, '$lt', predicate);\n }\n if (ops.$lte !== undefined) {\n this.addObjectComparableCondition(conditions, params, column, '<=', ops.$lte, '$lte', predicate);\n }\n if (ops.$in !== undefined && ops.$in.length > 0) {\n const predicates: Array<{ serialized: string; fields: ObjectIndexFields }> = ops.$in.map((value: any) => this.objectPredicateForOperatorValue(value, '$in', predicate));\n const placeholders = predicates.map((item) => {\n if (item.fields.objectKey === null) {\n return `(${column('object_kind')} = ? AND ${column('object_digest')} = ? AND ${column('object')} = ?)`;\n }\n return `(${column('object_kind')} = ? AND ${column('object_key')} = ?)`;\n }).join(' OR ');\n conditions.push(`(${placeholders})`);\n for (const item of predicates) {\n if (item.fields.objectKey === null) {\n params.push(item.fields.objectKind, this.objectDigestForIndex(item.serialized, item.fields), item.serialized);\n } else {\n params.push(item.fields.objectKind, item.fields.objectKey);\n }\n }\n }\n if (ops.$notIn !== undefined && ops.$notIn.length > 0) {\n const values = ops.$notIn.map((value: any) => this.objectPredicateForOperatorValue(value, '$notIn', predicate).serialized);\n for (const value of values) {\n conditions.push(`${column('object')} != ?`);\n params.push(value);\n }\n }\n if (ops.$startsWith !== undefined) {\n const fields = this.objectFieldsForPrefix(ops.$startsWith, predicate);\n this.assertComparableObject(fields, '$startsWith');\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_key')} >= ? AND ${column('object_key')} < ?`);\n params.push(ops.$startsWith, ops.$startsWith + '\\uffff');\n }\n if (ops.$endsWith !== undefined) {\n this.addObjectTextCondition(conditions, params, column, 'LIKE', `%${ops.$endsWith}`, predicate);\n }\n if (ops.$contains !== undefined) {\n this.addObjectTextCondition(conditions, params, column, 'LIKE', `%${ops.$contains}%`, predicate);\n }\n if (ops.$regex !== undefined) {\n const pattern = ops.$regex.replace(/\\.\\*/g, '%').replace(/\\./g, '_');\n this.addObjectTextCondition(conditions, params, column, 'LIKE', pattern, predicate);\n }\n if (ops.$strStartsWith !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'startsWith', ops.$strStartsWith);\n }\n if (ops.$strEndsWith !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'endsWith', ops.$strEndsWith);\n }\n if (ops.$strContains !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'contains', ops.$strContains);\n }\n if (ops.$strRegex !== undefined) {\n this.addObjectLexicalStringCondition(conditions, params, column, 'regex', ops.$strRegex);\n }\n if (ops.$language !== undefined) {\n this.addObjectLanguageCondition(conditions, params, column, ops.$language);\n }\n if (ops.$isNull === true) {\n conditions.push(`${column('object')} IS NULL`);\n }\n if (ops.$isNull === false) {\n conditions.push(`${column('object')} IS NOT NULL`);\n }\n }\n\n private addObjectExactCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n object: Term,\n predicate: string | undefined,\n ): void {\n const serialized = serializeObject(object);\n const fields = this.objectFieldsForTerm(object, predicate);\n this.addObjectExactSerializedCondition(conditions, params, column, serialized, fields);\n }\n\n private addObjectExactValueCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n value: any,\n op: '$eq' | '$ne',\n predicate: string | undefined,\n ): void {\n const item = this.objectPredicateForOperatorValue(value, op, predicate);\n if (op === '$ne') {\n conditions.push(`${column('object')} != ?`);\n params.push(item.serialized);\n return;\n }\n this.addObjectExactSerializedCondition(conditions, params, column, item.serialized, item.fields);\n }\n\n private addObjectExactSerializedCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n serialized: string,\n fields: ObjectIndexFields,\n ): void {\n if (fields.objectKey !== null) {\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_key')} = ?`);\n params.push(fields.objectKey);\n return;\n }\n\n conditions.push(`${column('object_kind')} = ?`);\n params.push(fields.objectKind);\n conditions.push(`${column('object_digest')} = ?`);\n params.push(this.objectDigestForIndex(serialized, fields));\n conditions.push(`${column('object')} = ?`);\n params.push(serialized);\n }\n\n private addObjectComparableCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n sqlOperator: string,\n value: any,\n op: string,\n predicate: string | undefined,\n ): void {\n const item = this.objectPredicateForOperatorValue(value, op, predicate);\n this.assertComparableObject(item.fields, op);\n conditions.push(`${column('object_kind')} = ?`);\n params.push(item.fields.objectKind);\n conditions.push(`${column('object_key')} ${sqlOperator} ?`);\n params.push(item.serialized);\n }\n\n private addObjectTextCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n sqlOperator: string,\n value: string,\n predicate: string | undefined,\n ): void {\n const declaredType = getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n if (declaredType) {\n if (!['text', 'longText', 'literal'].includes(declaredType)) {\n throw new Error(`Object text search is not supported for ${declaredType}`);\n }\n conditions.push(`${column('object_kind')} = ?`);\n params.push(declaredType);\n }\n conditions.push(`${column('object_text')} ${sqlOperator} ?`);\n params.push(value);\n }\n\n private addObjectLexicalStringCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n op: 'startsWith' | 'endsWith' | 'contains' | 'regex',\n value: string,\n ): void {\n const lexical = this.objectLexicalSql(column);\n\n if (op === 'startsWith') {\n conditions.push(`(${lexical} >= ? AND ${lexical} < ?)`);\n params.push(value, value + '\\uffff');\n return;\n }\n\n if (op === 'endsWith') {\n conditions.push(`RIGHT(${lexical}, LENGTH(?)) = ?`);\n params.push(value, value);\n return;\n }\n\n if (op === 'contains') {\n conditions.push(`POSITION(? IN ${lexical}) > 0`);\n params.push(value);\n return;\n }\n\n conditions.push(`${lexical} ~ ?`);\n params.push(value);\n }\n\n private objectLexicalSql(column: (name: string) => string): string {\n return `CASE\n WHEN ${column('object_text')} IS NOT NULL THEN ${column('object_text')}\n WHEN ${column('object_kind')} IN ('iri', 'blankNode') THEN ${column('object_key')}\n WHEN ${column('object_kind')} = 'numeric' THEN split_part(${column('object')}, '${PG_SEP}', 4)\n WHEN ${column('object_kind')} = 'dateTime' THEN split_part(${column('object')}, '${PG_SEP}', 3)\n ELSE NULL\n END`;\n }\n\n private addObjectLanguageCondition(\n conditions: string[],\n params: any[],\n column: (name: string) => string,\n lang: string,\n ): void {\n const languageLiteralKinds = `${column('object_kind')} IN ('text', 'longText', 'literal')`;\n\n if (lang === '*') {\n conditions.push(`(${languageLiteralKinds} AND ${column('object')} ~ ?)`);\n params.push('\"@[A-Za-z]+(-[A-Za-z0-9]+)*$');\n return;\n }\n\n const suffix = `\"@${lang.toLowerCase()}`;\n conditions.push(`(${languageLiteralKinds} AND (RIGHT(LOWER(${column('object')}), LENGTH(?)) = ? OR LOWER(${column('object')}) LIKE ?))`);\n params.push(suffix, suffix, `%\"@${lang.toLowerCase()}-%`);\n }\n\n private objectPredicateForOperatorValue(\n value: any,\n op: string,\n predicate: string | undefined,\n ): { serialized: string; fields: ObjectIndexFields } {\n const serialized = this.serializeOpValue(value, true, op);\n return {\n serialized,\n fields: this.objectFieldsForSerialized(serialized, predicate),\n };\n }\n\n private objectFieldsForTerm(object: Term, predicate: string | undefined): ObjectIndexFields {\n return objectIndexFieldsFromTerm(object, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectFieldsForSerialized(serialized: string, predicate: string | undefined): ObjectIndexFields {\n return objectIndexFieldsFromSerialized(serialized, {\n predicate,\n predicateObjectDataTypes: this.options.predicateObjectDataTypes,\n textMaxBytes: this.options.textMaxBytes,\n });\n }\n\n private objectFieldsForPrefix(prefix: string, predicate: string | undefined): ObjectIndexFields {\n const declaredType = getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n if (declaredType) {\n if (declaredType === 'longText') {\n return { objectKind: 'longText', objectKey: null, objectText: prefix };\n }\n return { objectKind: declaredType, objectKey: prefix, objectText: null };\n }\n\n if (isSerializedNumericLiteral(prefix)) {\n return { objectKind: 'numeric', objectKey: prefix, objectText: null };\n }\n if (isSerializedDateTimeLiteral(prefix)) {\n return { objectKind: 'dateTime', objectKey: prefix, objectText: null };\n }\n if (prefix.startsWith('\"')) {\n return { objectKind: 'text', objectKey: prefix, objectText: null };\n }\n if (prefix.startsWith('_:')) {\n return { objectKind: 'blankNode', objectKey: prefix, objectText: null };\n }\n return { objectKind: 'iri', objectKey: prefix, objectText: null };\n }\n\n private assertComparableObject(fields: ObjectIndexFields, op: string): void {\n if (fields.objectKey !== null && fields.objectKind !== 'longText') {\n return;\n }\n throw new Error(`Object ${op} is not supported for ${fields.objectKind}; declare/use a comparable data type instead of longText`);\n }\n\n private addAliasedObjectConditions(\n conditions: string[],\n params: any[],\n alias: string,\n pattern: QuintPattern,\n ): void {\n if (!pattern.object) return;\n this.addObjectConditions(\n conditions,\n params,\n alias,\n pattern.object,\n this.extractExactPredicate(pattern.predicate),\n );\n }\n\n private extractExactPredicate(match: TermMatch | undefined): string | undefined {\n if (!match) return undefined;\n if (typeof match === 'object' && 'termType' in match) {\n return termToId(match as Term);\n }\n const ops = match as any;\n if (ops.$eq !== undefined) {\n return String(this.serializeOpValue(ops.$eq, false, '$eq'));\n }\n return undefined;\n }\n\n private resolveObjectDataTypeForPattern(pattern: QuintPattern): PredicateObjectDataType | undefined {\n const predicate = this.extractExactPredicate(pattern.predicate);\n if (predicate) {\n return getPredicateObjectDataType(predicate, this.options.predicateObjectDataTypes);\n }\n if (pattern.object && typeof pattern.object === 'object' && 'termType' in pattern.object) {\n return this.objectFieldsForTerm(pattern.object as Term, predicate).objectKind;\n }\n return undefined;\n }\n\n private addAliasedPgCondition(\n conditions: string[],\n params: any[],\n alias: string,\n column: string,\n match: any,\n isObject: boolean,\n ): void {\n if (!match) return;\n\n if (isObject) {\n this.addObjectConditions(conditions, params, alias, match, undefined);\n return;\n }\n\n if (typeof match === 'object' && 'termType' in match) {\n const value = termToId(match);\n conditions.push(`${alias}.${column} = ?`);\n params.push(value);\n return;\n }\n\n if (match.$eq !== undefined) {\n const value = this.serializeOpValue(match.$eq, false, '$eq');\n conditions.push(`${alias}.${column} = ?`);\n params.push(value);\n return;\n }\n\n this.addFallbackAliasedCondition(conditions, params, alias, column, match, isObject);\n }\n\n private addFallbackAliasedCondition(\n conditions: string[],\n params: any[],\n alias: string,\n column: string,\n match: any,\n isObject: boolean,\n ): void {\n if (isObject) {\n this.addObjectConditions(conditions, params, alias, match, undefined);\n return;\n }\n if (match.$gt !== undefined) {\n conditions.push(`${alias}.${column} > ?`);\n params.push(this.serializeOpValue(match.$gt, false, '$gt'));\n }\n if (match.$gte !== undefined) {\n conditions.push(`${alias}.${column} >= ?`);\n params.push(this.serializeOpValue(match.$gte, false, '$gte'));\n }\n if (match.$lt !== undefined) {\n conditions.push(`${alias}.${column} < ?`);\n params.push(this.serializeOpValue(match.$lt, false, '$lt'));\n }\n if (match.$lte !== undefined) {\n conditions.push(`${alias}.${column} <= ?`);\n params.push(this.serializeOpValue(match.$lte, false, '$lte'));\n }\n if (match.$in !== undefined && match.$in.length > 0) {\n const placeholders = match.$in.map(() => '?').join(', ');\n conditions.push(`${alias}.${column} IN (${placeholders})`);\n params.push(...match.$in.map((value: any) => this.serializeOpValue(value, false, '$in')));\n }\n }\n}\n"]}
@@ -8,9 +8,6 @@
8
8
  "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore",
9
9
  "@type": "Class",
10
10
  "requireElement": "PgQuintStore",
11
- "extends": [
12
- "undefineds:dist/storage/quint/BaseQuintStore.jsonld#BaseQuintStore"
13
- ],
14
11
  "comment": "PostgreSQL QuintStore 实现",
15
12
  "parameters": [
16
13
  {
@@ -242,6 +239,10 @@
242
239
  "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_open",
243
240
  "memberFieldName": "open"
244
241
  },
242
+ {
243
+ "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_openOnce",
244
+ "memberFieldName": "openOnce"
245
+ },
245
246
  {
246
247
  "@id": "undefineds:dist/storage/quint/PgQuintStore.jsonld#PgQuintStore__member_put",
247
248
  "memberFieldName": "put"
@@ -48,6 +48,11 @@ export declare class SqliteQuintStore {
48
48
  del(pattern: QuintPattern): Promise<number>;
49
49
  multiDel(quintList: Quint[]): Promise<void>;
50
50
  stats(): Promise<StoreStats>;
51
+ private sqliteSpaceStats;
52
+ private estimateDatabaseBytes;
53
+ private collectSpaceObjects;
54
+ private estimateSpaceObjectsFromSchema;
55
+ private estimatePageSize;
51
56
  clear(): Promise<void>;
52
57
  private ensureOpen;
53
58
  private buildConditions;
@@ -511,8 +511,91 @@ class SqliteQuintStore {
511
511
  totalCount: totalResult[0]?.count ?? 0,
512
512
  vectorCount: vectorResult[0]?.count ?? 0,
513
513
  graphCount: graphResult[0]?.count ?? 0,
514
+ ...this.sqliteSpaceStats(),
514
515
  };
515
516
  }
517
+ sqliteSpaceStats() {
518
+ const spaceObjects = this.collectSpaceObjects();
519
+ const databaseBytes = this.estimateDatabaseBytes();
520
+ const accountedBytes = spaceObjects.reduce((sum, object) => sum + object.bytes, 0);
521
+ return {
522
+ databaseBytes: databaseBytes || accountedBytes,
523
+ tableBytes: sumStoreSpaceObjects(spaceObjects, 'table'),
524
+ indexBytes: sumStoreSpaceObjects(spaceObjects, 'index'),
525
+ spaceObjects,
526
+ };
527
+ }
528
+ estimateDatabaseBytes() {
529
+ try {
530
+ const pageCount = this.sqlite.prepare('PRAGMA page_count').get()?.page_count ?? 0;
531
+ const pageSize = this.sqlite.prepare('PRAGMA page_size').get()?.page_size ?? 0;
532
+ return pageCount * pageSize;
533
+ }
534
+ catch {
535
+ return 0;
536
+ }
537
+ }
538
+ collectSpaceObjects() {
539
+ try {
540
+ const schemaRows = this.sqlite.prepare(`
541
+ SELECT name, type, tbl_name
542
+ FROM sqlite_schema
543
+ WHERE type IN ('table', 'index')
544
+ `).all();
545
+ const rows = this.sqlite.prepare(`
546
+ SELECT name, COUNT(*) AS pages, SUM(pgsize) AS bytes
547
+ FROM dbstat
548
+ GROUP BY name
549
+ ORDER BY name
550
+ `).all();
551
+ if (rows.length > 0) {
552
+ const schema = new Map(schemaRows.map((row) => [row.name, row]));
553
+ return rows.map((row) => {
554
+ const object = schema.get(row.name);
555
+ const kind = quintSpaceObjectKind(row.name, object?.type, object?.tbl_name);
556
+ return {
557
+ name: row.name,
558
+ kind,
559
+ ...(object?.tbl_name && object.tbl_name !== row.name ? { tableName: object.tbl_name } : {}),
560
+ pages: row.pages,
561
+ bytes: row.bytes ?? 0,
562
+ };
563
+ });
564
+ }
565
+ return this.estimateSpaceObjectsFromSchema(schemaRows);
566
+ }
567
+ catch {
568
+ try {
569
+ const schemaRows = this.sqlite.prepare(`
570
+ SELECT name, type, tbl_name
571
+ FROM sqlite_schema
572
+ WHERE type IN ('table', 'index')
573
+ `).all();
574
+ return this.estimateSpaceObjectsFromSchema(schemaRows);
575
+ }
576
+ catch {
577
+ return [];
578
+ }
579
+ }
580
+ }
581
+ estimateSpaceObjectsFromSchema(schemaRows) {
582
+ const pageSize = this.estimatePageSize();
583
+ return schemaRows.map((object) => ({
584
+ name: object.name,
585
+ kind: quintSpaceObjectKind(object.name, object.type, object.tbl_name),
586
+ ...(object.tbl_name && object.tbl_name !== object.name ? { tableName: object.tbl_name } : {}),
587
+ pages: 1,
588
+ bytes: pageSize,
589
+ }));
590
+ }
591
+ estimatePageSize() {
592
+ try {
593
+ return this.sqlite.prepare('PRAGMA page_size').get()?.page_size ?? 4096;
594
+ }
595
+ catch {
596
+ return 4096;
597
+ }
598
+ }
516
599
  async clear() {
517
600
  this.ensureOpen();
518
601
  await this.db.delete(schema_1.quints);
@@ -673,4 +756,21 @@ class SqliteQuintStore {
673
756
  }
674
757
  }
675
758
  exports.SqliteQuintStore = SqliteQuintStore;
759
+ function sumStoreSpaceObjects(objects, kind) {
760
+ return objects
761
+ .filter((object) => object.kind === kind)
762
+ .reduce((sum, object) => sum + object.bytes, 0);
763
+ }
764
+ function quintSpaceObjectKind(name, schemaType, tableName) {
765
+ if (schemaType === 'table' && name === 'quints') {
766
+ return 'table';
767
+ }
768
+ if (schemaType === 'index' && (name.startsWith('idx_') || tableName === 'quints')) {
769
+ return 'index';
770
+ }
771
+ if (name.startsWith('sqlite_')) {
772
+ return 'internal';
773
+ }
774
+ return 'unknown';
775
+ }
676
776
  //# sourceMappingURL=SqliteQuintStore.js.map