@seedprotocol/sdk 0.4.5 → 0.4.7

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 (168) hide show
  1. package/dist/{ArweaveClient-WcG8CZAE.js → ArweaveClient-BdQaTOZ4.js} +3 -3
  2. package/dist/{ArweaveClient-WcG8CZAE.js.map → ArweaveClient-BdQaTOZ4.js.map} +1 -1
  3. package/dist/{ArweaveClient-CgWK-JgT.js → ArweaveClient-nrTU_rhU.js} +3 -3
  4. package/dist/{ArweaveClient-CgWK-JgT.js.map → ArweaveClient-nrTU_rhU.js.map} +1 -1
  5. package/dist/{Db-DjofXdeU.js → Db-CWKaeNQH.js} +7 -104
  6. package/dist/Db-CWKaeNQH.js.map +1 -0
  7. package/dist/{Db-DjFdIdR9.js → Db-Cq4q88X_.js} +21 -5
  8. package/dist/Db-Cq4q88X_.js.map +1 -0
  9. package/dist/{EasClient-Aojewp6P.js → EasClient-Du9_TULE.js} +2 -2
  10. package/dist/{EasClient-BVFXp2O6.js.map → EasClient-Du9_TULE.js.map} +1 -1
  11. package/dist/{EasClient-BVFXp2O6.js → EasClient-ZCIE6UQq.js} +2 -2
  12. package/dist/{EasClient-Aojewp6P.js.map → EasClient-ZCIE6UQq.js.map} +1 -1
  13. package/dist/{FileManager-C9zr4AJe.js → FileManager-Cub9icdd.js} +4 -3
  14. package/dist/FileManager-Cub9icdd.js.map +1 -0
  15. package/dist/{FileManager-CxGJLw5C.js → FileManager-HSFEess-.js} +2 -2
  16. package/dist/{FileManager-CxGJLw5C.js.map → FileManager-HSFEess-.js.map} +1 -1
  17. package/dist/Item/Item.d.ts +2 -0
  18. package/dist/Item/Item.d.ts.map +1 -1
  19. package/dist/Item/service/actors/fetchDataFromEas.d.ts.map +1 -1
  20. package/dist/Item/service/actors/loadOrCreateItem.d.ts.map +1 -1
  21. package/dist/Item/service/actors/runPublish.d.ts.map +1 -1
  22. package/dist/Item/service/itemMachineSingle.d.ts.map +1 -1
  23. package/dist/ItemProperty/ItemProperty.d.ts.map +1 -1
  24. package/dist/ItemProperty/service/actors/hydrateFromDb.d.ts.map +1 -1
  25. package/dist/ItemProperty/service/actors/loadOrCreateProperty.d.ts.map +1 -1
  26. package/dist/ItemProperty/service/actors/resolveRelatedValue.d.ts.map +1 -1
  27. package/dist/ItemProperty/service/actors/saveValueToDb/analyzeInput.d.ts.map +1 -1
  28. package/dist/ItemProperty/service/actors/saveValueToDb/saveRelation.d.ts.map +1 -1
  29. package/dist/Model/Model.d.ts +5 -0
  30. package/dist/Model/Model.d.ts.map +1 -1
  31. package/dist/Model/service/actors/createModelProperties.d.ts.map +1 -1
  32. package/dist/Model/service/actors/loadOrCreateModel.d.ts.map +1 -1
  33. package/dist/Model/service/actors/validateModel.d.ts.map +1 -1
  34. package/dist/ModelProperty/service/actors/compareAndMarkDraft.d.ts.map +1 -1
  35. package/dist/ModelProperty/service/actors/saveToSchema.d.ts.map +1 -1
  36. package/dist/ModelProperty/service/actors/validateProperty.d.ts.map +1 -1
  37. package/dist/{ModelProperty-CGdkocQ8.js → ModelProperty-D4zaeIOT.js} +52 -18
  38. package/dist/ModelProperty-D4zaeIOT.js.map +1 -0
  39. package/dist/{PathResolver-z_WX47_o.js → PathResolver-DVLBs_qi.js} +2 -2
  40. package/dist/{PathResolver-z_WX47_o.js.map → PathResolver-DVLBs_qi.js.map} +1 -1
  41. package/dist/{PathResolver-CX6GHoTS.js → PathResolver-T1yEDECb.js} +2 -2
  42. package/dist/{PathResolver-CX6GHoTS.js.map → PathResolver-T1yEDECb.js.map} +1 -1
  43. package/dist/{QueryClient-Cb1iJO-x.js → QueryClient-DcKDQuwz.js} +2 -2
  44. package/dist/{QueryClient-Cb1iJO-x.js.map → QueryClient-DcKDQuwz.js.map} +1 -1
  45. package/dist/{QueryClient-ByKPdRmE.js → QueryClient-Vs9KN5kS.js} +2 -2
  46. package/dist/{QueryClient-ByKPdRmE.js.map → QueryClient-Vs9KN5kS.js.map} +1 -1
  47. package/dist/Schema/Schema.d.ts.map +1 -1
  48. package/dist/Schema/service/actors/createModelInstances.d.ts.map +1 -1
  49. package/dist/Schema/service/actors/loadOrCreateSchema.d.ts.map +1 -1
  50. package/dist/Schema/service/actors/verifyModelInstancesInCache.d.ts.map +1 -1
  51. package/dist/Schema/service/actors/writePropertiesToDb.d.ts.map +1 -1
  52. package/dist/Schema/service/addModelsMachine.d.ts.map +1 -1
  53. package/dist/{Schema-D1eqDHyt.js → Schema-SbwqmoMM.js} +63 -24
  54. package/dist/Schema-SbwqmoMM.js.map +1 -0
  55. package/dist/{SchemaValidationService-DyttFaV_.js → SchemaValidationService-DHGIw4Nx.js} +2 -2
  56. package/dist/{SchemaValidationService-DyttFaV_.js.map → SchemaValidationService-DHGIw4Nx.js.map} +1 -1
  57. package/dist/browser/db/drizzleFiles.d.ts +3 -2
  58. package/dist/browser/db/drizzleFiles.d.ts.map +1 -1
  59. package/dist/browser/helpers/FileManager.d.ts.map +1 -1
  60. package/dist/browser/react/item.d.ts +2 -0
  61. package/dist/browser/react/item.d.ts.map +1 -1
  62. package/dist/browser/react/itemProperty.d.ts.map +1 -1
  63. package/dist/cjs/{ModelProperty-BeJvgKMw.js → ModelProperty-DpjD0o0E.js} +32 -18
  64. package/dist/cjs/ModelProperty-DpjD0o0E.js.map +1 -0
  65. package/dist/cjs/{Schema-CVs9J6eP.js → Schema-DkSBMBwz.js} +33 -24
  66. package/dist/cjs/Schema-DkSBMBwz.js.map +1 -0
  67. package/dist/cjs/{SchemaValidationService-CDKcVRFQ.js → SchemaValidationService-O3FCMROl.js} +2 -2
  68. package/dist/cjs/{SchemaValidationService-CDKcVRFQ.js.map → SchemaValidationService-O3FCMROl.js.map} +1 -1
  69. package/dist/cjs/{getItem-B5RYPvrG.js → getItem-BeAVMk54.js} +2 -2
  70. package/dist/cjs/{getItem-B5RYPvrG.js.map → getItem-BeAVMk54.js.map} +1 -1
  71. package/dist/cjs/{getPublishPayload-BD1qRob1.js → getPublishPayload-CoLriAMV.js} +7 -5
  72. package/dist/cjs/getPublishPayload-CoLriAMV.js.map +1 -0
  73. package/dist/cjs/{getPublishUploads-CnC9aYxs.js → getPublishUploads-DDsT9zZ6.js} +3 -3
  74. package/dist/cjs/{getPublishUploads-CnC9aYxs.js.map → getPublishUploads-DDsT9zZ6.js.map} +1 -1
  75. package/dist/cjs/{getSegmentedItemProperties-B_njnntx.js → getSegmentedItemProperties-DGR0utR5.js} +2 -2
  76. package/dist/cjs/{getSegmentedItemProperties-B_njnntx.js.map → getSegmentedItemProperties-DGR0utR5.js.map} +1 -1
  77. package/dist/cjs/{index-BeKPbbk0.js → index-B95Ng80C.js} +629 -241
  78. package/dist/cjs/index-B95Ng80C.js.map +1 -0
  79. package/dist/cjs/{index-Dnywap_P.js → index-CvcOtzbi.js} +2 -2
  80. package/dist/cjs/index-CvcOtzbi.js.map +1 -0
  81. package/dist/cjs/ownership-Dm5ER1nI.js +103 -0
  82. package/dist/cjs/ownership-Dm5ER1nI.js.map +1 -0
  83. package/dist/client/ClientManager.d.ts +54 -43
  84. package/dist/client/ClientManager.d.ts.map +1 -1
  85. package/dist/client/actors/platformClassesInit.d.ts.map +1 -1
  86. package/dist/client/actors/saveConfig.d.ts.map +1 -1
  87. package/dist/client/clientManagerMachine.d.ts.map +1 -1
  88. package/dist/db/drizzle/drizzle/0004_add_publisher_to_seeds.sql +1 -0
  89. package/dist/db/drizzle/drizzle/meta/0004_snapshot.json +857 -0
  90. package/dist/db/drizzle/drizzle/meta/_journal.json +7 -0
  91. package/dist/db/read/getItemData.d.ts.map +1 -1
  92. package/dist/db/read/getItems.d.ts +2 -0
  93. package/dist/db/read/getItems.d.ts.map +1 -1
  94. package/dist/db/read/getModelSchemas.d.ts.map +1 -1
  95. package/dist/db/read/getPublishPayload.d.ts.map +1 -1
  96. package/dist/db/write/createNewItem.d.ts.map +1 -1
  97. package/dist/eas.d.ts.map +1 -1
  98. package/dist/events/files/download.d.ts.map +1 -1
  99. package/dist/events/item/syncDbWithEas.d.ts.map +1 -1
  100. package/dist/{getItem-BB5HBCbK.js → getItem-CqrJt-Ee.js} +2 -2
  101. package/dist/{getItem-BB5HBCbK.js.map → getItem-CqrJt-Ee.js.map} +1 -1
  102. package/dist/{getPublishPayload-uLm0AqN_.js → getPublishPayload-BRgULCf3.js} +7 -5
  103. package/dist/getPublishPayload-BRgULCf3.js.map +1 -0
  104. package/dist/{getPublishUploads-Dc-HqhO8.js → getPublishUploads-B0WArDfp.js} +3 -3
  105. package/dist/{getPublishUploads-Dc-HqhO8.js.map → getPublishUploads-B0WArDfp.js.map} +1 -1
  106. package/dist/{getSegmentedItemProperties-BrIqFNfD.js → getSegmentedItemProperties-DZL9Ymd4.js} +2 -2
  107. package/dist/{getSegmentedItemProperties-BrIqFNfD.js.map → getSegmentedItemProperties-DZL9Ymd4.js.map} +1 -1
  108. package/dist/helpers/addresses.d.ts +12 -0
  109. package/dist/helpers/addresses.d.ts.map +1 -0
  110. package/dist/helpers/db.d.ts +11 -0
  111. package/dist/helpers/db.d.ts.map +1 -1
  112. package/dist/helpers/ownership.d.ts +16 -0
  113. package/dist/helpers/ownership.d.ts.map +1 -0
  114. package/dist/helpers/property.d.ts.map +1 -1
  115. package/dist/helpers/updateSchema.d.ts.map +1 -1
  116. package/dist/imports/json.d.ts.map +1 -1
  117. package/dist/{index-2FcQHgKp.js → index-BIPPEMVY.js} +2 -2
  118. package/dist/index-BIPPEMVY.js.map +1 -0
  119. package/dist/{index-LEY0Og1p.js → index-BnF3MRZ8.js} +3 -3
  120. package/dist/index-BnF3MRZ8.js.map +1 -0
  121. package/dist/{index-DPll6EAp.js → index-zsq08F5p.js} +644 -154
  122. package/dist/index-zsq08F5p.js.map +1 -0
  123. package/dist/main.cjs +1 -1
  124. package/dist/main.js +20 -14
  125. package/dist/main.js.map +1 -1
  126. package/dist/node/db/Db.d.ts.map +1 -1
  127. package/dist/node.js +10 -10
  128. package/dist/ownership-CSsweVap.js +85 -0
  129. package/dist/ownership-CSsweVap.js.map +1 -0
  130. package/dist/{property-B15X7jLX.js → property-Cqh_o0zx.js} +10 -4
  131. package/dist/property-Cqh_o0zx.js.map +1 -0
  132. package/dist/{queries-BPDSpiEX.js → queries-DSBgjcJJ.js} +2 -2
  133. package/dist/{queries-BPDSpiEX.js.map → queries-DSBgjcJJ.js.map} +1 -1
  134. package/dist/seedSchema/ModelSchemaSchema.d.ts +1 -1
  135. package/dist/seedSchema/ModelSchemaSchema.ts +4 -4
  136. package/dist/seedSchema/ModelUidSchema.ts +1 -1
  137. package/dist/seedSchema/PropertyUidSchema.ts +1 -1
  138. package/dist/seedSchema/SeedSchema.d.ts +19 -0
  139. package/dist/seedSchema/SeedSchema.d.ts.map +1 -1
  140. package/dist/seedSchema/SeedSchema.ts +1 -0
  141. package/dist/seedSchema/index.d.ts +10 -10
  142. package/dist/seedSchema/index.d.ts.map +1 -1
  143. package/dist/seedSchema/index.ts +10 -10
  144. package/dist/services/publish/actors/preparePublishRequestData.d.ts.map +1 -1
  145. package/dist/services/publish/actors/upload.d.ts.map +1 -1
  146. package/dist/services/write/actors/validateEntity.d.ts.map +1 -1
  147. package/dist/types/index.d.ts +11 -1
  148. package/dist/types/index.d.ts.map +1 -1
  149. package/dist/types/item.d.ts +1 -0
  150. package/dist/types/item.d.ts.map +1 -1
  151. package/dist/types/machines.d.ts +2 -0
  152. package/dist/types/machines.d.ts.map +1 -1
  153. package/package.json +4 -11
  154. package/dist/Db-DjFdIdR9.js.map +0 -1
  155. package/dist/Db-DjofXdeU.js.map +0 -1
  156. package/dist/FileManager-C9zr4AJe.js.map +0 -1
  157. package/dist/ModelProperty-CGdkocQ8.js.map +0 -1
  158. package/dist/Schema-D1eqDHyt.js.map +0 -1
  159. package/dist/cjs/ModelProperty-BeJvgKMw.js.map +0 -1
  160. package/dist/cjs/Schema-CVs9J6eP.js.map +0 -1
  161. package/dist/cjs/getPublishPayload-BD1qRob1.js.map +0 -1
  162. package/dist/cjs/index-BeKPbbk0.js.map +0 -1
  163. package/dist/cjs/index-Dnywap_P.js.map +0 -1
  164. package/dist/getPublishPayload-uLm0AqN_.js.map +0 -1
  165. package/dist/index-2FcQHgKp.js.map +0 -1
  166. package/dist/index-DPll6EAp.js.map +0 -1
  167. package/dist/index-LEY0Og1p.js.map +0 -1
  168. package/dist/property-B15X7jLX.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seedprotocol/sdk",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "description": "The SDK for Seed Protocol",
5
5
  "type": "module",
6
6
  "main": "./dist/main.cjs",
@@ -29,8 +29,8 @@
29
29
  "test:watch": "vitest",
30
30
  "compile": "graphql-codegen --config codegen.ts",
31
31
  "watch": "graphql-codegen -w",
32
- "build:dev": "node scripts/build-with-tests.js \"rm -rf dist && NODE_ENV=production rollup -c && node scripts/check-dist-no-alias.js && tsc -p tsconfig.declarations.json\"",
33
- "build:publish": "node scripts/build-with-tests.js \"bun run sync-versions && rm -rf dist && NODE_ENV=production rollup -c && node scripts/check-dist-no-alias.js && tsc -p tsconfig.declarations.json && npm publish --access public\"",
32
+ "build:dev": "node scripts/build-with-tests.js \"rm -rf dist && NODE_ENV=production rollup -c && node scripts/check-dist-no-alias.js && node scripts/check-dist-fragile-dynamic-imports.js --fail && tsc -p tsconfig.declarations.json\"",
33
+ "build:publish": "node scripts/build-with-tests.js \"bun run sync-versions && rm -rf dist && NODE_ENV=production rollup -c && node scripts/check-dist-no-alias.js && node scripts/check-dist-fragile-dynamic-imports.js --fail && tsc -p tsconfig.declarations.json && npm publish --access public\"",
34
34
  "build:cli": "node scripts/build-with-tests.js \"cd packages/cli && bun run build\"",
35
35
  "build:all": "node scripts/build-with-tests.js \"bun run sync-versions && bun run build && bun run build:cli\"",
36
36
  "sync-versions": "node scripts/sync-versions.js",
@@ -62,12 +62,10 @@
62
62
  "@grpc/proto-loader": "^0.8.0",
63
63
  "@libsql/client": "^0.15.15",
64
64
  "@misskey-dev/browser-image-resizer": "^2024.1.0",
65
- "@pianity/arsnap-adapter": "^0.2.0",
66
65
  "@sinclair/typebox": "^0.34.45",
67
66
  "@sqlite.org/sqlite-wasm": "^3.51.1-build2",
68
67
  "@statelyai/inspect": "^0.4.0",
69
68
  "@tanstack/query-sync-storage-persister": "^5.90.17",
70
- "@tanstack/react-query-devtools": "^5.91.2",
71
69
  "@tanstack/react-query-persist-client": "^5.90.17",
72
70
  "@xstate/react": "^6.0.0",
73
71
  "arweave": "^1.15.5",
@@ -96,7 +94,6 @@
96
94
  "rimraf": "^6.0.1",
97
95
  "rxjs": "^7.8.1",
98
96
  "sqlocal": "^0.16.0",
99
- "threads": "^1.7.0",
100
97
  "ts-import": "5.0.0-beta.1",
101
98
  "ts-morph": "^27.0.2",
102
99
  "ts-proto": "^2.6.0",
@@ -137,7 +134,6 @@
137
134
  "@types/js-yaml": "^4.0.9",
138
135
  "@types/lodash": "^4.17.13",
139
136
  "@types/lodash-es": "^4.17.12",
140
- "@types/mock-fs": "^4.13.4",
141
137
  "@types/nanoid-dictionary": "^4.2.3",
142
138
  "@types/node": "^24.10.1",
143
139
  "@types/nunjucks": "^3.2.6",
@@ -156,11 +152,10 @@
156
152
  "eslint-config-prettier": "^10.1.8",
157
153
  "express": "^5.2.1",
158
154
  "jsdom": "^27.1.0",
159
- "mock-fs": "^5.4.1",
155
+ "magic-string": "^0.30.21",
160
156
  "playwright": "^1.57.0",
161
157
  "postcss": "^8.4.49",
162
158
  "prettier": "^3.7.3",
163
- "prettier-eslint": "^16.3.0",
164
159
  "prettier-plugin-organize-imports": "^4.1.0",
165
160
  "react": "^19.0.0",
166
161
  "react-dom": "^19.0.0",
@@ -174,7 +169,6 @@
174
169
  "rollup-plugin-strip-shebang": "^2.0.0",
175
170
  "rollup-plugin-tsconfig-paths": "^1.5.2",
176
171
  "rollup-plugin-web-worker-loader": "^1.6.1",
