fundus 0.29.0 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/build/client/_app/immutable/chunks/CE3cWlK6.js +1 -0
  2. package/build/client/_app/immutable/chunks/CE3cWlK6.js.br +0 -0
  3. package/build/client/_app/immutable/chunks/CE3cWlK6.js.gz +0 -0
  4. package/build/client/_app/immutable/chunks/{kkVEh3_1.js → Cq3PJxJG.js} +1 -1
  5. package/build/client/_app/immutable/chunks/Cq3PJxJG.js.br +2 -0
  6. package/build/client/_app/immutable/chunks/Cq3PJxJG.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{BCmR1_e0.js → Wk7WcyQU.js} +1 -1
  8. package/build/client/_app/immutable/chunks/Wk7WcyQU.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/Wk7WcyQU.js.gz +0 -0
  10. package/build/client/_app/immutable/entry/{app.DCXSqiQ1.js → app.Dit62aNJ.js} +2 -2
  11. package/build/client/_app/immutable/entry/app.Dit62aNJ.js.br +0 -0
  12. package/build/client/_app/immutable/entry/app.Dit62aNJ.js.gz +0 -0
  13. package/build/client/_app/immutable/entry/start.CCBu6ABN.js +1 -0
  14. package/build/client/_app/immutable/entry/start.CCBu6ABN.js.br +0 -0
  15. package/build/client/_app/immutable/entry/start.CCBu6ABN.js.gz +0 -0
  16. package/build/client/_app/immutable/nodes/{0.CsqkK05g.js → 0.DnyKXqLr.js} +1 -1
  17. package/build/client/_app/immutable/nodes/0.DnyKXqLr.js.br +0 -0
  18. package/build/client/_app/immutable/nodes/0.DnyKXqLr.js.gz +0 -0
  19. package/build/client/_app/immutable/nodes/{1.BVSXvtU9.js → 1.Cz-4S6LF.js} +1 -1
  20. package/build/client/_app/immutable/nodes/1.Cz-4S6LF.js.br +0 -0
  21. package/build/client/_app/immutable/nodes/1.Cz-4S6LF.js.gz +0 -0
  22. package/build/client/_app/immutable/nodes/{2.BJEXWmrT.js → 2.C75-hsCY.js} +1 -1
  23. package/build/client/_app/immutable/nodes/2.C75-hsCY.js.br +0 -0
  24. package/build/client/_app/immutable/nodes/2.C75-hsCY.js.gz +0 -0
  25. package/build/client/_app/immutable/nodes/{3.BDMmDyL1.js → 3.4pSddugU.js} +1 -1
  26. package/build/client/_app/immutable/nodes/3.4pSddugU.js.br +0 -0
  27. package/build/client/_app/immutable/nodes/3.4pSddugU.js.gz +0 -0
  28. package/build/client/_app/immutable/nodes/{4.dd49_qQE.js → 4.KoQxJEWQ.js} +1 -1
  29. package/build/client/_app/immutable/nodes/4.KoQxJEWQ.js.br +0 -0
  30. package/build/client/_app/immutable/nodes/4.KoQxJEWQ.js.gz +0 -0
  31. package/build/client/_app/version.json +1 -1
  32. package/build/client/_app/version.json.br +0 -0
  33. package/build/client/_app/version.json.gz +0 -0
  34. package/build/handler.js +7 -7
  35. package/build/index.js +7 -7
  36. package/build/server/chunks/chunks/{context.js-DFZgDxCD.js → context.js-BR2IRl9z.js} +52 -24
  37. package/build/server/chunks/chunks/context.js-BR2IRl9z.js.map +1 -0
  38. package/build/server/chunks/chunks/{contract.js-DGZXpcNX.js → contract.js-DHeIVVv8.js} +44 -10
  39. package/build/server/chunks/chunks/contract.js-DHeIVVv8.js.map +1 -0
  40. package/build/server/chunks/chunks/{exports.js-BsVKSGJk.js → exports.js-CNZgoxR0.js} +2 -2
  41. package/build/server/chunks/chunks/{exports.js-BsVKSGJk.js.map → exports.js-CNZgoxR0.js.map} +1 -1
  42. package/build/server/chunks/chunks/{http.js-BQhjMaW9.js → http.js-dk5jbOFm.js} +2 -2
  43. package/build/server/chunks/chunks/{http.js-BQhjMaW9.js.map → http.js-dk5jbOFm.js.map} +1 -1
  44. package/build/server/chunks/chunks/{internal.js-DJGcNryj.js → internal.js-DlRiYJji.js} +3 -3
  45. package/build/server/chunks/chunks/{internal.js-DJGcNryj.js.map → internal.js-DlRiYJji.js.map} +1 -1
  46. package/build/server/chunks/chunks/internal2.js-BlXt2rfE.js.map +1 -1
  47. package/build/server/chunks/chunks/{raw-reconciliation2.js-CMpUvuMd.js → raw-reconciliation.js-Cco4r8lr.js} +51 -17
  48. package/build/server/chunks/chunks/raw-reconciliation.js-Cco4r8lr.js.map +1 -0
  49. package/build/server/chunks/chunks/{raw-reconciliation.js-D2sI2C-t.js → raw-reconciliation2.js-CuYSsYTP.js} +2 -2
  50. package/build/server/chunks/chunks/raw-reconciliation2.js-CuYSsYTP.js.map +1 -0
  51. package/build/server/chunks/chunks/{shared.js-BtmYg0tL.js → shared.js-C6qC0jnA.js} +2 -2
  52. package/build/server/chunks/chunks/{shared.js-BtmYg0tL.js.map → shared.js-C6qC0jnA.js.map} +1 -1
  53. package/build/server/chunks/chunks/{utils.js-CqXk0Ug6.js → utils.js-BZ32hXFI.js} +3 -3
  54. package/build/server/chunks/chunks/{utils.js-CqXk0Ug6.js.map → utils.js-BZ32hXFI.js.map} +1 -1
  55. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-DKGD9Jk2.js → _server.ts.js-8jGLP2Aj.js} +4 -4
  56. package/build/server/chunks/entries/endpoints/api/_...path_/{_server.ts.js-DKGD9Jk2.js.map → _server.ts.js-8jGLP2Aj.js.map} +1 -1
  57. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-C1UfF0EO.js → _server.ts.js-BOW9Ejim.js} +5 -5
  58. package/build/server/chunks/entries/endpoints/api/assets/_id_/{_server.ts.js-C1UfF0EO.js.map → _server.ts.js-BOW9Ejim.js.map} +1 -1
  59. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-DpASkk00.js → _server.ts.js-Clac8atJ.js} +5 -5
  60. package/build/server/chunks/entries/endpoints/api/assets/_id_/raw/{_server.ts.js-DpASkk00.js.map → _server.ts.js-Clac8atJ.js.map} +1 -1
  61. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-C3jU2vC8.js → _server.ts.js-EdHTA-SO.js} +5 -5
  62. package/build/server/chunks/entries/endpoints/api/assets/_id_/reimport/{_server.ts.js-C3jU2vC8.js.map → _server.ts.js-EdHTA-SO.js.map} +1 -1
  63. package/build/server/chunks/entries/endpoints/api/assets/_id_/retag/{_server.ts.js-B7OwufF3.js → _server.ts.js-ZBCRgRYi.js} +5 -5
  64. package/build/server/chunks/entries/endpoints/api/assets/_id_/retag/{_server.ts.js-B7OwufF3.js.map → _server.ts.js-ZBCRgRYi.js.map} +1 -1
  65. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-COhg1nYk.js → _server.ts.js-DY_e5K6d.js} +5 -5
  66. package/build/server/chunks/entries/endpoints/api/assets/{_server.ts.js-COhg1nYk.js.map → _server.ts.js-DY_e5K6d.js.map} +1 -1
  67. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-DAEE17eM.js → _server.ts.js-Cl2jxJNi.js} +5 -5
  68. package/build/server/chunks/entries/endpoints/api/assets/delete/{_server.ts.js-DAEE17eM.js.map → _server.ts.js-Cl2jxJNi.js.map} +1 -1
  69. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-BrZSS4gm.js → _server.ts.js-DrrZWUbd.js} +5 -5
  70. package/build/server/chunks/entries/endpoints/api/assets/move/{_server.ts.js-BrZSS4gm.js.map → _server.ts.js-DrrZWUbd.js.map} +1 -1
  71. package/build/server/chunks/entries/endpoints/api/events/{_server.ts.js-Cfst-Brd.js → _server.ts.js-Bnw0HbEk.js} +5 -5
  72. package/build/server/chunks/entries/endpoints/api/events/{_server.ts.js-Cfst-Brd.js.map → _server.ts.js-Bnw0HbEk.js.map} +1 -1
  73. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-aN_h2Ifo.js → _server.ts.js-NeVn2ap9.js} +5 -5
  74. package/build/server/chunks/entries/endpoints/api/folders/_path_/{_server.ts.js-aN_h2Ifo.js.map → _server.ts.js-NeVn2ap9.js.map} +1 -1
  75. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CX2A66ij.js → _server.ts.js-ENGDgoLy.js} +5 -5
  76. package/build/server/chunks/entries/endpoints/api/folders/{_server.ts.js-CX2A66ij.js.map → _server.ts.js-ENGDgoLy.js.map} +1 -1
  77. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CwTiaheP.js → _server.ts.js-BQVGCzBR.js} +5 -5
  78. package/build/server/chunks/entries/endpoints/api/imports/{_server.ts.js-CwTiaheP.js.map → _server.ts.js-BQVGCzBR.js.map} +1 -1
  79. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-fIbsr_2e.js → _server.ts.js-Pxver0Y-.js} +5 -5
  80. package/build/server/chunks/entries/endpoints/api/manifests/_name_/{_server.ts.js-fIbsr_2e.js.map → _server.ts.js-Pxver0Y-.js.map} +1 -1
  81. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-Dvo1bsLi.js → _server.ts.js-DYtiqzJq.js} +5 -5
  82. package/build/server/chunks/entries/endpoints/api/manifests/{_server.ts.js-Dvo1bsLi.js.map → _server.ts.js-DYtiqzJq.js.map} +1 -1
  83. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-VLg1G3mN.js → _server.ts.js-lBgmEZHV.js} +5 -5
  84. package/build/server/chunks/entries/endpoints/api/raw/adopt/{_server.ts.js-VLg1G3mN.js.map → _server.ts.js-lBgmEZHV.js.map} +1 -1
  85. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-DqctsOop.js → _server.ts.js-BJHyONFH.js} +5 -5
  86. package/build/server/chunks/entries/endpoints/api/raw/edited/accept/{_server.ts.js-DqctsOop.js.map → _server.ts.js-BJHyONFH.js.map} +1 -1
  87. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-CoxSU5iO.js → _server.ts.js-Bm5XO80W.js} +5 -5
  88. package/build/server/chunks/entries/endpoints/api/raw/edited/dismiss/{_server.ts.js-CoxSU5iO.js.map → _server.ts.js-Bm5XO80W.js.map} +1 -1
  89. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-wUxsLZdr.js → _server.ts.js-B7Z20kYf.js} +5 -5
  90. package/build/server/chunks/entries/endpoints/api/reconcile/{_server.ts.js-wUxsLZdr.js.map → _server.ts.js-B7Z20kYf.js.map} +1 -1
  91. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BKsF0Oit.js → _server.ts.js-Cg-f37jc.js} +5 -5
  92. package/build/server/chunks/entries/endpoints/api/reveal/{_server.ts.js-BKsF0Oit.js.map → _server.ts.js-Cg-f37jc.js.map} +1 -1
  93. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-Dk9oOZwM.js → _server.ts.js-dIXZiq5l.js} +5 -5
  94. package/build/server/chunks/entries/endpoints/api/state/{_server.ts.js-Dk9oOZwM.js.map → _server.ts.js-dIXZiq5l.js.map} +1 -1
  95. package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-DxjNmmtL.js → _server.ts.js-CnTrS5pT.js} +5 -5
  96. package/build/server/chunks/entries/endpoints/api/usage/{_server.ts.js-DxjNmmtL.js.map → _server.ts.js-CnTrS5pT.js.map} +1 -1
  97. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DD0b38VV.js → _server.ts.js-B7TcFRuL.js} +4 -4
  98. package/build/server/chunks/entries/endpoints/files/_...path_/{_server.ts.js-DD0b38VV.js.map → _server.ts.js-B7TcFRuL.js.map} +1 -1
  99. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-DId6F2i_.js → _server.ts.js-BkUQInqW.js} +5 -5
  100. package/build/server/chunks/entries/endpoints/files/proxy/_...path_/{_server.ts.js-DId6F2i_.js.map → _server.ts.js-BkUQInqW.js.map} +1 -1
  101. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-DKKkGoK2.js → _server.ts.js-CshyvqOq.js} +5 -5
  102. package/build/server/chunks/entries/endpoints/files/raw/_...path_/{_server.ts.js-DKKkGoK2.js.map → _server.ts.js-CshyvqOq.js.map} +1 -1
  103. package/build/server/chunks/entries/{hooks.server.js-B5Ctvorj.js → hooks.server.js-D4DECjz_.js} +6 -5
  104. package/build/server/chunks/entries/hooks.server.js-D4DECjz_.js.map +1 -0
  105. package/build/server/chunks/{handler-DwVfBx6r.js → handler-Cna54zf6.js} +5 -5
  106. package/build/server/chunks/{handler-DwVfBx6r.js.map → handler-Cna54zf6.js.map} +1 -1
  107. package/build/server/chunks/{index.js-DgPuPQJn.js → index.js-BnpHWDec.js} +5 -5
  108. package/build/server/chunks/{index.js-DgPuPQJn.js.map → index.js-BnpHWDec.js.map} +1 -1
  109. package/build/server/chunks/{manifest.js-B054EcAf.js → manifest.js-9WMEOpxH.js} +31 -31
  110. package/build/server/chunks/{manifest.js-B054EcAf.js.map → manifest.js-9WMEOpxH.js.map} +1 -1
  111. package/build/server/chunks/nodes/{0.js-DoHZTmnT.js → 0.js-C2b1a672.js} +2 -2
  112. package/build/server/chunks/nodes/{0.js-DoHZTmnT.js.map → 0.js-C2b1a672.js.map} +1 -1
  113. package/build/server/chunks/nodes/1.js-P3Ai28oj.js +7 -0
  114. package/build/server/chunks/nodes/{1.js-BcPlsloO.js.map → 1.js-P3Ai28oj.js.map} +1 -1
  115. package/build/server/chunks/nodes/{2.js-5qCXkvzl.js → 2.js-sM3j5BqB.js} +2 -2
  116. package/build/server/chunks/nodes/{2.js-5qCXkvzl.js.map → 2.js-sM3j5BqB.js.map} +1 -1
  117. package/build/server/chunks/nodes/3.js-G0jV-ymM.js +7 -0
  118. package/build/server/chunks/nodes/{3.js-D6fAMX1w.js.map → 3.js-G0jV-ymM.js.map} +1 -1
  119. package/build/server/chunks/nodes/{4.js-CGkeT0SQ.js → 4.js-BUTPrI45.js} +2 -2
  120. package/build/server/chunks/nodes/{4.js-CGkeT0SQ.js.map → 4.js-BUTPrI45.js.map} +1 -1
  121. package/dist/server/concurrency.d.ts +12 -0
  122. package/dist/server/concurrency.js +23 -0
  123. package/dist/server/image-duplicates.js +6 -4
  124. package/dist/server/operations.d.ts +7 -0
  125. package/dist/server/operations.js +53 -26
  126. package/dist/server/processing/processor.d.ts +29 -1
  127. package/dist/server/processing/processor.js +42 -5
  128. package/dist/server/raw-reconciliation.js +26 -10
  129. package/package.json +1 -1
  130. package/build/client/_app/immutable/chunks/BCmR1_e0.js.br +0 -0
  131. package/build/client/_app/immutable/chunks/BCmR1_e0.js.gz +0 -0
  132. package/build/client/_app/immutable/chunks/kkVEh3_1.js.br +0 -2
  133. package/build/client/_app/immutable/chunks/kkVEh3_1.js.gz +0 -0
  134. package/build/client/_app/immutable/chunks/wBLhaPea.js +0 -1
  135. package/build/client/_app/immutable/chunks/wBLhaPea.js.br +0 -0
  136. package/build/client/_app/immutable/chunks/wBLhaPea.js.gz +0 -0
  137. package/build/client/_app/immutable/entry/app.DCXSqiQ1.js.br +0 -0
  138. package/build/client/_app/immutable/entry/app.DCXSqiQ1.js.gz +0 -0
  139. package/build/client/_app/immutable/entry/start.BOUpxuMU.js +0 -1
  140. package/build/client/_app/immutable/entry/start.BOUpxuMU.js.br +0 -0
  141. package/build/client/_app/immutable/entry/start.BOUpxuMU.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/0.CsqkK05g.js.br +0 -0
  143. package/build/client/_app/immutable/nodes/0.CsqkK05g.js.gz +0 -0
  144. package/build/client/_app/immutable/nodes/1.BVSXvtU9.js.br +0 -2
  145. package/build/client/_app/immutable/nodes/1.BVSXvtU9.js.gz +0 -0
  146. package/build/client/_app/immutable/nodes/2.BJEXWmrT.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/2.BJEXWmrT.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/3.BDMmDyL1.js.br +0 -0
  149. package/build/client/_app/immutable/nodes/3.BDMmDyL1.js.gz +0 -0
  150. package/build/client/_app/immutable/nodes/4.dd49_qQE.js.br +0 -0
  151. package/build/client/_app/immutable/nodes/4.dd49_qQE.js.gz +0 -0
  152. package/build/server/chunks/chunks/context.js-DFZgDxCD.js.map +0 -1
  153. package/build/server/chunks/chunks/contract.js-DGZXpcNX.js.map +0 -1
  154. package/build/server/chunks/chunks/raw-reconciliation.js-D2sI2C-t.js.map +0 -1
  155. package/build/server/chunks/chunks/raw-reconciliation2.js-CMpUvuMd.js.map +0 -1
  156. package/build/server/chunks/entries/hooks.server.js-B5Ctvorj.js.map +0 -1
  157. package/build/server/chunks/nodes/1.js-BcPlsloO.js +0 -7
  158. package/build/server/chunks/nodes/3.js-D6fAMX1w.js +0 -7
