@forgeax/engine-render 0.1.4 → 0.1.6

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 (918) hide show
  1. package/README.md +130 -641
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  4. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  6. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  8. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
  10. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
  11. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
  12. package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
  13. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  14. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
  15. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  16. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  18. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  19. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  20. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  21. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  22. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  23. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  24. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  25. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  26. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  28. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  29. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  30. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  31. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  32. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  33. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  34. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  36. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  37. package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
  38. package/dist/assembly/backend-contract.d.ts.map +1 -0
  39. package/dist/assembly/factory.d.ts +207 -0
  40. package/dist/assembly/factory.d.ts.map +1 -0
  41. package/dist/assembly/host-contract.d.ts +84 -0
  42. package/dist/assembly/host-contract.d.ts.map +1 -0
  43. package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
  44. package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
  45. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  46. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  47. package/dist/authoring.d.ts +10 -11
  48. package/dist/authoring.d.ts.map +1 -1
  49. package/dist/authoring.mjs +25 -3
  50. package/dist/authoring.mjs.map +1 -1
  51. package/dist/chunk-CQXZC5XI.mjs +182 -0
  52. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  53. package/dist/chunk-QC4VW3XJ.mjs +79 -0
  54. package/dist/chunk-QC4VW3XJ.mjs.map +1 -0
  55. package/dist/chunk-SCRSAK5B.mjs +480 -0
  56. package/dist/chunk-SCRSAK5B.mjs.map +1 -0
  57. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  58. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  59. package/dist/components/glyph-text.d.ts +1 -1
  60. package/dist/components/glyph-text.d.ts.map +1 -1
  61. package/dist/components/index.d.ts +2 -2
  62. package/dist/components/index.d.ts.map +1 -1
  63. package/dist/components/instances.d.ts +1 -1
  64. package/dist/components/instances.d.ts.map +1 -1
  65. package/dist/components/light-helpers.d.ts +1 -1
  66. package/dist/components/light-helpers.d.ts.map +1 -1
  67. package/dist/components/mesh-filter.d.ts +7 -7
  68. package/dist/components/mesh-filter.d.ts.map +1 -1
  69. package/dist/components/scene-instance.d.ts +11 -11
  70. package/dist/components/skybox-background.d.ts +56 -0
  71. package/dist/components/skybox-background.d.ts.map +1 -0
  72. package/dist/components/skylight.d.ts +55 -0
  73. package/dist/components/skylight.d.ts.map +1 -0
  74. package/dist/components/sprite-animation.d.ts +2 -3
  75. package/dist/components/sprite-animation.d.ts.map +1 -1
  76. package/dist/components/sprite-instances.d.ts +1 -1
  77. package/dist/components/sprite-playback-mode.d.ts +6 -1
  78. package/dist/components/sprite-playback-mode.d.ts.map +1 -1
  79. package/dist/components/sprite-region-override.d.ts +2 -3
  80. package/dist/components/sprite-region-override.d.ts.map +1 -1
  81. package/dist/components/tile-layer.d.ts +5 -0
  82. package/dist/components/tile-layer.d.ts.map +1 -1
  83. package/dist/construct-renderer.d.ts +18 -1
  84. package/dist/construct-renderer.d.ts.map +1 -1
  85. package/dist/construct-renderer.mjs +27008 -4
  86. package/dist/construct-renderer.mjs.map +1 -1
  87. package/dist/debug-draw-glue.d.ts +2 -53
  88. package/dist/debug-draw-glue.d.ts.map +1 -1
  89. package/dist/device/device-scope.d.ts +83 -0
  90. package/dist/device/device-scope.d.ts.map +1 -0
  91. package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
  92. package/dist/device/gpu-residency.d.ts.map +1 -0
  93. package/dist/device/resource-types.d.ts +8 -0
  94. package/dist/device/resource-types.d.ts.map +1 -0
  95. package/dist/engine-metrics.d.ts +2 -2
  96. package/dist/engine-metrics.d.ts.map +1 -1
  97. package/dist/errors/recover.d.ts +28 -1
  98. package/dist/errors/recover.d.ts.map +1 -1
  99. package/dist/errors/render.d.ts +249 -258
  100. package/dist/errors/render.d.ts.map +1 -1
  101. package/dist/features/fullscreen.d.ts +19 -0
  102. package/dist/features/fullscreen.d.ts.map +1 -0
  103. package/dist/features/host.d.ts +32 -26
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/morph/morph-feature.d.ts +39 -5
  106. package/dist/features/morph/morph-feature.d.ts.map +1 -1
  107. package/dist/features/plan.d.ts +182 -0
  108. package/dist/features/plan.d.ts.map +1 -0
  109. package/dist/features/prepared-gpu-work.d.ts +21 -17
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts +2 -1
  112. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  113. package/dist/features/prepared-graphics.d.ts +11 -21
  114. package/dist/features/prepared-graphics.d.ts.map +1 -1
  115. package/dist/features/render-graph-compute.d.ts +2 -2
  116. package/dist/features/render-graph-compute.d.ts.map +1 -1
  117. package/dist/features/render-graph-contribution.d.ts +4 -7
  118. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  119. package/dist/features/render-graph-raster.d.ts +2 -2
  120. package/dist/features/render-graph-raster.d.ts.map +1 -1
  121. package/dist/features/render-graph-resources.d.ts +6 -6
  122. package/dist/features/render-graph-resources.d.ts.map +1 -1
  123. package/dist/features/targets.d.ts +5 -5
  124. package/dist/features/targets.d.ts.map +1 -1
  125. package/dist/features/types.d.ts +11 -190
  126. package/dist/features/types.d.ts.map +1 -1
  127. package/dist/features/vocabulary.d.ts +14 -0
  128. package/dist/features/vocabulary.d.ts.map +1 -0
  129. package/dist/fullscreen-post-process-pass.d.ts +4 -25
  130. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  131. package/dist/glyph-text-layout-system.d.ts +3 -2
  132. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  133. package/dist/gpu-driven/batch-topology.d.ts +6 -75
  134. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +13 -112
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/view-gpu.d.ts +10 -66
  138. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  139. package/dist/gpu-resource.d.ts +3 -3
  140. package/dist/gpu-scene-schema.d.ts +1 -94
  141. package/dist/gpu-scene-schema.d.ts.map +1 -1
  142. package/dist/gpu-scene.d.ts +7 -33
  143. package/dist/gpu-scene.d.ts.map +1 -1
  144. package/dist/hdrp-buffers.d.ts +3 -53
  145. package/dist/hdrp-buffers.d.ts.map +1 -1
  146. package/dist/ibl/IblPipelineCache.d.ts +74 -180
  147. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  148. package/dist/ibl/skylight-bind-group.d.ts +1 -1
  149. package/dist/index.d.ts +13 -43
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.mjs +165 -3
  152. package/dist/index.mjs.map +1 -1
  153. package/dist/inspection-types.d.ts +69 -0
  154. package/dist/inspection-types.d.ts.map +1 -0
  155. package/dist/instance-buffer-cache.d.ts +1 -4
  156. package/dist/instance-buffer-cache.d.ts.map +1 -1
  157. package/dist/internal.d.ts +1 -73
  158. package/dist/internal.d.ts.map +1 -1
  159. package/dist/internal.mjs +1 -43
  160. package/dist/internal.mjs.map +1 -1
  161. package/dist/lifecycle.d.ts +36 -2
  162. package/dist/lifecycle.d.ts.map +1 -1
  163. package/dist/materials.d.ts +0 -3
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/mesh-material-bindings.d.ts +0 -1
  166. package/dist/mesh-material-bindings.d.ts.map +1 -1
  167. package/dist/pbr-pipeline.d.ts +75 -29
  168. package/dist/pbr-pipeline.d.ts.map +1 -1
  169. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  170. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  171. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  172. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  173. package/dist/pipeline/standard-profile.d.ts +40 -0
  174. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  175. package/dist/pipeline-builder.d.ts +3 -3
  176. package/dist/pipeline-builder.d.ts.map +1 -1
  177. package/dist/pipeline-spec-types.d.ts +24 -0
  178. package/dist/pipeline-spec-types.d.ts.map +1 -0
  179. package/dist/pipeline-spec.d.ts +16 -155
  180. package/dist/pipeline-spec.d.ts.map +1 -1
  181. package/dist/plugin.d.ts +1 -14
  182. package/dist/plugin.d.ts.map +1 -1
  183. package/dist/post-process-errors.d.ts +18 -18
  184. package/dist/post-process-errors.d.ts.map +1 -1
  185. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
  186. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  187. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  188. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  189. package/dist/record/frame-lighting.d.ts +7 -73
  190. package/dist/record/frame-lighting.d.ts.map +1 -1
  191. package/dist/record/frame-snapshot.d.ts +44 -44
  192. package/dist/record/frame-snapshot.d.ts.map +1 -1
  193. package/dist/record/frame-targets.d.ts +5 -38
  194. package/dist/record/frame-targets.d.ts.map +1 -1
  195. package/dist/record/frame.d.ts +64 -52
  196. package/dist/record/frame.d.ts.map +1 -1
  197. package/dist/record/helpers.d.ts +3 -2
  198. package/dist/record/helpers.d.ts.map +1 -1
  199. package/dist/record/main-pass-geometry.d.ts +5 -4
  200. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  201. package/dist/record/main-pass-material.d.ts +90 -59
  202. package/dist/record/main-pass-material.d.ts.map +1 -1
  203. package/dist/record/main-pass-sprite-draws.d.ts +28 -3
  204. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  205. package/dist/record/main-pass.d.ts +1 -1
  206. package/dist/record/main-pass.d.ts.map +1 -1
  207. package/dist/record/mesh-ssbo.d.ts +276 -3
  208. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  209. package/dist/record/render-context.d.ts +235 -0
  210. package/dist/record/render-context.d.ts.map +1 -0
  211. package/dist/record/shadow-pass.d.ts +15 -88
  212. package/dist/record/shadow-pass.d.ts.map +1 -1
  213. package/dist/record/skybox-post-pass.d.ts +1 -1
  214. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  215. package/dist/record/typed-frame-graph.d.ts +29 -7
  216. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  217. package/dist/record/view-ubo.d.ts +3 -3
  218. package/dist/record/view-ubo.d.ts.map +1 -1
  219. package/dist/render-contract.d.ts +416 -0
  220. package/dist/render-contract.d.ts.map +1 -0
  221. package/dist/render-data.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +14 -362
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +25 -64
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +107 -338
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +21 -713
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/scene/render-scene-types.d.ts +58 -0
  231. package/dist/scene/render-scene-types.d.ts.map +1 -0
  232. package/dist/scene/render-scene.d.ts +105 -0
  233. package/dist/scene/render-scene.d.ts.map +1 -0
  234. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
  235. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
  236. package/dist/ssao-buffers.d.ts +22 -3
  237. package/dist/ssao-buffers.d.ts.map +1 -1
  238. package/dist/systems/skin-palette-allocator.d.ts +2 -4
  239. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  240. package/dist/systems/skin-palette-types.d.ts +14 -0
  241. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  242. package/dist/systems/transparent-sort-config.d.ts +23 -2
  243. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  244. package/dist/tilemap-chunk-extract-system.d.ts +4 -3
  245. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
  246. package/dist/typed-render-graph-primitives.d.ts +2 -4
  247. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  248. package/dist/typed-shadow-passes.d.ts +3 -3
  249. package/dist/typed-shadow-passes.d.ts.map +1 -1
  250. package/package.json +23 -23
  251. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
  252. package/src/__tests__/callback-inference.test-d.ts +6 -3
  253. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
  254. package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
  255. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  256. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  257. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
  258. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
  259. package/src/__tests__/factory-contract.integration.test.ts +158 -209
  260. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
  261. package/src/__tests__/frame-observation.contract.test.ts +17 -8
  262. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  263. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
  264. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +9 -16
  265. package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
  266. package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
  267. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
  268. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
  269. package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
  270. package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
  271. package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
  272. package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
  273. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
  274. package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
  275. package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
  276. package/src/__tests__/gpu-scene.unit.test.ts +10 -24
  277. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  278. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
  279. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
  280. package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
  281. package/src/__tests__/material-cooked-projection.unit.test.ts +2 -51
  282. package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
  283. package/src/__tests__/material-static-dynamic-route.unit.test.ts +4 -23
  284. package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
  285. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
  286. package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
  287. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
  288. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  289. package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
  290. package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
  291. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
  292. package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
  293. package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
  294. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
  295. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
  296. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
  297. package/src/__tests__/profiler-default-off.test.ts +1 -1
  298. package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
  299. package/src/__tests__/profiler-phase-integration.test.ts +5 -13
  300. package/src/__tests__/profiler-phase-token.test.ts +3 -8
  301. package/src/__tests__/public-surface.test-d.ts +65 -3
  302. package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
  303. package/src/__tests__/render-error-code-owner.test-d.ts +18 -23
  304. package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
  305. package/src/__tests__/render-error-exhaustive.test-d.ts +8 -1
  306. package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
  307. package/src/__tests__/render-feature-context.test-d.ts +16 -40
  308. package/src/__tests__/render-feature-contract.test-d.ts +9 -18
  309. package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
  310. package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
  311. package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
  312. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  313. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  314. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
  315. package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
  316. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
  317. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
  318. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
  319. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
  320. package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
  321. package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
  322. package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
  323. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
  324. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
  325. package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
  326. package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
  327. package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
  328. package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
  329. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +44 -95
  330. package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
  331. package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
  332. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  333. package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
  334. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  335. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  336. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  337. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  338. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  339. package/src/__tests__/surface-configuration.unit.test.ts +1 -2
  340. package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
  341. package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
  342. package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
  343. package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
  344. package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
  345. package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
  346. package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
  347. package/src/__tests__/visibility-extract.integration.test.ts +20 -11
  348. package/src/__tests__/visibility-extract.perf.test.ts +66 -32
  349. package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
  350. package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
  351. package/src/__tests__/visibility-instances.integration.test.ts +7 -11
  352. package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
  353. package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
  354. package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
  355. package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
  356. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  357. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
  358. package/src/__tests__/vocabulary.unit.test.ts +1 -1
  359. package/src/assembly/backend-contract.ts +57 -0
  360. package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1663 -2690
  361. package/src/assembly/host-contract.ts +101 -0
  362. package/src/{renderer → assembly}/material/assembly.ts +0 -2
  363. package/src/assembly/material/pipeline-projection.ts +63 -0
  364. package/src/authoring.ts +14 -22
  365. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  366. package/src/components/glyph-text.ts +3 -2
  367. package/src/components/index.ts +7 -9
  368. package/src/components/instances.ts +4 -5
  369. package/src/components/light-helpers.ts +1 -1
  370. package/src/components/mesh-filter.ts +11 -10
  371. package/src/components/post-process-params.ts +3 -3
  372. package/src/components/scene-instance.ts +12 -12
  373. package/src/components/skybox-background.ts +103 -0
  374. package/src/components/{environment.ts → skylight.ts} +2 -110
  375. package/src/components/sprite-animation.ts +3 -4
  376. package/src/components/sprite-instances.ts +2 -2
  377. package/src/components/sprite-playback-mode.ts +7 -1
  378. package/src/components/sprite-region-override.ts +2 -3
  379. package/src/components/tile-layer.ts +8 -2
  380. package/src/construct-renderer.ts +67 -4
  381. package/src/debug-draw-glue.ts +8 -129
  382. package/src/device/device-scope.ts +306 -0
  383. package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
  384. package/src/device/resource-types.ts +20 -0
  385. package/src/engine-metrics.ts +12 -19
  386. package/src/errors/recover.ts +45 -3
  387. package/src/errors/render.ts +357 -460
  388. package/src/features/fullscreen.ts +46 -0
  389. package/src/features/host.ts +575 -309
  390. package/src/features/morph/morph-feature.ts +195 -105
  391. package/src/features/plan.ts +447 -0
  392. package/src/features/prepared-gpu-work.ts +72 -15
  393. package/src/features/prepared-graphics-store.ts +20 -6
  394. package/src/features/prepared-graphics.ts +12 -71
  395. package/src/features/render-graph-compute.ts +14 -5
  396. package/src/features/render-graph-contribution.ts +43 -63
  397. package/src/features/render-graph-raster.ts +11 -6
  398. package/src/features/render-graph-resources.ts +25 -23
  399. package/src/features/targets.ts +8 -21
  400. package/src/features/types.ts +39 -227
  401. package/src/features/vocabulary.ts +24 -0
  402. package/src/fullscreen-post-process-pass.ts +14 -57
  403. package/src/glyph-text-layout-system.ts +70 -96
  404. package/src/gpu-driven/batch-topology.ts +24 -202
  405. package/src/gpu-driven/production-raster.ts +93 -1108
  406. package/src/gpu-driven/view-gpu.ts +46 -192
  407. package/src/gpu-resource.ts +4 -4
  408. package/src/gpu-scene-schema.ts +11 -99
  409. package/src/gpu-scene.ts +231 -364
  410. package/src/hdrp-buffers.ts +12 -221
  411. package/src/ibl/IblPipelineCache.ts +471 -711
  412. package/src/ibl/skylight-bind-group.ts +4 -4
  413. package/src/index.ts +58 -217
  414. package/src/inspection-types.ts +76 -0
  415. package/src/instance-buffer-cache.ts +1 -29
  416. package/src/internal.ts +6 -85
  417. package/src/lifecycle.ts +64 -19
  418. package/src/materials.ts +7 -29
  419. package/src/mesh-material-bindings.ts +0 -1
  420. package/src/pbr-pipeline.ts +434 -53
  421. package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
  422. package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
  423. package/src/pipeline/standard-profile.ts +65 -0
  424. package/src/pipeline-builder.ts +60 -64
  425. package/src/pipeline-spec-types.ts +28 -0
  426. package/src/pipeline-spec.ts +72 -609
  427. package/src/plugin.ts +3 -75
  428. package/src/post-process-errors.ts +31 -33
  429. package/src/prepare/prepared-graphics-resolver.ts +5 -4
  430. package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
  431. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  432. package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
  433. package/src/record/frame-lighting.ts +74 -195
  434. package/src/record/frame-snapshot.ts +45 -60
  435. package/src/record/frame-targets.ts +8 -243
  436. package/src/record/frame.ts +509 -796
  437. package/src/record/helpers.ts +6 -11
  438. package/src/record/main-pass-geometry.ts +106 -147
  439. package/src/record/main-pass-material.ts +517 -190
  440. package/src/record/main-pass-sprite-draws.ts +198 -117
  441. package/src/record/main-pass.ts +162 -143
  442. package/src/record/mesh-ssbo.ts +517 -38
  443. package/src/record/render-context.ts +364 -0
  444. package/src/record/shadow-pass.ts +138 -1838
  445. package/src/record/skybox-post-pass.ts +12 -14
  446. package/src/record/typed-frame-graph.ts +215 -254
  447. package/src/record/view-ubo.ts +6 -37
  448. package/src/render-contract.ts +571 -0
  449. package/src/render-data.ts +3 -3
  450. package/src/render-graph-primitives.ts +76 -851
  451. package/src/render-pipeline.ts +104 -188
  452. package/src/render-system-extract.ts +1048 -1729
  453. package/src/render-system.ts +330 -1957
  454. package/src/scene/render-scene-types.ts +64 -0
  455. package/src/scene/render-scene.ts +1032 -0
  456. package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
  457. package/src/ssao-buffers.ts +167 -8
  458. package/src/systems/skin-palette-allocator.ts +21 -64
  459. package/src/systems/skin-palette-types.ts +14 -0
  460. package/src/systems/transparent-sort-config.ts +25 -3
  461. package/src/tilemap-chunk-extract-system.ts +53 -70
  462. package/src/typed-render-graph-primitives.ts +35 -24
  463. package/src/typed-shadow-passes.ts +26 -56
  464. package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
  465. package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
  466. package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
  467. package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
  468. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
  469. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
  470. package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
  471. package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
  472. package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
  473. package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
  474. package/dist/__tests__/camera-temporal.test.d.ts +0 -2
  475. package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
  476. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
  477. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/environment-inspection.test.d.ts +0 -2
  479. package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
  480. package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
  481. package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
  482. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
  483. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
  484. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
  485. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
  486. package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
  487. package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
  488. package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
  489. package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
  490. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
  491. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
  492. package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
  493. package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
  494. package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
  495. package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
  496. package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
  497. package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
  498. package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
  499. package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
  501. package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
  503. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
  504. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
  505. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
  506. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
  507. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
  508. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
  509. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
  510. package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
  511. package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
  512. package/dist/__tests__/materials.unit.test.d.ts +0 -2
  513. package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
  515. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
  517. package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
  518. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
  519. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
  520. package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
  521. package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
  522. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
  523. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
  524. package/dist/__tests__/plugin.test.d.ts +0 -2
  525. package/dist/__tests__/plugin.test.d.ts.map +0 -1
  526. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
  527. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
  529. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
  531. package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
  532. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
  533. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
  534. package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
  535. package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
  536. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
  537. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
  538. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
  539. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
  540. package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
  541. package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
  542. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
  543. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
  544. package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
  545. package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
  547. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
  549. package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
  551. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
  552. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
  553. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
  555. package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
  556. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
  557. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
  558. package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
  559. package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
  561. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
  563. package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
  564. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
  565. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
  566. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
  567. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
  568. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
  569. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
  570. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
  571. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
  572. package/dist/chunk-DJIMFYX6.mjs +0 -1439
  573. package/dist/chunk-DJIMFYX6.mjs.map +0 -1
  574. package/dist/chunk-F2SIOCRM.mjs +0 -7423
  575. package/dist/chunk-F2SIOCRM.mjs.map +0 -1
  576. package/dist/chunk-JMSB7AR4.mjs +0 -3
  577. package/dist/chunk-JMSB7AR4.mjs.map +0 -1
  578. package/dist/chunk-KHI6K4C6.mjs +0 -659
  579. package/dist/chunk-KHI6K4C6.mjs.map +0 -1
  580. package/dist/chunk-PORZOL2V.mjs +0 -569
  581. package/dist/chunk-PORZOL2V.mjs.map +0 -1
  582. package/dist/chunk-UOJGMDGP.mjs +0 -29913
  583. package/dist/chunk-UOJGMDGP.mjs.map +0 -1
  584. package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
  585. package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
  586. package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
  587. package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
  588. package/dist/components/__tests__/fog.test-d.d.ts +0 -2
  589. package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
  590. package/dist/components/__tests__/fog.test.d.ts +0 -2
  591. package/dist/components/__tests__/fog.test.d.ts.map +0 -1
  592. package/dist/components/atmosphere.d.ts +0 -18
  593. package/dist/components/atmosphere.d.ts.map +0 -1
  594. package/dist/components/environment.d.ts +0 -115
  595. package/dist/components/environment.d.ts.map +0 -1
  596. package/dist/deferred-lighting.d.ts +0 -13
  597. package/dist/deferred-lighting.d.ts.map +0 -1
  598. package/dist/dynamic-texture-store.d.ts +0 -42
  599. package/dist/dynamic-texture-store.d.ts.map +0 -1
  600. package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
  601. package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
  602. package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
  603. package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
  604. package/dist/environment/__tests__/generation.test.d.ts +0 -2
  605. package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
  606. package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
  607. package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
  608. package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
  609. package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
  610. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
  611. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
  612. package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
  613. package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
  614. package/dist/environment/__tests__/readiness.test.d.ts +0 -2
  615. package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
  616. package/dist/environment/__tests__/recovery.test.d.ts +0 -2
  617. package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
  618. package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
  619. package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
  620. package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
  621. package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
  622. package/dist/environment/__tests__/signature.test.d.ts +0 -2
  623. package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
  624. package/dist/environment/descriptors.d.ts +0 -2
  625. package/dist/environment/descriptors.d.ts.map +0 -1
  626. package/dist/environment/extracted-environment.d.ts +0 -53
  627. package/dist/environment/extracted-environment.d.ts.map +0 -1
  628. package/dist/environment/generation.d.ts +0 -62
  629. package/dist/environment/generation.d.ts.map +0 -1
  630. package/dist/environment/gpu-bundle.d.ts +0 -23
  631. package/dist/environment/gpu-bundle.d.ts.map +0 -1
  632. package/dist/environment/graph.d.ts +0 -108
  633. package/dist/environment/graph.d.ts.map +0 -1
  634. package/dist/environment/inspection.d.ts +0 -48
  635. package/dist/environment/inspection.d.ts.map +0 -1
  636. package/dist/environment/lifecycle.d.ts +0 -22
  637. package/dist/environment/lifecycle.d.ts.map +0 -1
  638. package/dist/environment/readiness.d.ts +0 -29
  639. package/dist/environment/readiness.d.ts.map +0 -1
  640. package/dist/environment/signature.d.ts +0 -70
  641. package/dist/environment/signature.d.ts.map +0 -1
  642. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
  643. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
  644. package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
  645. package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
  646. package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
  647. package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  648. package/dist/extract/directional-csm.d.ts +0 -129
  649. package/dist/extract/directional-csm.d.ts.map +0 -1
  650. package/dist/extract/index.d.ts +0 -5
  651. package/dist/extract/index.d.ts.map +0 -1
  652. package/dist/extract/material-interface.d.ts +0 -56
  653. package/dist/extract/material-interface.d.ts.map +0 -1
  654. package/dist/extract/schema-readers.d.ts +0 -20
  655. package/dist/extract/schema-readers.d.ts.map +0 -1
  656. package/dist/features/graph-contribution.d.ts +0 -64
  657. package/dist/features/graph-contribution.d.ts.map +0 -1
  658. package/dist/features/index.d.ts +0 -21
  659. package/dist/features/index.d.ts.map +0 -1
  660. package/dist/features/morph/index.d.ts +0 -3
  661. package/dist/features/morph/index.d.ts.map +0 -1
  662. package/dist/features/morph/morph-bounds.d.ts +0 -42
  663. package/dist/features/morph/morph-bounds.d.ts.map +0 -1
  664. package/dist/features/scene-temporal.d.ts +0 -45
  665. package/dist/features/scene-temporal.d.ts.map +0 -1
  666. package/dist/features/taa-resolve.d.ts +0 -21
  667. package/dist/features/taa-resolve.d.ts.map +0 -1
  668. package/dist/frame-chain.d.ts +0 -14
  669. package/dist/frame-chain.d.ts.map +0 -1
  670. package/dist/gpu-driven/view-reference.d.ts.map +0 -1
  671. package/dist/gpu-resource-store.d.ts.map +0 -1
  672. package/dist/hdrp-cluster-membership.d.ts +0 -2
  673. package/dist/hdrp-cluster-membership.d.ts.map +0 -1
  674. package/dist/hdrp-pipeline.d.ts +0 -36
  675. package/dist/hdrp-pipeline.d.ts.map +0 -1
  676. package/dist/ibl/cubemap-projection.d.ts +0 -23
  677. package/dist/ibl/cubemap-projection.d.ts.map +0 -1
  678. package/dist/ibl/face-uniforms.d.ts +0 -65
  679. package/dist/ibl/face-uniforms.d.ts.map +0 -1
  680. package/dist/mesh-update-errors.d.ts +0 -71
  681. package/dist/mesh-update-errors.d.ts.map +0 -1
  682. package/dist/mipmap-generator.d.ts +0 -39
  683. package/dist/mipmap-generator.d.ts.map +0 -1
  684. package/dist/param-schema-projection-census.d.ts +0 -18
  685. package/dist/param-schema-projection-census.d.ts.map +0 -1
  686. package/dist/persistent-render-scene.d.ts +0 -158
  687. package/dist/persistent-render-scene.d.ts.map +0 -1
  688. package/dist/pipeline/index.d.ts +0 -11
  689. package/dist/pipeline/index.d.ts.map +0 -1
  690. package/dist/pipeline-errors.d.ts +0 -110
  691. package/dist/pipeline-errors.d.ts.map +0 -1
  692. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
  693. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  694. package/dist/prepare/index.d.ts +0 -4
  695. package/dist/prepare/index.d.ts.map +0 -1
  696. package/dist/prepare/schema-readers.d.ts +0 -11
  697. package/dist/prepare/schema-readers.d.ts.map +0 -1
  698. package/dist/record/__tests__/environment-record.test.d.ts +0 -2
  699. package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
  700. package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
  701. package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
  702. package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
  703. package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
  704. package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
  705. package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
  707. package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
  712. package/dist/record/frame-observation.d.ts +0 -38
  713. package/dist/record/frame-observation.d.ts.map +0 -1
  714. package/dist/record/index.d.ts +0 -15
  715. package/dist/record/index.d.ts.map +0 -1
  716. package/dist/record/main-pass-skin.d.ts +0 -46
  717. package/dist/record/main-pass-skin.d.ts.map +0 -1
  718. package/dist/record/main-pass-sprite.d.ts +0 -69
  719. package/dist/record/main-pass-sprite.d.ts.map +0 -1
  720. package/dist/record/material-payload.d.ts +0 -43
  721. package/dist/record/material-payload.d.ts.map +0 -1
  722. package/dist/record/material-slot-plan.d.ts +0 -26
  723. package/dist/record/material-slot-plan.d.ts.map +0 -1
  724. package/dist/record/membership-timing.d.ts +0 -232
  725. package/dist/record/membership-timing.d.ts.map +0 -1
  726. package/dist/record/shadow-caster-uniform.d.ts +0 -8
  727. package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
  728. package/dist/record/shadow-submit-mode.d.ts +0 -66
  729. package/dist/record/shadow-submit-mode.d.ts.map +0 -1
  730. package/dist/render-dispatch-membership.d.ts +0 -47
  731. package/dist/render-dispatch-membership.d.ts.map +0 -1
  732. package/dist/render-pipeline-context.d.ts +0 -289
  733. package/dist/render-pipeline-context.d.ts.map +0 -1
  734. package/dist/render-pipeline-target.d.ts +0 -16
  735. package/dist/render-pipeline-target.d.ts.map +0 -1
  736. package/dist/render-scene-projection.d.ts +0 -174
  737. package/dist/render-scene-projection.d.ts.map +0 -1
  738. package/dist/render-system-fold.d.ts +0 -266
  739. package/dist/render-system-fold.d.ts.map +0 -1
  740. package/dist/renderer/asset-service.d.ts +0 -10
  741. package/dist/renderer/asset-service.d.ts.map +0 -1
  742. package/dist/renderer/backend-selection.d.ts.map +0 -1
  743. package/dist/renderer/environment-classify.d.ts +0 -6
  744. package/dist/renderer/environment-classify.d.ts.map +0 -1
  745. package/dist/renderer/environment-error.d.ts +0 -13
  746. package/dist/renderer/environment-error.d.ts.map +0 -1
  747. package/dist/renderer/material/pipeline-projection.d.ts +0 -91
  748. package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
  749. package/dist/renderer/renderer-factory.d.ts +0 -289
  750. package/dist/renderer/renderer-factory.d.ts.map +0 -1
  751. package/dist/renderer.d.ts +0 -771
  752. package/dist/renderer.d.ts.map +0 -1
  753. package/dist/scene-utils/collect-subtree.d.ts +0 -11
  754. package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
  755. package/dist/ssao-data.d.ts +0 -34
  756. package/dist/ssao-data.d.ts.map +0 -1
  757. package/dist/surface-format.d.ts +0 -10
  758. package/dist/surface-format.d.ts.map +0 -1
  759. package/dist/taa-history-store.d.ts +0 -88
  760. package/dist/taa-history-store.d.ts.map +0 -1
  761. package/dist/temporal-coverage.d.ts +0 -35
  762. package/dist/temporal-coverage.d.ts.map +0 -1
  763. package/dist/temporal-frame-transaction.d.ts +0 -92
  764. package/dist/temporal-frame-transaction.d.ts.map +0 -1
  765. package/dist/temporal-inspection.d.ts +0 -57
  766. package/dist/temporal-inspection.d.ts.map +0 -1
  767. package/dist/temporal-view.d.ts +0 -43
  768. package/dist/temporal-view.d.ts.map +0 -1
  769. package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
  770. package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
  771. package/dist/urp-pipeline.d.ts +0 -4
  772. package/dist/urp-pipeline.d.ts.map +0 -1
  773. package/src/__tests__/analytic-sky-contract.test.ts +0 -27
  774. package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
  775. package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
  776. package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
  777. package/src/__tests__/backend-selection.integration.test.ts +0 -11
  778. package/src/__tests__/camera-temporal.test-d.ts +0 -8
  779. package/src/__tests__/camera-temporal.test.ts +0 -188
  780. package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
  781. package/src/__tests__/environment-inspection.test.ts +0 -45
  782. package/src/__tests__/fog-ai-user.fixture.ts +0 -350
  783. package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
  784. package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
  785. package/src/__tests__/fog-inspection.integration.test.ts +0 -127
  786. package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
  787. package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
  788. package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
  789. package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
  790. package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
  791. package/src/__tests__/fog-temporal.integration.test.ts +0 -115
  792. package/src/__tests__/frame-chain.unit.test.ts +0 -26
  793. package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
  794. package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
  795. package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
  796. package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
  797. package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
  798. package/src/__tests__/materials.unit.test.ts +0 -25
  799. package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
  800. package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
  801. package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
  802. package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
  803. package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
  804. package/src/__tests__/plugin.test.ts +0 -25
  805. package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
  806. package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
  807. package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
  808. package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
  809. package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
  810. package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
  811. package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
  812. package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
  813. package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
  814. package/src/__tests__/render-feature-order.unit.test.ts +0 -66
  815. package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
  816. package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
  817. package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
  818. package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
  819. package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
  820. package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
  821. package/src/__tests__/taa-history-store.unit.test.ts +0 -196
  822. package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
  823. package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
  824. package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
  825. package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
  826. package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
  827. package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
  828. package/src/components/__tests__/atmosphere-red.test.ts +0 -51
  829. package/src/components/__tests__/atmosphere.test.ts +0 -79
  830. package/src/components/__tests__/fog.test-d.ts +0 -49
  831. package/src/components/__tests__/fog.test.ts +0 -60
  832. package/src/components/atmosphere.ts +0 -64
  833. package/src/deferred-lighting.ts +0 -92
  834. package/src/dynamic-texture-store.ts +0 -111
  835. package/src/environment/README.md +0 -76
  836. package/src/environment/__tests__/failure-injection.test.ts +0 -50
  837. package/src/environment/__tests__/generation-red.test.ts +0 -64
  838. package/src/environment/__tests__/generation.test.ts +0 -37
  839. package/src/environment/__tests__/graph-transaction.test.ts +0 -85
  840. package/src/environment/__tests__/inspection-red.test.ts +0 -53
  841. package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
  842. package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
  843. package/src/environment/__tests__/readiness.test.ts +0 -42
  844. package/src/environment/__tests__/recovery.test.ts +0 -62
  845. package/src/environment/__tests__/resize-dispose.test.ts +0 -30
  846. package/src/environment/__tests__/signature-red.test.ts +0 -45
  847. package/src/environment/__tests__/signature.test.ts +0 -60
  848. package/src/environment/descriptors.ts +0 -7
  849. package/src/environment/extracted-environment.ts +0 -239
  850. package/src/environment/generation.ts +0 -158
  851. package/src/environment/gpu-bundle.ts +0 -144
  852. package/src/environment/graph.ts +0 -588
  853. package/src/environment/inspection.ts +0 -107
  854. package/src/environment/lifecycle.ts +0 -124
  855. package/src/environment/readiness.ts +0 -76
  856. package/src/environment/signature.ts +0 -185
  857. package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
  858. package/src/extract/__tests__/environment-source.test.ts +0 -105
  859. package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
  860. package/src/extract/directional-csm.ts +0 -959
  861. package/src/extract/index.ts +0 -10
  862. package/src/extract/material-interface.ts +0 -604
  863. package/src/extract/schema-readers.ts +0 -27
  864. package/src/features/graph-contribution.ts +0 -577
  865. package/src/features/index.ts +0 -100
  866. package/src/features/morph/index.ts +0 -24
  867. package/src/features/morph/morph-bounds.ts +0 -123
  868. package/src/features/scene-temporal.ts +0 -274
  869. package/src/features/taa-resolve.ts +0 -244
  870. package/src/frame-chain.ts +0 -21
  871. package/src/hdrp-cluster-membership.ts +0 -70
  872. package/src/ibl/cubemap-projection.ts +0 -60
  873. package/src/ibl/face-uniforms.ts +0 -150
  874. package/src/mesh-update-errors.ts +0 -113
  875. package/src/mipmap-generator.ts +0 -244
  876. package/src/param-schema-projection-census.ts +0 -73
  877. package/src/persistent-render-scene.ts +0 -1752
  878. package/src/pipeline/index.ts +0 -40
  879. package/src/pipeline-errors.ts +0 -172
  880. package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
  881. package/src/prepare/index.ts +0 -8
  882. package/src/prepare/schema-readers.ts +0 -20
  883. package/src/record/__tests__/environment-record.test.ts +0 -35
  884. package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
  885. package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
  886. package/src/record/__tests__/render-submission.integration.test.ts +0 -76
  887. package/src/record/__tests__/render-submission.perf.test.ts +0 -141
  888. package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
  889. package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
  890. package/src/record/frame-observation.ts +0 -122
  891. package/src/record/index.ts +0 -15
  892. package/src/record/main-pass-skin.ts +0 -51
  893. package/src/record/main-pass-sprite.ts +0 -166
  894. package/src/record/material-payload.ts +0 -292
  895. package/src/record/material-slot-plan.ts +0 -68
  896. package/src/record/membership-timing.ts +0 -1012
  897. package/src/record/shadow-caster-uniform.ts +0 -37
  898. package/src/record/shadow-submit-mode.ts +0 -277
  899. package/src/render-dispatch-membership.ts +0 -155
  900. package/src/render-pipeline-context.ts +0 -332
  901. package/src/render-pipeline-target.ts +0 -96
  902. package/src/render-scene-projection.ts +0 -1738
  903. package/src/render-system-fold.ts +0 -531
  904. package/src/renderer/asset-service.ts +0 -32
  905. package/src/renderer/backend-selection.ts +0 -121
  906. package/src/renderer/environment-classify.ts +0 -30
  907. package/src/renderer/environment-error.ts +0 -19
  908. package/src/renderer/material/pipeline-projection.ts +0 -140
  909. package/src/renderer.ts +0 -940
  910. package/src/scene-utils/collect-subtree.ts +0 -40
  911. package/src/ssao-data.ts +0 -106
  912. package/src/surface-format.ts +0 -37
  913. package/src/taa-history-store.ts +0 -429
  914. package/src/temporal-coverage.ts +0 -106
  915. package/src/temporal-frame-transaction.ts +0 -301
  916. package/src/temporal-inspection.ts +0 -194
  917. package/src/temporal-view.ts +0 -174
  918. package/src/tilemap/resolve-tileset-runtime.ts +0 -72
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tilemap/resolve-tileset-runtime.ts","../src/tilemap-chunk-extract-system.ts"],"names":["activeSet"],"mappings":";;;;;;;AA4BO,SAAS,qBAAA,CACd,KAAA,EACA,IAAA,EACA,MAAA,EACqD;AACrD,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,GAAA,CAAI;AAAA,MACT,IAAA,EAAM,yBAAA;AAAA,MACN,QAAA,EAAU,gCAAA;AAAA,MACV,IAAA,EAAM,sDAAA;AAAA,MACN,MAAA,EAAQ,EAAE,IAAA;AAAK,KAChB,CAAA;AAAA,EACH;AACA,EAAA,MAAM,OAAA,GAAU,OAAO,IAAI,CAAA;AAC3B,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAO,GAAA,CAAI;AAAA,MACT,IAAA,EAAM,yBAAA;AAAA,MACN,QAAA,EAAU,2CAA2C,IAAI,CAAA,CAAA;AAAA,MACzD,IAAA,EAAM,wDAAA;AAAA,MACN,MAAA,EAAQ,EAAE,IAAA;AAAK,KAChB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAO,GAAA,CAAI;AAAA,MACT,IAAA,EAAM,qBAAA;AAAA,MACN,QAAA,EAAU,4CAA4C,IAAI,CAAA,CAAA;AAAA,MAC1D,IAAA,EAAM,kEAAA;AAAA,MACN,MAAA,EAAQ,EAAE,IAAA;AAAK,KAChB,CAAA;AAAA,EACH;AACA,EAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAC9B,IAAA,OAAO,GAAA,CAAI;AAAA,MACT,IAAA,EAAM,6BAAA;AAAA,MACN,QAAA,EAAU,yBAAA;AAAA,MACV,IAAA,EAAM,sBAAsB,IAAI,CAAA,qBAAA,CAAA;AAAA,MAChC,MAAA,EAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,QAAQ,IAAA;AAAK,KAC1C,CAAA;AAAA,EACH;AACA,EAAA,OAAO,EAAA,CAAG;AAAA,IACR,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,EAAQ,KAAA,CAAM,eAAA,CAAgB,cAAA,EAAgB,OAAO;AAAA,GACtD,CAAA;AACH;ACyBA,IAAI,kBAAA,uBAAyB,OAAA,EAAoC;AACjE,IAAI,sBAAA,uBAA6B,OAAA,EAAoC;AACrE,IAAM,qBAAA,uBAA4B,OAAA,EAA8C;AAEhF,SAAS,eAAe,KAAA,EAA6C;AACnE,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,GAAA,CAAI,KAAK,CAAA;AAChD,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,MAAM,CAAA,CAAE,MAAA,EAAO;AAChD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,eAAA,CAAgB,WAAA,EAAa,IAAI,CAAA;AACtD,EAAA,qBAAA,CAAsB,GAAA,CAAI,OAAO,MAAM,CAAA;AACvC,EAAA,OAAO,MAAA;AACT;AA0DA,IAAI,qBAAA,uBAA4B,OAAA,EAAuC;AAEvE,SAAS,eAAe,KAAA,EAAsC;AAC5D,EAAA,IAAI,KAAA,GAAQ,qBAAA,CAAsB,GAAA,CAAI,KAAK,CAAA;AAC3C,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,KAAA,GAAQ;AAAA,MACN,MAAA,sBAAY,GAAA,EAAI;AAAA,MAChB,aAAA,sBAAmB,GAAA,EAAI;AAAA,MACvB,YAAA,sBAAkB,GAAA;AAAI,KACxB;AACA,IAAA,qBAAA,CAAsB,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,6BAAA,GAAsC;AACpD,EAAA,kBAAA,uBAAyB,OAAA,EAAoC;AAC7D,EAAA,sBAAA,uBAA6B,OAAA,EAAoC;AACnE;AAaO,SAAS,gCAAA,GAAyC;AACvD,EAAA,qBAAA,uBAA4B,OAAA,EAAuC;AACrE;AAcO,SAAS,+BAA+B,KAAA,EAAiC;AAC9E,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,GAAA,CAAI,KAAK,CAAA;AAC7C,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,EAAC;AACjC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,MAAA,CAAO,IAAA,EAAK,EAAG;AAC1C,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,GAAG,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,YAAA,CAAa,IAAA,EAAK,EAAG;AAChD,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAC,GAAG,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,aAAA,CAAc,IAAA,EAAK,EAAG;AAC5C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,IAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,MAAM,CAAC,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAqBO,SAAS,uBAAA,CACd,UAAA,EACA,UAAA,EACA,SAAA,GAAuB,OAAA,EACf;AACR,EAAA,IAAI,SAAA,KAAc,UAAA,EAAY,OAAQ,UAAA,IAAc,EAAA,GAAM,CAAA;AAC1D,EAAA,OAAQ,UAAA,IAAc,EAAA,GAAO,UAAA,GAAa,OAAA,GAAW,CAAA;AACvD;AAyBA,SAAS,sBAAA,CACP,KAAA,EACA,OAAA,EACA,WAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA;AAC1C,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,CAAA;AAKjC,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AAC5C,EAAA,IAAI,SAAA,KAAc,QAAW,OAAO,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AAC5D,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AACtB,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,MAAA;AAChC,EAAA,MAAM,OAAA,GAAU,aAAa,WAAW,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAC1C,EAAA,MAAM,QAAQ,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA,wBAAS,GAAA,EAAoB;AACvE,EAAA,kBAAA,CAAmB,GAAA,CAAI,OAAO,KAAK,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACjC,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAQjC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,GAAa,UAAU,CAAA;AACjD,EAAA,MAAM,aAAa,IAAA,CAAK,GAAA;AAAA,IACtB,CAAA;AAAA,IACA,cAAc,MAAA,GAAY,SAAA,CAAU,UAAA,GAAa,OAAA,CAAQ,UAAU,OAAA,CAAQ;AAAA,GAC7E;AACA,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAAA,IACvB,CAAA;AAAA,IACA,cAAc,MAAA,GAAY,SAAA,CAAU,WAAA,GAAc,OAAA,CAAQ,OAAO,OAAA,CAAQ;AAAA,GAC3E;AACA,EAAA,MAAM,aAAa,GAAA,GAAM,UAAA;AACzB,EAAA,MAAM,aAAa,GAAA,GAAM,WAAA;AACzB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,UAAA,GAAa,UAAA;AAClC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,WAAA,GAAc,UAAA;AACnC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,UAAA,GAAa,CAAA,GAAI,UAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,WAAA,GAAc,CAAA,GAAI,UAAA;AAE5C,EAAA,MAAM,UAAA,GAA4B;AAAA,IAChC,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,EAAE,MAAA,EAAQ,iBAAA,EAAkB;AAAA,QACrC,WAAA,EAAa;AAAA,UACX,GAAG,EAAE,KAAA,EAAO,gCAAA,EAAiC;AAAA,UAC7C,IAAA,EAAM,EAAE,SAAA,EAAW,SAAA,EAAU;AAAA,UAC7B,KAAA,EAAO;AAAA;AACT;AACF,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,CAAC,CAAA,EAAK,CAAA,EAAK,GAAK,CAAG,CAAA;AAAA,MAC9B,gBAAA,EAAkB,qBAAqB,WAAW,CAAA;AAAA,MAClD,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACnB,YAAA,EAAc,CAAC,GAAA,EAAK,GAAA,EAAK,GAAK,CAAG,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA;AACT,GACF;AACA,EAAA,MAAM,YAAY,KAAA,CAAM,cAAA;AAAA,IACtB,eAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,EAAA,GAAK,aAAa,SAAS,CAAA;AACjC,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,EAAE,CAAA;AACtB,EAAA,OAAO,EAAA;AACT;AAkBA,SAAS,wBAAA,CACP,KAAA,EACA,OAAA,EACA,UAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA;AAC5C,EAAA,IAAI,SAAA,KAAc,QAAW,OAAO,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AAC5D,EAAA,IAAI,CAAC,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AACtB,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,CAAM,MAAA;AAChC,EAAA,MAAM,OAAA,GAAU,aAAa,WAAW,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,OAAO,OAAO,CAAA;AAC/B,EAAA,MAAM,QAAQ,sBAAA,CAAuB,GAAA,CAAI,KAAK,CAAA,wBAAS,GAAA,EAAoB;AAC3E,EAAA,sBAAA,CAAuB,GAAA,CAAI,OAAO,KAAK,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACjC,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAEjC,EAAA,MAAM,UAAA,GAA4B;AAAA,IAChC,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN;AAAA,QACE,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,EAAE,MAAA,EAAQ,iBAAA,EAAkB;AAAA,QACrC,WAAA,EAAa;AAAA,UACX,GAAG,EAAE,KAAA,EAAO,gCAAA,EAAiC;AAAA,UAC7C,IAAA,EAAM,EAAE,SAAA,EAAW,SAAA,EAAU;AAAA,UAC7B,KAAA,EAAO;AAAA;AACT;AACF,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,CAAC,CAAA,EAAK,CAAA,EAAK,GAAK,CAAG,CAAA;AAAA,MAC9B,gBAAA,EAAkB,qBAAqB,WAAW,CAAA;AAAA,MAClD,MAAA,EAAQ,CAAC,CAAA,EAAK,CAAA,EAAK,GAAK,CAAG,CAAA;AAAA,MAC3B,YAAA,EAAc,CAAC,GAAA,EAAK,GAAA,EAAK,GAAK,CAAG,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA;AACT,GACF;AACA,EAAA,MAAM,YAAY,KAAA,CAAM,cAAA;AAAA,IACtB,eAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,EAAA,GAAK,aAAa,SAAS,CAAA;AACjC,EAAA,KAAA,CAAM,GAAA,CAAI,UAAU,EAAE,CAAA;AACtB,EAAA,OAAO,EAAA;AACT;AASA,SAAS,eAAA,CACP,OAAA,EACA,MAAA,EACA,UAAA,EAC8C;AAC9C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,UAAA,GAAa,UAAU,CAAA;AACjD,EAAA,MAAM,aAAa,IAAA,CAAK,GAAA;AAAA,IACtB,CAAA;AAAA,IACA,cAAc,MAAA,GAAY,SAAA,CAAU,UAAA,GAAa,OAAA,CAAQ,UAAU,OAAA,CAAQ;AAAA,GAC7E;AACA,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAAA,IACvB,CAAA;AAAA,IACA,cAAc,MAAA,GAAY,SAAA,CAAU,WAAA,GAAc,OAAA,CAAQ,OAAO,OAAA,CAAQ;AAAA,GAC3E;AACA,EAAA,MAAM,aAAa,GAAA,GAAM,UAAA;AACzB,EAAA,MAAM,aAAa,GAAA,GAAM,WAAA;AACzB,EAAA,OAAO;AAAA,IACL,MAAA,CAAO,IAAI,UAAA,GAAa,UAAA;AAAA,IACxB,MAAA,CAAO,IAAI,WAAA,GAAc,UAAA;AAAA,IACzB,MAAA,CAAO,KAAA,GAAQ,UAAA,GAAa,CAAA,GAAI,UAAA;AAAA,IAChC,MAAA,CAAO,MAAA,GAAS,WAAA,GAAc,CAAA,GAAI;AAAA,GACpC;AACF;AAqBA,IAAM,UAAU,IAAA,CAAK,OAAA;AAiBd,SAAS,6BAAA,CACd,MAAA,EACA,MAAA,EACA,KAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,eAAe,MAAA,GAAS,MAAA;AACrC,EAAA,OAAO,KAAA,GAAQ,IAAI,IAAA,GAAO,IAAA;AAC5B;AAQA,SAAS,QACP,SAAA,EACA,SAAA,EACA,WACA,UAAA,EACA,cAAA,EACA,OACA,UAAA,EACkB;AAClB,EAAA,MAAM,QAAQ,SAAA,GAAY,SAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,SAAS,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,SAAS,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,SAAS,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,SAAA,GAAY,SAAS,CAAC,CAAA;AACjE,EAAA,MAAM,UAAA,GAAa,SAAS,YAAA,GAAe,MAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,cAAA,CAAe,UAAU,CAAA;AAC5C,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA,EAAY,MAAM,UAAA,IAAc,CAAA;AAAA,IAChC,WAAA,EAAa,MAAM,WAAA,IAAe,CAAA;AAAA,IAClC,MAAA,EAAQ,MAAM,MAAA,IAAU,GAAA;AAAA,IACxB,MAAA,EAAQ,MAAM,MAAA,IAAU,GAAA;AAAA,IACxB,UAAA;AAAA,IACA,aAAa,KAAA,CAAM;AAAA,GACrB;AACF;AAuBA,SAAS,cAAA,CACP,OAAA,EACA,IAAA,EACA,UAAA,EAQA;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,YAAA,EAAa,GAAI,eAAe,UAAU,CAAA;AAChE,EAAA,MAAM,aAAA,GAAgB,YAAA,GAAe,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA;AACxD,EAAA,MAAM,eAAA,GAAkB,KAAA,GAAQ,CAAA,GAAI,aAAA,GAAgB,aAAA;AACpD,EAAA,MAAM,eAAA,GAAkB,6BAAA;AAAA,IACtB,IAAA,CAAK,MAAA;AAAA,IACL,IAAA,CAAK,MAAA;AAAA,IACL,KAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AACzC,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,CAAK,KAAA,GAAQ,mBAAmB,GAAA,GAAM,eAAA,IAAmB,KAAK,UAAA,IAAc,SAAA;AAAA,IACnF,OAAO,IAAA,CAAK,KAAA,GAAQ,mBAAmB,GAAA,GAAM,eAAA,IAAmB,KAAK,WAAA,IAAe,SAAA;AAAA,IACpF,MAAA,EAAA,CAAS,KAAA,GAAQ,EAAA,GAAK,CAAA,IAAK,KAAK,UAAA,GAAa,SAAA;AAAA,IAC7C,MAAA,EAAA,CAAS,KAAA,GAAQ,EAAA,GAAK,CAAA,IAAK,KAAK,WAAA,GAAc,SAAA;AAAA,IAC9C,KAAA,EAAO,eAAe,OAAA,GAAU,CAAA;AAAA,IAChC,KAAA,EAAO,eAAe,OAAA,GAAU;AAAA,GAClC;AACF;AAeA,SAAS,0BAAA,CACP,OACA,OAAA,EACA,WAAA,EACA,YACA,IAAA,EACA,UAAA,EACA,YAAuB,OAAA,EACT;AACd,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAM,GAAI,cAAA,CAAe,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA;AAC7F,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,UAAA,EAAY,IAAA,CAAK,YAAY,SAAS,CAAA;AACjF,EAAA,OAAO,KAAA,CACJ,KAAA;AAAA,IACC;AAAA,MACE,SAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,CAAC,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,QACnB,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,OAAO,KAAK,CAAA;AAAA,QACzB,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,CAAC;AAAA;AAC3B,KACF;AAAA,IACA,EAAE,WAAW,UAAA,EAAY,IAAA,EAAM,EAAE,WAAA,EAAa,cAAA,CAAe,KAAK,CAAA,EAAE,EAAE;AAAA,IACtE;AAAA,MACE,SAAA,EAAW,YAAA;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,CAAC,IAAA,CAAK,cAA8D;AAAA;AACjF,KACF;AAAA,IACA,EAAE,SAAA,EAAW,KAAA,EAAO,MAAM,EAAE,KAAA,EAAO,YAAW,EAAE;AAAA,IAChD,EAAE,SAAA,EAAW,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,aAAY;AAAE,IAErD,MAAA,EAAO;AACZ;AAgCA,SAAS,yBAAA,CACP,OACA,OAAA,EACA,OAAA,EACA,aACA,UAAA,EACA,UAAA,EACA,UAAA,EACA,cAAA,EACA,SAAA,EAC0B;AAC1B,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACnC,EAAA,MAAM,IAAI,SAAA,CAAU,MAAA;AACpB,EAAA,MAAM,UAAA,GAAa,IAAI,YAAA,CAAa,CAAA,GAAI,EAAE,CAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,CAAA,GAAI,CAAC,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,EAAE,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAA;AACb,EAAA,MAAM,IAAA,GAAiC,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAyC,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,IAAA,GAAiC,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAsB/C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC5E,EAAA,MAAM,SAAS,UAAA,GAAa,YAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,YAAY,CAAA;AACnD,EAAA,MAAM,cAAc,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,CAAA;AAChE,EAAA,MAAM,cAAc,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,CAAA;AAChE,EAAA,MAAM,YAAA,GAAA,CAAgB,SAAS,GAAA,IAAO,WAAA;AACtC,EAAA,MAAM,YAAA,GAAA,CAAgB,SAAS,GAAA,IAAO,WAAA;AACtC,EAAA,MAAM,KAAA,GAAQ,WAAA,GAAc,CAAA,GAAI,CAAA,GAAI,WAAA,GAAc,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,WAAA,GAAc,CAAA,GAAI,CAAA,GAAI,WAAA,GAAc,CAAA;AAElD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,GAAI,cAAA;AAAA,MACnD,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AACA,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,IAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,KAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,KAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,MAAA;AACV,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAGrC,IAAA,MAAM,MAAM,CAAA,GAAI,EAAA;AAChB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA;AACxB,MAAA,UAAA,CAAW,GAAA,GAAM,OAAO,CAAC,CAAA,GAAA,CAAM,KAAK,IAAA,GAAO,CAAC,CAAA,GAAe,YAAA,GAAe,EAAA,IAAM,KAAA;AAChF,MAAA,UAAA,CAAW,GAAA,GAAM,OAAO,CAAC,CAAA,GAAA,CAAM,KAAK,IAAA,GAAO,CAAC,CAAA,GAAe,YAAA,GAAe,EAAA,IAAM,KAAA;AAChF,MAAA,UAAA,CAAW,MAAM,IAAA,GAAO,CAAC,CAAA,GAAI,IAAA,CAAK,OAAO,CAAC,CAAA;AAC1C,MAAA,UAAA,CAAW,GAAA,GAAM,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA;AAC/C,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,MAAM,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,eAAA,CAAgB,OAAA,EAAS,MAAA,EAAQ,UAAU,CAAA;AAChE,MAAA,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AACrB,MAAA,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AACrB,MAAA,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AACrB,MAAA,OAAA,CAAQ,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,UAAA,EAAY,UAAA,EAAY,OAAO,CAAA;AAQ1E,EAAA,OAAO,KAAA,CACJ,KAAA;AAAA,IACC;AAAA,MACE,SAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,GAAA,EAAK,CAAC,YAAA,EAAc,YAAA,EAAc,CAAC,CAAA;AAAA,QACnC,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,QACjB,KAAA,EAAO,CAAC,WAAA,EAAa,WAAA,EAAa,CAAC;AAAA;AACrC,KACF;AAAA,IACA,EAAE,WAAW,UAAA,EAAY,IAAA,EAAM,EAAE,WAAA,EAAa,cAAA,CAAe,KAAK,CAAA,EAAE,EAAE;AAAA,IACtE;AAAA,MACE,SAAA,EAAW,YAAA;AAAA,MACX,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,CAAC,cAA8D;AAAA;AAC5E,KACF;AAAA,IACA,EAAE,SAAA,EAAW,eAAA,EAAiB,MAAM,EAAE,UAAA,EAAY,SAAQ,EAAE;AAAA,IAC5D,EAAE,SAAA,EAAW,KAAA,EAAO,MAAM,EAAE,KAAA,EAAO,YAAW,EAAE;AAAA,IAChD,EAAE,SAAA,EAAW,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,aAAY;AAAE,IAErD,MAAA,EAAO;AACZ;AAMA,SAAS,eAAA,CACP,KAAA,EACA,WAAA,EACA,YAAA,EACA,MAAA,EAcY;AACZ,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,OAAO,CAAA;AAClD,EAAA,IAAI,CAAC,UAAA,CAAW,EAAA,EAAI,OAAO,MAAA;AAC3B,EAAA,MAAM,UAAU,UAAA,CAAW,KAAA;AAC3B,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAC7C,EAAA,IAAI,cAAA,KAAmB,MAAA,IAAa,MAAA,IAAU,cAAA,EAAgB,OAAO,MAAA;AACrE,EAAA,IAAI,cAAA,CAAe,IAAA,KAAS,SAAA,EAAW,OAAO,MAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,cAAA;AAEhB,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AACjD,EAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,MAAA;AACzB,EAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AACvB,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AAQjD,EAAA,MAAM,qBAAqB,SAAA,KAAc,OAAA;AAEzC,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC3B,IAAA,IAAI,WAAW,CAAA,EAAG;AAClB,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,cAAA,CAAe,MAAM,CAAA;AACxC,IAAA,IAAI,WAAW,CAAA,EAAG;AAClB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACtC,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,WAAW,CAAA;AAChD,IAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,IAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AACxC,IAAA,MAAM,cAAA,GAAiB,kBAAA,GACnB,wBAAA,CAAyB,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,MAAM,CAAA,GAC3D,sBAAA,CAAuB,KAAA,EAAO,OAAA,EAAS,KAAA,CAAM,aAAa,MAAM,CAAA;AACpE,IAAA,MAAM,IAAA,GAAO,OAAA;AAAA,MACX,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,SAAA;AAAA,MACR,CAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AACA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAUA,SAAS,yBAAyB,KAAA,EAAsC;AACtE,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,EAAE,IAAA,EAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO;AAChE,EAAA,IAAI,MAAA,GAAiC,IAAA;AACrC,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,YAAY,GAAA,CAAI,MAAA;AAEtB,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,MAAM,EAAA,EAAI;AAE7B,IAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AAWnB,IAAA,MAAM,KAAK,KAAA,CAAM,KAAA;AAEjB,IAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAI,GAAI,GAAA;AACtB,IAAA,IAAI,QAAQ,GAAA,EAAK;AAEjB,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,EAAO;AACzB,IAAA,IAAI,GAAA,CAAI,eAAe,8BAAA,EAAgC;AACrD,MAAA,IAAA,CAAK,YAAA;AAAA,QACH,IAAA;AAAA,QACA,GAAA,CAAI,IAAA;AAAA,QACJ,GAAA,CAAI,KAAA;AAAA,QACJ,GAAA,CAAI,MAAA;AAAA,QACJ,GAAA,CAAI,GAAA;AAAA,QACJ,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,WAAA;AAAA,QACH,IAAA;AAAA,QACA,GAAA,CAAI,GAAA;AAAA,QACJ,GAAA,CAAI,MAAA;AAAA,QACJ,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,MAAA;AAAA,MACH,IAAA;AAAA,MACA,EAAA,CAAG;AAAA,KACL;AACA,IAAA,MAAM,EAAA,GAAK,KAAK,MAAA,EAAO;AACvB,IAAA,IAAA,CAAK,QAAA;AAAA,MACH,EAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,CAAA,GAAI,QAAQ,MAAA,EAAO;AACzB,IAAA,OAAA,CAAQ,kBAAA,CAAmB,GAAG,EAAsD,CAAA;AACpF,IAAA,MAAA,GAAS,CAAA;AACT,IAAA;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAiCO,SAAS,wBAAA,CACd,SACA,KAAA,EACe;AACf,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA;AAClB,EAAA,IAAI,OAAO,MAAA,CAAO,SAAA;AAClB,EAAA,IAAI,IAAA,GAAO,CAAC,MAAA,CAAO,SAAA;AACnB,EAAA,IAAI,IAAA,GAAO,CAAC,MAAA,CAAO,SAAA;AACnB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAA,KAAW,cAAA,CAAe,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,UAAU,CAAA;AACpF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA;AACjC,IAAA,MAAM,KAAK,IAAA,GAAO,KAAA;AAClB,IAAA,MAAM,KAAK,IAAA,GAAO,KAAA;AAClB,IAAA,MAAM,KAAK,IAAA,GAAO,KAAA;AAClB,IAAA,MAAM,KAAK,IAAA,GAAO,KAAA;AAClB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AAAA,EACxB;AACA,EAAA,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,MAAM,CAAC,CAAA;AACvC;AAkBA,SAAS,oBAAA,CAAqB,OAAc,WAAA,EAAiC;AAC3E,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,WAAA,EAAa,QAAQ,CAAA;AACzC,EAAA,IAAI,CAAC,EAAE,EAAA,EAAI;AACX,EAAA,MAAM,IAAA,GAAO,EAAE,KAAA,CAAM,QAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,CAAA,KAAM,MAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAiB,CAAA;AAAA,EACtD;AACF;AA8CA,SAAS,+BAAA,CAAgC,MAA4B,KAAA,EAAoB;AACvF,EAAA,MAAM,KAAA,GAAQ,eAAe,KAAK,CAAA;AAClC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AACvC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,cAAA,CAAe,IAAI,MAAA,CAAO,YAAA,CAAa,CAAA,CAAE,WAAkD,CAAC,CAAC,CAAA;AAAA,EAC/F;AACA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,YAAA,CAAa,IAAA,EAAK,EAAG;AAChD,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,EAC/D;AACA,EAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,MAAA,CAAO,IAAA,EAAK,EAAG;AAC1C,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,EAC/D;AACA,EAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAChD,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,KAAA,CAAM,cAAc,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAAA,MACrD;AACA,MAAA,KAAA,CAAM,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,IACnC;AACA,IAAA,KAAA,CAAM,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,EAC7B;AACF;AAuBO,SAAS,yBAAA,CACd,KAAA,EACA,MAAA,GAA+C,MAAM,MAAA,EAC/C;AACN,EAAA,MAAM,SAAA,GAAY,eAAe,KAAK,CAAA;AACtC,EAAA,MAAM,OAAoB,EAAC;AAC3B,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,CAAM,EAAE,IAAA,EAAM,CAAC,SAAA,EAAW,OAAO,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO;AAC1E,EAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,CAAE,MAAA;AAChC,IAAA,IAAI,WAAW,IAAA,EAAM;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK;AAAA,MACR,aAAa,GAAA,CAAI,MAAA;AAAA,MACjB,YAAA,EAAc,MAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,cAAc,KAAA,CAAM;AAAA,KACrB,CAAA;AAAA,EACH;AAEA,EAAA,+BAAA,CAAgC,MAAM,KAAK,CAAA;AAI3C,EAAA,IAAI,aAAA;AAEJ,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AAGpB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,YAAA,CAAa,CAAA,CAAE,WAAkD,CAAC,CAAA;AAK1F,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,CAAA,CAAE,YAAY,CAAA,KAAM,UAAA;AAExD,IAAA,IAAI,CAAC,WAAA,EAAa;AAYhB,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,aAAa,QAAQ,CAAA;AACrD,MAAA,MAAM,aAAa,WAAA,CAAY,EAAA,GAAK,WAAA,CAAY,KAAA,CAAM,SAAS,MAAA,GAAS,CAAA;AACxE,MAAA,IAAI,UAAA,GAAa,CAAA,IAAK,CAAA,CAAE,KAAA,KAAU,CAAA,EAAG;AAErC,MAAA,oBAAA,CAAqB,KAAA,EAAO,EAAE,WAAW,CAAA;AAEzC,MAAA,MAAM,SAAS,eAAA,CAAgB,KAAA,EAAO,EAAE,WAAA,EAAa,CAAA,CAAE,cAAc,MAAM,CAAA;AAC3E,MAAA,IAAI,WAAW,MAAA,EAAW;AAE1B,MAAA,MAAM,YAAA,uBAAmB,GAAA,EAAgC;AACzD,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,QAAA,MAAM,OAAQ,IAAA,CAAK,UAAA,GAAa,OAAA,KAAY,EAAA,GAAO,KAAK,UAAA,GAAa,KAAA;AACrE,QAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACjC,QAAA,IAAI,SAAS,MAAA,EAAW;AACtB,UAAA,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,CAAC,IAAI,CAAC,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,QAChB;AAAA,MACF;AACA,MAAA,KAAA,MAAW,UAAA,IAAc,YAAA,CAAa,MAAA,EAAO,EAAG;AAC9C,QAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC1B,QAAA,IAAI,UAAU,MAAA,EAAW;AACzB,QAAA,yBAAA;AAAA,UACE,KAAA;AAAA,UACA,MAAA,CAAO,OAAA;AAAA,UACP,MAAA,CAAO,OAAA;AAAA,UACP,CAAA,CAAE,WAAA;AAAA,UACF,MAAA,CAAO,UAAA;AAAA,UACP,KAAA,CAAM,UAAA;AAAA,UACN,KAAA,CAAM,UAAA;AAAA,UACN,KAAA,CAAM,cAAA;AAAA,UACN;AAAA,SACF;AAAA,MACF;AACA,MAAA,IAAI,CAAA,CAAE,UAAU,CAAA,EAAG;AACjB,QAAA,KAAA,CAAM,GAAA,CAAI,EAAE,WAAA,EAAa,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO;AAAA,MAC3D;AACA,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,CAAA,CAAE,UAAU,CAAA,IAAK,CAAC,UAAU,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,EAAG;AAEpD,MAAA,MAAMA,UAAAA,GAAY,SAAA,CAAU,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AACrD,MAAA,IAAIA,eAAc,MAAA,EAAW;AAC3B,QAAA,KAAA,MAAW,YAAYA,UAAAA,EAAW;AAChC,UAAA,MAAM,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACnC,UAAA,MAAM,QAAA,GAAW,SAAA,CAAU,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAChD,UAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,YAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,CAAiB,CAAA;AACzD,YAAA,SAAA,CAAU,aAAA,CAAc,OAAO,GAAG,CAAA;AAAA,UACpC;AAAA,QACF;AACA,QAAAA,WAAU,KAAA,EAAM;AAAA,MAClB;AACA,MAAA,SAAA,CAAU,MAAA,CAAO,OAAO,QAAQ,CAAA;AAEhC,MAAA,MAAM,SAAS,eAAA,CAAgB,KAAA,EAAO,EAAE,WAAA,EAAa,CAAA,CAAE,cAAc,MAAM,CAAA;AAC3E,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,MAAM,YAAA,uBAAmB,GAAA,EAAgC;AACzD,QAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,UAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAC7C,UAAA,IAAI,SAAS,MAAA,EAAW;AACtB,YAAA,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,CAAC,IAAI,CAAC,CAAA;AAAA,UAC1C,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,UAChB;AAAA,QACF;AAOA,QAAA,MAAM,OAAA,uBAAc,GAAA,EAA8B;AAClD,QAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,YAAA,EAAc;AAC5C,UAAA,OAAA,CAAQ,IAAI,QAAA,EAAU;AAAA,YACpB,KAAA;AAAA,YACA,MAAA,EAAQ,wBAAA,CAAyB,MAAA,CAAO,OAAA,EAAS,KAAK;AAAA,WACvD,CAAA;AAAA,QACH;AACA,QAAA,SAAA,CAAU,MAAA,CAAO,IAAI,QAAA,EAAU;AAAA,UAC7B,OAAA;AAAA,UACA,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AAAA,MACH;AACA,MAAA,IAAI,CAAA,CAAE,UAAU,CAAA,EAAG;AACjB,QAAA,KAAA,CAAM,GAAA,CAAI,EAAE,WAAA,EAAa,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,MAAA,EAAO;AAAA,MAC3D;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAI,UAAU,MAAA,EAAW;AAGzB,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,aAAA,GAAgB,yBAAyB,KAAK,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,YAAY,SAAA,CAAU,YAAA,CAAa,IAAI,QAAQ,CAAA,wBAAS,GAAA,EAAY;AAC1E,IAAA,SAAA,CAAU,YAAA,CAAa,GAAA,CAAI,QAAA,EAAU,SAAS,CAAA;AAC9C,IAAA,MAAM,EAAE,SAAQ,GAAI,KAAA;AAEpB,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,MAAM,OAAA,EAAS;AAC7C,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,KAAA;AAC1B,MAAA,MAAM,UAAU,aAAA,KAAkB,IAAA,IAAQ,OAAA,CAAQ,aAAA,CAAc,eAAe,MAAM,CAAA;AACrF,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAExC,MAAA,IAAI,OAAA,IAAW,CAAC,SAAA,EAAW;AAEzB,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,CAAA,GAAI,0BAAA;AAAA,YACR,KAAA;AAAA,YACA,OAAA;AAAA,YACA,CAAA,CAAE,WAAA;AAAA,YACF,KAAA,CAAM,UAAA;AAAA,YACN,IAAA;AAAA,YACA,IAAA,CAAK,UAAA;AAAA,YACL,KAAA,CAAM;AAAA,WACR;AACA,UAAA,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,CAAwC,CAAC,CAAA;AAAA,QACrE;AACA,QAAA,SAAA,CAAU,cAAc,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,IAAI,OAAO,CAAA;AAC9D,QAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,CAAC,OAAA,IAAW,SAAA,EAAW;AAEhC,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACnC,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAChD,QAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,UAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,CAAiB,CAAA;AACzD,UAAA,SAAA,CAAU,aAAA,CAAc,OAAO,GAAG,CAAA;AAAA,QACpC;AACA,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF","file":"chunk-KHI6K4C6.mjs","sourcesContent":["import type { World } from '@forgeax/engine-ecs';\nimport type { Asset, Handle, Result, TextureAsset } from '@forgeax/engine-types';\nimport { err, ok } from '@forgeax/engine-types';\n\nexport type TilesetRuntimeErrorCode =\n | 'tileset-atlas-not-found'\n | 'tileset-atlas-stale'\n | 'tileset-atlas-kind-mismatch';\n\nexport interface TilesetRuntimeError {\n readonly code: TilesetRuntimeErrorCode;\n readonly expected: string;\n readonly hint: string;\n readonly detail: {\n readonly guid: string;\n readonly actualKind?: string;\n };\n}\n\nexport interface ResolvedTilesetRuntime {\n readonly guid: string;\n readonly payload: TextureAsset;\n readonly handle: Handle<'TextureAsset', 'shared'>;\n}\n\nexport type TilesetAtlasLookup = Asset | { readonly code: 'stale' } | undefined;\n\n/** Project one durable atlas GUID into the current World at the tilemap owner. */\nexport function resolveTilesetRuntime(\n world: World,\n guid: string,\n lookup: (guid: string) => TilesetAtlasLookup,\n): Result<ResolvedTilesetRuntime, TilesetRuntimeError> {\n if (guid.length === 0) {\n return err({\n code: 'tileset-atlas-not-found',\n expected: 'a non-empty durable atlas GUID',\n hint: 'load the atlas payload before extracting the tilemap',\n detail: { guid },\n });\n }\n const payload = lookup(guid);\n if (payload === undefined) {\n return err({\n code: 'tileset-atlas-not-found',\n expected: `a loaded texture payload for atlas GUID ${guid}`,\n hint: 'load or retain the atlas before extracting the tilemap',\n detail: { guid },\n });\n }\n if ('code' in payload) {\n return err({\n code: 'tileset-atlas-stale',\n expected: `a current texture payload for atlas GUID ${guid}`,\n hint: 'rebuild the stale atlas projection before extracting the tilemap',\n detail: { guid },\n });\n }\n if (payload.kind !== 'texture') {\n return err({\n code: 'tileset-atlas-kind-mismatch',\n expected: 'a texture atlas payload',\n hint: `replace atlas GUID ${guid} with a texture asset`,\n detail: { guid, actualKind: payload.kind },\n });\n }\n return ok({\n guid,\n payload,\n handle: world.internSharedRef('TextureAsset', payload),\n });\n}\n","// @forgeax/engine-runtime - tilemap-chunk-extract-system.\n//\n// Walks every TileLayer attached to a Tilemap via ChildOf; when a layer is\n// dirty (or has never been extracted), purges its previously-spawned derived\n// per-cell entities and re-spawns one ECS entity per non-zero cell. Each\n// derived entity carries Transform + MeshFilter (a World-owned unit-quad ref) + MeshRenderer\n// + Layer + ChildOf { parent: layerEntity }. The ChildOf edge lets\n// `world.despawn(tilemapEntity)` cascade-despawn the entire subtree\n// (Tilemap -> TileLayer -> derived render entities) via the engine's\n// default `linkedSpawn: true` (tweak-20260714 M2, requirements AC-02/03/04).\n//\n// M0 baseline: unit-cell 1x1 form, single-atlas, no UV inset.\n// M2 extension (plan-strategy §D-2 + §D-7 step 3):\n// M3 extension (plan-strategy §D-7 step 2 + §D-12):\n// - resolveTilesetMaterial walks the 3-hop chain\n// `tile.regionIndex -> regions[i].atlasIndex ?? 0 -> atlases[idx]`\n// so multi-atlas tilesets route each region to the correct GPU\n// texture handle (requirements AC-04 / AC-11). Cache key stays\n// binary `(atlasHandle, regionIndex)` -- atlasHandle already\n// encodes the atlas pick.\n// - spawnDerivedRenderEntities scales the quad by widthCells x\n// heightCells (defaults 1 x 1) and offsets the centre so the pivot\n// lands at the (pivotX, pivotY) location inside the anchor cell.\n// - basePivotForX = D ? pivotY : pivotX (and dually for Y), so the\n// 90deg CW z-rotation correctly swaps which atlas-axis pivot maps\n// to which world axis.\n// - effectivePivotX = H ? (1 - basePivotForX) : basePivotForX (and\n// dually for Y). The anchor pivot under H flip lands at the\n// mirrored cell position (charter P4 - same semantics as Tiled's\n// \"pivot stays in atlas-local coords, flips with the texel grid\").\n// - posX = (cellX + effectivePivotX + (0.5 - effectivePivotX) * widthCells)\n// * tileSizeX\n// posY analogous with effectivePivotY + heightCells.\n// - scaleX/scaleY: signed by H/V flip; magnitude is widthCells *\n// tileSizeX / heightCells * tileSizeY (multi-cell scale).\n// - resolveTilesetMaterial inset-shrinks the region UV rectangle by\n// half a texel on every edge so GPU bilinear filtering at the\n// atlas-tile boundary never bleeds into the adjacent tile\n// (charter P3 - default behaviour avoids visual defects).\n//\n// M3 boundary: per-entity sort key with effectivePivotY is wired in\n// render-system-extract (m3-t5), not here.\n//\n// Cache key for resolveTilesetMaterial is BINARY: (atlasHandle, regionIndex).\n// AI users widthCells / pivot variations share the same material handle\n// (charter P4 consistent abstraction; plan-strategy §D-9 / §D-12).\n//\n// Anchors: plan-tasks m0-t10 / m2-t2 / m2-t4; plan-strategy §D-1 +\n// §D-2 (multi-cell + flip x pivot) + §D-5 (M0 baseline file-by-file\n// ECS API adaptation) + §D-7 step 3 (half-texel UV inset).\n\nimport type { EntityHandle, World } from '@forgeax/engine-ecs';\nimport { createPrimitiveMesh } from '@forgeax/engine-geometry';\nimport { decodeTileBits } from '@forgeax/engine-graphics-extras';\nimport { type box3, frustum, mat4 } from '@forgeax/engine-math';\nimport { ChildOf, Children, Transform } from '@forgeax/engine-scene';\nimport {\n type Handle,\n type MaterialAsset,\n type TilesetAsset,\n type TilesetRegion,\n type TilesetTileEntry,\n unwrapHandle,\n} from '@forgeax/engine-types';\nimport {\n CAMERA_PROJECTION_ORTHOGRAPHIC,\n Camera,\n decodeSortScope,\n Layer,\n MeshFilter,\n MeshRenderer,\n type SortScope,\n SpriteInstances,\n TileLayer,\n Tilemap,\n} from './components';\nimport { materialTextureValue, SPRITE_PREMULTIPLIED_ALPHA_BLEND } from './materials';\nimport { resolveTilesetRuntime, type TilesetAtlasLookup } from './tilemap/resolve-tileset-runtime';\n\n// Module-scoped caches (charter P5 — engine-side memoisation; AI users\n// never reach in). Test harness can flush them via the reset helpers.\n//\n// Two material caches coexist because the extract system produces two\n// kinds of derived entities, each with a different material-key granularity:\n//\n// 1. `atlasMaterialCache` — key `${atlasId}|${regionIndex}` → per-region\n// material with the UV rectangle baked into `values.region`.\n// Used by the per-cell entity path (sortScope='per-cell' object\n// layers). Each tile graphic gets a distinct MaterialAsset.\n//\n// 2. `atlasOnlyMaterialCache` — key `${atlasId}` → per-atlas material\n// with `values.region: [0,0,1,1]` placeholder. Used by the\n// SpriteInstances batched path (sortScope='layer' terrain layers).\n// The shader's PER_INSTANCE_REGION=true variant reads per-instance\n// UV from the instance buffer, not from the material UBO, so the\n// placeholder is ignored at draw time.\nlet atlasMaterialCache = new WeakMap<World, Map<string, number>>();\nlet atlasOnlyMaterialCache = new WeakMap<World, Map<string, number>>();\nconst unitQuadHandleByWorld = new WeakMap<World, Handle<'MeshAsset', 'shared'>>();\n\nfunction unitQuadHandle(world: World): Handle<'MeshAsset', 'shared'> {\n const existing = unitQuadHandleByWorld.get(world);\n if (existing !== undefined) return existing;\n const mesh = createPrimitiveMesh('quad').unwrap();\n const handle = world.internSharedRef('MeshAsset', mesh);\n unitQuadHandleByWorld.set(world, handle);\n return handle;\n}\n// tweak-20260714 M3 (plan-strategy §2 D-3): the terrain (sortScope='layer')\n// derived-entity tracker Map + first-frame-heuristic Set that used to live\n// alongside these material caches were retired once every derived entity\n// was attached as `ChildOf` child of its TileLayer (M2). The reverse\n// mirror `Children.entities` on the TileLayer is now the SSOT for\n// \"which derived entities belong to this layer\" — engine-maintained on\n// `world.addComponent(ChildOf) / world.despawn`, deriving-not-duplicating\n// (architecture-principles §2). `purgeDerivedEntities` reads that mirror\n// directly; the \"already built\" gate uses `Children.entities.length > 0`,\n// which naturally handles both first frames (empty ⇒ rebuild) and steady\n// state (populated ⇒ skip) without a second parallel ledger.\n\n// ─── Chunk-streaming state for sortScope='per-cell' (object) layers ───────\n//\n// Object layers stream per-chunk: only chunks whose world AABB intersects the\n// camera frustum have per-cell entities alive in the ECS world. This keeps\n// extractFrame's entity count proportional to visible tile count rather than\n// total map tile count (charter P5: engine-side memoisation / streaming).\n//\n// Design: one WeakMap entry per World owns three bounded maps:\n// layers : layerKey → pre-bucketed specs by chunkIndex (built once\n// from bucketTileLayer, rebuilt on dirty). Avoids re-reading\n// the full tileset and re-materialising every frame.\n// chunkEntities : \"${layerKey}:${chunkIdx}\" → spawned entity ids\n// for that chunk (purged when chunk leaves frustum).\n// activeChunks : layerKey → Set<chunkIdx> currently spawned.\n//\n// bug-20260703-tilemap-chunk-stale-frustum-and-cull-overhang (D2): each entry\n// stores the ACTUAL world-space bounding box (union of every tile's post-TRS\n// footprint from `computeTileTrs`) rather than a tile-aligned grid box.\n// Multi-cell tiles (`widthCells` / `heightCells > 1`) and non-central pivots\n// let a tile extend beyond its anchor chunk's grid; the grid box would\n// despawn the anchor chunk while overhanging tiles were still on screen,\n// causing edge-of-chunk flicker as the camera pans. Bounds are computed once\n// per (dirty | first-time) rebuild, so the per-frame visibility test stays a\n// single `frustum.intersectsBox` call (plan-strategy §2 D-3).\ninterface ChunkStreamEntry {\n readonly specs: readonly DerivedSpawnSpec[];\n readonly bounds: box3.Box3Like;\n}\ninterface StreamLayerCache {\n readonly byChunk: ReadonlyMap<number, ChunkStreamEntry>;\n readonly tilemap: {\n readonly cols: number;\n readonly rows: number;\n readonly tileSize: ArrayLike<number>;\n readonly chunkSize: number;\n };\n readonly layerOrder: number;\n readonly sortScope: SortScope;\n}\ninterface PerWorldStreamingCache {\n readonly layers: Map<string, StreamLayerCache>;\n readonly chunkEntities: Map<string, number[]>;\n readonly activeChunks: Map<string, Set<number>>;\n}\n\nlet streamingCacheByWorld = new WeakMap<World, PerWorldStreamingCache>();\n\nfunction streamingCache(world: World): PerWorldStreamingCache {\n let cache = streamingCacheByWorld.get(world);\n if (cache === undefined) {\n cache = {\n layers: new Map(),\n chunkEntities: new Map(),\n activeChunks: new Map(),\n };\n streamingCacheByWorld.set(world, cache);\n }\n return cache;\n}\n\n/**\n * Flush both material caches. Useful in test harnesses + after a\n * TilesetAsset reload.\n */\nexport function resetTilemapChunkExtractCache(): void {\n atlasMaterialCache = new WeakMap<World, Map<string, number>>();\n atlasOnlyMaterialCache = new WeakMap<World, Map<string, number>>();\n}\n\n/**\n * Flush the per-cell streaming caches. Useful in test harnesses + when\n * the World is re-created.\n *\n * Signature preserved (AC-08 hard constraint) after tweak-20260714 M3\n * retired the terrain-side tracker Map + first-frame heuristic Set:\n * terrain layers now derive their \"already-built\" state from\n * `Children.entities` on the TileLayer (mirror of ChildOf, engine-\n * maintained), so the tracker only needs to clear the 3 streaming\n * caches (plan-strategy §2 D-3 + §2 D-5).\n */\nexport function resetTilemapDerivedEntityTracker(): void {\n streamingCacheByWorld = new WeakMap<World, PerWorldStreamingCache>();\n}\n\n/**\n * @internal Test-only helper for AC-11 (tweak-20260714 M4). Returns the\n * union of `layerKey`s currently referenced by the three per-cell\n * streaming caches. Post-diff-cleanup, an evicted layerKey MUST NOT\n * appear here; a slot subsequently reused for a fresh TileLayer sees\n * empty caches and rebuilds from zero (plan-strategy §2 D-4).\n *\n * Parsing the per-World `chunkEntities` key format `${entity}:${chunkIdx}`\n * is intentional so callers observe cleanup on all three maps without\n * depending on the invariant `activeSet ↔ chunkEntities\n * keys are paired` — the test then also cross-checks that invariant.\n */\nexport function _peekPerCellStreamingLayerKeys(world: World): readonly number[] {\n const cache = streamingCacheByWorld.get(world);\n if (cache === undefined) return [];\n const out = new Set<number>();\n for (const layerKey of cache.layers.keys()) {\n if (Number.isFinite(Number(layerKey))) out.add(Number(layerKey));\n }\n for (const layerKey of cache.activeChunks.keys()) {\n if (Number.isFinite(Number(layerKey))) out.add(Number(layerKey));\n }\n for (const key of cache.chunkEntities.keys()) {\n const parts = key.split(':');\n const entity = parts[0];\n if (entity !== undefined && Number.isFinite(Number(entity))) out.add(Number(entity));\n }\n return Array.from(out);\n}\n\n/**\n * Compute the per-layer / per-chunk packed value carried in `Layer.value`\n * on derived entities. `sortScope` is the closed string union from\n * `TileLayer.sortScope`:\n * - `'layer'` (default): `(layerOrder << 20) | (chunkIndex & 0xFFFFF)` —\n * terrain semantics, layerOrder dominates with chunkIndex\n * tiebreak within the layer.\n * - `'per-cell'`: returns `(layerOrder << 20)` (chunkIndex folded to 0)\n * so every derived entity in the layer shares one\n * Layer.value and can Y-interleave with sprite entities\n * carrying the same value (e.g. a player sprite riding\n * `SPRITE_LAYER_VALUE = layerOrder << 20`).\n *\n * Round-2 rename (D-V-3): the third arg was `ySort: boolean` before the\n * sortScope union landed; it is now the closed `SortScope` union with\n * default `'layer'`. The 0x200000 / chunked-bits semantics for the two\n * arms are preserved exactly so existing pixel-parity baselines stay\n * stable (only the AI-user surface widens to a self-documenting literal).\n */\nexport function encodeTilemapLayerValue(\n layerOrder: number,\n chunkIndex: number,\n sortScope: SortScope = 'layer',\n): number {\n if (sortScope === 'per-cell') return (layerOrder << 20) | 0;\n return (layerOrder << 20) | (chunkIndex & 0xfffff) | 0;\n}\n\n/**\n * Resolve (regionIndex) into a per-tile sprite material handle by walking\n * the 3-hop chain:\n *\n * tile.regionIndex -> regions[regionIndex] -> region.atlasIndex ?? 0\n * -> atlases[atlasIndex]\n *\n * (plan-strategy §D-7 step 2 + requirements §AC-04 / §AC-11). Caches the\n * resulting MaterialAsset handle so repeated lookups hit a single\n * registered material per atlas-region pair; the cache key stays the\n * binary tuple `(atlasHandle, regionIndex)` -- atlasHandle already\n * encodes the atlasIndex pick so widening to a 3-tuple key would only\n * inflate the SSOT without adding signal (charter P4 + plan-strategy\n * §D-12). atlasIndex out-of-range is caught at register time by\n * `validateTilesetPayload` (m1-t6); the runtime resolver falls through\n * to handle 0 when an atlas slot is unexpectedly empty so the renderer\n * skips the draw rather than silently sampling the wrong texture\n * (charter P3 fail-safe).\n *\n * The shader is `forgeax::sprite`; values are filled with the atlas\n * texture handle + a UV region rectangle covering the supplied\n * TilesetRegion (half-texel inset added in m2-t4).\n */\nfunction resolveTilesetMaterial(\n world: World,\n tileset: TilesetAsset,\n regionIndex: number,\n lookup: (guid: string) => TilesetAtlasLookup,\n): number {\n const region = tileset.regions[regionIndex];\n if (region === undefined) return 0;\n // 3-hop walk: regions[i].atlasIndex (default 0) -> atlases[atlasIndex].\n // atlasIndex out-of-range is register-time fail-fast via\n // `validateTilesetPayload` (m1-t6); the runtime resolver still bails\n // when the slot is unexpectedly empty (charter P3 fail-safe).\n const atlasIndex = region.atlasIndex ?? 0;\n const atlasGuid = tileset.atlases[atlasIndex];\n if (atlasGuid === undefined) return 0;\n const atlas = resolveTilesetRuntime(world, atlasGuid, lookup);\n if (!atlas.ok) return 0;\n const atlasHandle = atlas.value.handle;\n const atlasId = unwrapHandle(atlasHandle);\n const cacheKey = `${atlasId}|${regionIndex}`;\n const cache = atlasMaterialCache.get(world) ?? new Map<string, number>();\n atlasMaterialCache.set(world, cache);\n const cached = cache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n // Atlas-space rectangle -> normalised UV. M2 adds a half-texel inset\n // on every edge (plan-strategy §D-7 step 3) so GPU bilinear filtering\n // at the region boundary never samples the adjacent atlas tile. Atlas\n // pixel extent comes from atlasSizes[atlasIndex] when present (exact\n // per-atlas pixel dimensions); falls back to columns * tileWidth for\n // single-atlas or legacy callers.\n const atlasSize = tileset.atlasSizes?.[atlasIndex];\n const atlasWidth = Math.max(\n 1,\n atlasSize !== undefined ? atlasSize.pixelWidth : tileset.columns * tileset.tileWidth,\n );\n const atlasHeight = Math.max(\n 1,\n atlasSize !== undefined ? atlasSize.pixelHeight : tileset.rows * tileset.tileHeight,\n );\n const halfTexelU = 0.5 / atlasWidth;\n const halfTexelV = 0.5 / atlasHeight;\n const u = region.x / atlasWidth + halfTexelU;\n const v = region.y / atlasHeight + halfTexelV;\n const w = region.width / atlasWidth - 2 * halfTexelU;\n const h = region.height / atlasHeight - 2 * halfTexelV;\n\n const matPayload: MaterialAsset = {\n kind: 'material',\n passes: [\n {\n name: 'Forward',\n program: { module: 'forgeax::sprite' },\n renderState: {\n ...{ blend: SPRITE_PREMULTIPLIED_ALPHA_BLEND },\n tags: { LightMode: 'Forward' },\n queue: 3000,\n },\n },\n ],\n values: {\n colorTint: [1.0, 1.0, 1.0, 1.0],\n baseColorTexture: materialTextureValue(atlasHandle),\n region: [u, v, w, h],\n pivotAndSize: [0.5, 0.5, 1.0, 1.0],\n flipY: 1.0,\n },\n };\n const matHandle = world.allocSharedRef<'MaterialAsset', MaterialAsset>(\n 'MaterialAsset',\n matPayload,\n );\n const id = unwrapHandle(matHandle);\n cache.set(cacheKey, id);\n return id;\n}\n\n/**\n * Resolve an atlas-only sprite material (no baked-in UV region). One\n * material per atlas — used by the SpriteInstances batched draw path\n * (sortScope='layer'). The per-instance UV region rectangle lives in the\n * `SpriteInstances.regions` buffer instead of in the material UBO.\n *\n * `values.region` is a `[0, 0, 1, 1]` placeholder. The sprite shader's\n * `PER_INSTANCE_REGION=true` variant reads region from\n * `instances[idx].region` and ignores the material slot; selecting that\n * variant is the record stage's responsibility (see\n * `render-system-record.ts` sprite pass pipeline selection).\n *\n * Returns the registered MaterialAsset slot id (unwrapped Handle u32) or\n * 0 if the atlas slot is empty (charter P3 fail-safe; mirrors\n * `resolveTilesetMaterial`).\n */\nfunction resolveAtlasOnlyMaterial(\n world: World,\n tileset: TilesetAsset,\n atlasIndex: number,\n lookup: (guid: string) => TilesetAtlasLookup,\n): number {\n const atlasGuid = tileset.atlases[atlasIndex];\n if (atlasGuid === undefined) return 0;\n const atlas = resolveTilesetRuntime(world, atlasGuid, lookup);\n if (!atlas.ok) return 0;\n const atlasHandle = atlas.value.handle;\n const atlasId = unwrapHandle(atlasHandle);\n const cacheKey = String(atlasId);\n const cache = atlasOnlyMaterialCache.get(world) ?? new Map<string, number>();\n atlasOnlyMaterialCache.set(world, cache);\n const cached = cache.get(cacheKey);\n if (cached !== undefined) return cached;\n\n const matPayload: MaterialAsset = {\n kind: 'material',\n passes: [\n {\n name: 'Forward',\n program: { module: 'forgeax::sprite' },\n renderState: {\n ...{ blend: SPRITE_PREMULTIPLIED_ALPHA_BLEND },\n tags: { LightMode: 'Forward' },\n queue: 3000,\n },\n },\n ],\n values: {\n colorTint: [1.0, 1.0, 1.0, 1.0],\n baseColorTexture: materialTextureValue(atlasHandle),\n region: [0.0, 0.0, 1.0, 1.0],\n pivotAndSize: [0.5, 0.5, 1.0, 1.0],\n flipY: 1.0,\n },\n };\n const matHandle = world.allocSharedRef<'MaterialAsset', MaterialAsset>(\n 'MaterialAsset',\n matPayload,\n );\n const id = unwrapHandle(matHandle);\n cache.set(cacheKey, id);\n return id;\n}\n\n/**\n * Compute the half-texel-inset normalised UV rectangle for a TilesetRegion\n * (atlas-space pixels → atlas-normalised [u, v, w, h]). Mirrors the inset\n * computation inside `resolveTilesetMaterial` so the per-instance region\n * data fed into `SpriteInstances.regions` produces pixel-identical sampling\n * to the per-region material path (charter P4 consistent abstraction).\n */\nfunction computeRegionUv(\n tileset: TilesetAsset,\n region: TilesetRegion,\n atlasIndex: number,\n): [u: number, v: number, w: number, h: number] {\n const atlasSize = tileset.atlasSizes?.[atlasIndex];\n const atlasWidth = Math.max(\n 1,\n atlasSize !== undefined ? atlasSize.pixelWidth : tileset.columns * tileset.tileWidth,\n );\n const atlasHeight = Math.max(\n 1,\n atlasSize !== undefined ? atlasSize.pixelHeight : tileset.rows * tileset.tileHeight,\n );\n const halfTexelU = 0.5 / atlasWidth;\n const halfTexelV = 0.5 / atlasHeight;\n return [\n region.x / atlasWidth + halfTexelU,\n region.y / atlasHeight + halfTexelV,\n region.width / atlasWidth - 2 * halfTexelU,\n region.height / atlasHeight - 2 * halfTexelV,\n ];\n}\n\ninterface DerivedSpawnSpec {\n readonly cellX: number;\n readonly cellY: number;\n readonly tileId: number;\n readonly packedTile: number;\n readonly materialHandle: number;\n readonly chunkIndex: number;\n // M2: multi-cell footprint + custom pivot land per-tile via TilesetTileEntry.\n readonly widthCells: number;\n readonly heightCells: number;\n readonly pivotX: number;\n readonly pivotY: number;\n // Atlas + region indices retained so the SpriteInstances (sortScope=\n // 'layer') path can group cells by atlas and look up per-instance UV\n // without re-walking the 3-hop chain `tileId → regions → atlasIndex`.\n readonly atlasIndex: number;\n readonly regionIndex: number;\n}\n\nconst SQRT1_2 = Math.SQRT1_2;\n\n/**\n * Compute the post-flip \"effective pivot Y\" for a tilemap tile entry.\n *\n * Mirrors the D-2 first-line composition used by `spawnDerivedRenderEntities`:\n *\n * basePivotForY = flipDiagonal ? pivotX : pivotY\n * effectivePivotY = flipV ? (1 - basePivotForY) : basePivotForY\n *\n * Exported so the render-system-extract sprite-bucket sort key path can\n * reproduce the *same* per-entity pivot value that landed on\n * `Transform.posY` -- otherwise the foot-Y formula\n * `posY - effectivePivotY * |scaleY|` would drift on flipped tiles\n * (charter P4 single-source pivot SSOT; plan-strategy §D-1 + §D-2 +\n * requirements §AC-12 / §AC-13).\n */\nexport function effectivePivotYForTilemapFlip(\n pivotY: number,\n pivotX: number,\n flipV: boolean,\n flipDiagonal: boolean,\n): number {\n const base = flipDiagonal ? pivotX : pivotY;\n return flipV ? 1 - base : base;\n}\n\n/**\n * Compute the per-cell derived spawn spec for one non-zero cell. Carries\n * widthCells / heightCells / pivotX / pivotY from the TilesetTileEntry so\n * `spawnDerivedRenderEntities` can apply the D-2 geometric correction\n * without re-reading the asset registry.\n */\nfunction specFor(\n layerCols: number,\n chunkSize: number,\n cellIndex: number,\n packedTile: number,\n materialHandle: number,\n entry: TilesetTileEntry,\n atlasIndex: number,\n): DerivedSpawnSpec {\n const cellX = cellIndex % layerCols;\n const cellY = Math.floor(cellIndex / layerCols);\n const chunkX = Math.floor(cellX / chunkSize);\n const chunkY = Math.floor(cellY / chunkSize);\n const chunksPerRow = Math.max(1, Math.ceil(layerCols / chunkSize));\n const chunkIndex = chunkY * chunksPerRow + chunkX;\n const { tileId } = decodeTileBits(packedTile);\n return {\n cellX,\n cellY,\n tileId,\n packedTile,\n materialHandle,\n chunkIndex,\n widthCells: entry.widthCells ?? 1,\n heightCells: entry.heightCells ?? 1,\n pivotX: entry.pivotX ?? 0.5,\n pivotY: entry.pivotY ?? 0.5,\n atlasIndex,\n regionIndex: entry.regionIndex,\n };\n}\n\n/**\n * Compute the post-flip TRS components for one tile cell. The plan-strategy\n * §D-2 multi-cell + flip x pivot composite formula (first-line form):\n *\n * basePivotForX = D ? pivotY : pivotX\n * basePivotForY = D ? pivotX : pivotY\n * effectivePivotX = H ? (1 - basePivotForX) : basePivotForX\n * effectivePivotY = V ? (1 - basePivotForY) : basePivotForY\n * posX = (cellX + effectivePivotX + (0.5 - effectivePivotX) * widthCells)\n * * tileSizeX\n * posY = (cellY + effectivePivotY + (0.5 - effectivePivotY) * heightCells)\n * * tileSizeY\n * scaleX = (H ? -1 : 1) * widthCells * tileSizeX\n * scaleY = (V ? -1 : 1) * heightCells * tileSizeY\n * quatZ = D ? Math.SQRT1_2 : 0\n * quatW = D ? Math.SQRT1_2 : 1\n *\n * Single SSOT consumed by both the per-cell entity spawn path and the\n * SpriteInstances batched path so the two routes produce pixel-identical\n * world transforms (charter P4 consistent abstraction).\n */\nfunction computeTileTrs(\n tilemap: { tileSize: ArrayLike<number> },\n spec: DerivedSpawnSpec,\n packedTile: number,\n): {\n posX: number;\n posY: number;\n scaleX: number;\n scaleY: number;\n quatZ: number;\n quatW: number;\n} {\n const { flipH, flipV, flipDiagonal } = decodeTileBits(packedTile);\n const basePivotForX = flipDiagonal ? spec.pivotY : spec.pivotX;\n const effectivePivotX = flipH ? 1 - basePivotForX : basePivotForX;\n const effectivePivotY = effectivePivotYForTilemapFlip(\n spec.pivotY,\n spec.pivotX,\n flipV,\n flipDiagonal,\n );\n const tileSizeX = tilemap.tileSize[0] ?? 1;\n const tileSizeY = tilemap.tileSize[1] ?? 1;\n return {\n posX: (spec.cellX + effectivePivotX + (0.5 - effectivePivotX) * spec.widthCells) * tileSizeX,\n posY: (spec.cellY + effectivePivotY + (0.5 - effectivePivotY) * spec.heightCells) * tileSizeY,\n scaleX: (flipH ? -1 : 1) * spec.widthCells * tileSizeX,\n scaleY: (flipV ? -1 : 1) * spec.heightCells * tileSizeY,\n quatZ: flipDiagonal ? SQRT1_2 : 0,\n quatW: flipDiagonal ? SQRT1_2 : 1,\n };\n}\n\n/**\n * Spawn a single derived per-cell render entity. Used by the per-cell\n * sortScope path (`sortScope='per-cell'`, object layers) where each cell\n * needs an independent Y-sort position to interleave with sprite entities\n * (e.g. player) at arbitrary Y positions.\n *\n * `layerEntity` becomes the derived entity's `ChildOf.parent`, so\n * `world.despawn(layerEntity)` cascade-despawns every derived cell entity\n * via the engine's `linkedSpawn: true` default (feat-20260616). Combined\n * with the Tilemap -> TileLayer ChildOf edge, a single\n * `world.despawn(tilemapEntity)` unwinds the entire subtree without a\n * bespoke tilemap-scoped cleanup pass (requirements AC-02 / AC-03).\n */\nfunction spawnDerivedRenderEntities(\n world: World,\n tilemap: { tileSize: ArrayLike<number> },\n layerEntity: EntityHandle,\n layerOrder: number,\n spec: DerivedSpawnSpec,\n packedTile: number,\n sortScope: SortScope = 'layer',\n): EntityHandle {\n const { posX, posY, scaleX, scaleY, quatZ, quatW } = computeTileTrs(tilemap, spec, packedTile);\n const layerValue = encodeTilemapLayerValue(layerOrder, spec.chunkIndex, sortScope);\n return world\n .spawn(\n {\n component: Transform,\n data: {\n pos: [posX, posY, 0],\n quat: [0, 0, quatZ, quatW],\n scale: [scaleX, scaleY, 1],\n },\n },\n { component: MeshFilter, data: { assetHandle: unitQuadHandle(world) } },\n {\n component: MeshRenderer,\n data: {\n materials: [spec.materialHandle as unknown as Handle<'MaterialAsset', 'shared'>],\n },\n },\n { component: Layer, data: { value: layerValue } },\n { component: ChildOf, data: { parent: layerEntity } },\n )\n .unwrap();\n}\n\n/**\n * Spawn one batched SpriteInstances entity per (TileLayer, chunk, atlas)\n * group. Used by the `sortScope='layer'` path (terrain layers): every\n * cell in the group becomes one instance in the same drawIndexed call.\n *\n * The chunk grid is the unit declared by `Tilemap.chunkSize` (default\n * 16x16). One SpriteInstances entity per (chunk, atlas) pair keeps each\n * GPU instance buffer small (256 cells x 80B = 20KB worst case) and lets\n * downstream frustum culling / incremental rebuild operate at chunk\n * granularity (industry standard: Godot quadrant_size, Bevy ChunkSize,\n * Tiled TMX chunks).\n *\n * Layout:\n * - Transform: identity (the per-instance mat4 carries world-space TRS).\n * - MeshFilter: the World-owned unit-quad shared reference.\n * - MeshRenderer: atlas-only sprite material (region placeholder; shader\n * reads per-instance UV from SpriteInstances.regions under the\n * PER_INSTANCE_REGION=true variant — selected at record stage).\n * - SpriteInstances: { transforms: Float32Array(N*16),\n * regions: Float32Array(N*4) }.\n * - Layer: encodeTilemapLayerValue(layerOrder, chunkIndex, 'layer').\n * chunkIndex distinguishes adjacent chunks of the same layer in the\n * transparent-sort key so the back-to-front ordering between chunks\n * remains stable (chunks within a layer don't visually overlap in\n * normal tilemap scenes; the chunkIndex tiebreaker is byte-exact\n * with the per-cell path's encoding).\n *\n * Returns the spawned EntityHandle. Empty groups (zero cells) short-circuit\n * and return `undefined`.\n */\nfunction spawnSpriteInstancesGroup(\n world: World,\n tilemap: { cols: number; tileSize: ArrayLike<number>; chunkSize: number },\n tileset: TilesetAsset,\n layerEntity: EntityHandle,\n layerOrder: number,\n chunkIndex: number,\n atlasIndex: number,\n materialHandle: number,\n cellSpecs: readonly DerivedSpawnSpec[],\n): EntityHandle | undefined {\n if (cellSpecs.length === 0) return undefined;\n const N = cellSpecs.length;\n const transforms = new Float32Array(N * 16);\n const regions = new Float32Array(N * 4);\n const tmpMat = new Float32Array(16) as unknown as Parameters<typeof mat4.compose>[0];\n const tmpF = tmpMat as unknown as Float32Array;\n const tmpT: [number, number, number] = [0, 0, 0];\n const tmpR: [number, number, number, number] = [0, 0, 0, 1];\n const tmpS: [number, number, number] = [1, 1, 1];\n\n // Per-chunk frustum cull: entity Transform = chunk world center + chunk\n // extents (scaleX/Y). The frustum culler reads the entity AABB (unit quad\n // local [-0.5, 0.5]² expanded by entity scale/pos) → world AABB exactly\n // covers the chunk footprint.\n //\n // Per-instance transforms become chunk-local: inv_chunk * world_tile.\n // inv_chunk is a pure TRS-inverse (no rotation), so for each column c of\n // the world mat W:\n // local[c*4+0] = (W[c*4+0] - chunkCenterX * W[c*4+3]) * invSX\n // local[c*4+1] = (W[c*4+1] - chunkCenterY * W[c*4+3]) * invSY\n // local[c*4+2] = W[c*4+2]\n // local[c*4+3] = W[c*4+3]\n // The sprite shader then produces:\n // world = chunk_TRS * local_tile * pos_local\n // = chunk_TRS * (inv_chunk * world_tile) * pos_local\n // = world_tile * pos_local ✓ (pixel-identical to identity path)\n //\n // Tiles whose widthCells/heightCells straddle a chunk boundary will have\n // instance transforms that exceed the chunk AABB; the entity is still drawn\n // (conservative cull only skips when the chunk AABB is fully outside).\n const chunksPerRow = Math.max(1, Math.ceil(tilemap.cols / tilemap.chunkSize));\n const chunkX = chunkIndex % chunksPerRow;\n const chunkY = Math.floor(chunkIndex / chunksPerRow);\n const chunkScaleX = tilemap.chunkSize * (tilemap.tileSize[0] ?? 1);\n const chunkScaleY = tilemap.chunkSize * (tilemap.tileSize[1] ?? 1);\n const chunkCenterX = (chunkX + 0.5) * chunkScaleX;\n const chunkCenterY = (chunkY + 0.5) * chunkScaleY;\n const invSX = chunkScaleX > 0 ? 1 / chunkScaleX : 1;\n const invSY = chunkScaleY > 0 ? 1 / chunkScaleY : 1;\n\n for (let i = 0; i < N; i++) {\n const spec = cellSpecs[i] as DerivedSpawnSpec;\n const { posX, posY, scaleX, scaleY, quatZ, quatW } = computeTileTrs(\n tilemap,\n spec,\n spec.packedTile,\n );\n tmpT[0] = posX;\n tmpT[1] = posY;\n tmpT[2] = 0;\n tmpR[0] = 0;\n tmpR[1] = 0;\n tmpR[2] = quatZ;\n tmpR[3] = quatW;\n tmpS[0] = scaleX;\n tmpS[1] = scaleY;\n tmpS[2] = 1;\n mat4.compose(tmpMat, tmpT, tmpR, tmpS);\n\n // Write chunk-local transform: inv_chunk * world_tile (see formula above).\n const dst = i * 16;\n for (let c = 0; c < 4; c++) {\n const base = c * 4;\n const w3 = tmpF[base + 3] as number;\n transforms[dst + base + 0] = ((tmpF[base + 0] as number) - chunkCenterX * w3) * invSX;\n transforms[dst + base + 1] = ((tmpF[base + 1] as number) - chunkCenterY * w3) * invSY;\n transforms[dst + base + 2] = tmpF[base + 2] as number;\n transforms[dst + base + 3] = w3;\n }\n\n const region = tileset.regions[spec.regionIndex];\n if (region !== undefined) {\n const [u, v, w, h] = computeRegionUv(tileset, region, atlasIndex);\n regions[i * 4 + 0] = u;\n regions[i * 4 + 1] = v;\n regions[i * 4 + 2] = w;\n regions[i * 4 + 3] = h;\n }\n }\n\n const layerValue = encodeTilemapLayerValue(layerOrder, chunkIndex, 'layer');\n // plan-strategy D-2: the SpriteInstances entity's Transform.posY is set\n // to `chunkCenterY` (becomes `world[13]` in the entity's local-to-world\n // matrix). This is the LAYER_Y fold sort key — terrain rows share a\n // chunk Y, so per-chunk Y resolution is exactly the granularity the\n // fold pass needs. Per-tile world[13] (instance-level) is intentionally\n // _not_ used; instances live in the chunk-local space anchored at\n // chunkCenterY (see line 601-647 above). This is intentional, not a bug.\n return world\n .spawn(\n {\n component: Transform,\n data: {\n pos: [chunkCenterX, chunkCenterY, 0],\n quat: [0, 0, 0, 1],\n scale: [chunkScaleX, chunkScaleY, 1],\n },\n },\n { component: MeshFilter, data: { assetHandle: unitQuadHandle(world) } },\n {\n component: MeshRenderer,\n data: {\n materials: [materialHandle as unknown as Handle<'MaterialAsset', 'shared'>],\n },\n },\n { component: SpriteInstances, data: { transforms, regions } },\n { component: Layer, data: { value: layerValue } },\n { component: ChildOf, data: { parent: layerEntity } },\n )\n .unwrap();\n}\n\n/**\n * Bucket a single layer's tiles into per-non-zero-cell spawn specs.\n * Returns the parent Tilemap metadata + the resolved spawn specs.\n */\nfunction bucketTileLayer(\n world: World,\n layerEntity: EntityHandle,\n parentEntity: EntityHandle,\n lookup: (guid: string) => TilesetAtlasLookup,\n):\n | {\n readonly tilemap: {\n cols: number;\n rows: number;\n tileSize: ArrayLike<number>;\n chunkSize: number;\n };\n readonly layerOrder: number;\n readonly sortScope: SortScope;\n readonly tileset: TilesetAsset;\n readonly specs: readonly DerivedSpawnSpec[];\n }\n | undefined {\n const tilemapRes = world.get(parentEntity, Tilemap);\n if (!tilemapRes.ok) return undefined;\n const tilemap = tilemapRes.value;\n const tilesetPayload = lookup(tilemap.tileset);\n if (tilesetPayload === undefined || 'code' in tilesetPayload) return undefined;\n if (tilesetPayload.kind !== 'tileset') return undefined;\n const tileset = tilesetPayload;\n\n const layerRes = world.get(layerEntity, TileLayer);\n if (!layerRes.ok) return undefined;\n const layer = layerRes.value;\n const tiles = layer.tiles as Uint32Array;\n const sortScope = decodeSortScope(layer.sortScope);\n\n // sortScope='layer' (terrain) uses the SpriteInstances batched path which\n // groups cells by atlas under an atlas-only material; sortScope='per-cell'\n // (object) keeps the per-cell entity path with per-region materials so\n // each cell can interleave with sprites by foot-Y. The material resolver\n // selection here keeps the spec's `materialHandle` in the correct\n // granularity for whichever spawn path consumes it downstream.\n const useSpriteInstances = sortScope === 'layer';\n\n const specs: DerivedSpawnSpec[] = [];\n for (let i = 0; i < tiles.length; i++) {\n const packed = tiles[i] ?? 0;\n if (packed === 0) continue;\n const { tileId } = decodeTileBits(packed);\n if (tileId === 0) continue;\n const entry = tileset.tiles[tileId - 1];\n if (entry === undefined) continue;\n const region = tileset.regions[entry.regionIndex];\n if (region === undefined) continue;\n const atlasIndex = region.atlasIndex ?? 0;\n const materialHandle = useSpriteInstances\n ? resolveAtlasOnlyMaterial(world, tileset, atlasIndex, lookup)\n : resolveTilesetMaterial(world, tileset, entry.regionIndex, lookup);\n const spec = specFor(\n tilemap.cols,\n tilemap.chunkSize,\n i,\n packed,\n materialHandle,\n entry,\n atlasIndex,\n );\n specs.push(spec);\n }\n return {\n tilemap,\n layerOrder: layer.layerOrder,\n sortScope,\n tileset,\n specs,\n };\n}\n\n/**\n * Compute the camera frustum planes for the first Camera + Transform entity\n * found in the world. Returns null when no camera exists or the projection\n * parameters are degenerate (callers treat null as always-visible).\n *\n * Mirrors the frustum-plane computation in render-system-extract so both\n * cull paths use byte-identical planes (charter P4 consistent abstraction).\n */\nfunction buildCameraFrustumPlanes(world: World): frustum.Frustum | null {\n const query = world.query({ with: [Camera, Transform] }).unwrap();\n let result: frustum.Frustum | null = null;\n for (const row of query) {\n const camEntity = row.entity;\n\n const camRes = world.get(camEntity, Camera);\n const trRes = world.get(camEntity, Transform);\n if (!camRes.ok || !trRes.ok) continue;\n\n const cam = camRes.value as unknown as {\n near: number;\n far: number;\n projection: number;\n left: number;\n right: number;\n bottom: number;\n top: number;\n fov: number;\n aspect: number;\n };\n const tr = trRes.value as unknown as { world: Float32Array };\n\n const { near, far } = cam;\n if (near >= far) continue;\n\n const proj = mat4.create();\n if (cam.projection === CAMERA_PROJECTION_ORTHOGRAPHIC) {\n mat4.orthographic(\n proj as Parameters<typeof mat4.orthographic>[0],\n cam.left,\n cam.right,\n cam.bottom,\n cam.top,\n near,\n far,\n );\n } else {\n mat4.perspective(\n proj as Parameters<typeof mat4.perspective>[0],\n cam.fov,\n cam.aspect,\n near,\n far,\n );\n }\n const view = mat4.create();\n mat4.invert(\n view as Parameters<typeof mat4.invert>[0],\n tr.world as Parameters<typeof mat4.invert>[1],\n );\n const vp = mat4.create();\n mat4.multiply(\n vp as Parameters<typeof mat4.multiply>[0],\n proj as Parameters<typeof mat4.multiply>[1],\n view as Parameters<typeof mat4.multiply>[2],\n );\n const f = frustum.create();\n frustum.fromViewProjection(f, vp as Parameters<typeof frustum.fromViewProjection>[1]);\n result = f;\n break;\n }\n return result;\n}\n\n/**\n * bug-20260703-tilemap-chunk-stale-frustum-and-cull-overhang (D2): compute\n * the world-space AABB that tightly encloses every tile inside a chunk\n * after post-TRS placement (`computeTileTrs` applied per spec, SSOT shared\n * with the per-cell spawn path and SpriteInstances batched path). This is\n * the SSOT the streaming visibility test uses to decide whether a chunk's\n * tiles could still be visible; using it instead of the tile-aligned grid\n * box makes multi-cell / non-central-pivot overhang round-trip correctly,\n * so an overhanging tile no longer disappears when its anchor chunk goes\n * off-screen (plan-strategy §2 D-2).\n *\n * Empty spec list -> inverted `Number.MAX_VALUE` sentinel (plan-strategy\n * §2 D-4). `bucketTileLayer` filters empty cells before the byChunk map\n * is built, so this branch should never trigger in production; the\n * sentinel is an explicit \"no visible pixels\" value that\n * `frustum.intersectsBox` rejects immediately, avoiding any silent NaN\n * propagation path (charter P3 explicit failure).\n *\n * Note: `frustum.intersectsBox` picks a p-vertex per plane and computes\n * `dot(normal, p) + d`. When normal has a zero component, multiplying by\n * `Infinity` yields `NaN` (`NaN < 0 === false` -> false positive\n * intersection). The sentinel uses finite `Number.MAX_VALUE` on the axes\n * we want inverted so `0 * MAX_VALUE === 0` and the non-zero-normal axis\n * dominates, driving `dot` to `-Infinity` and correctly rejecting.\n *\n * Z is expanded to +/- 1 so flat sprite geometry (`pos_local.z === 0`) is\n * never degenerate against the frustum's near/far planes.\n *\n * @internal exported for M2 overhang / empty-chunk sentinel unit tests\n * (plan-strategy §5.3); not part of the AI user surface.\n */\nexport function computeChunkStreamBounds(\n tilemap: { tileSize: ArrayLike<number> },\n specs: readonly DerivedSpawnSpec[],\n): box3.Box3Like {\n let minX = Number.MAX_VALUE;\n let minY = Number.MAX_VALUE;\n let maxX = -Number.MAX_VALUE;\n let maxY = -Number.MAX_VALUE;\n for (const spec of specs) {\n const { posX, posY, scaleX, scaleY } = computeTileTrs(tilemap, spec, spec.packedTile);\n const halfW = Math.abs(scaleX) * 0.5;\n const halfH = Math.abs(scaleY) * 0.5;\n const x0 = posX - halfW;\n const x1 = posX + halfW;\n const y0 = posY - halfH;\n const y1 = posY + halfH;\n if (x0 < minX) minX = x0;\n if (y0 < minY) minY = y0;\n if (x1 > maxX) maxX = x1;\n if (y1 > maxY) maxY = y1;\n }\n return [minX, minY, -1, maxX, maxY, 1] as unknown as box3.Box3Like;\n}\n\n/**\n * Despawn every derived render entity currently attached to `layerEntity`.\n *\n * After tweak-20260714 M3 the terrain path locates its previously-spawned\n * children via `Children.entities` on the TileLayer (mirror of ChildOf,\n * engine-maintained via the relationship hook) rather than a module-level\n * tracker Map — SSOT collapse per architecture-principles §2 (Derive,\n * Don't Duplicate). The snapshot returned by\n * `world.get(layerEntity, Children).entities` is a fresh read-only\n * Uint32Array that is stable across the iteration even though each\n * despawn prunes the mirror in place.\n *\n * Empty children (never-built layer, or already-purged) trivially\n * short-circuits — this is the \"empty array no-op\" equivalence to the\n * old first-frame-heuristic guard (plan-strategy §2 D-3 edge case 3).\n */\nfunction purgeDerivedEntities(world: World, layerEntity: EntityHandle): void {\n const r = world.get(layerEntity, Children);\n if (!r.ok) return;\n const snap = r.value.entities;\n for (let i = 0; i < snap.length; i++) {\n const e = snap[i];\n if (e !== undefined) world.despawn(e as EntityHandle);\n }\n}\n\n/**\n * Snapshot of a single TileLayer's per-frame work item — populated by the\n * main-loop query and consumed both by the per-cell diff-cleanup preamble\n * (`evictDeadPerCellStreamingCaches`) and the per-layer processing branches.\n */\ninterface LayerWork {\n readonly layerEntity: EntityHandle;\n readonly parentEntity: EntityHandle;\n readonly dirty: number;\n readonly sortScopeRaw: number;\n}\n\n/**\n * tweak-20260714 M4 diff-cleanup preamble (plan-strategy §2 D-4 +\n * requirements §5 AC-11 + §8 edge case #4).\n *\n * The per-cell streaming maps are owned by one weak World entry and outlive\n * individual TileLayer entities while that World is alive. When a TileLayer\n * is despawned (or cascade-collected via `world.despawn(tilemapEntity)`) the\n * ECS mirrors clean up entities and `Children.entities`, but these maps retain\n * the dead layer's entries until this diff. On slot reuse, the stale entries\n * would corrupt rebuild: `activeSet` still lists old\n * chunkIndexes, and the rebuild branch would attempt to despawn stale\n * entity IDs before repopulating.\n *\n * Fix: at the top of each frame, diff this World's cached layer keys against\n * the fresh query. The set\n * difference names layers that vanished since the previous call; evict\n * their entries from all three Maps. `activeSet` is the SSOT for \"which\n * chunkIndexes have entries under this layer\" (each insertion / removal\n * pairs a `chunkEntities` set/delete with an `activeSet` add/delete), so\n * cleanup iterates `activeSet` rather than scanning `chunkEntities.keys()` —\n * O(chunks-per-dead-layer) instead\n * of O(total-cache-keys).\n *\n * Cross-world isolation is structural: the WeakMap key is the World object.\n * No duplicated World id is retained in every layer/chunk key.\n *\n * Per-frame cost (OOS-3 invariant): the two `keys()` iterations scan\n * O(cache_size) ≤ O(all-ever-seen-layers-for-this-worldId). Typical\n * scenes have ≤ 10 layers so this is a handful of Map lookups; no\n * matrix arithmetic. Actual eviction work only runs on frames where a\n * layer vanished — steady-state frames pay only the diff scan.\n */\nfunction evictDeadPerCellStreamingCaches(work: readonly LayerWork[], world: World): void {\n const cache = streamingCache(world);\n const aliveLayerKeys = new Set<string>();\n for (const w of work) {\n aliveLayerKeys.add(String(unwrapHandle(w.layerEntity as unknown as Handle<string, 'shared'>)));\n }\n const deadLayerKeys = new Set<string>();\n for (const layerKey of cache.activeChunks.keys()) {\n if (!aliveLayerKeys.has(layerKey)) deadLayerKeys.add(layerKey);\n }\n for (const layerKey of cache.layers.keys()) {\n if (!aliveLayerKeys.has(layerKey)) deadLayerKeys.add(layerKey);\n }\n for (const deadKey of deadLayerKeys) {\n const activeSet = cache.activeChunks.get(deadKey);\n if (activeSet !== undefined) {\n for (const chunkIdx of activeSet) {\n cache.chunkEntities.delete(`${deadKey}:${chunkIdx}`);\n }\n cache.activeChunks.delete(deadKey);\n }\n cache.layers.delete(deadKey);\n }\n}\n\n/**\n * Walk every TileLayer ChildOf-ing a Tilemap, extract its non-zero cells\n * into derived render entities. A Renderer attaches this system to FrameEnd;\n * World's final publication then resolves newly-created Transform.world values before the\n * read-only render walk begins.\n *\n * Two paths based on `TileLayer.sortScope`:\n *\n * `'layer'` (terrain, default):\n * Batched SpriteInstances path — spawned once, reused until dirty. Each\n * (chunk, atlas) pair becomes one SpriteInstances entity whose Transform\n * covers the chunk footprint, so the frustum culler rejects off-screen\n * chunks at entity granularity.\n *\n * `'per-cell'` (object layers):\n * Chunk-streaming path — specs are bucketed by chunkIndex once (rebuilt\n * on dirty) and the live entity set is updated every frame to match the\n * camera frustum. Only chunks whose world AABB intersects the frustum\n * have ECS entities alive, keeping `extractFrame` iteration proportional\n * to visible tile count rather than total map tile count.\n */\nexport function tilemapChunkExtractSystem(\n world: World,\n lookup: (guid: string) => TilesetAtlasLookup = () => undefined,\n): void {\n const streaming = streamingCache(world);\n const work: LayerWork[] = [];\n const tileLayerQuery = world.query({ read: [TileLayer, ChildOf] }).unwrap();\n for (const row of tileLayerQuery) {\n const layer = row.get(TileLayer);\n const parent = row.get(ChildOf).parent;\n if (parent === null) continue;\n work.push({\n layerEntity: row.entity,\n parentEntity: parent,\n dirty: layer.dirty,\n sortScopeRaw: layer.sortScope,\n });\n }\n\n evictDeadPerCellStreamingCaches(work, world);\n\n // Compute the camera frustum once per frame — only needed when at least\n // one streaming (per-cell) layer exists. Null = always-visible fallback.\n let frustumPlanes: frustum.Frustum | null | undefined;\n\n for (const w of work) {\n // The outer WeakMap owns World identity; this generation-bearing packed\n // entity handle prevents aliasing when an ECS slot is reused.\n const layerKey = String(unwrapHandle(w.layerEntity as unknown as Handle<string, 'shared'>));\n // AC-04: decode via the canonical SortScope union; avoid relying on the\n // raw encoding (0='layer', 1='per-cell') leaking through this call site.\n // `decodeSortScope` is the SSOT used throughout `bucketTileLayer` (see\n // line 730); this main-loop branch is the last remaining numeric check.\n const isStreaming = decodeSortScope(w.sortScopeRaw) === 'per-cell';\n\n if (!isStreaming) {\n // ── Terrain batched path (sortScope='layer') ──────────────────────\n // Spawn once per dirty; entity AABB covers the chunk footprint for\n // entity-level frustum culling in render-system-extract.\n //\n // \"already built\" is derived from Children.entities (mirror of\n // ChildOf, engine-maintained). Empty children ⇒ never built (or\n // just purged) ⇒ don't skip. Populated children + dirty=0 ⇒\n // steady state ⇒ skip. Populated + dirty=1 ⇒ purge + rebuild.\n // architecture-principles §2 (Derive, Don't Duplicate): the\n // former module-level \"ever-built\" Set was a second copy of\n // information that Children.entities already carries.\n const childrenRes = world.get(w.layerEntity, Children);\n const childCount = childrenRes.ok ? childrenRes.value.entities.length : 0;\n if (childCount > 0 && w.dirty === 0) continue;\n\n purgeDerivedEntities(world, w.layerEntity);\n\n const bucket = bucketTileLayer(world, w.layerEntity, w.parentEntity, lookup);\n if (bucket === undefined) continue;\n\n const byChunkAtlas = new Map<number, DerivedSpawnSpec[]>();\n for (const spec of bucket.specs) {\n const key = ((spec.chunkIndex & 0xfffff) << 16) | (spec.atlasIndex & 0xffff);\n const list = byChunkAtlas.get(key);\n if (list === undefined) {\n byChunkAtlas.set(key, [spec]);\n } else {\n list.push(spec);\n }\n }\n for (const groupSpecs of byChunkAtlas.values()) {\n const first = groupSpecs[0];\n if (first === undefined) continue;\n spawnSpriteInstancesGroup(\n world,\n bucket.tilemap,\n bucket.tileset,\n w.layerEntity,\n bucket.layerOrder,\n first.chunkIndex,\n first.atlasIndex,\n first.materialHandle,\n groupSpecs,\n );\n }\n if (w.dirty !== 0) {\n world.set(w.layerEntity, TileLayer, { dirty: 0 }).unwrap();\n }\n continue;\n }\n\n // ── Object streaming path (sortScope='per-cell') ───────────────────\n // Step 1: rebuild specs cache when dirty or first time.\n if (w.dirty !== 0 || !streaming.layers.has(layerKey)) {\n // Despawn all currently-active chunks for this layer.\n const activeSet = streaming.activeChunks.get(layerKey);\n if (activeSet !== undefined) {\n for (const chunkIdx of activeSet) {\n const key = `${layerKey}:${chunkIdx}`;\n const entities = streaming.chunkEntities.get(key);\n if (entities !== undefined) {\n for (const e of entities) world.despawn(e as EntityHandle);\n streaming.chunkEntities.delete(key);\n }\n }\n activeSet.clear();\n }\n streaming.layers.delete(layerKey);\n\n const bucket = bucketTileLayer(world, w.layerEntity, w.parentEntity, lookup);\n if (bucket !== undefined) {\n const byChunkSpecs = new Map<number, DerivedSpawnSpec[]>();\n for (const spec of bucket.specs) {\n const list = byChunkSpecs.get(spec.chunkIndex);\n if (list === undefined) {\n byChunkSpecs.set(spec.chunkIndex, [spec]);\n } else {\n list.push(spec);\n }\n }\n // bug-20260703 D2: promote each chunk's bucket to a ChunkStreamEntry\n // carrying the world-space bounds that enclose every tile's actual\n // footprint (not the tile-aligned grid box). The visibility test\n // then rejects the chunk only when its TRUE pixels are all\n // off-screen, so multi-cell / off-pivot tiles no longer flicker at\n // chunk-boundary crossings (plan-strategy §2 D-2 / D-3).\n const byChunk = new Map<number, ChunkStreamEntry>();\n for (const [chunkIdx, specs] of byChunkSpecs) {\n byChunk.set(chunkIdx, {\n specs,\n bounds: computeChunkStreamBounds(bucket.tilemap, specs),\n });\n }\n streaming.layers.set(layerKey, {\n byChunk,\n tilemap: bucket.tilemap,\n layerOrder: bucket.layerOrder,\n sortScope: bucket.sortScope,\n });\n }\n if (w.dirty !== 0) {\n world.set(w.layerEntity, TileLayer, { dirty: 0 }).unwrap();\n }\n }\n\n const cache = streaming.layers.get(layerKey);\n if (cache === undefined) continue;\n\n // Step 2: lazy-compute camera frustum on first streaming layer.\n if (frustumPlanes === undefined) {\n frustumPlanes = buildCameraFrustumPlanes(world);\n }\n\n // Step 3: diff visible chunks against active set.\n const activeSet = streaming.activeChunks.get(layerKey) ?? new Set<number>();\n streaming.activeChunks.set(layerKey, activeSet);\n const { tilemap } = cache;\n\n for (const [chunkIdx, entry] of cache.byChunk) {\n const { specs, bounds } = entry;\n const visible = frustumPlanes === null || frustum.intersectsBox(frustumPlanes, bounds);\n const wasActive = activeSet.has(chunkIdx);\n\n if (visible && !wasActive) {\n // Spawn per-cell entities for this newly-visible chunk.\n const spawned: number[] = [];\n for (const spec of specs) {\n const e = spawnDerivedRenderEntities(\n world,\n tilemap,\n w.layerEntity,\n cache.layerOrder,\n spec,\n spec.packedTile,\n cache.sortScope,\n );\n spawned.push(unwrapHandle(e as unknown as Handle<string, 'shared'>));\n }\n streaming.chunkEntities.set(`${layerKey}:${chunkIdx}`, spawned);\n activeSet.add(chunkIdx);\n } else if (!visible && wasActive) {\n // Despawn per-cell entities for this newly-invisible chunk.\n const key = `${layerKey}:${chunkIdx}`;\n const entities = streaming.chunkEntities.get(key);\n if (entities !== undefined) {\n for (const e of entities) world.despawn(e as EntityHandle);\n streaming.chunkEntities.delete(key);\n }\n activeSet.delete(chunkIdx);\n }\n }\n }\n}\n"]}