177
- "supports-color": "^10.0.0",
178
172
  "ts-api-utils": "~2.1.0",
179
173
  "tsconfig-paths": "^4.2.0",
180
174
  "tsx": "^4.21.0",
@@ -182,7 +176,6 @@
182
176
  "typia": "^10.0.0",
183
177
  "vite": "^7.3.0",
184
178
  "vite-plugin-inspect": "^11.3.3",
185
- "vite-plugin-static-copy": "^3.1.4",
186
179
  "vite-tsconfig-paths": "^6.0.3",
187
180
  "vitest": "^4.0.16",
188
181
  "vitest-browser-react": "^2.0.2"
@@ -1 +0,0 @@
1
- {"version":3,"file":"Db-DjFdIdR9.js","sources":["../src/browser/db/drizzleFiles.ts","../src/browser/db/Db.ts"],"sourcesContent":["// This file embeds the drizzle migration files as strings for browser runtime\n// These files are copied from src/db/drizzle at build time\n\n// Individual migration SQL files\nexport const migrationSql_0000_married_malice = `CREATE TABLE \\`appState\\` (\n\t\\`key\\` text,\n\t\\`value\\` text,\n\t\\`created_at\\` integer,\n\t\\`updated_at\\` integer\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX \\`appState_key_unique\\` ON \\`appState\\` (\\`key\\`);--> statement-breakpoint\nCREATE TABLE \\`config\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`key\\` text NOT NULL,\n\t\\`text\\` text,\n\t\\`json\\` text,\n\t\\`blob\\` blob\n);\n--> statement-breakpoint\nCREATE TABLE \\`metadata\\` (\n\t\\`local_id\\` text,\n\t\\`uid\\` text,\n\t\\`property_name\\` text,\n\t\\`property_value\\` text,\n\t\\`schema_uid\\` text,\n\t\\`model_type\\` text,\n\t\\`seed_local_id\\` text,\n\t\\`seed_uid\\` text,\n\t\\`version_local_id\\` text,\n\t\\`version_uid\\` text,\n\t\\`eas_data_type\\` text,\n\t\\`ref_value_type\\` text,\n\t\\`ref_schema_uid\\` text,\n\t\\`ref_seed_type\\` text,\n\t\\`ref_resolved_value\\` text,\n\t\\`ref_resolved_display_value\\` text,\n\t\\`local_storage_dir\\` text,\n\t\\`attestation_raw\\` text,\n\t\\`attestation_created_at\\` integer,\n\t\\`content_hash\\` text,\n\t\\`created_at\\` integer,\n\t\\`updated_at\\` integer\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX \\`metadata_local_id_unique\\` ON \\`metadata\\` (\\`local_id\\`);--> statement-breakpoint\nCREATE TABLE \\`models\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`name\\` text NOT NULL,\n\t\\`schema_file_id\\` text\n);\n--> statement-breakpoint\nCREATE TABLE \\`properties\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`name\\` text NOT NULL,\n\t\\`data_type\\` text NOT NULL,\n\t\\`model_id\\` integer NOT NULL,\n\t\\`ref_model_id\\` integer,\n\t\\`ref_value_type\\` text,\n\t\\`schema_file_id\\` text,\n\tFOREIGN KEY (\\`model_id\\`) REFERENCES \\`models\\`(\\`id\\`) ON UPDATE no action ON DELETE no action,\n\tFOREIGN KEY (\\`ref_model_id\\`) REFERENCES \\`models\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX \\`unique_name_model_id\\` ON \\`properties\\` (\\`name\\`,\\`model_id\\`);--> statement-breakpoint\nCREATE TABLE \\`model_schemas\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`model_id\\` integer,\n\t\\`schema_id\\` integer,\n\tFOREIGN KEY (\\`model_id\\`) REFERENCES \\`models\\`(\\`id\\`) ON UPDATE no action ON DELETE no action,\n\tFOREIGN KEY (\\`schema_id\\`) REFERENCES \\`schemas\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);\n--> statement-breakpoint\nCREATE TABLE \\`model_uids\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`uid\\` text NOT NULL,\n\t\\`model_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`model_id\\`) REFERENCES \\`models\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX \\`model_uids_model_id_unique\\` ON \\`model_uids\\` (\\`model_id\\`);--> statement-breakpoint\nCREATE TABLE \\`property_uids\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`uid\\` text NOT NULL,\n\t\\`property_id\\` integer NOT NULL,\n\tFOREIGN KEY (\\`property_id\\`) REFERENCES \\`models\\`(\\`id\\`) ON UPDATE no action ON DELETE no action\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX \\`property_uids_property_id_unique\\` ON \\`property_uids\\` (\\`property_id\\`);--> statement-breakpoint\nCREATE TABLE \\`schemas\\` (\n\t\\`id\\` integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n\t\\`name\\` text NOT NULL,\n\t\\`version\\` integer NOT NULL,\n\t\\`schema_file_id\\` text,\n\t\\`created_at\\` integer,\n\t\\`updated_at\\` integer\n);\n--> statement-breakpoint\nCREATE TABLE \\`seeds\\` (\n\t\\`local_id\\` text,\n\t\\`uid\\` text,\n\t\\`schema_uid\\` text,\n\t\\`type\\` text,\n\t\\`attestation_raw\\` text,\n\t\\`attestation_created_at\\` integer,\n\t\\`created_at\\` integer,\n\t\\`updated_at\\` integer,\n\t\\`_marked_for_deletion\\` integer\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX \\`seeds_local_id_unique\\` ON \\`seeds\\` (\\`local_id\\`);--> statement-breakpoint\nCREATE TABLE \\`versions\\` (\n\t\\`local_id\\` text,\n\t\\`uid\\` text,\n\t\\`seed_local_id\\` text,\n\t\\`seed_uid\\` text,\n\t\\`seed_type\\` text,\n\t\\`note\\` text,\n\t\\`created_at\\` integer,\n\t\\`updated_at\\` integer,\n\t\\`attestation_created_at\\` integer,\n\t\\`attestation_raw\\` text\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX \\`versions_local_id_unique\\` ON \\`versions\\` (\\`local_id\\`);`\n\nexport const migrationSql_0001_sweet_bruce_banner = `ALTER TABLE \\`schemas\\` ADD \\`schema_data\\` text;--> statement-breakpoint\nALTER TABLE \\`schemas\\` ADD \\`is_draft\\` integer;`\n\nexport const migrationSql_0002_bitter_proudstar = `CREATE UNIQUE INDEX \\`unique_schema_file_id\\` ON \\`models\\` (\\`schema_file_id\\`);--> statement-breakpoint\nCREATE UNIQUE INDEX \\`unique_property_schema_file_id\\` ON \\`properties\\` (\\`schema_file_id\\`);--> statement-breakpoint\nCREATE UNIQUE INDEX \\`unique_schema_schema_file_id\\` ON \\`schemas\\` (\\`schema_file_id\\`);`\n\nexport const migrationSql_0003_cultured_senator_kelly = `ALTER TABLE \\`models\\` ADD \\`is_edited\\` integer;--> statement-breakpoint\nALTER TABLE \\`properties\\` ADD \\`is_edited\\` integer;--> statement-breakpoint\nALTER TABLE \\`schemas\\` ADD \\`is_edited\\` integer;`\n\n// Journal JSON file\nexport const journalJson = `{\n \"version\": \"7\",\n \"dialect\": \"sqlite\",\n \"entries\": [\n {\n \"idx\": 0,\n \"version\": \"6\",\n \"when\": 1765976502903,\n \"tag\": \"0000_married_malice\",\n \"breakpoints\": true\n },\n {\n \"idx\": 1,\n \"version\": \"6\",\n \"when\": 1766010851770,\n \"tag\": \"0001_sweet_bruce_banner\",\n \"breakpoints\": true\n },\n {\n \"idx\": 2,\n \"version\": \"6\",\n \"when\": 1767621120087,\n \"tag\": \"0002_bitter_proudstar\",\n \"breakpoints\": true\n },\n {\n \"idx\": 3,\n \"version\": \"6\",\n \"when\": 1768415440282,\n \"tag\": \"0003_cultured_senator_kelly\",\n \"breakpoints\": true\n }\n ]\n}`\n\n// Snapshot JSON file - this is large, so we'll import it dynamically if needed\n// For now, we'll read it from the actual file if ?raw works, otherwise we'll need to embed it\nexport const snapshotJson = `{\n \"version\": \"6\",\n \"dialect\": \"sqlite\",\n \"id\": \"0e6a6a99-2eb1-4b1d-815b-3d45dcae04a1\",\n \"prevId\": \"49b9a020-1b1c-4107-85ee-a5f8a958f1a2\",\n \"tables\": {\n \"appState\": {\n \"name\": \"appState\",\n \"columns\": {\n \"key\": {\n \"name\": \"key\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"value\": {\n \"name\": \"value\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"created_at\": {\n \"name\": \"created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"updated_at\": {\n \"name\": \"updated_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"appState_key_unique\": {\n \"name\": \"appState_key_unique\",\n \"columns\": [\n \"key\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {},\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"config\": {\n \"name\": \"config\",\n \"columns\": {\n \"id\": {\n \"name\": \"id\",\n \"type\": \"integer\",\n \"primaryKey\": true,\n \"notNull\": true,\n \"autoincrement\": true\n },\n \"key\": {\n \"name\": \"key\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"text\": {\n \"name\": \"text\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"json\": {\n \"name\": \"json\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"blob\": {\n \"name\": \"blob\",\n \"type\": \"blob\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {},\n \"foreignKeys\": {},\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"metadata\": {\n \"name\": \"metadata\",\n \"columns\": {\n \"local_id\": {\n \"name\": \"local_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"uid\": {\n \"name\": \"uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"property_name\": {\n \"name\": \"property_name\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"property_value\": {\n \"name\": \"property_value\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"schema_uid\": {\n \"name\": \"schema_uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"model_type\": {\n \"name\": \"model_type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"seed_local_id\": {\n \"name\": \"seed_local_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"seed_uid\": {\n \"name\": \"seed_uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"version_local_id\": {\n \"name\": \"version_local_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"version_uid\": {\n \"name\": \"version_uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"eas_data_type\": {\n \"name\": \"eas_data_type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"ref_value_type\": {\n \"name\": \"ref_value_type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"ref_schema_uid\": {\n \"name\": \"ref_schema_uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"ref_seed_type\": {\n \"name\": \"ref_seed_type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"ref_resolved_value\": {\n \"name\": \"ref_resolved_value\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"ref_resolved_display_value\": {\n \"name\": \"ref_resolved_display_value\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"local_storage_dir\": {\n \"name\": \"local_storage_dir\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"attestation_raw\": {\n \"name\": \"attestation_raw\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"attestation_created_at\": {\n \"name\": \"attestation_created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"content_hash\": {\n \"name\": \"content_hash\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"created_at\": {\n \"name\": \"created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"updated_at\": {\n \"name\": \"updated_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"metadata_local_id_unique\": {\n \"name\": \"metadata_local_id_unique\",\n \"columns\": [\n \"local_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {},\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"models\": {\n \"name\": \"models\",\n \"columns\": {\n \"id\": {\n \"name\": \"id\",\n \"type\": \"integer\",\n \"primaryKey\": true,\n \"notNull\": true,\n \"autoincrement\": true\n },\n \"name\": {\n \"name\": \"name\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"schema_file_id\": {\n \"name\": \"schema_file_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"is_edited\": {\n \"name\": \"is_edited\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"unique_schema_file_id\": {\n \"name\": \"unique_schema_file_id\",\n \"columns\": [\n \"schema_file_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {},\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"properties\": {\n \"name\": \"properties\",\n \"columns\": {\n \"id\": {\n \"name\": \"id\",\n \"type\": \"integer\",\n \"primaryKey\": true,\n \"notNull\": true,\n \"autoincrement\": true\n },\n \"name\": {\n \"name\": \"name\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"data_type\": {\n \"name\": \"data_type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"model_id\": {\n \"name\": \"model_id\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"ref_model_id\": {\n \"name\": \"ref_model_id\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"ref_value_type\": {\n \"name\": \"ref_value_type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"schema_file_id\": {\n \"name\": \"schema_file_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"is_edited\": {\n \"name\": \"is_edited\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"unique_name_model_id\": {\n \"name\": \"unique_name_model_id\",\n \"columns\": [\n \"name\",\n \"model_id\"\n ],\n \"isUnique\": true\n },\n \"unique_property_schema_file_id\": {\n \"name\": \"unique_property_schema_file_id\",\n \"columns\": [\n \"schema_file_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {\n \"properties_model_id_models_id_fk\": {\n \"name\": \"properties_model_id_models_id_fk\",\n \"tableFrom\": \"properties\",\n \"tableTo\": \"models\",\n \"columnsFrom\": [\n \"model_id\"\n ],\n \"columnsTo\": [\n \"id\"\n ],\n \"onDelete\": \"no action\",\n \"onUpdate\": \"no action\"\n },\n \"properties_ref_model_id_models_id_fk\": {\n \"name\": \"properties_ref_model_id_models_id_fk\",\n \"tableFrom\": \"properties\",\n \"tableTo\": \"models\",\n \"columnsFrom\": [\n \"ref_model_id\"\n ],\n \"columnsTo\": [\n \"id\"\n ],\n \"onDelete\": \"no action\",\n \"onUpdate\": \"no action\"\n }\n },\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"model_schemas\": {\n \"name\": \"model_schemas\",\n \"columns\": {\n \"id\": {\n \"name\": \"id\",\n \"type\": \"integer\",\n \"primaryKey\": true,\n \"notNull\": true,\n \"autoincrement\": true\n },\n \"model_id\": {\n \"name\": \"model_id\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"schema_id\": {\n \"name\": \"schema_id\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {},\n \"foreignKeys\": {\n \"model_schemas_model_id_models_id_fk\": {\n \"name\": \"model_schemas_model_id_models_id_fk\",\n \"tableFrom\": \"model_schemas\",\n \"tableTo\": \"models\",\n \"columnsFrom\": [\n \"model_id\"\n ],\n \"columnsTo\": [\n \"id\"\n ],\n \"onDelete\": \"no action\",\n \"onUpdate\": \"no action\"\n },\n \"model_schemas_schema_id_schemas_id_fk\": {\n \"name\": \"model_schemas_schema_id_schemas_id_fk\",\n \"tableFrom\": \"model_schemas\",\n \"tableTo\": \"schemas\",\n \"columnsFrom\": [\n \"schema_id\"\n ],\n \"columnsTo\": [\n \"id\"\n ],\n \"onDelete\": \"no action\",\n \"onUpdate\": \"no action\"\n }\n },\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"model_uids\": {\n \"name\": \"model_uids\",\n \"columns\": {\n \"id\": {\n \"name\": \"id\",\n \"type\": \"integer\",\n \"primaryKey\": true,\n \"notNull\": true,\n \"autoincrement\": true\n },\n \"uid\": {\n \"name\": \"uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"model_id\": {\n \"name\": \"model_id\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"model_uids_model_id_unique\": {\n \"name\": \"model_uids_model_id_unique\",\n \"columns\": [\n \"model_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {\n \"model_uids_model_id_models_id_fk\": {\n \"name\": \"model_uids_model_id_models_id_fk\",\n \"tableFrom\": \"model_uids\",\n \"tableTo\": \"models\",\n \"columnsFrom\": [\n \"model_id\"\n ],\n \"columnsTo\": [\n \"id\"\n ],\n \"onDelete\": \"no action\",\n \"onUpdate\": \"no action\"\n }\n },\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"property_uids\": {\n \"name\": \"property_uids\",\n \"columns\": {\n \"id\": {\n \"name\": \"id\",\n \"type\": \"integer\",\n \"primaryKey\": true,\n \"notNull\": true,\n \"autoincrement\": true\n },\n \"uid\": {\n \"name\": \"uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"property_id\": {\n \"name\": \"property_id\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"property_uids_property_id_unique\": {\n \"name\": \"property_uids_property_id_unique\",\n \"columns\": [\n \"property_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {\n \"property_uids_property_id_models_id_fk\": {\n \"name\": \"property_uids_property_id_models_id_fk\",\n \"tableFrom\": \"property_uids\",\n \"tableTo\": \"models\",\n \"columnsFrom\": [\n \"property_id\"\n ],\n \"columnsTo\": [\n \"id\"\n ],\n \"onDelete\": \"no action\",\n \"onUpdate\": \"no action\"\n }\n },\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"schemas\": {\n \"name\": \"schemas\",\n \"columns\": {\n \"id\": {\n \"name\": \"id\",\n \"type\": \"integer\",\n \"primaryKey\": true,\n \"notNull\": true,\n \"autoincrement\": true\n },\n \"name\": {\n \"name\": \"name\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"version\": {\n \"name\": \"version\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": true,\n \"autoincrement\": false\n },\n \"schema_file_id\": {\n \"name\": \"schema_file_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"schema_data\": {\n \"name\": \"schema_data\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"is_draft\": {\n \"name\": \"is_draft\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"is_edited\": {\n \"name\": \"is_edited\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"created_at\": {\n \"name\": \"created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"updated_at\": {\n \"name\": \"updated_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"unique_schema_schema_file_id\": {\n \"name\": \"unique_schema_schema_file_id\",\n \"columns\": [\n \"schema_file_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {},\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"seeds\": {\n \"name\": \"seeds\",\n \"columns\": {\n \"local_id\": {\n \"name\": \"local_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"uid\": {\n \"name\": \"uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"schema_uid\": {\n \"name\": \"schema_uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"type\": {\n \"name\": \"type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"attestation_raw\": {\n \"name\": \"attestation_raw\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"attestation_created_at\": {\n \"name\": \"attestation_created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"created_at\": {\n \"name\": \"created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"updated_at\": {\n \"name\": \"updated_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"_marked_for_deletion\": {\n \"name\": \"_marked_for_deletion\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"seeds_local_id_unique\": {\n \"name\": \"seeds_local_id_unique\",\n \"columns\": [\n \"local_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {},\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n },\n \"versions\": {\n \"name\": \"versions\",\n \"columns\": {\n \"local_id\": {\n \"name\": \"local_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"uid\": {\n \"name\": \"uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"seed_local_id\": {\n \"name\": \"seed_local_id\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"seed_uid\": {\n \"name\": \"seed_uid\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"seed_type\": {\n \"name\": \"seed_type\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"note\": {\n \"name\": \"note\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"created_at\": {\n \"name\": \"created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"updated_at\": {\n \"name\": \"updated_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"attestation_created_at\": {\n \"name\": \"attestation_created_at\",\n \"type\": \"integer\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n },\n \"attestation_raw\": {\n \"name\": \"attestation_raw\",\n \"type\": \"text\",\n \"primaryKey\": false,\n \"notNull\": false,\n \"autoincrement\": false\n }\n },\n \"indexes\": {\n \"versions_local_id_unique\": {\n \"name\": \"versions_local_id_unique\",\n \"columns\": [\n \"local_id\"\n ],\n \"isUnique\": true\n }\n },\n \"foreignKeys\": {},\n \"compositePrimaryKeys\": {},\n \"uniqueConstraints\": {},\n \"checkConstraints\": {}\n }\n },\n \"views\": {},\n \"enums\": {},\n \"_meta\": {\n \"schemas\": {},\n \"tables\": {},\n \"columns\": {}\n },\n \"internal\": {\n \"indexes\": {}\n }\n}`\n","import { BaseDb } from \"@/db/Db/BaseDb\";\nimport { IDb } from \"@/interfaces/IDb\";\nimport debug from \"debug\";\nimport { sql } from \"drizzle-orm\";\nimport { readMigrationFiles } from \"drizzle-orm/migrator\";\nimport { drizzle, SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\nimport { migrate as drizzleMigrate } from \"drizzle-orm/sqlite-proxy/migrator\";\nimport { BROWSER_FS_TOP_DIR } from \"@/client/constants\";\nimport { BaseFileManager } from \"@/helpers\";\nimport * as schema from '@/seedSchema'\n// @ts-ignore - sqlocal/drizzle types may not be available during build\nimport { SQLocalDrizzle } from 'sqlocal/drizzle'\nimport {} from 'sqlocal'\nimport * as drizzleFiles from './drizzleFiles'\nimport { journalJson, snapshotJson } from './drizzleFiles'\nimport { Observable, distinctUntilChanged } from 'rxjs'\n\nconst logger = debug('seedSdk:browser:db:Db')\n\n\nclass Db extends BaseDb implements IDb {\n\n static sqliteWasmClient: any\n static filesDir: string | undefined\n static pathToDb: string | undefined\n static dbId: string | undefined\n static appDb: SqliteRemoteDatabase<Record<string, unknown>> | undefined\n static sqlocalInstance: SQLocalDrizzle | undefined\n\n constructor() {\n super()\n }\n\n static getAppDb() {\n return this.appDb\n }\n\n static isAppDbReady() {\n return !!this.appDb\n }\n\n static async prepareDb(filesDir: string) {\n\n logger('[Db.prepareDb] preparing database')\n\n this.filesDir = filesDir\n\n try {\n // Copy drizzle migration files from src/db/drizzle to filesDir/db\n await this.copyDrizzleFiles(filesDir)\n\n // Ensure meta directory exists\n const metaDirPath = `${filesDir}/db/meta`\n await BaseFileManager.createDirIfNotExists(metaDirPath)\n\n // Ensure _journal.json file exists in meta directory\n const journalFilePath = `${metaDirPath}/_journal.json`\n const journalExists = await BaseFileManager.pathExists(journalFilePath)\n if (!journalExists) {\n await BaseFileManager.saveFile(journalFilePath, JSON.stringify({\n version: 1,\n dialect: 'sqlite',\n entries: [],\n }, null, 2))\n }\n\n // Wait for journal file to be fully written before proceeding with migration\n // This is critical in browser/OPFS where writes may not be immediately readable\n logger('[Db.prepareDb] waiting for journal file to be fully written...')\n await BaseFileManager.waitForFileWithContent(journalFilePath, 100, 5000)\n logger('[Db.prepareDb] journal file is ready')\n\n // Initialize SQLocalDrizzle with reactive: true to enable reactive queries\n const sqlocalDrizzle = new SQLocalDrizzle({\n databasePath: `${this.filesDir}/db/seed.db`,\n reactive: true // Enable reactive queries\n })\n \n const { driver, batchDriver } = sqlocalDrizzle\n \n // Store SQLocalDrizzle instance for reactive queries\n this.sqlocalInstance = sqlocalDrizzle\n\n this.appDb = drizzle(\n driver, \n batchDriver, \n { \n schema, \n })\n\n logger('[Db.prepareDb] database prepared')\n\n await this.migrate()\n\n return this.appDb\n } catch (error) {\n logger('[Db.prepareDb] error', JSON.stringify(error))\n throw error\n }\n }\n\n // static async prepareDb(filesDir: string) {\n // console.log('prepareDb', filesDir)\n // if (Db.sqliteWasmClient) {\n // return this.dbId\n // }\n\n // this.filesDir = filesDir\n // this.pathToDb = `${filesDir}/db/${DB_NAME_APP}.db`\n\n // if (typeof document === 'undefined') {\n // return\n // }\n\n // let promiser\n\n // try {\n\n // let sqlite3Worker1Promiser\n\n // const sqliteWasm = await import('@sqlite.org/sqlite-wasm')\n\n // if (sqliteWasm && sqliteWasm.sqlite3Worker1Promiser) {\n // sqlite3Worker1Promiser = sqliteWasm.sqlite3Worker1Promiser\n // }\n\n // if (!sqlite3Worker1Promiser && window.sqlite3Worker1Promiser) {\n // sqlite3Worker1Promiser = window.sqlite3Worker1Promiser\n // }\n\n // if (!sqlite3Worker1Promiser) {\n // throw new Error('Failed to load sqlite3Worker1Promiser')\n // }\n\n // promiser = await new Promise<(event: string, config: Record<string, unknown>) => Promise<any>>((resolve) => {\n // const _promiser = sqlite3Worker1Promiser({\n // onready: () => {\n // resolve(_promiser);\n // },\n // });\n // }).catch((error) => {\n // console.error('Error from sqlite proxy server: ', JSON.stringify(error))\n // });\n\n // } catch ( e ) {\n // console.error('Error from sqlite proxy server: ', JSON.stringify(e))\n // }\n\n\n // if (!promiser) {\n // throw new Error('Failed to create promiser')\n // }\n\n // this.sqliteWasmClient = promiser\n\n // const responseGet = await this.sqliteWasmClient('config-get', {});\n\n // logger('[Db.prepareDb] Running SQLite3 version', responseGet.result.version.libVersion);\n\n // const responseOpen = await this.sqliteWasmClient('open', {\n // filename: `file:${filesDir}/db/${DB_NAME_APP}.db?vfs=opfs`,\n // });\n // const { dbId } = responseOpen;\n // logger(\n // '[Db.prepareDb] OPFS is available, created persisted database at',\n // responseOpen.result.filename.replace(/^file:(.*?)\\?vfs=opfs/, '$1'),\n // );\n\n // logger('[Db.prepareDb] dbId', dbId)\n \n // this.dbId = dbId\n \n // await this.migrate()\n // }\n\n static async connectToDb(filesDir: string,): Promise<string | undefined> {\n\n\n\n return this.dbId\n }\n\n static async copyDrizzleFiles(filesDir: string): Promise<void> {\n logger('[Db.copyDrizzleFiles] copying drizzle migration files')\n\n try {\n // Ensure db directory exists\n const dbDirPath = `${filesDir}/db`\n await BaseFileManager.createDirIfNotExists(dbDirPath)\n\n // Ensure meta directory exists\n const metaDirPath = `${dbDirPath}/meta`\n await BaseFileManager.createDirIfNotExists(metaDirPath)\n\n // Parse journal JSON to get all migration entries\n const journal = JSON.parse(journalJson)\n const entries = journal.entries || []\n\n if (entries.length === 0) {\n logger('[Db.copyDrizzleFiles] no migration entries found in journal')\n return\n }\n\n // Copy each migration SQL file (always overwrite to ensure they're up-to-date)\n // Each migration is exported as a separate variable (e.g., migrationSql_0000_married_malice)\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i]\n const tag = entry.tag // e.g., \"0000_married_malice\"\n const migrationFileName = `${tag}.sql`\n const migrationPath = `${dbDirPath}/${migrationFileName}`\n \n // Get the SQL for this migration from the exported variable\n const migrationVarName = `migrationSql_${tag}` as keyof typeof drizzleFiles\n const migrationContent = drizzleFiles[migrationVarName] as string | undefined\n \n if (!migrationContent) {\n logger(`[Db.copyDrizzleFiles] ERROR: No migration content found for ${migrationFileName} (variable: ${migrationVarName})`)\n throw new Error(`No migration content found for ${migrationFileName}. Expected variable: ${migrationVarName}`)\n }\n \n await BaseFileManager.saveFile(migrationPath, migrationContent.trim())\n logger(`[Db.copyDrizzleFiles] copied/updated migration SQL file: ${migrationFileName}`)\n }\n\n // Copy journal JSON file (always overwrite to ensure it's up-to-date with all migrations)\n const journalPath = `${metaDirPath}/_journal.json`\n await BaseFileManager.saveFile(journalPath, journalJson)\n logger('[Db.copyDrizzleFiles] copied/updated journal JSON file')\n\n // Copy snapshot JSON file (use the latest snapshot based on the highest idx in journal)\n // Snapshot files are named like: 0000_snapshot.json, 0001_snapshot.json, etc.\n // The tag format is like \"0000_married_malice\", so we extract the numeric prefix\n const latestEntry = entries[entries.length - 1]\n const tagPrefixMatch = latestEntry.tag.match(/^(\\d+_)/)\n const tagPrefix = tagPrefixMatch ? tagPrefixMatch[1] : '0000_'\n const snapshotFileName = `${tagPrefix}snapshot.json`\n const snapshotPath = `${metaDirPath}/${snapshotFileName}`\n // Always overwrite snapshot to ensure it's up-to-date\n await BaseFileManager.saveFile(snapshotPath, snapshotJson)\n logger(`[Db.copyDrizzleFiles] copied/updated snapshot JSON file: ${snapshotFileName}`)\n\n logger('[Db.copyDrizzleFiles] drizzle files copied successfully')\n } catch (error) {\n logger('[Db.copyDrizzleFiles] error copying drizzle files', error)\n // Don't throw - the files might already exist or migration might work without them\n // The migration will fail later if the files are truly needed\n }\n }\n\n static async migrate(): Promise<void> {\n\n if (!this.appDb) {\n throw new Error('Database not prepared')\n }\n\n const pathToDbDir = `${this.filesDir}/db`\n\n try {\n\n logger('[Db.migrate] calling readMigrationFiles')\n \n const migrations = readMigrationFiles({\n migrationsFolder: pathToDbDir,\n })\n\n logger('[Db.migrate] migrations', migrations)\n \n await drizzleMigrate(\n this.appDb,\n async (queriesToRun) => {\n logger('queriesToRun', queriesToRun)\n for (const query of queriesToRun) {\n logger('query', query)\n await this.appDb?.run(sql.raw(query))\n }\n },\n {\n migrationsFolder: pathToDbDir,\n },\n )\n\n logger('[Db.migrate] migrations completed')\n \n } catch (error) {\n logger('[Db.migrate] error', JSON.stringify(error))\n throw error\n }\n \n\n }\n\n // static async migrate(): Promise<void> {\n\n // const schemaGlobString = `${BROWSER_FS_TOP_DIR}/schema/*`\n // const pathToDbDir = `${this.filesDir}/db`\n // const dbName = DB_NAME_APP\n\n // logger('[Db.migrate] running migrations')\n\n // const drizzleDb = drizzle(\n // async (sql, params,) => {\n // try {\n // logger(\n // `executing sql`,\n // sql,\n // )\n\n // const finalResult = await this.exec(sql, params)\n\n // // logger(`finalResult with method: ${method}`, finalResult)\n // // Drizzle always waits for {rows: string[][]} or {rows: string[]} for the return value.\n\n // // When the method is get, you should return a value as {rows: string[]}.\n // // Otherwise, you should return {rows: string[][]}.\n\n // return { rows: finalResult }\n // } catch (e: any) {\n // console.error('Error from sqlite proxy server: ', JSON.stringify(e))\n // return { rows: [] }\n // }\n // },\n // {\n // schema,\n // // logger: true,\n // },\n // )\n\n // try {\n // const zenfs = await BaseFileManager.getFs()\n\n // logger('[Db.migrate] calling readMigrationFiles')\n\n // const migrations = readMigrationFiles({\n // migrationsFolder: pathToDbDir,\n // })\n\n // logger('[Db.migrate] migrations', migrations)\n\n // if (migrations.length > 0) {\n // const incomingMigrationHashes = migrations.map(\n // (migration) => migration.hash,\n // )\n\n // let existingMigrationHashes\n // let rows = []\n\n // try {\n\n // const queryMigrationsTable = await drizzleDb.run(\n // sql.raw(\n // `SELECT name \n // FROM sqlite_master \n // WHERE type='table' \n // AND name='__drizzle_migrations';`,\n // ),\n // )\n\n // logger('queryMigrationsTable', queryMigrationsTable)\n\n // if (queryMigrationsTable && queryMigrationsTable.rows && queryMigrationsTable.rows.length > 0) {\n // const query = await drizzleDb.run(\n // sql.raw(\n // `SELECT hash, created_at\n // FROM main.__drizzle_migrations;`,\n // ),\n // )\n \n // rows = query.rows\n // }\n\n // } catch (e) {\n // rows = []\n // }\n\n // if (rows && rows.length > 0) {\n // existingMigrationHashes = rows.map((row) => row[0])\n // }\n\n // if (existingMigrationHashes) {\n // let shouldRebuildDb = false\n // for (const existingHash of existingMigrationHashes) {\n // if (!incomingMigrationHashes.includes(existingHash)) {\n // shouldRebuildDb = true\n // break\n // }\n // }\n // if (shouldRebuildDb) {\n // await zenfs.promises.unlink(`${pathToDbDir}/${dbName}.db`)\n // }\n // }\n // }\n\n // logger('[Db.migrate] running migrations')\n\n // await drizzleMigrate(\n // drizzleDb,\n // async (queriesToRun) => {\n // // logger('queriesToRun', queriesToRun)\n // for (const query of queriesToRun) {\n // // logger('query', query)\n // await drizzleDb.run(sql.raw(query))\n // }\n // },\n // {\n // migrationsFolder: pathToDbDir,\n // },\n // )\n // } catch (error) {\n // logger('[Db.migrate] error', JSON.stringify(error))\n // // await BaseFileManager.waitForFile(`${pathToDbDir}/meta/_journal.json`)\n\n // // const journalExists = await BaseFileManager.pathExists(\n // // `${pathToDbDir}/meta/_journal.json`,\n // // )\n\n // // if (journalExists) {\n // // await this.migrate(pathToDbDir, dbName,)\n // // }\n\n // // if (!journalExists) {\n // // throw new Error('Failed to migrate database')\n // // }\n\n\n // }\n\n // this.appDb = drizzleDb\n\n // // Old code for migrating the database\n // // const createTempTableQuery = await appDb.run(\n // // sql.raw(\n // // `CREATE TEMP TABLE IF NOT EXISTS temp_last_inserted_id (id INTEGER, table TEXT);`,\n // // ),\n // // )\n // //\n // // logger(\n // // '[db/actors] [migrate] createTempTableQuery',\n // // createTempTableQuery,\n // // )\n\n // // const triggersQuery = await appDb.run(\n // // sql.raw(\n // // `SELECT name\n // // FROM main.sqlite_master\n // // WHERE type = 'trigger';`,\n // // ),\n // // )\n // //\n // // logger('[db/actors] [migrate] triggersQuery', triggersQuery)\n // //\n // // const triggers = triggersQuery.rows.map((row) => row[0])\n // //\n // // const tablesQuery = await appDb.run(\n // // sql.raw(\n // // `SELECT name\n // // FROM main.sqlite_master\n // // WHERE type = 'table';`,\n // // ),\n // // )\n // //\n // // logger('[db/actors] [migrate] tablesQuery', tablesQuery)\n // //\n // // const tableNames = tablesQuery.rows.map((row) => row[0])\n // // logger('[db/actors] [migrate] tableNames', tableNames)\n // // for (const tableName of tableNames) {\n // // const triggerName = `after_insert_${tableName}`\n // // if (triggers.includes(triggerName)) {\n // // continue\n // // }\n // // const createTriggerQuery = await appDb.run(\n // // sql.raw(\n // // `CREATE TRIGGER after_insert_${tableName}\n // // AFTER INSERT ON ${tableName}\n // // BEGIN\n // // DELETE FROM temp_last_inserted_id;\n // // INSERT INTO temp_last_inserted_id (id) VALUES (new.id);\n // // END;`,\n // // ),\n // // )\n // //\n // // logger(\n // // '[db/actors] [migrate] createTriggerQuery',\n // // createTriggerQuery,\n // // )\n // // }\n // }\n\n // static async exec(sql: string, params: any[]) {\n // const rowsToReturnRaw: SqliteWasmResult[] = []\n // const rowsValues: string[][] = []\n \n // // For a single exec command, the callback potentially gets called several times -- once for each row.\n // // So we need to collect all rows into a final array to return (execResult).\n // const rowsToReturn = await new Promise((resolve, reject) => {\n\n\n // this.sqliteWasmClient('exec', {\n // dbId:this.dbId,\n // sql,\n // bind: params,\n // callback: (result) => {\n // // Checks if this is the final callback of the query\n // if (!result || !result.row || !result.rowNumber) {\n // const returnResult = []\n // for (const currRow of rowsToReturnRaw) {\n // returnResult.push(currRow.row)\n // }\n // resolve(returnResult)\n // } else {\n // // If not the final response, add this row to the return array\n // rowsToReturnRaw.push(result)\n // }\n // },\n // }).catch(async (error) => {\n // reject(error)\n // })\n // })\n \n // return rowsToReturn || []\n // }\n\n /**\n * Execute a reactive query that emits new results whenever the underlying data changes.\n * \n * Supports two usage patterns:\n * 1. SQL tag function: liveQuery((sql) => sql`SELECT * FROM models`)\n * 2. Drizzle query builder: liveQuery(db.select().from(models))\n * \n * @param query - SQL query function or Drizzle query builder\n * @returns Observable that emits arrays of query results\n * \n * @example\n * ```typescript\n * // Using SQL tag function\n * const models$ = Db.liveQuery<ModelRow>(\n * (sql) => sql`SELECT * FROM models WHERE schema_file_id = ${schemaId}`\n * )\n * \n * // Using Drizzle query builder\n * const models$ = Db.liveQuery<ModelRow>(\n * appDb.select().from(models).where(eq(models.schemaFileId, schemaId))\n * )\n * \n * models$.subscribe(models => {\n * console.log('Models updated:', models)\n * })\n * ```\n */\n static liveQuery<T>(\n query: ((sql: any) => any) | any\n ): Observable<T[]> {\n if (!this.sqlocalInstance) {\n throw new Error('Database not initialized. Call prepareDb first.')\n }\n \n if (!this.sqlocalInstance.reactiveQuery) {\n throw new Error('Reactive queries not enabled. Initialize SQLocalDrizzle with reactive: true.')\n }\n\n const baseObservable = new Observable<T[]>((subscriber) => {\n // Call SQLocal's reactiveQuery\n const reactiveQueryResult = this.sqlocalInstance!.reactiveQuery(query)\n \n // Subscribe to SQLocal's subscription API\n const subscription = reactiveQueryResult.subscribe(\n (data: Record<string, any>[]) => {\n // Emit data through RxJS Observable (cast to T[] since SQLocal returns Record<string, any>[])\n subscriber.next(data as T[])\n },\n (err: Error) => {\n console.error('[BaseDb.liveQuery] SQLocal reactiveQuery error:', err)\n // Emit error through RxJS Observable\n subscriber.error(err)\n }\n )\n \n // Cleanup: unsubscribe when Observable is unsubscribed\n return () => {\n subscription.unsubscribe()\n }\n })\n \n // Use distinctUntilChanged with JSON.stringify comparison\n // The comparator returns true if values are the same (skip emission)\n return baseObservable.pipe(\n distinctUntilChanged((prev, curr) => {\n // On first emission, prev will be undefined, so we always emit\n if (prev === undefined) {\n return false // false = different, so emit\n }\n \n // Compare using JSON.stringify\n try {\n const prevJson = JSON.stringify(prev)\n const currJson = JSON.stringify(curr)\n // Return true if same (skip), false if different (emit)\n return prevJson === currJson\n } catch (error) {\n // If JSON.stringify fails, fall back to reference equality\n console.warn('[BaseDb.liveQuery] distinctUntilChanged: JSON.stringify failed, using reference equality', error)\n return prev === curr\n }\n })\n )\n }\n}\n\nexport { Db }\n"],"names":["drizzleMigrate"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Db-DjofXdeU.js","sources":["../src/node/db/Db.ts"],"sourcesContent":["import { BaseDb } from \"@/db/Db/BaseDb\";\nimport { IDb } from \"@/interfaces\";\nimport path from \"path\";\nimport { DrizzleConfig, } from \"drizzle-orm\";\nimport debug from 'debug'\nimport { appState } from '@/seedSchema'\nimport fs from 'fs'\nimport { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport { pushSQLiteSchema } from 'drizzle-kit/api'\nimport * as schema from '@/seedSchema'\nimport { Observable, interval, switchMap, distinctUntilChanged, startWith } from 'rxjs'\n\nconst logger = debug('seedSdk:node:db:Db')\n\nexport interface DbConfig {\n dbUrl?: string\n schemaDir?: string\n outDir?: string\n}\n\nconst getConfig = async (dotSeedDir: string, config?: DbConfig) => {\n // Create config inline - config values can be passed in or use defaults\n const { defineConfig } = await import('drizzle-kit')\n const appSchemaDir = config?.schemaDir || path.join(dotSeedDir, 'schema')\n const outDir = config?.outDir || `${dotSeedDir}/db`\n const dbUrl = config?.dbUrl || `${dotSeedDir}/db/seed.db`\n\n const nodeDbConfig = defineConfig({\n schema: appSchemaDir,\n dialect: 'sqlite',\n out: outDir,\n dbCredentials: {\n url: dbUrl,\n }\n }) as DrizzleConfig & { dbCredentials: { url: string } }\n\n return nodeDbConfig\n}\n\nclass Db extends BaseDb implements IDb {\n static db: any\n\n constructor() {\n super()\n }\n\n static getAppDb() {\n return this.db\n }\n\n static isAppDbReady() {\n return true\n }\n\n static async prepareDb(filesDir: string, config?: DbConfig) {\n // Resolve and normalize the filesDir path\n const resolvedFilesDir = path.resolve(filesDir)\n \n // Ensure the filesDir exists first (parent directory)\n if (!fs.existsSync(resolvedFilesDir)) {\n fs.mkdirSync(resolvedFilesDir, { recursive: true })\n }\n \n const nodeDbConfig = await getConfig(resolvedFilesDir, config)\n const dbPath = nodeDbConfig.dbCredentials?.url || path.join(resolvedFilesDir, 'db', 'seed.db')\n\n // Ensure the database directory exists\n const dbDir = path.dirname(dbPath)\n const dbDirExists = fs.existsSync(dbDir)\n if (!dbDirExists) {\n fs.mkdirSync(dbDir, { recursive: true })\n }\n \n // Use the dbUrl from config if provided, otherwise construct from filesDir\n const dbUrl = config?.dbUrl \n ? (config.dbUrl.startsWith('file:') ? config.dbUrl : `file:${path.resolve(config.dbUrl)}`)\n : `file:${path.resolve(dbPath)}`\n const client = createClient({ url: dbUrl })\n \n const db = drizzle(client, {schema})\n \n const { apply, hasDataLoss, warnings, statementsToExecute } = await pushSQLiteSchema(schema, db);\n \n // You can inspect what will happen before applying\n await apply();\n\n this.db = db\n\n // OLD CODE: Resolve better-sqlite3 from project's node_modules first, then fall back to SDK's node_modules\n // This is important for tests and when the SDK is used as a dependency\n // const projectDir = path.dirname(filesDir) // filesDir is .seed, so projectDir is the project root\n // const projectBetterSqlite3Path = path.join(projectDir, 'node_modules', 'better-sqlite3')\n // \n // let Database: any\n // try {\n // const fs = await import('fs')\n // if (fs.existsSync(projectBetterSqlite3Path)) {\n // // Try to resolve from project's node_modules using the full path\n // // For Bun, we can try importing directly from the path\n // try {\n // // First try using createRequire (works in Node.js)\n // const { createRequire } = await import('module')\n // const projectRequire = createRequire(path.join(projectDir, 'package.json'))\n // const betterSqlite3Module = projectRequire('better-sqlite3')\n // Database = betterSqlite3Module.default || betterSqlite3Module\n // logger('[node/db/Db] Using better-sqlite3 from project node_modules via createRequire')\n // } catch (requireError: any) {\n // // If createRequire fails (e.g., in Bun), try direct path import\n // logger('[node/db/Db] createRequire failed, trying direct import:', requireError.message)\n // const betterSqlite3MainPath = path.join(projectBetterSqlite3Path, 'lib', 'database.js')\n // if (fs.existsSync(betterSqlite3MainPath)) {\n // // Use dynamic import with the full path\n // const betterSqlite3Module = await import(betterSqlite3MainPath)\n // Database = betterSqlite3Module.default || betterSqlite3Module.Database || betterSqlite3Module\n // logger('[node/db/Db] Using better-sqlite3 from project node_modules via direct import')\n // } else {\n // throw new Error(`better-sqlite3 main file not found at ${betterSqlite3MainPath}`)\n // }\n // }\n // } else {\n // // Fall back to regular import (from SDK's node_modules)\n // const betterSqlite3Module = await import('better-sqlite3')\n // Database = betterSqlite3Module.default || betterSqlite3Module\n // logger('[node/db/Db] Using better-sqlite3 from SDK node_modules')\n // }\n // } catch (importError: any) {\n // logger('[node/db/Db] Error importing better-sqlite3:', importError.message)\n // logger('[node/db/Db] projectDir:', projectDir)\n // logger('[node/db/Db] projectBetterSqlite3Path:', projectBetterSqlite3Path)\n // throw new Error(`Failed to import better-sqlite3: ${importError.message}. Please install better-sqlite3 in your project.`)\n // }\n\n // OLD CODE: Create Database instance\n // const sqlite = new Database(dbPath)\n // \n // OLD CODE: Create drizzle instance with the Database\n // const {drizzle} = await import('drizzle-orm/better-sqlite3')\n // this.db = drizzle(sqlite, {\n // logger: true,\n // })\n\n // // NEW CODE: Use libsql instead of better-sqlite3\n // // Resolve @libsql/client from project's node_modules first, then fall back to SDK's node_modules\n // const projectDir = path.dirname(filesDir) // filesDir is .seed, so projectDir is the project root\n // const projectLibsqlClientPath = path.join(projectDir, 'node_modules', '@libsql', 'client')\n \n // let createClient: any\n // try {\n // const fs = await import('fs')\n // if (fs.existsSync(projectLibsqlClientPath)) {\n // // Try to resolve from project's node_modules using the full path\n // try {\n // // First try using createRequire (works in Node.js)\n // const { createRequire } = await import('module')\n // const projectRequire = createRequire(path.join(projectDir, 'package.json'))\n // const libsqlClientModule = projectRequire('@libsql/client')\n // createClient = libsqlClientModule.createClient || libsqlClientModule.default?.createClient || libsqlClientModule.default\n // logger('[node/db/Db] Using @libsql/client from project node_modules via createRequire')\n // } catch (requireError: any) {\n // // If createRequire fails, try direct import\n // logger('[node/db/Db] createRequire failed, trying direct import:', requireError.message)\n // const libsqlClientModule = await import('@libsql/client')\n // createClient = libsqlClientModule.createClient\n // logger('[node/db/Db] Using @libsql/client from project node_modules via direct import')\n // }\n // } else {\n // // Fall back to regular import (from SDK's node_modules)\n // const libsqlClientModule = await import('@libsql/client')\n // createClient = libsqlClientModule.createClient\n // logger('[node/db/Db] Using @libsql/client from SDK node_modules')\n // }\n // } catch (importError: any) {\n // logger('[node/db/Db] Error importing @libsql/client:', importError.message)\n // logger('[node/db/Db] projectDir:', projectDir)\n // logger('[node/db/Db] projectLibsqlClientPath:', projectLibsqlClientPath)\n // throw new Error(`Failed to import @libsql/client: ${importError.message}. Please install @libsql/client in your project.`)\n // }\n\n // // Convert file path to file: URL for libsql\n // // If dbPath is already a file: URL, use it as is, otherwise convert it\n // const dbUrl = dbPath.startsWith('file:') ? dbPath : `file:${path.resolve(dbPath)}`\n \n // // Create libsql client instance\n // const client = createClient({ url: dbUrl })\n \n // // Create drizzle instance with the libsql client\n // const {drizzle} = await import('drizzle-orm/libsql')\n // this.db = drizzle(client, {\n // logger: true,\n // })\n\n // if (!this.db) {\n // throw new Error('Db not found')\n // }\n\n return this.db\n }\n\n static async connectToDb(pathToDir: string,) {\n\n return {\n id: this.db ? this.db.constructor.name : ''\n }\n }\n\n static async migrate(pathToDbDir: string, dbName: string, dbId: string) {\n const fs = await import('fs')\n const path = await import('path')\n \n // Ensure meta directory and _journal.json exist\n const metaDir = path.join(pathToDbDir, 'meta')\n const journalPath = path.join(metaDir, '_journal.json')\n \n try {\n if (!fs.existsSync(metaDir)) {\n fs.mkdirSync(metaDir, { recursive: true })\n }\n \n // Create a minimal _journal.json if it doesn't exist\n if (!fs.existsSync(journalPath)) {\n const minimalJournal = {\n version: \"7\",\n dialect: \"sqlite\",\n entries: []\n }\n fs.writeFileSync(journalPath, JSON.stringify(minimalJournal, null, 2))\n logger('Created minimal _journal.json file')\n } else {\n // Verify the journal file is valid JSON\n try {\n const journalContent = fs.readFileSync(journalPath, 'utf-8')\n const journal = JSON.parse(journalContent)\n if (!journal.dialect || !journal.version) {\n // Fix invalid journal\n const fixedJournal = {\n version: journal.version || \"7\",\n dialect: journal.dialect || \"sqlite\",\n entries: journal.entries || []\n }\n fs.writeFileSync(journalPath, JSON.stringify(fixedJournal, null, 2))\n logger('Fixed invalid _journal.json file')\n }\n } catch (parseError) {\n // If journal is invalid, recreate it\n const minimalJournal = {\n version: \"7\",\n dialect: \"sqlite\",\n entries: []\n }\n fs.writeFileSync(journalPath, JSON.stringify(minimalJournal, null, 2))\n logger('Recreated corrupted _journal.json file')\n }\n }\n } catch (error: any) {\n logger('Warning: Could not create meta/_journal.json:', error.message)\n // Continue anyway - the migrator might handle it\n }\n \n try {\n if (!this.db) {\n throw new Error('Database not initialized. Call prepareDb first.')\n }\n \n // OLD CODE: const {migrate} = await import('drizzle-orm/better-sqlite3/migrator')\n // migrationsFolder should point to the directory containing migration SQL files\n // In drizzle-kit, migrations are generated in the 'out' directory (which is pathToDbDir)\n // migrate(this.db, { migrationsFolder: pathToDbDir })\n \n // NEW CODE: Use libsql migrator\n const {migrate} = await import('drizzle-orm/libsql/migrator')\n // migrationsFolder should point to the directory containing migration SQL files\n // In drizzle-kit, migrations are generated in the 'out' directory (which is pathToDbDir)\n await migrate(this.db, { migrationsFolder: pathToDbDir })\n const queryResult = await this.db.select().from(appState)\n logger('queryResult', queryResult)\n } catch (error: any) {\n // Handle various migration errors gracefully in test environments\n const errorMessage = error.message || String(error) || ''\n const errorString = String(error)\n const isMigrationError = \n errorMessage.includes(\"Can't find meta/_journal.json\") || \n errorMessage.includes('_journal.json') ||\n errorMessage.includes(\"Cannot read properties of undefined\") ||\n errorMessage.includes(\"reading 'dialect'\") ||\n errorMessage.includes(\"undefined is not an object\") ||\n errorString.includes(\"dialect\") ||\n errorString.includes(\"undefined is not an object\")\n \n if (isMigrationError) {\n if (process.env.NODE_ENV === 'test' || process.env.IS_SEED_DEV) {\n logger('Warning: Migration failed, but continuing in test environment:', errorMessage || errorString)\n // Try to query the database anyway to see if it's usable\n try {\n if (this.db) {\n const queryResult = await this.db.select().from(appState)\n logger('Database is accessible despite migration error')\n return this.db\n }\n } catch (queryError) {\n logger('Database query also failed, but continuing in test environment')\n return this.db\n }\n }\n }\n throw error\n }\n\n return this.db\n }\n\n /**\n * Execute a reactive query that emits new results whenever the underlying data changes.\n * \n * NOTE: This is a stub implementation using polling. For production use, consider enhancing\n * with database triggers, change streams, or other real-time mechanisms.\n * \n * Currently supports Drizzle query builders. SQL tag functions are not supported in node\n * environment (use browser implementation for SQL tag functions).\n * \n * @param query - Drizzle query builder (SQL tag functions not supported in node)\n * @returns Observable that emits arrays of query results\n * \n * @example\n * ```typescript\n * import { models } from '@/seedSchema'\n * import { eq } from 'drizzle-orm'\n * \n * const appDb = Db.getAppDb()\n * const models$ = Db.liveQuery<ModelRow>(\n * appDb.select().from(models).where(eq(models.schemaFileId, schemaId))\n * )\n * \n * models$.subscribe(models => {\n * console.log('Models updated:', models)\n * })\n * ```\n */\n static liveQuery<T>(\n query: ((sql: any) => any) | any\n ): Observable<T[]> {\n if (!this.db) {\n throw new Error('Database not initialized. Call prepareDb first.')\n }\n \n // Polling interval (configurable, default: 1000ms)\n const pollInterval = 1000\n \n // Check if query is a function (SQL tag function) - not supported in node stub\n if (typeof query === 'function') {\n throw new Error('SQL tag functions are not supported in node liveQuery stub implementation. Use Drizzle query builders instead.')\n }\n \n // For Drizzle query builders, we need to execute them\n // Store the query builder for polling\n const queryBuilder = query\n \n return interval(pollInterval).pipe(\n startWith(0), // Execute immediately on subscription\n switchMap(async () => {\n try {\n // Execute the Drizzle query builder\n // Drizzle query builders return promises when executed\n const result = await Promise.resolve(queryBuilder)\n return result as T[]\n } catch (error) {\n logger('[Db.liveQuery] Error executing query:', error)\n throw error\n }\n }),\n distinctUntilChanged((prev, curr) => {\n // Only emit if results actually changed\n // Use JSON.stringify for deep comparison\n return JSON.stringify(prev) === JSON.stringify(curr)\n })\n )\n }\n}\n\nBaseDb.setPlatformClass(Db)\n\nexport { Db }\n"],"names":["fs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileManager-C9zr4AJe.js","sources":["../src/browser/workers/filesDownload.ts","../src/browser/workers/FileDownloader.ts","../src/browser/workers/imageResize.ts","../src/browser/workers/ImageResizer.ts","../src/browser/helpers/FileManager.ts"],"sourcesContent":["export default `(\n ${\n function () {\n\nconst identifyString = (str: string) => {\n try {\n JSON.parse(str)\n return 'json'\n } catch (e) {\n // Not JSON\n }\n\n if (!str) {\n return\n }\n\n if (str.trim().startsWith('<') && str.trim().endsWith('>')) {\n return 'html'\n }\n\n // Simple markdown checks (very naive)\n if (/^#{1,6}\\s|^-{3,}|\\*{3,}|^-{1,2}\\s|\\*\\s/.test(str)) {\n return 'markdown'\n }\n\n if (/^data:image\\/[a-zA-Z]+;base64,[A-Za-z0-9+/]+={0,2}$/.test(str)) {\n return 'base64'\n }\n\n // Default to plain text if unsure\n return 'text'\n}\n\nconst getMimeType = (base64: string) => {\n if (!base64) {\n return null\n }\n const result = base64.match(/^data:([a-zA-Z0-9]+\\/[a-zA-Z0-9-.+]+).*,/)\n\n if (result && result.length > 1) {\n return result[1]\n } else {\n return null // MIME type could not be determined\n }\n}\n\nconst getDataTypeFromString = (\n data: string,\n): 'imageBase64' | 'base64' | 'url' | null => {\n const nonImageBase64Regex =\n /^(?!data:image\\/(?:jpeg|png|gif|bmp|webp);base64,)[A-Za-z0-9+/=]+$/\n\n if (nonImageBase64Regex.test(data)) {\n return 'base64'\n }\n\n // Regular expression for base64 (simple version, checking for base64 format)\n const imageBase64Regex = /^data:image\\/[a-zA-Z]+;base64,[A-Za-z0-9+/]+={0,2}$/\n\n if (imageBase64Regex.test(data)) {\n return 'imageBase64'\n }\n\n // Regular expression for URL (simple version, checking for common URL format)\n const urlRegex =\n /^(http:\\/\\/www\\.|https:\\/\\/www\\.|http:\\/\\/|https:\\/\\/)?[a-z0-9]+([\\-\\.]{1}[a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(\\/.*)?$/\n\n if (urlRegex.test(data)) {\n return 'url'\n }\n\n return null\n}\n\nconst isBinary = (arrayBuffer: ArrayBuffer): boolean => {\n const view = new Uint8Array(arrayBuffer);\n\n let nonTextCount = 0;\n const threshold = 0.2; // Adjust as needed (e.g., 20% non-text implies binary)\n\n for (let i = 0; i < view.length; i++) {\n const byte = view[i];\n\n // ASCII printable characters (32-126) and common whitespace (9, 10, 13)\n if (\n (byte >= 32 && byte <= 126) || // Printable ASCII\n byte === 9 || byte === 10 || byte === 13 // Tab, LF, CR\n ) {\n continue;\n }\n\n nonTextCount++;\n if (nonTextCount / view.length > threshold) {\n return true; // More than threshold are non-text bytes\n }\n }\n\n return false; // Fewer than threshold are non-text bytes\n}\n\nconst saveBufferToOPFS = async (filePath: string, buffer: Uint8Array): Promise<void> => {\n // Access the OPFS root directory\n const rootHandle = await navigator.storage.getDirectory();\n\n // Split the filePath into directory segments and file name\n const segments = filePath.split('/').filter(Boolean);\n const fileName = segments.pop(); // Extract the file name\n if (!fileName) {\n throw new Error('Invalid file path: No file name provided.');\n }\n\n // Traverse or create directories as needed\n let currentDirHandle = rootHandle;\n for (const segment of segments) {\n currentDirHandle = await currentDirHandle.getDirectoryHandle(segment, { create: true });\n }\n\n // Create or open the file in OPFS\n const fileHandleAsync = await currentDirHandle.getFileHandle(fileName, { create: true });\n const fileHandle = await fileHandleAsync.createSyncAccessHandle();\n // Write the buffer to the file\n fileHandle.write(buffer);\n fileHandle.flush();\n fileHandle.close();\n}\n\nconst downloadFiles = async ({\n transactionIds,\n arweaveHost,\n}: {\n transactionIds: string[],\n arweaveHost: string,\n}) => {\n\n let arrayBuffer: ArrayBuffer | undefined\n\n for (const transactionId of transactionIds) {\n try {\n const response = await fetch(`https://${arweaveHost}/raw/${transactionId}`);\n\n arrayBuffer = await response.arrayBuffer();\n } catch(error) {\n console.log(`[filesDownload] transaction ${transactionId} data not found`, error)\n globalThis.postMessage({\n message: 'excludeTransaction',\n transactionId,\n })\n continue\n }\n\n let dataString\n const isBinaryData = isBinary(arrayBuffer)\n\n if (!isBinaryData) {\n const decoder = new TextDecoder('utf-8')\n const text = decoder.decode(arrayBuffer)\n dataString = text\n }\n\n if (!dataString && !arrayBuffer) {\n console.log(\n `[filesDownload] transaction ${transactionId} data not found`,\n )\n }\n\n if (dataString && dataString.startsWith('===FILE_SEPARATOR===')) {\n const dataStringParts = dataString\n .split('===FILE_SEPARATOR===')\n .slice(1)\n\n if (dataStringParts.length % 2 !== 0) {\n throw new Error('Input array must have an even number of elements.')\n }\n\n for (let i = 0; i < dataStringParts.length; i += 2) {\n const contentType = dataStringParts[i]\n const content = dataStringParts[i + 1]\n const encoder = new TextEncoder()\n if (contentType === 'html') {\n const fileName = `${transactionId}.html`\n const buffer = encoder.encode(content)\n saveBufferToOPFS(`/files/html/${fileName}`, buffer)\n }\n if (contentType === 'json') {\n const fileName = `${transactionId}.json`\n const buffer = encoder.encode(content)\n saveBufferToOPFS(`/files/json/${fileName}`, buffer)\n }\n }\n\n continue\n }\n\n if (!dataString && arrayBuffer) {\n saveBufferToOPFS(\n `/files/images/${transactionId}`,\n new Uint8Array(arrayBuffer),\n )\n continue\n }\n\n if (!dataString) {\n continue\n }\n\n let contentType = identifyString(dataString)\n\n if (\n contentType !== 'json' &&\n contentType !== 'base64' &&\n contentType !== 'html'\n ) {\n const possibleImageType = getDataTypeFromString(dataString)\n if (!possibleImageType) {\n console.log(\n `[filesDownload] transaction ${transactionId} data not in expected format: ${possibleImageType}`,\n )\n continue\n }\n\n contentType = possibleImageType\n }\n\n if (contentType === 'url') {\n const url = dataString as string\n\n let buffer: ArrayBuffer | undefined\n\n try {\n const response = await fetch(url)\n \n buffer = await response.arrayBuffer()\n\n } catch(error) {\n console.log(`[filesDownload] transaction ${transactionId} value was url: ${dataString} but failed to fetch`, error)\n globalThis.postMessage({\n message: 'excludeTransaction',\n transactionId,\n })\n continue\n }\n\n const bufferUint8Array = new Uint8Array(buffer)\n\n // Extract the file extension from the URL\n const extensionMatch = url.match(/\\.(jpg|jpeg|png|gif|bmp|webp|svg)$/i)\n if (!extensionMatch) {\n throw new Error(\n 'Unable to determine the file extension from the URL.',\n )\n }\n const fileExtension = extensionMatch[0] // e.g., \".jpg\"\n\n // Set the file name (you can customize this)\n // const fileNameFromUrl = `${transactionId}${fileExtension}`\n\n await saveBufferToOPFS(\n `/files/images/${transactionId}`,\n bufferUint8Array,\n )\n\n continue\n }\n\n const mimeType = getMimeType(dataString as string)\n let fileExtension = mimeType\n\n if (fileExtension && fileExtension?.startsWith('image')) {\n fileExtension = fileExtension.replace('image/', '')\n }\n\n let fileName = transactionId\n\n if (contentType === 'base64') {\n if (fileExtension) {\n fileName += `.${fileExtension}`\n }\n\n // Remove the Base64 header if it exists (e.g., \"data:image/png;base64,\")\n const base64Data = dataString.split(',').pop() || ''\n\n // Decode the Base64 string to binary\n const binaryString = atob(base64Data)\n const length = binaryString.length\n const binaryData = new Uint8Array(length)\n\n for (let i = 0; i < length; i++) {\n binaryData[i] = binaryString.charCodeAt(i)\n }\n\n await saveBufferToOPFS(`/files/images/${fileName}`, binaryData)\n\n }\n\n if (contentType === 'html') {\n fileName += '.html'\n const encoder = new TextEncoder()\n const buffer = encoder.encode(dataString)\n await saveBufferToOPFS(`/files/html/${fileName}`, buffer)\n }\n\n if (contentType === 'json') {\n fileName += '.json'\n const encoder = new TextEncoder()\n const buffer = encoder.encode(dataString)\n await saveBufferToOPFS(`/files/json/${fileName}`, buffer)\n }\n }\n}\n\nonmessage = async (e) => {\n const { debug } = e.data\n if (!debug) {\n console.log = () => {}\n }\n console.log({\n message: 'filesDownload onmessage',\n data: e.data,\n })\n await downloadFiles(e.data);\n globalThis.postMessage({\n message: 'filesDownload onmessage done',\n done: true,\n })\n \n}\n}.toString()\n}\n)()`","import { saveAppState } from '@/db/write/saveAppState';\nimport filesDownload from './filesDownload.js'\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:browser:workers:FileDownloader')\n\nexport class FileDownloader {\n private cores: number\n private workersArchive: Worker[] = []\n private workerBlobUrl: string\n\n constructor() {\n this.cores = Math.min(navigator.hardwareConcurrency || 4, 4);\n\n this.workerBlobUrl = globalThis.URL.createObjectURL(\n new Blob([filesDownload], { type: 'application/javascript' })\n )\n }\n\n public downloadAll = async ({transactionIds, arweaveHost, excludedTransactions}: DownloadAllFilesParams): Promise<void> => {\n\n if (this.workersArchive.length > 0) {\n for (let i = 0; i < this.workersArchive.length; i++) {\n this.workersArchive[i].terminate()\n delete this.workersArchive[i]\n }\n this.workersArchive = []\n }\n\n const worker = new Worker(this.workerBlobUrl);\n\n this.workersArchive.push(worker)\n\n const localExcludedTransactions = new Set(excludedTransactions)\n\n return new Promise((resolve, reject) => {\n worker.onmessage = (e) => {\n logger('filesDownload main thread onmessage', e.data);\n\n if (e.data.message === 'excludeTransaction') {\n localExcludedTransactions.add(e.data.transactionId)\n }\n\n if (e.data.done) {\n saveAppState('excludedTransactions', JSON.stringify(Array.from(localExcludedTransactions)))\n .then(() => {\n resolve(e.data)\n })\n .catch((error) => {\n reject(error)\n })\n }\n if (e.data.error) {\n reject(e.data.error)\n }\n }\n \n worker.postMessage({\n transactionIds,\n arweaveHost,\n debug: logger.enabled,\n });\n })\n }\n}\n","type BrowserImageResizerConfigBase = {\n\t/**\n\t * Algorithm used for downscaling\n\t * \n\t * * `null`: Just resize with `drawImage()`. The best quality and fastest.\n\t * * `bilinear`: Better quality, slower. Comes from upstream (ericnogralesbrowser-image-resizer).\n\t * * `hermite`: Worse quality, faster. Comes from [viliusle/Hermite-resize](https://github.com/viliusle/Hermite-resize). Will dispatch workers for better performance.\n\t * * `hermite_single`: Worse quality, faster. Single-threaded.\n\t * \n\t * default: null\n\t */\n\talgorithm: 'bilinear' | 'hermite' | 'hermite_single' | 'null' | null;\n\n\t/**\n\t * Whether to process downscaling by `drawImage(source, 0, 0, source.width / 2, source.height / 2)`\n\t * until the size is smaller than twice the target size.\n\t *\n\t * There seems to be no situation where it is necessary to change to false.\n\t * \n\t * default: true\n\t */\n\tprocessByHalf: boolean;\n\n\tmaxWidth: number;\n\tmaxHeight: number;\n\tmaxSize?: number; // ???\n\n\t/**\n\t * Scale ratio. Strictly limited to maxWidth.\n\t */\n\tscaleRatio?: number;\n\n\t/**\n\t * Output logs to console\n\t */\n\tdebug: boolean;\n}\n\n\ntype BrowserImageResizerConfigWithConvertedOutput = BrowserImageResizerConfigBase & {\n\tquality: number;\n\tmimeType: string;\n};\n\ntype BrowserImageResizerConfigWithOffscreenCanvasOutput = BrowserImageResizerConfigBase & {\n\tmimeType: null;\n}\n\ntype BrowserImageResizerConfig = BrowserImageResizerConfigWithConvertedOutput | BrowserImageResizerConfigWithOffscreenCanvasOutput;\n\ntype WorkerSouceData = {\n source: ImageData;\n startY: number;\n height: number;\n}\n\nexport default `(\n ${\n function () {\n\nasync function listFilesInDirectory(directoryHandle: FileSystemDirectoryHandle) {\n const entries: { name: string; kind: FileSystemHandleKind }[] = [];\n\n for await (const [name, handle] of directoryHandle.entries()) {\n entries.push({\n name,\n kind: handle.kind,\n })\n }\n\n return entries;\n}\n\nconst getFileHandle = async (path: string, rootHandle: FileSystemDirectoryHandle | null = null): Promise<FileSystemFileHandle> => {\n // Split the path into segments\n const segments = path.split('/').filter(Boolean);\n\n // Start from the root directory if not provided\n if (!rootHandle) {\n rootHandle = await navigator.storage.getDirectory();\n }\n\n let currentHandle = rootHandle;\n\n // Traverse the path segments\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLastSegment = i === segments.length - 1;\n\n try {\n\n for await (const [name, handle] of currentHandle.entries()) {\n if (name !== segment) {\n continue\n }\n\n if (isLastSegment) {\n if (handle.kind === 'file') {\n return handle as FileSystemFileHandle; // Return the file handle if found\n } else {\n throw new Error(`Path '${path}' refers to a directory, not a file.`);\n }\n } else if (handle.kind === 'directory') {\n currentHandle = handle as FileSystemDirectoryHandle; // Traverse into the directory\n } else {\n throw new Error(`Invalid path segment '${segment}'`);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'NotFoundError') {\n throw new Error(`Path '${path}' does not exist.`);\n } else {\n throw err;\n }\n }\n }\n\n throw new Error(`Path '${path}' could not be resolved.`);\n}\n\nasync function getFileFromOPFS(path: string): Promise<File> {\n\n const fileHandleAsync = await getFileHandle(path);\n const file = await fileHandleAsync.getFile();\n return file;\n\n}\n\nconst DEFAULT_CONFIG = {\n\targorithm: 'null',\n\tprocessByHalf: true,\n\tquality: 0.5,\n\tmaxWidth: 800,\n\tmaxHeight: 600,\n\tdebug: false,\n\tmimeType: 'image/jpeg',\n} as const;\n\nfunction isIos() {\n\tif (typeof navigator === 'undefined') return false;\n\tif (!navigator.userAgent) return false;\n\treturn /iPad|iPhone|iPod/.test(navigator.userAgent);\n}\n\nconst getTargetHeight = (srcHeight: number, scale: number, config: BrowserImageResizerConfig) => {\n\treturn Math.min(Math.floor(srcHeight * scale), config.maxHeight);\n}\n\nconst findMaxWidth = (config: BrowserImageResizerConfig, canvas: { width: number; height: number }) => {\n\t//Let's find the max available width for scaled image\n\tconst ratio = canvas.width / canvas.height;\n\tlet mWidth = Math.min(\n\t\tcanvas.width,\n\t\tconfig.maxWidth,\n\t\tratio * config.maxHeight\n\t);\n\tif (\n\t\tconfig.maxSize &&\n\t\tconfig.maxSize > 0 &&\n\t\tconfig.maxSize < (canvas.width * canvas.height) / 1000\n\t)\n\t\tmWidth = Math.min(\n\t\t\tmWidth,\n\t\t\tMath.floor((config.maxSize * 1000) / canvas.height)\n\t\t);\n\tif (!!config.scaleRatio)\n\t\tmWidth = Math.min(mWidth, Math.floor(config.scaleRatio * canvas.width));\n\n\tconst rHeight = getTargetHeight(canvas.height, mWidth / canvas.width, config);\n\n // console.log(\n // 'browser-image-resizer: original image size = ' +\n // canvas.width +\n // ' px (width) X ' +\n // canvas.height +\n // ' px (height)'\n // );\n // console.log(\n // 'browser-image-resizer: scaled image size = ' +\n // mWidth +\n // ' px (width) X ' +\n // rHeight +\n // ' px (height)'\n // );\n\tif (mWidth <= 0) {\n\t\tmWidth = 1;\n\t\tconsole.warn(\"browser-image-resizer: image size is too small\");\n\t}\n\n\tif (isIos() && mWidth * rHeight > 167777216) {\n\t\tconsole.error(\"browser-image-resizer: image size is too large for iOS WebKit.\", mWidth, rHeight);\n\t\tthrow new Error(\"browser-image-resizer: image size is too large for iOS WebKit.\");\n\t}\n\n\treturn mWidth;\n}\n\n /**\n * Hermite resize, multicore version - fast image resize/resample using Hermite filter.\n */\n const resample = (srcCanvas: OffscreenCanvas, destCanvas: OffscreenCanvas, config: { debug?: boolean }) => {\n return new Promise<void>((resolve, reject) => {\n\n const ratio_h = srcCanvas.height / destCanvas.height;\n const cores = Math.min(navigator.hardwareConcurrency || 4, 4)\n\n //prepare source and target data for workers\n const ctx = srcCanvas.getContext('2d');\n if (!ctx) return reject('Canvas is empty (resample)');\n\n const data_part: WorkerSouceData[] = [];\n const block_height = Math.ceil(srcCanvas.height / cores / 2) * 2;\n let end_y = -1;\n for (let c = 0; c < cores; c++) {\n //source\n const offset_y = end_y + 1;\n if (offset_y >= srcCanvas.height) {\n //size too small, nothing left for this core\n continue;\n }\n\n end_y = Math.min(offset_y + block_height - 1, srcCanvas.height - 1);\n\n const current_block_height = Math.min(block_height, srcCanvas.height - offset_y);\n\n console.log('browser-image-resizer: source split: ', '#' + c, offset_y, end_y, 'height: ' + current_block_height);\n\n data_part.push({\n source: ctx.getImageData(0, offset_y, srcCanvas.width, block_height),\n startY: Math.ceil(offset_y / ratio_h),\n height: current_block_height\n });\n }\n\n //start\n const destCtx = destCanvas.getContext('2d');\n if (!destCtx) return reject('Canvas is empty (resample dest)');\n let workers_in_use = data_part.length;\n for (let c = 0; c < data_part.length; c++) {\n\n //draw\n const height_part = Math.ceil(data_part[c].height / ratio_h);\n const target = destCtx.createImageData(destCanvas.width, height_part);\n // target.data.set(event.data.target);\n destCtx.putImageData(target, 0, data_part[c].startY);\n\n }\n });\n};\n\n /**\n * Hermite resize - fast image resize/resample using Hermite filter. 1 cpu version!\n */\n const resampleSingle = (srcCanvasData: ImageData, destCanvasData: ImageData,) => {\n const ratio_w = srcCanvasData.width / destCanvasData.width;\n const ratio_h = srcCanvasData.height / destCanvasData.height;\n const ratio_w_half = Math.ceil(ratio_w / 2);\n const ratio_h_half = Math.ceil(ratio_h / 2);\n\n const data = srcCanvasData.data;\n const data2 = destCanvasData.data;\n\n for (let j = 0; j < destCanvasData.height; j++) {\n for (let i = 0; i < destCanvasData.width; i++) {\n const x2 = (i + j * destCanvasData.width) * 4;\n let weight = 0;\n let weights = 0;\n let weights_alpha = 0;\n let gx_r = 0;\n let gx_g = 0;\n let gx_b = 0;\n let gx_a = 0;\n const center_y = j * ratio_h;\n\n const xx_start = Math.floor(i * ratio_w);\n const xx_stop = Math.min(Math.ceil((i + 1) * ratio_w), srcCanvasData.width);\n const yy_start = Math.floor(j * ratio_h);\n const yy_stop = Math.min(Math.ceil((j + 1) * ratio_h), srcCanvasData.height);\n\n for (let yy = yy_start; yy < yy_stop; yy++) {\n let dy = Math.abs(center_y - yy) / ratio_h_half;\n let center_x = i * ratio_w;\n let w0 = dy * dy; //pre-calc part of w\n for (let xx = xx_start; xx < xx_stop; xx++) {\n let dx = Math.abs(center_x - xx) / ratio_w_half;\n let w = Math.sqrt(w0 + dx * dx);\n if (w >= 1) {\n //pixel too far\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n let pos_x = 4 * (xx + yy * srcCanvasData.width);\n //alpha\n gx_a += weight * data[pos_x + 3];\n weights_alpha += weight;\n //colors\n if (data[pos_x + 3] < 255)\n weight = weight * data[pos_x + 3] / 250;\n gx_r += weight * data[pos_x];\n gx_g += weight * data[pos_x + 1];\n gx_b += weight * data[pos_x + 2];\n weights += weight;\n }\n }\n data2[x2] = gx_r / weights;\n data2[x2 + 1] = gx_g / weights;\n data2[x2 + 2] = gx_b / weights;\n data2[x2 + 3] = gx_a / weights_alpha;\n }\n }\n};\n\n /**\n * Hermite resize. Detect cpu count and use best option for user.\n */\n const resampleAuto = (srcCanvas: OffscreenCanvas, destCanvas: OffscreenCanvas, config: { debug?: boolean, argorithm?: string }) => {\n if (!!globalThis.Worker && navigator.hardwareConcurrency > 1 && config?.argorithm !== 'hermite_single') {\n //workers supported and we have at least 2 cpu cores - using multithreading\n return resample(srcCanvas, destCanvas, config);\n } else {\n //1 cpu version\n const { srcImgData, destImgData } = getImageData(srcCanvas, destCanvas);\n resampleSingle(srcImgData, destImgData);\n destCanvas.getContext('2d')!.putImageData(destImgData, 0, 0);\n return;\n }\n};\n\n\nasync function scaleCanvasWithAlgorithm(canvas: OffscreenCanvas, config: BrowserImageResizerConfig & { outputWidth: number }) {\n\tconst scale = config.outputWidth / canvas.width;\n\n\tconst scaled = new OffscreenCanvas(Math.floor(config.outputWidth), getTargetHeight(canvas.height, scale, config));\n\n\tswitch (config.algorithm) {\n\t\tcase 'hermite': {\n\t\t\tawait resampleAuto(canvas, scaled, config as BrowserImageResizerConfig & { algorithm: 'hermite' | 'hermite_single' });\n\t\t\tbreak;\n\t\t} case 'hermite_single': {\n\t\t\tconst { srcImgData, destImgData } = getImageData(canvas, scaled);\n\t\t\tresampleSingle(srcImgData, destImgData,);\n\t\t\tscaled?.getContext('2d')?.putImageData(destImgData, 0, 0);\n\t\t\tbreak;\n\t\t} case 'bilinear': {\n\t\t\t// const { srcImgData, destImgData } = getImageData(canvas, scaled);\n\t\t\t// bilinear(srcImgData, destImgData, scale);\n\t\t\t// scaled?.getContext('2d')?.putImageData(destImgData, 0, 0);\n\t\t\tbreak;\n\t\t} default: {\n\t\t\tscaled.getContext('2d')?.drawImage(canvas, 0, 0, scaled.width, scaled.height);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn scaled;\n}\n\nconst getHalfScaleCanvas = (src: OffscreenCanvas | HTMLCanvasElement) => {\n\tconst half = new OffscreenCanvas(src.width / 2, src.height / 2);\n\n\thalf\n\t\t?.getContext('2d')\n\t\t?.drawImage(src, 0, 0, half.width, half.height);\n\n\treturn half;\n}\n\nconst getImageData = (canvas: OffscreenCanvas, scaled: OffscreenCanvas) => {\n\tconst srcImgData = canvas\n\t\t?.getContext('2d')\n\t\t?.getImageData(0, 0, canvas.width, canvas.height);\n\tconst destImgData = scaled\n\t\t?.getContext('2d')\n\t\t?.createImageData(scaled.width, scaled.height);\n\n\tif (!srcImgData || !destImgData) throw Error('Canvas is empty (scaleCanvasWithAlgorithm). You should run this script after the document is ready.');\n\n\treturn { srcImgData, destImgData };\n}\n\nasync function saveBlobToOPFS(filePath: string, blob: Blob): Promise<void> {\n // Access the OPFS root directory\n const rootHandle = await navigator.storage.getDirectory();\n\n // Split the filePath into directory segments and file name\n const segments = filePath.split('/').filter(Boolean);\n const fileName = segments.pop(); // Extract the file name\n if (!fileName) {\n throw new Error('Invalid file path: No file name provided.');\n }\n\n // Traverse or create directories as needed\n let currentDirHandle = rootHandle;\n for (const segment of segments) {\n currentDirHandle = await currentDirHandle.getDirectoryHandle(segment, { create: true });\n }\n\n // Create or open the file in OPFS\n const fileHandle = await currentDirHandle.getFileHandle(fileName, { create: true });\n\n // Write the Blob to the file\n const writableStream = await fileHandle.createWritable();\n await writableStream.write(blob);\n await writableStream.close();\n}\n\n\nconst imageResize = async (filePath: string, width: number, height: number) => {\n\n console.log({filePath, width, height})\n\n const config: BrowserImageResizerConfig = {\n ...DEFAULT_CONFIG,\n algorithm: 'hermite_single' as const,\n mimeType: 'image/webp',\n maxWidth: width,\n maxHeight: height,\n }\n\n const rootHandle = await navigator.storage.getDirectory();\n\n // List files in the root directory\n const files = await listFilesInDirectory(rootHandle);\n console.log({\n message: 'listFilesInDirectory',\n files\n });\n\n const file = await getFileFromOPFS(filePath);\n\n const imageBitmap = await createImageBitmap(file);\n\n let converting: OffscreenCanvas\n\n if (isIos() && imageBitmap.width * imageBitmap.height > 16777216) {\n const scale = Math.sqrt(16777216 / (imageBitmap.width * imageBitmap.height));\n console.log(`browser-image-resizer: scale: Image is too large in iOS WebKit`);\n converting = new OffscreenCanvas(Math.floor(imageBitmap.width * scale), Math.floor(imageBitmap.height * scale));\n converting.getContext('2d')?.drawImage(imageBitmap, 0, 0, converting.width, converting.height);\n } else {\n converting = new OffscreenCanvas(imageBitmap.width, imageBitmap.height);\n converting.getContext('2d')?.drawImage(imageBitmap, 0, 0);\n }\n\n if (!converting?.getContext('2d')) {\n console.log('browser-image-resizer: Canvas Context is empty.')\n }\n\n const maxWidth = findMaxWidth(config, converting);\n\n\tif (!maxWidth){ \n throw Error(`browser-image-resizer: maxWidth is ${maxWidth}!!`)\n };\n\n\twhile (config.processByHalf && converting.width >= 2 * maxWidth) {\n\t\tif (config.debug) console.log(`browser-image-resizer: scale: Scaling canvas by half from ${converting.width}`);\n\t\tconverting = getHalfScaleCanvas(converting);\n\t}\n\n\tif (converting.width > maxWidth) {\n\t\tif (config.debug) console.log(`browser-image-resizer: scale: Scaling canvas by ${config.algorithm} from ${converting.width} to ${maxWidth}`);\n\t\tconverting = await scaleCanvasWithAlgorithm(\n\t\t\tconverting,\n\t\t\tObject.assign(config, { outputWidth: maxWidth }),\n\t\t);\n\t}\n\n\tif (config.mimeType === null) {\n\t\treturn converting;\n\t}\n\tconst resizedBlob = await converting.convertToBlob({ type: config.mimeType, quality: config.quality });\n\n const pathSegments = filePath.split('/');\n const fileName = pathSegments.pop();\n if (!fileName) {\n throw Error('Invalid file path: No file name provided.');\n }\n const newSegments = [\n ...pathSegments,\n width,\n ]\n const fileNameParts = fileName.split('.')\n const newFileName = `${fileNameParts[0]}.webp`\n const newDirPath = newSegments.join('/');\n const newFilePath = `${newDirPath}/${newFileName}`;\n\n // Save resized image to OPFS with new name\n await saveBlobToOPFS(newFilePath, resizedBlob)\n globalThis.postMessage({\n done: true,\n filePath: newFilePath,\n })\n\n}\n\nonmessage = async (e) => {\n const { filePath, width, height, debug } = e.data\n if (!debug) {\n console.log = () => {}\n }\n console.log('[imageResize] onmessage', e.data)\n await imageResize(filePath, width, height)\n console.log(`[imageResize] Done`, filePath)\n}\n}.toString()\n}\n)()`\n","import imageResize from './imageResize'\nimport { BaseFileManager } from '@/helpers/FileManager/BaseFileManager';\nimport debug from 'debug'\n\nconst logger = debug('seedSdk:browser:workers:ImageResizer')\n\n\nexport class ImageResizer {\n private cores: number\n private workersArchive: Map<string, Worker> = new Map()\n private workerBlobUrl: string\n\n constructor() {\n this.cores = Math.min(navigator.hardwareConcurrency || 4, 4);\n\n this.workerBlobUrl = globalThis.URL.createObjectURL(\n new Blob([imageResize], { type: 'application/javascript' })\n )\n }\n\n public async resize({filePath, width, height}: ResizeImageParams) {\n \n if (this.workersArchive.has(filePath)) {\n const savedWorker = this.workersArchive.get(filePath)\n savedWorker?.terminate()\n logger('[ImageResizer.resize] Terminated worker for filePath due to incoming request', filePath)\n this.workersArchive.delete(filePath)\n }\n\n const worker = new Worker(this.workerBlobUrl);\n\n this.workersArchive.set(filePath, worker)\n\n return new Promise((resolve, reject) => {\n worker.onmessage = (e) => {\n logger('[ImageResizer.resize] main thread onmessage', e.data);\n if (e.data.done) {\n const savedWorker = this.workersArchive.get(filePath)\n savedWorker?.terminate()\n logger('[ImageResizer.resize] Terminated worker for filePath due to done', filePath)\n this.workersArchive.delete(filePath)\n resolve(e.data)\n }\n\n if (e.data.error) {\n reject(e.data.error)\n }\n }\n \n worker.postMessage({\n filePath,\n width,\n height,\n debug: logger.enabled,\n });\n })\n }\n\n public async resizeAll({width, height}: ResizeAllImagesParams) {\n\n const fs = await BaseFileManager.getFs()\n\n const imageDir = '/files/images'\n let imageFilesStats = await fs.promises.readdir(imageDir, {\n withFileTypes: true\n })\n\n imageFilesStats = imageFilesStats.filter((file: any) => file.isFile())\n\n const imageFiles = imageFilesStats.map((file: any) => file.path)\n\n const widthDir = `${imageDir}/${width}`\n\n await BaseFileManager.createDirIfNotExists(widthDir)\n\n for (const imageFile of imageFiles) {\n const resizedImageExists = await BaseFileManager.pathExists(`${widthDir}/${imageFile}`)\n if (!resizedImageExists) {\n await this.resize({filePath: `${imageDir}/${imageFile}`, width, height})\n }\n }\n\n \n }\n}\n","import { BaseFileManager } from '@/helpers/FileManager/BaseFileManager'\nimport { FileDownloader } from '../workers/FileDownloader'\nimport { ImageResizer } from '../workers/ImageResizer'\nimport debug from 'debug'\nimport path from 'path-browserify'\n\nconst logger = debug('seedSdk:browser:helpers:FileManager')\n\nclass FileManager extends BaseFileManager {\n private static zenfsCache: any = null\n\n static async getFs() {\n if (!this.zenfsCache) {\n this.zenfsCache = await import('@zenfs/core')\n }\n return this.zenfsCache\n }\n\n static getFsSync() {\n if (!this.zenfsCache) {\n throw new Error('File system not initialized. Call getFs() or initializeFileSystem() first.')\n }\n return this.zenfsCache\n }\n\n static async getContentUrlFromPath( path: string ): Promise<string | undefined> {\n\n const fileExists = await this.pathExists(path)\n if ( fileExists ) {\n const file = await this.readFile(path)\n return URL.createObjectURL(file)\n }\n }\n\n static async initializeFileSystem(workingDir?: string): Promise<void> {\n\n const zenfs = await this.getFs()\n const {WebAccess} = await import('@zenfs/dom')\n const {configureSingle} = zenfs\n\n const handle = await navigator.storage.getDirectory()\n // await configure({\n // mounts: {\n // '/': {\n // backend: WebAccess,\n // handle,\n // },\n // },\n // disableUpdateOnRead: true,\n // onlySyncOnClose: true,\n // })\n await configureSingle({\n backend: WebAccess,\n handle,\n })\n // Cache is already set in getFs(), so no need to set it again\n }\n\n static async downloadAllFiles( {\n transactionIds,\n arweaveHost,\n excludedTransactions,\n }: DownloadAllFilesParams ): Promise<void> {\n const fileDownloader = new FileDownloader()\n await fileDownloader.downloadAll({ transactionIds, arweaveHost, excludedTransactions })\n }\n\n static async resizeImage( { filePath, width, height }: ResizeImageParams ): Promise<void> {\n const imageResizer = new ImageResizer()\n await imageResizer.resize({ filePath, width, height })\n }\n\n static async resizeAllImages( { width, height }: ResizeAllImagesParams ): Promise<void> {\n const imageResizer = new ImageResizer()\n await imageResizer.resizeAll({ width, height })\n }\n\n static async pathExists(filePath: string): Promise<boolean> {\n try {\n const zenfs = await this.getFs()\n await zenfs.promises.access(filePath, zenfs.constants.F_OK)\n return true\n } catch (error: any) {\n // ENOENT means the file doesn't exist, which is expected\n if (error?.code === 'ENOENT' || error?.errno === -2) {\n return false\n }\n // For other errors, re-throw them\n throw error\n }\n }\n\n static async createDirIfNotExists(filePath: string): Promise<void> {\n if (!(await this.pathExists(filePath))) {\n try {\n const zenfs = await this.getFs()\n await zenfs.promises.mkdir(filePath, { recursive: true })\n } catch (error) {\n // This is a no-op. We tried to create a directory that already exists.\n logger('Attempted to create a directory that already exists')\n }\n }\n }\n\n /**\n * Waits for a file to exist at the specified path.\n * @param {string} filePath - The path of the file to check.\n * @param {number} interval - The interval in milliseconds between checks (default: 500ms).\n * @param {number} timeout - The timeout in milliseconds to wait for the file to exist (default: 10s).\n * @returns {Promise<boolean>} - Resolves to true if the file exists within the timeout period, otherwise false.\n */\n static async waitForFile(filePath: string, interval: number = 1000, timeout: number = 60000): Promise<boolean> {\n\n // const fs = await this.getFs()\n // const fsNode = await import('node:fs')\n const pathExists = await this.pathExists(filePath)\n\n if (pathExists) {\n return true\n }\n\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n\n let isBusy = false\n\n const cancelableInterval = new CancelableInterval(async (stop) => {\n logger('waitForFile', filePath)\n if (isBusy) {\n return\n }\n isBusy = true\n // // TODO: Needs to read from OPFS\n // const exists = await BaseFileManager.pathExists(filePath)\n // if (exists) {\n // stop()\n // resolve(true)\n // }\n\n const pathExists = await this.pathExists(filePath)\n if (pathExists) {\n stop()\n resolve(true)\n }\n\n if (Date.now() - startTime >= timeout) {\n stop()\n reject(new Error('Timeout exceeded while waiting for file'))\n }\n isBusy = false\n }, interval)\n\n cancelableInterval.start()\n \n // const _interval = setInterval(async () => {\n // logger('waitForFile', filePath)\n // if (isBusy) {\n // return\n // }\n // isBusy = true\n // // TODO: Needs to read from OPFS\n // if (fs.existsSync(filePath) && fsNode.existsSync(filePath)) {\n // clearInterval(_interval)\n // resolve(true)\n // }\n\n // const pathExists = await this.pathExists(filePath)\n // if (pathExists) {\n // clearInterval(_interval)\n // resolve(true)\n // }\n\n // if (Date.now() - startTime >= timeout) {\n // clearInterval(_interval)\n // reject(new Error('Timeout exceeded while waiting for file'))\n // }\n // isBusy = false\n // }, interval)\n \n // retry(\n // {\n // times: Math.ceil(timeout / interval),\n // interval: interval,\n // },\n // (callback: Function) => {\n // if (fs.existsSync(filePath) && fsNode.existsSync(filePath)) {\n // return callback(null, true) // File exists, finish with success\n // }\n // if (Date.now() - startTime >= timeout) {\n // return callback(new Error('Timeout exceeded while waiting for file'))\n // }\n // callback(new Error('File does not exist yet')) // Retry with this error\n // },\n // (err: Error, result: boolean) => {\n // if (err) {\n // return resolve(false) // Resolve as false if timeout or error occurs\n // }\n // resolve(result) // Resolve as true if file exists\n // },\n // )\n })\n }\n\n /**\n * Waits for a file to exist and have content (non-zero size).\n * This is important for browser/OPFS where writes may not be immediately readable.\n * @param {string} filePath - The path of the file to check.\n * @param {number} interval - The interval in milliseconds between checks (default: 100ms).\n * @param {number} timeout - The timeout in milliseconds to wait (default: 5s).\n * @returns {Promise<boolean>} - Resolves to true if the file exists with content within the timeout period.\n */\n static async waitForFileWithContent(filePath: string, interval: number = 100, timeout: number = 5000): Promise<boolean> {\n // First wait for file to exist\n await this.waitForFile(filePath, interval, timeout)\n\n // Now wait for file to have content\n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n let isBusy = false\n\n const cancelableInterval = new CancelableInterval(async (stop) => {\n logger('waitForFileWithContent', filePath)\n if (isBusy) {\n return\n }\n isBusy = true\n\n try {\n // Try to read the file to check if it has content\n const file = await this.readFile(filePath)\n if (file.size > 0) {\n stop()\n resolve(true)\n return\n }\n // File exists but is 0 bytes, continue waiting\n } catch (error: any) {\n // If error is about file being 0 bytes, not readable, or I/O error, continue waiting\n const errorMessage = error?.message || String(error)\n if (\n errorMessage.includes('0 bytes') || \n errorMessage.includes('ENOENT') || \n errorMessage.includes('EIO') ||\n errorMessage.includes('Input/output error')\n ) {\n // Continue waiting - file write may still be in progress\n } else {\n // Other errors should be thrown\n stop()\n reject(error)\n return\n }\n }\n\n if (Date.now() - startTime >= timeout) {\n stop()\n reject(new Error(`Timeout exceeded while waiting for file ${filePath} to have content`))\n return\n }\n isBusy = false\n }, interval)\n\n cancelableInterval.start()\n })\n }\n\n static async saveFile(filePath: string, content: string | Blob | ArrayBuffer): Promise<void> {\n const zenfs = await this.getFs()\n \n // Convert content to a format that zenfs.writeFile accepts\n let writeContent: string | Uint8Array\n if (typeof content === 'string') {\n writeContent = content\n } else if (content instanceof Blob) {\n const arrayBuffer = await content.arrayBuffer()\n writeContent = new Uint8Array(arrayBuffer)\n } else if (content instanceof ArrayBuffer) {\n writeContent = new Uint8Array(content)\n } else {\n throw new Error('Unsupported content type')\n }\n \n await zenfs.writeFile(filePath, writeContent)\n await this.waitForFileWithContent(filePath, 100, 5000)\n // try {\n // // Get a handle to the OPFS root directory\n // const root = await navigator.storage.getDirectory();\n \n // // Split the file path into directory and file name\n // const pathParts = filePath.split('/');\n // const fileName = pathParts.pop();\n // if (!fileName) throw new Error('Invalid file path');\n\n // // Traverse directories and create them if they don't exist\n // let currentDir = root;\n // for (const part of pathParts) {\n // if (part !== '') {\n // currentDir = await currentDir.getDirectoryHandle(part, { create: true });\n // }\n // }\n\n // // Get the file handle and create the file if it doesn't exist\n // const fileHandle = await currentDir.getFileHandle(fileName, { create: true });\n\n // // Create a writable stream and write the content\n // const writable = await fileHandle.createWritable();\n \n // if (typeof content === 'string' || content instanceof Uint8Array) {\n // await writable.write(content);\n // } else if (content instanceof Blob) {\n // await writable.write(content);\n // } else if (content instanceof ArrayBuffer) {\n // await writable.write(new Blob([content]));\n // } else {\n // throw new Error('Unsupported content type');\n // }\n\n // await writable.close();\n // logger(`File written successfully: ${filePath}`);\n // } catch (error) {\n // console.error(`Error writing to OPFS: ${error.message}`);\n // }\n }\n\n static saveFileSync(filePath: string, content: string | Blob | ArrayBuffer): void {\n // Note: This is a synchronous wrapper, but zenfs operations may still be async under the hood\n // For true sync operations in browser, we'd need to use OPFS sync access handles\n // For now, we'll use zenfs.writeFileSync which should be available\n const zenfs = this.getFsSync()\n \n // Convert content to a format that zenfs.writeFileSync accepts\n let writeContent: string | Uint8Array\n if (typeof content === 'string') {\n writeContent = content\n } else if (content instanceof Blob) {\n // Blob cannot be converted synchronously - throw error\n throw new Error('Blob content not supported in saveFileSync. Use saveFile() instead or convert to ArrayBuffer first.')\n } else if (content instanceof ArrayBuffer) {\n writeContent = new Uint8Array(content)\n } else {\n throw new Error('Unsupported content type')\n }\n \n zenfs.writeFileSync(filePath, writeContent)\n }\n\n static async readFile(filePath: string): Promise<File> {\n const zenfs = await this.getFs()\n const file = await zenfs.promises.readFile(filePath)\n return new File([new Uint8Array(file)], filePath)\n // try {\n // // Get a handle to the OPFS root directory\n // const root = await navigator.storage.getDirectory();\n \n // // Split the file path into directory and file name\n // const pathParts = filePath.split('/');\n // const fileName = pathParts.pop();\n // if (!fileName) throw new Error('Invalid file path');\n \n // // Traverse directories to reach the target file\n // let currentDir = root;\n // for (const part of pathParts) {\n // if (part !== '') {\n // currentDir = await currentDir.getDirectoryHandle(part, { create: false });\n // }\n // }\n \n // // Get the file handle\n // const fileHandle = await currentDir.getFileHandle(fileName, { create: false });\n \n // // Get the file and read it as an ArrayBuffer\n // return await fileHandle.getFile();\n // } catch (error) {\n // console.error(`Error reading from OPFS: ${error.message}`);\n // throw error;\n // }\n }\n\n static readFileSync(filePath: string): File {\n // Note: This is a synchronous wrapper, but zenfs operations may still be async under the hood\n // For true sync operations in browser, we'd need to use OPFS sync access handles\n // For now, we'll use zenfs.readFileSync which should be available\n const zenfs = this.getFsSync()\n const file = zenfs.readFileSync(filePath)\n return new File([new Uint8Array(file)], filePath)\n }\n\n static async readFileAsBuffer(filePath: string): Promise<Blob> {\n try {\n\n // Get the file and read it as an ArrayBuffer\n const file = await this.readFile(filePath)\n const arrayBuffer = await file.arrayBuffer();\n\n // Convert ArrayBuffer to Blob\n return new Blob([arrayBuffer]);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`Error reading from OPFS: ${errorMessage}`);\n throw error;\n }\n }\n\n static async readFileAsString(filePath: string): Promise<string> {\n const blob = await this.readFileAsBuffer(filePath)\n return blob.text()\n }\n\n static getParentDirPath(filePath: string): string {\n return path.dirname(filePath)\n }\n\n static getFilenameFromPath(filePath: string): string {\n return path.basename(filePath)\n }\n\n static getPathModule(): any {\n return path\n }\n}\n\ntype AsyncTask = (stop: () => void) => Promise<void>\n\n\nclass CancelableInterval {\n private intervalId: number | null = null;\n private currentTaskAbortController: AbortController | null = null;\n\n constructor(private task: AsyncTask, private interval: number) {}\n\n start() {\n this.intervalId = window.setInterval(async () => {\n if (this.currentTaskAbortController) {\n // Cancel the previous running task\n this.currentTaskAbortController.abort();\n }\n\n // Create a new abort controller for the current task\n this.currentTaskAbortController = new AbortController();\n const signal = this.currentTaskAbortController.signal;\n\n try {\n await this.taskWithCancellation(signal);\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n logger('Previous task was canceled.');\n } else {\n console.error('Task error:', error);\n }\n this.stop()\n }\n }, this.interval);\n }\n\n private async taskWithCancellation(signal: AbortSignal) {\n await this.task(() => this.stop())\n if (signal.aborted) {\n throw new DOMException('Task was aborted', 'AbortError');\n }\n }\n\n stop() {\n if (this.intervalId !== null) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n if (this.currentTaskAbortController) {\n this.currentTaskAbortController.abort();\n }\n }\n}\n\n\nexport { FileManager }\n"],"names":["logger"],"mappings":";;;;;;;;;;;;;;;;;AAAA,oBAAe,CAAA;AAEX,EAAA,EAAA,YAAA;AAEJ,IAAA,MAAM,cAAc,GAAG,CAAC,GAAW,KAAI;AACrC,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACf,YAAA,OAAO,MAAM;QACf;QAAE,OAAO,CAAC,EAAE;;QAEZ;QAEA,IAAI,CAAC,GAAG,EAAE;YACR;QACF;QAEA,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC1D,YAAA,OAAO,MAAM;QACf;;AAGA,QAAA,IAAI,wCAAwC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACtD,YAAA,OAAO,UAAU;QACnB;AAEA,QAAA,IAAI,qDAAqD,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACnE,YAAA,OAAO,QAAQ;QACjB;;AAGA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,MAAc,KAAI;QACrC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,IAAI;QACb;QACA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC;QAEvE,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,MAAM,CAAC,CAAC,CAAC;QAClB;aAAO;YACL,OAAO,IAAI,CAAA;QACb;AACF,IAAA,CAAC;AAED,IAAA,MAAM,qBAAqB,GAAG,CAC5B,IAAY,KAC+B;QAC3C,MAAM,mBAAmB,GACvB,oEAAoE;AAEtE,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAClC,YAAA,OAAO,QAAQ;QACjB;;QAGA,MAAM,gBAAgB,GAAG,qDAAqD;AAE9E,QAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC/B,YAAA,OAAO,aAAa;QACtB;;QAGA,MAAM,QAAQ,GACZ,yHAAyH;AAE3H,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACvB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAAG,CAAC,WAAwB,KAAa;AACrD,QAAA,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC;QAExC,IAAI,YAAY,GAAG,CAAC;AACpB,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;;YAGpB,IACI,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG;gBAC1B,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE;cAC1C;gBACE;YACJ;AAEA,YAAA,YAAY,EAAE;YACd,IAAI,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE;gBACxC,OAAO,IAAI,CAAC;YAChB;QACJ;QAEA,OAAO,KAAK,CAAC;AACf,IAAA,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,QAAgB,EAAE,MAAkB,KAAmB;;QAErF,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE;;AAGzD,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;QAChE;;QAGA,IAAI,gBAAgB,GAAG,UAAU;AACjC,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC5B,YAAA,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3F;;AAGA,QAAA,MAAM,eAAe,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACxF,QAAA,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,sBAAsB,EAAE;;AAEjE,QAAA,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,UAAU,CAAC,KAAK,EAAE;QAClB,UAAU,CAAC,KAAK,EAAE;AACpB,IAAA,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,EAC3B,cAAc,EACd,WAAW,GAIZ,KAAI;AAEH,QAAA,IAAI,WAAoC;AAExC,QAAA,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE;AAC1C,YAAA,IAAI;gBACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAA,QAAA,EAAW,WAAW,CAAA,KAAA,EAAQ,aAAa,CAAA,CAAE,CAAC;AAE3E,gBAAA,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE;YAC5C;YAAE,OAAM,KAAK,EAAE;gBACb,OAAO,CAAC,GAAG,CAAC,CAAA,4BAAA,EAA+B,aAAa,CAAA,eAAA,CAAiB,EAAE,KAAK,CAAC;gBACjF,UAAU,CAAC,WAAW,CAAC;AACrB,oBAAA,OAAO,EAAE,oBAAoB;oBAC7B,aAAa;AACd,iBAAA,CAAC;gBACF;YACF;AAEA,YAAA,IAAI,UAAU;AACd,YAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC;YAE1C,IAAI,CAAC,YAAY,EAAE;AACjB,gBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC;gBACxC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;gBACxC,UAAU,GAAG,IAAI;YACnB;AAEA,YAAA,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE;AAC/B,gBAAA,OAAO,CAAC,GAAG,CACT,+BAA+B,aAAa,CAAA,eAAA,CAAiB,CAC9D;YACH;YAEA,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE;gBAC/D,MAAM,eAAe,GAAG;qBACrB,KAAK,CAAC,sBAAsB;qBAC5B,KAAK,CAAC,CAAC,CAAC;gBAEX,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;AACpC,oBAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;gBACtE;AAEA,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;AAClD,oBAAA,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC;oBACtC,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC;AACtC,oBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;AACjC,oBAAA,IAAI,WAAW,KAAK,MAAM,EAAE;AAC1B,wBAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,aAAa,OAAO;wBACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;AACtC,wBAAA,gBAAgB,CAAC,CAAA,YAAA,EAAe,QAAQ,EAAE,EAAE,MAAM,CAAC;oBACrD;AACA,oBAAA,IAAI,WAAW,KAAK,MAAM,EAAE;AAC1B,wBAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,aAAa,OAAO;wBACxC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;AACtC,wBAAA,gBAAgB,CAAC,CAAA,YAAA,EAAe,QAAQ,EAAE,EAAE,MAAM,CAAC;oBACrD;gBACF;gBAEA;YACF;AAEA,YAAA,IAAI,CAAC,UAAU,IAAI,WAAW,EAAE;gBAC9B,gBAAgB,CACd,CAAA,cAAA,EAAiB,aAAa,CAAA,CAAE,EAChC,IAAI,UAAU,CAAC,WAAW,CAAC,CAC5B;gBACD;YACF;YAEA,IAAI,CAAC,UAAU,EAAE;gBACf;YACF;AAEA,YAAA,IAAI,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC;YAE5C,IACE,WAAW,KAAK,MAAM;AACtB,gBAAA,WAAW,KAAK,QAAQ;gBACxB,WAAW,KAAK,MAAM,EACtB;AACA,gBAAA,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,UAAU,CAAC;gBAC3D,IAAI,CAAC,iBAAiB,EAAE;oBACtB,OAAO,CAAC,GAAG,CACT,CAAA,4BAAA,EAA+B,aAAa,CAAA,8BAAA,EAAiC,iBAAiB,CAAA,CAAE,CACjG;oBACD;gBACF;gBAEA,WAAW,GAAG,iBAAiB;YACjC;AAEA,YAAA,IAAI,WAAW,KAAK,KAAK,EAAE;gBACzB,MAAM,GAAG,GAAG,UAAoB;AAEhC,gBAAA,IAAI,MAA+B;AAEnC,gBAAA,IAAI;AACF,oBAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;AAEjC,oBAAA,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE;gBAEvC;gBAAE,OAAM,KAAK,EAAE;oBACb,OAAO,CAAC,GAAG,CAAC,CAAA,4BAAA,EAA+B,aAAa,CAAA,gBAAA,EAAmB,UAAU,CAAA,oBAAA,CAAsB,EAAE,KAAK,CAAC;oBACnH,UAAU,CAAC,WAAW,CAAC;AACrB,wBAAA,OAAO,EAAE,oBAAoB;wBAC7B,aAAa;AACd,qBAAA,CAAC;oBACF;gBACF;AAEA,gBAAA,MAAM,gBAAgB,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;;gBAG/C,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,qCAAqC,CAAC;gBACvE,IAAI,CAAC,cAAc,EAAE;AACnB,oBAAA,MAAM,IAAI,KAAK,CACb,sDAAsD,CACvD;gBACH;gBACsB,cAAc,CAAC,CAAC,EAAC;;;gBAKvC,MAAM,gBAAgB,CACpB,CAAA,cAAA,EAAiB,aAAa,EAAE,EAChC,gBAAgB,CACjB;gBAED;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAoB,CAAC;YAClD,IAAI,aAAa,GAAG,QAAQ;YAE5B,IAAI,aAAa,IAAI,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE;gBACvD,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YACrD;YAEA,IAAI,QAAQ,GAAG,aAAa;AAE5B,YAAA,IAAI,WAAW,KAAK,QAAQ,EAAE;gBAC5B,IAAI,aAAa,EAAE;AACjB,oBAAA,QAAQ,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,CAAE;gBACjC;;AAGA,gBAAA,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;;AAGpD,gBAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;AACrC,gBAAA,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM;AAClC,gBAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;AAEzC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC/B,UAAU,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC5C;gBAEA,MAAM,gBAAgB,CAAC,CAAA,cAAA,EAAiB,QAAQ,EAAE,EAAE,UAAU,CAAC;YAEjE;AAEA,YAAA,IAAI,WAAW,KAAK,MAAM,EAAE;gBAC1B,QAAQ,IAAI,OAAO;AACnB,gBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;gBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;gBACzC,MAAM,gBAAgB,CAAC,CAAA,YAAA,EAAe,QAAQ,EAAE,EAAE,MAAM,CAAC;YAC3D;AAEA,YAAA,IAAI,WAAW,KAAK,MAAM,EAAE;gBAC1B,QAAQ,IAAI,OAAO;AACnB,gBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;gBACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;gBACzC,MAAM,gBAAgB,CAAC,CAAA,YAAA,EAAe,QAAQ,EAAE,EAAE,MAAM,CAAC;YAC3D;QACF;AACF,IAAA,CAAC;AAED,IAAA,SAAS,GAAG,OAAO,CAAC,KAAI;AACtB,QAAA,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI;QACxB,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,CAAC,GAAG,GAAG,MAAK,EAAE,CAAC;QACxB;QACA,OAAO,CAAC,GAAG,CAAC;AACV,YAAA,OAAO,EAAE,yBAAyB;YAClC,IAAI,EAAE,CAAC,CAAC,IAAI;AACb,SAAA,CAAC;AACF,QAAA,MAAM,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3B,UAAU,CAAC,WAAW,CAAC;AACrB,YAAA,OAAO,EAAE,8BAA8B;AACvC,YAAA,IAAI,EAAE,IAAI;AACX,SAAA,CAAC;AAEJ,IAAA,CAAC;AACD,CAAC,CAAC,QAAQ,EACV;IACI;;ACpUJ,MAAMA,QAAM,GAAG,KAAK,CAAC,wCAAwC,CAAC;MAEjD,cAAc,CAAA;AAKzB,IAAA,WAAA,GAAA;QAHQ,IAAA,CAAA,cAAc,GAAa,EAAE;QAW9B,IAAA,CAAA,WAAW,GAAG,OAAO,EAAC,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAyB,KAAmB;YAExH,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AAClC,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnD,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE;AAClC,oBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAC/B;AACA,gBAAA,IAAI,CAAC,cAAc,GAAG,EAAE;YAC1B;YAEA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;AAE7C,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAEhC,YAAA,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,oBAAoB,CAAC;YAE/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,gBAAA,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,KAAI;AACvB,oBAAAA,QAAM,CAAC,qCAAqC,EAAE,CAAC,CAAC,IAAI,CAAC;oBAErD,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,oBAAoB,EAAE;wBAC3C,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;oBACrD;AAEA,oBAAA,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;AACf,wBAAA,YAAY,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;6BACzF,IAAI,CAAC,MAAK;AACT,4BAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjB,wBAAA,CAAC;AACA,6BAAA,KAAK,CAAC,CAAC,KAAK,KAAI;4BACf,MAAM,CAAC,KAAK,CAAC;AACf,wBAAA,CAAC,CAAC;oBACJ;AACA,oBAAA,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;AAChB,wBAAA,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;oBACtB;AACF,gBAAA,CAAC;gBAED,MAAM,CAAC,WAAW,CAAC;oBACjB,cAAc;oBACd,WAAW;oBACX,KAAK,EAAEA,QAAM,CAAC,OAAO;AACtB,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAnDC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,eAAe,CACjD,IAAI,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAC9D;IACH;AA+CD;;ACRD,kBAAe,CAAA;AAEX,EAAA,EAAA,YAAA;IAEJ,eAAe,oBAAoB,CAAC,eAA0C,EAAA;QAC5E,MAAM,OAAO,GAAmD,EAAE;AAElE,QAAA,WAAW,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE;YAC1D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;AAClB,aAAA,CAAC;QACN;AAEA,QAAA,OAAO,OAAO;IAChB;IAEA,MAAM,aAAa,GAAG,OAAO,IAAY,EAAE,UAAA,GAA+C,IAAI,KAAmC;;AAE7H,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;;QAGhD,IAAI,CAAC,UAAU,EAAE;YACb,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE;QACvD;QAEA,IAAI,aAAa,GAAG,UAAU;;AAG9B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YAC3B,MAAM,aAAa,GAAG,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC;AAE/C,YAAA,IAAI;AAEF,gBAAA,WAAW,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE;AAC1D,oBAAA,IAAI,IAAI,KAAK,OAAO,EAAE;wBACpB;oBACF;oBAEA,IAAI,aAAa,EAAE;AACf,wBAAA,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE;4BACxB,OAAO,MAA8B,CAAC;wBAC1C;6BAAO;AACH,4BAAA,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAA,oCAAA,CAAsC,CAAC;wBACxE;oBACJ;AAAO,yBAAA,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE;AACpC,wBAAA,aAAa,GAAG,MAAmC,CAAC;oBACxD;yBAAO;AACH,wBAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,OAAO,CAAA,CAAA,CAAG,CAAC;oBACxD;gBACF;YACF;YAAE,OAAO,GAAG,EAAE;gBACV,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE;AACtD,oBAAA,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAA,iBAAA,CAAmB,CAAC;gBACrD;qBAAO;AACH,oBAAA,MAAM,GAAG;gBACb;YACJ;QACJ;AAEA,QAAA,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAA,wBAAA,CAA0B,CAAC;AAC5D,IAAA,CAAC;IAED,eAAe,eAAe,CAAC,IAAY,EAAA;AAEzC,QAAA,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;AACjD,QAAA,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE;AAC5C,QAAA,OAAO,IAAI;IAEb;AAEA,IAAA,MAAM,cAAc,GAAG;AACtB,QAAA,SAAS,EAAE,MAAM;AACjB,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,OAAO,EAAE,GAAG;AACZ,QAAA,QAAQ,EAAE,GAAG;AACb,QAAA,SAAS,EAAE,GAAG;AACd,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,QAAQ,EAAE,YAAY;KACb;AAEV,IAAA,SAAS,KAAK,GAAA;QACb,IAAI,OAAO,SAAS,KAAK,WAAW;AAAE,YAAA,OAAO,KAAK;QAClD,IAAI,CAAC,SAAS,CAAC,SAAS;AAAE,YAAA,OAAO,KAAK;QACtC,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;IACpD;IAEA,MAAM,eAAe,GAAG,CAAC,SAAiB,EAAE,KAAa,EAAE,MAAiC,KAAI;AAC/F,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC;AACjE,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,MAAiC,EAAE,MAAyC,KAAI;;QAErG,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM;QAC1C,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CACpB,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,QAAQ,EACf,KAAK,GAAG,MAAM,CAAC,SAAS,CACxB;QACD,IACC,MAAM,CAAC,OAAO;YACd,MAAM,CAAC,OAAO,GAAG,CAAC;AAClB,YAAA,MAAM,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI;YAEtD,MAAM,GAAG,IAAI,CAAC,GAAG,CAChB,MAAM,EACN,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,CACnD;AACF,QAAA,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU;YACtB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AAExE,QAAA,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;;;;;;;;;;;;;;;AAgB7E,QAAA,IAAI,MAAM,IAAI,CAAC,EAAE;YAChB,MAAM,GAAG,CAAC;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC;QAC/D;QAEA,IAAI,KAAK,EAAE,IAAI,MAAM,GAAG,OAAO,GAAG,SAAS,EAAE;YAC5C,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,MAAM,EAAE,OAAO,CAAC;AAChG,YAAA,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC;QAClF;AAEA,QAAA,OAAO,MAAM;AACd,IAAA,CAAC;AAEA;;AAEE;IACF,MAAM,QAAQ,GAAG,CAAC,SAA0B,EAAE,UAA2B,EAAE,MAA2B,KAAI;QACzG,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;YAEzC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM;AACpD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC,CAAC;;YAG7D,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC;AACtC,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,MAAM,CAAC,4BAA4B,CAAC;YAErD,MAAM,SAAS,GAAsB,EAAE;AACvC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;AAChE,YAAA,IAAI,KAAK,GAAG,EAAE;AACd,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;;AAE5B,gBAAA,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC;AAC1B,gBAAA,IAAI,QAAQ,IAAI,SAAS,CAAC,MAAM,EAAE;;oBAE9B;gBACJ;AAEA,gBAAA,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,GAAG,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAEnE,gBAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC;AAEhF,gBAAA,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,GAAG,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,GAAG,oBAAoB,CAAC;gBAEjH,SAAS,CAAC,IAAI,CAAC;AACX,oBAAA,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC;oBACpE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;AACrC,oBAAA,MAAM,EAAE;AACX,iBAAA,CAAC;YACN;;YAGA,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;AAC3C,YAAA,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,MAAM,CAAC,iCAAiC,CAAC;AAE9D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;;AAGzC,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC;AAC5D,gBAAA,MAAM,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC;;AAErE,gBAAA,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAEtD;AACJ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAEC;;AAEG;AACH,IAAA,MAAM,cAAc,GAAG,CAAC,aAAwB,EAAE,cAAyB,KAAK;QAC9E,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,GAAG,cAAc,CAAC,KAAK;QAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AAE3C,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI;AAC/B,QAAA,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI;AAEjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;AAC3C,gBAAA,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,IAAI,CAAC;gBAC7C,IAAI,MAAM,GAAG,CAAC;gBACd,IAAI,OAAO,GAAG,CAAC;gBACf,IAAI,aAAa,GAAG,CAAC;gBACrB,IAAI,IAAI,GAAG,CAAC;gBACZ,IAAI,IAAI,GAAG,CAAC;gBACZ,IAAI,IAAI,GAAG,CAAC;gBACZ,IAAI,IAAI,GAAG,CAAC;AACZ,gBAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO;gBAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC;gBACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC;gBAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC;gBACxC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC;AAE5E,gBAAA,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE;AACxC,oBAAA,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,YAAY;AAC/C,oBAAA,IAAI,QAAQ,GAAG,CAAC,GAAG,OAAO;AAC1B,oBAAA,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACjB,oBAAA,KAAK,IAAI,EAAE,GAAG,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE;AACxC,wBAAA,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,YAAY;AAC/C,wBAAA,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC/B,wBAAA,IAAI,CAAC,IAAI,CAAC,EAAE;;4BAER;wBACJ;;AAEA,wBAAA,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACtC,wBAAA,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC;;wBAE/C,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;wBAChC,aAAa,IAAI,MAAM;;AAEvB,wBAAA,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;4BACrB,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;AAC3C,wBAAA,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;wBAC5B,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;wBAChC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;wBAChC,OAAO,IAAI,MAAM;oBACrB;gBACJ;AACA,gBAAA,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,OAAO;gBAC1B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO;gBAC9B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,OAAO;gBAC9B,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,aAAa;YACxC;QACJ;AACJ,IAAA,CAAC;AAEA;;AAEE;IACF,MAAM,YAAY,GAAG,CAAC,SAA0B,EAAE,UAA2B,EAAE,MAA+C,KAAI;AACjI,QAAA,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,mBAAmB,GAAG,CAAC,IAAI,MAAM,EAAE,SAAS,KAAK,gBAAgB,EAAE;;YAEpG,OAAO,QAAQ,CAAC,SAAS,EAAE,UAAkB,CAAC;QAClD;aAAO;;AAEH,YAAA,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC;AACvE,YAAA,cAAc,CAAC,UAAU,EAAE,WAAW,CAAC;AACvC,YAAA,UAAU,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D;QACJ;AACF,IAAA,CAAC;AAGD,IAAA,eAAe,wBAAwB,CAAC,MAAuB,EAAE,MAA2D,EAAA;QAC3H,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK;QAE/C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAEjH,QAAA,QAAQ,MAAM,CAAC,SAAS;YACvB,KAAK,SAAS,EAAE;gBACf,MAAM,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAiF,CAAC;gBACrH;YACD;YAAE,KAAK,gBAAgB,EAAE;AACxB,gBAAA,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;AAChE,gBAAA,cAAc,CAAC,UAAU,EAAE,WAAW,CAAE;AACxC,gBAAA,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;gBACzD;YACD;YAAE,KAAK,UAAU,EAAE;;;;gBAIlB;YACD;YAAE,SAAS;gBACV,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC7E;YACD;;AAGD,QAAA,OAAO,MAAM;IACd;AAEA,IAAA,MAAM,kBAAkB,GAAG,CAAC,GAAwC,KAAI;AACvE,QAAA,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAE/D;cACG,UAAU,CAAC,IAAI;AACjB,cAAE,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAEhD,QAAA,OAAO,IAAI;AACZ,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,MAAuB,EAAE,MAAuB,KAAI;QACzE,MAAM,UAAU,GAAG;cAChB,UAAU,CAAC,IAAI;AACjB,cAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAClD,MAAM,WAAW,GAAG;cACjB,UAAU,CAAC,IAAI;cACf,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;AAE/C,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW;AAAE,YAAA,MAAM,KAAK,CAAC,qGAAqG,CAAC;AAEnJ,QAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE;AACnC,IAAA,CAAC;AAED,IAAA,eAAe,cAAc,CAAC,QAAgB,EAAE,IAAU,EAAA;;QAExD,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE;;AAGzD,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACpD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;QAChE;;QAGA,IAAI,gBAAgB,GAAG,UAAU;AACjC,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC5B,YAAA,gBAAgB,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3F;;AAGA,QAAA,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;AAGnF,QAAA,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE;AACxD,QAAA,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,QAAA,MAAM,cAAc,CAAC,KAAK,EAAE;IAC9B;IAGA,MAAM,WAAW,GAAG,OAAO,QAAgB,EAAE,KAAa,EAAE,MAAc,KAAI;QAE5E,OAAO,CAAC,GAAG,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAC,CAAC;AAEtC,QAAA,MAAM,MAAM,GAA8B;AACxC,YAAA,GAAG,cAAc;AACjB,YAAA,SAAS,EAAE,gBAAyB;AACpC,YAAA,QAAQ,EAAE,YAAY;AACtB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,SAAS,EAAE,MAAM;SAClB;QAED,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE;;AAGzD,QAAA,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,UAAU,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC;AACV,YAAA,OAAO,EAAE,sBAAsB;YAC/B;AACD,SAAA,CAAC;AAEF,QAAA,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC;AAE5C,QAAA,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC;AAEjD,QAAA,IAAI,UAA2B;AAE/B,QAAA,IAAI,KAAK,EAAE,IAAI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,QAAQ,EAAE;AAChE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5E,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,8DAAA,CAAgE,CAAC;YAC7E,UAAU,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YAC/G,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC;QAChG;aAAO;AACL,YAAA,UAAU,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC;AACvE,YAAA,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D;QAEA,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC;QAChE;QAEA,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC;QAElD,IAAI,CAAC,QAAQ,EAAC;AACX,YAAA,MAAM,KAAK,CAAC,CAAA,mCAAA,EAAsC,QAAQ,CAAA,EAAA,CAAI,CAAC;QACjE;AAED,QAAA,OAAO,MAAM,CAAC,aAAa,IAAI,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE;YAChE,IAAI,MAAM,CAAC,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAA,0DAAA,EAA6D,UAAU,CAAC,KAAK,CAAA,CAAE,CAAC;AAC9G,YAAA,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC;QAC5C;AAEA,QAAA,IAAI,UAAU,CAAC,KAAK,GAAG,QAAQ,EAAE;YAChC,IAAI,MAAM,CAAC,KAAK;AAAE,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,gDAAA,EAAmD,MAAM,CAAC,SAAS,CAAA,MAAA,EAAS,UAAU,CAAC,KAAK,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAC;AAC5I,YAAA,UAAU,GAAG,MAAM,wBAAwB,CAC1C,UAAU,EACV,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAChD;QACF;AAEA,QAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE;AAC7B,YAAA,OAAO,UAAU;QAClB;QACA,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAErG,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACxC,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,EAAE;QACnC,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,KAAK,CAAC,2CAA2C,CAAC;QAC1D;AACA,QAAA,MAAM,WAAW,GAAG;AAClB,YAAA,GAAG,YAAY;YACf,KAAK;SACN;QACD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QACzC,MAAM,WAAW,GAAG,CAAA,EAAG,aAAa,CAAC,CAAC,CAAC,OAAO;QAC9C,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AACxC,QAAA,MAAM,WAAW,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,WAAW,EAAE;;AAGlD,QAAA,MAAM,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC;QAC9C,UAAU,CAAC,WAAW,CAAC;AACrB,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,QAAQ,EAAE,WAAW;AACtB,SAAA,CAAC;AAEJ,IAAA,CAAC;AAED,IAAA,SAAS,GAAG,OAAO,CAAC,KAAI;AACtB,QAAA,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI;QACjD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,CAAC,GAAG,GAAG,MAAK,EAAE,CAAC;QACxB;QACA,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,IAAI,CAAC;QAC9C,MAAM,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;AAC1C,QAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,QAAQ,CAAC;AAC7C,IAAA,CAAC;AACD,CAAC,CAAC,QAAQ,EACV;IACI;;ACvfJ,MAAMA,QAAM,GAAG,KAAK,CAAC,sCAAsC,CAAC;MAG/C,YAAY,CAAA;AAKvB,IAAA,WAAA,GAAA;AAHQ,QAAA,IAAA,CAAA,cAAc,GAAwB,IAAI,GAAG,EAAE;AAIrD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,eAAe,CACjD,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,wBAAwB,EAAE,CAAC,CAC5D;IACH;IAES,MAAM,MAAM,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAoB,EAAA;QAEhE,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;YACrD,WAAW,EAAE,SAAS,EAAE;AACxB,YAAAA,QAAM,CAAC,8EAA8E,EAAE,QAAQ,CAAC;AAChG,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;QACtC;QAEA,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAE7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;QAEzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,KAAI;AACvB,gBAAAA,QAAM,CAAC,6CAA6C,EAAE,CAAC,CAAC,IAAI,CAAC;AAC7D,gBAAA,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBACf,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;oBACrD,WAAW,EAAE,SAAS,EAAE;AACxB,oBAAAA,QAAM,CAAC,kEAAkE,EAAE,QAAQ,CAAC;AACpF,oBAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;AACpC,oBAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjB;AAEA,gBAAA,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;AAChB,oBAAA,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBACtB;AACF,YAAA,CAAC;YAED,MAAM,CAAC,WAAW,CAAC;gBACjB,QAAQ;gBACR,KAAK;gBACL,MAAM;gBACN,KAAK,EAAEA,QAAM,CAAC,OAAO;AACtB,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEO,IAAA,MAAM,SAAS,CAAC,EAAC,KAAK,EAAE,MAAM,EAAwB,EAAA;AAE3D,QAAA,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE;QAExC,MAAM,QAAQ,GAAG,eAAe;QAChC,IAAI,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE;AACxD,YAAA,aAAa,EAAE;AAChB,SAAA,CAAC;AAEF,QAAA,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,IAAS,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;AAEtE,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,IAAS,KAAK,IAAI,CAAC,IAAI,CAAC;AAEhE,QAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,EAAE;AAEvC,QAAA,MAAM,eAAe,CAAC,oBAAoB,CAAC,QAAQ,CAAC;AAEpD,QAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAClC,YAAA,MAAM,kBAAkB,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAC;YACvF,IAAI,CAAC,kBAAkB,EAAE;AACvB,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,EAAC,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAC,CAAC;YAC1E;QACF;IAGF;AACD;;AC9ED,MAAM,MAAM,GAAG,KAAK,CAAC,qCAAqC,CAAC;AAE3D,MAAM,WAAY,SAAQ,eAAe,CAAA;IAGvC,aAAa,KAAK,GAAA;AAChB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,UAAU,GAAG,MAAM,OAAO,aAAa,CAAC;QAC/C;QACA,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA,IAAA,OAAO,SAAS,GAAA;AACd,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AACpB,YAAA,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC;QAC/F;QACA,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA,IAAA,aAAa,qBAAqB,CAAE,IAAY,EAAA;QAE9C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9C,IAAK,UAAU,EAAG;YAChB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtC,YAAA,OAAO,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QAClC;IACF;AAEA,IAAA,aAAa,oBAAoB,CAAC,UAAmB,EAAA;AAEnD,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;QAChC,MAAM,EAAC,SAAS,EAAC,GAAG,MAAM,OAAO,YAAY,CAAC;AAC9C,QAAA,MAAM,EAAC,eAAe,EAAC,GAAG,KAAK;QAE/B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE;;;;;;;;;;;AAWrD,QAAA,MAAM,eAAe,CAAC;AACpB,YAAA,OAAO,EAAE,SAAS;YAClB,MAAM;AACP,SAAA,CAAC;;IAEJ;IAEA,aAAa,gBAAgB,CAAE,EACE,cAAc,EACd,WAAW,EACX,oBAAoB,GACG,EAAA;AACtD,QAAA,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE;AAC3C,QAAA,MAAM,cAAc,CAAC,WAAW,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACzF;IAEA,aAAa,WAAW,CAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAqB,EAAA;AACtE,QAAA,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE;AACvC,QAAA,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACxD;IAEA,aAAa,eAAe,CAAE,EAAE,KAAK,EAAE,MAAM,EAAyB,EAAA;AACpE,QAAA,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE;QACvC,MAAM,YAAY,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACjD;AAEA,IAAA,aAAa,UAAU,CAAC,QAAgB,EAAA;AACtC,QAAA,IAAI;AACF,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;AAChC,YAAA,MAAM,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;AAC3D,YAAA,OAAO,IAAI;QACb;QAAE,OAAO,KAAU,EAAE;;AAEnB,YAAA,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,KAAK,EAAE,KAAK,KAAK,EAAE,EAAE;AACnD,gBAAA,OAAO,KAAK;YACd;;AAEA,YAAA,MAAM,KAAK;QACb;IACF;AAEA,IAAA,aAAa,oBAAoB,CAAC,QAAgB,EAAA;QAChD,IAAI,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE;AACtC,YAAA,IAAI;AACF,gBAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;AAChC,gBAAA,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC3D;YAAE,OAAO,KAAK,EAAE;;gBAEd,MAAM,CAAC,qDAAqD,CAAC;YAC/D;QACF;IACF;AAEA;;;;;;AAMG;IACH,aAAa,WAAW,CAAC,QAAgB,EAAE,QAAA,GAAmB,IAAI,EAAE,OAAA,GAAkB,KAAK,EAAA;;;QAIzF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAElD,IAAI,UAAU,EAAE;AACd,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;YAE5B,IAAI,MAAM,GAAG,KAAK;YAElB,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,OAAO,IAAI,KAAI;AAC/D,gBAAA,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC;gBAC/B,IAAI,MAAM,EAAE;oBACV;gBACF;gBACA,MAAM,GAAG,IAAI;;;;;;;gBAQb,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAClD,IAAI,UAAU,EAAE;AACd,oBAAA,IAAI,EAAE;oBACN,OAAO,CAAC,IAAI,CAAC;gBACf;gBAEA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE;AACrC,oBAAA,IAAI,EAAE;AACN,oBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBAC9D;gBACA,MAAM,GAAG,KAAK;YAChB,CAAC,EAAE,QAAQ,CAAC;YAEZ,kBAAkB,CAAC,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgD5B,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;;;AAOG;IACH,aAAa,sBAAsB,CAAC,QAAgB,EAAE,QAAA,GAAmB,GAAG,EAAE,OAAA,GAAkB,IAAI,EAAA;;QAElG,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;;QAGnD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE;YAC5B,IAAI,MAAM,GAAG,KAAK;YAElB,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,OAAO,IAAI,KAAI;AAC/D,gBAAA,MAAM,CAAC,wBAAwB,EAAE,QAAQ,CAAC;gBAC1C,IAAI,MAAM,EAAE;oBACV;gBACF;gBACA,MAAM,GAAG,IAAI;AAEb,gBAAA,IAAI;;oBAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC1C,oBAAA,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;AACjB,wBAAA,IAAI,EAAE;wBACN,OAAO,CAAC,IAAI,CAAC;wBACb;oBACF;;gBAEF;gBAAE,OAAO,KAAU,EAAE;;oBAEnB,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC;AACpD,oBAAA,IACE,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChC,wBAAA,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC/B,wBAAA,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC5B,wBAAA,YAAY,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAC3C;yBAEK;;AAEL,wBAAA,IAAI,EAAE;wBACN,MAAM,CAAC,KAAK,CAAC;wBACb;oBACF;gBACF;gBAEA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE;AACrC,oBAAA,IAAI,EAAE;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,QAAQ,CAAA,gBAAA,CAAkB,CAAC,CAAC;oBACxF;gBACF;gBACA,MAAM,GAAG,KAAK;YAChB,CAAC,EAAE,QAAQ,CAAC;YAEZ,kBAAkB,CAAC,KAAK,EAAE;AAC5B,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,aAAa,QAAQ,CAAC,QAAgB,EAAE,OAAoC,EAAA;AAC1E,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;;AAGhC,QAAA,IAAI,YAAiC;AACrC,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,YAAY,GAAG,OAAO;QACxB;AAAO,aAAA,IAAI,OAAO,YAAY,IAAI,EAAE;AAClC,YAAA,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE;AAC/C,YAAA,YAAY,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC;QAC5C;AAAO,aAAA,IAAI,OAAO,YAAY,WAAW,EAAE;AACzC,YAAA,YAAY,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC;QACxC;aAAO;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;QAC7C;QAEA,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC;QAC7C,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuCxD;AAEA,IAAA,OAAO,YAAY,CAAC,QAAgB,EAAE,OAAoC,EAAA;;;;AAIxE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;;AAG9B,QAAA,IAAI,YAAiC;AACrC,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;YAC/B,YAAY,GAAG,OAAO;QACxB;AAAO,aAAA,IAAI,OAAO,YAAY,IAAI,EAAE;;AAElC,YAAA,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC;QACxH;AAAO,aAAA,IAAI,OAAO,YAAY,WAAW,EAAE;AACzC,YAAA,YAAY,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC;QACxC;aAAO;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;QAC7C;AAEA,QAAA,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC;IAC7C;AAEA,IAAA,aAAa,QAAQ,CAAC,QAAgB,EAAA;AACpC,QAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;QAChC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACpD,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;IA2BnD;IAEA,OAAO,YAAY,CAAC,QAAgB,EAAA;;;;AAIlC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC;AACzC,QAAA,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC;IACnD;AAEA,IAAA,aAAa,gBAAgB,CAAC,QAAgB,EAAA;AAC5C,QAAA,IAAI;;YAGF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC1C,YAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE;;AAG5C,YAAA,OAAO,IAAI,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC;QAChC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3E,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,YAAY,CAAA,CAAE,CAAC;AACzD,YAAA,MAAM,KAAK;QACb;IACF;AAEA,IAAA,aAAa,gBAAgB,CAAC,QAAgB,EAAA;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;AAClD,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB;IAEA,OAAO,gBAAgB,CAAC,QAAgB,EAAA;AACtC,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC/B;IAEA,OAAO,mBAAmB,CAAC,QAAgB,EAAA;AACzC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC;AAEA,IAAA,OAAO,aAAa,GAAA;AAClB,QAAA,OAAO,IAAI;IACb;;AAzZe,WAAA,CAAA,UAAU,GAAQ,IAAI;AA+ZvC,MAAM,kBAAkB,CAAA;IAIpB,WAAA,CAAoB,IAAe,EAAU,QAAgB,EAAA;QAAzC,IAAA,CAAA,IAAI,GAAJ,IAAI;QAAqB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAH7C,IAAA,CAAA,UAAU,GAAkB,IAAI;QAChC,IAAA,CAAA,0BAA0B,GAA2B,IAAI;IAED;IAEhE,KAAK,GAAA;QACD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,YAAW;AAC5C,YAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE;;AAEjC,gBAAA,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE;YAC3C;;AAGA,YAAA,IAAI,CAAC,0BAA0B,GAAG,IAAI,eAAe,EAAE;AACvD,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM;AAErD,YAAA,IAAI;AACA,gBAAA,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAC3C;YAAE,OAAO,KAAK,EAAE;gBACZ,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;oBAChE,MAAM,CAAC,6BAA6B,CAAC;gBACvC;qBAAO;AACL,oBAAA,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC;gBACrC;gBACA,IAAI,CAAC,IAAI,EAAE;YACf;AACJ,QAAA,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;IACrB;IAEQ,MAAM,oBAAoB,CAAC,MAAmB,EAAA;AACpD,QAAA,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAClC,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,IAAI,YAAY,CAAC,kBAAkB,EAAE,YAAY,CAAC;QAC5D;IACF;IAEA,IAAI,GAAA;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE;AAC1B,YAAA,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9B,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;QAC1B;AACA,QAAA,IAAI,IAAI,CAAC,0BAA0B,EAAE;AACjC,YAAA,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE;QAC3C;IACJ;AACH;;;;"}