@@ -11,7 +11,7 @@ import { assetIdError, allDeliveredAssetIds, canonicalizeParameters, collectAllR
11
11
  import { LibraryStore } from './library-store.js';
12
12
  import { generateManifestModules, locateGeneratedAssetDeclaration, manifestModuleFileName } from './codegen.js';
13
13
  import { descriptorsByType, serverPluginForType, serverPluginsByType } from './plugins.js';
14
- import { processAssets, readCurrentProxy } from './processing/processor.js';
14
+ import { processAssets, ProxyInfoCache, readCurrentProxy } from './processing/processor.js';
15
15
  import { encodeRelativePathForUrl } from './folder-filesystem.js';
16
16
  import { classifyRawDirectory, verifyStableRawFile } from './raw-reconciliation.js';
17
17
  import { rawSafetyIssues } from './raw-safety.js';
@@ -19,6 +19,7 @@ import { serverImporters } from './importers.js';
19
19
  import { SourceImportError } from './importers/contract.js';
20
20
  import { validateFigmaSourceParameters } from './importers/figma.js';
21
21
  import { currentGitBranch, gitAssetChanges } from './git.js';
22
+ import { IO_CONCURRENCY, mapConcurrent } from './concurrency.js';
22
23
  import { FundusUsageAnalyzer, usageSnapshotRevision } from './usage.js';
23
24
  import { ImageDuplicateDetector } from './image-duplicates.js';
24
25
  /**
@@ -71,6 +72,7 @@ export class FundusOperations {
71
72
  #importers;
72
73
  #usageAnalyzer;
73
74
  #duplicateDetector = new ImageDuplicateDetector();
75
+ #proxyInfoCache = new ProxyInfoCache();
74
76
  #operationQueue = Promise.resolve();
75
77
  #pipelineQueue = Promise.resolve();
76
78
  constructor(config, registry = serverPluginsByType, importerRegistry = serverImporters) {
@@ -180,6 +182,20 @@ export class FundusOperations {
180
182
  const classification = await this.#classifyRawDirectory(library);
181
183
  return this.#snapshotState(library, classification);
182
184
  }
185
+ /**
186
+ * Fill the image-fingerprint and proxy-probe caches without scanning raws or
187
+ * joining the operation queue, so an early editor reconcile shares this
188
+ * in-flight work instead of waiting behind it. Both caches are keyed by
189
+ * content, so a concurrent mutation can only make an entry unused.
190
+ */
191
+ async warmCaches() {
192
+ const library = await this.#store.read();
193
+ const delivered = allDeliveredAssetIds(computeLibraryMembership(library, collectAllReferences(library, descriptorsByType(this.#registry))));
194
+ await Promise.all([
195
+ this.#duplicateDetector.find(library, this.#config.rawDir),
196
+ mapConcurrent([...delivered].sort(compareCodeUnits), IO_CONCURRENCY, (assetId) => this.#proxyState(assetId, library.assets[assetId], delivered))
197
+ ]);
198
+ }
183
199
  /** Reconcile only changes that are safe without a user decision: unique moves and deletions. */
184
200
  reconcileRawState() {
185
201
  return this.#enqueueOperation(async () => {
@@ -921,15 +937,42 @@ export class FundusOperations {
921
937
  state: await this.#snapshotState(latestLibrary, latestClassification, pipelineIssues)
922
938
  };
923
939
  }
940
+ async #proxyState(assetId, record, delivered) {
941
+ if (!delivered.has(assetId))
942
+ return { proxy: null };
943
+ try {
944
+ const currentProxy = await readCurrentProxy(assetId, record, this.#config, this.#registry, this.#proxyInfoCache);
945
+ if (!currentProxy) {
946
+ return {
947
+ proxy: null,
948
+ warning: 'Proxy is stale or missing — it will be (re)processed on the next save.'
949
+ };
950
+ }
951
+ return {
952
+ proxy: {
953
+ url: `/files/proxy/${encodeRelativePathForUrl(currentProxy.relativePath)}`,
954
+ upToDate: true,
955
+ ...currentProxy
956
+ }
957
+ };
958
+ }
959
+ catch (cause) {
960
+ return { proxy: null, warning: cause instanceof Error ? cause.message : String(cause) };
961
+ }
962
+ }
924
963
  async #buildState(library, issues, classification) {
925
- const [gitBranch, changedGitAssets] = await Promise.all([
926
- currentGitBranch(this.#config.projectRoot),
927
- gitAssetChanges(this.#config.projectRoot, this.#config.library, library)
928
- ]);
929
964
  const referencesByAsset = collectAllReferences(library, descriptorsByType(this.#registry));
930
- const duplicatesByAsset = await this.#duplicateDetector.find(library, this.#config.rawDir);
931
965
  const membershipByManifest = computeLibraryMembership(library, referencesByAsset);
932
966
  const delivered = allDeliveredAssetIds(membershipByManifest);
967
+ const assetIds = Object.keys(library.assets).sort(compareCodeUnits);
968
+ // Independent I/O-bound reads; run together so large libraries load in parallel.
969
+ const [gitBranch, changedGitAssets, duplicatesByAsset, proxies] = await Promise.all([
970
+ currentGitBranch(this.#config.projectRoot),
971
+ gitAssetChanges(this.#config.projectRoot, this.#config.library, library),
972
+ this.#duplicateDetector.find(library, this.#config.rawDir),
973
+ mapConcurrent(assetIds, IO_CONCURRENCY, (assetId) => this.#proxyState(assetId, library.assets[assetId], delivered))
974
+ ]);
975
+ this.#proxyInfoCache.retain(delivered);
933
976
  // Per asset: the manifests it is a passive member of, with attribution.
934
977
  const passiveManifestsByAsset = new Map();
935
978
  for (const manifestName of Object.keys(library.manifests).sort(compareCodeUnits)) {
@@ -954,7 +997,7 @@ export class FundusOperations {
954
997
  requiredByAsset.set(dependency.id, [...dependency.sources]);
955
998
  }
956
999
  const assets = [];
957
- for (const assetId of Object.keys(library.assets).sort(compareCodeUnits)) {
1000
+ for (const [index, assetId] of assetIds.entries()) {
958
1001
  const record = library.assets[assetId];
959
1002
  const warnings = [];
960
1003
  for (const issue of issues) {
@@ -971,25 +1014,9 @@ export class FundusOperations {
971
1014
  if (record.importSource && !this.#importers.has(record.importSource.importer)) {
972
1015
  warnings.push(`Importer "${record.importSource.importer}" is unavailable; the local raw file remains usable.`);
973
1016
  }
974
- let proxy = null;
975
- if (delivered.has(assetId)) {
976
- try {
977
- const currentProxy = await readCurrentProxy(assetId, record, this.#config, this.#registry);
978
- if (currentProxy) {
979
- proxy = {
980
- url: `/files/proxy/${encodeRelativePathForUrl(currentProxy.relativePath)}`,
981
- upToDate: true,
982
- ...currentProxy
983
- };
984
- }
985
- else {
986
- warnings.push('Proxy is stale or missing — it will be (re)processed on the next save.');
987
- }
988
- }
989
- catch (cause) {
990
- warnings.push(cause instanceof Error ? cause.message : String(cause));
991
- }
992
- }
1017
+ const { proxy, warning: proxyWarning } = proxies[index];
1018
+ if (proxyWarning)
1019
+ warnings.push(proxyWarning);
993
1020
  assets.push({
994
1021
  id: assetId,
995
1022
  type: record.type,
@@ -1,3 +1,19 @@
1
+ /**
2
+ * The processing pipeline: every delivered asset gets exactly one
3
+ * proxy named `<assetId>.<jobHash>.<extension>`. Delivered = explicit or
4
+ * passive member of ≥ 1 manifest (codegen inlines referenced
5
+ * entries, so a passive member's proxy must exist even when the asset is in
6
+ * no manifest itself). Because the name is computable without running the job,
7
+ * staleness is a name check: expected name exists → up to date, else →
8
+ * process. Afterwards, files in the proxy directory that no asset expects are
9
+ * pruned.
10
+ *
11
+ * Type-agnostic: every per-type decision (preset resolution, extension, the
12
+ * sharp/ffmpeg step, proxy probing) lives on the server plugins; this module
13
+ * only consults the registry — which it takes as a parameter, so tests can
14
+ * drive the pipeline with fixture asset types.
15
+ */
16
+ import { type Stats } from 'node:fs';
1
17
  import { type AssetId, type AssetRecord, type Library } from '../../core/index.js';
2
18
  import type { ResolvedFundusConfig } from '../config-loader.js';
3
19
  import type { AssetProxyInfo, ProxyOutputInfo, ServerPluginRegistry } from '../plugins/contract.js';
@@ -35,8 +51,20 @@ export declare function expectedProxyRelativePath(assetId: string, record: Asset
35
51
  * strategy: image-backed proxies via sharp, media proxies via ffprobe.
36
52
  */
37
53
  export declare function readProxyOutputInfo(record: AssetRecord, proxyPath: string, config: ResolvedFundusConfig, registry?: ServerPluginRegistry): Promise<ProxyOutputInfo>;
54
+ /**
55
+ * Probed proxy output info, reused across editor snapshots so unchanged proxies
56
+ * skip sharp and ffprobe. Proxy names are content-addressed, so an entry stays
57
+ * valid while the proxy and the raw source handed to the probe keep their stat
58
+ * identity. In-flight probes are shared, so concurrent readers never probe twice.
59
+ */
60
+ export declare class ProxyInfoCache {
61
+ #private;
62
+ read(assetId: AssetId, proxyPath: string, proxyStat: Stats, rawPath: string, probe: () => Promise<ProxyOutputInfo>): Promise<ProxyOutputInfo>;
63
+ /** Forget assets that no longer exist or are no longer delivered. */
64
+ retain(assetIds: ReadonlySet<AssetId>): void;
65
+ }
38
66
  /** Read one asset's current proxy projection, or null when its expected file is absent. */
39
- export declare function readCurrentProxy(assetId: string, record: AssetRecord, config: ResolvedFundusConfig, registry?: ServerPluginRegistry): Promise<AssetProxyInfo | null>;
67
+ export declare function readCurrentProxy(assetId: string, record: AssetRecord, config: ResolvedFundusConfig, registry?: ServerPluginRegistry, cache?: ProxyInfoCache): Promise<AssetProxyInfo | null>;
40
68
  /**
41
69
  * The delivered set: every explicit or passive member of ≥ 1 manifest —
42
70
  * derived by the shared membership computation. Assets outside
@@ -65,17 +65,54 @@ export function expectedProxyRelativePath(assetId, record, config, registry = se
65
65
  export async function readProxyOutputInfo(record, proxyPath, config, registry = serverPluginsByType) {
66
66
  return serverPluginForType(record.type, registry).readProxyInfo(proxyPath, config, join(config.rawDir, record.raw));
67
67
  }
68
+ function statIdentity(value) {
69
+ return `${value.dev}:${value.ino}:${value.size}:${value.mtimeMs}:${value.ctimeMs}`;
70
+ }
71
+ /**
72
+ * Probed proxy output info, reused across editor snapshots so unchanged proxies
73
+ * skip sharp and ffprobe. Proxy names are content-addressed, so an entry stays
74
+ * valid while the proxy and the raw source handed to the probe keep their stat
75
+ * identity. In-flight probes are shared, so concurrent readers never probe twice.
76
+ */
77
+ export class ProxyInfoCache {
78
+ #entries = new Map();
79
+ async read(assetId, proxyPath, proxyStat, rawPath, probe) {
80
+ const rawIdentity = await stat(rawPath).then(statIdentity, () => 'missing');
81
+ const identity = `${proxyPath}|${statIdentity(proxyStat)}|${rawIdentity}`;
82
+ const cached = this.#entries.get(assetId);
83
+ if (cached?.identity === identity)
84
+ return cached.info;
85
+ const entry = { identity, info: probe() };
86
+ this.#entries.set(assetId, entry);
87
+ try {
88
+ return await entry.info;
89
+ }
90
+ catch (cause) {
91
+ if (this.#entries.get(assetId) === entry)
92
+ this.#entries.delete(assetId);
93
+ throw cause;
94
+ }
95
+ }
96
+ /** Forget assets that no longer exist or are no longer delivered. */
97
+ retain(assetIds) {
98
+ for (const assetId of this.#entries.keys()) {
99
+ if (!assetIds.has(assetId))
100
+ this.#entries.delete(assetId);
101
+ }
102
+ }
103
+ }
68
104
  /** Read one asset's current proxy projection, or null when its expected file is absent. */
69
- export async function readCurrentProxy(assetId, record, config, registry = serverPluginsByType) {
105
+ export async function readCurrentProxy(assetId, record, config, registry = serverPluginsByType, cache) {
70
106
  const fileName = expectedProxyFileName(assetId, record, config, registry);
71
107
  const relativePath = expectedProxyRelativePath(assetId, record, config, registry);
72
108
  const proxyPath = join(config.proxyDir, relativePath);
73
109
  if (!existsSync(proxyPath))
74
110
  return null;
75
- const [outputInfo, proxyStat] = await Promise.all([
76
- readProxyOutputInfo(record, proxyPath, config, registry),
77
- stat(proxyPath)
78
- ]);
111
+ const proxyStat = await stat(proxyPath);
112
+ const probe = () => readProxyOutputInfo(record, proxyPath, config, registry);
113
+ const outputInfo = cache
114
+ ? await cache.read(assetId, proxyPath, proxyStat, join(config.rawDir, record.raw), probe)
115
+ : await probe();
79
116
  return { assetId, fileName, relativePath, ...outputInfo, fileSize: proxyStat.size };
80
117
  }
81
118
  /**
@@ -3,6 +3,7 @@ import { constants } from 'node:fs';
3
3
  import { lstat, open, readdir } from 'node:fs/promises';
4
4
  import { join } from 'node:path';
5
5
  import { compareCodeUnits, folderPathError, isFundusTransactionName, portableRawPathKey, rawFilePathError } from '../core/index.js';
6
+ import { IO_CONCURRENCY, mapConcurrent } from './concurrency.js';
6
7
  function objectIdentity(value) {
7
8
  return `${value.dev}:${value.ino}:${value.mode}`;
8
9
  }
@@ -58,6 +59,8 @@ export async function scanRawDirectory(rawDir, includeFile = () => true) {
58
59
  const occupiedPaths = new Set();
59
60
  const entryKinds = new Map();
60
61
  const ignoredRegularPaths = [];
62
+ const pendingHashes = [];
63
+ const visitedDirectories = [];
61
64
  let complete = true;
62
65
  function markIncomplete(path, reason) {
63
66
  complete = false;
@@ -112,15 +115,7 @@ export async function scanRawDirectory(rawDir, includeFile = () => true) {
112
115
  blockers.push({ path, reason: problem });
113
116
  continue;
114
117
  }
115
- try {
116
- files.push({ path, hash: await stableRawFileHash(join(rawDir, path)) });
117
- }
118
- catch (cause) {
119
- blockers.push({
120
- path,
121
- reason: `Could not obtain a stable file hash: ${cause instanceof Error ? cause.message : String(cause)}`
122
- });
123
- }
118
+ pendingHashes.push(path);
124
119
  continue;
125
120
  }
126
121
  const kind = entry.isSymbolicLink() ? 'symlink' : 'special';
@@ -128,6 +123,28 @@ export async function scanRawDirectory(rawDir, includeFile = () => true) {
128
123
  entryKinds.set(path, kind);
129
124
  blockers.push({ path, reason: 'Symlinks and special files are not supported.' });
130
125
  }
126
+ visitedDirectories.push({ folder, absolutePath, before });
127
+ }
128
+ await visit('');
129
+ // Hashing dominates the scan, so it runs concurrently once the tree is known.
130
+ // Every hash verifies its own file, and directory identities are re-checked
131
+ // only afterwards so that check still spans the whole scan.
132
+ const hashes = await mapConcurrent(pendingHashes, IO_CONCURRENCY, async (path) => {
133
+ try {
134
+ return { hash: await stableRawFileHash(join(rawDir, path)) };
135
+ }
136
+ catch (cause) {
137
+ return { error: cause instanceof Error ? cause.message : String(cause) };
138
+ }
139
+ });
140
+ pendingHashes.forEach((path, index) => {
141
+ const result = hashes[index];
142
+ if (result.hash !== undefined)
143
+ files.push({ path, hash: result.hash });
144
+ else
145
+ blockers.push({ path, reason: `Could not obtain a stable file hash: ${result.error}` });
146
+ });
147
+ for (const { folder, absolutePath, before } of visitedDirectories) {
131
148
  try {
132
149
  const after = await lstat(absolutePath, { bigint: true });
133
150
  if (!after.isDirectory() || objectIdentity(before) !== objectIdentity(after)) {
@@ -138,7 +155,6 @@ export async function scanRawDirectory(rawDir, includeFile = () => true) {
138
155
  markIncomplete(folder, `${folder === '' ? 'Raw directory' : `Directory "${folder}"`} changed during traversal: ${cause instanceof Error ? cause.message : String(cause)}`);
139
156
  }
140
157
  }
141
- await visit('');
142
158
  const collisions = new Map();
143
159
  for (const path of [...occupiedPaths].sort(compareCodeUnits)) {
144
160
  const key = portableRawPathKey(path);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fundus",
3
- "version": "0.29.0",
3
+ "version": "0.29.1",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,2 +0,0 @@
1
- I@ds.e{S������I���;������j ~��I�hz�+M�;Zs�/R�ed%����"M�����I����k[�ˋ�<�s�j_̯�����(#���( v�K�o�bH�T@�`��W
2
- 2(�C������S�����0�O���T
@@ -1 +0,0 @@
1
- import{H as e,U as t,V as n,it as r,nt as i,r as a,t as o,tt as s}from"./DLEDBLL1.js";var c=class{constructor(e,t){this.status=e,typeof t==`string`?this.body={message:t}:t?this.body=t:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},l=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},u=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function d(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function f(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function p(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function m({href:e}){return e.split(`#`)[0]}function h(){}function ee(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function g(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var _=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&v.delete(b(e)),_(e,t));var v=new Map;function te(e,t){let n=b(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent);r.getAttribute(`data-b64`)!==null&&(e=g(e));let i=r.getAttribute(`data-ttl`);return i&&v.set(n,{body:e,init:t,ttl:1e3*Number(i)}),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function y(e,t,n){if(v.size>0){let t=b(e,n),r=v.get(t);if(r){if(performance.now()<r.ttl&&[`default`,`force-cache`,`only-if-cached`,void 0].includes(n?.cache))return new Response(r.body,r.init);v.delete(t)}}return window.fetch(t,n)}function b(e,t){let n=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){let e=[];t.headers&&e.push([...new Headers(t.headers)].join(`,`)),t.body&&(typeof t.body==`string`||ArrayBuffer.isView(t.body))&&e.push(t.body),n+=`[data-hash="${ee(...e)}"]`}return n}var ne=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/,re=/^\/\((?:[^)]+)\)$/;function x(e){let t=[];return{pattern:e===`/`||re.test(e)?/^\/$/:RegExp(`^${ae(e).map(e=>{let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return se(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return se(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=ne.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return se(e)}).join(``)}).join(``)}/?$`),params:t}}function ie(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function ae(e){return e.slice(1).split(`/`).filter(ie)}function oe(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;e<t.length;e+=1){let s=t[e],c=i[e-o];if(s.chained&&s.rest&&o&&(c=i.slice(e-o,e+1).filter(e=>e).join(`/`),o=0),c===void 0)if(s.rest)c=``;else continue;if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function se(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}var ce=/\[(\[)?(\.\.\.)?(\w+?)(?:=(\w+))?\]\]?/g;function le(e,t){let n=ae(e),r=e!=`/`&&e.endsWith(`/`);return`/`+n.map(n=>n.replace(ce,(n,r,i,a)=>{let o=t[a];if(!o){if(r||i&&o!==void 0)return``;throw Error(`Missing parameter '${a}' in route ${e}`)}if(o.startsWith(`/`)||o.endsWith(`/`))throw Error(`Parameter '${a}' in route ${e} cannot start or end with a slash -- this would cause an invalid route like foo//bar`);return o})).filter(Boolean).join(`/`)+(r?`/`:``)}function ue({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=x(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return oe(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function de(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function fe(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_191oeer?.base??``,pe=globalThis.__sveltekit_191oeer?.assets??S??``,me=``;function he(...e){if(!e[0].startsWith(`/`))throw Error(`Cannot use \`resolve(...)\` with a non-absolute pathname or route ID (got "${e[0]}"). \`resolve\` is only for internal pathnames and route IDs; external URLs should be used directly.`);return S+me+le(e[0],e[1])}var ge=`1790767052989`,_e=`sveltekit:snapshot`,ve=`sveltekit:scroll`,ye=`sveltekit:states`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},E=location.origin;function be(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function D(){return{x:pageXOffset,y:pageYOffset}}function O(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var xe={...T,"":T.hover};function Se(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Ce(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=Se(e)}}function we(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||A(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===E&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function k(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=O(s,`preload-code`)),i===null&&(i=O(s,`preload-data`)),t===null&&(t=O(s,`keepfocus`)),n===null&&(n=O(s,`noscroll`)),a===null&&(a=O(s,`reload`)),o===null&&(o=O(s,`replacestate`)),s=Se(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:xe[r??`off`],preload_data:xe[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Te(e){let t=r(e),n=!0;function i(){n=!0,t.update(e=>e)}function a(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:i,set:a,subscribe:o}}var Ee={v:h};function De(){let{set:e,subscribe:t}=r(!1);async function n(){clearTimeout(void 0);try{let t=await fetch(`${pe}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let n=(await t.json()).version!==ge;return n&&(e(!0),Ee.v(),clearTimeout(void 0)),n}catch{return!1}}return{subscribe:t,check:n}}function A(e,t,n){return e.origin!==E||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Oe(e){}var ke=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);[...ke],[...new Set([...ke])];function Ae(e){return e.filter(e=>e!=null)}function j(e,t){return e+`/`+t}function je(e){return e instanceof c||e instanceof u?e.status:500}function Me(e){return e instanceof u?e.text:`Internal Error`}var M,N,P,Ne=a.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(a.toString()),Pe=`a:`;Ne?(M={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Pe)},N={current:null},P={current:!1}):(M=new class{#e=i({});get data(){return n(this.#e)}set data(e){s(this.#e,e)}#t=i(null);get form(){return n(this.#t)}set form(e){s(this.#t,e)}#n=i(null);get error(){return n(this.#n)}set error(e){s(this.#n,e)}#r=i({});get params(){return n(this.#r)}set params(e){s(this.#r,e)}#i=i({id:null});get route(){return n(this.#i)}set route(e){s(this.#i,e)}#a=i({});get state(){return n(this.#a)}set state(e){s(this.#a,e)}#o=i(-1);get status(){return n(this.#o)}set status(e){s(this.#o,e)}#s=i(new URL(Pe));get url(){return n(this.#s)}set url(e){s(this.#s,e)}},N=new class{#e=i(null);get current(){return n(this.#e)}set current(e){s(this.#e,e)}},P=new class{#e=i(!1);get current(){return n(this.#e)}set current(e){s(this.#e,e)}},Ee.v=()=>P.current=!0);function Fe(e){Object.assign(M,e)}var{onMount:Ie,tick:Le}=o,Re=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),F=null,I=de(`sveltekit:scroll`)??{},L=de(`sveltekit:snapshot`)??{},R={url:Te({}),page:Te({}),navigating:r(null),updated:De()};function ze(e){I[e]=D()}function Be(e,t){let n=e+1;for(;I[n];)delete I[n],n+=1;for(n=t+1;L[n];)delete L[n],n+=1}function z(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(h)}async function Ve(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var He,Ue,We,B,Ge,V,Ke={},qe={},Je=[],Ye=[],H=null;function Xe(){H?.fork?.then(e=>e?.discard()),H=null,Q={element:void 0,href:void 0}}var Ze=new Map,Qe=new Set,$e=new Set,U=new Set,W={branch:[],error:null,url:null,nav:null},et=!1,tt=!1,nt=!0,G=!1,K=!1,rt=!1,it=!1,at,q,J,Y,ot=new Set,st=new Map,ct=new Map;async function lt(e,t,n){if(globalThis.__sveltekit_191oeer.data){let{q:e={},p:t={},l:n={},f:r={}}=globalThis.__sveltekit_191oeer.data;for(let t in e)Ke[t]=e[t];for(let e in n)Ke[e]=n[e];for(let e in r)Ke[e]=r[e];for(let e in t)qe[e]=t[e]}document.URL!==location.href&&(location.href=location.href),V=e,await e.hooks.init?.(),He=ue(e),B=document.documentElement,Ge=t,Ue=e.nodes[0],We=e.nodes[1],Ue(),We(),q=history.state?.[C],J=history.state?.[w],q||(q=J=Date.now(),history.replaceState({...history.state,[C]:q,[w]:J},``));let r=I[q];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await zt(Ge,n)):(await Z({type:`enter`,url:be(V.hash?Gt(new URL(location.href)):location.href),replace_state:!0}),i()),Rt()}function ut(){Je.length=0,it=!1}function dt(e){Ye.some(e=>e?.snapshot)&&(L[e]=Ye.map(e=>e?.snapshot?.capture()))}function ft(e){L[e]?.forEach((e,t)=>{Ye[t]?.snapshot?.restore(e)})}function pt(){ze(q),fe(ve,I),dt(J),fe(_e,L)}async function mt(e,n,r,i){let a,o;n.invalidateAll&&Xe(),await Z({type:`goto`,url:be(e),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:r,nav_token:i,accept:()=>{if(n.invalidateAll){it=!0,a=new Set;for(let[e,t]of st)for(let[n,r]of t)r.resource?.reset(),a.add(j(e,n));o=new Set;for(let[e,t]of ct)for(let n of t.keys())o.add(j(e,n))}n.invalidate&&n.invalidate.forEach(Lt)}}),n.invalidateAll&&t().then(t).then(()=>{for(let[e,t]of st)for(let[n,{resource:r}]of t)a?.has(j(e,n))&&r.start();for(let[e,t]of ct)for(let[n,{resource:r}]of t)o?.has(j(e,n))&&r.reconnect()})}async function ht(e){if(e.id!==H?.id){Xe();let t={};ot.add(t),H={id:e.id,token:t,promise:Tt({...e,preload:t}).then(e=>(ot.delete(t),e.type===`loaded`&&e.state.error&&Xe(),e)),fork:null}}return H.promise}async function gt(e){let t=(await X(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function _t(e,t,n){let r={params:W.params,route:{id:W.route?.id??null},url:new URL(location.href)};if(W={...e.state,nav:r},Fe(e.props.page),at=new V.root({target:t,props:{...e.props,stores:R,components:Ye},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),n){let e={from:null,to:{...r,scroll:I[q]??D()},willUnload:!1,type:`enter`,complete:Promise.resolve()};U.forEach(t=>t(e))}ft(J),tt=!0}async function vt({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=d(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:Ae(n).map(e=>e.node.component),page:Wt(M)}};s!==void 0&&(l.props.form=s);let u={},f=!M,p=0;for(let e=0;e<Math.max(n.length,W.branch.length);e+=1){let t=n[e],r=W.branch[e];t?.data!==r?.data&&(f=!0),t&&(u={...u,...t.data},f&&(l.props[`data_${p}`]=u),p+=1)}return(!W.url||e.href!==W.url.href||W.error!==a||s!==void 0&&s!==M.form||f)&&(l.props.page={error:a,params:t,route:{id:o?.id??null},state:{},status:i,url:new URL(e),form:s??null,data:f?u:M.data}),l}async function yt({loader:e,parent:t,url:n,params:r,route:i,server_data_node:a}){let o={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},s=await e();return{node:s,loader:e,server:a,universal:s.universal?.load?{type:`data`,data:null,uses:o}:null,data:a?.data??null,slash:s.universal?.trailingSlash??a?.slash}}function bt(e,t,n){let r=e instanceof Request?e.url:e,i=new URL(r,n);return i.origin===n.origin&&(r=i.href.slice(n.origin.length)),{resolved:i,promise:tt?y(r,i.href,t):te(r,t)}}function xt(e,t,n,r,i,a){if(it)return!0;if(!i)return!1;if(i.parent&&e||i.route&&t||i.url&&n)return!0;for(let e of i.search_params)if(r.has(e))return!0;for(let e of i.params)if(a[e]!==W.params[e])return!0;for(let e of i.dependencies)if(Je.some(t=>t(new URL(e))))return!0;return!1}function St(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function Ct(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function wt({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Wt(M),constructors:[]}}}async function Tt({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(H?.id===e)return ot.delete(H.token),H.promise;let{errors:o,layouts:s,leaf:u}=i,d=[...s,u];o.forEach(e=>e?.().catch(h)),d.forEach(e=>e?.[1]().catch(h));let f=W.url?e!==At(W.url):!1,p=W.route?i.id!==W.route.id:!1,m=Ct(W.url,n),ee=!1,g=d.map(async(e,t)=>{if(!e)return;let a=W.branch[t];return e[1]===a?.loader&&!xt(ee,p,f,m,a.universal?.uses,r)?a:(ee=!0,yt({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;n<t;n+=1)Object.assign(e,(await g[n])?.data);return e},server_data_node:St(e[0]?{type:`skip`}:null,e[0]?a?.server:void 0)}))});for(let e of g)e.catch(h);let _=[];for(let e=0;e<d.length;e+=1)if(d[e])try{_.push(await g[e])}catch(t){if(t instanceof l)return{type:`redirect`,location:t.location};if(a&&ot.has(a))return wt({error:await $(t,{params:r,url:n,route:{id:i.id}}),url:n,params:r,route:i});let s=je(t),u;if(t instanceof c)u=t.body;else{if(await R.updated.check())return await Ve(),await z(n);u=await $(t,{params:r,url:n,route:{id:i.id}})}let d=await Et(e,_,o);return d?vt({url:n,params:r,branch:_.slice(0,d.idx).concat(d.node),errors:o,status:s,error:u,route:i}):await Mt(n,{id:i.id},u,s)}else _.push(void 0);return vt({url:n,params:r,branch:_,errors:o,status:200,error:null,route:i,form:t?void 0:null})}async function Et(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)--r;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function Dt({status:e,error:t,url:n,route:r}){let i={};try{return vt({url:n,params:i,branch:[await yt({loader:Ue,url:n,params:i,route:r,parent:()=>Promise.resolve({}),server_data_node:St(null)}),{node:await We(),loader:We,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(t){if(t instanceof l){await mt(new URL(t.location,location.href),{},0);return}let a=await V.get_error_template(),o=await $(t,{url:n,params:i,route:r}),s=a({status:e,message:String(o?.message??``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}),c=new DOMParser().parseFromString(s,`text/html`);throw document.documentElement.replaceChild(document.adoptNode(c.head),document.head),document.documentElement.replaceChild(document.adoptNode(c.body),document.body),t}}async function Ot(e){let t=e.href;if(Ze.has(t))return Ze.get(t);let n;try{let r=(async()=>{let t=await V.hooks.reroute({url:new URL(e),fetch:async(t,n)=>bt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);V.hash?n.hash=t:n.pathname=t,t=n}return t})();Ze.set(t,r),n=await r}catch{Ze.delete(t);return}return n}async function X(e,t){if(e&&!A(e,S,V.hash)){let n=await Ot(e);if(!n)return;let r=kt(n);for(let n of He){let i=n.exec(r);if(i)return{id:At(e),invalidating:t,route:n,params:p(i),url:e}}}}function kt(e){return f(V.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function At(e){return(V.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function jt({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Ut(W,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return G||Qe.forEach(e=>e(c)),o?null:s}async function Z({type:n,url:r,popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c={},redirect_count:l=0,nav_token:d={},accept:f=h,block:p=h,event:m}){let ee=Y;Y=d;let g=await X(r,!1),_=n===`enter`?Ut(W,g,r,n):jt({url:r,type:n,delta:i?.delta,intent:g,scroll:i?.scroll,event:m});if(!_){p(),Y===d&&(Y=ee);return}let v=q,te=J;f(),G=!0,tt&&_.navigation.type!==`enter`&&R.navigating.set(N.current=_.navigation);let y=g&&await Tt(g);if(!y){if(A(r,S,V.hash))return await z(r,s);y=await Mt(r,{id:null},await $(new u(404,`Not Found`,`Not found: ${r.pathname}`),{url:r,params:{},route:{id:null}}),404,s)}if(r=g?.url||r,Y!==d){_.reject(Error(`navigation aborted`));return}if(!y)return;if(y.type===`redirect`){if(l<20){await Z({type:n,url:new URL(y.location,r),popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c,redirect_count:l+1,nav_token:d}),_.fulfil(void 0);return}if(y=await Dt({status:500,error:await $(Error(`Redirect loop`),{url:r,params:{},route:{id:null}}),url:r,route:{id:null}}),!y)return}else if(y.props.page.status>=400&&await R.updated.check())return await Ve(),await z(r,s);if(ut(),ze(v),dt(te),y.props.page.url.pathname!==r.pathname&&(r.pathname=y.props.page.url.pathname),c=i?i.state:c,!i){let e=+!s,t={[C]:q+=e,[w]:J+=e,[ye]:c};(s?history.replaceState:history.pushState).call(history,t,``,r),s||Be(q,J)}let b=g&&H?.id===g.id?H.fork:null;H?.fork&&!b?Xe():(H=null,Q={element:void 0,href:void 0}),y.props.page.state=c;let ne;if(tt){let t=(await Promise.all(Array.from($e,e=>e(_.navigation)))).filter(e=>typeof e==`function`);if(t.length>0){function e(){t.forEach(e=>{U.delete(e)})}t.push(e),t.forEach(e=>{U.add(e)})}let n=_.navigation.to;W={...y.state,nav:{params:n.params,route:n.route,url:n.url}},y.props.page&&(y.props.page.url=r),!a&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();let i=b&&await b;i?ne=i.commit():(F=null,at.$set(y.props),F&&Object.assign(y.props.page,F),Fe(y.props.page),ne=e?.()),rt=!0}else await _t(y,Ge,!1);let{activeElement:re}=document;if(await ne,await t(),await t(),Y!==d){_.reject(Error(`navigation aborted`));return}y.props.page&&F&&Object.assign(y.props.page,F);let x=null;if(nt){let e=i?i.scroll:o?D():null;e?scrollTo(e.x,e.y):(x=r.hash&&document.getElementById(Kt(r)))?x.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==re&&document.activeElement!==document.body;!a&&!ie&&Ht(r,!x),nt=!0,G=!1,_.fulfil(void 0),_.navigation.to&&(_.navigation.to.scroll=D()),U.forEach(e=>e(_.navigation)),n===`popstate`&&ft(J),R.navigating.set(N.current=null)}async function Mt(e,t,n,r,i){return e.origin===E&&e.pathname===location.pathname&&!et?await Dt({status:r,error:n,url:e,route:t}):await z(e,i)}var Q={element:void 0,href:void 0};function Nt(){let e,t;B.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{i(n,T.hover)},20)});function n(e){e.defaultPrevented||i(e.composedPath()[0],T.tap)}B.addEventListener(`mousedown`,n),B.addEventListener(`touchstart`,n,{passive:!0});let r=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(gt(new URL(t.target.href)),r.unobserve(t.target))},{threshold:0});async function i(e,n){let r=Ce(e,B),i=r===Q.element&&r?.href===Q.href&&n>=t;if(!r||i)return;let{url:a,external:o,download:s}=we(r,S,V.hash);if(o||s)return;let c=k(r),l=a&&At(W.url)===At(a);if(!(c.reload||l))if(n<=c.preload_data){Q={element:r,href:r.href},t=T.tap;let e=await X(a,!1);if(!e)return;ht(e)}else n<=c.preload_code&&(Q={element:r,href:r.href},t=n,gt(a))}function a(){r.disconnect();for(let e of B.querySelectorAll(`a`)){let{url:t,external:n,download:i}=we(e,S,V.hash);if(n||i)continue;let a=k(e);a.reload||(a.preload_code===T.viewport&&r.observe(e),a.preload_code===T.eager&&gt(t))}}U.add(a),a()}function $(e,t){if(e instanceof c)return e.body;let n=je(e),r=Me(e);return V.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Pt(e,t){Ie(()=>(e.add(t),()=>{e.delete(t)}))}function Ft(e){Pt(U,e)}function It(e,t={}){return e=new URL(be(e)),e.origin===E?mt(e,t,0):Promise.reject(Error(`goto: invalid URL`))}function Lt(e){if(typeof e==`function`)Je.push(e);else{let{href:t}=new URL(e,location.href);Je.push(e=>e.href===t)}}function Rt(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(pt(),!G){let e=Ut(W,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};Qe.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&pt()}),navigator.connection?.saveData||Nt(),B.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=Ce(t.composedPath()[0],B);if(!n)return;let{url:r,external:i,target:a,download:o}=we(n,S,V.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=k(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&!(r.protocol===`https:`||r.protocol===`http:`)||o)return;let[c,l]=(V.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===m(location);if(i||s.reload&&(!u||!l)){jt({url:r,type:`link`,event:t})?G=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=W.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(K=!0,ze(q),e(r),!s.replace_state)return;K=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Z({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),B.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(A(r,S,!1))return;let i=e.target,a=k(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Z({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!Vt)if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(Y={},n===q)return;let r=I[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=W.url?m(location)===m(W.url):!1;if(o===J&&(rt||s)){i!==M.state&&(M.state=i),e(a),I[q]=D(),r&&scrollTo(r.x,r.y),q=n;return}let c=n-q;await Z({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{q=n,J=o},block:()=>{history.go(-c)},nav_token:Y,event:t})}else K||(e(new URL(location.href)),V.hash&&location.reload())}),addEventListener(`hashchange`,()=>{K&&(K=!1,history.replaceState({...history.state,[C]:++q,[w]:J},``,location.href))});for(let e of document.querySelectorAll(`link`))Re.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&R.navigating.set(N.current=null)});function e(e){W.url=M.url=e,R.page.set(Wt(M)),R.page.notify()}}async function zt(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){et=!0;let u=new URL(location.href),d;({params:i={},route:a={id:null}}=await X(u,!1)||{}),d=He.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=Bt(r.uses)),yt({loader:V.nodes[t],url:u,params:i,route:a,parent:async()=>{let t={};for(let r=0;r<n;r+=1)Object.assign(t,(await e[r]).data);return t},server_data_node:St(r)})}),o=await Promise.all(e);if(d){let e=d.layouts;for(let t=0;t<e.length;t++)e[t]||o.splice(t,0,void 0)}f=await vt({url:u,params:i,branch:o,status:t,error:n,errors:d?.errors,form:c,route:d??null})}catch(t){if(t instanceof l)return await z(new URL(t.location,location.href));f=await Dt({status:je(t),error:await $(t,{url:u,params:i,route:a}),url:u,route:a}),e.textContent=``,p=!1}f&&(f.props.page&&(f.props.page.state={}),await _t(f,e,p))}function Bt(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}var Vt=!1;function Ht(e,t=!0){let n=document.querySelector(`[autofocus]`);if(n)n.focus();else{let n=Kt(e);if(n&&document.getElementById(n)){let{x:r,y:i}=D();setTimeout(()=>{let a=history.state;Vt=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),Vt=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t<r.rangeCount;t+=1)e.push(r.getRangeAt(t));setTimeout(()=>{if(r.rangeCount===e.length){for(let t=0;t<r.rangeCount;t+=1){let n=e[t],i=r.getRangeAt(t);if(n.commonAncestorContainer!==i.commonAncestorContainer||n.startContainer!==i.startContainer||n.endContainer!==i.endContainer||n.startOffset!==i.startOffset||n.endOffset!==i.endOffset)return}r.removeAllRanges()}})}}}function Ut(e,t,n,r,i=null){let a,o,s=new Promise((e,t)=>{a=e,o=t});return s.catch(h),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:D()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function Wt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Gt(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Kt(e){let t;if(V.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{N as a,Oe as c,R as i,he as l,It as n,M as o,lt as r,P as s,Ft as t};
@@ -1 +0,0 @@
1
- import{c as e,r as t}from"../chunks/wBLhaPea.js";export{e as load_css,t as start};
@@ -1,2 +0,0 @@
1
- w`Ĕ5�ݸM�Y�!t��܋���M����Q�ڲ���=���&75��7_csD��8�� �X�Ӎ1����+��W-v�޿�(MW���*�0�r9E�\z�mY�Z�j�hw.�7۽_�n��p�
2
- �#�/�w�@\��'sF����ce�i_k��?p�4紇��X�.7"6��V���e�� =�k[����]pbL����\tmZ��