@dreamboard-games/sdk 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (369) hide show
  1. package/LICENSE.md +96 -0
  2. package/README.md +12 -0
  3. package/dist/HandView-ncJIVLhN.d.ts +193 -0
  4. package/dist/ResourceCounter-CTREyF73.d.ts +102 -0
  5. package/dist/ThemeProvider-fy0_QzgO.d.ts +99 -0
  6. package/dist/bundle-TIZcw8LB.d.ts +281 -0
  7. package/dist/cards-Sl3b40Mv.d.ts +13 -0
  8. package/dist/chunk-7YAHLYBR.js +481 -0
  9. package/dist/chunk-7YAHLYBR.js.map +1 -0
  10. package/dist/chunk-FDNZTDD6.js +8085 -0
  11. package/dist/chunk-FDNZTDD6.js.map +1 -0
  12. package/dist/chunk-GKKBPPSW.js +598 -0
  13. package/dist/chunk-GKKBPPSW.js.map +1 -0
  14. package/dist/chunk-I46YJSOD.js +1 -0
  15. package/dist/chunk-I46YJSOD.js.map +1 -0
  16. package/dist/chunk-KAELH4KC.js +104 -0
  17. package/dist/chunk-KAELH4KC.js.map +1 -0
  18. package/dist/chunk-PZ5AY32C.js +10 -0
  19. package/dist/chunk-PZ5AY32C.js.map +1 -0
  20. package/dist/chunk-T3ZKNUZ7.js +1 -0
  21. package/dist/chunk-T3ZKNUZ7.js.map +1 -0
  22. package/dist/chunk-T52J5RMF.js +1 -0
  23. package/dist/chunk-T52J5RMF.js.map +1 -0
  24. package/dist/chunk-TDSWKVZ4.js +5401 -0
  25. package/dist/chunk-TDSWKVZ4.js.map +1 -0
  26. package/dist/chunk-U5C6BONG.js +34 -0
  27. package/dist/chunk-U5C6BONG.js.map +1 -0
  28. package/dist/chunk-VDXOF4FW.js +69 -0
  29. package/dist/chunk-VDXOF4FW.js.map +1 -0
  30. package/dist/chunk-VFTAA4WO.js +115 -0
  31. package/dist/chunk-VFTAA4WO.js.map +1 -0
  32. package/dist/chunk-WN74KVNY.js +17 -0
  33. package/dist/chunk-WN74KVNY.js.map +1 -0
  34. package/dist/chunk-WYPQ3GG5.js +10990 -0
  35. package/dist/chunk-WYPQ3GG5.js.map +1 -0
  36. package/dist/components-D5ZRE2Hl.d.ts +1451 -0
  37. package/dist/generated/runtime/primitives.d.ts +12 -0
  38. package/dist/generated/runtime/primitives.js +180 -0
  39. package/dist/generated/runtime/primitives.js.map +1 -0
  40. package/dist/generated/runtime-api.d.ts +3 -0
  41. package/dist/generated/runtime-api.js +2 -0
  42. package/dist/generated/runtime-api.js.map +1 -0
  43. package/dist/generated/runtime.d.ts +14 -0
  44. package/dist/generated/runtime.js +18 -0
  45. package/dist/generated/runtime.js.map +1 -0
  46. package/dist/generated/workspace-contract.d.ts +14 -0
  47. package/dist/generated/workspace-contract.js +14 -0
  48. package/dist/generated/workspace-contract.js.map +1 -0
  49. package/dist/hex-board-view-D_07hO6O.d.ts +933 -0
  50. package/dist/hex-color-MhOyuY-o.d.ts +8 -0
  51. package/dist/index-BwqPQtBu.d.ts +1433 -0
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.js +12 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/infrastructure/reducer-bundle-abi.d.ts +1083 -0
  56. package/dist/infrastructure/reducer-bundle-abi.js +14 -0
  57. package/dist/infrastructure/reducer-bundle-abi.js.map +1 -0
  58. package/dist/infrastructure/workspace-codegen.d.ts +53 -0
  59. package/dist/infrastructure/workspace-codegen.js +44 -0
  60. package/dist/infrastructure/workspace-codegen.js.map +1 -0
  61. package/dist/manifest-contract-BNHVGFtU.d.ts +9 -0
  62. package/dist/package-set.d.ts +13 -0
  63. package/dist/package-set.js +12 -0
  64. package/dist/package-set.js.map +1 -0
  65. package/dist/primitive-props-DpKs-GCr.d.ts +11 -0
  66. package/dist/reducer.d.ts +3786 -0
  67. package/dist/reducer.js +8131 -0
  68. package/dist/reducer.js.map +1 -0
  69. package/dist/runtime/primitives.d.ts +226 -0
  70. package/dist/runtime/primitives.js +180 -0
  71. package/dist/runtime/primitives.js.map +1 -0
  72. package/dist/runtime/types/runtime-api.d.ts +1 -0
  73. package/dist/runtime/types/runtime-api.js +2 -0
  74. package/dist/runtime/types/runtime-api.js.map +1 -0
  75. package/dist/runtime/workspace-contract.d.ts +172 -0
  76. package/dist/runtime/workspace-contract.js +14 -0
  77. package/dist/runtime/workspace-contract.js.map +1 -0
  78. package/dist/runtime-api-3dshj6kK.d.ts +101 -0
  79. package/dist/runtime-api-DWxvTr-O.d.ts +379 -0
  80. package/dist/runtime.d.ts +58 -0
  81. package/dist/runtime.js +13 -0
  82. package/dist/runtime.js.map +1 -0
  83. package/dist/slots-1GPGihk8.d.ts +8 -0
  84. package/dist/testing.d.ts +149 -0
  85. package/dist/testing.js +513 -0
  86. package/dist/testing.js.map +1 -0
  87. package/dist/types.d.ts +496 -0
  88. package/dist/types.js +28 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ui/components.d.ts +16 -0
  91. package/dist/ui/components.js +192 -0
  92. package/dist/ui/components.js.map +1 -0
  93. package/dist/ui/defaults.d.ts +19 -0
  94. package/dist/ui/defaults.js +104 -0
  95. package/dist/ui/defaults.js.map +1 -0
  96. package/dist/ui/plugin-styles.css +250 -0
  97. package/dist/ui/types/player-state.d.ts +365 -0
  98. package/dist/ui/types/player-state.js +1 -0
  99. package/dist/ui/types/player-state.js.map +1 -0
  100. package/dist/ui-contract-iQfTtUSL.d.ts +1161 -0
  101. package/dist/ui.d.ts +320 -0
  102. package/dist/ui.js +253 -0
  103. package/dist/ui.js.map +1 -0
  104. package/package.json +199 -0
  105. package/src/generated/reducer-contract/builders.ts +90 -0
  106. package/src/generated/reducer-contract/version.ts +9 -0
  107. package/src/generated/reducer-contract/wire.ts +100 -0
  108. package/src/generated/reducer-contract/zod.ts +101 -0
  109. package/src/generated/runtime/primitives.ts +2 -0
  110. package/src/generated/runtime-api.ts +5 -0
  111. package/src/generated/runtime.ts +35 -0
  112. package/src/generated/workspace-contract.ts +2 -0
  113. package/src/index.ts +7 -0
  114. package/src/infrastructure/reducer-bundle-abi.ts +8 -0
  115. package/src/infrastructure/reducer-contract/bundle.ts +37 -0
  116. package/src/infrastructure/workspace-codegen/hex-geometry.ts +69 -0
  117. package/src/infrastructure/workspace-codegen/index.ts +64 -0
  118. package/src/infrastructure/workspace-codegen/manifest-contract.ts +6632 -0
  119. package/src/infrastructure/workspace-codegen/manifest-validation.ts +795 -0
  120. package/src/infrastructure/workspace-codegen/ownership.ts +131 -0
  121. package/src/infrastructure/workspace-codegen/preset-card-sets.ts +169 -0
  122. package/src/infrastructure/workspace-codegen/seeds.ts +1705 -0
  123. package/src/infrastructure/workspace-codegen.ts +1 -0
  124. package/src/package-set.ts +19 -0
  125. package/src/reducer/authoring/contract.ts +157 -0
  126. package/src/reducer/authoring/effect.ts +224 -0
  127. package/src/reducer/authoring/game.ts +23 -0
  128. package/src/reducer/authoring/interaction.ts +98 -0
  129. package/src/reducer/authoring/phase.ts +300 -0
  130. package/src/reducer/authoring/types.ts +70 -0
  131. package/src/reducer/authoring/validation.ts +382 -0
  132. package/src/reducer/authoring/view-stage.ts +68 -0
  133. package/src/reducer/authoring.ts +29 -0
  134. package/src/reducer/bundle/ingress-bundle.ts +491 -0
  135. package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +254 -0
  136. package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +73 -0
  137. package/src/reducer/bundle/trusted/instruction-runner.ts +414 -0
  138. package/src/reducer/bundle/trusted/interaction-authorization.ts +137 -0
  139. package/src/reducer/bundle/trusted/interaction-collectors.ts +859 -0
  140. package/src/reducer/bundle/trusted/interaction-decision.ts +747 -0
  141. package/src/reducer/bundle/trusted/interaction-resolver.ts +95 -0
  142. package/src/reducer/bundle/trusted/interaction-types.ts +171 -0
  143. package/src/reducer/bundle/trusted/lifecycle-runner.ts +427 -0
  144. package/src/reducer/bundle/trusted/projection-builder.ts +356 -0
  145. package/src/reducer/bundle/trusted/projection-context.ts +39 -0
  146. package/src/reducer/bundle/trusted/rng-sampler.ts +150 -0
  147. package/src/reducer/bundle/trusted/runtime-registry.ts +120 -0
  148. package/src/reducer/bundle/trusted/runtime-scope.ts +336 -0
  149. package/src/reducer/bundle/trusted/simultaneous-player.ts +97 -0
  150. package/src/reducer/bundle/trusted/stage-resolver.ts +87 -0
  151. package/src/reducer/bundle/trusted/static-projection.ts +116 -0
  152. package/src/reducer/bundle/trusted/trusted-runtime-args.ts +97 -0
  153. package/src/reducer/bundle/trusted/trusted-runtime-result.ts +39 -0
  154. package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +43 -0
  155. package/src/reducer/bundle/trusted/trusted-state-codec.ts +48 -0
  156. package/src/reducer/bundle/trusted-bundle.ts +97 -0
  157. package/src/reducer/bundle/types.ts +171 -0
  158. package/src/reducer/bundle.ts +2 -0
  159. package/src/reducer/client-param-schemas.ts +57 -0
  160. package/src/reducer/compose.ts +34 -0
  161. package/src/reducer/core/runtime-input.ts +30 -0
  162. package/src/reducer/core/runtime-instruction.ts +59 -0
  163. package/src/reducer/core/types.ts +62 -0
  164. package/src/reducer/definition-index.ts +277 -0
  165. package/src/reducer/derived.ts +106 -0
  166. package/src/reducer/effects.ts +92 -0
  167. package/src/reducer/engine/runtime-instruction-engine.ts +155 -0
  168. package/src/reducer/ingress/decode-runtime-input.ts +7 -0
  169. package/src/reducer/ingress/decode-session-state.ts +9 -0
  170. package/src/reducer/ingress/encode-session-state.ts +6 -0
  171. package/src/reducer/ingress/input-codec.ts +18 -0
  172. package/src/reducer/ingress/phase-schemas.ts +62 -0
  173. package/src/reducer/ingress/raw-types.ts +107 -0
  174. package/src/reducer/ingress/runtime-codec.ts +14 -0
  175. package/src/reducer/ingress/runtime-payload.ts +13 -0
  176. package/src/reducer/ingress/session-codec.ts +392 -0
  177. package/src/reducer/ingress/types.ts +6 -0
  178. package/src/reducer/inputs/boardInput.ts +217 -0
  179. package/src/reducer/inputs/boardTarget.ts +190 -0
  180. package/src/reducer/inputs/cardInput.ts +86 -0
  181. package/src/reducer/inputs/cardTarget.ts +101 -0
  182. package/src/reducer/inputs/choiceTarget.ts +104 -0
  183. package/src/reducer/inputs/defineInputs.ts +71 -0
  184. package/src/reducer/inputs/formInput.ts +809 -0
  185. package/src/reducer/inputs/many.ts +120 -0
  186. package/src/reducer/inputs/promptInput.ts +87 -0
  187. package/src/reducer/inputs/rngInput.ts +58 -0
  188. package/src/reducer/inputs/targetRule.ts +123 -0
  189. package/src/reducer/inputs.ts +41 -0
  190. package/src/reducer/model/definition.ts +1072 -0
  191. package/src/reducer/model/extract.ts +745 -0
  192. package/src/reducer/model/manifest.ts +570 -0
  193. package/src/reducer/model/queries.ts +641 -0
  194. package/src/reducer/model/runtime.ts +264 -0
  195. package/src/reducer/model/spec.ts +1386 -0
  196. package/src/reducer/model/table.ts +260 -0
  197. package/src/reducer/model.ts +7 -0
  198. package/src/reducer/ops.ts +1034 -0
  199. package/src/reducer/parse-utils.ts +28 -0
  200. package/src/reducer/per-player.ts +422 -0
  201. package/src/reducer/rng.ts +69 -0
  202. package/src/reducer/schema-helpers.ts +185 -0
  203. package/src/reducer/setup-bootstrap-helpers.ts +171 -0
  204. package/src/reducer/setup-bootstrap.ts +481 -0
  205. package/src/reducer/table-ops.ts +2671 -0
  206. package/src/reducer/table-queries.ts +372 -0
  207. package/src/reducer/transaction.ts +120 -0
  208. package/src/reducer.ts +314 -0
  209. package/src/runtime/primitives.ts +1 -0
  210. package/src/runtime/types/runtime-api.ts +1 -0
  211. package/src/runtime/workspace-contract.ts +32 -0
  212. package/src/runtime-internal/components/InteractionForm.tsx +1309 -0
  213. package/src/runtime-internal/components/PluginRuntime.tsx +103 -0
  214. package/src/runtime-internal/components/board/target-layer.ts +70 -0
  215. package/src/runtime-internal/context/ClientParamSchemaContext.tsx +44 -0
  216. package/src/runtime-internal/context/InteractionDraftContext.tsx +279 -0
  217. package/src/runtime-internal/context/PluginSessionContext.tsx +47 -0
  218. package/src/runtime-internal/context/PluginStateContext.tsx +262 -0
  219. package/src/runtime-internal/context/RuntimeContext.tsx +96 -0
  220. package/src/runtime-internal/defaults/components.tsx +409 -0
  221. package/src/runtime-internal/defaults/index.ts +11 -0
  222. package/src/runtime-internal/errors/ValidationError.ts +29 -0
  223. package/src/runtime-internal/hooks/useActivePlayers.ts +33 -0
  224. package/src/runtime-internal/hooks/useBoardInteractions.ts +665 -0
  225. package/src/runtime-internal/hooks/useGameSelector.ts +105 -0
  226. package/src/runtime-internal/hooks/useGameView.ts +9 -0
  227. package/src/runtime-internal/hooks/useInteractionByKey.ts +354 -0
  228. package/src/runtime-internal/hooks/useInteractionHandle.ts +438 -0
  229. package/src/runtime-internal/hooks/useIsMyTurn.ts +20 -0
  230. package/src/runtime-internal/hooks/useLobby.ts +76 -0
  231. package/src/runtime-internal/hooks/useMe.ts +48 -0
  232. package/src/runtime-internal/hooks/usePlayerInfo.ts +28 -0
  233. package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +23 -0
  234. package/src/runtime-internal/hooks/usePluginRuntime.ts +147 -0
  235. package/src/runtime-internal/hooks/useSeatInbox.ts +61 -0
  236. package/src/runtime-internal/hooks/useSimultaneousPhase.ts +10 -0
  237. package/src/runtime-internal/index.ts +42 -0
  238. package/src/runtime-internal/internal.ts +43 -0
  239. package/src/runtime-internal/plugin-styles.css +250 -0
  240. package/src/runtime-internal/primitives/board.tsx +459 -0
  241. package/src/runtime-internal/primitives/dialog-lifecycle.ts +58 -0
  242. package/src/runtime-internal/primitives/dice.tsx +79 -0
  243. package/src/runtime-internal/primitives/game-ui-provider.tsx +35 -0
  244. package/src/runtime-internal/primitives/game.tsx +387 -0
  245. package/src/runtime-internal/primitives/hand-intent-adapter.ts +147 -0
  246. package/src/runtime-internal/primitives/hand-surface.tsx +594 -0
  247. package/src/runtime-internal/primitives/index.ts +196 -0
  248. package/src/runtime-internal/primitives/interaction-form-binding.tsx +56 -0
  249. package/src/runtime-internal/primitives/interaction-submit.ts +90 -0
  250. package/src/runtime-internal/primitives/interaction.tsx +987 -0
  251. package/src/runtime-internal/primitives/phase.tsx +43 -0
  252. package/src/runtime-internal/primitives/player-roster.tsx +302 -0
  253. package/src/runtime-internal/primitives/primitive-props.tsx +101 -0
  254. package/src/runtime-internal/primitives/prompt.tsx +255 -0
  255. package/src/runtime-internal/primitives/ui.tsx +60 -0
  256. package/src/runtime-internal/primitives/zone.tsx +791 -0
  257. package/src/runtime-internal/reducer.ts +30 -0
  258. package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +605 -0
  259. package/src/runtime-internal/types/plugin-state.ts +508 -0
  260. package/src/runtime-internal/types/reducer-state.ts +24 -0
  261. package/src/runtime-internal/types/runtime-api.ts +114 -0
  262. package/src/runtime-internal/ui-contract.ts +519 -0
  263. package/src/runtime-internal/utils/card-intent-adapter.ts +546 -0
  264. package/src/runtime-internal/utils/interaction-inputs.ts +492 -0
  265. package/src/runtime-internal/utils/interaction-labels.ts +23 -0
  266. package/src/runtime-internal/utils/interaction-router.ts +273 -0
  267. package/src/runtime-internal/utils/interaction-status.ts +74 -0
  268. package/src/runtime-internal/workspace-contract.ts +1170 -0
  269. package/src/runtime.ts +34 -0
  270. package/src/testing/create-expect-api.ts +352 -0
  271. package/src/testing/create-test-runtime.ts +381 -0
  272. package/src/testing/definitions.ts +127 -0
  273. package/src/testing/index.ts +3 -0
  274. package/src/testing.ts +1 -0
  275. package/src/type-stubs/manifest-contract.d.ts +42 -0
  276. package/src/type-stubs/manifest-contract.js +72 -0
  277. package/src/type-stubs/ui-contract.d.ts +5 -0
  278. package/src/type-stubs/ui-contract.js +1 -0
  279. package/src/types/authoring-card-properties.type-test.ts +266 -0
  280. package/src/types/authoring.ts +1282 -0
  281. package/src/types/cards.ts +19 -0
  282. package/src/types/contracts.ts +1550 -0
  283. package/src/types/generated-helpers.ts +35 -0
  284. package/src/types/index.ts +147 -0
  285. package/src/types/slots.ts +11 -0
  286. package/src/types.ts +1 -0
  287. package/src/ui/components/ActionButton.tsx +97 -0
  288. package/src/ui/components/ActionPanel.tsx +315 -0
  289. package/src/ui/components/Card.tsx +378 -0
  290. package/src/ui/components/CardDragSurface.tsx +1076 -0
  291. package/src/ui/components/ChromeSuppressionContext.tsx +70 -0
  292. package/src/ui/components/CostDisplay.tsx +145 -0
  293. package/src/ui/components/DiceRoller.tsx +581 -0
  294. package/src/ui/components/Drawer.tsx +180 -0
  295. package/src/ui/components/ErrorBoundary.tsx +275 -0
  296. package/src/ui/components/GameEndDisplay.tsx +398 -0
  297. package/src/ui/components/GameSkeleton.tsx +260 -0
  298. package/src/ui/components/Hand.tsx +468 -0
  299. package/src/ui/components/HandDock.tsx +299 -0
  300. package/src/ui/components/HandView.tsx +441 -0
  301. package/src/ui/components/MobileHandTray.tsx +381 -0
  302. package/src/ui/components/MoreActions.tsx +143 -0
  303. package/src/ui/components/PhaseIndicator.tsx +341 -0
  304. package/src/ui/components/PlayArea.tsx +146 -0
  305. package/src/ui/components/PrimaryActionButton.tsx +336 -0
  306. package/src/ui/components/PrimaryButton.tsx +45 -0
  307. package/src/ui/components/ResourceCounter.tsx +270 -0
  308. package/src/ui/components/StagingZone.tsx +134 -0
  309. package/src/ui/components/ThemedButton.tsx +113 -0
  310. package/src/ui/components/Toast.tsx +264 -0
  311. package/src/ui/components/board/HexGrid.tsx +1294 -0
  312. package/src/ui/components/board/NetworkGraph.tsx +476 -0
  313. package/src/ui/components/board/SlotSystem.tsx +388 -0
  314. package/src/ui/components/board/SquareGrid.tsx +1165 -0
  315. package/src/ui/components/board/TrackBoard.tsx +496 -0
  316. package/src/ui/components/board/ZoneMap.tsx +448 -0
  317. package/src/ui/components/board/hex-board-view.ts +123 -0
  318. package/src/ui/components/board/index.ts +142 -0
  319. package/src/ui/components/board/interaction-accessibility.ts +21 -0
  320. package/src/ui/components/board/target-layer.ts +66 -0
  321. package/src/ui/components/card-render-content.type-test.ts +27 -0
  322. package/src/ui/components/hand-layout-math.ts +163 -0
  323. package/src/ui/components/hand-pointer-engine.ts +413 -0
  324. package/src/ui/components/index.ts +245 -0
  325. package/src/ui/components.ts +1 -0
  326. package/src/ui/defaults/components.tsx +106 -0
  327. package/src/ui/defaults/index.ts +8 -0
  328. package/src/ui/defaults.ts +1 -0
  329. package/src/ui/errors/ValidationError.ts +29 -0
  330. package/src/ui/helpers/cards.ts +19 -0
  331. package/src/ui/helpers/track-board.ts +211 -0
  332. package/src/ui/hooks/useBoardTopology.ts +316 -0
  333. package/src/ui/hooks/useCards.ts +10 -0
  334. package/src/ui/hooks/useHandCardPointer.ts +381 -0
  335. package/src/ui/hooks/useHandLayout.ts +378 -0
  336. package/src/ui/hooks/useHandPresentation.ts +121 -0
  337. package/src/ui/hooks/useHexBoard.ts +74 -0
  338. package/src/ui/hooks/useHexGrid.ts +185 -0
  339. package/src/ui/hooks/useIsMobile.ts +35 -0
  340. package/src/ui/hooks/usePanZoom.ts +278 -0
  341. package/src/ui/hooks/useSquareBoard.ts +124 -0
  342. package/src/ui/hooks/useSquareGrid.ts +328 -0
  343. package/src/ui/index.ts +98 -0
  344. package/src/ui/internal/ui/alert.tsx +51 -0
  345. package/src/ui/internal/ui/button.tsx +58 -0
  346. package/src/ui/internal/ui/dialog.tsx +134 -0
  347. package/src/ui/internal/ui/input.tsx +21 -0
  348. package/src/ui/internal/ui/label.tsx +21 -0
  349. package/src/ui/internal/ui/select.tsx +129 -0
  350. package/src/ui/internal/ui/tooltip.tsx +54 -0
  351. package/src/ui/internal/ui/utils.ts +5 -0
  352. package/src/ui/plugin-styles.css +250 -0
  353. package/src/ui/primitives/dialog-lifecycle.ts +58 -0
  354. package/src/ui/primitives/dice.tsx +79 -0
  355. package/src/ui/primitives/primitive-props.tsx +101 -0
  356. package/src/ui/theme/ThemeProvider.tsx +252 -0
  357. package/src/ui/theme/board.ts +61 -0
  358. package/src/ui/theme/css-vars.ts +105 -0
  359. package/src/ui/theme/derive.ts +240 -0
  360. package/src/ui/theme/index.ts +61 -0
  361. package/src/ui/theme/presets/arcade.ts +261 -0
  362. package/src/ui/theme/presets/studio.ts +261 -0
  363. package/src/ui/theme/presets/tabletop.ts +266 -0
  364. package/src/ui/theme/tokens.ts +392 -0
  365. package/src/ui/types/hex-color.ts +20 -0
  366. package/src/ui/types/player-state.ts +463 -0
  367. package/src/ui/types/tiled-board.ts +785 -0
  368. package/src/ui/types/visual-state.ts +137 -0
  369. package/src/ui.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infrastructure/workspace-codegen/preset-card-sets.ts","../src/infrastructure/workspace-codegen/hex-geometry.ts","../src/infrastructure/workspace-codegen/manifest-contract.ts","../src/infrastructure/workspace-codegen/manifest-validation.ts","../src/infrastructure/workspace-codegen/ownership.ts","../src/infrastructure/workspace-codegen/seeds.ts","../src/infrastructure/workspace-codegen/index.ts"],"sourcesContent":["import type {\n BoardCard,\n GameTopologyManifest,\n ManualCardSetDefinition,\n ObjectSchema,\n PresetCardSetDefinition,\n PropertySchema,\n} from \"../../types/index.js\";\n\nconst STANDARD_DECK_ID = \"standard_52_deck\";\n\nfunction createEnumPropertySchema(\n enums: string[],\n description: string,\n): PropertySchema {\n return {\n type: \"enum\",\n description,\n enums,\n };\n}\n\nfunction createStringPropertySchema(description: string): PropertySchema {\n return {\n type: \"string\",\n description,\n };\n}\n\nexport function createStandard52CardDeck(): ManualCardSetDefinition {\n const suits = [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"];\n const ranks = [\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"10\",\n \"J\",\n \"Q\",\n \"K\",\n \"A\",\n \"2\",\n ];\n\n const cards: BoardCard[] = [];\n for (const suit of suits) {\n for (const rank of ranks) {\n cards.push({\n type: `${suit}_${rank}`,\n name: `${rank} of ${suit}`,\n imageUrl: `/cards/${suit.toLowerCase()}_${rank.toLowerCase()}.png`,\n text: `A playing card: ${rank} of ${suit}. Value: ${getBigTwoCardValue(rank)}, Suit value: ${getSuitValue(suit)}`,\n count: 1,\n cardType: `${suit}_${rank}`,\n properties: {\n suit,\n rank,\n },\n });\n }\n }\n\n return {\n id: STANDARD_DECK_ID,\n name: \"Standard 52-Card Deck\",\n type: \"manual\",\n cards,\n cardSchema: {\n properties: {\n suit: createEnumPropertySchema(\n [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"],\n \"The suit of the card\",\n ),\n rank: createStringPropertySchema(\"The rank of the card\"),\n },\n } satisfies ObjectSchema,\n };\n}\n\nexport function addStandardDecksIfNeeded(\n manifest: GameTopologyManifest,\n): GameTopologyManifest {\n return {\n ...manifest,\n cardSets: manifest.cardSets.map((cardSet) =>\n cardSet.type === \"preset\" && cardSet.presetId === STANDARD_DECK_ID\n ? {\n ...createStandard52CardDeck(),\n id: cardSet.id,\n name: cardSet.name,\n }\n : cardSet,\n ),\n };\n}\n\nexport function materializePresetCardSet(\n presetCardSet: PresetCardSetDefinition,\n): ManualCardSetDefinition {\n if (presetCardSet.presetId !== STANDARD_DECK_ID) {\n throw new Error(`Unsupported preset deck: ${presetCardSet.presetId}`);\n }\n\n const standardDeck = createStandard52CardDeck();\n return {\n ...standardDeck,\n id: presetCardSet.id,\n name: presetCardSet.name,\n };\n}\n\nexport function materializeCardSet(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n): ManualCardSetDefinition {\n return cardSet.type === \"manual\"\n ? cardSet\n : materializePresetCardSet(cardSet);\n}\n\nfunction getBigTwoCardValue(rank: string): number {\n switch (rank) {\n case \"3\":\n return 3;\n case \"4\":\n return 4;\n case \"5\":\n return 5;\n case \"6\":\n return 6;\n case \"7\":\n return 7;\n case \"8\":\n return 8;\n case \"9\":\n return 9;\n case \"10\":\n return 10;\n case \"J\":\n return 11;\n case \"Q\":\n return 12;\n case \"K\":\n return 13;\n case \"A\":\n return 14;\n case \"2\":\n return 15;\n default:\n return 0;\n }\n}\n\nfunction getSuitValue(suit: string): number {\n switch (suit) {\n case \"DIAMONDS\":\n return 1;\n case \"CLUBS\":\n return 2;\n case \"HEARTS\":\n return 3;\n case \"SPADES\":\n return 4;\n default:\n return 0;\n }\n}\n","import type { HexSpaceSpec, HexVertexRef } from \"../../types/index.js\";\n\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n): string {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nexport function resolveHexVertexGeometryKey(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((left, right) => left.localeCompare(right))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Hex vertex ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const corner of HEX_CORNERS) {\n const key = cornerGeometryKey(space, corner);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Hex vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const vertexKey = candidates[0];\n if (vertexKey === undefined) {\n throw new Error(\"internal: expected exactly one hex vertex geometry key\");\n }\n return vertexKey;\n}\n","import type {\n BoardEdgeRef,\n BoardContainerSpec,\n BoardCard,\n BoardRelationSpec,\n BoardSpec,\n BoardSpaceSpec,\n BoardTemplateSpec,\n BoardVertexRef,\n GameTopologyManifest,\n GenericBoardSpec,\n GenericBoardTemplateSpec,\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexEdgeRef,\n HexEdgeSpec,\n HexSpaceSpec,\n HexVertexRef,\n HexVertexSpec,\n DieSeedSpec,\n ManualCardSetDefinition,\n ObjectSchema,\n PieceSeedSpec,\n PropertySchema,\n SquareBoardSpec,\n SquareBoardTemplateSpec,\n SquareEdgeSpec,\n SquareSpaceSpec,\n SquareVertexSpec,\n ZoneSpec,\n} from \"../../types/index.js\";\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\nimport {\n addStandardDecksIfNeeded,\n materializeCardSet,\n} from \"./preset-card-sets.js\";\n\ninterface AnalyzedGenericBoard {\n layout: \"generic\";\n board: GenericBoardSpec;\n template?: GenericBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n spaces: BoardSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n}\n\ninterface AnalyzedHexBoard {\n layout: \"hex\";\n board: HexBoardSpec;\n template?: HexBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: HexSpaceSpec[];\n authoredEdges: Array<{\n id: string;\n ref: HexEdgeRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n authoredVertices: Array<{\n id: string;\n ref: HexVertexRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ninterface AnalyzedSquareBoard {\n layout: \"square\";\n board: SquareBoardSpec;\n template?: SquareBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: SquareSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ntype AnalyzedBoard =\n | AnalyzedGenericBoard\n | AnalyzedHexBoard\n | AnalyzedSquareBoard;\n\ninterface ManifestAnalysis {\n manifest: GameTopologyManifest;\n playerIds: string[];\n sharedZones: ZoneSpec[];\n playerZones: ZoneSpec[];\n zoneIds: string[];\n cardSets: ManualCardSetDefinition[];\n cardSetIds: string[];\n cardTypes: string[];\n cardIds: string[];\n cardSetIdByCardId: Map<string, string>;\n cardTypeByCardId: Map<string, string>;\n sharedZoneCardSetIds: Map<string, string[]>;\n sharedZoneIdsByCardSetId: Map<string, string[]>;\n homeSharedZoneIdsByCardType: Map<string, string[]>;\n homeSharedZoneIdByCardType: Map<string, string>;\n playerZoneCardSetIds: Map<string, string[]>;\n zoneCardSetIdsById: Map<string, string[]>;\n zoneVisibilityById: Map<string, string>;\n resourceIds: string[];\n resourcePresentationById: Record<\n string,\n { label: string; icon?: string | null }\n >;\n setupOptionIds: string[];\n setupProfileIds: string[];\n setupChoiceIdsByOptionId: Map<string, string[]>;\n setupOptionsById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n choices: ReadonlyArray<{\n id: string;\n label: string;\n description?: string | null;\n }>;\n }\n >;\n setupProfilesById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n optionValues?: Record<string, string> | null;\n }\n >;\n pieceTypeIds: string[];\n pieceIds: string[];\n pieceTypeIdByPieceId: Map<string, string>;\n dieTypeIds: string[];\n dieIds: string[];\n dieTypeIdByDieId: Map<string, string>;\n strictSlotHosts: Array<{\n kind: \"piece\" | \"die\";\n id: string;\n slotIds: string[];\n }>;\n boardTemplateIds: string[];\n boardBaseIds: string[];\n boardIds: string[];\n boardContainerIds: string[];\n boardTypeIds: string[];\n boardLayoutById: Map<string, string>;\n boardIdsByLayout: Map<string, string[]>;\n boardBaseIdsByLayout: Map<string, string[]>;\n boardIdsByBaseId: Map<string, string[]>;\n boardBaseIdsByTemplateId: Map<string, string[]>;\n boardTemplateLayoutById: Map<string, string>;\n boardIdsByTypeId: Map<string, string[]>;\n spaceIdsByBoardId: Map<string, string[]>;\n spaceTypeIdByBoardId: Map<string, Record<string, string | null>>;\n spaceIdsByTypeId: Map<string, string[]>;\n containerIdsByBoardId: Map<string, string[]>;\n containerHostByBoardId: Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >;\n relationTypeIds: string[];\n relationTypeIdsByBoardId: Map<string, string[]>;\n edgeIds: string[];\n edgeTypeIds: string[];\n edgeIdsByTypeId: Map<string, string[]>;\n edgeIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n vertexIds: string[];\n vertexTypeIds: string[];\n vertexIdsByTypeId: Map<string, string[]>;\n vertexIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n spaceIds: string[];\n spaceTypeIds: string[];\n analyzedBoards: AnalyzedBoard[];\n pieceTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n dieTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n}\n\ntype CardPropertySchemaVariants = {\n shared?: Record<string, PropertySchema>;\n variants: Record<string, ObjectSchema>;\n};\n\ntype CardPropertySchema = ObjectSchema | CardPropertySchemaVariants;\n\nfunction isCardPropertySchemaVariants(\n schema: CardPropertySchema | null | undefined,\n): schema is CardPropertySchemaVariants {\n return Boolean(schema && \"variants\" in schema);\n}\n\nfunction mergeSharedCardProperties(\n schema: CardPropertySchemaVariants,\n cardType: string,\n): ObjectSchema | null {\n const variant = schema.variants[cardType];\n if (!variant) {\n return null;\n }\n return {\n properties: {\n ...(schema.shared ?? {}),\n ...variant.properties,\n },\n };\n}\n\nfunction hasPropertySchemaDefault(\n property: PropertySchema | null | undefined,\n): property is PropertySchema & { default: unknown } {\n return Boolean(property && \"default\" in property);\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction toPascalCase(input: string): string {\n return input\n .split(/[_-]/g)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction toHandleKey(input: string): string {\n if (!/[_-]/.test(input)) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n }\n const [first = \"\", ...rest] = input.split(/[_-]/g).filter(Boolean);\n return [\n first.toLowerCase(),\n ...rest.map((part) => {\n const lower = part.toLowerCase();\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n }),\n ].join(\"\");\n}\n\nfunction renderBlocks(blocks: Array<string | null | undefined>): string {\n return blocks.filter((block): block is string => Boolean(block)).join(\"\\n\\n\");\n}\n\nfunction dedupeSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction renderConstArray(values: readonly string[]): string {\n return `[${values.map((value) => quote(value)).join(\", \")}] as const`;\n}\n\nfunction renderStringUnion(\n values: readonly string[],\n fallback = \"never\",\n): string {\n return values.length > 0\n ? values.map((value) => quote(value)).join(\" | \")\n : fallback;\n}\n\nfunction renderStringRecord(\n entries: Iterable<readonly [string, string]>,\n): string {\n const lines = Array.from(entries)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => ` ${quote(key)}: ${quote(value)},`);\n return `{\\n${lines.join(\"\\n\")}\\n} as const`;\n}\n\nfunction renderReadonlyArrayRecord(\n entries: Iterable<readonly [string, readonly string[]]>,\n): string {\n const lines = Array.from(entries)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([key, values]) =>\n ` ${quote(key)}: [${values.map((value) => quote(value)).join(\", \")}] as const,`,\n );\n return `{\\n${lines.join(\"\\n\")}\\n} as const`;\n}\n\nfunction renderJsonConst(value: unknown): string {\n return `${JSON.stringify(value, null, 2)} as const`;\n}\n\ninterface GeneratedIdFamily {\n literalKey: string;\n typeName: string;\n guardName: string;\n description: string;\n}\n\nconst GENERATED_ID_FAMILIES: readonly GeneratedIdFamily[] = [\n {\n literalKey: \"playerIds\",\n typeName: \"PlayerId\",\n guardName: \"PlayerId\",\n description: \"player id\",\n },\n {\n literalKey: \"boardLayouts\",\n typeName: \"BoardLayout\",\n guardName: \"BoardLayout\",\n description: \"board layout\",\n },\n {\n literalKey: \"setupOptionIds\",\n typeName: \"SetupOptionId\",\n guardName: \"SetupOptionId\",\n description: \"setup option id\",\n },\n {\n literalKey: \"setupProfileIds\",\n typeName: \"SetupProfileId\",\n guardName: \"SetupProfileId\",\n description: \"setup profile id\",\n },\n {\n literalKey: \"cardSetIds\",\n typeName: \"CardSetId\",\n guardName: \"CardSetId\",\n description: \"card set id\",\n },\n {\n literalKey: \"cardTypes\",\n typeName: \"CardType\",\n guardName: \"CardType\",\n description: \"card type\",\n },\n {\n literalKey: \"cardIds\",\n typeName: \"CardId\",\n guardName: \"CardId\",\n description: \"card id\",\n },\n {\n literalKey: \"deckIds\",\n typeName: \"DeckId\",\n guardName: \"DeckId\",\n description: \"deck id\",\n },\n {\n literalKey: \"handIds\",\n typeName: \"HandId\",\n guardName: \"HandId\",\n description: \"hand id\",\n },\n {\n literalKey: \"sharedZoneIds\",\n typeName: \"SharedZoneId\",\n guardName: \"SharedZoneId\",\n description: \"shared zone id\",\n },\n {\n literalKey: \"playerZoneIds\",\n typeName: \"PlayerZoneId\",\n guardName: \"PlayerZoneId\",\n description: \"player zone id\",\n },\n {\n literalKey: \"zoneIds\",\n typeName: \"ZoneId\",\n guardName: \"ZoneId\",\n description: \"zone id\",\n },\n {\n literalKey: \"resourceIds\",\n typeName: \"ResourceId\",\n guardName: \"ResourceId\",\n description: \"resource id\",\n },\n {\n literalKey: \"pieceTypeIds\",\n typeName: \"PieceTypeId\",\n guardName: \"PieceTypeId\",\n description: \"piece type id\",\n },\n {\n literalKey: \"pieceIds\",\n typeName: \"PieceId\",\n guardName: \"PieceId\",\n description: \"piece id\",\n },\n {\n literalKey: \"dieTypeIds\",\n typeName: \"DieTypeId\",\n guardName: \"DieTypeId\",\n description: \"die type id\",\n },\n {\n literalKey: \"dieIds\",\n typeName: \"DieId\",\n guardName: \"DieId\",\n description: \"die id\",\n },\n {\n literalKey: \"boardTypeIds\",\n typeName: \"BoardTypeId\",\n guardName: \"BoardTypeId\",\n description: \"board type id\",\n },\n {\n literalKey: \"boardBaseIds\",\n typeName: \"BoardBaseId\",\n guardName: \"BoardBaseId\",\n description: \"board base id\",\n },\n {\n literalKey: \"boardIds\",\n typeName: \"BoardId\",\n guardName: \"BoardId\",\n description: \"board id\",\n },\n {\n literalKey: \"boardContainerIds\",\n typeName: \"BoardContainerId\",\n guardName: \"BoardContainerId\",\n description: \"board container id\",\n },\n {\n literalKey: \"relationTypeIds\",\n typeName: \"RelationTypeId\",\n guardName: \"RelationTypeId\",\n description: \"relation type id\",\n },\n {\n literalKey: \"edgeIds\",\n typeName: \"EdgeId\",\n guardName: \"EdgeId\",\n description: \"edge id\",\n },\n {\n literalKey: \"edgeTypeIds\",\n typeName: \"EdgeTypeId\",\n guardName: \"EdgeTypeId\",\n description: \"edge type id\",\n },\n {\n literalKey: \"vertexIds\",\n typeName: \"VertexId\",\n guardName: \"VertexId\",\n description: \"vertex id\",\n },\n {\n literalKey: \"vertexTypeIds\",\n typeName: \"VertexTypeId\",\n guardName: \"VertexTypeId\",\n description: \"vertex type id\",\n },\n {\n literalKey: \"spaceIds\",\n typeName: \"SpaceId\",\n guardName: \"SpaceId\",\n description: \"space id\",\n },\n {\n literalKey: \"spaceTypeIds\",\n typeName: \"SpaceTypeId\",\n guardName: \"SpaceTypeId\",\n description: \"space type id\",\n },\n] as const;\n\n// `playerIds` are excluded from the generated `records`/`idGuards` surfaces:\n// `PlayerId` is now an opaque brand whose runtime roster comes from the active\n// session, not `manifest.players.maxPlayers`. Authors must use\n// `perPlayer(runtimeIds, init)` and `asPlayerId` from `@dreamboard-games/sdk/reducer`\n// instead of a `Record<PlayerId, T>` keyed on the max-players set.\nconst GENERATED_ID_FAMILIES_WITHOUT_PLAYERS: readonly GeneratedIdFamily[] =\n GENERATED_ID_FAMILIES.filter((family) => family.literalKey !== \"playerIds\");\n\nfunction renderGeneratedRecordsHelpers(): string {\n return `export const records = {\n${GENERATED_ID_FAMILIES_WITHOUT_PLAYERS.map(\n ({ literalKey, typeName }) => ` ${literalKey}<Value>(\n initial: Value | ((${literalKey.slice(0, -1)}: ${typeName}) => Value),\n ): Record<${typeName}, Value> {\n return buildTypedRecord(literals.${literalKey}, initial);\n },`,\n).join(\"\\n\")}\n} as const;`;\n}\n\nfunction renderGeneratedIdGuards(): string {\n return `export const idGuards = {\n${GENERATED_ID_FAMILIES_WITHOUT_PLAYERS.map(\n ({\n literalKey,\n typeName,\n guardName,\n description,\n }) => ` is${guardName}(value: string): value is ${typeName} {\n return isTypedId(literals.${literalKey}, value);\n },\n expect${guardName}(value: string): ${typeName} {\n return expectTypedId(literals.${literalKey}, value, ${quote(description)});\n },`,\n).join(\"\\n\")}\n} as const;`;\n}\n\nfunction renderGeneratedIdHandles(analysis: ManifestAnalysis): string {\n return `export const cardTypes = ${renderHandleObject(\n \"CardType\",\n analysis.cardTypes,\n )};\n\nexport const zones = ${renderHandleObject(\"ZoneId\", analysis.zoneIds)};`;\n}\n\nfunction renderHandleObject(\n typeName: string,\n values: readonly string[],\n): string {\n const lines = Array.from(values)\n .sort((left, right) => left.localeCompare(right))\n .map((value) => ` ${quote(toHandleKey(value))}: ${quote(value)},`);\n return `{\\n${lines.join(\"\\n\")}\\n} as const satisfies Record<string, ${typeName}>`;\n}\n\nfunction sortedObject<Value>(\n entries: Iterable<readonly [string, Value]>,\n): Record<string, Value> {\n return Object.fromEntries(\n Array.from(entries).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n if (card.count > 1) {\n return Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n );\n }\n return [card.type];\n}\n\nfunction expandSeedIds(\n seeds: ReadonlyArray<\n | PieceSeedSpec\n | { id?: string | null; typeId: string; count?: number | null }\n >,\n): string[] {\n const expanded: string[] = [];\n for (const seed of seeds) {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n if (count <= 1) {\n expanded.push(baseId);\n continue;\n }\n for (let index = 1; index <= count; index += 1) {\n expanded.push(`${baseId}-${index}`);\n }\n }\n return expanded;\n}\n\nfunction isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is HexBoardTemplateSpec {\n return boardTemplate.layout === \"hex\";\n}\n\nfunction isSquareBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is SquareBoardTemplateSpec {\n return boardTemplate.layout === \"square\";\n}\n\nfunction isGenericBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is GenericBoardTemplateSpec {\n return boardTemplate.layout === \"generic\";\n}\n\nfunction isHexBoardSpec(board: BoardSpec): board is HexBoardSpec {\n return board.layout === \"hex\";\n}\n\nfunction isSquareBoardSpec(board: BoardSpec): board is SquareBoardSpec {\n return board.layout === \"square\";\n}\n\nconst HEX_SIDES = [\"e\", \"ne\", \"nw\", \"w\", \"sw\", \"se\"] as const;\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\n\ntype HexSide = (typeof HEX_SIDES)[number];\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_SIDE_OFFSETS: Record<HexSide, readonly [number, number]> = {\n e: [1, 0],\n ne: [1, -1],\n nw: [0, -1],\n w: [-1, 0],\n sw: [-1, 1],\n se: [0, 1],\n};\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nconst HEX_SIDE_CORNERS: Record<HexSide, readonly [HexCorner, HexCorner]> = {\n e: [\"ne-e\", \"e-se\"],\n ne: [\"nw-ne\", \"ne-e\"],\n nw: [\"w-nw\", \"nw-ne\"],\n w: [\"sw-w\", \"w-nw\"],\n sw: [\"se-sw\", \"sw-w\"],\n se: [\"e-se\", \"se-sw\"],\n};\n\nconst HEX_CORNER_SIDES: Record<HexCorner, readonly [HexSide, HexSide]> = {\n \"ne-e\": [\"ne\", \"e\"],\n \"e-se\": [\"e\", \"se\"],\n \"se-sw\": [\"se\", \"sw\"],\n \"sw-w\": [\"sw\", \"w\"],\n \"w-nw\": [\"w\", \"nw\"],\n \"nw-ne\": [\"nw\", \"ne\"],\n};\n\ninterface ResolvedHexEdge {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\ninterface ResolvedHexVertex {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n) {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nfunction edgeGeometryKey(space: Pick<HexSpaceSpec, \"q\" | \"r\">, side: HexSide) {\n const [leftCorner, rightCorner] = HEX_SIDE_CORNERS[side];\n return [\n cornerGeometryKey(space, leftCorner),\n cornerGeometryKey(space, rightCorner),\n ]\n .sort((left, right) => left.localeCompare(right))\n .join(\"::\");\n}\n\nfunction edgeIdFromGeometryKey(key: string): string {\n return `hex-edge:${key}`;\n}\n\nfunction vertexIdFromGeometryKey(key: string): string {\n return `hex-vertex:${key}`;\n}\n\nconst SQUARE_SIDES = [\"north\", \"east\", \"south\", \"west\"] as const;\nconst SQUARE_CORNERS = [\"nw\", \"ne\", \"se\", \"sw\"] as const;\n\ntype SquareSide = (typeof SQUARE_SIDES)[number];\ntype SquareCorner = (typeof SQUARE_CORNERS)[number];\n\nfunction squareEdgeIdFromGeometryKey(key: string): string {\n return `square-edge:${key}`;\n}\n\nfunction squareVertexIdFromGeometryKey(key: string): string {\n return `square-vertex:${key}`;\n}\n\nfunction squareCornerGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n corner: SquareCorner,\n): string {\n switch (corner) {\n case \"nw\":\n return `${space.col},${space.row}`;\n case \"ne\":\n return `${space.col + 1},${space.row}`;\n case \"se\":\n return `${space.col + 1},${space.row + 1}`;\n case \"sw\":\n return `${space.col},${space.row + 1}`;\n }\n}\n\nfunction squareEdgeGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n side: SquareSide,\n): string {\n const endpoints =\n side === \"north\"\n ? [`${space.col},${space.row}`, `${space.col + 1},${space.row}`]\n : side === \"east\"\n ? [`${space.col + 1},${space.row}`, `${space.col + 1},${space.row + 1}`]\n : side === \"south\"\n ? [\n `${space.col},${space.row + 1}`,\n `${space.col + 1},${space.row + 1}`,\n ]\n : [`${space.col},${space.row}`, `${space.col},${space.row + 1}`];\n return endpoints.sort((left, right) => left.localeCompare(right)).join(\"::\");\n}\n\nfunction geometryKeyFromSquareEdgeRef(\n ref: BoardEdgeRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square edge ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const side of SQUARE_SIDES) {\n const key = squareEdgeGeometryKey(space, side);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square edge ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared edge.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction geometryKeyFromSquareVertexRef(\n ref: BoardVertexRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square vertex ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const corner of SQUARE_CORNERS) {\n const key = squareCornerGeometryKey(space, corner);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction geometryKeyFromEdgeRef(\n ref: HexEdgeRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const [leftId, rightId] = [...ref.spaces].sort((a, b) => a.localeCompare(b));\n if (leftId === undefined || rightId === undefined) {\n throw new Error(\"Hex edge ref must reference exactly two spaces.\");\n }\n const leftSpace = spacesById.get(leftId);\n const rightSpace = spacesById.get(rightId);\n if (!leftSpace || !rightSpace) {\n throw new Error(\n `Hex edge ref references unknown spaces: ${ref.spaces.join(\", \")}.`,\n );\n }\n const [dq, dr] = [rightSpace.q - leftSpace.q, rightSpace.r - leftSpace.r];\n const side = (\n Object.entries(HEX_SIDE_OFFSETS) as Array<\n readonly [HexSide, readonly [number, number]]\n >\n ).find(([, [sideQ, sideR]]) => sideQ === dq && sideR === dr)?.[0];\n if (!side) {\n throw new Error(\n `Hex edge ref spaces '${leftId}' and '${rightId}' are not adjacent.`,\n );\n }\n return edgeGeometryKey(leftSpace, side);\n}\n\nfunction geometryKeyFromVertexRef(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n return resolveHexVertexGeometryKey(ref, spacesById);\n}\n\nfunction deriveHexEdges(spaces: readonly HexSpaceSpec[]): ResolvedHexEdge[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of HEX_SIDES) {\n const [dq, dr] = HEX_SIDE_OFFSETS[side];\n const neighbor = spacesByCoordinate.get(\n `${space.q + dq},${space.r + dr}`,\n );\n const geometryKey = edgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(neighbor ? [neighbor.id] : []),\n ]);\n edgeMap.set(geometryKey, {\n id: edgeIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveHexVertices(\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of HEX_CORNERS) {\n const [leftSide, rightSide] = HEX_CORNER_SIDES[corner];\n const [leftQ, leftR] = HEX_SIDE_OFFSETS[leftSide];\n const [rightQ, rightR] = HEX_SIDE_OFFSETS[rightSide];\n const leftNeighbor = spacesByCoordinate.get(\n `${space.q + leftQ},${space.r + leftR}`,\n );\n const rightNeighbor = spacesByCoordinate.get(\n `${space.q + rightQ},${space.r + rightR}`,\n );\n const geometryKey = cornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(leftNeighbor ? [leftNeighbor.id] : []),\n ...(rightNeighbor ? [rightNeighbor.id] : []),\n ]);\n vertexMap.set(geometryKey, {\n id: vertexIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction mergeBoardSpaces(\n templateSpaces: readonly BoardSpaceSpec[],\n boardSpaces: readonly BoardSpaceSpec[],\n): BoardSpaceSpec[] {\n return Array.from(\n [...templateSpaces, ...boardSpaces]\n .reduce<Map<string, BoardSpaceSpec>>((accumulator, space) => {\n accumulator.set(space.id, space);\n return accumulator;\n }, new Map<string, BoardSpaceSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction mergeBoardContainers(\n templateContainers: readonly BoardContainerSpec[],\n boardContainers: readonly BoardContainerSpec[],\n): BoardContainerSpec[] {\n return Array.from(\n [...templateContainers, ...boardContainers]\n .reduce<Map<string, BoardContainerSpec>>((accumulator, container) => {\n accumulator.set(container.id, container);\n return accumulator;\n }, new Map<string, BoardContainerSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (templateMatch.q !== override.q || templateMatch.r !== override.r) {\n throw new Error(\n `Hex board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction indexHexEdgeMetadata(\n specs: readonly HexEdgeSpec[],\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromEdgeRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex edge refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction indexHexVertexMetadata(\n specs: readonly HexVertexSpec[],\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromVertexRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex vertex refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction resolveAuthoredHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredEdges\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexEdges(spaces).map((edge) => [edge.geometryKey, edge] as const),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexEdgeSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexEdgeSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromEdgeRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex edge refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.edges ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexEdgeSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.edges ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedEdge = derivedByGeometryKey.get(geometryKey);\n if (!derivedEdge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n return {\n id: derivedEdge.id,\n ref: cloneJson(spec.ref),\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n };\n });\n}\n\nfunction resolveAuthoredHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredVertices\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexVertices(spaces).map(\n (vertex) => [vertex.geometryKey, vertex] as const,\n ),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexVertexSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexVertexSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromVertexRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex vertex refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.vertices ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexVertexSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.vertices ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedVertex = derivedByGeometryKey.get(geometryKey);\n if (!derivedVertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n return {\n id: derivedVertex.id,\n ref: cloneJson(spec.ref),\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n };\n });\n}\n\nfunction resolveHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexEdge[] {\n const derived = deriveHexEdges(spaces);\n const edgesById = new Map(derived.map((edge) => [edge.id, edge] as const));\n for (const authoredEdge of resolveAuthoredHexEdges(board, template, spaces)) {\n const edge = edgesById.get(authoredEdge.id);\n if (!edge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesById.set(authoredEdge.id, {\n ...edge,\n typeId: authoredEdge.typeId ?? null,\n label: authoredEdge.label ?? null,\n fields: authoredEdge.fields ?? null,\n });\n }\n\n return [...edgesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const derived = deriveHexVertices(spaces);\n const verticesById = new Map(\n derived.map((vertex) => [vertex.id, vertex] as const),\n );\n for (const authoredVertex of resolveAuthoredHexVertices(\n board,\n template,\n spaces,\n )) {\n const vertex = verticesById.get(authoredVertex.id);\n if (!vertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesById.set(authoredVertex.id, {\n ...vertex,\n typeId: authoredVertex.typeId ?? null,\n label: authoredVertex.label ?? null,\n fields: authoredVertex.fields ?? null,\n });\n }\n\n return [...verticesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareSpaces(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n): SquareSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (\n templateMatch.row !== override.row ||\n templateMatch.col !== override.col\n ) {\n throw new Error(\n `Square board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n row: templateSpace.row,\n col: templateSpace.col,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction deriveSquareEdges(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of SQUARE_SIDES) {\n const geometryKey = squareEdgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n edgeMap.set(geometryKey, {\n id: squareEdgeIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveSquareVertices(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of SQUARE_CORNERS) {\n const geometryKey = squareCornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n vertexMap.set(geometryKey, {\n id: squareVertexIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction indexSquareEdgeMetadata(\n specs: readonly SquareEdgeSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareEdgeRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square edge refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction indexSquareVertexMetadata(\n specs: readonly SquareVertexSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareVertexRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square vertex refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction resolveSquareEdges(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareEdges(spaces);\n const edgesByGeometryKey = new Map(\n derived.map((edge) => [edge.geometryKey, edge] as const),\n );\n const templateMetadata = template\n ? indexSquareEdgeMetadata(\n template.edges ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareEdgeMetadata(\n board.edges ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.entries()) {\n const edge = edgesByGeometryKey.get(geometryKey);\n if (!edge) {\n throw new Error(\n `Square edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesByGeometryKey.set(geometryKey, {\n ...edge,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...edgesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareVertices(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareVertices(spaces);\n const verticesByGeometryKey = new Map(\n derived.map((vertex) => [vertex.geometryKey, vertex] as const),\n );\n const templateMetadata = template\n ? indexSquareVertexMetadata(\n template.vertices ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareVertexMetadata(\n board.vertices ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.entries()) {\n const vertex = verticesByGeometryKey.get(geometryKey);\n if (!vertex) {\n throw new Error(\n `Square vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesByGeometryKey.set(geometryKey, {\n ...vertex,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...verticesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction analyzeBoards(manifest: GameTopologyManifest, playerIds: string[]) {\n const boardTemplates = manifest.boardTemplates ?? [];\n const genericTemplateById = new Map(\n boardTemplates\n .filter(isGenericBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const hexTemplateById = new Map(\n boardTemplates\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const squareTemplateById = new Map(\n boardTemplates\n .filter(isSquareBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\n return (manifest.boards ?? []).map((board): AnalyzedBoard => {\n const runtimeBoardIds =\n board.scope === \"perPlayer\"\n ? playerIds.map((playerId) => `${board.id}:${playerId}`)\n : [board.id];\n\n if (isHexBoardSpec(board)) {\n const hexBoard = board;\n const template = board.templateId\n ? hexTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveHexSpaces(hexBoard, template);\n return {\n layout: \"hex\",\n board: hexBoard,\n template,\n boardTypeId: hexBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n hexBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n hexBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n edgeFieldsSchema:\n hexBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n hexBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n authoredEdges: resolveAuthoredHexEdges(hexBoard, template, spaces),\n authoredVertices: resolveAuthoredHexVertices(\n hexBoard,\n template,\n spaces,\n ),\n edges: resolveHexEdges(hexBoard, template, spaces),\n vertices: resolveHexVertices(hexBoard, template, spaces),\n };\n }\n\n if (isSquareBoardSpec(board)) {\n const squareBoard = board;\n const template = board.templateId\n ? squareTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveSquareSpaces(squareBoard, template);\n return {\n layout: \"square\",\n board: squareBoard,\n template,\n boardTypeId: squareBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n squareBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n squareBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n squareBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n squareBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n edgeFieldsSchema:\n squareBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n squareBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n relations: [\n ...(template?.relations ?? []),\n ...(squareBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n squareBoard.containers ?? [],\n ),\n edges: resolveSquareEdges(squareBoard, template, spaces),\n vertices: resolveSquareVertices(squareBoard, template, spaces),\n };\n }\n\n const genericBoard = board;\n const template = board.templateId\n ? genericTemplateById.get(board.templateId)\n : undefined;\n return {\n layout: \"generic\",\n board: genericBoard,\n template,\n boardTypeId: genericBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n genericBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n genericBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n genericBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n genericBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n spaces: mergeBoardSpaces(\n template?.spaces ?? [],\n genericBoard.spaces ?? [],\n ),\n relations: [\n ...(template?.relations ?? []),\n ...(genericBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n genericBoard.containers ?? [],\n ),\n };\n });\n}\n\nfunction isSingletonExplicitSeed(seed: {\n id?: string | null;\n count?: number | null;\n}): seed is typeof seed & { id: string } {\n return (\n typeof seed.id === \"string\" && seed.id.length > 0 && (seed.count ?? 1) === 1\n );\n}\n\nfunction renderStrictSlotLocationSchema(\n hosts: ReadonlyArray<{\n kind: \"piece\" | \"die\";\n id: string;\n slotIds: readonly string[];\n }>,\n): string {\n const branches = hosts.flatMap((host) =>\n host.slotIds.map(\n (slotId) => `z.object({\n type: z.literal(\"InSlot\"),\n host: z.object({\n kind: z.literal(${quote(host.kind)}),\n id: z.literal(${quote(host.id)}),\n }),\n slotId: z.literal(${quote(slotId)}),\n position: z.number().int().nullable().optional(),\n })`,\n ),\n );\n\n if (branches.length === 0) {\n return `z.object({\n type: z.literal(\"InSlot\"),\n host: z.never(),\n slotId: z.never(),\n position: z.number().int().nullable().optional(),\n })`;\n }\n\n return branches.join(\",\\n \");\n}\n\nfunction analyzeManifest(\n inputManifest: GameTopologyManifest,\n): ManifestAnalysis {\n const manifest = addStandardDecksIfNeeded(inputManifest);\n const playerIds = Array.from(\n { length: manifest.players.maxPlayers },\n (_, index) => `player-${index + 1}`,\n );\n const sharedZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"shared\",\n );\n const playerZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"perPlayer\",\n );\n const zoneIds = dedupeSorted((manifest.zones ?? []).map((zone) => zone.id));\n const cardSets = manifest.cardSets.map(materializeCardSet);\n const cardSetIds = dedupeSorted(cardSets.map((cardSet) => cardSet.id));\n const cardTypes = dedupeSorted(\n cardSets.flatMap((cardSet) => cardSet.cards.map((card) => card.type)),\n );\n const cardIds = dedupeSorted(\n cardSets.flatMap((cardSet) => cardSet.cards.flatMap(renderCardInstanceIds)),\n );\n const cardSetIdByCardId = new Map<string, string>();\n const cardTypeByCardId = new Map<string, string>();\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n for (const cardId of renderCardInstanceIds(card)) {\n cardSetIdByCardId.set(cardId, cardSet.id);\n cardTypeByCardId.set(cardId, card.cardType ?? card.type);\n }\n }\n }\n\n const sharedZoneCardSetIds = new Map<string, string[]>();\n for (const zone of sharedZones) {\n sharedZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const playerZoneCardSetIds = new Map<string, string[]>();\n for (const zone of playerZones) {\n playerZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const zoneCardSetIdsById = new Map<string, string[]>();\n for (const [zoneId, cardSetIds] of sharedZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n for (const [zoneId, cardSetIds] of playerZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n\n const sharedZoneIdsByCardSetId = new Map<string, string[]>(\n cardSetIds.map((cardSetId): [string, string[]] => [cardSetId, []]),\n );\n for (const [zoneId, allowedCardSetIds] of sharedZoneCardSetIds.entries()) {\n for (const cardSetId of allowedCardSetIds) {\n const zoneIds = sharedZoneIdsByCardSetId.get(cardSetId) ?? [];\n zoneIds.push(zoneId);\n sharedZoneIdsByCardSetId.set(cardSetId, zoneIds);\n }\n }\n for (const [cardSetId, zoneIds] of sharedZoneIdsByCardSetId.entries()) {\n sharedZoneIdsByCardSetId.set(cardSetId, dedupeSorted(zoneIds));\n }\n\n const sharedZoneIdSet = new Set(sharedZones.map((zone) => zone.id));\n const homeSharedZoneIdsByCardType = new Map<string, string[]>(\n cardTypes.map((cardType): [string, string[]] => [cardType, []]),\n );\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n if (\n card.home?.type !== \"zone\" ||\n !sharedZoneIdSet.has(card.home.zoneId)\n ) {\n continue;\n }\n const zoneIds = homeSharedZoneIdsByCardType.get(card.type) ?? [];\n zoneIds.push(card.home.zoneId);\n homeSharedZoneIdsByCardType.set(card.type, zoneIds);\n }\n }\n const homeSharedZoneIdByCardType = new Map<string, string>();\n for (const [cardType, zoneIds] of homeSharedZoneIdsByCardType.entries()) {\n const uniqueZoneIds = dedupeSorted(zoneIds);\n homeSharedZoneIdsByCardType.set(cardType, uniqueZoneIds);\n const [homeZoneId] = uniqueZoneIds;\n if (uniqueZoneIds.length === 1 && homeZoneId !== undefined) {\n homeSharedZoneIdByCardType.set(cardType, homeZoneId);\n }\n }\n\n const zoneVisibilityById = new Map<string, string>(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const resourceIds = dedupeSorted(\n (manifest.resources ?? []).map((resource) => resource.id),\n );\n const resourcePresentationById = sortedObject(\n (manifest.resources ?? []).map((resource) => [\n resource.id,\n {\n label: resource.name,\n ...(resource.icon ? { icon: resource.icon } : {}),\n },\n ]),\n );\n const setupOptionIds = dedupeSorted(\n (manifest.setupOptions ?? []).map((option) => option.id),\n );\n const setupProfileIds = dedupeSorted(\n (manifest.setupProfiles ?? []).map((profile) => profile.id),\n );\n const setupChoiceIdsByOptionId = new Map(\n (manifest.setupOptions ?? []).map((option) => [\n option.id,\n dedupeSorted((option.choices ?? []).map((choice) => choice.id)),\n ]),\n );\n const setupOptionsById = Object.fromEntries(\n (manifest.setupOptions ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((option) => [\n option.id,\n {\n id: option.id,\n name: option.name,\n description: option.description ?? null,\n choices: (option.choices ?? []).map((choice) => ({\n id: choice.id,\n label: choice.label,\n description: choice.description ?? null,\n })),\n },\n ]),\n );\n const setupProfilesById = Object.fromEntries(\n (manifest.setupProfiles ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((profile) => [\n profile.id,\n {\n id: profile.id,\n name: profile.name,\n description: profile.description ?? null,\n optionValues: profile.optionValues\n ? Object.fromEntries(\n Object.entries(profile.optionValues).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\",\n ),\n )\n : null,\n },\n ]),\n );\n const pieceTypeIds = dedupeSorted(\n (manifest.pieceTypes ?? []).map((pieceType) => pieceType.id),\n );\n const pieceTypeSchemasById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n pieceType.fieldsSchema,\n ]),\n );\n const pieceTypeSlotIdsById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n dedupeSorted((pieceType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const pieceTypeIdByPieceId = new Map<string, string>();\n for (const seed of manifest.pieceSeeds ?? []) {\n for (const pieceId of expandSeedIds([seed])) {\n pieceTypeIdByPieceId.set(pieceId, seed.typeId);\n }\n }\n const pieceIds = dedupeSorted(pieceTypeIdByPieceId.keys());\n const dieTypeIds = dedupeSorted(\n (manifest.dieTypes ?? []).map((dieType) => dieType.id),\n );\n const dieTypeSchemasById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dieType.fieldsSchema,\n ]),\n );\n const dieTypeSlotIdsById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dedupeSorted((dieType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const dieTypeIdByDieId = new Map<string, string>();\n for (const seed of manifest.dieSeeds ?? []) {\n for (const dieId of expandSeedIds([seed])) {\n dieTypeIdByDieId.set(dieId, seed.typeId);\n }\n }\n const dieIds = dedupeSorted(dieTypeIdByDieId.keys());\n const strictSlotHosts = [\n ...(manifest.pieceSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = pieceTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"piece\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ...(manifest.dieSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = dieTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"die\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ].sort(\n (left, right) =>\n left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id),\n );\n const analyzedBoards = analyzeBoards(manifest, playerIds);\n const boardTemplateIds = dedupeSorted(\n (manifest.boardTemplates ?? []).map((boardTemplate) => boardTemplate.id),\n );\n const boardBaseIds = dedupeSorted(\n analyzedBoards.map(({ board }) => board.id),\n );\n const boardIds = dedupeSorted(\n analyzedBoards.flatMap((entry) => entry.runtimeBoardIds),\n );\n const boardTypeIds = dedupeSorted(\n analyzedBoards\n .map((board) => board.boardTypeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n );\n const boardLayoutById = new Map<string, string>();\n const boardIdsByLayout = new Map<string, string[]>();\n const boardBaseIdsByLayout = new Map<string, string[]>();\n const boardIdsByBaseId = new Map<string, string[]>();\n const boardBaseIdsByTemplateId = new Map<string, string[]>();\n const boardTemplateLayoutById = new Map<string, string>();\n const boardIdsByTypeId = new Map<string, string[]>();\n const spaceIdsByBoardId = new Map<string, string[]>();\n const spaceTypeIdByBoardId = new Map<string, Record<string, string | null>>();\n const spaceIdsByTypeId = new Map<string, string[]>();\n const containerIdsByBoardId = new Map<string, string[]>();\n const containerHostByBoardId = new Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >();\n const relationTypeIdsByBoardId = new Map<string, string[]>();\n const edgeIdsByTypeId = new Map<string, string[]>();\n const edgeIdsByBoardIdAndTypeId = new Map<string, Record<string, string[]>>();\n const vertexIdsByTypeId = new Map<string, string[]>();\n const vertexIdsByBoardIdAndTypeId = new Map<\n string,\n Record<string, string[]>\n >();\n for (const boardTemplate of manifest.boardTemplates ?? []) {\n boardTemplateLayoutById.set(boardTemplate.id, boardTemplate.layout);\n boardBaseIdsByLayout.set(\n boardTemplate.layout,\n dedupeSorted([...(boardBaseIdsByLayout.get(boardTemplate.layout) ?? [])]),\n );\n }\n for (const analyzedBoard of analyzedBoards) {\n boardIdsByBaseId.set(analyzedBoard.board.id, analyzedBoard.runtimeBoardIds);\n boardIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n boardBaseIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardBaseIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n analyzedBoard.board.id,\n ]),\n );\n if (analyzedBoard.board.templateId) {\n boardBaseIdsByTemplateId.set(\n analyzedBoard.board.templateId,\n dedupeSorted([\n ...(boardBaseIdsByTemplateId.get(analyzedBoard.board.templateId) ??\n []),\n analyzedBoard.board.id,\n ]),\n );\n }\n const runtimeSpaceIds = analyzedBoard.spaces.map((space) => space.id);\n const runtimeSpaceTypeIds: Record<string, string | null> = sortedObject(\n analyzedBoard.spaces.map(\n (space) => [space.id, space.typeId ?? null] as const,\n ),\n );\n const runtimeContainerIds =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.containers.map((container) => container.id);\n const runtimeContainerHosts: Record<\n string,\n { type: \"board\" } | { type: \"space\"; spaceId: string }\n > =\n analyzedBoard.layout === \"hex\"\n ? {}\n : sortedObject(\n analyzedBoard.containers.map((container) => [\n container.id,\n container.host.type === \"space\"\n ? { type: \"space\" as const, spaceId: container.host.spaceId }\n : { type: \"board\" as const },\n ]),\n );\n const runtimeRelationTypeIds =\n analyzedBoard.layout === \"hex\"\n ? [\"adjacent\"]\n : analyzedBoard.layout === \"square\"\n ? dedupeSorted([\n \"adjacent\",\n ...analyzedBoard.relations.map((relation) => relation.typeId),\n ])\n : dedupeSorted(\n analyzedBoard.relations.map((relation) => relation.typeId),\n );\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n boardLayoutById.set(runtimeBoardId, analyzedBoard.board.layout);\n spaceIdsByBoardId.set(runtimeBoardId, runtimeSpaceIds);\n spaceTypeIdByBoardId.set(runtimeBoardId, runtimeSpaceTypeIds);\n containerIdsByBoardId.set(runtimeBoardId, runtimeContainerIds);\n containerHostByBoardId.set(runtimeBoardId, runtimeContainerHosts);\n relationTypeIdsByBoardId.set(runtimeBoardId, runtimeRelationTypeIds);\n }\n if (analyzedBoard.boardTypeId) {\n boardIdsByTypeId.set(\n analyzedBoard.boardTypeId,\n dedupeSorted([\n ...(boardIdsByTypeId.get(analyzedBoard.boardTypeId) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n }\n for (const space of analyzedBoard.spaces) {\n if (!space.typeId) {\n continue;\n }\n spaceIdsByTypeId.set(\n space.typeId,\n dedupeSorted([...(spaceIdsByTypeId.get(space.typeId) ?? []), space.id]),\n );\n }\n if (analyzedBoard.layout !== \"generic\") {\n const edgeIdsForBoardByType: Record<string, string[]> = {};\n for (const edge of analyzedBoard.edges) {\n if (!edge.typeId) {\n continue;\n }\n edgeIdsByTypeId.set(\n edge.typeId,\n dedupeSorted([...(edgeIdsByTypeId.get(edge.typeId) ?? []), edge.id]),\n );\n edgeIdsForBoardByType[edge.typeId] = dedupeSorted([\n ...(edgeIdsForBoardByType[edge.typeId] ?? []),\n edge.id,\n ]);\n }\n const vertexIdsForBoardByType: Record<string, string[]> = {};\n for (const vertex of analyzedBoard.vertices) {\n if (!vertex.typeId) {\n continue;\n }\n vertexIdsByTypeId.set(\n vertex.typeId,\n dedupeSorted([\n ...(vertexIdsByTypeId.get(vertex.typeId) ?? []),\n vertex.id,\n ]),\n );\n vertexIdsForBoardByType[vertex.typeId] = dedupeSorted([\n ...(vertexIdsForBoardByType[vertex.typeId] ?? []),\n vertex.id,\n ]);\n }\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n edgeIdsByBoardIdAndTypeId.set(runtimeBoardId, edgeIdsForBoardByType);\n vertexIdsByBoardIdAndTypeId.set(\n runtimeBoardId,\n vertexIdsForBoardByType,\n );\n }\n }\n }\n const relationTypeIds = dedupeSorted(\n Array.from(relationTypeIdsByBoardId.values()).flat(),\n );\n const edgeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\" ? [] : board.edges.map((edge) => edge.id),\n ),\n );\n const edgeTypeIds = dedupeSorted(edgeIdsByTypeId.keys());\n const vertexIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\"\n ? []\n : board.vertices.map((vertex) => vertex.id),\n ),\n );\n const vertexTypeIds = dedupeSorted(vertexIdsByTypeId.keys());\n const boardContainerIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"hex\"\n ? []\n : board.containers.map((container) => container.id),\n ),\n );\n const spaceIds = dedupeSorted(\n analyzedBoards.flatMap((board) => board.spaces.map((space) => space.id)),\n );\n const spaceTypeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.spaces\n .map((space) => space.typeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n ),\n );\n\n return {\n manifest,\n playerIds,\n sharedZones,\n playerZones,\n zoneIds,\n cardSets,\n cardSetIds,\n cardTypes,\n cardIds,\n cardSetIdByCardId,\n cardTypeByCardId,\n sharedZoneCardSetIds,\n sharedZoneIdsByCardSetId,\n homeSharedZoneIdsByCardType,\n homeSharedZoneIdByCardType,\n playerZoneCardSetIds,\n zoneCardSetIdsById,\n zoneVisibilityById,\n resourceIds,\n resourcePresentationById,\n setupOptionIds,\n setupProfileIds,\n setupChoiceIdsByOptionId,\n setupOptionsById,\n setupProfilesById,\n pieceTypeIds,\n pieceIds,\n pieceTypeIdByPieceId,\n dieTypeIds,\n dieIds,\n dieTypeIdByDieId,\n strictSlotHosts,\n boardTemplateIds,\n boardBaseIds,\n boardIds,\n boardContainerIds,\n boardTypeIds,\n boardLayoutById,\n boardIdsByLayout,\n boardBaseIdsByLayout,\n boardIdsByBaseId,\n boardBaseIdsByTemplateId,\n boardTemplateLayoutById,\n boardIdsByTypeId,\n spaceIdsByBoardId,\n spaceTypeIdByBoardId,\n spaceIdsByTypeId,\n containerIdsByBoardId,\n containerHostByBoardId,\n relationTypeIds,\n relationTypeIdsByBoardId,\n edgeIds,\n edgeTypeIds,\n edgeIdsByTypeId,\n edgeIdsByBoardIdAndTypeId,\n vertexIds,\n vertexTypeIds,\n vertexIdsByTypeId,\n vertexIdsByBoardIdAndTypeId,\n spaceIds,\n spaceTypeIds,\n analyzedBoards,\n pieceTypeSchemasById,\n dieTypeSchemasById,\n };\n}\n\nfunction cloneJson<Value>(value: Value): Value {\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nfunction boardSpaceRefKey(spaceIds: readonly string[]): string {\n return [...spaceIds]\n .sort((left, right) => left.localeCompare(right))\n .join(\"$$\");\n}\n\nfunction materializePropertySchemaDefault(\n property: PropertySchema,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): unknown {\n if (hasPropertySchemaDefault(property)) {\n return cloneJson(property.default);\n }\n if (property.optional) {\n return undefined;\n }\n if (property.nullable) {\n return null;\n }\n\n switch (property.type) {\n case \"string\":\n return \"\";\n case \"integer\":\n case \"number\":\n return 0;\n case \"boolean\":\n return false;\n case \"enum\":\n return property.enums?.[0] ?? \"\";\n case \"array\":\n return [];\n case \"object\":\n return materializeObjectSchemaDefaults(\n property.properties ? { properties: property.properties } : undefined,\n analysis,\n runtimeBoardId,\n );\n case \"record\":\n return {};\n case \"zoneId\":\n return analysis.zoneIds[0] ?? \"\";\n case \"cardId\":\n return analysis.cardIds[0] ?? \"\";\n case \"playerId\":\n return analysis.playerIds[0] ?? \"\";\n case \"boardId\":\n return runtimeBoardId ?? analysis.boardIds[0] ?? \"\";\n case \"edgeId\":\n return analysis.edgeIds[0] ?? \"\";\n case \"vertexId\":\n return analysis.vertexIds[0] ?? \"\";\n case \"spaceId\":\n return (\n (runtimeBoardId\n ? analysis.spaceIdsByBoardId.get(runtimeBoardId)?.[0]\n : undefined) ??\n analysis.spaceIds[0] ??\n \"\"\n );\n case \"pieceId\":\n return analysis.pieceIds[0] ?? \"\";\n case \"dieId\":\n return analysis.dieIds[0] ?? \"\";\n case \"resourceId\":\n return analysis.resourceIds[0] ?? \"\";\n }\n}\n\nfunction materializeObjectSchemaDefaults(\n schema: ObjectSchema | null | undefined,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): Record<string, unknown> {\n if (!schema?.properties) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(schema.properties).flatMap(([key, property]) => {\n const value = materializePropertySchemaDefault(\n property,\n analysis,\n runtimeBoardId,\n );\n return value === undefined ? [] : [[key, value]];\n }),\n );\n}\n\nfunction materializeCardPropertiesDefaults(\n schema: CardPropertySchema | null | undefined,\n cardType: string,\n analysis: ManifestAnalysis,\n): Record<string, unknown> {\n const objectSchema = isCardPropertySchemaVariants(schema)\n ? mergeSharedCardProperties(schema, cardType)\n : schema;\n return materializeObjectSchemaDefaults(objectSchema, analysis);\n}\n\nexport function materializeManifestTable(options: {\n manifest: GameTopologyManifest;\n playerIds: readonly string[];\n shuffleItems: <Value>(values: readonly Value[]) => Value[];\n}): Record<string, unknown> {\n const analysis = analyzeManifest(options.manifest);\n const manifest = analysis.manifest;\n const playerIds = [...options.playerIds];\n\n const cards: Record<string, Record<string, unknown>> = {};\n const pieces: Record<string, Record<string, unknown>> = {};\n const dice: Record<string, Record<string, unknown>> = {};\n const componentLocations: Record<string, Record<string, unknown>> = {};\n const locationOrder = new Map<string, number>();\n const cardIdsByCardSetId = new Map<string, string[]>();\n\n const boardAnalysisByBaseId = new Map(\n analysis.analyzedBoards.map((board) => [board.board.id, board] as const),\n );\n const edgeIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n const vertexIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n if (analyzedBoard.layout === \"generic\") {\n continue;\n }\n edgeIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.edges.map((edge) => [\n boardSpaceRefKey(edge.spaceIds),\n edge.id,\n ]),\n ),\n );\n vertexIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.vertices.map((vertex) => [\n boardSpaceRefKey(vertex.spaceIds),\n vertex.id,\n ]),\n ),\n );\n }\n\n const nextLocationPosition = (location: Record<string, unknown>): number => {\n const key = JSON.stringify(location);\n const position = locationOrder.get(key) ?? 0;\n locationOrder.set(key, position + 1);\n return position;\n };\n const zoneScopeById = new Map<string, \"shared\" | \"perPlayer\">([\n ...analysis.sharedZones.map((zone) => [zone.id, \"shared\"] as const),\n ...analysis.playerZones.map((zone) => [zone.id, \"perPlayer\"] as const),\n ]);\n const nextDeckPositionByZoneId = new Map<string, number>();\n\n const resolveRuntimeBoardId = (\n boardBaseId: string,\n ownerId: string | null | undefined,\n context?: string,\n ) => {\n const analyzedBoard = boardAnalysisByBaseId.get(boardBaseId);\n if (analyzedBoard?.board.scope === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context ?? `Home on board '${boardBaseId}'`} requires ownerId because board '${boardBaseId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n return `${boardBaseId}:${ownerId}`;\n }\n return boardBaseId;\n };\n\n const resolveBoardEdgeId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) =>\n edgeIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds)) ?? boardSpaceRefKey(spaceIds);\n\n const resolveBoardVertexId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) =>\n vertexIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds)) ?? boardSpaceRefKey(spaceIds);\n\n for (const cardSet of manifest.cardSets) {\n const materializedCardSet = materializeCardSet(cardSet);\n const cardIds: string[] = [];\n for (const card of materializedCardSet.cards) {\n const cardInstanceIds = renderCardInstanceIds(card);\n for (const cardId of cardInstanceIds) {\n cardIds.push(cardId);\n cards[cardId] = {\n id: cardId,\n cardSetId: materializedCardSet.id,\n cardType: card.type,\n name: card.name,\n text: card.text,\n properties: {\n ...materializeCardPropertiesDefaults(\n materializedCardSet.cardSchema,\n card.type,\n analysis,\n ),\n ...(card.properties ?? {}),\n },\n };\n if (card.home?.type === \"zone\") {\n const nextPosition =\n nextDeckPositionByZoneId.get(card.home.zoneId) ?? 0;\n nextDeckPositionByZoneId.set(card.home.zoneId, nextPosition + 1);\n componentLocations[cardId] = {\n type: \"InDeck\",\n deckId: card.home.zoneId,\n playedBy: null,\n position: nextPosition,\n };\n } else if (card.home?.type === \"detached\") {\n componentLocations[cardId] = {\n type: \"Detached\",\n position: nextLocationPosition({ type: \"Detached\" }),\n };\n }\n }\n }\n cardIdsByCardSetId.set(materializedCardSet.id, cardIds);\n }\n\n for (const zone of analysis.sharedZones) {\n const primaryCardSetId = zone.allowedCardSetIds?.[0];\n if (!primaryCardSetId) {\n continue;\n }\n const shuffled = options.shuffleItems(\n (cardIdsByCardSetId.get(primaryCardSetId) ?? []).filter(\n (cardId) => componentLocations[cardId] === undefined,\n ),\n );\n shuffled.forEach((cardId, index) => {\n componentLocations[cardId] = {\n type: \"InDeck\",\n deckId: zone.id,\n playedBy: null,\n position: index,\n };\n });\n }\n\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [pieceType.id, pieceType]),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType]),\n );\n\n const assignSeedLocation = (\n componentId: string,\n ownerId: string | null | undefined,\n home: PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"] | undefined,\n context: {\n path: string;\n label: string;\n },\n ) => {\n if (!home) {\n componentLocations[componentId] = { type: \"Detached\" };\n return;\n }\n\n if (home.type === \"slot\") {\n componentLocations[componentId] = {\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n position: nextLocationPosition({\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n }),\n };\n return;\n }\n\n if (home.type === \"zone\") {\n if (zoneScopeById.get(home.zoneId) === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context.path}.zoneId: ${context.label} requires ownerId because zone '${home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n componentLocations[componentId] = {\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n position: nextLocationPosition({\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = {\n type: \"InZone\",\n zoneId: home.zoneId,\n playedBy: null,\n position: nextLocationPosition({\n type: \"InZone\",\n zoneId: home.zoneId,\n }),\n };\n return;\n }\n\n if (home.type === \"space\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n position: nextLocationPosition({\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n }),\n };\n return;\n }\n\n if (home.type === \"container\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n position: nextLocationPosition({\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n }),\n };\n return;\n }\n\n if (home.type === \"edge\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const edgeId = resolveBoardEdgeId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position: nextLocationPosition({\n type: \"OnEdge\",\n boardId,\n edgeId,\n }),\n };\n return;\n }\n\n if (home.type === \"vertex\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const vertexId = resolveBoardVertexId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position: nextLocationPosition({\n type: \"OnVertex\",\n boardId,\n vertexId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = { type: \"Detached\" };\n };\n\n for (const [seedIndex, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n pieces[componentId] = {\n componentType: \"piece\",\n id: componentId,\n pieceTypeId: seed.typeId,\n pieceName: pieceType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.pieceTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.pieceSeeds[${seedIndex}].home`,\n label: `Piece seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n for (const [seedIndex, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n dice[componentId] = {\n componentType: \"die\",\n id: componentId,\n dieTypeId: seed.typeId,\n dieName: dieType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n sides: dieType?.sides ?? 6,\n value: null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.dieTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.dieSeeds[${seedIndex}].home`,\n label: `Die seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n const boardStatesById: Record<string, Record<string, unknown>> = {};\n const hexBoardStatesById: Record<string, Record<string, unknown>> = {};\n const squareBoardStatesById: Record<string, Record<string, unknown>> = {};\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n const sharedBoardState = {\n baseId: analyzedBoard.board.id,\n layout: analyzedBoard.layout,\n typeId: analyzedBoard.boardTypeId ?? null,\n scope: analyzedBoard.board.scope,\n templateId: analyzedBoard.board.templateId ?? null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.boardFieldsSchema,\n analysis,\n ),\n ...(analyzedBoard.board.fields ?? {}),\n },\n };\n\n const buildSpaces = () =>\n Object.fromEntries(\n analysis.spaceIds.map((spaceId) => {\n const space = analyzedBoard.spaces.find(\n (entry) => entry.id === spaceId,\n );\n const baseSpaceState = {\n id: spaceId,\n name: space && \"name\" in space ? (space.name ?? null) : null,\n typeId: space?.typeId ?? null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.spaceFieldsSchema,\n analysis,\n ),\n ...(space?.fields ?? {}),\n },\n zoneId: space && \"zoneId\" in space ? (space.zoneId ?? null) : null,\n };\n\n if (analyzedBoard.layout === \"hex\") {\n const hexSpace = space as HexSpaceSpec | undefined;\n return [\n spaceId,\n {\n ...baseSpaceState,\n q: hexSpace?.q ?? 0,\n r: hexSpace?.r ?? 0,\n },\n ];\n }\n\n if (analyzedBoard.layout === \"square\") {\n const squareSpace = space as SquareSpaceSpec | undefined;\n return [\n spaceId,\n {\n ...baseSpaceState,\n row: squareSpace?.row ?? 0,\n col: squareSpace?.col ?? 0,\n },\n ];\n }\n\n return [spaceId, baseSpaceState];\n }),\n );\n\n const relations =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.relations.map((relation) => ({\n id: relation.id ?? null,\n typeId: relation.typeId,\n fromSpaceId: relation.fromSpaceId,\n toSpaceId: relation.toSpaceId,\n directed: relation.directed ?? false,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.relationFieldsSchema,\n analysis,\n ),\n ...(relation.fields ?? {}),\n },\n }));\n\n const buildContainers = (runtimeBoardId: string) =>\n analyzedBoard.layout === \"hex\"\n ? {}\n : Object.fromEntries(\n analysis.boardContainerIds.map((containerId) => {\n const container = analyzedBoard.containers.find(\n (entry) => entry.id === containerId,\n );\n return [\n containerId,\n {\n id: containerId,\n name: container?.name ?? containerId,\n host:\n container?.host.type === \"space\"\n ? { type: \"space\", spaceId: container.host.spaceId }\n : { type: \"board\" },\n allowedCardSetIds: container?.allowedCardSetIds,\n zoneId: `board:${runtimeBoardId}:container:${containerId}`,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.containerFieldsSchema,\n analysis,\n runtimeBoardId,\n ),\n ...(container?.fields ?? {}),\n },\n },\n ];\n }),\n );\n\n const edges =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.edges.map((edge) => ({\n id: edge.id,\n spaceIds: [...edge.spaceIds],\n typeId: edge.typeId ?? null,\n label: edge.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.edgeFieldsSchema,\n analysis,\n ),\n ...(edge.fields ?? {}),\n },\n }));\n\n const vertices =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.vertices.map((vertex) => ({\n id: vertex.id,\n spaceIds: [...vertex.spaceIds],\n typeId: vertex.typeId ?? null,\n label: vertex.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.vertexFieldsSchema,\n analysis,\n ),\n ...(vertex.fields ?? {}),\n },\n }));\n\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n const playerId =\n analyzedBoard.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(analyzedBoard.board.id.length + 1)\n : null;\n const boardState = {\n id: runtimeBoardId,\n ...sharedBoardState,\n playerId,\n spaces: cloneJson(buildSpaces()),\n relations: cloneJson(relations),\n containers: cloneJson(buildContainers(runtimeBoardId)),\n ...(analyzedBoard.layout === \"hex\"\n ? {\n orientation: analyzedBoard.board.orientation ?? \"pointy-top\",\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : analyzedBoard.layout === \"square\"\n ? {\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : {}),\n };\n\n boardStatesById[runtimeBoardId] = boardState;\n if (analyzedBoard.layout === \"hex\") {\n hexBoardStatesById[runtimeBoardId] = boardState;\n }\n if (analyzedBoard.layout === \"square\") {\n squareBoardStatesById[runtimeBoardId] = boardState;\n }\n }\n }\n\n const sharedZones = Object.fromEntries(\n analysis.sharedZones.map((zone) => [zone.id, [] as string[]]),\n );\n const perPlayerZones = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n Object.fromEntries(\n playerIds.map((playerId) => [playerId, [] as string[]]),\n ),\n ]),\n );\n const zoneVisibility = Object.fromEntries(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const zoneCardSetIdsByZoneId = Object.fromEntries(\n Array.from(analysis.zoneCardSetIdsById.entries()).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const handVisibility = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n zone.visibility ?? \"ownerOnly\",\n ]),\n );\n const componentSortPosition = (position: unknown) =>\n typeof position === \"number\" ? position : Number.MAX_SAFE_INTEGER;\n const pushSharedComponent = (\n zoneId: string,\n componentId: string,\n position: unknown,\n ) => {\n const zone = sharedZones[zoneId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n const pushPlayerComponent = (\n zoneId: string,\n playerId: string,\n componentId: string,\n position: unknown,\n ) => {\n const zone = perPlayerZones[zoneId]?.[playerId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n\n for (const [componentId, location] of Object.entries(componentLocations)) {\n switch (location.type) {\n case \"InDeck\":\n pushSharedComponent(\n location.deckId as string,\n componentId,\n location.position,\n );\n break;\n case \"InHand\":\n pushPlayerComponent(\n location.handId as string,\n location.playerId as string,\n componentId,\n location.position,\n );\n break;\n case \"InZone\":\n pushSharedComponent(\n location.zoneId as string,\n componentId,\n location.position,\n );\n break;\n default:\n break;\n }\n }\n const ownerOfCard = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, null]),\n );\n const visibility = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, { faceUp: true }]),\n );\n const resourcesByPlayer = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n Object.fromEntries(\n analysis.resourceIds.map((resourceId) => [resourceId, 0]),\n ),\n ]),\n );\n // PerPlayer<T> wire shape only: { __perPlayer: true, entries: [[playerId, value], ...] }.\n const toPerPlayerWireFormat = <Value>(\n entries: Record<string, Value>,\n ): {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [string, Value]>;\n } => ({\n __perPlayer: true,\n entries: playerIds.map(\n (playerId) => [playerId, entries[playerId] as Value] as const,\n ),\n });\n\n const perPlayerZonesWire = Object.fromEntries(\n Object.entries(perPlayerZones).map(([zoneId, entries]) => [\n zoneId,\n toPerPlayerWireFormat(entries),\n ]),\n );\n const resourcesWire = toPerPlayerWireFormat(resourcesByPlayer);\n\n return {\n playerOrder: playerIds,\n zones: {\n shared: sharedZones,\n perPlayer: perPlayerZonesWire,\n visibility: zoneVisibility,\n cardSetIdsByZoneId: zoneCardSetIdsByZoneId,\n },\n decks: cloneJson(sharedZones),\n hands: cloneJson(perPlayerZonesWire),\n handVisibility,\n cards,\n pieces,\n componentLocations,\n ownerOfCard,\n visibility,\n resources: resourcesWire,\n boards: {\n byId: boardStatesById,\n hex: hexBoardStatesById,\n square: squareBoardStatesById,\n network: {},\n track: {},\n },\n dice,\n };\n}\n\nfunction renderTypeForPropertySchema(\n schema: PropertySchema | null | undefined,\n): string {\n if (!schema) {\n return \"RuntimePayload\";\n }\n let rendered: string;\n switch (schema.type) {\n case \"string\":\n rendered = \"string\";\n break;\n case \"integer\":\n case \"number\":\n rendered = \"number\";\n break;\n case \"boolean\":\n rendered = \"boolean\";\n break;\n case \"cardId\":\n rendered = \"CardId\";\n break;\n case \"playerId\":\n rendered = \"PlayerId\";\n break;\n case \"zoneId\":\n rendered = \"ZoneId\";\n break;\n case \"boardId\":\n rendered = \"BoardId\";\n break;\n case \"edgeId\":\n rendered = \"EdgeId\";\n break;\n case \"vertexId\":\n rendered = \"VertexId\";\n break;\n case \"spaceId\":\n rendered = \"SpaceId\";\n break;\n case \"pieceId\":\n rendered = \"PieceId\";\n break;\n case \"dieId\":\n rendered = \"DieId\";\n break;\n case \"resourceId\":\n rendered = \"ResourceId\";\n break;\n case \"enum\":\n rendered =\n schema.enums && schema.enums.length > 0\n ? schema.enums.map((value) => quote(value)).join(\" | \")\n : \"string\";\n break;\n case \"array\":\n rendered = `Array<${renderTypeForPropertySchema(schema.items)}>`;\n break;\n case \"object\":\n rendered = renderTypeForObjectSchema(\n schema.properties\n ? {\n properties: schema.properties,\n }\n : null,\n );\n break;\n case \"record\":\n rendered = `Record<string, ${renderTypeForPropertySchema(schema.values)}>`;\n break;\n default:\n rendered = \"RuntimePayload\";\n break;\n }\n return schema.nullable ? `${rendered} | null` : rendered;\n}\n\nfunction renderZodForPropertySchema(\n schema: PropertySchema | null | undefined,\n): string {\n if (!schema) {\n return \"z.unknown()\";\n }\n let rendered: string;\n switch (schema.type) {\n case \"string\":\n rendered = \"z.string()\";\n break;\n case \"integer\":\n rendered = \"z.number().int()\";\n break;\n case \"number\":\n rendered = \"z.number()\";\n break;\n case \"boolean\":\n rendered = \"z.boolean()\";\n break;\n case \"cardId\":\n rendered = \"ids.cardId\";\n break;\n case \"playerId\":\n rendered = \"ids.playerId\";\n break;\n case \"zoneId\":\n rendered = \"ids.zoneId\";\n break;\n case \"boardId\":\n rendered = \"ids.boardId\";\n break;\n case \"edgeId\":\n rendered = \"ids.edgeId\";\n break;\n case \"vertexId\":\n rendered = \"ids.vertexId\";\n break;\n case \"spaceId\":\n rendered = \"ids.spaceId\";\n break;\n case \"pieceId\":\n rendered = \"ids.pieceId\";\n break;\n case \"dieId\":\n rendered = \"ids.dieId\";\n break;\n case \"resourceId\":\n rendered = \"ids.resourceId\";\n break;\n case \"enum\":\n rendered =\n schema.enums && schema.enums.length > 0\n ? `z.enum([${schema.enums.map((value) => quote(value)).join(\", \")}])`\n : \"z.string()\";\n break;\n case \"array\":\n rendered = `z.array(${renderZodForPropertySchema(schema.items)})`;\n break;\n case \"object\":\n rendered = renderZodForObjectSchema(\n schema.properties\n ? {\n properties: schema.properties,\n }\n : null,\n );\n break;\n case \"record\":\n rendered = `z.record(z.string(), ${renderZodForPropertySchema(schema.values)})`;\n break;\n default:\n rendered = \"z.unknown()\";\n break;\n }\n if (schema.nullable) {\n rendered = `${rendered}.nullable()`;\n }\n if (schema.optional) {\n rendered = `${rendered}.optional()`;\n }\n if (hasPropertySchemaDefault(schema)) {\n rendered = `${rendered}.default(${JSON.stringify(schema.default)})`;\n }\n return rendered;\n}\n\nfunction renderTypeForObjectSchema(\n schema: ObjectSchema | null | undefined,\n): string {\n if (!schema || Object.keys(schema.properties).length === 0) {\n return \"RuntimeRecord\";\n }\n\n return `{\\n${Object.entries(schema.properties)\n .map(([key, value]) => {\n const optional =\n value?.optional && !hasPropertySchemaDefault(value) ? \"?\" : \"\";\n return ` ${quote(key)}${optional}: ${renderTypeForPropertySchema(value)};`;\n })\n .join(\"\\n\")}\\n}`;\n}\n\nfunction renderZodForObjectSchema(\n schema: ObjectSchema | null | undefined,\n): string {\n if (!schema || Object.keys(schema.properties).length === 0) {\n return \"z.record(z.string(), z.unknown())\";\n }\n\n return `z.object({\\n${Object.entries(schema.properties)\n .map(\n ([key, value]) =>\n ` ${quote(key)}: ${renderZodForPropertySchema(value)},`,\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderCardSetPropertySections(\n cardSets: readonly ManualCardSetDefinition[],\n): string {\n return cardSets\n .map((cardSet) => {\n const typeName = `${toPascalCase(cardSet.id)}CardProperties`;\n const schemaName = `${typeName}Schema`;\n\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n const cardSchema = cardSet.cardSchema;\n const variantBlocks = Object.entries(cardSchema.variants).map(\n ([cardType]) => {\n const variantTypeName = cardPropertiesTypeName(cardSet, cardType);\n const variantSchemaName = cardPropertiesSchemaName(\n cardSet,\n cardType,\n );\n const schema = mergeSharedCardProperties(cardSchema, cardType);\n return renderBlocks([\n `export type ${variantTypeName} = ${renderTypeForObjectSchema(schema)};`,\n `export const ${variantSchemaName} = ${renderZodForObjectSchema(schema)};`,\n ]);\n },\n );\n const variantTypeNames = Object.keys(cardSchema.variants).map(\n (cardType) => cardPropertiesTypeName(cardSet, cardType),\n );\n const variantSchemaNames = Object.keys(cardSchema.variants).map(\n (cardType) => cardPropertiesSchemaName(cardSet, cardType),\n );\n const unionSchema =\n variantSchemaNames.length === 0\n ? \"z.record(z.string(), z.unknown())\"\n : variantSchemaNames.length === 1\n ? variantSchemaNames[0]\n : `z.union([${variantSchemaNames.join(\", \")}])`;\n\n return renderBlocks([\n ...variantBlocks,\n `export type ${typeName} = ${variantTypeNames.join(\" | \") || \"RuntimeRecord\"};`,\n `export const ${schemaName} = ${unionSchema};`,\n `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`,\n ]);\n }\n\n return renderBlocks([\n `export type ${typeName} = ${renderTypeForObjectSchema(cardSet.cardSchema)};`,\n `export const ${schemaName} = ${renderZodForObjectSchema(cardSet.cardSchema)};`,\n `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`,\n ]);\n })\n .join(\"\\n\\n\");\n}\n\nfunction cardPropertiesTypeName(\n cardSet: ManualCardSetDefinition,\n cardType: string,\n): string {\n if (!isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return `${toPascalCase(cardSet.id)}CardProperties`;\n }\n return `${toPascalCase(cardSet.id)}${toPascalCase(cardType)}CardProperties`;\n}\n\nfunction cardPropertiesSchemaName(\n cardSet: ManualCardSetDefinition,\n cardType: string,\n): string {\n if (!isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return `${toPascalCase(cardSet.id)}CardPropertiesSchema`;\n }\n return `${cardPropertiesTypeName(cardSet, cardType)}Schema`;\n}\n\nfunction renderCardPropertiesSchemaByCardSetId(\n cardSets: readonly ManualCardSetDefinition[],\n): string {\n const entries = cardSets.flatMap((cardSet) => {\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return Object.keys(cardSet.cardSchema.variants).map(\n (cardType) =>\n ` ${quote(`${cardSet.id}:${cardType}`)}: ${cardPropertiesSchemaName(cardSet, cardType)},`,\n );\n }\n return [\n ` ${quote(cardSet.id)}: ${toPascalCase(cardSet.id)}CardPropertiesSchema,`,\n ];\n });\n return `const cardPropertiesSchemaByCardSetId: Record<string, z.ZodType<unknown>> = {\\n${entries.join(\"\\n\")}\\n};`;\n}\n\nfunction renderObjectSchemaSection(\n typeName: string,\n schemaName: string,\n schema: ObjectSchema | null | undefined,\n): string {\n return renderBlocks([\n `export type ${typeName} = ${renderTypeForObjectSchema(schema)};`,\n `export const ${schemaName} = ${renderZodForObjectSchema(schema)};`,\n ]);\n}\n\nfunction boardPrefix(boardId: string): string {\n return toPascalCase(boardId);\n}\n\nfunction boardFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}BoardFields`;\n}\n\nfunction boardSpaceFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}SpaceFields`;\n}\n\nfunction boardRelationFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}RelationFields`;\n}\n\nfunction boardContainerFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}ContainerFields`;\n}\n\nfunction hexEdgeFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}EdgeFields`;\n}\n\nfunction hexVertexFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}VertexFields`;\n}\n\nfunction pieceFieldsTypeName(typeId: string): string {\n return `${toPascalCase(typeId)}PieceFields`;\n}\n\nfunction dieFieldsTypeName(typeId: string): string {\n return `${toPascalCase(typeId)}DieFields`;\n}\n\nfunction renderTopologyFieldSections(analysis: ManifestAnalysis): string {\n const sections: string[] = [];\n\n for (const board of analysis.analyzedBoards) {\n sections.push(\n renderObjectSchemaSection(\n boardFieldsTypeName(board.board.id),\n `${boardFieldsTypeName(board.board.id)}Schema`,\n board.boardFieldsSchema,\n ),\n );\n sections.push(\n renderObjectSchemaSection(\n boardSpaceFieldsTypeName(board.board.id),\n `${boardSpaceFieldsTypeName(board.board.id)}Schema`,\n board.spaceFieldsSchema,\n ),\n );\n if (board.layout !== \"hex\") {\n sections.push(\n renderObjectSchemaSection(\n boardRelationFieldsTypeName(board.board.id),\n `${boardRelationFieldsTypeName(board.board.id)}Schema`,\n board.relationFieldsSchema,\n ),\n renderObjectSchemaSection(\n boardContainerFieldsTypeName(board.board.id),\n `${boardContainerFieldsTypeName(board.board.id)}Schema`,\n board.containerFieldsSchema,\n ),\n );\n }\n if (board.layout !== \"generic\") {\n sections.push(\n renderObjectSchemaSection(\n hexEdgeFieldsTypeName(board.board.id),\n `${hexEdgeFieldsTypeName(board.board.id)}Schema`,\n board.edgeFieldsSchema,\n ),\n renderObjectSchemaSection(\n hexVertexFieldsTypeName(board.board.id),\n `${hexVertexFieldsTypeName(board.board.id)}Schema`,\n board.vertexFieldsSchema,\n ),\n );\n }\n }\n\n for (const pieceTypeId of analysis.pieceTypeIds) {\n sections.push(\n renderObjectSchemaSection(\n pieceFieldsTypeName(pieceTypeId),\n `${pieceFieldsTypeName(pieceTypeId)}Schema`,\n analysis.pieceTypeSchemasById.get(pieceTypeId),\n ),\n );\n }\n\n for (const dieTypeId of analysis.dieTypeIds) {\n sections.push(\n renderObjectSchemaSection(\n dieFieldsTypeName(dieTypeId),\n `${dieFieldsTypeName(dieTypeId)}Schema`,\n analysis.dieTypeSchemasById.get(dieTypeId),\n ),\n );\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderBoardFieldMapTypes(analysis: ManifestAnalysis): string {\n const boardEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${boardFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const spaceEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${boardSpaceFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const relationEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${\n board.layout === \"hex\"\n ? \"RuntimeRecord\"\n : boardRelationFieldsTypeName(board.board.id)\n };`,\n ),\n )\n .join(\"\\n\");\n const containerEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${\n board.layout === \"hex\"\n ? \"RuntimeRecord\"\n : boardContainerFieldsTypeName(board.board.id)\n };`,\n ),\n )\n .join(\"\\n\");\n const edgeEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const squareEdgeEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const tiledEdgeEntries = analysis.analyzedBoards\n .filter(\n (board): board is AnalyzedHexBoard | AnalyzedSquareBoard =>\n board.layout !== \"generic\",\n )\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const vertexEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const squareVertexEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const tiledVertexEntries = analysis.analyzedBoards\n .filter(\n (board): board is AnalyzedHexBoard | AnalyzedSquareBoard =>\n board.layout !== \"generic\",\n )\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const pieceEntries = analysis.pieceTypeIds\n .map((typeId) => ` ${quote(typeId)}: ${pieceFieldsTypeName(typeId)};`)\n .join(\"\\n\");\n const dieEntries = analysis.dieTypeIds\n .map((typeId) => ` ${quote(typeId)}: ${dieFieldsTypeName(typeId)};`)\n .join(\"\\n\");\n\n return renderBlocks([\n `export type BoardFieldsByBoardId = {\\n${boardEntries}\\n};`,\n `export type BoardSpaceFieldsByBoardId = {\\n${spaceEntries}\\n};`,\n `export type BoardRelationFieldsByBoardId = {\\n${relationEntries}\\n};`,\n `export type BoardContainerFieldsByBoardId = {\\n${containerEntries}\\n};`,\n `export type HexEdgeFieldsByBoardId = ${\n edgeEntries.length > 0 ? `{\\n${edgeEntries}\\n}` : \"Record<string, never>\"\n };`,\n `export type HexVertexFieldsByBoardId = ${\n vertexEntries.length > 0\n ? `{\\n${vertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type SquareEdgeFieldsByBoardId = ${\n squareEdgeEntries.length > 0\n ? `{\\n${squareEdgeEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type SquareVertexFieldsByBoardId = ${\n squareVertexEntries.length > 0\n ? `{\\n${squareVertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type TiledEdgeFieldsByBoardId = ${\n tiledEdgeEntries.length > 0\n ? `{\\n${tiledEdgeEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type TiledVertexFieldsByBoardId = ${\n tiledVertexEntries.length > 0\n ? `{\\n${tiledVertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type PieceFieldsByTypeId = ${\n pieceEntries.length > 0\n ? `{\\n${pieceEntries}\\n}`\n : \"Record<string, RuntimeRecord>\"\n };`,\n `export type DieFieldsByTypeId = ${\n dieEntries.length > 0\n ? `{\\n${dieEntries}\\n}`\n : \"Record<string, RuntimeRecord>\"\n };`,\n ]);\n}\n\nfunction renderCardStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.cardIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object(\n Object.fromEntries(\n literals.cardIds.map((cardId) => [cardId, createCardStateSchema(cardId)]),\n ) as Record<CardId, z.ZodType<unknown>>,\n)`;\n}\n\nfunction renderCardStateSchemaFactory(analysis: ManifestAnalysis): string {\n if (analysis.cardIds.length === 0) {\n return \"\";\n }\n\n return `function createCardStateSchema<CardIdValue extends CardId>(\n cardId: CardIdValue,\n): z.ZodType<CardStateById[CardIdValue]> {\n const cardSetId = literals.cardSetIdByCardId[cardId];\n const cardType = literals.cardTypeByCardId[cardId];\n const cardPropertiesSchema =\n cardPropertiesSchemaByCardSetId[cardSetId + \":\" + cardType] ??\n cardPropertiesSchemaByCardSetId[cardSetId] ??\n unknownRecordSchema;\n return assumeManifestSchema<CardStateById[CardIdValue]>(\n cardStateSchema.extend({\n id: z.literal(cardId),\n cardSetId: z.literal(cardSetId),\n cardType: z.literal(cardType),\n properties: cardPropertiesSchema,\n }),\n );\n}`;\n}\n\nfunction renderPieceStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.pieceIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.pieceIds\n .map((pieceId) => {\n const pieceTypeId = analysis.pieceTypeIdByPieceId.get(pieceId) ?? \"\";\n return ` ${quote(pieceId)}: z.object({\n componentType: z.string().optional(),\n id: z.literal(${quote(pieceId)}),\n pieceTypeId: z.literal(${quote(pieceTypeId)}),\n pieceName: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n properties: ${\n pieceTypeId\n ? `${pieceFieldsTypeName(pieceTypeId)}Schema`\n : \"unknownRecordSchema\"\n },\n }),`;\n })\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderDieStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.dieIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.dieIds\n .map((dieId) => {\n const dieTypeId = analysis.dieTypeIdByDieId.get(dieId) ?? \"\";\n const dieType = (analysis.manifest.dieTypes ?? []).find(\n (candidate) => candidate.id === dieTypeId,\n );\n return ` ${quote(dieId)}: z.object({\n componentType: z.string().optional(),\n id: z.literal(${quote(dieId)}),\n dieTypeId: z.literal(${quote(dieTypeId)}),\n dieName: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n sides: z.literal(${dieType?.sides ?? 6}),\n value: z.number().int().nullable().optional(),\n properties: ${\n dieTypeId\n ? `${dieFieldsTypeName(dieTypeId)}Schema`\n : \"unknownRecordSchema\"\n },\n }),`;\n })\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderGenericBoardStateSchema(\n board: AnalyzedGenericBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"generic\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: per-board state.spaces is loose-keyed by string. The\n // canonical narrow id (\\`ids.spaceId\\`) is a Zod enum of EVERY\n // space id across every board, which makes a strict\n // \\`z.record(enum, …)\\` reject any board whose spaces are a\n // proper subset of that enum. Loose keying matches the JSON wire\n // shape (\\`additionalProperties\\`); the inner \\`id: ids.spaceId\\`\n // narrows the value's spaceId at parse time. A future per-board\n // branded-id refactor (option B) can re-tighten this without a\n // wire change.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string().nullable().optional(),\n typeId: ids.relationTypeId,\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: ${`${boardRelationFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n containers: z.record(\n ids.boardContainerId,\n z.object({\n id: ids.boardContainerId,\n name: z.string(),\n host: z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"board\") }),\n z.object({ type: z.literal(\"space\"), spaceId: ids.spaceId }),\n ]),\n allowedCardSetIds: z.array(ids.cardSetId).optional(),\n zoneId: z.string(),\n fields: ${`${boardContainerFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderHexBoardStateSchema(\n board: AnalyzedHexBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"hex\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: see generic-board comment on the loose-keying choice.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n q: z.number().int(),\n r: z.number().int(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string().nullable().optional(),\n typeId: z.literal(\"adjacent\"),\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: unknownRecordSchema,\n }),\n ),\n containers: z.object({}),\n orientation: z.enum([\"pointy-top\", \"flat-top\"]),\n edges: z.array(\n z.object({\n id: ids.edgeId,\n spaceIds: z.array(ids.spaceId).min(1).max(2),\n typeId: ids.edgeTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexEdgeFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n vertices: z.array(\n z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(3),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexVertexFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderSquareBoardStateSchema(\n board: AnalyzedSquareBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"square\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: see generic-board comment on the loose-keying choice.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n row: z.number().int(),\n col: z.number().int(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string().nullable().optional(),\n typeId: ids.relationTypeId,\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: ${`${boardRelationFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n containers: z.record(\n ids.boardContainerId,\n z.object({\n id: ids.boardContainerId,\n name: z.string(),\n host: z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"board\") }),\n z.object({ type: z.literal(\"space\"), spaceId: ids.spaceId }),\n ]),\n allowedCardSetIds: z.array(ids.cardSetId).optional(),\n zoneId: z.string(),\n fields: ${`${boardContainerFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n edges: z.array(\n z.object({\n id: ids.edgeId,\n spaceIds: z.array(ids.spaceId).min(1).max(2),\n typeId: ids.edgeTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexEdgeFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n vertices: z.array(\n z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(4),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexVertexFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderBoardStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.boardIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n const schema =\n board.layout === \"hex\"\n ? renderHexBoardStateSchema(board, runtimeBoardId)\n : board.layout === \"square\"\n ? renderSquareBoardStateSchema(board, runtimeBoardId)\n : renderGenericBoardStateSchema(board, runtimeBoardId);\n return ` ${quote(runtimeBoardId)}: ${schema},`;\n }),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderHexBoardStateSchemaById(analysis: ManifestAnalysis): string {\n const hexBoards = analysis.analyzedBoards.filter(\n (board): board is AnalyzedHexBoard => board.layout === \"hex\",\n );\n if (hexBoards.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${hexBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${renderHexBoardStateSchema(\n board,\n runtimeBoardId,\n )},`,\n ),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderSquareBoardStateSchemaById(analysis: ManifestAnalysis): string {\n const squareBoards = analysis.analyzedBoards.filter(\n (board): board is AnalyzedSquareBoard => board.layout === \"square\",\n );\n if (squareBoards.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${squareBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${renderSquareBoardStateSchema(\n board,\n runtimeBoardId,\n )},`,\n ),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderBoardLiteralHelpers(analysis: ManifestAnalysis): string {\n const boardIdsByLayout = renderReadonlyArrayRecord(analysis.boardIdsByLayout);\n const boardBaseIdsByLayout = renderReadonlyArrayRecord(\n analysis.boardBaseIdsByLayout,\n );\n const boardIdsByBaseId = renderReadonlyArrayRecord(analysis.boardIdsByBaseId);\n const boardBaseIdsByTemplateId = renderReadonlyArrayRecord(\n analysis.boardBaseIdsByTemplateId,\n );\n const boardLayoutById = renderStringRecord(analysis.boardLayoutById);\n const boardTemplateLayoutById = renderStringRecord(\n analysis.boardTemplateLayoutById,\n );\n const boardIdsByTypeId = renderReadonlyArrayRecord(analysis.boardIdsByTypeId);\n const spaceIdsByBoardId = renderReadonlyArrayRecord(\n analysis.spaceIdsByBoardId,\n );\n const spaceTypeIdByBoardId = renderJsonConst(\n sortedObject(analysis.spaceTypeIdByBoardId),\n );\n const spaceIdsByTypeId = renderReadonlyArrayRecord(analysis.spaceIdsByTypeId);\n const containerIdsByBoardId = renderReadonlyArrayRecord(\n analysis.containerIdsByBoardId,\n );\n const containerHostByBoardId = renderJsonConst(\n sortedObject(analysis.containerHostByBoardId),\n );\n const relationTypeIdsByBoardId = renderReadonlyArrayRecord(\n analysis.relationTypeIdsByBoardId,\n );\n const edgeIdsByTypeId = renderReadonlyArrayRecord(analysis.edgeIdsByTypeId);\n const edgeIdsByBoardIdAndTypeId = renderJsonConst(\n sortedObject(analysis.edgeIdsByBoardIdAndTypeId),\n );\n const vertexIdsByTypeId = renderReadonlyArrayRecord(\n analysis.vertexIdsByTypeId,\n );\n const vertexIdsByBoardIdAndTypeId = renderJsonConst(\n sortedObject(analysis.vertexIdsByBoardIdAndTypeId),\n );\n const authoredHexEdgesByBoardId = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n board.authoredEdges.map((edge) => {\n const renderedSite: {\n ref: HexEdgeRef;\n typeId?: string;\n label?: string;\n fields: Record<string, unknown>;\n } = {\n ref: cloneJson(edge.ref),\n fields: {\n ...materializeObjectSchemaDefaults(\n board.edgeFieldsSchema,\n analysis,\n ),\n ...(edge.fields ?? {}),\n },\n };\n if (edge.typeId !== null && edge.typeId !== undefined) {\n renderedSite.typeId = edge.typeId;\n }\n if (edge.label !== null && edge.label !== undefined) {\n renderedSite.label = edge.label;\n }\n return renderedSite;\n }),\n ]),\n ),\n ),\n );\n const authoredHexVerticesByBoardId = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n board.authoredVertices.map((vertex) => {\n const renderedSite: {\n ref: HexVertexRef;\n typeId?: string;\n label?: string;\n fields: Record<string, unknown>;\n } = {\n ref: cloneJson(vertex.ref),\n fields: {\n ...materializeObjectSchemaDefaults(\n board.vertexFieldsSchema,\n analysis,\n ),\n ...(vertex.fields ?? {}),\n },\n };\n if (vertex.typeId !== null && vertex.typeId !== undefined) {\n renderedSite.typeId = vertex.typeId;\n }\n if (vertex.label !== null && vertex.label !== undefined) {\n renderedSite.label = vertex.label;\n }\n return renderedSite;\n }),\n ]),\n ),\n ),\n );\n const authoredHexEdgeIdsByBoardIdAndRef = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n sortedObject(\n board.authoredEdges.map((edge) => [\n boardSpaceRefKey(edge.ref.spaces),\n edge.id,\n ]),\n ),\n ]),\n ),\n ),\n );\n const authoredHexVertexIdsByBoardIdAndRef = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n sortedObject(\n board.authoredVertices.map((vertex) => [\n boardSpaceRefKey(vertex.ref.spaces),\n vertex.id,\n ]),\n ),\n ]),\n ),\n ),\n );\n // `perPlayerBoardIdsByBaseIdAndPlayerIdLookup` has been retired. The old\n // static lookup keyed on the max-players roster at generate time, which is\n // incompatible with the PerPlayer model where the runtime roster decides\n // which seats exist. `boardRefForPlayer(baseId, playerId)` now produces a\n // `PerPlayerBoardRef` at runtime using the active session's seats.\n\n return `const boardIdsByLayoutLookup = ${boardIdsByLayout};\nconst boardBaseIdsByLayoutLookup = ${boardBaseIdsByLayout};\nconst boardIdsByBaseIdLookup = ${boardIdsByBaseId};\nconst boardBaseIdsByTemplateIdLookup = ${boardBaseIdsByTemplateId};\nconst boardLayoutByIdLookup = ${boardLayoutById};\nconst boardTemplateLayoutByIdLookup = ${boardTemplateLayoutById};\nconst boardIdsByTypeIdLookup = ${boardIdsByTypeId};\nconst spaceIdsByBoardIdLookup = ${spaceIdsByBoardId};\nconst spaceTypeIdByBoardIdLookup = ${spaceTypeIdByBoardId};\nconst spaceIdsByTypeIdLookup = ${spaceIdsByTypeId};\nconst containerIdsByBoardIdLookup = ${containerIdsByBoardId};\nconst containerHostByBoardIdLookup = ${containerHostByBoardId};\nconst relationTypeIdsByBoardIdLookup = ${relationTypeIdsByBoardId};\nconst edgeIdsByTypeIdLookup = ${edgeIdsByTypeId};\nconst edgeIdsByBoardIdAndTypeIdLookup = ${edgeIdsByBoardIdAndTypeId};\nconst vertexIdsByTypeIdLookup = ${vertexIdsByTypeId};\nconst vertexIdsByBoardIdAndTypeIdLookup = ${vertexIdsByBoardIdAndTypeId};\nconst authoredHexEdgesByBoardIdLookup = ${authoredHexEdgesByBoardId};\nconst authoredHexVerticesByBoardIdLookup = ${authoredHexVerticesByBoardId};\nconst authoredHexEdgeIdsByBoardIdAndRefLookup = ${authoredHexEdgeIdsByBoardIdAndRef};\nconst authoredHexVertexIdsByBoardIdAndRefLookup = ${authoredHexVertexIdsByBoardIdAndRef};\n\nfunction authoredHexRefKey(spaceIds: readonly string[]): string {\n return [...spaceIds]\n .sort((left, right) => left.localeCompare(right))\n .join(\"$$\");\n}\n\ntype BoardLookupIdValue<\n Lookup extends Record<string, Record<string, readonly string[]>>,\n Key extends keyof Lookup,\n> = Extract<Lookup[Key][keyof Lookup[Key]], readonly string[]>[number];\n\nfunction flattenBoardScopedIds<\n Lookup extends Record<string, Record<string, readonly string[]>>,\n Key extends keyof Lookup,\n>(lookup: Lookup, key: Key): ReadonlyArray<BoardLookupIdValue<Lookup, Key>> {\n return Object.values(lookup[key] ?? {}).flat() as ReadonlyArray<\n BoardLookupIdValue<Lookup, Key>\n >;\n}\n\nexport const boardHelpers = {\n boardIdsForLayout<\n LayoutValue extends keyof typeof boardIdsByLayoutLookup,\n >(layout: LayoutValue): (typeof boardIdsByLayoutLookup)[LayoutValue] {\n return boardIdsByLayoutLookup[layout];\n },\n boardBaseIdsForLayout<\n LayoutValue extends keyof typeof boardBaseIdsByLayoutLookup,\n >(layout: LayoutValue): (typeof boardBaseIdsByLayoutLookup)[LayoutValue] {\n return boardBaseIdsByLayoutLookup[layout];\n },\n boardIdsForBase<\n BoardBaseIdValue extends keyof typeof boardIdsByBaseIdLookup,\n >(\n boardBaseId: BoardBaseIdValue,\n ): (typeof boardIdsByBaseIdLookup)[BoardBaseIdValue] {\n return boardIdsByBaseIdLookup[boardBaseId];\n },\n boardBaseIdsForTemplate<\n TemplateIdValue extends keyof typeof boardBaseIdsByTemplateIdLookup,\n >(\n templateId: TemplateIdValue,\n ): (typeof boardBaseIdsByTemplateIdLookup)[TemplateIdValue] {\n return boardBaseIdsByTemplateIdLookup[templateId];\n },\n boardIdsForType<TypeIdValue extends keyof typeof boardIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof boardIdsByTypeIdLookup)[TypeIdValue] {\n return boardIdsByTypeIdLookup[typeId];\n },\n boardLayout<BoardIdValue extends keyof typeof boardLayoutByIdLookup>(\n boardId: BoardIdValue,\n ): (typeof boardLayoutByIdLookup)[BoardIdValue] {\n return boardLayoutByIdLookup[boardId];\n },\n boardTemplateLayout<\n TemplateIdValue extends keyof typeof boardTemplateLayoutByIdLookup,\n >(\n templateId: TemplateIdValue,\n ): (typeof boardTemplateLayoutByIdLookup)[TemplateIdValue] {\n return boardTemplateLayoutByIdLookup[templateId];\n },\n spaceIds<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof spaceIdsByBoardIdLookup)[BoardIdValue] {\n return spaceIdsByBoardIdLookup[boardId];\n },\n spaceRecord<\n BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n spaceId: (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<(typeof spaceIdsByBoardIdLookup)[BoardIdValue][number], Value> {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n if (!spaceIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(spaceIds, initial) as Record<\n (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isSpaceId<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number] {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n return spaceIds ? isTypedId(spaceIds, value) : false;\n },\n expectSpaceId<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number] {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n if (!spaceIds || !isTypedId(spaceIds, value)) {\n throw new Error(\n \\`Unknown space id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number];\n },\n spaceKinds<BoardIdValue extends keyof typeof spaceTypeIdByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof spaceTypeIdByBoardIdLookup)[BoardIdValue] {\n return spaceTypeIdByBoardIdLookup[boardId];\n },\n spaceIdsForType<TypeIdValue extends keyof typeof spaceIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof spaceIdsByTypeIdLookup)[TypeIdValue] {\n return spaceIdsByTypeIdLookup[typeId];\n },\n containerIds<BoardIdValue extends keyof typeof containerIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof containerIdsByBoardIdLookup)[BoardIdValue] {\n return containerIdsByBoardIdLookup[boardId];\n },\n containerRecord<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n containerId: (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<\n (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n > {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n if (!containerIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(containerIds, initial) as Record<\n (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isContainerId<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof containerIdsByBoardIdLookup)[BoardIdValue][number] {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n return containerIds ? isTypedId(containerIds, value) : false;\n },\n expectContainerId<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): (typeof containerIdsByBoardIdLookup)[BoardIdValue][number] {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n if (!containerIds || !isTypedId(containerIds, value)) {\n throw new Error(\n \\`Unknown container id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof containerIdsByBoardIdLookup)[BoardIdValue][number];\n },\n containerHost<\n BoardIdValue extends keyof typeof containerHostByBoardIdLookup,\n ContainerIdValue extends keyof (typeof containerHostByBoardIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n containerId: ContainerIdValue,\n ): (typeof containerHostByBoardIdLookup)[BoardIdValue][ContainerIdValue] {\n const containers = containerHostByBoardIdLookup[boardId];\n const containerHost = containers?.[containerId];\n if (!containerHost) {\n throw new Error(\n \\`Unknown container '\\${String(containerId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return containerHost as (typeof containerHostByBoardIdLookup)[BoardIdValue][ContainerIdValue];\n },\n relationTypeIds<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue] {\n return relationTypeIdsByBoardIdLookup[boardId];\n },\n relationTypeRecord<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n relationTypeId: (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<\n (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n > {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n if (!relationTypeIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(relationTypeIds, initial) as Record<\n (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isRelationTypeId<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number] {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n return relationTypeIds ? isTypedId(relationTypeIds, value) : false;\n },\n expectRelationTypeId<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number] {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n if (!relationTypeIds || !isTypedId(relationTypeIds, value)) {\n throw new Error(\n \\`Unknown relation type id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number];\n },\n authoredHexEdges<\n BoardIdValue extends keyof typeof authoredHexEdgesByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof authoredHexEdgesByBoardIdLookup)[BoardIdValue] {\n const authoredHexEdges = authoredHexEdgesByBoardIdLookup[boardId];\n if (!authoredHexEdges) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n return authoredHexEdges;\n },\n authoredHexVertices<\n BoardIdValue extends keyof typeof authoredHexVerticesByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof authoredHexVerticesByBoardIdLookup)[BoardIdValue] {\n const authoredHexVertices = authoredHexVerticesByBoardIdLookup[boardId];\n if (!authoredHexVertices) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n return authoredHexVertices;\n },\n resolveHexEdgeId<\n BoardIdValue extends keyof typeof authoredHexEdgeIdsByBoardIdAndRefLookup,\n >(\n boardId: BoardIdValue,\n ref: HexAuthoredEdgeRef<BoardIdValue>,\n ): HexEdgeState<BoardIdValue>[\"id\"] {\n const boardEdges = authoredHexEdgeIdsByBoardIdAndRefLookup[boardId];\n if (!boardEdges) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n const edgeRef = ref as { spaces: readonly string[] };\n const edgeId = (boardEdges as Record<string, HexEdgeState<BoardIdValue>[\"id\"]>)[\n authoredHexRefKey(edgeRef.spaces)\n ];\n if (!edgeId) {\n throw new Error(\n \\`Unknown authored hex edge ref '\\${edgeRef.spaces.join(\", \")}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return edgeId as HexEdgeState<BoardIdValue>[\"id\"];\n },\n resolveHexVertexId<\n BoardIdValue extends keyof typeof authoredHexVertexIdsByBoardIdAndRefLookup,\n >(\n boardId: BoardIdValue,\n ref: HexAuthoredVertexRef<BoardIdValue>,\n ): HexVertexState<BoardIdValue>[\"id\"] {\n const boardVertices = authoredHexVertexIdsByBoardIdAndRefLookup[boardId];\n if (!boardVertices) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n const vertexRef = ref as { spaces: readonly string[] };\n const vertexId = (\n boardVertices as Record<string, HexVertexState<BoardIdValue>[\"id\"]>\n )[authoredHexRefKey(vertexRef.spaces)];\n if (!vertexId) {\n throw new Error(\n \\`Unknown authored hex vertex ref '\\${vertexRef.spaces.join(\", \")}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return vertexId as HexVertexState<BoardIdValue>[\"id\"];\n },\n edgeIdsForType<TypeIdValue extends keyof typeof edgeIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof edgeIdsByTypeIdLookup)[TypeIdValue] {\n return edgeIdsByTypeIdLookup[typeId];\n },\n edgeRecord<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n edgeId: BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >,\n ) => Value),\n ): Record<\n BoardLookupIdValue<typeof edgeIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!edgeIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(edgeIds, initial) as Record<\n BoardLookupIdValue<typeof edgeIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n >;\n },\n isEdgeId<BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): value is BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n return edgeIds ? isTypedId(edgeIds, value) : false;\n },\n expectEdgeId<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!edgeIds || !isTypedId(edgeIds, value)) {\n throw new Error(\n \\`Unknown edge id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >;\n },\n edgeIds<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n TypeIdValue extends keyof (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n typeId: TypeIdValue,\n ): (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue] {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges?.[typeId];\n if (!edgeIds) {\n throw new Error(\n \\`Unknown edge type '\\${String(typeId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return edgeIds as (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue];\n },\n vertexIdsForType<TypeIdValue extends keyof typeof vertexIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof vertexIdsByTypeIdLookup)[TypeIdValue] {\n return vertexIdsByTypeIdLookup[typeId];\n },\n vertexRecord<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n vertexId: BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >,\n ) => Value),\n ): Record<\n BoardLookupIdValue<typeof vertexIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!vertexIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(vertexIds, initial) as Record<\n BoardLookupIdValue<typeof vertexIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n >;\n },\n isVertexId<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n return vertexIds ? isTypedId(vertexIds, value) : false;\n },\n expectVertexId<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!vertexIds || !isTypedId(vertexIds, value)) {\n throw new Error(\n \\`Unknown vertex id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >;\n },\n vertexIds<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n TypeIdValue extends keyof (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n typeId: TypeIdValue,\n ): (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue] {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices?.[typeId];\n if (!vertexIds) {\n throw new Error(\n \\`Unknown vertex type '\\${String(typeId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return vertexIds as (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue];\n },\n // Returns a \\`BoardRef\\` describing a per-player board scoped to the supplied\n // seat. The old \\`boardIdForPlayer\\` returned a concrete runtime-board-id\n // string, which encoded the \"one board per maxPlayers seat\" assumption in\n // static data. Under the PerPlayer model the runtime roster is not known at\n // generate time, so consumers deal with \\`BoardRef\\` and let the runtime\n // resolve the actual owner seat.\n boardRefForPlayer(\n boardBaseId: BoardBaseId,\n playerId: PlayerId,\n ): PerPlayerBoardRef<BoardBaseId, PlayerId> {\n return boardRef(boardBaseId, playerId) as PerPlayerBoardRef<\n BoardBaseId,\n PlayerId\n >;\n },\n sharedBoardRef(\n boardBaseId: BoardBaseId,\n ): SharedBoardRef<BoardBaseId> {\n return boardRef(boardBaseId) as SharedBoardRef<BoardBaseId>;\n },\n} as const;`;\n}\n\nfunction renderManifestContractSource(manifest: GameTopologyManifest): string {\n const analysis = analyzeManifest(manifest);\n const initialTableTemplate = materializeManifestTable({\n manifest,\n playerIds: analysis.playerIds,\n shuffleItems: <Value>(values: readonly Value[]) => [...values],\n });\n const initialTableBoards = (\n initialTableTemplate as {\n boards: {\n byId: unknown;\n hex: unknown;\n square: unknown;\n };\n }\n ).boards;\n const staticBoardsTemplate = {\n byId: initialTableBoards.byId,\n hex: initialTableBoards.hex,\n square: initialTableBoards.square,\n };\n const sharedZoneIds = analysis.sharedZones.map((zone) => zone.id).sort();\n const playerZoneIds = analysis.playerZones.map((zone) => zone.id).sort();\n const zoneVisibilityById = Object.fromEntries(\n Array.from(analysis.zoneVisibilityById.entries()).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n\n const emptySharedZonesTemplate = Object.fromEntries(\n sharedZoneIds.map((zoneId) => [zoneId, []]),\n );\n const defaultVisibilityTemplate = Object.fromEntries(\n analysis.cardIds.map((cardId) => [cardId, { faceUp: true }]),\n );\n const defaultOwnerTemplate = Object.fromEntries(\n analysis.cardIds.map((cardId) => [cardId, null]),\n );\n const cardIdsByCardSetId = new Map<string, string[]>();\n for (const cardId of analysis.cardIds) {\n const cardSetId = analysis.cardSetIdByCardId.get(cardId);\n if (!cardSetId) {\n continue;\n }\n const cardIds = cardIdsByCardSetId.get(cardSetId) ?? [];\n cardIds.push(cardId);\n cardIdsByCardSetId.set(cardSetId, cardIds);\n }\n const renderZoneCardIdArrayType = (cardSetIds: readonly string[]) =>\n `Array<${renderStringUnion(\n cardSetIds.flatMap(\n (cardSetId) => cardIdsByCardSetId.get(cardSetId) ?? [],\n ),\n )}>`;\n const sharedZoneCardIdEntries = sharedZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.sharedZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: ${renderZoneCardIdArrayType(allowedCardSetIds)};`;\n })\n .join(\"\\n\");\n const playerZoneCardIdEntries = playerZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.playerZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: PerPlayer<${renderZoneCardIdArrayType(allowedCardSetIds)}>;`;\n })\n .join(\"\\n\");\n\n const cardSetById = new Map(\n analysis.cardSets.map((cardSet) => [cardSet.id, cardSet] as const),\n );\n\n const perCardStateEntries = analysis.cardIds\n .map((cardId) => {\n const cardSetId = analysis.cardSetIdByCardId.get(cardId) ?? \"\";\n const cardType = analysis.cardTypeByCardId.get(cardId) ?? cardId;\n const cardSet = cardSetById.get(cardSetId);\n const propertiesType = cardSet\n ? cardPropertiesTypeName(cardSet, cardType)\n : cardSetId\n ? `${toPascalCase(cardSetId)}CardProperties`\n : \"RuntimeRecord\";\n return ` ${quote(cardId)}: CardStateRecord<${quote(cardId)}, ${quote(\n cardSetId,\n )}, ${quote(cardType)}, ${propertiesType}>;`;\n })\n .join(\"\\n\");\n const perPieceStateEntries = analysis.pieceIds\n .map((pieceId) => {\n const pieceTypeId = analysis.pieceTypeIdByPieceId.get(pieceId) ?? \"\";\n return ` ${quote(pieceId)}: PieceStateRecord<${quote(pieceId)}, ${quote(\n pieceTypeId,\n )}, ${\n pieceTypeId ? pieceFieldsTypeName(pieceTypeId) : \"RuntimeRecord\"\n }>;`;\n })\n .join(\"\\n\");\n const perDieStateEntries = analysis.dieIds\n .map((dieId) => {\n const dieTypeId = analysis.dieTypeIdByDieId.get(dieId) ?? \"\";\n return ` ${quote(dieId)}: DieStateRecord<${quote(dieId)}, ${quote(\n dieTypeId,\n )}, ${dieTypeId ? dieFieldsTypeName(dieTypeId) : \"RuntimeRecord\"}>;`;\n })\n .join(\"\\n\");\n const perBoardStateEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n if (board.layout === \"hex\") {\n return ` ${quote(runtimeBoardId)}: HexBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.edges.map((edge) => edge.id),\n )}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(\n board.board.id,\n )}>;`;\n }\n if (board.layout === \"square\") {\n return ` ${quote(runtimeBoardId)}: SquareBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${renderStringUnion(\n board.edges.map((edge) => edge.id),\n )}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(\n board.board.id,\n )}, ${boardContainerFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(\n board.board.id,\n )}>;`;\n }\n\n return ` ${quote(runtimeBoardId)}: GenericBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(\n board.board.id,\n )}, ${boardContainerFieldsTypeName(board.board.id)}>;`;\n }),\n )\n .join(\"\\n\");\n const perHexBoardStateEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: BoardStateById[${quote(\n runtimeBoardId,\n )}];`,\n ),\n )\n .join(\"\\n\");\n const perSquareBoardStateEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: BoardStateById[${quote(\n runtimeBoardId,\n )}];`,\n ),\n )\n .join(\"\\n\");\n\n return `/**\n * Generated file.\n * Do not edit directly.\n */\n\nimport { z } from \"zod\";\nimport {\n buildTypedRecord,\n expectTypedId,\n isTypedId,\n} from \"@dreamboard-games/sdk/types\";\nimport {\n asPlayerId,\n assumeManifestSchema,\n boardRef,\n boardRefKey,\n boardRefSchema,\n cloneManifestDefault,\n createManifestGameStateSchema,\n createManifestRuntimeSchema,\n createManifestStringLiteralSchema,\n dealToPlayerBoardContainer as createDealToPlayerBoardContainerStep,\n dealToPlayerZone as createDealToPlayerZoneStep,\n perPlayer,\n perPlayerEntries,\n perPlayerGet,\n perPlayerHas,\n perPlayerKeys,\n perPlayerSchema,\n markManifestScopedSchema,\n resolveManifestPlayerIds,\n seedSharedBoardContainer as createSeedSharedBoardContainerStep,\n seedSharedBoardSpace as createSeedSharedBoardSpaceStep,\n shuffle as createShuffleStep,\n type CardIdOfManifest,\n type DieIdOfManifest,\n type PieceIdOfManifest,\n type BoardRef,\n type PerPlayer,\n type PerPlayerBoardRef,\n type PlayerId,\n type ReducerManifestContract,\n type RuntimeCardData,\n type RuntimeCardVisibility,\n type RuntimeComponentLocation,\n type RuntimeDieData,\n type RuntimeHandVisibilityMode,\n type RuntimePieceData,\n type RuntimeRecord,\n type RuntimeTableRecord,\n type SetupBootstrapContainerRef,\n type SetupBootstrapDestinationRef,\n type SetupBootstrapPerPlayerContainerTemplateRef,\n type SetupBootstrapStep,\n type SetupProfileDefinition,\n type SharedBoardRef,\n type StaticBoards,\n} from \"@dreamboard-games/sdk/reducer\";\n\nconst unknownRecordSchema = assumeManifestSchema<RuntimeRecord>(\n z.record(z.string(), z.unknown()),\n);\n\nfunction resolveDefaultPlayerIds(\n playerIds: readonly string[] | undefined,\n): readonly PlayerId[] {\n return resolveManifestPlayerIds(\n literals.playerIds as unknown as readonly PlayerId[],\n playerIds,\n );\n}\n\nexport const literals = {\n // literals satisfy \\`ManifestLiterals<PlayerId, ...>\\`. The cast is safe\n // because the runtime values are the exact player-id strings the manifest\n // authored; branding is purely a type-level discipline.\n playerIds: ${renderConstArray(analysis.playerIds)} as unknown as readonly PlayerId[],\n phaseNames: [] as readonly string[],\n boardLayouts: [\"generic\", \"hex\", \"square\"] as const,\n setupOptionIds: ${renderConstArray(analysis.setupOptionIds)},\n setupProfileIds: ${renderConstArray(analysis.setupProfileIds)},\n cardSetIds: ${renderConstArray(analysis.cardSetIds)},\n cardTypes: ${renderConstArray(analysis.cardTypes)},\n cardIds: ${renderConstArray(analysis.cardIds)},\n deckIds: ${renderConstArray(sharedZoneIds)},\n handIds: ${renderConstArray(playerZoneIds)},\n sharedZoneIds: ${renderConstArray(sharedZoneIds)},\n playerZoneIds: ${renderConstArray(playerZoneIds)},\n zoneIds: ${renderConstArray(analysis.zoneIds)},\n resourceIds: ${renderConstArray(analysis.resourceIds)},\n resourcePresentationById: ${renderJsonConst(analysis.resourcePresentationById)},\n pieceTypeIds: ${renderConstArray(analysis.pieceTypeIds)},\n pieceIds: ${renderConstArray(analysis.pieceIds)},\n dieTypeIds: ${renderConstArray(analysis.dieTypeIds)},\n dieIds: ${renderConstArray(analysis.dieIds)},\n boardTemplateIds: ${renderConstArray(analysis.boardTemplateIds)},\n boardTypeIds: ${renderConstArray(analysis.boardTypeIds)},\n boardBaseIds: ${renderConstArray(analysis.boardBaseIds)},\n boardIds: ${renderConstArray(analysis.boardIds)},\n boardContainerIds: ${renderConstArray(analysis.boardContainerIds)},\n relationTypeIds: ${renderConstArray(analysis.relationTypeIds)},\n edgeIds: ${renderConstArray(analysis.edgeIds)},\n edgeTypeIds: ${renderConstArray(analysis.edgeTypeIds)},\n vertexIds: ${renderConstArray(analysis.vertexIds)},\n vertexTypeIds: ${renderConstArray(analysis.vertexTypeIds)},\n spaceIds: ${renderConstArray(analysis.spaceIds)},\n spaceTypeIds: ${renderConstArray(analysis.spaceTypeIds)},\n handVisibilityById: ${renderStringRecord(\n playerZoneIds.map(\n (zoneId) => [zoneId, zoneVisibilityById[zoneId] ?? \"ownerOnly\"] as const,\n ),\n )},\n zoneVisibilityById: ${renderStringRecord(analysis.zoneVisibilityById)},\n cardSetIdByCardId: ${renderStringRecord(analysis.cardSetIdByCardId)},\n cardTypeByCardId: ${renderStringRecord(analysis.cardTypeByCardId)},\n setupChoiceIdsByOptionId: ${renderReadonlyArrayRecord(\n analysis.setupChoiceIdsByOptionId,\n )},\n cardSetIdsBySharedZoneId: ${renderReadonlyArrayRecord(\n analysis.sharedZoneCardSetIds,\n )},\n sharedZoneIdsByCardSetId: ${renderReadonlyArrayRecord(\n analysis.sharedZoneIdsByCardSetId,\n )},\n homeSharedZoneIdsByCardType: ${renderReadonlyArrayRecord(\n analysis.homeSharedZoneIdsByCardType,\n )},\n homeSharedZoneIdByCardType: ${renderStringRecord(\n analysis.homeSharedZoneIdByCardType,\n )},\n cardSetIdsByPlayerZoneId: ${renderReadonlyArrayRecord(\n analysis.playerZoneCardSetIds,\n )},\n} as const;\n\n// PlayerId is an opaque brand imported from @dreamboard-games/sdk/reducer.\n// We intentionally do NOT enumerate the manifest's max-players roster here:\n// the runtime session may have fewer active seats than the manifest declares,\n// and requiring ingress to pick a literal from the max-players set reintroduces\n// the \"total-record\" assumption the refactor is meant to eliminate. Runtime\n// roster validation is done through perPlayerSchema(runtimePlayerIds, ...)\n// instead, which can be bound to the actual active roster.\nconst playerIdSchema = markManifestScopedSchema(\n z\n .string()\n .min(1)\n .transform((value) => asPlayerId(value)),\n);\nconst phaseNameSchema = markManifestScopedSchema(z.string());\nconst boardLayoutSchema = createManifestStringLiteralSchema(literals.boardLayouts);\nconst setupOptionIdSchema = createManifestStringLiteralSchema(literals.setupOptionIds);\nconst setupProfileIdSchema = createManifestStringLiteralSchema(\n literals.setupProfileIds,\n);\nconst cardSetIdSchema = createManifestStringLiteralSchema(literals.cardSetIds);\nconst cardTypeSchema = createManifestStringLiteralSchema(literals.cardTypes);\nconst cardIdSchema = createManifestStringLiteralSchema(literals.cardIds);\nconst deckIdSchema = createManifestStringLiteralSchema(literals.deckIds);\nconst handIdSchema = createManifestStringLiteralSchema(literals.handIds);\nconst sharedZoneIdSchema = createManifestStringLiteralSchema(literals.sharedZoneIds);\nconst playerZoneIdSchema = createManifestStringLiteralSchema(literals.playerZoneIds);\nconst zoneIdSchema = createManifestStringLiteralSchema(literals.zoneIds);\nconst resourceIdSchema = createManifestStringLiteralSchema(literals.resourceIds);\nconst pieceTypeIdSchema = createManifestStringLiteralSchema(literals.pieceTypeIds);\nconst pieceIdSchema = createManifestStringLiteralSchema(literals.pieceIds);\nconst dieTypeIdSchema = createManifestStringLiteralSchema(literals.dieTypeIds);\nconst dieIdSchema = createManifestStringLiteralSchema(literals.dieIds);\nconst boardTypeIdSchema = createManifestStringLiteralSchema(literals.boardTypeIds);\nconst boardBaseIdSchema = createManifestStringLiteralSchema(literals.boardBaseIds);\nconst boardIdSchema = createManifestStringLiteralSchema(literals.boardIds);\nconst boardContainerIdSchema = createManifestStringLiteralSchema(\n literals.boardContainerIds,\n);\nconst relationTypeIdSchema = createManifestStringLiteralSchema(literals.relationTypeIds);\nconst edgeIdSchema = createManifestStringLiteralSchema(literals.edgeIds);\nconst edgeTypeIdSchema = createManifestStringLiteralSchema(literals.edgeTypeIds);\nconst vertexIdSchema = createManifestStringLiteralSchema(literals.vertexIds);\nconst vertexTypeIdSchema = createManifestStringLiteralSchema(literals.vertexTypeIds);\nconst spaceIdSchema = createManifestStringLiteralSchema(literals.spaceIds);\nconst spaceTypeIdSchema = createManifestStringLiteralSchema(literals.spaceTypeIds);\n\nexport const ids = {\n playerId: playerIdSchema,\n phaseName: phaseNameSchema,\n boardLayout: boardLayoutSchema,\n setupOptionId: setupOptionIdSchema,\n setupProfileId: setupProfileIdSchema,\n cardSetId: cardSetIdSchema,\n cardType: cardTypeSchema,\n cardId: cardIdSchema as unknown as z.ZodType<CardId>,\n deckId: deckIdSchema as unknown as z.ZodType<DeckId>,\n handId: handIdSchema as unknown as z.ZodType<HandId>,\n sharedZoneId: sharedZoneIdSchema,\n playerZoneId: playerZoneIdSchema,\n zoneId: zoneIdSchema,\n resourceId: resourceIdSchema,\n pieceTypeId: pieceTypeIdSchema,\n pieceId: pieceIdSchema,\n dieTypeId: dieTypeIdSchema,\n dieId: dieIdSchema,\n boardTypeId: boardTypeIdSchema,\n boardBaseId: boardBaseIdSchema,\n boardId: boardIdSchema,\n boardContainerId: boardContainerIdSchema,\n relationTypeId: relationTypeIdSchema,\n edgeId: edgeIdSchema,\n edgeTypeId: edgeTypeIdSchema,\n vertexId: vertexIdSchema,\n vertexTypeId: vertexTypeIdSchema,\n spaceId: spaceIdSchema,\n spaceTypeId: spaceTypeIdSchema,\n} as const;\n\nexport type { PlayerId };\nexport type PhaseName = string;\nexport type BoardLayout = (typeof literals.boardLayouts)[number];\nexport type SetupOptionId = (typeof literals.setupOptionIds)[number];\nexport type SetupProfileId = (typeof literals.setupProfileIds)[number];\nexport type CardSetId = (typeof literals.cardSetIds)[number];\nexport type CardType = (typeof literals.cardTypes)[number];\nexport type CardId = (typeof literals.cardIds)[number];\nexport type DeckId = (typeof literals.deckIds)[number];\nexport type HandId = (typeof literals.handIds)[number];\nexport type SharedZoneId = (typeof literals.sharedZoneIds)[number];\nexport type PlayerZoneId = (typeof literals.playerZoneIds)[number];\nexport type ZoneId = (typeof literals.zoneIds)[number];\nexport type ResourceId = (typeof literals.resourceIds)[number];\nexport type PieceTypeId = (typeof literals.pieceTypeIds)[number];\nexport type PieceId = (typeof literals.pieceIds)[number];\nexport type DieTypeId = (typeof literals.dieTypeIds)[number];\nexport type DieId = (typeof literals.dieIds)[number];\nexport type BoardTypeId = (typeof literals.boardTypeIds)[number];\nexport type BoardBaseId = (typeof literals.boardBaseIds)[number];\nexport type BoardId = (typeof literals.boardIds)[number];\nexport type BoardContainerId = (typeof literals.boardContainerIds)[number];\nexport type RelationTypeId = (typeof literals.relationTypeIds)[number];\nexport type EdgeId = (typeof literals.edgeIds)[number];\nexport type EdgeTypeId = (typeof literals.edgeTypeIds)[number];\nexport type VertexId = (typeof literals.vertexIds)[number];\nexport type VertexTypeId = (typeof literals.vertexTypeIds)[number];\nexport type SpaceId = (typeof literals.spaceIds)[number];\nexport type SpaceTypeId = (typeof literals.spaceTypeIds)[number];\n\n${renderGeneratedIdHandles(analysis)}\n\n${renderGeneratedRecordsHelpers()}\n\n${renderGeneratedIdGuards()}\n\n// Historically this emitted PlayerRecord<T> = Record<PlayerId, T>, but that\n// type reified the \"total roster\" assumption (one entry per max-player). It has\n// been replaced throughout the generated contract with PerPlayer<T> from\n// @dreamboard-games/sdk/reducer, whose entries array matches the\n// actual runtime seat list.\nexport type SharedZoneRecord<T> = Record<SharedZoneId, T>;\nexport type PlayerZoneRecord<T> = Record<PlayerZoneId, PerPlayer<T>>;\nexport type ComponentId = CardId | PieceId | DieId;\nexport type ComponentIdsBySharedZoneId = {\n${sharedZoneIds.map((zoneId) => ` ${quote(zoneId)}: ComponentId[];`).join(\"\\n\")}\n};\nexport type ComponentIdsByPlayerZoneId = {\n${playerZoneIds.map((zoneId) => ` ${quote(zoneId)}: PerPlayer<ComponentId[]>;`).join(\"\\n\")}\n};\nexport type SetupOptionChoice = {\n id: string;\n label: string;\n description?: string | null;\n};\nexport type SetupOption = {\n id: SetupOptionId;\n name: string;\n description?: string | null;\n choices: readonly SetupOptionChoice[];\n};\nexport type SetupProfile = {\n id: SetupProfileId;\n name: string;\n description?: string | null;\n optionValues?: Partial<Record<SetupOptionId, string>> | null;\n};\nexport const setupOptionsById = ${renderJsonConst(analysis.setupOptionsById)};\nexport const setupChoiceIdsByOptionId = ${renderReadonlyArrayRecord(\n analysis.setupChoiceIdsByOptionId,\n )};\nexport const setupProfilesById = ${renderJsonConst(analysis.setupProfilesById)};\n\n${renderCardSetPropertySections(analysis.cardSets)}\n\n${renderTopologyFieldSections(analysis)}\n\n${renderBoardFieldMapTypes(analysis)}\n\nexport type CardProperties = ${\n analysis.cardSets.length > 0\n ? analysis.cardSets\n .map((cardSet) => `${toPascalCase(cardSet.id)}CardProperties`)\n .join(\" | \")\n : \"RuntimeRecord\"\n };\n\nexport type CardStateRecord<\n CardIdValue extends CardId = CardId,\n CardSetIdValue extends CardSetId = CardSetId,\n CardTypeValue extends CardType = CardType,\n Properties = RuntimeRecord,\n> = Omit<RuntimeCardData, \"id\" | \"cardSetId\" | \"cardType\" | \"properties\"> & {\n id: CardIdValue;\n cardSetId: CardSetIdValue;\n cardType: CardTypeValue;\n properties: Properties;\n};\n\nexport type CardStateById = ${\n perCardStateEntries.length > 0\n ? `{\\n${perCardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type PieceStateRecord<\n PieceIdValue extends PieceId = PieceId,\n PieceTypeIdValue extends PieceTypeId = PieceTypeId,\n Fields = RuntimeRecord,\n> = Omit<RuntimePieceData, \"id\" | \"pieceTypeId\" | \"properties\"> & {\n id: PieceIdValue;\n pieceTypeId: PieceTypeIdValue;\n properties: Fields;\n};\n\nexport type DieStateRecord<\n DieIdValue extends DieId = DieId,\n DieTypeIdValue extends DieTypeId = DieTypeId,\n Fields = RuntimeRecord,\n> = Omit<RuntimeDieData, \"id\" | \"dieTypeId\" | \"properties\"> & {\n id: DieIdValue;\n dieTypeId: DieTypeIdValue;\n properties: Fields;\n};\n\nexport type PieceStateById = ${\n perPieceStateEntries.length > 0\n ? `{\\n${perPieceStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type DieStateById = ${\n perDieStateEntries.length > 0\n ? `{\\n${perDieStateEntries}\\n}`\n : \"Record<string, never>\"\n };\nexport type CardIdsBySharedZoneId = {\n${sharedZoneCardIdEntries}\n};\nexport type CardIdsByPlayerZoneId = {\n${playerZoneCardIdEntries}\n};\nexport type CardIdsByDeckId = CardIdsBySharedZoneId;\n\nexport interface BoardSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> {\n id: SpaceIdValue;\n name?: string | null;\n typeId?: SpaceTypeId | null;\n fields: Fields;\n zoneId?: string | null;\n}\n\nexport interface BoardRelationStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> {\n id?: string | null;\n typeId: RelationTypeId;\n fromSpaceId: SpaceIdValue;\n toSpaceId: SpaceIdValue;\n directed: boolean;\n fields: Fields;\n}\n\nexport interface BoardContainerStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n Fields = RuntimeRecord,\n> {\n id: ContainerIdValue;\n name: string;\n host:\n | { type: \"board\" }\n | {\n type: \"space\";\n spaceId: SpaceIdValue;\n };\n allowedCardSetIds?: readonly CardSetId[];\n zoneId: string;\n fields: Fields;\n}\n\nexport interface BoardStateRecordBase<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n> {\n id: BoardIdValue;\n baseId: BoardBaseId;\n typeId?: BoardTypeId | null;\n scope: \"shared\" | \"perPlayer\";\n playerId?: PlayerId | null;\n templateId?: string | null;\n fields: BoardFields;\n}\n\nexport interface GenericBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n ContainerIdValue,\n BoardFields,\n SpaceFields,\n RelationFields,\n ContainerFields\n > {\n layout: \"generic\";\n spaces: Record<\n SpaceIdValue,\n BoardSpaceStateRecord<SpaceIdValue, SpaceFields>\n >;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<\n ContainerIdValue,\n BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>\n >;\n}\n\nexport interface HexSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n q: number;\n r: number;\n}\n\nexport interface SquareSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n row: number;\n col: number;\n}\n\nexport interface TiledEdgeStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n Fields = RuntimeRecord,\n> {\n id: EdgeIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: EdgeTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\n\nexport interface TiledVertexStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n VertexIdValue extends VertexId = VertexId,\n Fields = RuntimeRecord,\n> {\n id: VertexIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: VertexTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\n\nexport type HexEdgeStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n Fields = RuntimeRecord,\n> = TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, Fields>;\n\nexport type HexVertexStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n VertexIdValue extends VertexId = VertexId,\n Fields = RuntimeRecord,\n> = TiledVertexStateRecord<SpaceIdValue, VertexIdValue, Fields>;\n\nexport interface HexBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n VertexIdValue extends VertexId = VertexId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n EdgeFields = RuntimeRecord,\n VertexFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n never,\n BoardFields,\n SpaceFields,\n RuntimeRecord,\n RuntimeRecord\n > {\n layout: \"hex\";\n spaces: Record<SpaceIdValue, HexSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RuntimeRecord>>;\n containers: Record<never, never>;\n orientation: \"pointy-top\" | \"flat-top\";\n edges: Array<HexEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<\n HexVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>\n >;\n}\n\nexport interface SquareBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n EdgeIdValue extends EdgeId = EdgeId,\n VertexIdValue extends VertexId = VertexId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n EdgeFields = RuntimeRecord,\n VertexFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n ContainerIdValue,\n BoardFields,\n SpaceFields,\n RelationFields,\n ContainerFields\n > {\n layout: \"square\";\n spaces: Record<\n SpaceIdValue,\n SquareSpaceStateRecord<SpaceIdValue, SpaceFields>\n >;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<\n ContainerIdValue,\n BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>\n >;\n edges: Array<TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<\n TiledVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>\n >;\n}\n\nexport type TiledBoardStateRecord =\n | HexBoardStateRecord\n | SquareBoardStateRecord;\n\nexport type BoardStateById = {\n${perBoardStateEntries}\n};\n\nexport type HexBoardStateById = ${\n perHexBoardStateEntries.length > 0\n ? `{\\n${perHexBoardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type SquareBoardStateById = ${\n perSquareBoardStateEntries.length > 0\n ? `{\\n${perSquareBoardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\ntype ManifestRecordValue<T> = T[keyof T];\ntype ManifestArrayElement<T> =\n T extends readonly (infer Item)[]\n ? Item\n : T extends (infer Item)[]\n ? Item\n : never;\n\nexport type BoardState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardStateById ? BoardStateById[BoardIdValue] : never;\n\nexport type BoardFields<BoardIdValue extends BoardId = BoardId> =\n BoardState<BoardIdValue> extends { fields: infer Fields } ? Fields : never;\n\nexport type BoardSpaceStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestRecordValue<\n BoardStateById[BoardIdValue][\"spaces\"]\n >;\n};\n\nexport type BoardSpaceState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardSpaceStateByBoardId\n ? BoardSpaceStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardSpaceFields<BoardIdValue extends BoardId = BoardId> =\n BoardSpaceState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardRelationStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestArrayElement<\n BoardStateById[BoardIdValue][\"relations\"]\n >;\n};\n\nexport type BoardRelationState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardRelationStateByBoardId\n ? BoardRelationStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardRelationFields<BoardIdValue extends BoardId = BoardId> =\n BoardRelationState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardContainerStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestRecordValue<\n BoardStateById[BoardIdValue][\"containers\"]\n >;\n};\n\nexport type BoardContainerState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardContainerStateByBoardId\n ? BoardContainerStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardContainerFields<BoardIdValue extends BoardId = BoardId> =\n BoardContainerState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\ntype HexAuthoredEdgesByBoardId = typeof authoredHexEdgesByBoardIdLookup;\ntype HexAuthoredVerticesByBoardId = typeof authoredHexVerticesByBoardIdLookup;\n\nexport type HexAuthoredEdgeState<\n BoardIdValue extends keyof HexAuthoredEdgesByBoardId = keyof HexAuthoredEdgesByBoardId,\n> = BoardIdValue extends keyof HexAuthoredEdgesByBoardId\n ? ManifestArrayElement<HexAuthoredEdgesByBoardId[BoardIdValue]>\n : never;\n\nexport type HexAuthoredEdgeRef<\n BoardIdValue extends keyof HexAuthoredEdgesByBoardId = keyof HexAuthoredEdgesByBoardId,\n> = HexAuthoredEdgeState<BoardIdValue> extends { ref: infer Ref } ? Ref : never;\n\nexport type HexAuthoredVertexState<\n BoardIdValue extends keyof HexAuthoredVerticesByBoardId = keyof HexAuthoredVerticesByBoardId,\n> = BoardIdValue extends keyof HexAuthoredVerticesByBoardId\n ? ManifestArrayElement<HexAuthoredVerticesByBoardId[BoardIdValue]>\n : never;\n\nexport type HexAuthoredVertexRef<\n BoardIdValue extends keyof HexAuthoredVerticesByBoardId = keyof HexAuthoredVerticesByBoardId,\n> = HexAuthoredVertexState<BoardIdValue> extends { ref: infer Ref }\n ? Ref\n : never;\n\nexport type HexEdgeState<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = BoardIdValue extends keyof HexBoardStateById\n ? ManifestArrayElement<HexBoardStateById[BoardIdValue][\"edges\"]>\n : never;\n\nexport type HexEdgeFields<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = HexEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type HexVertexState<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = BoardIdValue extends keyof HexBoardStateById\n ? ManifestArrayElement<HexBoardStateById[BoardIdValue][\"vertices\"]>\n : never;\n\nexport type HexVertexFields<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = HexVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type SquareEdgeState<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = BoardIdValue extends keyof SquareBoardStateById\n ? ManifestArrayElement<SquareBoardStateById[BoardIdValue][\"edges\"]>\n : never;\n\nexport type SquareEdgeFields<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = SquareEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type SquareVertexState<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = BoardIdValue extends keyof SquareBoardStateById\n ? ManifestArrayElement<SquareBoardStateById[BoardIdValue][\"vertices\"]>\n : never;\n\nexport type SquareVertexFields<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = SquareVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type TiledBoardId = keyof HexBoardStateById | keyof SquareBoardStateById;\n\nexport type TiledEdgeState<BoardIdValue extends TiledBoardId = TiledBoardId> =\n BoardIdValue extends keyof HexBoardStateById\n ? HexEdgeState<BoardIdValue>\n : BoardIdValue extends keyof SquareBoardStateById\n ? SquareEdgeState<BoardIdValue>\n : never;\n\nexport type TiledEdgeFields<BoardIdValue extends TiledBoardId = TiledBoardId> =\n TiledEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type TiledVertexState<\n BoardIdValue extends TiledBoardId = TiledBoardId,\n> = BoardIdValue extends keyof HexBoardStateById\n ? HexVertexState<BoardIdValue>\n : BoardIdValue extends keyof SquareBoardStateById\n ? SquareVertexState<BoardIdValue>\n : never;\n\nexport type TiledVertexFields<\n BoardIdValue extends TiledBoardId = TiledBoardId,\n> = TiledVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardStateRecord = ${\n analysis.boardIds.length > 0 ? \"BoardStateById[BoardId]\" : \"never\"\n };\n\nexport type TableState = RuntimeTableRecord & {\n playerOrder: PlayerId[];\n zones: RuntimeTableRecord[\"zones\"] & {\n visibility: Record<ZoneId, RuntimeHandVisibilityMode>;\n cardSetIdsByZoneId?: Record<ZoneId, readonly CardSetId[]>;\n };\n decks: Record<SharedZoneId, CardId[]>;\n hands: Record<PlayerZoneId, PerPlayer<CardId[]>>;\n handVisibility: Record<PlayerZoneId, RuntimeHandVisibilityMode>;\n cards: CardStateById;\n pieces: Record<PieceId, RuntimePieceData>;\n componentLocations: Record<ComponentId, RuntimeComponentLocation>;\n ownerOfCard: Record<CardId, PlayerId | null>;\n visibility: Record<CardId, RuntimeCardVisibility>;\n resources: PerPlayer<Record<ResourceId, number>>;\n boards: RuntimeTableRecord[\"boards\"];\n dice: Record<DieId, RuntimeDieData>;\n};\n\nconst sharedZoneSchema = z.record(sharedZoneIdSchema, z.array(z.string()));\n// PerPlayer<Array<string>> wire shape only: { __perPlayer: true, entries: [[playerId, value], ...] }.\nconst playerZoneSchema = z.record(\n playerZoneIdSchema,\n perPlayerSchema(z.array(z.string())),\n);\nconst cardStateSchema = z.object({\n componentType: z.string().optional(),\n id: ids.cardId,\n cardSetId: ids.cardSetId,\n cardType: ids.cardType,\n name: z.string().optional(),\n text: z.string().optional(),\n properties: unknownRecordSchema,\n});\n${renderCardPropertiesSchemaByCardSetId(analysis.cardSets)}\n${renderCardStateSchemaFactory(analysis)}\nconst cardStateByIdSchema = ${renderCardStateSchemaById(analysis)};\nconst pieceStateByIdSchema = ${renderPieceStateSchemaById(analysis)};\nconst dieStateByIdSchema = ${renderDieStateSchemaById(analysis)};\nconst boardStateByIdSchema = ${renderBoardStateSchemaById(analysis)};\nconst hexBoardStateByIdSchema = ${renderHexBoardStateSchemaById(analysis)};\nconst squareBoardStateByIdSchema = ${renderSquareBoardStateSchemaById(\n analysis,\n )};\nconst boardSpaceTypeIdSchema = ids.spaceTypeId.nullable().optional();\nconst boardSpaceStateSchema = z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: boardSpaceTypeIdSchema,\n fields: unknownRecordSchema,\n zoneId: z.string().nullable().optional(),\n});\nconst hexSpaceStateSchema = boardSpaceStateSchema.extend({\n q: z.number().int(),\n r: z.number().int(),\n});\nconst squareSpaceStateSchema = boardSpaceStateSchema.extend({\n row: z.number().int(),\n col: z.number().int(),\n});\nconst boardRelationStateSchema = z.object({\n id: z.string().nullable().optional(),\n typeId: ids.relationTypeId,\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: unknownRecordSchema,\n});\nconst boardContainerStateSchema = z.object({\n id: ids.boardContainerId,\n name: z.string(),\n host: z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"board\") }),\n z.object({ type: z.literal(\"space\"), spaceId: ids.spaceId }),\n ]),\n allowedCardSetIds: z.array(ids.cardSetId).optional(),\n zoneId: z.string(),\n fields: unknownRecordSchema,\n});\nconst runtimeGenericBoardStateSchema = z.object({\n id: ids.boardId,\n baseId: ids.boardBaseId,\n layout: z.literal(\"generic\"),\n typeId: ids.boardTypeId.nullable().optional(),\n scope: z.enum([\"shared\", \"perPlayer\"]),\n playerId: ids.playerId.nullable().optional(),\n templateId: z.string().nullable().optional(),\n fields: unknownRecordSchema,\n // T220: per-board state.spaces is loose-keyed by string. See the\n // codegen-template comment in renderGenericBoardStateSchema for\n // the rationale; the wire shape is unchanged (additionalProperties\n // JSON), and the inner id field narrows at parse time.\n spaces: z.record(z.string(), boardSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.record(ids.boardContainerId, boardContainerStateSchema),\n});\nconst hexEdgeStateSchema = z.object({\n id: ids.edgeId,\n spaceIds: z.array(ids.spaceId).min(1).max(2),\n typeId: ids.edgeTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n});\nconst hexVertexStateSchema = z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(3),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n});\nconst squareVertexStateSchema = z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(4),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n});\nconst runtimeHexBoardStateSchema = runtimeGenericBoardStateSchema.extend({\n layout: z.literal(\"hex\"),\n // T220: loose-keyed by string — see comment above.\n spaces: z.record(z.string(), hexSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.object({}),\n orientation: z.enum([\"pointy-top\", \"flat-top\"]),\n edges: z.array(hexEdgeStateSchema),\n vertices: z.array(hexVertexStateSchema),\n});\nconst runtimeSquareBoardStateSchema = runtimeGenericBoardStateSchema.extend({\n layout: z.literal(\"square\"),\n // T220: loose-keyed by string — see comment above.\n spaces: z.record(z.string(), squareSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.record(ids.boardContainerId, boardContainerStateSchema),\n edges: z.array(hexEdgeStateSchema),\n vertices: z.array(squareVertexStateSchema),\n});\nconst runtimeBoardStateSchema = z.union([\n runtimeGenericBoardStateSchema,\n runtimeHexBoardStateSchema,\n runtimeSquareBoardStateSchema,\n]);\nconst rawTableSchema = z.object({\n playerOrder: z.array(ids.playerId),\n zones: z.object({\n shared: sharedZoneSchema,\n perPlayer: playerZoneSchema,\n visibility: z.record(zoneIdSchema, z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"])),\n cardSetIdsByZoneId: z.record(zoneIdSchema, z.array(ids.cardSetId)).optional(),\n }),\n decks: sharedZoneSchema,\n hands: playerZoneSchema,\n handVisibility: z.record(\n playerZoneIdSchema,\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: cardStateByIdSchema,\n pieces: pieceStateByIdSchema,\n componentLocations: z.record(\n z.string(),\n z.union([\n z.object({ type: z.literal(\"Detached\") }),\n z.object({\n type: z.literal(\"InDeck\"),\n deckId: ids.deckId,\n playedBy: ids.playerId.nullable(),\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InHand\"),\n handId: ids.handId,\n playerId: ids.playerId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: ids.playerId.nullable().optional(),\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnSpace\"),\n boardId: ids.boardId,\n spaceId: ids.spaceId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InContainer\"),\n boardId: ids.boardId,\n containerId: ids.boardContainerId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnEdge\"),\n boardId: ids.boardId,\n edgeId: ids.edgeId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnVertex\"),\n boardId: ids.boardId,\n vertexId: ids.vertexId,\n position: z.number().int().nullable().optional(),\n }),\n ${renderStrictSlotLocationSchema(analysis.strictSlotHosts)},\n ]),\n ),\n ownerOfCard: z.record(ids.cardId, ids.playerId.nullable()),\n visibility: z.record(\n ids.cardId,\n z.object({\n faceUp: z.boolean(),\n visibleTo: z.array(ids.playerId).nullable().optional(),\n }),\n ),\n resources: perPlayerSchema(z.record(ids.resourceId, z.number().int())),\n boards: z.object({\n byId: boardStateByIdSchema,\n hex: hexBoardStateByIdSchema,\n square: squareBoardStateByIdSchema,\n }),\n dice: dieStateByIdSchema,\n});\n\nexport const tableSchema = assumeManifestSchema<TableState>(rawTableSchema);\n\nexport const runtimeSchema = createManifestRuntimeSchema({\n phaseNameSchema: z.string(),\n playerIdSchema: ids.playerId,\n setupProfileIdSchema: ids.setupProfileId,\n});\n\n// Produces an empty PerPlayer<CardId[]> for every player zone. The entries\n// array is seeded from the resolved runtime roster so the generated default\n// never creates a record for a player the session does not have.\nfunction buildPerPlayerCardIds(\n playerIds: readonly PlayerId[],\n): CardIdsByPlayerZoneId {\n return Object.fromEntries(\n literals.playerZoneIds.map((zoneId) => [\n zoneId,\n perPlayer(playerIds, () => [] as CardId[]),\n ]),\n ) as CardIdsByPlayerZoneId;\n}\n\nfunction buildPlayerResources(\n playerIds: readonly PlayerId[],\n): PerPlayer<Record<ResourceId, number>> {\n return perPlayer(playerIds, () =>\n Object.fromEntries(\n literals.resourceIds.map((resourceId) => [resourceId, 0]),\n ) as Record<ResourceId, number>,\n );\n}\n\nexport const defaults = {\n zones: (playerIds?: readonly string[]) => ({\n shared: cloneManifestDefault(${JSON.stringify(emptySharedZonesTemplate)}),\n perPlayer: buildPerPlayerCardIds(resolveDefaultPlayerIds(playerIds)),\n visibility: cloneManifestDefault(${JSON.stringify(zoneVisibilityById)}),\n cardSetIdsByZoneId: cloneManifestDefault(${JSON.stringify(\n Object.fromEntries(\n Array.from(analysis.zoneCardSetIdsById.entries()).sort(\n ([left], [right]) => left.localeCompare(right),\n ),\n ),\n )}),\n }) as TableState[\"zones\"],\n decks: () => cloneManifestDefault(${JSON.stringify(emptySharedZonesTemplate)}) as TableState[\"decks\"],\n hands: (playerIds?: readonly string[]) =>\n buildPerPlayerCardIds(resolveDefaultPlayerIds(playerIds)) as TableState[\"hands\"],\n handVisibility: () => cloneManifestDefault(${JSON.stringify(\n Object.fromEntries(\n playerZoneIds.map((zoneId) => [\n zoneId,\n zoneVisibilityById[zoneId] ?? \"ownerOnly\",\n ]),\n ),\n )}) as TableState[\"handVisibility\"],\n ownerOfCard: () => cloneManifestDefault(${JSON.stringify(defaultOwnerTemplate)}) as TableState[\"ownerOfCard\"],\n visibility: () => cloneManifestDefault(${JSON.stringify(defaultVisibilityTemplate)}) as TableState[\"visibility\"],\n resources: (playerIds?: readonly string[]) =>\n buildPlayerResources(resolveDefaultPlayerIds(playerIds)),\n} as const;\n\nexport const staticBoards = ${renderJsonConst(staticBoardsTemplate)};\n\nconst baseInitialTable = ${renderJsonConst(initialTableTemplate)} as unknown as TableState;\nconst baseDeckCardsByZoneId: Record<SharedZoneId, readonly CardId[]> = ${renderJsonConst(\n Object.fromEntries(\n sharedZoneIds.map((zoneId) => [\n zoneId,\n (\n initialTableTemplate as {\n decks: Record<string, readonly string[]>;\n }\n ).decks[zoneId] ?? [],\n ]),\n ),\n )};\n\nexport function createInitialTable(options: {\n playerIds?: readonly string[];\n shuffleItems?: <Value>(values: readonly Value[]) => Value[];\n} = {}): TableState {\n const resolvedPlayerIds = resolveDefaultPlayerIds(options.playerIds);\n const shuffleItems =\n options.shuffleItems ?? (<Value>(values: readonly Value[]) => [...values]);\n const table = cloneManifestDefault(baseInitialTable) as TableState;\n table.playerOrder = [...resolvedPlayerIds];\n table.zones = defaults.zones(resolvedPlayerIds);\n table.decks = defaults.decks();\n table.hands = defaults.hands(resolvedPlayerIds);\n table.resources = defaults.resources(resolvedPlayerIds);\n const componentLocations = cloneManifestDefault(\n baseInitialTable.componentLocations,\n ) as TableState[\"componentLocations\"];\n\n for (const [zoneId, baseDeckCardIds] of Object.entries(\n baseDeckCardsByZoneId,\n ) as Array<[SharedZoneId, readonly CardId[]]>) {\n const shuffled = shuffleItems(baseDeckCardIds);\n (table.decks as Record<string, CardId[]>)[zoneId] = [...shuffled];\n (table.zones.shared as Record<string, CardId[]>)[zoneId] = [...shuffled];\n shuffled.forEach((componentId, position) => {\n const location = componentLocations[componentId];\n if (!location || location.type !== \"InDeck\") {\n return;\n }\n componentLocations[componentId] = {\n ...location,\n position,\n };\n });\n }\n\n table.componentLocations = componentLocations;\n return tableSchema.parse(table);\n}\n\nexport const schemas = {\n table: tableSchema,\n runtime: runtimeSchema,\n} as const;\n\nexport function createGameStateSchema<\n PhaseNameSchema extends z.ZodType<unknown>,\n PublicSchema extends z.ZodType<unknown>,\n PrivateSchema extends z.ZodType<unknown>,\n HiddenSchema extends z.ZodType<unknown>,\n PhasesSchema extends z.ZodType<unknown>,\n>({\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n}: {\n phaseNameSchema: PhaseNameSchema;\n publicSchema: PublicSchema;\n privateSchema: PrivateSchema;\n hiddenSchema: HiddenSchema;\n phasesSchema: PhasesSchema;\n}) {\n return createManifestGameStateSchema({\n tableSchema,\n playerIdSchema: ids.playerId,\n setupProfileIdSchema: ids.setupProfileId,\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n });\n}\n\nexport const manifestContract: ReducerManifestContract<\n RuntimeTableRecord,\n string,\n PlayerId,\n DeckId,\n HandId,\n CardId\n> = {\n literals,\n ids,\n defaults,\n staticBoards: staticBoards as unknown as StaticBoards<TableState>,\n setupOptionsById,\n setupChoiceIdsByOptionId,\n setupProfilesById,\n tableSchema,\n runtimeSchema,\n createGameStateSchema,\n};\n\n${renderBoardLiteralHelpers(analysis)}\n\nexport type SetupProfilesDefinition = Record<\n SetupProfileId,\n SetupProfileDefinition<string, typeof manifestContract>\n>;\n\nexport function setupProfiles<const Profiles extends SetupProfilesDefinition>(\n profiles: Profiles,\n): Profiles {\n return profiles;\n}\n\nexport function shuffle(\n container: SetupBootstrapContainerRef<typeof manifestContract>,\n): SetupBootstrapStep<typeof manifestContract> {\n return createShuffleStep<typeof manifestContract>(container);\n}\n\nexport function dealToPlayerZone(options: {\n from: Extract<\n SetupBootstrapContainerRef<typeof manifestContract>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n zoneId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerZone\" }\n >[\"zoneId\"];\n count: number;\n playerIds?: readonly PlayerId[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createDealToPlayerZoneStep<typeof manifestContract>(options);\n}\n\nexport function dealToPlayerBoardContainer(options: {\n from: Extract<\n SetupBootstrapContainerRef<typeof manifestContract>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n boardId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerBoardContainer\" }\n >[\"containerId\"];\n count: number;\n playerIds?: readonly PlayerId[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createDealToPlayerBoardContainerStep<typeof manifestContract>(options);\n}\n\nexport function seedSharedBoardContainer(options: {\n from: SetupBootstrapContainerRef<typeof manifestContract>;\n boardId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardContainer\" }\n >[\"containerId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<typeof manifestContract>\n | PieceIdOfManifest<typeof manifestContract>\n | DieIdOfManifest<typeof manifestContract>\n )[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createSeedSharedBoardContainerStep<typeof manifestContract>(options);\n}\n\nexport function seedSharedBoardSpace(options: {\n from: SetupBootstrapContainerRef<typeof manifestContract>;\n boardId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardSpace\" }\n >[\"boardId\"];\n spaceId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardSpace\" }\n >[\"spaceId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<typeof manifestContract>\n | PieceIdOfManifest<typeof manifestContract>\n | DieIdOfManifest<typeof manifestContract>\n )[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createSeedSharedBoardSpaceStep<typeof manifestContract>(options);\n}\n\nexport default manifestContract;\n`;\n}\n\nexport function generateManifestContractSource(\n manifest: GameTopologyManifest,\n): string {\n return renderManifestContractSource(manifest);\n}\n\nexport type GeneratedManifestContractSources = {\n \"shared/manifest-literals.ts\": string;\n \"shared/manifest-types.ts\": string;\n \"shared/manifest-runtime.ts\": string;\n \"shared/manifest-contract.ts\": string;\n};\n\nconst generatedFileBanner = `/**\n * Generated file.\n * Do not edit directly.\n */`;\n\nfunction extractGeneratedLiteralsBlock(source: string): string {\n const startMarker = \"export const literals = {\";\n const endMarker =\n \"\\n\\n// PlayerId is an opaque brand imported from @dreamboard-games/sdk/reducer.\";\n const start = source.indexOf(startMarker);\n const end = source.indexOf(endMarker, start);\n\n if (start === -1 || end === -1) {\n throw new Error(\"Unable to locate generated manifest literals block.\");\n }\n\n return source.slice(start, end).trim();\n}\n\nfunction renderSplitLiteralsBlock(legacySource: string): string {\n return extractGeneratedLiteralsBlock(legacySource).replace(\n / \\/\\/ literals satisfy `ManifestLiterals<PlayerId, \\.\\.\\.>`\\. The cast is safe\\n \\/\\/ because the runtime values are the exact player-id strings the manifest\\n \\/\\/ authored; branding is purely a type-level discipline\\.\\n playerIds: ([\\s\\S]*?) as unknown as readonly PlayerId\\[],\\n phaseNames:/,\n \" playerIds: $1,\\n phaseNames:\",\n );\n}\n\nfunction renderManifestLiteralsSource(legacySource: string): string {\n return `${generatedFileBanner}\n\n${renderSplitLiteralsBlock(legacySource)}\n`;\n}\n\nfunction renderManifestRuntimeSource(legacySource: string): string {\n const literalsBlock = extractGeneratedLiteralsBlock(legacySource);\n const withoutLiterals = legacySource.replace(\n literalsBlock,\n \"export { literals };\",\n );\n return withoutLiterals\n .replace(generatedFileBanner, `${generatedFileBanner}\\n// @ts-nocheck`)\n .replace(\n `} from \"@dreamboard-games/sdk/reducer\";\\n\\nconst unknownRecordSchema`,\n `} from \"@dreamboard-games/sdk/reducer\";\\nimport { literals } from \"./manifest-literals\";\\nimport type { PlayerId as PublicPlayerId, TableState as PublicTableState } from \"./manifest-types\";\\n\\nconst unknownRecordSchema`,\n )\n .replaceAll(\n \"literals.playerIds as unknown as readonly PlayerId[]\",\n \"literals.playerIds\",\n )\n .replaceAll(\n \"cardId: cardIdSchema as unknown as z.ZodType<CardId>,\",\n \"cardId: assumeManifestSchema<CardId>(cardIdSchema),\",\n )\n .replaceAll(\n \"deckId: deckIdSchema as unknown as z.ZodType<DeckId>,\",\n \"deckId: assumeManifestSchema<DeckId>(deckIdSchema),\",\n )\n .replaceAll(\n \"handId: handIdSchema as unknown as z.ZodType<HandId>,\",\n \"handId: assumeManifestSchema<HandId>(handIdSchema),\",\n )\n .replace(\n /export const staticBoards = ([\\s\\S]*?) as const;\\n\\nconst baseInitialTable = /,\n \"export const staticBoards = $1 as const satisfies StaticBoards<PublicTableState>;\\n\\nconst baseInitialTable = \",\n )\n .replace(\n /const baseInitialTable = ([\\s\\S]*?) as const as unknown as TableState;\\nconst baseDeckCardsByZoneId:/,\n \"const baseInitialTable = cloneManifestDefault<PublicTableState>($1);\\nconst baseDeckCardsByZoneId:\",\n )\n .replace(\n \"staticBoards: staticBoards as unknown as StaticBoards<TableState>,\",\n \"staticBoards,\",\n )\n .replace(\n `export const manifestContract: ReducerManifestContract<\\n RuntimeTableRecord,`,\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,`,\n )\n .replace(\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,\\n string,\\n PlayerId,`,\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,\\n string,\\n PublicPlayerId,`,\n )\n .replace(\n `const playerIdSchema = markManifestScopedSchema(\\n z\\n .string()\\n .min(1)\\n .transform((value) => asPlayerId(value)),\\n);`,\n `const playerIdSchema = assumeManifestSchema<PublicPlayerId>(\\n markManifestScopedSchema(\\n z\\n .string()\\n .min(1)\\n .transform((value) => asPlayerId(value)),\\n ),\\n);`,\n );\n}\n\nfunction renderCardSetTypeSections(analysis: ManifestAnalysis): string {\n return analysis.cardSets\n .map((cardSet) => {\n const cardIdType = `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`;\n\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n const variantBlocks = Object.keys(cardSet.cardSchema.variants).map(\n (cardType) =>\n `export type ${cardPropertiesTypeName(cardSet, cardType)} = ${renderTypeForObjectSchema(\n mergeSharedCardProperties(\n cardSet.cardSchema as CardPropertySchemaVariants,\n cardType,\n ),\n )};`,\n );\n const variantTypeNames = Object.keys(cardSet.cardSchema.variants).map(\n (cardType) => cardPropertiesTypeName(cardSet, cardType),\n );\n return renderBlocks([\n ...variantBlocks,\n `export type ${toPascalCase(cardSet.id)}CardProperties = ${variantTypeNames.join(\" | \") || \"RuntimeRecord\"};`,\n cardIdType,\n ]);\n }\n\n return renderBlocks([\n `export type ${toPascalCase(cardSet.id)}CardProperties = ${renderTypeForObjectSchema(cardSet.cardSchema)};`,\n cardIdType,\n ]);\n })\n .join(\"\\n\\n\");\n}\n\nfunction renderTopologyFieldTypeSections(analysis: ManifestAnalysis): string {\n const sections: string[] = [];\n for (const board of analysis.analyzedBoards) {\n sections.push(\n `export type ${boardFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.boardFieldsSchema)};`,\n `export type ${boardSpaceFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.spaceFieldsSchema)};`,\n );\n if (board.layout !== \"hex\") {\n sections.push(\n `export type ${boardRelationFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.relationFieldsSchema)};`,\n `export type ${boardContainerFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.containerFieldsSchema)};`,\n );\n }\n if (board.layout !== \"generic\") {\n sections.push(\n `export type ${hexEdgeFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.edgeFieldsSchema)};`,\n `export type ${hexVertexFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.vertexFieldsSchema)};`,\n );\n }\n }\n\n for (const pieceTypeId of analysis.pieceTypeIds) {\n sections.push(\n `export type ${pieceFieldsTypeName(pieceTypeId)} = ${renderTypeForObjectSchema(\n analysis.pieceTypeSchemasById.get(pieceTypeId),\n )};`,\n );\n }\n for (const dieTypeId of analysis.dieTypeIds) {\n sections.push(\n `export type ${dieFieldsTypeName(dieTypeId)} = ${renderTypeForObjectSchema(\n analysis.dieTypeSchemasById.get(dieTypeId),\n )};`,\n );\n }\n return sections.join(\"\\n\");\n}\n\nfunction renderManifestTypesSource(manifest: GameTopologyManifest): string {\n const analysis = analyzeManifest(manifest);\n const sharedZoneIds = analysis.sharedZones.map((zone) => zone.id).sort();\n const playerZoneIds = analysis.playerZones.map((zone) => zone.id).sort();\n const cardSetCardIdAlias = (cardSetId: string) =>\n `${toPascalCase(cardSetId)}CardId`;\n const renderCardIdsForCardSets = (cardSetIds: readonly string[]) =>\n cardSetIds.map(cardSetCardIdAlias).join(\" | \") || \"never\";\n const sharedZoneCardIdEntries = sharedZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.sharedZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: Array<${renderCardIdsForCardSets(allowedCardSetIds)}>;`;\n })\n .join(\"\\n\");\n const playerZoneCardIdEntries = playerZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.playerZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: PerPlayer<Array<${renderCardIdsForCardSets(allowedCardSetIds)}>>;`;\n })\n .join(\"\\n\");\n const perBoardStateEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n if (board.layout === \"hex\") {\n return ` ${quote(runtimeBoardId)}: HexBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(board.edges.map((edge) => edge.id))}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(board.board.id)}>;`;\n }\n if (board.layout === \"square\") {\n return ` ${quote(runtimeBoardId)}: SquareBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${renderStringUnion(board.edges.map((edge) => edge.id))}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(board.board.id)}, ${boardContainerFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(board.board.id)}>;`;\n }\n return ` ${quote(runtimeBoardId)}: GenericBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(board.board.id)}, ${boardContainerFieldsTypeName(board.board.id)}>;`;\n }),\n )\n .join(\"\\n\");\n\n return `${generatedFileBanner}\n\nimport type {\n PerPlayer,\n RuntimeCardData,\n RuntimeCardVisibility,\n RuntimeComponentLocation,\n RuntimeDieData,\n RuntimeHandVisibilityMode,\n RuntimePieceData,\n RuntimeRecord,\n RuntimeTableRecord,\n} from \"@dreamboard-games/sdk/reducer\";\nimport { literals } from \"./manifest-literals\";\n\nexport type PlayerId = (typeof literals.playerIds)[number];\nexport type PhaseName = string;\nexport type BoardLayout = (typeof literals.boardLayouts)[number];\nexport type SetupOptionId = (typeof literals.setupOptionIds)[number];\nexport type SetupProfileId = (typeof literals.setupProfileIds)[number];\nexport type CardSetId = (typeof literals.cardSetIds)[number];\nexport type CardType = (typeof literals.cardTypes)[number];\nexport type CardId = (typeof literals.cardIds)[number];\nexport type DeckId = (typeof literals.deckIds)[number];\nexport type HandId = (typeof literals.handIds)[number];\nexport type SharedZoneId = (typeof literals.sharedZoneIds)[number];\nexport type PlayerZoneId = (typeof literals.playerZoneIds)[number];\nexport type ZoneId = (typeof literals.zoneIds)[number];\nexport type ResourceId = (typeof literals.resourceIds)[number];\nexport type PieceTypeId = (typeof literals.pieceTypeIds)[number];\nexport type PieceId = (typeof literals.pieceIds)[number];\nexport type DieTypeId = (typeof literals.dieTypeIds)[number];\nexport type DieId = (typeof literals.dieIds)[number];\nexport type BoardTypeId = (typeof literals.boardTypeIds)[number];\nexport type BoardBaseId = (typeof literals.boardBaseIds)[number];\nexport type BoardId = (typeof literals.boardIds)[number];\nexport type BoardContainerId = (typeof literals.boardContainerIds)[number];\nexport type RelationTypeId = (typeof literals.relationTypeIds)[number];\nexport type EdgeId = (typeof literals.edgeIds)[number];\nexport type EdgeTypeId = (typeof literals.edgeTypeIds)[number];\nexport type VertexId = (typeof literals.vertexIds)[number];\nexport type VertexTypeId = (typeof literals.vertexTypeIds)[number];\nexport type SpaceId = (typeof literals.spaceIds)[number];\nexport type SpaceTypeId = (typeof literals.spaceTypeIds)[number];\n\n${renderCardSetTypeSections(analysis)}\n\n${renderTopologyFieldTypeSections(analysis)}\n\n${renderBoardFieldMapTypes(analysis)}\n\nexport type CardProperties = ${\n analysis.cardSets.length > 0\n ? analysis.cardSets\n .map((cardSet) => `${toPascalCase(cardSet.id)}CardProperties`)\n .join(\" | \")\n : \"RuntimeRecord\"\n };\n\nexport type CardState = Omit<RuntimeCardData, \"id\" | \"cardSetId\" | \"cardType\" | \"properties\"> & {\n id: CardId;\n cardSetId: CardSetId;\n cardType: CardType;\n properties: CardProperties;\n};\nexport type CardStateById = Record<CardId, CardState>;\nexport type PieceStateById = Record<PieceId, RuntimePieceData>;\nexport type DieStateById = Record<DieId, RuntimeDieData>;\nexport type CardIdsBySharedZoneId = {\n${sharedZoneCardIdEntries}\n};\nexport type CardIdsByPlayerZoneId = {\n${playerZoneCardIdEntries}\n};\nexport type CardIdsByDeckId = CardIdsBySharedZoneId;\nexport type ComponentId = CardId | PieceId | DieId;\n\nexport interface BoardSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> {\n id: SpaceIdValue;\n name?: string | null;\n typeId?: SpaceTypeId | null;\n fields: Fields;\n zoneId?: string | null;\n}\nexport interface BoardRelationStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> {\n id?: string | null;\n typeId: RelationTypeId;\n fromSpaceId: SpaceIdValue;\n toSpaceId: SpaceIdValue;\n directed: boolean;\n fields: Fields;\n}\nexport interface BoardContainerStateRecord<SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, Fields = RuntimeRecord> {\n id: ContainerIdValue;\n name: string;\n host: { type: \"board\" } | { type: \"space\"; spaceId: SpaceIdValue };\n allowedCardSetIds?: readonly CardSetId[];\n zoneId: string;\n fields: Fields;\n}\nexport interface BoardStateRecordBase<BoardIdValue extends BoardId = BoardId, BoardFields = RuntimeRecord> {\n id: BoardIdValue;\n baseId: BoardBaseId;\n typeId?: BoardTypeId | null;\n scope: \"shared\" | \"perPlayer\";\n playerId?: PlayerId | null;\n templateId?: string | null;\n fields: BoardFields;\n}\nexport interface GenericBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, RelationFields = RuntimeRecord, ContainerFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"generic\";\n spaces: Record<SpaceIdValue, BoardSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<ContainerIdValue, BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>>;\n}\nexport interface HexSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n q: number;\n r: number;\n}\nexport interface SquareSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n row: number;\n col: number;\n}\nexport interface TiledEdgeStateRecord<SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, Fields = RuntimeRecord> {\n id: EdgeIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: EdgeTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\nexport interface TiledVertexStateRecord<SpaceIdValue extends SpaceId = SpaceId, VertexIdValue extends VertexId = VertexId, Fields = RuntimeRecord> {\n id: VertexIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: VertexTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\nexport type HexEdgeStateRecord<SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, Fields = RuntimeRecord> = TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, Fields>;\nexport type HexVertexStateRecord<SpaceIdValue extends SpaceId = SpaceId, VertexIdValue extends VertexId = VertexId, Fields = RuntimeRecord> = TiledVertexStateRecord<SpaceIdValue, VertexIdValue, Fields>;\nexport interface HexBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, VertexIdValue extends VertexId = VertexId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, EdgeFields = RuntimeRecord, VertexFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"hex\";\n spaces: Record<SpaceIdValue, HexSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RuntimeRecord>>;\n containers: Record<never, never>;\n orientation: \"pointy-top\" | \"flat-top\";\n edges: Array<HexEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<HexVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>>;\n}\nexport interface SquareBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, EdgeIdValue extends EdgeId = EdgeId, VertexIdValue extends VertexId = VertexId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, RelationFields = RuntimeRecord, ContainerFields = RuntimeRecord, EdgeFields = RuntimeRecord, VertexFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"square\";\n spaces: Record<SpaceIdValue, SquareSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<ContainerIdValue, BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>>;\n edges: Array<TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<TiledVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>>;\n}\nexport type BoardStateById = {\n${perBoardStateEntries}\n};\nexport type BoardState<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardStateById ? BoardStateById[BoardIdValue] : never;\nexport type BoardFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardFieldsByBoardId ? BoardFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardSpaceState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { spaces: Record<string, infer Space> } ? Space : never;\nexport type BoardSpaceFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardSpaceFieldsByBoardId ? BoardSpaceFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardRelationState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { relations: Array<infer Relation> } ? Relation : never;\nexport type BoardRelationFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardRelationFieldsByBoardId ? BoardRelationFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardContainerState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { containers: Record<string, infer Container> } ? Container : never;\nexport type BoardContainerFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardContainerFieldsByBoardId ? BoardContainerFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type HexBoardStateById = {\n [BoardIdValue in keyof BoardStateById as BoardStateById[BoardIdValue] extends { layout: \"hex\" } ? BoardIdValue : never]: BoardStateById[BoardIdValue];\n};\nexport type SquareBoardStateById = {\n [BoardIdValue in keyof BoardStateById as BoardStateById[BoardIdValue] extends { layout: \"square\" } ? BoardIdValue : never]: BoardStateById[BoardIdValue];\n};\nexport type HexEdgeState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"hex\"; edges: Array<infer Edge> } ? Edge : never;\nexport type HexEdgeFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof HexEdgeFieldsByBoardId ? HexEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type HexVertexState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"hex\"; vertices: Array<infer Vertex> } ? Vertex : never;\nexport type HexVertexFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof HexVertexFieldsByBoardId ? HexVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type SquareEdgeState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"square\"; edges: Array<infer Edge> } ? Edge : never;\nexport type SquareEdgeFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof SquareEdgeFieldsByBoardId ? SquareEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type SquareVertexState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"square\"; vertices: Array<infer Vertex> } ? Vertex : never;\nexport type SquareVertexFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof SquareVertexFieldsByBoardId ? SquareVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type TiledBoardId = keyof TiledEdgeFieldsByBoardId | keyof TiledVertexFieldsByBoardId;\nexport type TiledEdgeState<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends BoardId ? HexEdgeState<BoardIdValue> | SquareEdgeState<BoardIdValue> : never;\nexport type TiledEdgeFields<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends keyof TiledEdgeFieldsByBoardId ? TiledEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type TiledVertexState<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends BoardId ? HexVertexState<BoardIdValue> | SquareVertexState<BoardIdValue> : never;\nexport type TiledVertexFields<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends keyof TiledVertexFieldsByBoardId ? TiledVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardStateRecord = BoardStateById[BoardId];\n\nexport type TableState = Omit<RuntimeTableRecord, \"playerOrder\" | \"zones\" | \"decks\" | \"hands\" | \"handVisibility\" | \"cards\" | \"pieces\" | \"componentLocations\" | \"ownerOfCard\" | \"visibility\" | \"resources\" | \"boards\" | \"dice\"> & {\n playerOrder: PlayerId[];\n zones: RuntimeTableRecord[\"zones\"] & {\n visibility: Record<ZoneId, RuntimeHandVisibilityMode>;\n cardSetIdsByZoneId?: Record<ZoneId, readonly CardSetId[]>;\n };\n decks: CardIdsBySharedZoneId;\n hands: CardIdsByPlayerZoneId;\n handVisibility: Record<PlayerZoneId, RuntimeHandVisibilityMode>;\n cards: CardStateById;\n pieces: PieceStateById;\n componentLocations: Record<ComponentId, RuntimeComponentLocation>;\n ownerOfCard: Record<CardId, PlayerId | null>;\n visibility: Record<CardId, RuntimeCardVisibility>;\n resources: PerPlayer<Record<ResourceId, number>>;\n boards: {\n byId: BoardStateById;\n hex: HexBoardStateById;\n square: SquareBoardStateById;\n network: Record<string, RuntimeRecord>;\n track: Record<string, RuntimeRecord>;\n };\n dice: DieStateById;\n};\n`;\n}\n\nfunction extractGeneratedRuntimeValueExports(source: string): string[] {\n const exports = new Set<string>();\n for (const match of source.matchAll(\n /^export (?:const|function) ([A-Za-z_$][\\w$]*)/gm,\n )) {\n const name = match[1];\n if (name === undefined) {\n continue;\n }\n if (name !== \"literals\") {\n exports.add(name);\n }\n }\n return [...exports].sort((left, right) => left.localeCompare(right));\n}\n\nfunction renderManifestContractBarrelSource(legacySource: string): string {\n const runtimeExports = extractGeneratedRuntimeValueExports(legacySource);\n return `${generatedFileBanner}\n\nexport { literals } from \"./manifest-literals\";\nexport type * from \"./manifest-types\";\nexport {\n${runtimeExports.map((name) => ` ${name},`).join(\"\\n\")}\n} from \"./manifest-runtime\";\nexport { default } from \"./manifest-runtime\";\n`;\n}\n\nexport function generateManifestContractSources(\n manifest: GameTopologyManifest,\n): GeneratedManifestContractSources {\n const legacySource = renderManifestContractSource(manifest);\n return {\n \"shared/manifest-literals.ts\": renderManifestLiteralsSource(legacySource),\n \"shared/manifest-types.ts\": renderManifestTypesSource(manifest),\n \"shared/manifest-runtime.ts\": renderManifestRuntimeSource(legacySource),\n \"shared/manifest-contract.ts\":\n renderManifestContractBarrelSource(legacySource),\n };\n}\n","import type {\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexSpaceSpec,\n HexVertexSpec,\n BoardCard,\n BoardSpec,\n BoardTemplateSpec,\n DieSeedSpec,\n DieTypeSpec,\n GameTopologyManifest,\n PieceSeedSpec,\n PieceTypeSpec,\n SetupOptionSpec,\n ZoneSpec,\n} from \"../../types/index.js\";\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\n\nexport type ManifestAuthoringValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is Extract<BoardTemplateSpec, { layout: \"hex\" }> {\n return boardTemplate.layout === \"hex\";\n}\n\nfunction isHexBoardSpec(\n board: BoardSpec,\n): board is Extract<BoardSpec, { layout: \"hex\" }> {\n return board.layout === \"hex\";\n}\n\nfunction collectDuplicateIdIssues(options: {\n entries: ReadonlyArray<{ id?: string | null; path: string }>;\n label: string;\n}): string[] {\n const issues: string[] = [];\n const pathsById = new Map<string, string[]>();\n\n for (const entry of options.entries) {\n const id = entry.id?.trim();\n if (!id) {\n continue;\n }\n const paths = pathsById.get(id) ?? [];\n paths.push(entry.path);\n pathsById.set(id, paths);\n }\n\n for (const [id, paths] of pathsById.entries()) {\n if (paths.length > 1) {\n issues.push(`${paths.join(\", \")}: Duplicate ${options.label} '${id}'.`);\n }\n }\n\n return issues;\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n return card.count > 1\n ? Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n )\n : [card.type];\n}\n\nfunction expandSeedIds<\n Seed extends {\n id?: string | null;\n typeId: string;\n count?: number | null;\n },\n>(seeds: readonly Seed[]): string[] {\n return seeds.flatMap((seed) => {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n return count > 1\n ? Array.from({ length: count }, (_, index) => `${baseId}-${index + 1}`)\n : [baseId];\n });\n}\n\nfunction validateTypeSlotDuplicates(options: {\n pieceTypes: readonly PieceTypeSpec[];\n dieTypes: readonly DieTypeSpec[];\n}): string[] {\n const issues: string[] = [];\n\n for (const [index, pieceType] of options.pieceTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (pieceType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.pieceTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"piece slot id\",\n }),\n );\n }\n\n for (const [index, dieType] of options.dieTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (dieType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.dieTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"die slot id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateSlotHostsAndHomes(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map(\n (pieceType) => [pieceType.id, pieceType] as const,\n ),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType] as const),\n );\n const slotIdsByHostKey = new Map<string, Set<string>>();\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n const slotIds = (pieceType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.pieceSeeds[${index}].id: Piece seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.pieceSeeds[${index}].count: Piece seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`piece:${seed.id}`, new Set(slotIds));\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n const slotIds = (dieType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.dieSeeds[${index}].id: Die seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.dieSeeds[${index}].count: Die seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`die:${seed.id}`, new Set(slotIds));\n }\n\n const validateHome = (\n home: BoardCard[\"home\"] | PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"],\n path: string,\n ) => {\n if (home?.type !== \"slot\") {\n return;\n }\n\n const hostKey = `${home.host.kind}:${home.host.id}`;\n const slotIds = slotIdsByHostKey.get(hostKey);\n if (!slotIds) {\n issues.push(\n `${path}.host: Unknown strict slot host '${home.host.kind}:${home.host.id}'. Hosts must be singleton piece/die seeds whose type declares slots.`,\n );\n return;\n }\n if (!slotIds.has(home.slotId)) {\n issues.push(\n `${path}.slotId: Unknown slot '${home.slotId}' for host '${home.host.kind}:${home.host.id}'.`,\n );\n }\n };\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n if (cardSet.type !== \"manual\") {\n continue;\n }\n for (const [cardIndex, card] of cardSet.cards.entries()) {\n validateHome(\n card.home,\n `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`,\n );\n }\n }\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.pieceSeeds[${index}].home`);\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.dieSeeds[${index}].home`);\n }\n\n return issues;\n}\n\nfunction validateSetupProfileReferences(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const optionChoiceIdsByOptionId = new Map<string, Set<string>>(\n (manifest.setupOptions ?? []).map((option, optionIndex) => {\n const choiceIds = new Set<string>();\n for (const choice of option.choices ?? []) {\n choiceIds.add(choice.id);\n }\n if (!option.id) {\n issues.push(\n `manifest.setupOptions[${optionIndex}].id: Missing option id.`,\n );\n }\n return [option.id, choiceIds];\n }),\n );\n\n for (const [profileIndex, profile] of (\n manifest.setupProfiles ?? []\n ).entries()) {\n const optionValues = profile.optionValues ?? {};\n for (const [optionId, choiceId] of Object.entries(optionValues)) {\n const allowedChoices = optionChoiceIdsByOptionId.get(optionId);\n if (!allowedChoices) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown setup option '${optionId}'.`,\n );\n continue;\n }\n if (!allowedChoices.has(choiceId)) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown choice '${choiceId}' for setup option '${optionId}'.`,\n );\n }\n }\n }\n\n return issues;\n}\n\nfunction validatePlayerScopedSeedHomes(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const boardScopeById = new Map(\n (manifest.boards ?? []).map((board) => [board.id, board.scope] as const),\n );\n const zoneScopeById = new Map(\n (manifest.zones ?? []).map((zone) => [zone.id, zone.scope] as const),\n );\n\n const validateSeedHome = (\n seed: PieceSeedSpec | DieSeedSpec,\n path: string,\n label: \"Piece seed\" | \"Die seed\",\n ) => {\n const authoredId = seed.id ?? seed.typeId;\n if (seed.ownerId) {\n return;\n }\n\n if (\n homeTargetsBoard(seed.home) &&\n boardScopeById.get(seed.home.boardId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.boardId: ${label} '${authoredId}' requires ownerId because board '${seed.home.boardId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n return;\n }\n\n if (\n seed.home?.type === \"zone\" &&\n zoneScopeById.get(seed.home.zoneId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.zoneId: ${label} '${authoredId}' requires ownerId because zone '${seed.home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n };\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.pieceSeeds[${index}].home`, \"Piece seed\");\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.dieSeeds[${index}].home`, \"Die seed\");\n }\n\n return issues;\n}\n\nfunction homeTargetsBoard(\n home: PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"] | undefined,\n): home is Extract<\n NonNullable<PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"]>,\n { type: \"space\" | \"container\" | \"edge\" | \"vertex\" }\n> {\n return (\n home?.type === \"space\" ||\n home?.type === \"container\" ||\n home?.type === \"edge\" ||\n home?.type === \"vertex\"\n );\n}\n\nfunction validateBoardTemplateDuplicates(\n boardTemplates: readonly BoardTemplateSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [index, boardTemplate] of boardTemplates.entries()) {\n if (isHexBoardTemplateSpec(boardTemplate)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.containers ?? []).map(\n (container, containerIndex) => ({\n id: container.id,\n path: `manifest.boardTemplates[${index}].containers[${containerIndex}].id`,\n }),\n ),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.relations ?? []).map(\n (relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boardTemplates[${index}].relations[${relationIndex}].id`,\n }),\n ),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateBoardDuplicates(boards: readonly BoardSpec[]): string[] {\n const issues: string[] = [];\n\n for (const [index, board] of boards.entries()) {\n if (isHexBoardSpec(board)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.containers ?? []).map((container, containerIndex) => ({\n id: container.id,\n path: `manifest.boards[${index}].containers[${containerIndex}].id`,\n })),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.relations ?? []).map((relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boards[${index}].relations[${relationIndex}].id`,\n })),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateSetupOptionChoiceDuplicates(\n options: readonly SetupOptionSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [optionIndex, option] of options.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (option.choices ?? []).map((choice, choiceIndex) => ({\n id: choice.id,\n path: `manifest.setupOptions[${optionIndex}].choices[${choiceIndex}].id`,\n })),\n label: \"setup option choice id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n continue;\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction validateHexVertexRefs(options: {\n ownerPath: string;\n ownerLabel: string;\n spaces: readonly HexSpaceSpec[];\n vertices: readonly HexVertexSpec[];\n}): string[] {\n const issues: string[] = [];\n const spacesById = new Map(\n options.spaces.map((space) => [space.id, space] as const),\n );\n\n for (const [vertexIndex, vertex] of options.vertices.entries()) {\n try {\n resolveHexVertexGeometryKey(vertex.ref, spacesById);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown hex vertex error.\";\n issues.push(\n `${options.ownerPath}.vertices[${vertexIndex}].ref: ${options.ownerLabel} with spaces '${vertex.ref.spaces.join(\", \")}' failed validation. ${message}`,\n );\n }\n }\n\n return issues;\n}\n\nfunction validateHexBoardVertexRefs(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const hexTemplatesById = new Map(\n (manifest.boardTemplates ?? [])\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\n for (const [templateIndex, template] of (\n manifest.boardTemplates ?? []\n ).entries()) {\n if (!isHexBoardTemplateSpec(template)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boardTemplates[${templateIndex}]`,\n ownerLabel: `Hex board template '${template.id}'`,\n spaces: template.spaces ?? [],\n vertices: template.vertices ?? [],\n }),\n );\n }\n\n for (const [boardIndex, board] of (manifest.boards ?? []).entries()) {\n if (!isHexBoardSpec(board)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boards[${boardIndex}]`,\n ownerLabel: `Hex board '${board.id}'`,\n spaces: resolveHexSpaces(\n board,\n hexTemplatesById.get(board.templateId ?? \"\"),\n ),\n vertices: board.vertices ?? [],\n }),\n );\n }\n\n return issues;\n}\n\nfunction collectAmbiguousBoardTypeWarnings(\n manifest: GameTopologyManifest,\n): string[] {\n const warnings: string[] = [];\n const boardTemplatesById = new Map(\n (manifest.boardTemplates ?? []).map(\n (template) => [template.id, template] as const,\n ),\n );\n const boardsBySpaceType = new Map<string, Set<string>>();\n const boardsByEdgeType = new Map<string, Set<string>>();\n const boardsByVertexType = new Map<string, Set<string>>();\n\n const addBoardUsage = (\n target: Map<string, Set<string>>,\n typeId: string | null | undefined,\n boardId: string,\n ) => {\n if (!typeId) {\n return;\n }\n const boardIds = target.get(typeId) ?? new Set<string>();\n boardIds.add(boardId);\n target.set(typeId, boardIds);\n };\n\n for (const board of manifest.boards ?? []) {\n const template = board.templateId\n ? boardTemplatesById.get(board.templateId)\n : undefined;\n for (const space of [\n ...((template?.layout === board.layout ? template.spaces : undefined) ??\n []),\n ...(board.spaces ?? []),\n ]) {\n addBoardUsage(boardsBySpaceType, space.typeId, board.id);\n }\n\n if (board.layout === \"hex\" || board.layout === \"square\") {\n for (const edge of [\n ...((template?.layout === board.layout ? template.edges : undefined) ??\n []),\n ...(board.edges ?? []),\n ]) {\n addBoardUsage(boardsByEdgeType, edge.typeId, board.id);\n }\n for (const vertex of [\n ...((template?.layout === board.layout\n ? template.vertices\n : undefined) ?? []),\n ...(board.vertices ?? []),\n ]) {\n addBoardUsage(boardsByVertexType, vertex.typeId, board.id);\n }\n }\n }\n\n const pushWarnings = (\n kind: \"space\" | \"edge\" | \"vertex\",\n boardsByType: Map<string, Set<string>>,\n helperName: string,\n ) => {\n for (const [typeId, boardIds] of boardsByType.entries()) {\n if (boardIds.size < 2) {\n continue;\n }\n warnings.push(\n `Ambiguous ${kind}.typeId '${typeId}' is authored on multiple boards (${Array.from(boardIds).sort().join(\", \")}). Prefer ${helperName} for board-scoped lookups.`,\n );\n }\n };\n\n pushWarnings(\n \"space\",\n boardsBySpaceType,\n \"boardHelpers.spaceIdsByBoardId / boardHelpers.spaceTypeIdByBoardId\",\n );\n pushWarnings(\n \"edge\",\n boardsByEdgeType,\n \"boardHelpers.edgeIdsByBoardIdAndTypeId\",\n );\n pushWarnings(\n \"vertex\",\n boardsByVertexType,\n \"boardHelpers.vertexIdsByBoardIdAndTypeId\",\n );\n\n return warnings;\n}\n\nexport function validateManifestAuthoring(\n manifest: GameTopologyManifest,\n): ManifestAuthoringValidationResult {\n const errors: string[] = [];\n\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.map((cardSet, index) => ({\n id: cardSet.id,\n path: `manifest.cardSets[${index}].id`,\n })),\n label: \"card set id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.flatMap((cardSet, cardSetIndex) =>\n cardSet.type === \"manual\"\n ? cardSet.cards.flatMap((card, cardIndex) =>\n renderCardInstanceIds(card).map((cardId) => ({\n id: cardId,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].type`,\n })),\n )\n : [],\n ),\n label: \"card runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.zones ?? []).map((zone: ZoneSpec, index) => ({\n id: zone.id,\n path: `manifest.zones[${index}].id`,\n })),\n label: \"zone id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.boardTemplates ?? []).map((boardTemplate, index) => ({\n id: boardTemplate.id,\n path: `manifest.boardTemplates[${index}].id`,\n })),\n label: \"board template id\",\n }),\n );\n errors.push(\n ...validateBoardTemplateDuplicates(manifest.boardTemplates ?? []),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.boards ?? []).map((board, index) => ({\n id: board.id,\n path: `manifest.boards[${index}].id`,\n })),\n label: \"board id\",\n }),\n );\n errors.push(...validateBoardDuplicates(manifest.boards ?? []));\n errors.push(\n ...validateTypeSlotDuplicates({\n pieceTypes: manifest.pieceTypes ?? [],\n dieTypes: manifest.dieTypes ?? [],\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.pieceTypes ?? []).map((pieceType, index) => ({\n id: pieceType.id,\n path: `manifest.pieceTypes[${index}].id`,\n })),\n label: \"piece type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.pieceSeeds ?? []).map(\n (pieceId, index) => ({\n id: pieceId,\n path: `manifest.pieceSeeds[*][${index}]`,\n }),\n ),\n label: \"piece runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.dieTypes ?? []).map((dieType, index) => ({\n id: dieType.id,\n path: `manifest.dieTypes[${index}].id`,\n })),\n label: \"die type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.dieSeeds ?? []).map((dieId, index) => ({\n id: dieId,\n path: `manifest.dieSeeds[*][${index}]`,\n })),\n label: \"die runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.resources ?? []).map((resource, index) => ({\n id: resource.id,\n path: `manifest.resources[${index}].id`,\n })),\n label: \"resource id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupOptions ?? []).map((option, index) => ({\n id: option.id,\n path: `manifest.setupOptions[${index}].id`,\n })),\n label: \"setup option id\",\n }),\n );\n errors.push(\n ...validateSetupOptionChoiceDuplicates(manifest.setupOptions ?? []),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupProfiles ?? []).map((profile, index) => ({\n id: profile.id,\n path: `manifest.setupProfiles[${index}].id`,\n })),\n label: \"setup profile id\",\n }),\n );\n errors.push(...validateSlotHostsAndHomes(manifest));\n errors.push(...validatePlayerScopedSeedHomes(manifest));\n errors.push(...validateSetupProfileReferences(manifest));\n errors.push(...validateHexBoardVertexRefs(manifest));\n\n return {\n errors,\n warnings: collectAmbiguousBoardTypeWarnings(manifest),\n };\n}\n","export type OwnershipPattern = {\n prefix: string;\n suffix: string;\n};\n\nexport type ScaffoldingOwnership = {\n version: number;\n allowedPaths: {\n rootFiles: string[];\n directoryPrefixes: string[];\n };\n dynamic: {\n generatedFiles: string[];\n seedFiles: string[];\n seedFilePatterns: OwnershipPattern[];\n };\n cliStatic: {\n exactFiles: string[];\n directoryPrefixes: string[];\n };\n preservedUserFiles: string[];\n};\n\nexport const WORKSPACE_CODEGEN_OWNERSHIP: ScaffoldingOwnership = {\n version: 26,\n allowedPaths: {\n rootFiles: [\n \".npmrc\",\n \"package.json\",\n \"pnpm-lock.yaml\",\n \"package-lock.json\",\n \"manifest.ts\",\n \"manifest.tsconfig.json\",\n \"rule.md\",\n ],\n directoryPrefixes: [\"app/\", \"ui/\", \"shared/\", \"test/\"],\n },\n dynamic: {\n generatedFiles: [\n \"shared/manifest-literals.ts\",\n \"shared/manifest-types.ts\",\n \"shared/manifest-runtime.ts\",\n \"shared/manifest-contract.ts\",\n \"shared/generated/ui-contract.ts\",\n \"app/index.ts\",\n \"app/tsconfig.framework.json\",\n \"ui/tsconfig.framework.json\",\n ],\n seedFiles: [\n \"app/README.md\",\n \"ui/App.tsx\",\n \"app/game-contract.ts\",\n \"app/game.ts\",\n \"app/setup-profiles.ts\",\n \"app/reducer-support.ts\",\n \"app/derived.ts\",\n \"ui/interaction-routes.tsx\",\n \"ui/setup-screen.tsx\",\n \"ui/styles.ts\",\n \"ui/ui-contract-typing-smoke.tsx\",\n ],\n seedFilePatterns: [{ prefix: \"app/phases/\", suffix: \".ts\" }],\n },\n cliStatic: {\n exactFiles: [\n \".npmrc\",\n \"package.json\",\n \"app/tsconfig.json\",\n \"ui/index.tsx\",\n \"ui/package.json\",\n \"ui/style.css\",\n \"ui/tsconfig.json\",\n ],\n directoryPrefixes: [],\n },\n preservedUserFiles: [],\n} as const;\n\nexport const AUTHORITATIVE_GENERATED_FILES =\n WORKSPACE_CODEGEN_OWNERSHIP.dynamic.generatedFiles;\nexport const SEED_FILES = WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFiles;\nexport const SEED_FILE_PATTERNS =\n WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFilePatterns;\nexport const PRESERVED_USER_FILES = new Set(\n WORKSPACE_CODEGEN_OWNERSHIP.preservedUserFiles,\n);\n\nfunction normalizeProjectPath(filePath: string): string {\n return filePath.replace(/^\\.\\//, \"\").replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nexport function isAllowedGamePath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n if (WORKSPACE_CODEGEN_OWNERSHIP.allowedPaths.rootFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.allowedPaths.directoryPrefixes.some(\n (prefix) => path.startsWith(prefix),\n );\n}\n\nexport function isAuthoritativeGeneratedPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n return WORKSPACE_CODEGEN_OWNERSHIP.dynamic.generatedFiles.includes(path);\n}\n\nexport function isDynamicSeedPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n if (WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFilePatterns.some(\n (pattern) =>\n path.startsWith(pattern.prefix) && path.endsWith(pattern.suffix),\n );\n}\n\nexport function isCliStaticPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n if (WORKSPACE_CODEGEN_OWNERSHIP.cliStatic.exactFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.cliStatic.directoryPrefixes.some(\n (prefix) => path.startsWith(prefix),\n );\n}\n\nexport function isLibraryPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n return isAuthoritativeGeneratedPath(path);\n}\n","import type { GameTopologyManifest } from \"../../types/index.js\";\n\nexport const SETUP_PROFILES_SEED_MARKER =\n \"Generated by dreamboard setup-profiles scaffold.\";\n\nfunction generateUiContractContent(): string {\n return `/**\n * Generated file.\n * Do not edit directly.\n */\n\nimport game from \"../../app/game\";\nimport {\n createClientParamSchemasByPhase,\n} from \"@dreamboard-games/sdk/reducer\";\nimport type {\n CardInputZoneIdsOfDefinition,\n ClientParamsOfInteractionOfDefinition,\n DefaultedClientParamKeysOfInteractionOfDefinition,\n InputKeysWithCollectorKindOfDefinition,\n InteractionIdOfDefinition,\n InteractionIdOfDefinitionPhase,\n PhaseNamesOfDefinition,\n StageNamesOfDefinitionPhase,\n ViewNamesOfDefinition,\n ViewOfDefinition,\n} from \"@dreamboard-games/sdk/reducer\";\nimport {\n type BoardSpaceIdOf,\n type InteractionVisualState,\n} from \"@dreamboard-games/sdk/ui\";\nimport { type InteractionDescriptor } from \"@dreamboard-games/sdk/generated/runtime\";\nimport {\n createWorkspaceUIContract,\n type BoardHexGridProps as BoardHexGridPropsGeneric,\n type BoardHexViewProps as BoardHexViewPropsGeneric,\n type BoardSpaceTargetProps as BoardSpaceTargetPropsGeneric,\n\t type ClientParamSchemaMap,\n\t type DreamboardUI,\n\t type GameMeState,\n\t type GamePlayersState,\n\t type GameRenderState,\n\t type GameTurnState,\n\t type ResourceCounterComponents,\n\t type TypedGame,\n\t type UIContract,\n\t type UIRootProps,\n\t type WorkspaceBoardSurfaceDescriptor,\n\t type WorkspaceBoardSurface,\n\t type WorkspaceBoardTargetInputSlot,\n\t type WorkspaceCardCollectionSurface,\n\t type WorkspaceCardCollectionSurfaceDescriptor,\n\t type WorkspaceCardInputSlot,\n\t type WorkspaceFormInputSlot,\n\t type WorkspaceHandSurfaceDescriptor,\n\t type WorkspaceHandSurface,\n\t type WorkspaceInteractionFormDescriptor,\n\t type WorkspaceInteractionSlotComponent,\n\t type WorkspaceInteractionFormsDescriptor,\n\t type WorkspacePileSurface,\n\t type WorkspacePileSurfaceDescriptor,\n\t type WorkspacePilesSurfaceDescriptor,\n\t type WorkspaceSurfaceSpec,\n\t type ZoneCardRenderItem,\n\t type ZoneListProps,\n\t} from \"@dreamboard-games/sdk/generated/workspace-contract\";\nimport { type ButtonHTMLAttributes, type ReactElement, type ReactNode } from \"react\";\nimport {\n boardHelpers,\n literals,\n staticBoards,\n type BoardBaseId,\n type CardId,\n type CardProperties,\n type CardType,\n type EdgeId,\n type PlayerId,\n type ResourceId,\n type SpaceId,\n type TiledBoardId,\n type TiledEdgeState,\n type TiledVertexState,\n type VertexId,\n type ZoneId as ManifestZoneId,\n} from \"../manifest-contract\";\n\n/**\n * Boundary tripwire (do not remove).\n *\n * The authored UI boundary depends on \\`@dreamboard-games/sdk/runtime\\` resolving to\n * real types in every typecheck path (local \\`tsc\\` and the remote compiler\n * service). If a future change to module resolution or type loading silently\n * degrades \\`@dreamboard-games/sdk/runtime\\` to \\`any\\`, the assertions below stop\n * compiling, turning invisible type erosion into a hard typecheck error in\n * every generated workspace. \\`InteractionDescriptor\\` comes from the package\n * root and \\`ZoneCardRenderItem\\` from the \\`/workspace-contract\\` subpath, so\n * both entry points are covered.\n */\ntype IsAny<T> = 0 extends 1 & T ? true : false;\ntype AssertNotAny<T> = IsAny<T> extends true\n ? \"SDK runtime types resolved to any — boundary degraded\"\n : true;\nconst _uiRuntimeBoundaryResolved: [\n AssertNotAny<InteractionDescriptor>,\n AssertNotAny<ZoneCardRenderItem>,\n] = [true, true];\nvoid _uiRuntimeBoundaryResolved;\n\ntype GameDefinition = typeof game;\n\nexport type ViewName = ViewNamesOfDefinition<GameDefinition>;\nexport type InferView<Name extends ViewName> = ViewOfDefinition<\n GameDefinition,\n Name\n>;\nexport type GameView = Extract<\"player\", ViewName> extends never\n ? never\n : InferView<Extract<\"player\", ViewName>>;\n\n\texport type PhaseName = PhaseNamesOfDefinition<GameDefinition>;\n\texport type GameRootState = GameRenderState<GameView, PlayerId, PhaseName>;\n\texport type GamePlayers = GamePlayersState<PlayerId>;\n\texport type GameMe = GameMeState<PlayerId>;\n\texport type GameTurn = GameTurnState<PlayerId, PhaseName>;\n\n\t// -------------------------------------------------------------------------\n// Interaction / Stage / Zone types (authored via defineInteraction/Stage/zones)\n// -------------------------------------------------------------------------\n\n/** Union of all interaction ids across phases. */\nexport type InteractionId = InteractionIdOfDefinition<GameDefinition>;\n\n/** Interactions declared in a specific phase. */\nexport type InteractionIdForPhase<Phase extends PhaseName> =\n InteractionIdOfDefinitionPhase<GameDefinition, Phase>;\n\n/**\n * Client-facing params type for an interaction, inferred from its input\n * collectors. Engine-sampled collectors (e.g. \\`rngInput.*\\`) are omitted\n * — the trusted reducer bundle fills those fields during submit, so the\n * client never supplies them.\n */\nexport type InteractionParams<\n Phase extends PhaseName,\n Id extends InteractionIdForPhase<Phase>,\n> = ClientParamsOfInteractionOfDefinition<GameDefinition, Phase, Id>;\n\n/** Client-facing params with authored input defaults. */\nexport type InteractionDefaultedKeys<\n Phase extends PhaseName,\n Id extends InteractionIdForPhase<Phase>,\n> = DefaultedClientParamKeysOfInteractionOfDefinition<GameDefinition, Phase, Id>;\n\n/** Phase-qualified interaction key for a specific phase. */\nexport type InteractionKeyForPhase<Phase extends PhaseName> =\n \\`\\${Phase}.\\${InteractionIdForPhase<Phase>}\\`;\n\n/** Phase-qualified union of every client/UI interaction key. */\nexport type InteractionKey = {\n [P in PhaseName]: InteractionKeyForPhase<P>;\n}[PhaseName];\n\ntype PhaseOfInteractionKey<Key extends InteractionKey> =\n Key extends \\`\\${infer P}.\\${string}\\` ? Extract<P, PhaseName> : never;\n\ntype IdOfInteractionKey<Key extends InteractionKey> =\n Key extends \\`\\${infer P}.\\${infer I}\\`\n ? P extends PhaseName\n ? Extract<I, InteractionIdForPhase<P>>\n : never\n : never;\n\nexport type BoardInteractions = InteractionKey;\n\n/** Stage names declared in a phase. */\nexport type StageName<Phase extends PhaseName> = StageNamesOfDefinitionPhase<\n GameDefinition,\n Phase\n>;\n\n/** Union of zone ids authored in the workspace manifest. */\nexport type ZoneId = ManifestZoneId;\n\ntype CamelCase<S extends string> = S extends \\`\\${infer Head}-\\${infer Tail}\\`\n ? \\`\\${Head}\\${Capitalize<CamelCase<Tail>>}\\`\n : S;\n\n/** JS-friendly keys for authored zones, e.g. \"dev-hand\" -> \"devHand\". */\nexport type WorkspaceZoneKey = CamelCase<ZoneId>;\n\ntype PlayerCardZoneId = {\n [Z in (typeof literals.playerZoneIds)[number]]: (typeof literals.cardSetIdsByPlayerZoneId)[Z] extends readonly []\n ? never\n : Z;\n}[(typeof literals.playerZoneIds)[number]];\n\ntype SharedCardZoneId = {\n [Z in (typeof literals.sharedZoneIds)[number]]: (typeof literals.cardSetIdsBySharedZoneId)[Z] extends readonly []\n ? never\n : Z;\n}[(typeof literals.sharedZoneIds)[number]];\n\ntype CardZoneId = PlayerCardZoneId | SharedCardZoneId;\n\n/** JS-friendly keys for per-player zones that can contain cards. */\nexport type WorkspacePlayerCardZoneKey = CamelCase<PlayerCardZoneId>;\n\n/** Interaction descriptor specialised to a concrete phase-qualified key. */\nexport type InteractionDescriptorFor<Key extends InteractionKey> =\n InteractionDescriptor<Key>;\n\nexport type InteractionItem<Key extends InteractionKey> = {\n readonly interaction: Key;\n readonly descriptor: InteractionDescriptorFor<Key>;\n};\n\n/**\n * Params shape for a phase-qualified interaction key. Drives strong typing\n * for component-first interaction state, forms, and submits.\n */\nexport type InteractionParamsOf<Key extends InteractionKey> =\n InteractionParams<PhaseOfInteractionKey<Key>, IdOfInteractionKey<Key>>;\n\nexport type InteractionDefaultedKeysOf<Key extends InteractionKey> =\n InteractionDefaultedKeys<PhaseOfInteractionKey<Key>, IdOfInteractionKey<Key>>;\n\ntype InteractionParamsShape<Key extends InteractionKey> =\n InteractionParamsOf<Key> extends Record<string, unknown>\n ? InteractionParamsOf<Key>\n : Record<string, unknown>;\n\ntype InteractionCollectorKind =\n | \"form\"\n | \"board-vertex\"\n | \"board-edge\"\n | \"board-tile\"\n | \"board-space\"\n | \"card\"\n | \"prompt\";\n\ntype AuthoredInteractionInputKeysOf<Key extends InteractionKey> =\n InputKeysWithCollectorKindOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n InteractionCollectorKind\n > extends infer Input\n ? string extends Input\n ? never\n : Input & string\n : never;\n\ntype InteractionInputKeysOf<Key extends InteractionKey> =\n | (string extends keyof InteractionParamsOf<Key>\n ? never\n : keyof InteractionParamsOf<Key> & string)\n | AuthoredInteractionInputKeysOf<Key>\n | (InteractionDefaultedKeysOf<Key> & string);\n\ntype InteractionHandleDefaultedKeys<Key extends InteractionKey> = Extract<\n InteractionDefaultedKeysOf<Key>,\n keyof InteractionParamsShape<Key> & string\n>;\n\ntype RequiredInteractionInputKeysOf<Key extends InteractionKey> =\n InteractionInputKeysOf<Key>;\n\nexport type RequiredInteractionInputKey<Key extends InteractionKey> =\n RequiredInteractionInputKeysOf<Key>;\n\ntype InteractionSlotComponent<Props = object> = (\n props: Props extends { children: unknown }\n ? Props\n : Props & { children?: ReactNode },\n) => ReactElement | null;\n\ntype InteractionDefaultInputSlot = {\n readonly Default: InteractionSlotComponent;\n};\n\ntype InteractionValueInputSlot<Value = unknown> = {\n readonly Value: InteractionSlotComponent<{\n children: (value: unknown | undefined) => ReactNode;\n }>;\n};\n\ntype InteractionFormInputSlot<Value = unknown> = {\n readonly Field: InteractionSlotComponent;\n readonly Options: InteractionSlotComponent<{\n children: (option: { value: Value; label: string }) => ReactNode;\n }>;\n};\n\ntype DreamboardSlotBrand<Meta> = {\n readonly __dreamboardSlot: Meta;\n};\n\ntype InteractionCardTargetInputSlot<Card extends string = string> = {\n readonly Card: InteractionSlotComponent<\n { value: string } & Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"children\"\n | \"disabled\"\n | \"aria-disabled\"\n | \"aria-pressed\"\n | \"onClick\"\n | \"type\"\n | \"value\"\n >\n >;\n readonly Cards: InteractionSlotComponent<{\n children: (card: { id: Card }) => ReactNode;\n }>;\n};\n\ntype InteractionBoardTargetInputSlot<Target extends string = string> = {\n readonly Target: InteractionSlotComponent<\n { value: string } & Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"children\"\n | \"disabled\"\n | \"aria-disabled\"\n | \"aria-pressed\"\n | \"onClick\"\n | \"type\"\n | \"value\"\n >\n >;\n};\n\ntype InteractionBoardSpaceTargetInputSlot<Space extends string = string> =\n InteractionBoardTargetInputSlot<Space>;\n\ntype InteractionBoardEdgeTargetInputSlot<Edge extends string = string> =\n InteractionBoardTargetInputSlot<Edge>;\n\ntype InteractionBoardVertexTargetInputSlot<Vertex extends string = string> =\n InteractionBoardTargetInputSlot<Vertex>;\n\ntype InteractionBoardTileTargetInputSlot<Tile extends string = string> =\n InteractionBoardTargetInputSlot<Tile>;\n\ntype InteractionSubmitSlot = {\n readonly Button: InteractionSlotComponent<\n Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"disabled\" | \"type\" | \"value\"\n >\n >;\n};\n\ntype InteractionInputValue<\n Key extends InteractionKey,\n Input extends InteractionInputKeysOf<Key>,\n> = InteractionParamsShape<Key>[Input & keyof InteractionParamsShape<Key>];\n\ntype InteractionSlotValue<Value> = Value extends readonly (infer Item)[]\n ? InteractionSlotValue<Item>\n : Value extends { spaceId: infer Space extends string }\n ? Space\n : Value extends { edgeId: infer Edge extends string }\n ? Edge\n : Value extends { vertexId: infer Vertex extends string }\n ? Vertex\n : Value extends { tileId: infer Tile extends string }\n ? Tile\n : Value extends { cardId: infer Card extends string }\n ? Card\n : Value;\n\ntype InteractionSlotStringValue<Value> = Extract<\n InteractionSlotValue<Value>,\n string\n>;\n\ntype FormInteractionInputKey<Key extends InteractionKey> =\n InputKeysWithCollectorKindOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n \"form\" | \"prompt\"\n > &\n InteractionInputKeysOf<Key>;\n\ntype CardTargetInteractionInputKey<Key extends InteractionKey> =\n InputKeysWithCollectorKindOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n \"card\"\n > &\n InteractionInputKeysOf<Key>;\n\ntype CardTargetZoneIds<\n Key extends InteractionKey,\n Input extends InteractionInputKeysOf<Key>,\n> =\n CardInputZoneIdsOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n Input & string\n > extends infer Zone extends string\n ? Extract<Zone, WorkspaceZoneId>\n : never;\n\ntype BoardSpaceTargetInteractionInputKey<Key extends InteractionKey> =\n InputKeysWithCollectorKindOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n \"board-space\"\n > &\n InteractionInputKeysOf<Key>;\n\ntype BoardEdgeTargetInteractionInputKey<Key extends InteractionKey> =\n InputKeysWithCollectorKindOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n \"board-edge\"\n > &\n InteractionInputKeysOf<Key>;\n\ntype BoardVertexTargetInteractionInputKey<Key extends InteractionKey> =\n InputKeysWithCollectorKindOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n \"board-vertex\"\n > &\n InteractionInputKeysOf<Key>;\n\ntype BoardTileTargetInteractionInputKey<Key extends InteractionKey> =\n InputKeysWithCollectorKindOfDefinition<\n GameDefinition,\n PhaseOfInteractionKey<Key>,\n IdOfInteractionKey<Key>,\n \"board-tile\"\n > &\n InteractionInputKeysOf<Key>;\n\ntype InteractionDefaultSlotFor<\n Key extends InteractionKey,\n Input extends InteractionInputKeysOf<Key>,\n> = Input extends InteractionHandleDefaultedKeys<Key>\n ? InteractionDefaultInputSlot\n : object;\n\nexport type InteractionInputSlot<\n Key extends InteractionKey,\n Input extends InteractionInputKeysOf<Key>,\n> = InteractionValueInputSlot<InteractionInputValue<Key, Input>> &\n InteractionDefaultSlotFor<Key, Input> &\n (Input extends CardTargetInteractionInputKey<Key>\n ? InteractionCardTargetInputSlot<\n InteractionSlotStringValue<InteractionInputValue<Key, Input>>\n >\n : Input extends BoardSpaceTargetInteractionInputKey<Key>\n ? InteractionBoardSpaceTargetInputSlot<\n InteractionSlotStringValue<InteractionInputValue<Key, Input>>\n >\n : Input extends BoardEdgeTargetInteractionInputKey<Key>\n ? InteractionBoardEdgeTargetInputSlot<\n InteractionSlotStringValue<InteractionInputValue<Key, Input>>\n >\n : Input extends BoardVertexTargetInteractionInputKey<Key>\n ? InteractionBoardVertexTargetInputSlot<\n InteractionSlotStringValue<InteractionInputValue<Key, Input>>\n >\n : Input extends BoardTileTargetInteractionInputKey<Key>\n ? InteractionBoardTileTargetInputSlot<\n InteractionSlotStringValue<InteractionInputValue<Key, Input>>\n >\n : Input extends FormInteractionInputKey<Key>\n ? InteractionFormInputSlot<InteractionInputValue<Key, Input>>\n : never);\n\ntype FormSurfaceInputSlot<\n Key extends InteractionKey,\n Input extends FormInteractionInputKey<Key>,\n> = InteractionValueInputSlot<InteractionInputValue<Key, Input>> &\n InteractionDefaultSlotFor<Key, Input> &\n InteractionFormInputSlot<InteractionInputValue<Key, Input>> &\n DreamboardSlotBrand<{\n readonly kind: \"form\";\n readonly interaction: Key;\n readonly input: Input;\n }>;\n\ntype CardSurfaceInputSlot<Zones extends string> =\n InteractionValueInputSlot<unknown> &\n InteractionCardTargetInputSlot<WorkspaceCardId & string> &\n DreamboardSlotBrand<{\n readonly kind: \"card\";\n readonly zones: Zones;\n readonly selection: \"one\" | \"many\";\n }>;\n\ntype BoardSurfaceInputSlot<\n Kind extends \"space\" | \"edge\" | \"vertex\" | \"tile\",\n Target extends string = string,\n> =\n InteractionValueInputSlot<unknown> &\n InteractionBoardTargetInputSlot<Target> &\n DreamboardSlotBrand<{\n readonly kind: \"board\";\n readonly targetKind: Kind;\n }>;\n\ntype InteractionCollectorSlot<\n Key extends InteractionKey,\n Input extends InteractionInputKeysOf<Key>,\n> = Input extends CardTargetInteractionInputKey<Key>\n ? CardSurfaceInputSlot<CardTargetZoneIds<Key, Input>>\n : Input extends BoardSpaceTargetInteractionInputKey<Key>\n ? BoardSurfaceInputSlot<\"space\", string>\n : Input extends BoardEdgeTargetInteractionInputKey<Key>\n ? BoardSurfaceInputSlot<\"edge\", string>\n : Input extends BoardVertexTargetInteractionInputKey<Key>\n ? BoardSurfaceInputSlot<\"vertex\", string>\n : Input extends BoardTileTargetInteractionInputKey<Key>\n ? BoardSurfaceInputSlot<\"tile\", string>\n : Input extends FormInteractionInputKey<Key>\n ? FormSurfaceInputSlot<Key, Input>\n : never;\n\ntype InteractionKeysWithInput<Input extends InteractionInputKey> = {\n [Key in InteractionKey]: Input extends InteractionInputKeysOf<Key>\n ? Key\n : never;\n}[InteractionKey];\n\ntype InteractionInputSlotByName<Input extends InteractionInputKey> =\n InteractionInputSlot<\n InteractionKeysWithInput<Input>,\n Input & InteractionInputKeysOf<InteractionKeysWithInput<Input>>\n >;\n\ntype InteractionFormInputSlotByName<Input extends InteractionInputKey> =\n InteractionInputSlot<\n {\n [Key in InteractionKey]: Input extends FormInteractionInputKey<Key>\n ? Key\n : never;\n }[InteractionKey],\n Input &\n InteractionInputKeysOf<\n {\n [Key in InteractionKey]: Input extends FormInteractionInputKey<Key>\n ? Key\n : never;\n }[InteractionKey]\n >\n >;\n\ntype InteractionInputsForCollectorKind<\n Key extends InteractionKey,\n CollectorKind extends InteractionCollectorKind,\n> = {\n [Input in InteractionInputKeysOf<Key>]: CollectorKind extends \"form\"\n ? Input extends FormInteractionInputKey<Key>\n ? Input\n : never\n : CollectorKind extends \"card\"\n ? Input extends CardTargetInteractionInputKey<Key>\n ? Input\n : never\n : CollectorKind extends \"board-space\"\n ? Input extends BoardSpaceTargetInteractionInputKey<Key>\n ? Input\n : never\n : CollectorKind extends \"board-edge\"\n ? Input extends BoardEdgeTargetInteractionInputKey<Key>\n ? Input\n : never\n : CollectorKind extends \"board-vertex\"\n ? Input extends BoardVertexTargetInteractionInputKey<Key>\n ? Input\n : never\n : CollectorKind extends \"board-tile\"\n ? Input extends BoardTileTargetInteractionInputKey<Key>\n ? Input\n : never\n : never;\n}[InteractionInputKeysOf<Key>];\n\ntype InteractionKeysForCollectorKind<\n CollectorKind extends InteractionCollectorKind,\n> = {\n [Key in InteractionKey]: InteractionInputsForCollectorKind<\n Key,\n CollectorKind\n > extends never\n ? never\n : Key;\n}[InteractionKey];\n\ntype InteractionInputSlotByCollectorKind<\n CollectorKind extends InteractionCollectorKind,\n> = InteractionInputSlot<\n InteractionKeysForCollectorKind<CollectorKind>,\n InteractionInputsForCollectorKind<\n InteractionKeysForCollectorKind<CollectorKind>,\n CollectorKind\n >\n>;\n\nexport type InteractionFormSurface<Key extends InteractionKey> = {\n readonly Root: InteractionSlotComponent;\n readonly Form: DreamboardUI<typeof uiContract>[\"Interaction\"][\"Form\"];\n readonly Dialog: DreamboardUI<typeof uiContract>[\"Interaction\"][\"Dialog\"];\n readonly State: DreamboardUI<typeof uiContract>[\"Interaction\"][\"State\"];\n readonly Arm: DreamboardUI<typeof uiContract>[\"Interaction\"][\"Trigger\"];\n readonly Submit: DreamboardUI<typeof uiContract>[\"Interaction\"][\"Submit\"];\n readonly Field: <Input extends FormInteractionInputKey<Key>>(\n props: { input: Input; children?: ReactNode },\n ) => ReactElement | null;\n readonly slot: {\n readonly [Input in FormInteractionInputKey<Key>]: FormSurfaceInputSlot<\n Key,\n Input\n >;\n };\n};\n\ntype BoardSurfaceSpaceProps<Target extends string> = {\n value: Target;\n children?: ReactNode;\n} & Omit<BoardSpaceTargetPropsGeneric<Target>, \"value\" | \"children\">;\n\nexport type BoardSurfaceBoardId = BoardBaseId & string;\n\ntype BoardSurfaceRuntimeBoardId<Board extends BoardSurfaceBoardId> =\n ReturnType<typeof boardHelpers.boardIdsForBase<Board>>[number] & string;\n\ntype BoardSurfaceSpaceId<Board extends BoardSurfaceBoardId> =\n ReturnType<\n typeof boardHelpers.spaceIds<BoardSurfaceRuntimeBoardId<Board>>\n >[number] &\n string;\n\ntype BoardSurfaceTiledBoardId<Board extends BoardSurfaceBoardId> = Extract<\n BoardSurfaceRuntimeBoardId<Board>,\n TiledBoardId\n>;\n\ntype BoardSurfaceEdgeId<Board extends BoardSurfaceBoardId> =\n TiledEdgeState<BoardSurfaceTiledBoardId<Board>> extends { id: infer Id }\n ? Id & string\n : EdgeId & string;\n\ntype BoardSurfaceVertexId<Board extends BoardSurfaceBoardId> =\n TiledVertexState<BoardSurfaceTiledBoardId<Board>> extends { id: infer Id }\n ? Id & string\n : VertexId & string;\n\nexport type BoardSurface<Board extends BoardSurfaceBoardId = BoardSurfaceBoardId> = {\n readonly Root: InteractionSlotComponent;\n readonly Space: <Target extends BoardSurfaceSpaceId<Board>>(\n props: BoardSurfaceSpaceProps<Target>,\n ) => ReactElement;\n readonly slot: {\n readonly space: BoardSurfaceInputSlot<\n \"space\",\n BoardSurfaceSpaceId<Board>\n >;\n readonly playerSpace: BoardSurfaceInputSlot<\n \"space\",\n BoardSurfaceSpaceId<Board>\n >;\n readonly edge: BoardSurfaceInputSlot<\"edge\", BoardSurfaceEdgeId<Board>>;\n readonly vertex: BoardSurfaceInputSlot<\n \"vertex\",\n BoardSurfaceVertexId<Board>\n >;\n readonly tile: BoardSurfaceInputSlot<\"tile\", BoardSurfaceSpaceId<Board>>;\n };\n};\n\ntype ZoneCardsComponent = InteractionSlotComponent<\n Omit<ZoneListProps, \"children\" | \"empty\"> & {\n empty?: ReactNode;\n children: (card: WorkspaceZoneCard) => ReactNode;\n }\n >;\n\ntype ZoneCardComponent = InteractionSlotComponent<\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"type\" | \"value\"> & {\n card: WorkspaceZoneCard;\n }\n >;\n\n/**\n * Generic SDK card-intent shape for typed hand emission. Authors do not\n * import the runtime; the typed \\`targetId\\` is constrained by the\n * authored interaction domain on the generated hand surface.\n */\nexport type HandCardIntent<Card extends string, Target extends string> =\n | { type: \"activate\"; cardId: Card; source: \"tap\" | \"keyboard\" }\n | { type: \"previewStart\"; cardId: Card }\n | { type: \"previewEnd\"; cardId: Card }\n | {\n type: \"drop\";\n cardId: Card;\n targetId: Target;\n source: \"pointer\" | \"keyboard\";\n };\n\nexport type HandLayoutKindGen = \"fan\" | \"compressed-fan\" | \"tray\" | \"strip\" | \"stack\";\nexport type HandLayoutPolicyGen = {\n desktop?: HandLayoutKindGen;\n mobile?: HandLayoutKindGen;\n};\nexport type HandMobileInteractionPolicy = \"direct-activate\" | \"drag-to-target\";\n\nexport type HandStagingTarget<Card extends string> = {\n readonly kind: \"card\";\n readonly card: Card;\n};\n\nexport type HandBoardDropTargetKind = \"space\" | \"edge\" | \"vertex\" | \"tile\";\n\n/**\n * Discriminated union that ties each board target kind to its manifest id\n * family. \\`tile\\` shares the space-id family because tiles are addressed\n * by their underlying space.\n */\nexport type HandBoardDropTarget<\n Space extends string,\n Edge extends string,\n Vertex extends string,\n> =\n | { readonly kind: \"space\"; readonly target: Space }\n | { readonly kind: \"edge\"; readonly target: Edge }\n | { readonly kind: \"vertex\"; readonly target: Vertex }\n | { readonly kind: \"tile\"; readonly target: Space };\n\nexport type HandDropTargetSpec<\n Card extends string,\n Space extends string,\n Edge extends string,\n Vertex extends string,\n> = HandStagingTarget<Card> | HandBoardDropTarget<Space, Edge, Vertex>;\n\n/** Union of all manifest target ids the typed hand can carry. */\nexport type HandAuthoredTarget<\n Card extends string,\n Space extends string,\n Edge extends string,\n Vertex extends string,\n> = Card | Space | Edge | Vertex;\n\n/**\n * Summary projected from the live draft for a single hand. Authors render\n * counts and validity hints via \\`renderSummary\\` or mirror them to outside\n * state via \\`onSelectionSummary\\`.\n */\nexport type HandSelectionSummary<Card extends string> = {\n readonly selectedCount: number;\n readonly selectedIds: readonly Card[];\n readonly hasInvalidSelection: boolean;\n};\n\nexport type HandSurfaceProps<\n Card extends string,\n Space extends string,\n Edge extends string,\n Vertex extends string,\n> = Omit<ZoneListProps, \"children\" | \"empty\"> & {\n empty?: ReactNode;\n /**\n * Per-card render callback. Receives the projected\n * \\`InteractionVisualState\\` (\\`eligible\\`, \\`selected\\`, \\`invalid\\`,\n * \\`disabled\\`) so authors can wire SDK \\`CardFace\\` directly without\n * recomputing draft state.\n */\n children: (\n card: WorkspaceZoneCard,\n state: InteractionVisualState,\n ) => ReactNode;\n layout?: HandLayoutKindGen | HandLayoutPolicyGen;\n mobileInteraction?: HandMobileInteractionPolicy;\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n /**\n * Typed drop targets that participate in \\`drag-to-target\\` interaction.\n * Each target's \\`kind\\` constrains the allowed \\`target\\` id family, so\n * a \\`SpaceId\\` cannot be authored as an edge or vertex target.\n */\n dropTargets?: ReadonlyArray<{\n target: HandDropTargetSpec<Card, Space, Edge, Vertex>;\n label: string;\n render: (state: unknown) => ReactNode;\n className?: string;\n role?: string;\n order?: number;\n }>;\n renderDropTargets?: (children: ReactNode) => ReactNode;\n onCardIntent?: (\n intent: HandCardIntent<Card, HandAuthoredTarget<Card, Space, Edge, Vertex>>,\n ) => void;\n /**\n * Render-safe slot for selection summary content. Fires during render\n * with the latest projected summary so authors can compose count chrome\n * (e.g. \"3 of 5 selected\") without owning effect timing. Use\n * \\`onSelectionSummary\\` for analytics or external state mirrors that\n * need an effect.\n */\n renderSummary?: (summary: HandSelectionSummary<Card>) => ReactNode;\n /**\n * Render-safe slot for the hand's commit/action chrome (e.g. a submit\n * button for a many-select interaction). Receives the same live summary as\n * \\`renderSummary\\`. Rendered below the hand inline on desktop and pinned as a\n * sticky footer inside the mobile dock, so the action stays reachable while\n * the hand is docked — prefer this over anchoring the action elsewhere on\n * the board, where the dock would otherwise cover it.\n */\n renderActions?: (summary: HandSelectionSummary<Card>) => ReactNode;\n /**\n * Optional selection summary observer. Invoked from a layout effect so\n * consumers may safely call \\`setState\\` in response.\n */\n onSelectionSummary?: (summary: HandSelectionSummary<Card>) => void;\n};\n\ntype HandCardsComponent<\n Card extends string,\n Space extends string,\n Edge extends string,\n Vertex extends string,\n> = InteractionSlotComponent<HandSurfaceProps<Card, Space, Edge, Vertex>>;\n\n/**\n * Always-visible staging surface for a many-select card collection (e.g. the\n * cards you've chosen to pass): a fixed row of slots showing the staged cards,\n * with empty placeholders otherwise. Tapping a staged card removes it from the\n * collection (it returns to the hand). Renders nothing when the zone has no\n * active many-select collection, so it can be mounted unconditionally.\n */\nexport type HandStagingProps = {\n // Staged cards are always visible (you can only stage a card you can see), so\n // the slot renderer receives the hydrated card variant — no hidden-card guard.\n children: (card: Extract<WorkspaceZoneCard, { hidden: false }>) => ReactNode;\n label?: ReactNode;\n renderEmptySlot?: (index: number) => ReactNode;\n cardSize?: \"sm\" | \"md\" | \"lg\";\n ariaLabel?: string;\n className?: string;\n};\n\ntype HandStagingComponent = InteractionSlotComponent<HandStagingProps>;\n\nexport type HandSurface<Zones extends readonly WorkspaceZoneId[] = readonly WorkspaceZoneId[]> = {\n readonly Hand: HandCardsComponent<\n CardId & string,\n SpaceId & string,\n EdgeId & string,\n VertexId & string\n >;\n readonly Card: ZoneCardComponent;\n readonly Staging: HandStagingComponent;\n readonly slot: {\n readonly card: CardSurfaceInputSlot<Zones[number] & string>;\n };\n};\n\nexport type PileSurface<Zones extends readonly WorkspaceZoneId[] = readonly WorkspaceZoneId[]> = {\n readonly Pile: ZoneCardsComponent;\n readonly Card: ZoneCardComponent;\n};\n\nexport type CardCollectionSurface<Zones extends readonly WorkspaceZoneId[] = readonly WorkspaceZoneId[]> = {\n readonly Collection: ZoneCardsComponent;\n readonly Card: ZoneCardComponent;\n readonly slot: {\n readonly card: CardSurfaceInputSlot<Zones[number] & string>;\n };\n};\n\nexport type InteractionFormInputs<Key extends InteractionKey> = {\n [Input in InteractionInputKeysOf<Key>]: (\n slot: InteractionInputSlot<Key, Input>,\n ) => ReactNode;\n};\n\nexport type InteractionCollectSlots<Key extends InteractionKey> = {\n [Input in RequiredInteractionInputKeysOf<Key>]: InteractionCollectorSlot<\n Key,\n Input\n >;\n};\n\nexport type InteractionRoute<Key extends InteractionKey> = {\n readonly collect: InteractionCollectSlots<Key>;\n};\n\nexport type InteractionRoutes = {\n [Key in InteractionKey]: InteractionRoute<Key>;\n};\n\nexport type InteractionRoutesProps = {\n routes: InteractionRoutes;\n fallback?: ReactNode;\n includeUnavailable?: boolean | null;\n};\n\nexport type ZeroInputInteractionKey = {\n [K in InteractionKey]: InteractionInputKeysOf<K> extends never\n ? K\n : never;\n}[InteractionKey];\n\nexport type InputInteractionKey = Exclude<\n InteractionKey,\n ZeroInputInteractionKey\n>;\n\ntype InteractionInputKeyOf<Key extends InteractionKey> =\n Key extends InteractionKey ? InteractionInputKeysOf<Key> : never;\n\nexport type InteractionInputKey = InteractionInputKeyOf<InteractionKey>;\n\nexport type PromptKey = InteractionKey;\n\nexport type PromptOptionValue = string;\n\nexport type BoardTargetId = SpaceId | EdgeId | VertexId;\n\ntype UIInteractionRegistry = {\n [K in InteractionKey]: {\n interaction: K;\n phase: PhaseOfInteractionKey<K>;\n id: IdOfInteractionKey<K>;\n };\n};\n\ntype UIInputRegistry = {\n [K in InteractionInputKey]: { input: K };\n};\n\ntype UIPromptRegistry = {\n [K in PromptKey]: { interaction: K };\n};\n\ntype UIPromptOptionRegistry = {\n [K in PromptOptionValue]: { value: K };\n};\n\ntype UIPlayerRegistry = {\n [K in PlayerId & string]: { player: K };\n};\n\ntype UIZoneRegistry = {\n [K in ZoneId & string]: { zone: K };\n};\n\ntype UICardRegistry = {\n [K in CardId & string]: { card: K };\n};\n\ntype UIPhaseRegistry = {\n [K in PhaseName & string]: { phase: K };\n};\n\ntype UIBoardTargetRegistry = {\n [K in BoardTargetId & string]: { target: K };\n};\n\nexport const uiContract = {\n interactions: {} as UIInteractionRegistry,\n inputs: {} as UIInputRegistry,\n prompts: {} as UIPromptRegistry,\n promptOptions: {} as UIPromptOptionRegistry,\n players: {} as UIPlayerRegistry,\n zones: {} as UIZoneRegistry,\n cards: {} as UICardRegistry,\n phases: {} as UIPhaseRegistry,\n boardTargets: {} as UIBoardTargetRegistry,\n} satisfies UIContract;\n\ndeclare module \"@dreamboard-games/sdk/generated/runtime\" {\n interface DreamboardUIRegister {\n contract: GameDefinition;\n ui: typeof uiContract;\n }\n}\n\n// -------------------------------------------------------------------------\n// Typed hex-board view adapter\n// -------------------------------------------------------------------------\n\n/** Generated hex-board topology source, keyed by hex-board id. */\nconst hexStaticBoards = staticBoards.hex;\n\n/** Union of authored hex-board ids in this workspace's manifest. */\nexport type HexBoardId = keyof typeof hexStaticBoards & string;\n\n/** Topology object for the named hex board, drawn from \\`staticBoards.hex\\`. */\nexport type HexBoardTopology<Id extends HexBoardId> = (typeof hexStaticBoards)[Id];\n\n/** Space id type for the named hex board. */\nexport type HexBoardSpaceId<Id extends HexBoardId> = BoardSpaceIdOf<\n HexBoardTopology<Id>\n>;\n\nexport type HexBoardViewProps<\n Id extends HexBoardId,\n TSpaceView extends { id: HexBoardSpaceId<Id> },\n> = Omit<BoardHexViewPropsGeneric<HexBoardTopology<Id>, TSpaceView>, \"board\"> & {\n board: Id;\n};\n\nexport type HexBoardGridProps<\n Id extends HexBoardId,\n TSpaceView extends { id: HexBoardSpaceId<Id> },\n> = Omit<\n BoardHexGridPropsGeneric<HexBoardTopology<Id>, TSpaceView>,\n \"board\" | \"interactions\"\n> & {\n board: Id;\n};\n\ntype WorkspaceBoard = {\n surface<const Board extends BoardSurfaceBoardId>(\n board: Board,\n ): WorkspaceBoardSurfaceDescriptor<Board>;\n useSurface(name: string): BoardSurface;\n useSurface<const Board extends BoardSurfaceBoardId>(\n name: string,\n options: { board: Board },\n ): BoardSurface<Board>;\n HexView<\n const Id extends HexBoardId,\n const TSpaceView extends { id: HexBoardSpaceId<Id> },\n >(props: HexBoardViewProps<Id, TSpaceView>): ReactElement;\n HexGrid<\n const Id extends HexBoardId,\n const TSpaceView extends { id: HexBoardSpaceId<Id> },\n >(props: HexBoardGridProps<Id, TSpaceView>): ReactElement;\n};\n\ntype WorkspaceCardProperties = CardProperties extends Record<string, unknown>\n ? CardProperties\n : Record<string, unknown>;\ntype WorkspaceZoneId = [ZoneId] extends [never] ? string : ZoneId;\ntype WorkspaceCardId = [CardId] extends [never] ? string : CardId;\ntype WorkspaceCardType = [CardType] extends [never] ? string : CardType;\n\n// ZoneCardRenderItem is a discriminated union (hidden: true | false).\n// A bare Omit<..., \"zone\"> would collapse the union to its common keys and\n// strip cardType / properties from the hydrated branch, defeating the\n// discriminated-union narrowing the SDK contract promises. Distribute Omit\n// across the union so each branch keeps its own shape.\ntype WorkspaceZoneCard = ZoneCardRenderItem<\n WorkspaceCardId & string,\n WorkspaceCardType & string,\n WorkspaceCardProperties\n> extends infer Item\n ? Item extends { zone: string }\n ? Omit<Item, \"zone\"> & { zone: WorkspaceZoneId }\n : never\n : never;\n\n\ttype HandRole = \"primary\" | \"auxiliary\" | \"task\";\n\n\ttype PilesSurfaceValue<Zones extends readonly CardZoneId[]> = {\n\t readonly [Zone in Zones[number]]: PileSurface<readonly [Zone]>;\n\t};\n\n\ttype InteractionFormsSurfaceValue<\n\t Forms extends Readonly<Record<string, InteractionKey>>,\n\t> = {\n\t readonly [Key in keyof Forms]: Forms[Key] extends InteractionKey\n\t ? InteractionFormSurface<Forms[Key]>\n\t : never;\n\t};\n\n\ttype WorkspaceSurfaceValue<Spec> =\n\t Spec extends WorkspaceBoardSurfaceDescriptor<infer Board extends BoardSurfaceBoardId>\n\t ? BoardSurface<Board>\n\t : Spec extends WorkspaceHandSurfaceDescriptor<infer Zone extends PlayerCardZoneId>\n\t ? HandSurface<readonly [Zone]>\n\t : Spec extends WorkspacePileSurfaceDescriptor<infer Zone extends CardZoneId>\n\t ? PileSurface<readonly [Zone]>\n\t : Spec extends WorkspacePilesSurfaceDescriptor<\n\t infer Zones extends readonly CardZoneId[]\n\t >\n\t ? PilesSurfaceValue<Zones>\n\t : Spec extends WorkspaceCardCollectionSurfaceDescriptor<\n\t infer Zones extends readonly CardZoneId[]\n\t >\n\t ? CardCollectionSurface<Zones>\n\t : Spec extends WorkspaceInteractionFormDescriptor<\n\t infer Interaction extends InteractionKey\n\t >\n\t ? InteractionFormSurface<Interaction>\n\t : Spec extends WorkspaceInteractionFormsDescriptor<\n\t infer Forms extends Readonly<Record<string, InteractionKey>>\n\t >\n\t ? InteractionFormsSurfaceValue<Forms>\n\t : Spec extends WorkspaceSurfaceSpec\n\t ? { readonly [Key in keyof Spec]: WorkspaceSurfaceValue<Spec[Key]> }\n\t : never;\n\n\ttype WorkspaceZone = {\n\t hand<const Zone extends PlayerCardZoneId>(\n\t zone: Zone,\n\t options: { role: HandRole; label: string; order?: number },\n\t ): WorkspaceHandSurfaceDescriptor<Zone>;\n\t pile<const Zone extends CardZoneId>(\n\t zone: Zone,\n\t ): WorkspacePileSurfaceDescriptor<Zone>;\n\t piles<const Zones extends readonly CardZoneId[]>(\n\t zones: Zones,\n\t ): WorkspacePilesSurfaceDescriptor<Zones>;\n\t collection<const Zones extends readonly CardZoneId[]>(\n\t zones: Zones,\n\t options?: { mode?: \"all\" | \"top-card\" },\n\t ): WorkspaceCardCollectionSurfaceDescriptor<Zones>;\n\t useHand<const Zone extends PlayerCardZoneId>(\n\t name: string,\n\t options: { zone: Zone; role: HandRole; label: string; order?: number },\n ): HandSurface<readonly [Zone]>;\n usePile<const Zone extends CardZoneId>(\n name: string,\n options: { zone: Zone },\n ): PileSurface<readonly [Zone]>;\n useCardCollection<const Zones extends readonly CardZoneId[]>(\n name: string,\n options: { zones: Zones; mode?: \"all\" | \"top-card\" },\n ): CardCollectionSurface<Zones>;\n};\n\ntype WorkspaceUI = Omit<\n DreamboardUI<typeof uiContract>,\n \"Root\" | \"Game\" | \"Interaction\" | \"Board\" | \"Zone\" | \"Prompt\" | \"PromptInbox\"\n\t> & {\n\t Root(props: UIRootProps): ReactElement;\n\t defineSurfaces<const Spec extends WorkspaceSurfaceSpec>(\n\t spec: Spec,\n\t ): () => WorkspaceSurfaceValue<Spec>;\n\t readonly Game: TypedGame<typeof uiContract, GameView, PlayerId, PhaseName>;\n\t readonly Interaction: Pick<DreamboardUI<typeof uiContract>[\"Interaction\"], \"State\" | \"Dialog\"> & {\n\t useForm<Key extends InteractionKey>(interaction: Key): InteractionFormSurface<Key>;\n\t form<const Interaction extends InteractionKey>(\n\t interaction: Interaction,\n\t ): WorkspaceInteractionFormDescriptor<Interaction>;\n\t forms<const Interactions extends Readonly<Record<string, InteractionKey>>>(\n\t interactions: Interactions,\n\t ): WorkspaceInteractionFormsDescriptor<Interactions>;\n\t Routes(props: InteractionRoutesProps): ReactElement;\n\t };\n readonly Board: WorkspaceBoard;\n readonly Zone: WorkspaceZone;\n readonly ResourceCounter: ResourceCounterComponents<ResourceId>;\n};\n\nfunction formInputKeysForInteraction(interaction: string): Set<string> {\n const [phase, id] = interaction.split(\".\", 2);\n const phaseSpec = phase ? (game.phases as Record<string, unknown>)[phase] : undefined;\n const phaseRecord = phaseSpec as {\n interactions?: Record<string, { inputs?: Record<string, { kind?: string }> }>;\n cardActions?: Record<string, { inputs?: Record<string, { kind?: string }> }>;\n submit?: { inputs?: Record<string, { kind?: string }> };\n } | undefined;\n const spec =\n (id ? phaseRecord?.interactions?.[id] : undefined) ??\n (id ? phaseRecord?.cardActions?.[id] : undefined) ??\n (id === \"submit\" ? phaseRecord?.submit : undefined);\n return new Set(\n Object.entries((spec?.inputs ?? {}) as Record<string, { kind?: string }>)\n .filter(\n ([, collector]) =>\n collector.kind === \"form\" || collector.kind === \"prompt\",\n )\n .map(([input]) => input),\n );\n}\n\nexport const UI = createWorkspaceUIContract<\n WorkspaceUI,\n typeof uiContract,\n ResourceId,\n WorkspaceZoneCard,\n typeof hexStaticBoards\n>({\n uiContract,\n clientParamSchemasByPhase: createClientParamSchemasByPhase(game) as ClientParamSchemaMap,\n formInputKeysForInteraction,\n resourceIds: literals.resourceIds as readonly ResourceId[],\n resourcePresentationById: literals.resourcePresentationById as Partial<\n Record<string, { label?: string; icon?: string }>\n >,\n hexStaticBoards,\n cardIdFromZoneCard: (card) => card.id,\n zoneIdFromZoneCard: (card) => card.zone,\n});\nexport const Board: WorkspaceUI[\"Board\"] = UI.Board;\nexport const Zone: WorkspaceUI[\"Zone\"] = UI.Zone;\nexport const Game: WorkspaceUI[\"Game\"] = UI.Game;\nexport const Interaction = UI.Interaction;\nexport const PlayerRoster: WorkspaceUI[\"PlayerRoster\"] = UI.PlayerRoster;\nexport const Dice: WorkspaceUI[\"Dice\"] = UI.Dice;\nexport const Phase = UI.Phase;\nexport const ResourceCounter: WorkspaceUI[\"ResourceCounter\"] = UI.ResourceCounter;\n\nexport const clientParamSchemasByPhase = createClientParamSchemasByPhase(\n game,\n) as ClientParamSchemaMap;\n`;\n}\n\nfunction generateReducerSupportSeed(): string {\n return `import {\n createReducerEdit,\n createStateQueries,\n} from \"@dreamboard-games/sdk/reducer\";\nimport type { GameState } from \"./game-contract\";\n\n/**\n * Small, SDK-shaped reducer helpers belong here.\n *\n * Keep schema and contract declarations in app/game-contract.ts.\n * Keep initial state callbacks and defineGame wiring in app/game.ts.\n * Keep memoized aggregates (winner checks, VP totals, longest-road,\n * largest-army) in app/derived.ts via \\`defineDerived\\`.\n * Keep phase files focused on one game-flow state.\n *\n * When this file starts collecting real game rules, split them by domain\n * under app/rules/ instead, for example app/rules/board.ts,\n * app/rules/resources.ts, or app/rules/scoring.ts.\n *\n * Recommended authoring pattern inside a phase reducer:\n *\n * const tx = edit(state);\n * tx.setActivePlayers([q.players.order()[0]]);\n * return accept(tx.state);\n */\n\nexport const edit = createReducerEdit<GameState>();\n\nexport function stateQueries(state: GameState) {\n return createStateQueries(state);\n}\n`;\n}\n\nfunction generateAppReadmeSeed(): string {\n return `# App organization\n\nThis directory owns the reducer: game state schemas, phases, interactions,\nderived values, player views, and reducer helpers.\n\nUse this layout while the game is small:\n\n\\`\\`\\`txt\napp/\n game-contract.ts\n game.ts\n derived.ts\n reducer-support.ts\n phases/\n setup.ts\n\\`\\`\\`\n\nWhen a phase grows beyond a single idea, make the phase directory the table of\ncontents and split the implementation by game concept:\n\n\\`\\`\\`txt\napp/phases/player-turn/\n index.ts # definePhase assembly only\n state.ts # phase-local constants and types\n inputs.ts # shared input and presentation helpers\n build.ts # build interactions\n trade.ts # trade interactions\n end-turn.ts # end-turn interaction\n\\`\\`\\`\n\nSplit a phase when it has multiple action families, shared input helpers, card\nactions, or is roughly 250-300 lines. Keep \\`index.ts\\` as the assembly point\nthat imports interactions and registers them with \\`definePhase\\`.\n\nDo not turn \\`reducer-support.ts\\` into a catch-all rule module. Keep it small\nfor shared reducer plumbing; put real game rules under \\`app/rules/*\\` once\nthere is more than one domain.\n`;\n}\n\nfunction generateReducerDerivedSeed(): string {\n return `// Memoized, pure projections of reducer state. Read them from reducer\n// callbacks and view projections via the injected \\`derived\\` helper:\n//\n// reduce({ state, derived, accept }) {\n// const winner = derived(winnerOf);\n// return accept({ ...state, publicState: { ...state.publicState, winnerPlayerId: winner } });\n// }\n//\n// Do NOT mirror derived values back into \\`publicState\\`. Keep the raw\n// inputs (component locations, zone contents, counters) in state and\n// express aggregates here.\n//\n// Uncomment the example below once you have something to derive.\n\n// import { defineDerived } from \"../../reducer.js\";\n// import type { GameContract } from \"./game-contract\";\n//\n// export const winnerOf = defineDerived<GameContract>()({\n// name: \"winnerOf\",\n// compute: ({ state }) => {\n// // Example: return the first player at or above the VP target.\n// return state.publicState.winnerPlayerId ?? null;\n// },\n// });\n\nexport {};\n`;\n}\n\nfunction generateReducerGameContractSeed(): string {\n return `import { z } from \"zod\";\nimport { ids, manifestContract } from \"../shared/manifest-contract\";\nimport { defineGameContract, type GameStateOf } from \"@dreamboard-games/sdk/reducer\";\n\n// Contract files should stay focused on schemas, phases, and exported\n// state types. Put reducers in app/phases/* and pure computations in\n// app/derived.ts or app/rules/*.\nconst publicStateSchema = z.object({\n currentPlayerId: ids.playerId.nullable(),\n notesByPlayerId: z.partialRecord(ids.playerId, z.string()).default({}),\n});\nconst privateStateSchema = z.object({});\nconst hiddenStateSchema = z.object({});\n\nexport const gameContract = defineGameContract({\n manifest: manifestContract,\n state: {\n public: publicStateSchema,\n private: privateStateSchema,\n hidden: hiddenStateSchema,\n },\n phases: {\n setup: z.object({}),\n },\n});\n\nexport type GameContract = typeof gameContract;\nexport type GameState = GameStateOf<GameContract>;\n`;\n}\n\nfunction generateReducerGameSeed(): string {\n return `import { defineGame } from \"@dreamboard-games/sdk/reducer\";\nimport { gameContract } from \"./game-contract\";\nimport { phases } from \"./phases\";\nimport setupProfiles from \"./setup-profiles\";\n\n// Keep this file as the defineGame assembly point. Put rules in phases,\n// projections in views/derived modules, and reusable domain helpers in\n// app/rules/* once reducer-support.ts is no longer small.\nexport default defineGame({\n contract: gameContract,\n initial: {\n public: ({ playerIds }) => ({\n currentPlayerId: playerIds[0] ?? null,\n notesByPlayerId: {},\n }),\n private: () => ({}),\n hidden: () => ({}),\n },\n initialPhase: \"setup\",\n setupProfiles,\n phases,\n views: {},\n});\n`;\n}\n\nfunction generateSetupProfilesSeed(manifest: GameTopologyManifest): string {\n const setupProfiles = manifest.setupProfiles ?? [];\n const setupProfileEntries =\n setupProfiles.length === 0\n ? \"\"\n : `{\\n${setupProfiles\n .map((profile) => ` ${JSON.stringify(profile.id)}: {},`)\n .join(\"\\n\")}\\n}`;\n\n return `// ${SETUP_PROFILES_SEED_MARKER}\nimport { setupProfiles } from \"../shared/manifest-contract\";\n\nexport default setupProfiles(${setupProfileEntries || \"{}\"});\n`;\n}\n\nexport function isFrameworkOwnedSetupProfilesSeed(\n content: string | null | undefined,\n): boolean {\n if (content === null || content === undefined) {\n return false;\n }\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return true;\n }\n if (trimmed.includes(SETUP_PROFILES_SEED_MARKER)) {\n return true;\n }\n return false;\n}\n\nfunction generateSetupPhaseSeed(): string {\n return `import { z } from \"zod\";\nimport type { GameContract, GameState } from \"../game-contract\";\nimport {\n defineInteraction,\n definePhase,\n formInput,\n} from \"@dreamboard-games/sdk/reducer\";\nimport { edit } from \"../reducer-support\";\n\nconst setupMoodChoices = [\n { value: \"ready\", label: \"Ready\" },\n { value: \"exploring\", label: \"Exploring\" },\n] as const;\ntype SetupMood = (typeof setupMoodChoices)[number][\"value\"];\nconst setupPhaseStateSchema = z.object({});\n\n// A single phase file is fine while the phase is small. When a phase grows\n// multiple action families, move it to app/phases/<phase>/index.ts and split\n// interactions into neighboring concept files.\nexport const setup = definePhase<GameContract>()({\n kind: \"player\",\n state: setupPhaseStateSchema,\n initialState: () => ({}),\n actor: ({ state }) => state.publicState.currentPlayerId,\n interactions: {\n submit: defineInteraction<GameContract, typeof setupPhaseStateSchema>()({\n inputs: {\n mood: formInput.choice<SetupMood, GameState>({\n choices: setupMoodChoices,\n defaultValue: \"ready\",\n }),\n },\n reduce({ state, input, accept }) {\n const tx = edit(state);\n tx.patchPublicState({\n notesByPlayerId: {\n ...state.publicState.notesByPlayerId,\n [input.playerId]: input.params.mood,\n },\n });\n return accept(tx.state);\n },\n }),\n },\n});\n`;\n}\n\nfunction generatePhaseIndexSeed(): string {\n return `import { setup } from \"./setup\";\nimport type { GameContract } from \"../game-contract\";\nimport type { PhaseMapOf } from \"@dreamboard-games/sdk/reducer\";\n\nexport const phases = {\n setup,\n} satisfies PhaseMapOf<GameContract>;\n`;\n}\n\nfunction generateReducerAppIndex(): string {\n return `import game from \"./game\";\nimport { createReducerBundle } from \"@dreamboard-games/sdk/reducer\";\n\nexport default createReducerBundle(game);\n`;\n}\n\nfunction generateAppFrameworkTsConfig(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2020\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: false,\n types: [],\n declaration: false,\n rootDir: \"..\",\n outDir: \"./dist\",\n paths: {\n \"@dreamboard/manifest-contract\": [\"../shared/manifest-contract.ts\"],\n \"#dreamboard/ui-contract\": [\"../shared/generated/ui-contract.ts\"],\n \"@shared/*\": [\"../shared/*\"],\n },\n },\n include: [\n \"./**/*.ts\",\n \"./**/*.d.ts\",\n \"../shared/manifest-*.ts\",\n \"../shared/manifest-*.d.ts\",\n ],\n exclude: [\"node_modules\", \"dist\", \"../shared/generated\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction generateUiFrameworkTsConfig(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2020\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n jsx: \"react-jsx\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: false,\n types: [],\n paths: {\n \"@dreamboard/manifest-contract\": [\"../shared/manifest-contract.ts\"],\n \"#dreamboard/ui-contract\": [\"../shared/generated/ui-contract.ts\"],\n \"@shared/*\": [\"../shared/*\"],\n },\n },\n include: [\"./**/*.ts\", \"./**/*.tsx\", \"../shared/**/*.ts\"],\n exclude: [\"node_modules\", \"dist\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction generateReducerUiAppContent(): string {\n return `import { Game, Interaction, Phase, UI } from \"#dreamboard/ui-contract\";\nimport { SetupInteractionRoutes } from \"./interaction-routes\";\nimport { SetupScreen } from \"./setup-screen\";\n\nfunction SetupPhase() {\n const setupForm = Interaction.useForm(\"setup.submit\");\n\n return (\n <>\n <SetupScreen />\n <SetupInteractionRoutes form={setupForm} />\n </>\n );\n}\n\nexport default function App() {\n return (\n <UI.Root>\n <Game.Root>\n {() => (\n <Phase.Switch\n routes={{\n setup: () => <SetupPhase />,\n }}\n />\n )}\n </Game.Root>\n </UI.Root>\n );\n}\n`;\n}\n\nfunction generateReducerUiSetupScreenContent(): string {\n return `import { PANEL_CLASS, SHELL_CLASS } from \"./styles\";\n\nexport function SetupScreen() {\n return (\n <main className={SHELL_CLASS}>\n <section className={PANEL_CLASS}>\n <p className=\"text-xs font-bold uppercase tracking-[0.14em] text-slate-500\">\n Setup\n </p>\n <h1 className=\"text-2xl font-bold text-slate-950\">Your game starts here</h1>\n <p className=\"max-w-prose text-sm leading-6 text-slate-600\">\n Replace this screen with your board, hands, mats, and table state.\n Keep interaction wiring in the route file so visual components stay\n focused on layout and styling.\n </p>\n </section>\n </main>\n );\n}\n`;\n}\n\nfunction generateReducerUiInteractionRoutesContent(): string {\n return `import {\n Interaction,\n type InteractionFormSurface,\n} from \"#dreamboard/ui-contract\";\nimport { ACTION_BUTTON_CLASS, PANEL_CLASS } from \"./styles\";\n\nexport function SetupInteractionRoutes({\n form,\n}: {\n form: InteractionFormSurface<\"setup.submit\">;\n}) {\n return (\n <>\n <Interaction.Routes\n routes={{\n \"setup.submit\": {\n collect: {\n mood: form.slot.mood,\n },\n },\n }}\n />\n <aside className={PANEL_CLASS}>\n <div className=\"grid gap-2\">\n <p className=\"text-sm font-bold text-slate-950\">Ready check</p>\n <form.slot.mood.Field />\n <form.Submit className={ACTION_BUTTON_CLASS}>\n Start building\n </form.Submit>\n </div>\n </aside>\n </>\n );\n}\n`;\n}\n\nfunction generateReducerUiStylesContent(): string {\n return `export const SHELL_CLASS =\n \"min-h-screen bg-[#f8fafc] p-6 text-slate-950\";\n\nexport const PANEL_CLASS =\n \"mx-auto grid max-w-3xl gap-4 rounded-lg border border-slate-200 bg-white p-5 shadow-sm\";\n\nexport const ACTION_BUTTON_CLASS =\n \"rounded-md bg-slate-950 px-4 py-2 text-sm font-bold text-white disabled:cursor-not-allowed disabled:opacity-50\";\n`;\n}\n\nfunction generateReducerUiContractTypingSmokeContent(): string {\n return `import { Interaction } from \"#dreamboard/ui-contract\";\n\nexport function UiContractTypingSmoke() {\n const form = Interaction.useForm(\"setup.submit\");\n\n return (\n <Interaction.Routes\n routes={{\n \"setup.submit\": {\n collect: {\n mood: form.slot.mood,\n },\n },\n }}\n />\n );\n}\n\n// @ts-expect-error generated contracts hide legacy interaction roots.\nInteraction.Root({ interaction: \"setup.submit\", children: null });\n`;\n}\n\nexport function generateSeedFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n \"app/README.md\": generateAppReadmeSeed(),\n \"ui/App.tsx\": generateReducerUiAppContent(),\n \"ui/interaction-routes.tsx\": generateReducerUiInteractionRoutesContent(),\n \"ui/setup-screen.tsx\": generateReducerUiSetupScreenContent(),\n \"ui/styles.ts\": generateReducerUiStylesContent(),\n \"ui/ui-contract-typing-smoke.tsx\":\n generateReducerUiContractTypingSmokeContent(),\n \"app/game-contract.ts\": generateReducerGameContractSeed(),\n \"app/game.ts\": generateReducerGameSeed(),\n \"app/setup-profiles.ts\": generateSetupProfilesSeed(manifest),\n \"app/reducer-support.ts\": generateReducerSupportSeed(),\n \"app/derived.ts\": generateReducerDerivedSeed(),\n \"app/phases/setup.ts\": generateSetupPhaseSeed(),\n \"app/phases/index.ts\": generatePhaseIndexSeed(),\n };\n}\n\nexport function generateAuthoritativeIndexFile(\n _manifest: GameTopologyManifest,\n): string {\n return generateReducerAppIndex();\n}\n\nexport function generateFrameworkFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n \"app/tsconfig.framework.json\": generateAppFrameworkTsConfig(),\n \"ui/tsconfig.framework.json\": generateUiFrameworkTsConfig(),\n \"shared/generated/ui-contract.ts\": generateUiContractContent(),\n \"app/index.ts\": generateAuthoritativeIndexFile(manifest),\n };\n}\n","import type { GameTopologyManifest } from \"../../types/index.js\";\nimport {\n generateManifestContractSources,\n materializeManifestTable,\n} from \"./manifest-contract.js\";\nimport { validateManifestAuthoring } from \"./manifest-validation.js\";\nimport {\n AUTHORITATIVE_GENERATED_FILES,\n isAllowedGamePath,\n isAuthoritativeGeneratedPath,\n isCliStaticPath,\n isDynamicSeedPath,\n isLibraryPath,\n PRESERVED_USER_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n WORKSPACE_CODEGEN_OWNERSHIP,\n} from \"./ownership.js\";\nimport {\n generateFrameworkFiles,\n generateSeedFiles,\n isFrameworkOwnedSetupProfilesSeed,\n SETUP_PROFILES_SEED_MARKER,\n} from \"./seeds.js\";\nexport {\n materializeCardSet,\n materializePresetCardSet,\n} from \"./preset-card-sets.js\";\nexport { materializeManifestTable };\n\nexport {\n AUTHORITATIVE_GENERATED_FILES,\n isAllowedGamePath,\n isAuthoritativeGeneratedPath,\n isCliStaticPath,\n isDynamicSeedPath,\n isLibraryPath,\n PRESERVED_USER_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n WORKSPACE_CODEGEN_OWNERSHIP,\n};\n\nexport function generateAuthoritativeFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n ...generateManifestContractSources(manifest),\n ...generateFrameworkFiles(manifest),\n };\n}\n\nexport { generateSeedFiles };\nexport { isFrameworkOwnedSetupProfilesSeed, SETUP_PROFILES_SEED_MARKER };\nexport { validateManifestAuthoring };\n\nexport function generateDynamicGeneratedFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n ...generateAuthoritativeFiles(manifest),\n ...generateSeedFiles(manifest),\n };\n}\n"],"mappings":";AASA,IAAM,mBAAmB;AAEzB,SAAS,yBACP,OACA,aACgB;AAChB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,aAAqC;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEO,SAAS,2BAAoD;AAClE,QAAM,QAAQ,CAAC,UAAU,UAAU,SAAS,UAAU;AACtD,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,OAAO;AACxB,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK;AAAA,QACT,MAAM,GAAG,IAAI,IAAI,IAAI;AAAA,QACrB,MAAM,GAAG,IAAI,OAAO,IAAI;AAAA,QACxB,UAAU,UAAU,KAAK,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC;AAAA,QAC5D,MAAM,mBAAmB,IAAI,OAAO,IAAI,YAAY,mBAAmB,IAAI,CAAC,iBAAiB,aAAa,IAAI,CAAC;AAAA,QAC/G,OAAO;AAAA,QACP,UAAU,GAAG,IAAI,IAAI,IAAI;AAAA,QACzB,YAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,IACA,YAAY;AAAA,MACV,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,CAAC,UAAU,UAAU,SAAS,UAAU;AAAA,UACxC;AAAA,QACF;AAAA,QACA,MAAM,2BAA2B,sBAAsB;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,yBACd,UACsB;AACtB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,SAAS,SAAS;AAAA,MAAI,CAAC,YAC/B,QAAQ,SAAS,YAAY,QAAQ,aAAa,mBAC9C;AAAA,QACE,GAAG,yBAAyB;AAAA,QAC5B,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,MAChB,IACA;AAAA,IACN;AAAA,EACF;AACF;AAEO,SAAS,yBACd,eACyB;AACzB,MAAI,cAAc,aAAa,kBAAkB;AAC/C,UAAM,IAAI,MAAM,4BAA4B,cAAc,QAAQ,EAAE;AAAA,EACtE;AAEA,QAAM,eAAe,yBAAyB;AAC9C,SAAO;AAAA,IACL,GAAG;AAAA,IACH,IAAI,cAAc;AAAA,IAClB,MAAM,cAAc;AAAA,EACtB;AACF;AAEO,SAAS,mBACd,SACyB;AACzB,SAAO,QAAQ,SAAS,WACpB,UACA,yBAAyB,OAAO;AACtC;AAEA,SAAS,mBAAmB,MAAsB;AAChD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,aAAa,MAAsB;AAC1C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ACtKA,IAAM,cAAc,CAAC,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,OAAO;AAGrE,IAAM,qBACJ;AAAA,EACE,QAAQ,CAAC,GAAG,IAAI,EAAE;AAAA,EAClB,QAAQ,CAAC,GAAG,IAAI,CAAC;AAAA,EACjB,SAAS,CAAC,IAAI,IAAI,CAAC;AAAA,EACnB,QAAQ,CAAC,IAAI,GAAG,CAAC;AAAA,EACjB,QAAQ,CAAC,IAAI,GAAG,EAAE;AAAA,EAClB,SAAS,CAAC,GAAG,GAAG,EAAE;AACpB;AAEF,SAAS,cACP,OACmC;AACnC,QAAM,IAAI,MAAM;AAChB,QAAM,IAAI,MAAM;AAChB,SAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACtB;AAEA,SAAS,kBACP,OACA,QACQ;AACR,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,cAAc,KAAK;AACrC,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,mBAAmB,MAAM;AAC9C,SAAO,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE;AAClD;AAEO,SAAS,4BACd,KACA,YACQ;AACR,QAAM,iBAAiB,CAAC,GAAG,IAAI,MAAM,EAClC,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,IAAI,CAAC,YAAY;AAChB,UAAM,QAAQ,WAAW,IAAI,OAAO;AACpC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,4CAA4C,OAAO;AAAA,MACrD;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,SAAS,gBAAgB;AAClC,eAAW,UAAU,aAAa;AAChC,YAAM,MAAM,kBAAkB,OAAO,MAAM;AAC3C,gBAAU,IAAI,MAAM,UAAU,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAClD;AAAA,EACF;AACA,QAAM,aAAa,CAAC,GAAG,UAAU,QAAQ,CAAC,EACvC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,eAAe,MAAM,EACrD,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,EAClB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAClD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR,0BAA0B,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,IACjD;AAAA,EACF;AACA,QAAM,YAAY,WAAW,CAAC;AAC9B,MAAI,cAAc,QAAW;AAC3B,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO;AACT;;;ACqKA,SAAS,6BACP,QACsC;AACtC,SAAO,QAAQ,UAAU,cAAc,MAAM;AAC/C;AAEA,SAAS,0BACP,QACA,UACqB;AACrB,QAAM,UAAU,OAAO,SAAS,QAAQ;AACxC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,YAAY;AAAA,MACV,GAAI,OAAO,UAAU,CAAC;AAAA,MACtB,GAAG,QAAQ;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,yBACP,UACmD;AACnD,SAAO,QAAQ,YAAY,aAAa,QAAQ;AAClD;AAEA,SAAS,MAAM,OAAuB;AACpC,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MACJ,MAAM,OAAO,EACb,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AACZ;AAEA,SAAS,YAAY,OAAuB;AAC1C,MAAI,CAAC,OAAO,KAAK,KAAK,GAAG;AACvB,WAAO,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AAAA,EACtD;AACA,QAAM,CAAC,QAAQ,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,OAAO,EAAE,OAAO,OAAO;AACjE,SAAO;AAAA,IACL,MAAM,YAAY;AAAA,IAClB,GAAG,KAAK,IAAI,CAAC,SAAS;AACpB,YAAM,QAAQ,KAAK,YAAY;AAC/B,aAAO,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AAAA,IACtD,CAAC;AAAA,EACH,EAAE,KAAK,EAAE;AACX;AAEA,SAAS,aAAa,QAAkD;AACtE,SAAO,OAAO,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EAAE,KAAK,MAAM;AAC9E;AAEA,SAAS,aAAa,QAAoC;AACxD,SAAO,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK;AAC1C;AAEA,SAAS,iBAAiB,QAAmC;AAC3D,SAAO,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAC3D;AAEA,SAAS,kBACP,QACA,WAAW,SACH;AACR,SAAO,OAAO,SAAS,IACnB,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK,IAC9C;AACN;AAEA,SAAS,mBACP,SACQ;AACR,QAAM,QAAQ,MAAM,KAAK,OAAO,EAC7B,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,KAAK,MAAM,GAAG,CAAC,KAAK,MAAM,KAAK,CAAC,GAAG;AAC5D,SAAO;AAAA,EAAM,MAAM,KAAK,IAAI,CAAC;AAAA;AAC/B;AAEA,SAAS,0BACP,SACQ;AACR,QAAM,QAAQ,MAAM,KAAK,OAAO,EAC7B,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD;AAAA,IACC,CAAC,CAAC,KAAK,MAAM,MACX,KAAK,MAAM,GAAG,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACvE;AACF,SAAO;AAAA,EAAM,MAAM,KAAK,IAAI,CAAC;AAAA;AAC/B;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AASA,IAAM,wBAAsD;AAAA,EAC1D;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AACF;AAOA,IAAM,wCACJ,sBAAsB,OAAO,CAAC,WAAW,OAAO,eAAe,WAAW;AAE5E,SAAS,gCAAwC;AAC/C,SAAO;AAAA,EACP,sCAAsC;AAAA,IACtC,CAAC,EAAE,YAAY,SAAS,MAAM,KAAK,UAAU;AAAA,yBACtB,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,QAAQ;AAAA,cAC/C,QAAQ;AAAA,uCACiB,UAAU;AAAA;AAAA,EAEjD,EAAE,KAAK,IAAI,CAAC;AAAA;AAEZ;AAEA,SAAS,0BAAkC;AACzC,SAAO;AAAA,EACP,sCAAsC;AAAA,IACtC,CAAC;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM,OAAO,SAAS,6BAA6B,QAAQ;AAAA,gCAC7B,UAAU;AAAA;AAAA,UAEhC,SAAS,oBAAoB,QAAQ;AAAA,oCACX,UAAU,YAAY,MAAM,WAAW,CAAC;AAAA;AAAA,EAE5E,EAAE,KAAK,IAAI,CAAC;AAAA;AAEZ;AAEA,SAAS,yBAAyB,UAAoC;AACpE,SAAO,4BAA4B;AAAA,IACjC;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAAA;AAAA,uBAEoB,mBAAmB,UAAU,SAAS,OAAO,CAAC;AACrE;AAEA,SAAS,mBACP,UACA,QACQ;AACR,QAAM,QAAQ,MAAM,KAAK,MAAM,EAC5B,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,IAAI,CAAC,UAAU,KAAK,MAAM,YAAY,KAAK,CAAC,CAAC,KAAK,MAAM,KAAK,CAAC,GAAG;AACpE,SAAO;AAAA,EAAM,MAAM,KAAK,IAAI,CAAC;AAAA,sCAAyC,QAAQ;AAChF;AAEA,SAAS,aACP,SACuB;AACvB,SAAO,OAAO;AAAA,IACZ,MAAM,KAAK,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC;AAAA,EACzE;AACF;AAEA,SAAS,sBAAsB,MAA2B;AACxD,MAAI,KAAK,QAAQ,GAAG;AAClB,WAAO,MAAM;AAAA,MACX,EAAE,QAAQ,KAAK,MAAM;AAAA,MACrB,CAAC,GAAG,UAAU,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC;AAAA,IACzC;AAAA,EACF;AACA,SAAO,CAAC,KAAK,IAAI;AACnB;AAEA,SAAS,cACP,OAIU;AACV,QAAM,WAAqB,CAAC;AAC5B,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,QAAI,SAAS,GAAG;AACd,eAAS,KAAK,MAAM;AACpB;AAAA,IACF;AACA,aAAS,QAAQ,GAAG,SAAS,OAAO,SAAS,GAAG;AAC9C,eAAS,KAAK,GAAG,MAAM,IAAI,KAAK,EAAE;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBACP,eACuC;AACvC,SAAO,cAAc,WAAW;AAClC;AAEA,SAAS,0BACP,eAC0C;AAC1C,SAAO,cAAc,WAAW;AAClC;AAEA,SAAS,2BACP,eAC2C;AAC3C,SAAO,cAAc,WAAW;AAClC;AAEA,SAAS,eAAe,OAAyC;AAC/D,SAAO,MAAM,WAAW;AAC1B;AAEA,SAAS,kBAAkB,OAA4C;AACrE,SAAO,MAAM,WAAW;AAC1B;AAEA,IAAM,YAAY,CAAC,KAAK,MAAM,MAAM,KAAK,MAAM,IAAI;AACnD,IAAMA,eAAc,CAAC,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,OAAO;AAKrE,IAAM,mBAA+D;AAAA,EACnE,GAAG,CAAC,GAAG,CAAC;AAAA,EACR,IAAI,CAAC,GAAG,EAAE;AAAA,EACV,IAAI,CAAC,GAAG,EAAE;AAAA,EACV,GAAG,CAAC,IAAI,CAAC;AAAA,EACT,IAAI,CAAC,IAAI,CAAC;AAAA,EACV,IAAI,CAAC,GAAG,CAAC;AACX;AAEA,IAAMC,sBACJ;AAAA,EACE,QAAQ,CAAC,GAAG,IAAI,EAAE;AAAA,EAClB,QAAQ,CAAC,GAAG,IAAI,CAAC;AAAA,EACjB,SAAS,CAAC,IAAI,IAAI,CAAC;AAAA,EACnB,QAAQ,CAAC,IAAI,GAAG,CAAC;AAAA,EACjB,QAAQ,CAAC,IAAI,GAAG,EAAE;AAAA,EAClB,SAAS,CAAC,GAAG,GAAG,EAAE;AACpB;AAEF,IAAM,mBAAqE;AAAA,EACzE,GAAG,CAAC,QAAQ,MAAM;AAAA,EAClB,IAAI,CAAC,SAAS,MAAM;AAAA,EACpB,IAAI,CAAC,QAAQ,OAAO;AAAA,EACpB,GAAG,CAAC,QAAQ,MAAM;AAAA,EAClB,IAAI,CAAC,SAAS,MAAM;AAAA,EACpB,IAAI,CAAC,QAAQ,OAAO;AACtB;AAEA,IAAM,mBAAmE;AAAA,EACvE,QAAQ,CAAC,MAAM,GAAG;AAAA,EAClB,QAAQ,CAAC,KAAK,IAAI;AAAA,EAClB,SAAS,CAAC,MAAM,IAAI;AAAA,EACpB,QAAQ,CAAC,MAAM,GAAG;AAAA,EAClB,QAAQ,CAAC,KAAK,IAAI;AAAA,EAClB,SAAS,CAAC,MAAM,IAAI;AACtB;AAoBA,SAASC,eACP,OACmC;AACnC,QAAM,IAAI,MAAM;AAChB,QAAM,IAAI,MAAM;AAChB,SAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;AACtB;AAEA,SAASC,mBACP,OACA,QACA;AACA,QAAM,CAAC,GAAG,GAAG,CAAC,IAAID,eAAc,KAAK;AACrC,QAAM,CAAC,IAAI,IAAI,EAAE,IAAID,oBAAmB,MAAM;AAC9C,SAAO,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE;AAClD;AAEA,SAAS,gBAAgB,OAAsC,MAAe;AAC5E,QAAM,CAAC,YAAY,WAAW,IAAI,iBAAiB,IAAI;AACvD,SAAO;AAAA,IACLE,mBAAkB,OAAO,UAAU;AAAA,IACnCA,mBAAkB,OAAO,WAAW;AAAA,EACtC,EACG,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,KAAK,IAAI;AACd;AAEA,SAAS,sBAAsB,KAAqB;AAClD,SAAO,YAAY,GAAG;AACxB;AAEA,SAAS,wBAAwB,KAAqB;AACpD,SAAO,cAAc,GAAG;AAC1B;AAEA,IAAM,eAAe,CAAC,SAAS,QAAQ,SAAS,MAAM;AACtD,IAAM,iBAAiB,CAAC,MAAM,MAAM,MAAM,IAAI;AAK9C,SAAS,4BAA4B,KAAqB;AACxD,SAAO,eAAe,GAAG;AAC3B;AAEA,SAAS,8BAA8B,KAAqB;AAC1D,SAAO,iBAAiB,GAAG;AAC7B;AAEA,SAAS,wBACP,OACA,QACQ;AACR,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,GAAG,MAAM,GAAG,IAAI,MAAM,GAAG;AAAA,IAClC,KAAK;AACH,aAAO,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,GAAG;AAAA,IACtC,KAAK;AACH,aAAO,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC;AAAA,IAC1C,KAAK;AACH,aAAO,GAAG,MAAM,GAAG,IAAI,MAAM,MAAM,CAAC;AAAA,EACxC;AACF;AAEA,SAAS,sBACP,OACA,MACQ;AACR,QAAM,YACJ,SAAS,UACL,CAAC,GAAG,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,GAAG,EAAE,IAC7D,SAAS,SACP,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,IACrE,SAAS,UACP;AAAA,IACE,GAAG,MAAM,GAAG,IAAI,MAAM,MAAM,CAAC;AAAA,IAC7B,GAAG,MAAM,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC;AAAA,EACnC,IACA,CAAC,GAAG,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,MAAM,MAAM,CAAC,EAAE;AACvE,SAAO,UAAU,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAAE,KAAK,IAAI;AAC7E;AAEA,SAAS,6BACP,KACA,YACQ;AACR,QAAM,iBAAiB,CAAC,GAAG,IAAI,MAAM,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EACjC,IAAI,CAAC,YAAY;AAChB,UAAM,QAAQ,WAAW,IAAI,OAAO;AACpC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,6CAA6C,OAAO;AAAA,MACtD;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,SAAS,gBAAgB;AAClC,eAAW,QAAQ,cAAc;AAC/B,YAAM,MAAM,sBAAsB,OAAO,IAAI;AAC7C,gBAAU,IAAI,MAAM,UAAU,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAClD;AAAA,EACF;AACA,QAAM,aAAa,CAAC,GAAG,UAAU,QAAQ,CAAC,EACvC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,eAAe,MAAM,EACrD,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,EAClB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAClD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR,2BAA2B,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,IAClD;AAAA,EACF;AACA,QAAM,CAAC,IAAI,IAAI;AACf,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,+BACP,KACA,YACQ;AACR,QAAM,iBAAiB,CAAC,GAAG,IAAI,MAAM,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,EACjC,IAAI,CAAC,YAAY;AAChB,UAAM,QAAQ,WAAW,IAAI,OAAO;AACpC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,+CAA+C,OAAO;AAAA,MACxD;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,SAAS,gBAAgB;AAClC,eAAW,UAAU,gBAAgB;AACnC,YAAM,MAAM,wBAAwB,OAAO,MAAM;AACjD,gBAAU,IAAI,MAAM,UAAU,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAClD;AAAA,EACF;AACA,QAAM,aAAa,CAAC,GAAG,UAAU,QAAQ,CAAC,EACvC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,eAAe,MAAM,EACrD,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,EAClB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AAClD,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR,6BAA6B,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,IACpD;AAAA,EACF;AACA,QAAM,CAAC,IAAI,IAAI;AACf,MAAI,SAAS,QAAW;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBACP,KACA,YACQ;AACR,QAAM,CAAC,QAAQ,OAAO,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAC3E,MAAI,WAAW,UAAa,YAAY,QAAW;AACjD,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AACA,QAAM,YAAY,WAAW,IAAI,MAAM;AACvC,QAAM,aAAa,WAAW,IAAI,OAAO;AACzC,MAAI,CAAC,aAAa,CAAC,YAAY;AAC7B,UAAM,IAAI;AAAA,MACR,2CAA2C,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,IAClE;AAAA,EACF;AACA,QAAM,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,UAAU,GAAG,WAAW,IAAI,UAAU,CAAC;AACxE,QAAM,OACJ,OAAO,QAAQ,gBAAgB,EAG/B,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,EAAE,IAAI,CAAC;AAChE,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR,wBAAwB,MAAM,UAAU,OAAO;AAAA,IACjD;AAAA,EACF;AACA,SAAO,gBAAgB,WAAW,IAAI;AACxC;AAEA,SAAS,yBACP,KACA,YACQ;AACR,SAAO,4BAA4B,KAAK,UAAU;AACpD;AAEA,SAAS,eAAe,QAAoD;AAC1E,QAAM,qBAAqB,oBAAI,IAA0B;AACzD,aAAW,SAAS,QAAQ;AAC1B,uBAAmB,IAAI,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA,EACvD;AAEA,QAAM,UAAU,oBAAI,IAA6B;AACjD,aAAW,SAAS,QAAQ;AAC1B,eAAW,QAAQ,WAAW;AAC5B,YAAM,CAAC,IAAI,EAAE,IAAI,iBAAiB,IAAI;AACtC,YAAM,WAAW,mBAAmB;AAAA,QAClC,GAAG,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,EAAE;AAAA,MACjC;AACA,YAAM,cAAc,gBAAgB,OAAO,IAAI;AAC/C,YAAM,WAAW,QAAQ,IAAI,WAAW;AACxC,YAAM,eAAe,aAAa;AAAA,QAChC,GAAI,UAAU,YAAY,CAAC;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC;AAAA,MAClC,CAAC;AACD,cAAQ,IAAI,aAAa;AAAA,QACvB,IAAI,sBAAsB,WAAW;AAAA,QACrC;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,UAAU,UAAU;AAAA,QAC5B,OAAO,UAAU,SAAS;AAAA,QAC1B,QAAQ,UAAU,UAAU;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UACvC,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,kBACP,QACqB;AACrB,QAAM,qBAAqB,oBAAI,IAA0B;AACzD,aAAW,SAAS,QAAQ;AAC1B,uBAAmB,IAAI,GAAG,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK;AAAA,EACvD;AAEA,QAAM,YAAY,oBAAI,IAA+B;AACrD,aAAW,SAAS,QAAQ;AAC1B,eAAW,UAAUH,cAAa;AAChC,YAAM,CAAC,UAAU,SAAS,IAAI,iBAAiB,MAAM;AACrD,YAAM,CAAC,OAAO,KAAK,IAAI,iBAAiB,QAAQ;AAChD,YAAM,CAAC,QAAQ,MAAM,IAAI,iBAAiB,SAAS;AACnD,YAAM,eAAe,mBAAmB;AAAA,QACtC,GAAG,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK;AAAA,MACvC;AACA,YAAM,gBAAgB,mBAAmB;AAAA,QACvC,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM;AAAA,MACzC;AACA,YAAM,cAAcG,mBAAkB,OAAO,MAAM;AACnD,YAAM,WAAW,UAAU,IAAI,WAAW;AAC1C,YAAM,eAAe,aAAa;AAAA,QAChC,GAAI,UAAU,YAAY,CAAC;AAAA,QAC3B,MAAM;AAAA,QACN,GAAI,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC;AAAA,QACxC,GAAI,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC;AAAA,MAC5C,CAAC;AACD,gBAAU,IAAI,aAAa;AAAA,QACzB,IAAI,wBAAwB,WAAW;AAAA,QACvC;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,UAAU,UAAU;AAAA,QAC5B,OAAO,UAAU,SAAS;AAAA,QAC1B,QAAQ,UAAU,UAAU;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UACzC,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,iBACP,gBACA,aACkB;AAClB,SAAO,MAAM;AAAA,IACX,CAAC,GAAG,gBAAgB,GAAG,WAAW,EAC/B,OAAoC,CAAC,aAAa,UAAU;AAC3D,kBAAY,IAAI,MAAM,IAAI,KAAK;AAC/B,aAAO;AAAA,IACT,GAAG,oBAAI,IAA4B,CAAC,EACnC,OAAO;AAAA,EACZ,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE,CAAC;AACzD;AAEA,SAAS,qBACP,oBACA,iBACsB;AACtB,SAAO,MAAM;AAAA,IACX,CAAC,GAAG,oBAAoB,GAAG,eAAe,EACvC,OAAwC,CAAC,aAAa,cAAc;AACnE,kBAAY,IAAI,UAAU,IAAI,SAAS;AACvC,aAAO;AAAA,IACT,GAAG,oBAAI,IAAgC,CAAC,EACvC,OAAO;AAAA,EACZ,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE,CAAC;AACzD;AAEA,SAAS,iBACP,OACA,UACgB;AAChB,MAAI,CAAC,UAAU;AACb,WAAO,CAAC,GAAI,MAAM,UAAU,CAAC,CAAE,EAAE;AAAA,MAAK,CAAC,MAAM,UAC3C,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,qBAAqB,IAAI;AAAA,KAC5B,SAAS,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU;AAAA,EACnE;AACA,QAAM,gBAAgB,IAAI;AAAA,KACvB,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU;AAAA,EAChE;AACA,aAAW,cAAc,cAAc,KAAK,GAAG;AAC7C,QAAI,CAAC,mBAAmB,IAAI,UAAU,GAAG;AACvC,YAAM,IAAI;AAAA,QACR,cAAc,MAAM,EAAE,8BAA8B,UAAU,oBAAoB,SAAS,EAAE;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,SAAS,UAAU,CAAC,GACzB,IAAI,CAAC,kBAAkB;AACtB,UAAM,WAAW,cAAc,IAAI,cAAc,EAAE;AACnD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,mBAAmB,IAAI,SAAS,EAAE;AACxD,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR,cAAc,MAAM,EAAE,8BAA8B,SAAS,EAAE,oBAAoB,SAAS,EAAE;AAAA,MAChG;AAAA,IACF;AACA,QAAI,cAAc,MAAM,SAAS,KAAK,cAAc,MAAM,SAAS,GAAG;AACpE,YAAM,IAAI;AAAA,QACR,cAAc,MAAM,EAAE,0CAA0C,SAAS,EAAE,oBAAoB,SAAS,EAAE;AAAA,MAC5G;AAAA,IACF;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,IAAI,cAAc;AAAA,MAClB,GAAG,cAAc;AAAA,MACjB,GAAG,cAAc;AAAA,IACnB;AAAA,EACF,CAAC,EACA,KAAK,CAAC,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE,CAAC;AAC1D;AAoDA,SAAS,wBACP,OACA,UACA,QACmC;AACnC,QAAM,aAAa,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU,CAAC;AAC5E,QAAM,uBAAuB,IAAI;AAAA,IAC/B,eAAe,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,aAAa,IAAI,CAAU;AAAA,EACxE;AACA,QAAM,4BAA4B,CAChC,OACA,eACG;AACH,UAAM,qBAAqB,oBAAI,IAAyB;AACxD,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,uBAAuB,KAAK,KAAK,UAAU;AAC/D,UAAI,mBAAmB,IAAI,WAAW,GAAG;AACvC,cAAM,IAAI,MAAM,GAAG,UAAU,oCAAoC;AAAA,MACnE;AACA,yBAAmB,IAAI,aAAa,IAAI;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAEA,QAAM,6BAA6B,WAC/B;AAAA,IACE,SAAS,SAAS,CAAC;AAAA,IACnB,uBAAuB,SAAS,EAAE;AAAA,EACpC,IACA,oBAAI,IAAyB;AACjC,QAAM,6BAA6B;AAAA,IACjC,MAAM,SAAS,CAAC;AAAA,IAChB,cAAc,MAAM,EAAE;AAAA,EACxB;AAEA,MAAI,UAAU;AACZ,eAAW,eAAe,2BAA2B,KAAK,GAAG;AAC3D,UAAI,CAAC,2BAA2B,IAAI,WAAW,GAAG;AAChD,cAAM,IAAI;AAAA,UACR,cAAc,MAAM,EAAE,+CAA+C,SAAS,EAAE;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,WAChB,MAAM,KAAK,2BAA2B,QAAQ,CAAC,EAAE;AAAA,IAC/C,CAAC,CAAC,aAAa,YAAY,MACzB;AAAA,MACE;AAAA,MACA,2BAA2B,IAAI,WAAW,KAAK;AAAA,IACjD;AAAA,EACJ,IACA,MAAM,KAAK,2BAA2B,QAAQ,CAAC;AAEnD,SAAO,YAAY,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM;AAC9C,UAAM,cAAc,qBAAqB,IAAI,WAAW;AACxD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI;AAAA,QACR,0BAA0B,MAAM,EAAE;AAAA,MACpC;AAAA,IACF;AACA,WAAO;AAAA,MACL,IAAI,YAAY;AAAA,MAChB,KAAK,UAAU,KAAK,GAAG;AAAA,MACvB,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,QACG,KAAK,UAAyD;AAAA,IACnE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,2BACP,OACA,UACA,QACsC;AACtC,QAAM,aAAa,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU,CAAC;AAC5E,QAAM,uBAAuB,IAAI;AAAA,IAC/B,kBAAkB,MAAM,EAAE;AAAA,MACxB,CAAC,WAAW,CAAC,OAAO,aAAa,MAAM;AAAA,IACzC;AAAA,EACF;AACA,QAAM,4BAA4B,CAChC,OACA,eACG;AACH,UAAM,qBAAqB,oBAAI,IAA2B;AAC1D,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,yBAAyB,KAAK,KAAK,UAAU;AACjE,UAAI,mBAAmB,IAAI,WAAW,GAAG;AACvC,cAAM,IAAI,MAAM,GAAG,UAAU,sCAAsC;AAAA,MACrE;AACA,yBAAmB,IAAI,aAAa,IAAI;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAEA,QAAM,6BAA6B,WAC/B;AAAA,IACE,SAAS,YAAY,CAAC;AAAA,IACtB,uBAAuB,SAAS,EAAE;AAAA,EACpC,IACA,oBAAI,IAA2B;AACnC,QAAM,6BAA6B;AAAA,IACjC,MAAM,YAAY,CAAC;AAAA,IACnB,cAAc,MAAM,EAAE;AAAA,EACxB;AAEA,MAAI,UAAU;AACZ,eAAW,eAAe,2BAA2B,KAAK,GAAG;AAC3D,UAAI,CAAC,2BAA2B,IAAI,WAAW,GAAG;AAChD,cAAM,IAAI;AAAA,UACR,cAAc,MAAM,EAAE,iDAAiD,SAAS,EAAE;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,WAChB,MAAM,KAAK,2BAA2B,QAAQ,CAAC,EAAE;AAAA,IAC/C,CAAC,CAAC,aAAa,YAAY,MACzB;AAAA,MACE;AAAA,MACA,2BAA2B,IAAI,WAAW,KAAK;AAAA,IACjD;AAAA,EACJ,IACA,MAAM,KAAK,2BAA2B,QAAQ,CAAC;AAEnD,SAAO,YAAY,IAAI,CAAC,CAAC,aAAa,IAAI,MAAM;AAC9C,UAAM,gBAAgB,qBAAqB,IAAI,WAAW;AAC1D,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR,4BAA4B,MAAM,EAAE;AAAA,MACtC;AAAA,IACF;AACA,WAAO;AAAA,MACL,IAAI,cAAc;AAAA,MAClB,KAAK,UAAU,KAAK,GAAG;AAAA,MACvB,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,QACG,KAAK,UAAyD;AAAA,IACnE;AAAA,EACF,CAAC;AACH;AAEA,SAAS,gBACP,OACA,UACA,QACmB;AACnB,QAAM,UAAU,eAAe,MAAM;AACrC,QAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAU,CAAC;AACzE,aAAW,gBAAgB,wBAAwB,OAAO,UAAU,MAAM,GAAG;AAC3E,UAAM,OAAO,UAAU,IAAI,aAAa,EAAE;AAC1C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,0BAA0B,MAAM,EAAE;AAAA,MACpC;AAAA,IACF;AACA,cAAU,IAAI,aAAa,IAAI;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQ,aAAa,UAAU;AAAA,MAC/B,OAAO,aAAa,SAAS;AAAA,MAC7B,QAAQ,aAAa,UAAU;AAAA,IACjC,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UACzC,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,mBACP,OACA,UACA,QACqB;AACrB,QAAM,UAAU,kBAAkB,MAAM;AACxC,QAAM,eAAe,IAAI;AAAA,IACvB,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,MAAM,CAAU;AAAA,EACtD;AACA,aAAW,kBAAkB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,UAAM,SAAS,aAAa,IAAI,eAAe,EAAE;AACjD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR,4BAA4B,MAAM,EAAE;AAAA,MACtC;AAAA,IACF;AACA,iBAAa,IAAI,eAAe,IAAI;AAAA,MAClC,GAAG;AAAA,MACH,QAAQ,eAAe,UAAU;AAAA,MACjC,OAAO,eAAe,SAAS;AAAA,MAC/B,QAAQ,eAAe,UAAU;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,GAAG,aAAa,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UAC5C,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,oBACP,OACA,UACmB;AACnB,MAAI,CAAC,UAAU;AACb,WAAO,CAAC,GAAI,MAAM,UAAU,CAAC,CAAE,EAAE;AAAA,MAAK,CAAC,MAAM,UAC3C,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,qBAAqB,IAAI;AAAA,KAC5B,SAAS,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU;AAAA,EACnE;AACA,QAAM,gBAAgB,IAAI;AAAA,KACvB,MAAM,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU;AAAA,EAChE;AACA,aAAW,cAAc,cAAc,KAAK,GAAG;AAC7C,QAAI,CAAC,mBAAmB,IAAI,UAAU,GAAG;AACvC,YAAM,IAAI;AAAA,QACR,iBAAiB,MAAM,EAAE,8BAA8B,UAAU,oBAAoB,SAAS,EAAE;AAAA,MAClG;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,SAAS,UAAU,CAAC,GACzB,IAAI,CAAC,kBAAkB;AACtB,UAAM,WAAW,cAAc,IAAI,cAAc,EAAE;AACnD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,UAAM,gBAAgB,mBAAmB,IAAI,SAAS,EAAE;AACxD,QAAI,CAAC,eAAe;AAClB,YAAM,IAAI;AAAA,QACR,iBAAiB,MAAM,EAAE,8BAA8B,SAAS,EAAE,oBAAoB,SAAS,EAAE;AAAA,MACnG;AAAA,IACF;AACA,QACE,cAAc,QAAQ,SAAS,OAC/B,cAAc,QAAQ,SAAS,KAC/B;AACA,YAAM,IAAI;AAAA,QACR,iBAAiB,MAAM,EAAE,0CAA0C,SAAS,EAAE,oBAAoB,SAAS,EAAE;AAAA,MAC/G;AAAA,IACF;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,IAAI,cAAc;AAAA,MAClB,KAAK,cAAc;AAAA,MACnB,KAAK,cAAc;AAAA,IACrB;AAAA,EACF,CAAC,EACA,KAAK,CAAC,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE,CAAC;AAC1D;AAEA,SAAS,kBACP,QACmB;AACnB,QAAM,UAAU,oBAAI,IAA6B;AACjD,aAAW,SAAS,QAAQ;AAC1B,eAAW,QAAQ,cAAc;AAC/B,YAAM,cAAc,sBAAsB,OAAO,IAAI;AACrD,YAAM,WAAW,QAAQ,IAAI,WAAW;AACxC,YAAM,eAAe,aAAa;AAAA,QAChC,GAAI,UAAU,YAAY,CAAC;AAAA,QAC3B,MAAM;AAAA,MACR,CAAC;AACD,cAAQ,IAAI,aAAa;AAAA,QACvB,IAAI,4BAA4B,WAAW;AAAA,QAC3C;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,UAAU,UAAU;AAAA,QAC5B,OAAO,UAAU,SAAS;AAAA,QAC1B,QAAQ,UAAU,UAAU;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UACvC,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,qBACP,QACqB;AACrB,QAAM,YAAY,oBAAI,IAA+B;AACrD,aAAW,SAAS,QAAQ;AAC1B,eAAW,UAAU,gBAAgB;AACnC,YAAM,cAAc,wBAAwB,OAAO,MAAM;AACzD,YAAM,WAAW,UAAU,IAAI,WAAW;AAC1C,YAAM,eAAe,aAAa;AAAA,QAChC,GAAI,UAAU,YAAY,CAAC;AAAA,QAC3B,MAAM;AAAA,MACR,CAAC;AACD,gBAAU,IAAI,aAAa;AAAA,QACzB,IAAI,8BAA8B,WAAW;AAAA,QAC7C;AAAA,QACA,UAAU;AAAA,QACV,QAAQ,UAAU,UAAU;AAAA,QAC5B,OAAO,UAAU,SAAS;AAAA,QAC1B,QAAQ,UAAU,UAAU;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UACzC,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,wBACP,OACA,YACA,YACuD;AACvD,QAAM,gBAAgB,oBAAI,IAGxB;AACF,aAAW,QAAQ,OAAO;AACxB,UAAM,cAAc,6BAA6B,KAAK,KAAK,UAAU;AACrE,QAAI,cAAc,IAAI,WAAW,GAAG;AAClC,YAAM,IAAI,MAAM,GAAG,UAAU,uCAAuC;AAAA,IACtE;AACA,kBAAc,IAAI,aAAa;AAAA,MAC7B;AAAA,MACA,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,QACG,KAAK,UAAyD;AAAA,IACnE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,0BACP,OACA,YACA,YACyD;AACzD,QAAM,gBAAgB,oBAAI,IAGxB;AACF,aAAW,QAAQ,OAAO;AACxB,UAAM,cAAc,+BAA+B,KAAK,KAAK,UAAU;AACvE,QAAI,cAAc,IAAI,WAAW,GAAG;AAClC,YAAM,IAAI,MAAM,GAAG,UAAU,yCAAyC;AAAA,IACxE;AACA,kBAAc,IAAI,aAAa;AAAA,MAC7B;AAAA,MACA,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,QACG,KAAK,UAAyD;AAAA,IACnE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,mBACP,OACA,UACA,QACmB;AACnB,QAAM,aAAa,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU,CAAC;AAC5E,QAAM,UAAU,kBAAkB,MAAM;AACxC,QAAM,qBAAqB,IAAI;AAAA,IAC7B,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,aAAa,IAAI,CAAU;AAAA,EACzD;AACA,QAAM,mBAAmB,WACrB;AAAA,IACE,SAAS,SAAS,CAAC;AAAA,IACnB;AAAA,IACA,0BAA0B,SAAS,EAAE;AAAA,EACvC,IACA,oBAAI,IAAI;AACZ,QAAM,mBAAmB;AAAA,IACvB,MAAM,SAAS,CAAC;AAAA,IAChB;AAAA,IACA,iBAAiB,MAAM,EAAE;AAAA,EAC3B;AAEA,MAAI,UAAU;AACZ,eAAW,eAAe,iBAAiB,KAAK,GAAG;AACjD,UAAI,CAAC,iBAAiB,IAAI,WAAW,GAAG;AACtC,cAAM,IAAI;AAAA,UACR,iBAAiB,MAAM,EAAE,+CAA+C,SAAS,EAAE;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,WACnB,IAAI;AAAA,IACF,CAAC,GAAG,iBAAiB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MAAM;AAAA,MACvD;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,GAAI,iBAAiB,IAAI,GAAG,KAAK,CAAC;AAAA,QAClC,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH,IACA;AAEJ,aAAW,CAAC,aAAa,QAAQ,KAAK,eAAe,QAAQ,GAAG;AAC9D,UAAM,OAAO,mBAAmB,IAAI,WAAW;AAC/C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,6BAA6B,MAAM,EAAE;AAAA,MACvC;AAAA,IACF;AACA,uBAAmB,IAAI,aAAa;AAAA,MAClC,GAAG;AAAA,MACH,QAAQ,SAAS,UAAU;AAAA,MAC3B,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,SAAS,UAAU;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,GAAG,mBAAmB,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UAClD,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,sBACP,OACA,UACA,QACqB;AACrB,QAAM,aAAa,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAU,CAAC;AAC5E,QAAM,UAAU,qBAAqB,MAAM;AAC3C,QAAM,wBAAwB,IAAI;AAAA,IAChC,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,aAAa,MAAM,CAAU;AAAA,EAC/D;AACA,QAAM,mBAAmB,WACrB;AAAA,IACE,SAAS,YAAY,CAAC;AAAA,IACtB;AAAA,IACA,0BAA0B,SAAS,EAAE;AAAA,EACvC,IACA,oBAAI,IAAI;AACZ,QAAM,mBAAmB;AAAA,IACvB,MAAM,YAAY,CAAC;AAAA,IACnB;AAAA,IACA,iBAAiB,MAAM,EAAE;AAAA,EAC3B;AAEA,MAAI,UAAU;AACZ,eAAW,eAAe,iBAAiB,KAAK,GAAG;AACjD,UAAI,CAAC,iBAAiB,IAAI,WAAW,GAAG;AACtC,cAAM,IAAI;AAAA,UACR,iBAAiB,MAAM,EAAE,iDAAiD,SAAS,EAAE;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,WACnB,IAAI;AAAA,IACF,CAAC,GAAG,iBAAiB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ,MAAM;AAAA,MACvD;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,GAAI,iBAAiB,IAAI,GAAG,KAAK,CAAC;AAAA,QAClC,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH,IACA;AAEJ,aAAW,CAAC,aAAa,QAAQ,KAAK,eAAe,QAAQ,GAAG;AAC9D,UAAM,SAAS,sBAAsB,IAAI,WAAW;AACpD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR,+BAA+B,MAAM,EAAE;AAAA,MACzC;AAAA,IACF;AACA,0BAAsB,IAAI,aAAa;AAAA,MACrC,GAAG;AAAA,MACH,QAAQ,SAAS,UAAU;AAAA,MAC3B,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,SAAS,UAAU;AAAA,IAC7B,CAAC;AAAA,EACH;AAEA,SAAO,CAAC,GAAG,sBAAsB,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,MAAM,UACrD,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EAChC;AACF;AAEA,SAAS,cAAc,UAAgC,WAAqB;AAC1E,QAAM,iBAAiB,SAAS,kBAAkB,CAAC;AACnD,QAAM,sBAAsB,IAAI;AAAA,IAC9B,eACG,OAAO,0BAA0B,EACjC,IAAI,CAAC,kBAAkB,CAAC,cAAc,IAAI,aAAa,CAAU;AAAA,EACtE;AACA,QAAM,kBAAkB,IAAI;AAAA,IAC1B,eACG,OAAO,sBAAsB,EAC7B,IAAI,CAAC,kBAAkB,CAAC,cAAc,IAAI,aAAa,CAAU;AAAA,EACtE;AACA,QAAM,qBAAqB,IAAI;AAAA,IAC7B,eACG,OAAO,yBAAyB,EAChC,IAAI,CAAC,kBAAkB,CAAC,cAAc,IAAI,aAAa,CAAU;AAAA,EACtE;AAEA,UAAQ,SAAS,UAAU,CAAC,GAAG,IAAI,CAAC,UAAyB;AAC3D,UAAM,kBACJ,MAAM,UAAU,cACZ,UAAU,IAAI,CAAC,aAAa,GAAG,MAAM,EAAE,IAAI,QAAQ,EAAE,IACrD,CAAC,MAAM,EAAE;AAEf,QAAI,eAAe,KAAK,GAAG;AACzB,YAAM,WAAW;AACjB,YAAMC,YAAW,MAAM,aACnB,gBAAgB,IAAI,MAAM,UAAU,IACpC;AACJ,YAAM,SAAS,iBAAiB,UAAUA,SAAQ;AAClD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAAA;AAAA,QACA,aAAa,SAAS,UAAUA,WAAU;AAAA,QAC1C;AAAA,QACA,mBACE,SAAS,qBAAqBA,WAAU;AAAA,QAC1C,mBACE,SAAS,qBAAqBA,WAAU;AAAA,QAC1C,kBACE,SAAS,oBAAoBA,WAAU;AAAA,QACzC,oBACE,SAAS,sBAAsBA,WAAU;AAAA,QAC3C;AAAA,QACA,eAAe,wBAAwB,UAAUA,WAAU,MAAM;AAAA,QACjE,kBAAkB;AAAA,UAChB;AAAA,UACAA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO,gBAAgB,UAAUA,WAAU,MAAM;AAAA,QACjD,UAAU,mBAAmB,UAAUA,WAAU,MAAM;AAAA,MACzD;AAAA,IACF;AAEA,QAAI,kBAAkB,KAAK,GAAG;AAC5B,YAAM,cAAc;AACpB,YAAMA,YAAW,MAAM,aACnB,mBAAmB,IAAI,MAAM,UAAU,IACvC;AACJ,YAAM,SAAS,oBAAoB,aAAaA,SAAQ;AACxD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,UAAAA;AAAA,QACA,aAAa,YAAY,UAAUA,WAAU;AAAA,QAC7C;AAAA,QACA,mBACE,YAAY,qBAAqBA,WAAU;AAAA,QAC7C,mBACE,YAAY,qBAAqBA,WAAU;AAAA,QAC7C,sBACE,YAAY,wBAAwBA,WAAU;AAAA,QAChD,uBACE,YAAY,yBAAyBA,WAAU;AAAA,QACjD,kBACE,YAAY,oBAAoBA,WAAU;AAAA,QAC5C,oBACE,YAAY,sBAAsBA,WAAU;AAAA,QAC9C;AAAA,QACA,WAAW;AAAA,UACT,GAAIA,WAAU,aAAa,CAAC;AAAA,UAC5B,GAAI,YAAY,aAAa,CAAC;AAAA,QAChC;AAAA,QACA,YAAY;AAAA,UACVA,WAAU,cAAc,CAAC;AAAA,UACzB,YAAY,cAAc,CAAC;AAAA,QAC7B;AAAA,QACA,OAAO,mBAAmB,aAAaA,WAAU,MAAM;AAAA,QACvD,UAAU,sBAAsB,aAAaA,WAAU,MAAM;AAAA,MAC/D;AAAA,IACF;AAEA,UAAM,eAAe;AACrB,UAAM,WAAW,MAAM,aACnB,oBAAoB,IAAI,MAAM,UAAU,IACxC;AACJ,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP;AAAA,MACA,aAAa,aAAa,UAAU,UAAU;AAAA,MAC9C;AAAA,MACA,mBACE,aAAa,qBAAqB,UAAU;AAAA,MAC9C,mBACE,aAAa,qBAAqB,UAAU;AAAA,MAC9C,sBACE,aAAa,wBAAwB,UAAU;AAAA,MACjD,uBACE,aAAa,yBAAyB,UAAU;AAAA,MAClD,QAAQ;AAAA,QACN,UAAU,UAAU,CAAC;AAAA,QACrB,aAAa,UAAU,CAAC;AAAA,MAC1B;AAAA,MACA,WAAW;AAAA,QACT,GAAI,UAAU,aAAa,CAAC;AAAA,QAC5B,GAAI,aAAa,aAAa,CAAC;AAAA,MACjC;AAAA,MACA,YAAY;AAAA,QACV,UAAU,cAAc,CAAC;AAAA,QACzB,aAAa,cAAc,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,wBAAwB,MAGQ;AACvC,SACE,OAAO,KAAK,OAAO,YAAY,KAAK,GAAG,SAAS,MAAM,KAAK,SAAS,OAAO;AAE/E;AAEA,SAAS,+BACP,OAKQ;AACR,QAAM,WAAW,MAAM;AAAA,IAAQ,CAAC,SAC9B,KAAK,QAAQ;AAAA,MACX,CAAC,WAAW;AAAA;AAAA;AAAA,4BAGU,MAAM,KAAK,IAAI,CAAC;AAAA,0BAClB,MAAM,KAAK,EAAE,CAAC;AAAA;AAAA,4BAEZ,MAAM,MAAM,CAAC;AAAA;AAAA;AAAA,IAGrC;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT;AAEA,SAAO,SAAS,KAAK,WAAW;AAClC;AAEA,SAAS,gBACP,eACkB;AAClB,QAAM,WAAW,yBAAyB,aAAa;AACvD,QAAM,YAAY,MAAM;AAAA,IACtB,EAAE,QAAQ,SAAS,QAAQ,WAAW;AAAA,IACtC,CAAC,GAAG,UAAU,UAAU,QAAQ,CAAC;AAAA,EACnC;AACA,QAAM,eAAe,SAAS,SAAS,CAAC,GAAG;AAAA,IACzC,CAAC,SAAS,KAAK,UAAU;AAAA,EAC3B;AACA,QAAM,eAAe,SAAS,SAAS,CAAC,GAAG;AAAA,IACzC,CAAC,SAAS,KAAK,UAAU;AAAA,EAC3B;AACA,QAAM,UAAU,cAAc,SAAS,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAC1E,QAAM,WAAW,SAAS,SAAS,IAAI,kBAAkB;AACzD,QAAM,aAAa,aAAa,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;AACrE,QAAM,YAAY;AAAA,IAChB,SAAS,QAAQ,CAAC,YAAY,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAAA,EACtE;AACA,QAAM,UAAU;AAAA,IACd,SAAS,QAAQ,CAAC,YAAY,QAAQ,MAAM,QAAQ,qBAAqB,CAAC;AAAA,EAC5E;AACA,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,aAAW,WAAW,UAAU;AAC9B,eAAW,QAAQ,QAAQ,OAAO;AAChC,iBAAW,UAAU,sBAAsB,IAAI,GAAG;AAChD,0BAAkB,IAAI,QAAQ,QAAQ,EAAE;AACxC,yBAAiB,IAAI,QAAQ,KAAK,YAAY,KAAK,IAAI;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,oBAAI,IAAsB;AACvD,aAAW,QAAQ,aAAa;AAC9B,yBAAqB;AAAA,MACnB,KAAK;AAAA,MACL,aAAa,KAAK,qBAAqB,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,QAAM,uBAAuB,oBAAI,IAAsB;AACvD,aAAW,QAAQ,aAAa;AAC9B,yBAAqB;AAAA,MACnB,KAAK;AAAA,MACL,aAAa,KAAK,qBAAqB,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,QAAM,qBAAqB,oBAAI,IAAsB;AACrD,aAAW,CAAC,QAAQC,WAAU,KAAK,qBAAqB,QAAQ,GAAG;AACjE,uBAAmB,IAAI,QAAQA,WAAU;AAAA,EAC3C;AACA,aAAW,CAAC,QAAQA,WAAU,KAAK,qBAAqB,QAAQ,GAAG;AACjE,uBAAmB,IAAI,QAAQA,WAAU;AAAA,EAC3C;AAEA,QAAM,2BAA2B,IAAI;AAAA,IACnC,WAAW,IAAI,CAAC,cAAkC,CAAC,WAAW,CAAC,CAAC,CAAC;AAAA,EACnE;AACA,aAAW,CAAC,QAAQ,iBAAiB,KAAK,qBAAqB,QAAQ,GAAG;AACxE,eAAW,aAAa,mBAAmB;AACzC,YAAMC,WAAU,yBAAyB,IAAI,SAAS,KAAK,CAAC;AAC5D,MAAAA,SAAQ,KAAK,MAAM;AACnB,+BAAyB,IAAI,WAAWA,QAAO;AAAA,IACjD;AAAA,EACF;AACA,aAAW,CAAC,WAAWA,QAAO,KAAK,yBAAyB,QAAQ,GAAG;AACrE,6BAAyB,IAAI,WAAW,aAAaA,QAAO,CAAC;AAAA,EAC/D;AAEA,QAAM,kBAAkB,IAAI,IAAI,YAAY,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAClE,QAAM,8BAA8B,IAAI;AAAA,IACtC,UAAU,IAAI,CAAC,aAAiC,CAAC,UAAU,CAAC,CAAC,CAAC;AAAA,EAChE;AACA,aAAW,WAAW,UAAU;AAC9B,eAAW,QAAQ,QAAQ,OAAO;AAChC,UACE,KAAK,MAAM,SAAS,UACpB,CAAC,gBAAgB,IAAI,KAAK,KAAK,MAAM,GACrC;AACA;AAAA,MACF;AACA,YAAMA,WAAU,4BAA4B,IAAI,KAAK,IAAI,KAAK,CAAC;AAC/D,MAAAA,SAAQ,KAAK,KAAK,KAAK,MAAM;AAC7B,kCAA4B,IAAI,KAAK,MAAMA,QAAO;AAAA,IACpD;AAAA,EACF;AACA,QAAM,6BAA6B,oBAAI,IAAoB;AAC3D,aAAW,CAAC,UAAUA,QAAO,KAAK,4BAA4B,QAAQ,GAAG;AACvE,UAAM,gBAAgB,aAAaA,QAAO;AAC1C,gCAA4B,IAAI,UAAU,aAAa;AACvD,UAAM,CAAC,UAAU,IAAI;AACrB,QAAI,cAAc,WAAW,KAAK,eAAe,QAAW;AAC1D,iCAA2B,IAAI,UAAU,UAAU;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,qBAAqB,IAAI;AAAA,KAC5B,SAAS,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS;AAAA,MACnC,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,IACrB,CAAC;AAAA,EACH;AACA,QAAM,cAAc;AAAA,KACjB,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,SAAS,EAAE;AAAA,EAC1D;AACA,QAAM,2BAA2B;AAAA,KAC9B,SAAS,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa;AAAA,MAC3C,SAAS;AAAA,MACT;AAAA,QACE,OAAO,SAAS;AAAA,QAChB,GAAI,SAAS,OAAO,EAAE,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,iBAAiB;AAAA,KACpB,SAAS,gBAAgB,CAAC,GAAG,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,EACzD;AACA,QAAM,kBAAkB;AAAA,KACrB,SAAS,iBAAiB,CAAC,GAAG,IAAI,CAAC,YAAY,QAAQ,EAAE;AAAA,EAC5D;AACA,QAAM,2BAA2B,IAAI;AAAA,KAClC,SAAS,gBAAgB,CAAC,GAAG,IAAI,CAAC,WAAW;AAAA,MAC5C,OAAO;AAAA,MACP,cAAc,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC;AAAA,IAChE,CAAC;AAAA,EACH;AACA,QAAM,mBAAmB,OAAO;AAAA,KAC7B,SAAS,gBAAgB,CAAC,GACxB,MAAM,EACN,KAAK,CAAC,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE,CAAC,EACrD,IAAI,CAAC,WAAW;AAAA,MACf,OAAO;AAAA,MACP;AAAA,QACE,IAAI,OAAO;AAAA,QACX,MAAM,OAAO;AAAA,QACb,aAAa,OAAO,eAAe;AAAA,QACnC,UAAU,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC,YAAY;AAAA,UAC/C,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,aAAa,OAAO,eAAe;AAAA,QACrC,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAAA,EACL;AACA,QAAM,oBAAoB,OAAO;AAAA,KAC9B,SAAS,iBAAiB,CAAC,GACzB,MAAM,EACN,KAAK,CAAC,MAAM,UAAU,KAAK,GAAG,cAAc,MAAM,EAAE,CAAC,EACrD,IAAI,CAAC,YAAY;AAAA,MAChB,QAAQ;AAAA,MACR;AAAA,QACE,IAAI,QAAQ;AAAA,QACZ,MAAM,QAAQ;AAAA,QACd,aAAa,QAAQ,eAAe;AAAA,QACpC,cAAc,QAAQ,eAClB,OAAO;AAAA,UACL,OAAO,QAAQ,QAAQ,YAAY,EAAE;AAAA,YACnC,CAAC,UACC,OAAO,MAAM,CAAC,MAAM;AAAA,UACxB;AAAA,QACF,IACA;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACL;AACA,QAAM,eAAe;AAAA,KAClB,SAAS,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc,UAAU,EAAE;AAAA,EAC7D;AACA,QAAM,uBAAuB,IAAI;AAAA,KAC9B,SAAS,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc;AAAA,MAC7C,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACA,QAAM,uBAAuB,IAAI;AAAA,KAC9B,SAAS,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc;AAAA,MAC7C,UAAU;AAAA,MACV,cAAc,UAAU,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AACA,QAAM,uBAAuB,oBAAI,IAAoB;AACrD,aAAW,QAAQ,SAAS,cAAc,CAAC,GAAG;AAC5C,eAAW,WAAW,cAAc,CAAC,IAAI,CAAC,GAAG;AAC3C,2BAAqB,IAAI,SAAS,KAAK,MAAM;AAAA,IAC/C;AAAA,EACF;AACA,QAAM,WAAW,aAAa,qBAAqB,KAAK,CAAC;AACzD,QAAM,aAAa;AAAA,KAChB,SAAS,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,QAAQ,EAAE;AAAA,EACvD;AACA,QAAM,qBAAqB,IAAI;AAAA,KAC5B,SAAS,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY;AAAA,MACzC,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,QAAM,qBAAqB,IAAI;AAAA,KAC5B,SAAS,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY;AAAA,MACzC,QAAQ;AAAA,MACR,cAAc,QAAQ,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AACA,QAAM,mBAAmB,oBAAI,IAAoB;AACjD,aAAW,QAAQ,SAAS,YAAY,CAAC,GAAG;AAC1C,eAAW,SAAS,cAAc,CAAC,IAAI,CAAC,GAAG;AACzC,uBAAiB,IAAI,OAAO,KAAK,MAAM;AAAA,IACzC;AAAA,EACF;AACA,QAAM,SAAS,aAAa,iBAAiB,KAAK,CAAC;AACnD,QAAM,kBAAkB;AAAA,IACtB,IAAI,SAAS,cAAc,CAAC,GAAG,QAAQ,CAAC,SAAS;AAC/C,UAAI,CAAC,wBAAwB,IAAI,GAAG;AAClC,eAAO,CAAC;AAAA,MACV;AACA,YAAM,UAAU,qBAAqB,IAAI,KAAK,MAAM,KAAK,CAAC;AAC1D,aAAO,QAAQ,SAAS,IACpB;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT;AAAA,QACF;AAAA,MACF,IACA,CAAC;AAAA,IACP,CAAC;AAAA,IACD,IAAI,SAAS,YAAY,CAAC,GAAG,QAAQ,CAAC,SAAS;AAC7C,UAAI,CAAC,wBAAwB,IAAI,GAAG;AAClC,eAAO,CAAC;AAAA,MACV;AACA,YAAM,UAAU,mBAAmB,IAAI,KAAK,MAAM,KAAK,CAAC;AACxD,aAAO,QAAQ,SAAS,IACpB;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT;AAAA,QACF;AAAA,MACF,IACA,CAAC;AAAA,IACP,CAAC;AAAA,EACH,EAAE;AAAA,IACA,CAAC,MAAM,UACL,KAAK,KAAK,cAAc,MAAM,IAAI,KAAK,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,EACzE;AACA,QAAM,iBAAiB,cAAc,UAAU,SAAS;AACxD,QAAM,mBAAmB;AAAA,KACtB,SAAS,kBAAkB,CAAC,GAAG,IAAI,CAAC,kBAAkB,cAAc,EAAE;AAAA,EACzE;AACA,QAAM,eAAe;AAAA,IACnB,eAAe,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,EAAE;AAAA,EAC5C;AACA,QAAM,WAAW;AAAA,IACf,eAAe,QAAQ,CAAC,UAAU,MAAM,eAAe;AAAA,EACzD;AACA,QAAM,eAAe;AAAA,IACnB,eACG,IAAI,CAAC,UAAU,MAAM,WAAW,EAChC,OAAO,CAAC,WAA6B,OAAO,WAAW,QAAQ;AAAA,EACpE;AACA,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,QAAM,mBAAmB,oBAAI,IAAsB;AACnD,QAAM,uBAAuB,oBAAI,IAAsB;AACvD,QAAM,mBAAmB,oBAAI,IAAsB;AACnD,QAAM,2BAA2B,oBAAI,IAAsB;AAC3D,QAAM,0BAA0B,oBAAI,IAAoB;AACxD,QAAM,mBAAmB,oBAAI,IAAsB;AACnD,QAAM,oBAAoB,oBAAI,IAAsB;AACpD,QAAM,uBAAuB,oBAAI,IAA2C;AAC5E,QAAM,mBAAmB,oBAAI,IAAsB;AACnD,QAAM,wBAAwB,oBAAI,IAAsB;AACxD,QAAM,yBAAyB,oBAAI,IAGjC;AACF,QAAM,2BAA2B,oBAAI,IAAsB;AAC3D,QAAM,kBAAkB,oBAAI,IAAsB;AAClD,QAAM,4BAA4B,oBAAI,IAAsC;AAC5E,QAAM,oBAAoB,oBAAI,IAAsB;AACpD,QAAM,8BAA8B,oBAAI,IAGtC;AACF,aAAW,iBAAiB,SAAS,kBAAkB,CAAC,GAAG;AACzD,4BAAwB,IAAI,cAAc,IAAI,cAAc,MAAM;AAClE,yBAAqB;AAAA,MACnB,cAAc;AAAA,MACd,aAAa,CAAC,GAAI,qBAAqB,IAAI,cAAc,MAAM,KAAK,CAAC,CAAE,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,aAAW,iBAAiB,gBAAgB;AAC1C,qBAAiB,IAAI,cAAc,MAAM,IAAI,cAAc,eAAe;AAC1E,qBAAiB;AAAA,MACf,cAAc,MAAM;AAAA,MACpB,aAAa;AAAA,QACX,GAAI,iBAAiB,IAAI,cAAc,MAAM,MAAM,KAAK,CAAC;AAAA,QACzD,GAAG,cAAc;AAAA,MACnB,CAAC;AAAA,IACH;AACA,yBAAqB;AAAA,MACnB,cAAc,MAAM;AAAA,MACpB,aAAa;AAAA,QACX,GAAI,qBAAqB,IAAI,cAAc,MAAM,MAAM,KAAK,CAAC;AAAA,QAC7D,cAAc,MAAM;AAAA,MACtB,CAAC;AAAA,IACH;AACA,QAAI,cAAc,MAAM,YAAY;AAClC,+BAAyB;AAAA,QACvB,cAAc,MAAM;AAAA,QACpB,aAAa;AAAA,UACX,GAAI,yBAAyB,IAAI,cAAc,MAAM,UAAU,KAC7D,CAAC;AAAA,UACH,cAAc,MAAM;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,kBAAkB,cAAc,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE;AACpE,UAAM,sBAAqD;AAAA,MACzD,cAAc,OAAO;AAAA,QACnB,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,UAAU,IAAI;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,sBACJ,cAAc,WAAW,QACrB,CAAC,IACD,cAAc,WAAW,IAAI,CAAC,cAAc,UAAU,EAAE;AAC9D,UAAM,wBAIJ,cAAc,WAAW,QACrB,CAAC,IACD;AAAA,MACE,cAAc,WAAW,IAAI,CAAC,cAAc;AAAA,QAC1C,UAAU;AAAA,QACV,UAAU,KAAK,SAAS,UACpB,EAAE,MAAM,SAAkB,SAAS,UAAU,KAAK,QAAQ,IAC1D,EAAE,MAAM,QAAiB;AAAA,MAC/B,CAAC;AAAA,IACH;AACN,UAAM,yBACJ,cAAc,WAAW,QACrB,CAAC,UAAU,IACX,cAAc,WAAW,WACvB,aAAa;AAAA,MACX;AAAA,MACA,GAAG,cAAc,UAAU,IAAI,CAAC,aAAa,SAAS,MAAM;AAAA,IAC9D,CAAC,IACD;AAAA,MACE,cAAc,UAAU,IAAI,CAAC,aAAa,SAAS,MAAM;AAAA,IAC3D;AACR,eAAW,kBAAkB,cAAc,iBAAiB;AAC1D,sBAAgB,IAAI,gBAAgB,cAAc,MAAM,MAAM;AAC9D,wBAAkB,IAAI,gBAAgB,eAAe;AACrD,2BAAqB,IAAI,gBAAgB,mBAAmB;AAC5D,4BAAsB,IAAI,gBAAgB,mBAAmB;AAC7D,6BAAuB,IAAI,gBAAgB,qBAAqB;AAChE,+BAAyB,IAAI,gBAAgB,sBAAsB;AAAA,IACrE;AACA,QAAI,cAAc,aAAa;AAC7B,uBAAiB;AAAA,QACf,cAAc;AAAA,QACd,aAAa;AAAA,UACX,GAAI,iBAAiB,IAAI,cAAc,WAAW,KAAK,CAAC;AAAA,UACxD,GAAG,cAAc;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AACA,eAAW,SAAS,cAAc,QAAQ;AACxC,UAAI,CAAC,MAAM,QAAQ;AACjB;AAAA,MACF;AACA,uBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aAAa,CAAC,GAAI,iBAAiB,IAAI,MAAM,MAAM,KAAK,CAAC,GAAI,MAAM,EAAE,CAAC;AAAA,MACxE;AAAA,IACF;AACA,QAAI,cAAc,WAAW,WAAW;AACtC,YAAM,wBAAkD,CAAC;AACzD,iBAAW,QAAQ,cAAc,OAAO;AACtC,YAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,QACF;AACA,wBAAgB;AAAA,UACd,KAAK;AAAA,UACL,aAAa,CAAC,GAAI,gBAAgB,IAAI,KAAK,MAAM,KAAK,CAAC,GAAI,KAAK,EAAE,CAAC;AAAA,QACrE;AACA,8BAAsB,KAAK,MAAM,IAAI,aAAa;AAAA,UAChD,GAAI,sBAAsB,KAAK,MAAM,KAAK,CAAC;AAAA,UAC3C,KAAK;AAAA,QACP,CAAC;AAAA,MACH;AACA,YAAM,0BAAoD,CAAC;AAC3D,iBAAW,UAAU,cAAc,UAAU;AAC3C,YAAI,CAAC,OAAO,QAAQ;AAClB;AAAA,QACF;AACA,0BAAkB;AAAA,UAChB,OAAO;AAAA,UACP,aAAa;AAAA,YACX,GAAI,kBAAkB,IAAI,OAAO,MAAM,KAAK,CAAC;AAAA,YAC7C,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA,gCAAwB,OAAO,MAAM,IAAI,aAAa;AAAA,UACpD,GAAI,wBAAwB,OAAO,MAAM,KAAK,CAAC;AAAA,UAC/C,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AACA,iBAAW,kBAAkB,cAAc,iBAAiB;AAC1D,kCAA0B,IAAI,gBAAgB,qBAAqB;AACnE,oCAA4B;AAAA,UAC1B;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,kBAAkB;AAAA,IACtB,MAAM,KAAK,yBAAyB,OAAO,CAAC,EAAE,KAAK;AAAA,EACrD;AACA,QAAM,UAAU;AAAA,IACd,eAAe;AAAA,MAAQ,CAAC,UACtB,MAAM,WAAW,YAAY,CAAC,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IACrE;AAAA,EACF;AACA,QAAM,cAAc,aAAa,gBAAgB,KAAK,CAAC;AACvD,QAAM,YAAY;AAAA,IAChB,eAAe;AAAA,MAAQ,CAAC,UACtB,MAAM,WAAW,YACb,CAAC,IACD,MAAM,SAAS,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,IAC9C;AAAA,EACF;AACA,QAAM,gBAAgB,aAAa,kBAAkB,KAAK,CAAC;AAC3D,QAAM,oBAAoB;AAAA,IACxB,eAAe;AAAA,MAAQ,CAAC,UACtB,MAAM,WAAW,QACb,CAAC,IACD,MAAM,WAAW,IAAI,CAAC,cAAc,UAAU,EAAE;AAAA,IACtD;AAAA,EACF;AACA,QAAM,WAAW;AAAA,IACf,eAAe,QAAQ,CAAC,UAAU,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAAA,EACzE;AACA,QAAM,eAAe;AAAA,IACnB,eAAe;AAAA,MAAQ,CAAC,UACtB,MAAM,OACH,IAAI,CAAC,UAAU,MAAM,MAAM,EAC3B,OAAO,CAAC,WAA6B,OAAO,WAAW,QAAQ;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,UAAiB,OAAqB;AAC7C,SAAO,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AACzC;AAEA,SAAS,iBAAiB,UAAqC;AAC7D,SAAO,CAAC,GAAG,QAAQ,EAChB,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,KAAK,IAAI;AACd;AAEA,SAAS,iCACP,UACA,UACA,gBACS;AACT,MAAI,yBAAyB,QAAQ,GAAG;AACtC,WAAO,UAAU,SAAS,OAAO;AAAA,EACnC;AACA,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,EACT;AAEA,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,SAAS,QAAQ,CAAC,KAAK;AAAA,IAChC,KAAK;AACH,aAAO,CAAC;AAAA,IACV,KAAK;AACH,aAAO;AAAA,QACL,SAAS,aAAa,EAAE,YAAY,SAAS,WAAW,IAAI;AAAA,QAC5D;AAAA,QACA;AAAA,MACF;AAAA,IACF,KAAK;AACH,aAAO,CAAC;AAAA,IACV,KAAK;AACH,aAAO,SAAS,QAAQ,CAAC,KAAK;AAAA,IAChC,KAAK;AACH,aAAO,SAAS,QAAQ,CAAC,KAAK;AAAA,IAChC,KAAK;AACH,aAAO,SAAS,UAAU,CAAC,KAAK;AAAA,IAClC,KAAK;AACH,aAAO,kBAAkB,SAAS,SAAS,CAAC,KAAK;AAAA,IACnD,KAAK;AACH,aAAO,SAAS,QAAQ,CAAC,KAAK;AAAA,IAChC,KAAK;AACH,aAAO,SAAS,UAAU,CAAC,KAAK;AAAA,IAClC,KAAK;AACH,cACG,iBACG,SAAS,kBAAkB,IAAI,cAAc,IAAI,CAAC,IAClD,WACJ,SAAS,SAAS,CAAC,KACnB;AAAA,IAEJ,KAAK;AACH,aAAO,SAAS,SAAS,CAAC,KAAK;AAAA,IACjC,KAAK;AACH,aAAO,SAAS,OAAO,CAAC,KAAK;AAAA,IAC/B,KAAK;AACH,aAAO,SAAS,YAAY,CAAC,KAAK;AAAA,EACtC;AACF;AAEA,SAAS,gCACP,QACA,UACA,gBACyB;AACzB,MAAI,CAAC,QAAQ,YAAY;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,QAAQ,MAAM;AAC7D,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO,UAAU,SAAY,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC;AAAA,IACjD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,kCACP,QACA,UACA,UACyB;AACzB,QAAM,eAAe,6BAA6B,MAAM,IACpD,0BAA0B,QAAQ,QAAQ,IAC1C;AACJ,SAAO,gCAAgC,cAAc,QAAQ;AAC/D;AAEO,SAAS,yBAAyB,SAIb;AAC1B,QAAM,WAAW,gBAAgB,QAAQ,QAAQ;AACjD,QAAM,WAAW,SAAS;AAC1B,QAAM,YAAY,CAAC,GAAG,QAAQ,SAAS;AAEvC,QAAM,QAAiD,CAAC;AACxD,QAAM,SAAkD,CAAC;AACzD,QAAM,OAAgD,CAAC;AACvD,QAAM,qBAA8D,CAAC;AACrE,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,QAAM,qBAAqB,oBAAI,IAAsB;AAErD,QAAM,wBAAwB,IAAI;AAAA,IAChC,SAAS,eAAe,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,IAAI,KAAK,CAAU;AAAA,EACzE;AACA,QAAM,+BAA+B,oBAAI,IAAiC;AAC1E,QAAM,iCAAiC,oBAAI,IAAiC;AAE5E,aAAW,iBAAiB,SAAS,gBAAgB;AACnD,QAAI,cAAc,WAAW,WAAW;AACtC;AAAA,IACF;AACA,iCAA6B;AAAA,MAC3B,cAAc,MAAM;AAAA,MACpB,IAAI;AAAA,QACF,cAAc,MAAM,IAAI,CAAC,SAAS;AAAA,UAChC,iBAAiB,KAAK,QAAQ;AAAA,UAC9B,KAAK;AAAA,QACP,CAAC;AAAA,MACH;AAAA,IACF;AACA,mCAA+B;AAAA,MAC7B,cAAc,MAAM;AAAA,MACpB,IAAI;AAAA,QACF,cAAc,SAAS,IAAI,CAAC,WAAW;AAAA,UACrC,iBAAiB,OAAO,QAAQ;AAAA,UAChC,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,uBAAuB,CAAC,aAA8C;AAC1E,UAAM,MAAM,KAAK,UAAU,QAAQ;AACnC,UAAM,WAAW,cAAc,IAAI,GAAG,KAAK;AAC3C,kBAAc,IAAI,KAAK,WAAW,CAAC;AACnC,WAAO;AAAA,EACT;AACA,QAAM,gBAAgB,IAAI,IAAoC;AAAA,IAC5D,GAAG,SAAS,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,QAAQ,CAAU;AAAA,IAClE,GAAG,SAAS,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,WAAW,CAAU;AAAA,EACvE,CAAC;AACD,QAAM,2BAA2B,oBAAI,IAAoB;AAEzD,QAAM,wBAAwB,CAC5B,aACA,SACA,YACG;AACH,UAAM,gBAAgB,sBAAsB,IAAI,WAAW;AAC3D,QAAI,eAAe,MAAM,UAAU,aAAa;AAC9C,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI;AAAA,UACR,GAAG,WAAW,kBAAkB,WAAW,GAAG,oCAAoC,WAAW;AAAA,QAC/F;AAAA,MACF;AACA,aAAO,GAAG,WAAW,IAAI,OAAO;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,CACzB,aACA,aAEA,6BACG,IAAI,WAAW,GACd,IAAI,iBAAiB,QAAQ,CAAC,KAAK,iBAAiB,QAAQ;AAElE,QAAM,uBAAuB,CAC3B,aACA,aAEA,+BACG,IAAI,WAAW,GACd,IAAI,iBAAiB,QAAQ,CAAC,KAAK,iBAAiB,QAAQ;AAElE,aAAW,WAAW,SAAS,UAAU;AACvC,UAAM,sBAAsB,mBAAmB,OAAO;AACtD,UAAM,UAAoB,CAAC;AAC3B,eAAW,QAAQ,oBAAoB,OAAO;AAC5C,YAAM,kBAAkB,sBAAsB,IAAI;AAClD,iBAAW,UAAU,iBAAiB;AACpC,gBAAQ,KAAK,MAAM;AACnB,cAAM,MAAM,IAAI;AAAA,UACd,IAAI;AAAA,UACJ,WAAW,oBAAoB;AAAA,UAC/B,UAAU,KAAK;AAAA,UACf,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,YAAY;AAAA,YACV,GAAG;AAAA,cACD,oBAAoB;AAAA,cACpB,KAAK;AAAA,cACL;AAAA,YACF;AAAA,YACA,GAAI,KAAK,cAAc,CAAC;AAAA,UAC1B;AAAA,QACF;AACA,YAAI,KAAK,MAAM,SAAS,QAAQ;AAC9B,gBAAM,eACJ,yBAAyB,IAAI,KAAK,KAAK,MAAM,KAAK;AACpD,mCAAyB,IAAI,KAAK,KAAK,QAAQ,eAAe,CAAC;AAC/D,6BAAmB,MAAM,IAAI;AAAA,YAC3B,MAAM;AAAA,YACN,QAAQ,KAAK,KAAK;AAAA,YAClB,UAAU;AAAA,YACV,UAAU;AAAA,UACZ;AAAA,QACF,WAAW,KAAK,MAAM,SAAS,YAAY;AACzC,6BAAmB,MAAM,IAAI;AAAA,YAC3B,MAAM;AAAA,YACN,UAAU,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,uBAAmB,IAAI,oBAAoB,IAAI,OAAO;AAAA,EACxD;AAEA,aAAW,QAAQ,SAAS,aAAa;AACvC,UAAM,mBAAmB,KAAK,oBAAoB,CAAC;AACnD,QAAI,CAAC,kBAAkB;AACrB;AAAA,IACF;AACA,UAAM,WAAW,QAAQ;AAAA,OACtB,mBAAmB,IAAI,gBAAgB,KAAK,CAAC,GAAG;AAAA,QAC/C,CAAC,WAAW,mBAAmB,MAAM,MAAM;AAAA,MAC7C;AAAA,IACF;AACA,aAAS,QAAQ,CAAC,QAAQ,UAAU;AAClC,yBAAmB,MAAM,IAAI;AAAA,QAC3B,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,IAAI;AAAA,KACxB,SAAS,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,IAAI,SAAS,CAAC;AAAA,EAC1E;AACA,QAAM,eAAe,IAAI;AAAA,KACtB,SAAS,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC;AAAA,EAClE;AAEA,QAAM,qBAAqB,CACzB,aACA,SACA,MACA,YAIG;AACH,QAAI,CAAC,MAAM;AACT,yBAAmB,WAAW,IAAI,EAAE,MAAM,WAAW;AACrD;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,yBAAmB,WAAW,IAAI;AAAA,QAChC,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,UAAU,qBAAqB;AAAA,UAC7B,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,UAAI,cAAc,IAAI,KAAK,MAAM,MAAM,aAAa;AAClD,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI;AAAA,YACR,GAAG,QAAQ,IAAI,YAAY,QAAQ,KAAK,mCAAmC,KAAK,MAAM;AAAA,UACxF;AAAA,QACF;AACA,2BAAmB,WAAW,IAAI;AAAA,UAChC,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,UAAU;AAAA,UACV,UAAU,qBAAqB;AAAA,YAC7B,MAAM;AAAA,YACN,QAAQ,KAAK;AAAA,YACb,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAEA,yBAAmB,WAAW,IAAI;AAAA,QAChC,MAAM;AAAA,QACN,QAAQ,KAAK;AAAA,QACb,UAAU;AAAA,QACV,UAAU,qBAAqB;AAAA,UAC7B,MAAM;AAAA,UACN,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,UAAU;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,GAAG,QAAQ,IAAI,aAAa,QAAQ,KAAK;AAAA,MAC3C;AACA,yBAAmB,WAAW,IAAI;AAAA,QAChC,MAAM;AAAA,QACN;AAAA,QACA,SAAS,KAAK;AAAA,QACd,UAAU,qBAAqB;AAAA,UAC7B,MAAM;AAAA,UACN;AAAA,UACA,SAAS,KAAK;AAAA,QAChB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,aAAa;AAC7B,YAAM,UAAU;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,GAAG,QAAQ,IAAI,aAAa,QAAQ,KAAK;AAAA,MAC3C;AACA,yBAAmB,WAAW,IAAI;AAAA,QAChC,MAAM;AAAA,QACN;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,UAAU,qBAAqB;AAAA,UAC7B,MAAM;AAAA,UACN;AAAA,UACA,aAAa,KAAK;AAAA,QACpB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,UAAU;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,GAAG,QAAQ,IAAI,aAAa,QAAQ,KAAK;AAAA,MAC3C;AACA,YAAM,SAAS,mBAAmB,KAAK,SAAS,KAAK,IAAI,MAAM;AAC/D,yBAAmB,WAAW,IAAI;AAAA,QAChC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,qBAAqB;AAAA,UAC7B,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,UAAU;AAC1B,YAAM,UAAU;AAAA,QACd,KAAK;AAAA,QACL;AAAA,QACA,GAAG,QAAQ,IAAI,aAAa,QAAQ,KAAK;AAAA,MAC3C;AACA,YAAM,WAAW,qBAAqB,KAAK,SAAS,KAAK,IAAI,MAAM;AACnE,yBAAmB,WAAW,IAAI;AAAA,QAChC,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU,qBAAqB;AAAA,UAC7B,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,uBAAmB,WAAW,IAAI,EAAE,MAAM,WAAW;AAAA,EACvD;AAEA,aAAW,CAAC,WAAW,IAAI,MAAM,SAAS,cAAc,CAAC,GAAG,QAAQ,GAAG;AACrE,UAAM,YAAY,eAAe,IAAI,KAAK,MAAM;AAChD,eAAW,eAAe,cAAc,CAAC,IAAI,CAAC,GAAG;AAC/C,aAAO,WAAW,IAAI;AAAA,QACpB,eAAe;AAAA,QACf,IAAI;AAAA,QACJ,aAAa,KAAK;AAAA,QAClB,WAAW,WAAW,QAAQ,KAAK;AAAA,QACnC,SAAS,KAAK,WAAW;AAAA,QACzB,YAAY;AAAA,UACV,GAAG;AAAA,YACD,SAAS,qBAAqB,IAAI,KAAK,MAAM;AAAA,YAC7C;AAAA,UACF;AAAA,UACA,GAAI,KAAK,UAAU,CAAC;AAAA,QACtB;AAAA,MACF;AACA,yBAAmB,aAAa,KAAK,SAAS,KAAK,MAAM;AAAA,QACvD,MAAM,uBAAuB,SAAS;AAAA,QACtC,OAAO,eAAe,KAAK,MAAM,KAAK,MAAM;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,CAAC,WAAW,IAAI,MAAM,SAAS,YAAY,CAAC,GAAG,QAAQ,GAAG;AACnE,UAAM,UAAU,aAAa,IAAI,KAAK,MAAM;AAC5C,eAAW,eAAe,cAAc,CAAC,IAAI,CAAC,GAAG;AAC/C,WAAK,WAAW,IAAI;AAAA,QAClB,eAAe;AAAA,QACf,IAAI;AAAA,QACJ,WAAW,KAAK;AAAA,QAChB,SAAS,SAAS,QAAQ,KAAK;AAAA,QAC/B,SAAS,KAAK,WAAW;AAAA,QACzB,OAAO,SAAS,SAAS;AAAA,QACzB,OAAO;AAAA,QACP,YAAY;AAAA,UACV,GAAG;AAAA,YACD,SAAS,mBAAmB,IAAI,KAAK,MAAM;AAAA,YAC3C;AAAA,UACF;AAAA,UACA,GAAI,KAAK,UAAU,CAAC;AAAA,QACtB;AAAA,MACF;AACA,yBAAmB,aAAa,KAAK,SAAS,KAAK,MAAM;AAAA,QACvD,MAAM,qBAAqB,SAAS;AAAA,QACpC,OAAO,aAAa,KAAK,MAAM,KAAK,MAAM;AAAA,MAC5C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,kBAA2D,CAAC;AAClE,QAAM,qBAA8D,CAAC;AACrE,QAAM,wBAAiE,CAAC;AAExE,aAAW,iBAAiB,SAAS,gBAAgB;AACnD,UAAM,mBAAmB;AAAA,MACvB,QAAQ,cAAc,MAAM;AAAA,MAC5B,QAAQ,cAAc;AAAA,MACtB,QAAQ,cAAc,eAAe;AAAA,MACrC,OAAO,cAAc,MAAM;AAAA,MAC3B,YAAY,cAAc,MAAM,cAAc;AAAA,MAC9C,QAAQ;AAAA,QACN,GAAG;AAAA,UACD,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QACA,GAAI,cAAc,MAAM,UAAU,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,cAAc,MAClB,OAAO;AAAA,MACL,SAAS,SAAS,IAAI,CAAC,YAAY;AACjC,cAAM,QAAQ,cAAc,OAAO;AAAA,UACjC,CAAC,UAAU,MAAM,OAAO;AAAA,QAC1B;AACA,cAAM,iBAAiB;AAAA,UACrB,IAAI;AAAA,UACJ,MAAM,SAAS,UAAU,QAAS,MAAM,QAAQ,OAAQ;AAAA,UACxD,QAAQ,OAAO,UAAU;AAAA,UACzB,QAAQ;AAAA,YACN,GAAG;AAAA,cACD,cAAc;AAAA,cACd;AAAA,YACF;AAAA,YACA,GAAI,OAAO,UAAU,CAAC;AAAA,UACxB;AAAA,UACA,QAAQ,SAAS,YAAY,QAAS,MAAM,UAAU,OAAQ;AAAA,QAChE;AAEA,YAAI,cAAc,WAAW,OAAO;AAClC,gBAAM,WAAW;AACjB,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,cACE,GAAG;AAAA,cACH,GAAG,UAAU,KAAK;AAAA,cAClB,GAAG,UAAU,KAAK;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,cAAc,WAAW,UAAU;AACrC,gBAAM,cAAc;AACpB,iBAAO;AAAA,YACL;AAAA,YACA;AAAA,cACE,GAAG;AAAA,cACH,KAAK,aAAa,OAAO;AAAA,cACzB,KAAK,aAAa,OAAO;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAEA,eAAO,CAAC,SAAS,cAAc;AAAA,MACjC,CAAC;AAAA,IACH;AAEF,UAAM,YACJ,cAAc,WAAW,QACrB,CAAC,IACD,cAAc,UAAU,IAAI,CAAC,cAAc;AAAA,MACzC,IAAI,SAAS,MAAM;AAAA,MACnB,QAAQ,SAAS;AAAA,MACjB,aAAa,SAAS;AAAA,MACtB,WAAW,SAAS;AAAA,MACpB,UAAU,SAAS,YAAY;AAAA,MAC/B,QAAQ;AAAA,QACN,GAAG;AAAA,UACD,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QACA,GAAI,SAAS,UAAU,CAAC;AAAA,MAC1B;AAAA,IACF,EAAE;AAER,UAAM,kBAAkB,CAAC,mBACvB,cAAc,WAAW,QACrB,CAAC,IACD,OAAO;AAAA,MACL,SAAS,kBAAkB,IAAI,CAAC,gBAAgB;AAC9C,cAAM,YAAY,cAAc,WAAW;AAAA,UACzC,CAAC,UAAU,MAAM,OAAO;AAAA,QAC1B;AACA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,MAAM,WAAW,QAAQ;AAAA,YACzB,MACE,WAAW,KAAK,SAAS,UACrB,EAAE,MAAM,SAAS,SAAS,UAAU,KAAK,QAAQ,IACjD,EAAE,MAAM,QAAQ;AAAA,YACtB,mBAAmB,WAAW;AAAA,YAC9B,QAAQ,SAAS,cAAc,cAAc,WAAW;AAAA,YACxD,QAAQ;AAAA,cACN,GAAG;AAAA,gBACD,cAAc;AAAA,gBACd;AAAA,gBACA;AAAA,cACF;AAAA,cACA,GAAI,WAAW,UAAU,CAAC;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEN,UAAM,QACJ,cAAc,WAAW,YACrB,CAAC,IACD,cAAc,MAAM,IAAI,CAAC,UAAU;AAAA,MACjC,IAAI,KAAK;AAAA,MACT,UAAU,CAAC,GAAG,KAAK,QAAQ;AAAA,MAC3B,QAAQ,KAAK,UAAU;AAAA,MACvB,OAAO,KAAK,SAAS;AAAA,MACrB,SAAS;AAAA,MACT,QAAQ;AAAA,QACN,GAAG;AAAA,UACD,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QACA,GAAI,KAAK,UAAU,CAAC;AAAA,MACtB;AAAA,IACF,EAAE;AAER,UAAM,WACJ,cAAc,WAAW,YACrB,CAAC,IACD,cAAc,SAAS,IAAI,CAAC,YAAY;AAAA,MACtC,IAAI,OAAO;AAAA,MACX,UAAU,CAAC,GAAG,OAAO,QAAQ;AAAA,MAC7B,QAAQ,OAAO,UAAU;AAAA,MACzB,OAAO,OAAO,SAAS;AAAA,MACvB,SAAS;AAAA,MACT,QAAQ;AAAA,QACN,GAAG;AAAA,UACD,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QACA,GAAI,OAAO,UAAU,CAAC;AAAA,MACxB;AAAA,IACF,EAAE;AAER,eAAW,kBAAkB,cAAc,iBAAiB;AAC1D,YAAM,WACJ,cAAc,MAAM,UAAU,cAC1B,eAAe,MAAM,cAAc,MAAM,GAAG,SAAS,CAAC,IACtD;AACN,YAAM,aAAa;AAAA,QACjB,IAAI;AAAA,QACJ,GAAG;AAAA,QACH;AAAA,QACA,QAAQ,UAAU,YAAY,CAAC;AAAA,QAC/B,WAAW,UAAU,SAAS;AAAA,QAC9B,YAAY,UAAU,gBAAgB,cAAc,CAAC;AAAA,QACrD,GAAI,cAAc,WAAW,QACzB;AAAA,UACE,aAAa,cAAc,MAAM,eAAe;AAAA,UAChD,OAAO,UAAU,KAAK;AAAA,UACtB,UAAU,UAAU,QAAQ;AAAA,QAC9B,IACA,cAAc,WAAW,WACvB;AAAA,UACE,OAAO,UAAU,KAAK;AAAA,UACtB,UAAU,UAAU,QAAQ;AAAA,QAC9B,IACA,CAAC;AAAA,MACT;AAEA,sBAAgB,cAAc,IAAI;AAClC,UAAI,cAAc,WAAW,OAAO;AAClC,2BAAmB,cAAc,IAAI;AAAA,MACvC;AACA,UAAI,cAAc,WAAW,UAAU;AACrC,8BAAsB,cAAc,IAAI;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAAO;AAAA,IACzB,SAAS,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAa,CAAC;AAAA,EAC9D;AACA,QAAM,iBAAiB,OAAO;AAAA,IAC5B,SAAS,YAAY,IAAI,CAAC,SAAS;AAAA,MACjC,KAAK;AAAA,MACL,OAAO;AAAA,QACL,UAAU,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAa,CAAC;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,iBAAiB,OAAO;AAAA,KAC3B,SAAS,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS;AAAA,MACnC,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,IACrB,CAAC;AAAA,EACH;AACA,QAAM,yBAAyB,OAAO;AAAA,IACpC,MAAM,KAAK,SAAS,mBAAmB,QAAQ,CAAC,EAAE;AAAA,MAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MACpE,KAAK,cAAc,KAAK;AAAA,IAC1B;AAAA,EACF;AACA,QAAM,iBAAiB,OAAO;AAAA,IAC5B,SAAS,YAAY,IAAI,CAAC,SAAS;AAAA,MACjC,KAAK;AAAA,MACL,KAAK,cAAc;AAAA,IACrB,CAAC;AAAA,EACH;AACA,QAAM,wBAAwB,CAAC,aAC7B,OAAO,aAAa,WAAW,WAAW,OAAO;AACnD,QAAM,sBAAsB,CAC1B,QACA,aACA,aACG;AACH,UAAM,OAAO,YAAY,MAAM;AAC/B,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,SAAK,KAAK,WAAW;AACrB,SAAK;AAAA,MACH,CAAC,MAAM,UACL,sBAAsB,mBAAmB,IAAI,GAAG,QAAQ,IACxD,sBAAsB,mBAAmB,KAAK,GAAG,QAAQ;AAAA,IAC7D;AAAA,EACF;AACA,QAAM,sBAAsB,CAC1B,QACA,UACA,aACA,aACG;AACH,UAAM,OAAO,eAAe,MAAM,IAAI,QAAQ;AAC9C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,SAAK,KAAK,WAAW;AACrB,SAAK;AAAA,MACH,CAAC,MAAM,UACL,sBAAsB,mBAAmB,IAAI,GAAG,QAAQ,IACxD,sBAAsB,mBAAmB,KAAK,GAAG,QAAQ;AAAA,IAC7D;AAAA,EACF;AAEA,aAAW,CAAC,aAAa,QAAQ,KAAK,OAAO,QAAQ,kBAAkB,GAAG;AACxE,YAAQ,SAAS,MAAM;AAAA,MACrB,KAAK;AACH;AAAA,UACE,SAAS;AAAA,UACT;AAAA,UACA,SAAS;AAAA,QACX;AACA;AAAA,MACF,KAAK;AACH;AAAA,UACE,SAAS;AAAA,UACT,SAAS;AAAA,UACT;AAAA,UACA,SAAS;AAAA,QACX;AACA;AAAA,MACF,KAAK;AACH;AAAA,UACE,SAAS;AAAA,UACT;AAAA,UACA,SAAS;AAAA,QACX;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AACA,QAAM,cAAc,OAAO;AAAA,IACzB,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC;AAAA,EACnD;AACA,QAAM,aAAa,OAAO;AAAA,IACxB,OAAO,KAAK,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EAC/D;AACA,QAAM,oBAAoB,OAAO;AAAA,IAC/B,UAAU,IAAI,CAAC,aAAa;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,QACL,SAAS,YAAY,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;AAAA,MAC1D;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,wBAAwB,CAC5B,aAII;AAAA,IACJ,aAAa;AAAA,IACb,SAAS,UAAU;AAAA,MACjB,CAAC,aAAa,CAAC,UAAU,QAAQ,QAAQ,CAAU;AAAA,IACrD;AAAA,EACF;AAEA,QAAM,qBAAqB,OAAO;AAAA,IAChC,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,QAAQ,OAAO,MAAM;AAAA,MACxD;AAAA,MACA,sBAAsB,OAAO;AAAA,IAC/B,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB,sBAAsB,iBAAiB;AAE7D,SAAO;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,oBAAoB;AAAA,IACtB;AAAA,IACA,OAAO,UAAU,WAAW;AAAA,IAC5B,OAAO,UAAU,kBAAkB;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,4BACP,QACQ;AACR,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI;AACJ,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBACE,OAAO,SAAS,OAAO,MAAM,SAAS,IAClC,OAAO,MAAM,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,KAAK,KAAK,IACpD;AACN;AAAA,IACF,KAAK;AACH,iBAAW,SAAS,4BAA4B,OAAO,KAAK,CAAC;AAC7D;AAAA,IACF,KAAK;AACH,iBAAW;AAAA,QACT,OAAO,aACH;AAAA,UACE,YAAY,OAAO;AAAA,QACrB,IACA;AAAA,MACN;AACA;AAAA,IACF,KAAK;AACH,iBAAW,kBAAkB,4BAA4B,OAAO,MAAM,CAAC;AACvE;AAAA,IACF;AACE,iBAAW;AACX;AAAA,EACJ;AACA,SAAO,OAAO,WAAW,GAAG,QAAQ,YAAY;AAClD;AAEA,SAAS,2BACP,QACQ;AACR,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI;AACJ,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBAAW;AACX;AAAA,IACF,KAAK;AACH,iBACE,OAAO,SAAS,OAAO,MAAM,SAAS,IAClC,WAAW,OAAO,MAAM,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,OAC/D;AACN;AAAA,IACF,KAAK;AACH,iBAAW,WAAW,2BAA2B,OAAO,KAAK,CAAC;AAC9D;AAAA,IACF,KAAK;AACH,iBAAW;AAAA,QACT,OAAO,aACH;AAAA,UACE,YAAY,OAAO;AAAA,QACrB,IACA;AAAA,MACN;AACA;AAAA,IACF,KAAK;AACH,iBAAW,wBAAwB,2BAA2B,OAAO,MAAM,CAAC;AAC5E;AAAA,IACF;AACE,iBAAW;AACX;AAAA,EACJ;AACA,MAAI,OAAO,UAAU;AACnB,eAAW,GAAG,QAAQ;AAAA,EACxB;AACA,MAAI,OAAO,UAAU;AACnB,eAAW,GAAG,QAAQ;AAAA,EACxB;AACA,MAAI,yBAAyB,MAAM,GAAG;AACpC,eAAW,GAAG,QAAQ,YAAY,KAAK,UAAU,OAAO,OAAO,CAAC;AAAA,EAClE;AACA,SAAO;AACT;AAEA,SAAS,0BACP,QACQ;AACR,MAAI,CAAC,UAAU,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAM,OAAO,QAAQ,OAAO,UAAU,EAC1C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,UAAM,WACJ,OAAO,YAAY,CAAC,yBAAyB,KAAK,IAAI,MAAM;AAC9D,WAAO,KAAK,MAAM,GAAG,CAAC,GAAG,QAAQ,KAAK,4BAA4B,KAAK,CAAC;AAAA,EAC1E,CAAC,EACA,KAAK,IAAI,CAAC;AAAA;AACf;AAEA,SAAS,yBACP,QACQ;AACR,MAAI,CAAC,UAAU,OAAO,KAAK,OAAO,UAAU,EAAE,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAe,OAAO,QAAQ,OAAO,UAAU,EACnD;AAAA,IACC,CAAC,CAAC,KAAK,KAAK,MACV,KAAK,MAAM,GAAG,CAAC,KAAK,2BAA2B,KAAK,CAAC;AAAA,EACzD,EACC,KAAK,IAAI,CAAC;AAAA;AACf;AAEA,SAAS,8BACP,UACQ;AACR,SAAO,SACJ,IAAI,CAAC,YAAY;AAChB,UAAM,WAAW,GAAG,aAAa,QAAQ,EAAE,CAAC;AAC5C,UAAM,aAAa,GAAG,QAAQ;AAE9B,QAAI,6BAA6B,QAAQ,UAAU,GAAG;AACpD,YAAM,aAAa,QAAQ;AAC3B,YAAM,gBAAgB,OAAO,QAAQ,WAAW,QAAQ,EAAE;AAAA,QACxD,CAAC,CAAC,QAAQ,MAAM;AACd,gBAAM,kBAAkB,uBAAuB,SAAS,QAAQ;AAChE,gBAAM,oBAAoB;AAAA,YACxB;AAAA,YACA;AAAA,UACF;AACA,gBAAM,SAAS,0BAA0B,YAAY,QAAQ;AAC7D,iBAAO,aAAa;AAAA,YAClB,eAAe,eAAe,MAAM,0BAA0B,MAAM,CAAC;AAAA,YACrE,gBAAgB,iBAAiB,MAAM,yBAAyB,MAAM,CAAC;AAAA,UACzE,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM,mBAAmB,OAAO,KAAK,WAAW,QAAQ,EAAE;AAAA,QACxD,CAAC,aAAa,uBAAuB,SAAS,QAAQ;AAAA,MACxD;AACA,YAAM,qBAAqB,OAAO,KAAK,WAAW,QAAQ,EAAE;AAAA,QAC1D,CAAC,aAAa,yBAAyB,SAAS,QAAQ;AAAA,MAC1D;AACA,YAAM,cACJ,mBAAmB,WAAW,IAC1B,sCACA,mBAAmB,WAAW,IAC5B,mBAAmB,CAAC,IACpB,YAAY,mBAAmB,KAAK,IAAI,CAAC;AAEjD,aAAO,aAAa;AAAA,QAClB,GAAG;AAAA,QACH,eAAe,QAAQ,MAAM,iBAAiB,KAAK,KAAK,KAAK,eAAe;AAAA,QAC5E,gBAAgB,UAAU,MAAM,WAAW;AAAA,QAC3C,eAAe,aAAa,QAAQ,EAAE,CAAC,YACrC,QAAQ,MACL,QAAQ,qBAAqB,EAC7B,IAAI,CAAC,WAAW,MAAM,MAAM,CAAC,EAC7B,KAAK,KAAK,KAAK,OACpB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,aAAa;AAAA,MAClB,eAAe,QAAQ,MAAM,0BAA0B,QAAQ,UAAU,CAAC;AAAA,MAC1E,gBAAgB,UAAU,MAAM,yBAAyB,QAAQ,UAAU,CAAC;AAAA,MAC5E,eAAe,aAAa,QAAQ,EAAE,CAAC,YACrC,QAAQ,MACL,QAAQ,qBAAqB,EAC7B,IAAI,CAAC,WAAW,MAAM,MAAM,CAAC,EAC7B,KAAK,KAAK,KAAK,OACpB;AAAA,IACF,CAAC;AAAA,EACH,CAAC,EACA,KAAK,MAAM;AAChB;AAEA,SAAS,uBACP,SACA,UACQ;AACR,MAAI,CAAC,6BAA6B,QAAQ,UAAU,GAAG;AACrD,WAAO,GAAG,aAAa,QAAQ,EAAE,CAAC;AAAA,EACpC;AACA,SAAO,GAAG,aAAa,QAAQ,EAAE,CAAC,GAAG,aAAa,QAAQ,CAAC;AAC7D;AAEA,SAAS,yBACP,SACA,UACQ;AACR,MAAI,CAAC,6BAA6B,QAAQ,UAAU,GAAG;AACrD,WAAO,GAAG,aAAa,QAAQ,EAAE,CAAC;AAAA,EACpC;AACA,SAAO,GAAG,uBAAuB,SAAS,QAAQ,CAAC;AACrD;AAEA,SAAS,sCACP,UACQ;AACR,QAAM,UAAU,SAAS,QAAQ,CAAC,YAAY;AAC5C,QAAI,6BAA6B,QAAQ,UAAU,GAAG;AACpD,aAAO,OAAO,KAAK,QAAQ,WAAW,QAAQ,EAAE;AAAA,QAC9C,CAAC,aACC,KAAK,MAAM,GAAG,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC,KAAK,yBAAyB,SAAS,QAAQ,CAAC;AAAA,MAC3F;AAAA,IACF;AACA,WAAO;AAAA,MACL,KAAK,MAAM,QAAQ,EAAE,CAAC,KAAK,aAAa,QAAQ,EAAE,CAAC;AAAA,IACrD;AAAA,EACF,CAAC;AACD,SAAO;AAAA,EAAkF,QAAQ,KAAK,IAAI,CAAC;AAAA;AAC7G;AAEA,SAAS,0BACP,UACA,YACA,QACQ;AACR,SAAO,aAAa;AAAA,IAClB,eAAe,QAAQ,MAAM,0BAA0B,MAAM,CAAC;AAAA,IAC9D,gBAAgB,UAAU,MAAM,yBAAyB,MAAM,CAAC;AAAA,EAClE,CAAC;AACH;AAEA,SAAS,YAAY,SAAyB;AAC5C,SAAO,aAAa,OAAO;AAC7B;AAEA,SAAS,oBAAoB,SAAyB;AACpD,SAAO,GAAG,YAAY,OAAO,CAAC;AAChC;AAEA,SAAS,yBAAyB,SAAyB;AACzD,SAAO,GAAG,YAAY,OAAO,CAAC;AAChC;AAEA,SAAS,4BAA4B,SAAyB;AAC5D,SAAO,GAAG,YAAY,OAAO,CAAC;AAChC;AAEA,SAAS,6BAA6B,SAAyB;AAC7D,SAAO,GAAG,YAAY,OAAO,CAAC;AAChC;AAEA,SAAS,sBAAsB,SAAyB;AACtD,SAAO,GAAG,YAAY,OAAO,CAAC;AAChC;AAEA,SAAS,wBAAwB,SAAyB;AACxD,SAAO,GAAG,YAAY,OAAO,CAAC;AAChC;AAEA,SAAS,oBAAoB,QAAwB;AACnD,SAAO,GAAG,aAAa,MAAM,CAAC;AAChC;AAEA,SAAS,kBAAkB,QAAwB;AACjD,SAAO,GAAG,aAAa,MAAM,CAAC;AAChC;AAEA,SAAS,4BAA4B,UAAoC;AACvE,QAAM,WAAqB,CAAC;AAE5B,aAAW,SAAS,SAAS,gBAAgB;AAC3C,aAAS;AAAA,MACP;AAAA,QACE,oBAAoB,MAAM,MAAM,EAAE;AAAA,QAClC,GAAG,oBAAoB,MAAM,MAAM,EAAE,CAAC;AAAA,QACtC,MAAM;AAAA,MACR;AAAA,IACF;AACA,aAAS;AAAA,MACP;AAAA,QACE,yBAAyB,MAAM,MAAM,EAAE;AAAA,QACvC,GAAG,yBAAyB,MAAM,MAAM,EAAE,CAAC;AAAA,QAC3C,MAAM;AAAA,MACR;AAAA,IACF;AACA,QAAI,MAAM,WAAW,OAAO;AAC1B,eAAS;AAAA,QACP;AAAA,UACE,4BAA4B,MAAM,MAAM,EAAE;AAAA,UAC1C,GAAG,4BAA4B,MAAM,MAAM,EAAE,CAAC;AAAA,UAC9C,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,6BAA6B,MAAM,MAAM,EAAE;AAAA,UAC3C,GAAG,6BAA6B,MAAM,MAAM,EAAE,CAAC;AAAA,UAC/C,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,WAAW,WAAW;AAC9B,eAAS;AAAA,QACP;AAAA,UACE,sBAAsB,MAAM,MAAM,EAAE;AAAA,UACpC,GAAG,sBAAsB,MAAM,MAAM,EAAE,CAAC;AAAA,UACxC,MAAM;AAAA,QACR;AAAA,QACA;AAAA,UACE,wBAAwB,MAAM,MAAM,EAAE;AAAA,UACtC,GAAG,wBAAwB,MAAM,MAAM,EAAE,CAAC;AAAA,UAC1C,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,eAAe,SAAS,cAAc;AAC/C,aAAS;AAAA,MACP;AAAA,QACE,oBAAoB,WAAW;AAAA,QAC/B,GAAG,oBAAoB,WAAW,CAAC;AAAA,QACnC,SAAS,qBAAqB,IAAI,WAAW;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,aAAW,aAAa,SAAS,YAAY;AAC3C,aAAS;AAAA,MACP;AAAA,QACE,kBAAkB,SAAS;AAAA,QAC3B,GAAG,kBAAkB,SAAS,CAAC;AAAA,QAC/B,SAAS,mBAAmB,IAAI,SAAS;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,SAAO,SAAS,KAAK,MAAM;AAC7B;AAEA,SAAS,yBAAyB,UAAoC;AACpE,QAAM,eAAe,SAAS,eAC3B;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,oBAAoB,MAAM,MAAM,EAAE,CAAC;AAAA,IACtE;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,eAAe,SAAS,eAC3B;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,yBAAyB,MAAM,MAAM,EAAE,CAAC;AAAA,IAC3E;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,kBAAkB,SAAS,eAC9B;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KACxB,MAAM,WAAW,QACb,kBACA,4BAA4B,MAAM,MAAM,EAAE,CAChD;AAAA,IACJ;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,mBAAmB,SAAS,eAC/B;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KACxB,MAAM,WAAW,QACb,kBACA,6BAA6B,MAAM,MAAM,EAAE,CACjD;AAAA,IACJ;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,cAAc,SAAS,eAC1B,OAAO,CAAC,UAAqC,MAAM,WAAW,KAAK,EACnE;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,sBAAsB,MAAM,MAAM,EAAE,CAAC;AAAA,IACxE;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,oBAAoB,SAAS,eAChC,OAAO,CAAC,UAAwC,MAAM,WAAW,QAAQ,EACzE;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,sBAAsB,MAAM,MAAM,EAAE,CAAC;AAAA,IACxE;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,mBAAmB,SAAS,eAC/B;AAAA,IACC,CAAC,UACC,MAAM,WAAW;AAAA,EACrB,EACC;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,sBAAsB,MAAM,MAAM,EAAE,CAAC;AAAA,IACxE;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,gBAAgB,SAAS,eAC5B,OAAO,CAAC,UAAqC,MAAM,WAAW,KAAK,EACnE;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,wBAAwB,MAAM,MAAM,EAAE,CAAC;AAAA,IAC1E;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,sBAAsB,SAAS,eAClC,OAAO,CAAC,UAAwC,MAAM,WAAW,QAAQ,EACzE;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,wBAAwB,MAAM,MAAM,EAAE,CAAC;AAAA,IAC1E;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,qBAAqB,SAAS,eACjC;AAAA,IACC,CAAC,UACC,MAAM,WAAW;AAAA,EACrB,EACC;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK,wBAAwB,MAAM,MAAM,EAAE,CAAC;AAAA,IAC1E;AAAA,EACF,EACC,KAAK,IAAI;AACZ,QAAM,eAAe,SAAS,aAC3B,IAAI,CAAC,WAAW,KAAK,MAAM,MAAM,CAAC,KAAK,oBAAoB,MAAM,CAAC,GAAG,EACrE,KAAK,IAAI;AACZ,QAAM,aAAa,SAAS,WACzB,IAAI,CAAC,WAAW,KAAK,MAAM,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,GAAG,EACnE,KAAK,IAAI;AAEZ,SAAO,aAAa;AAAA,IAClB;AAAA,EAAyC,YAAY;AAAA;AAAA,IACrD;AAAA,EAA8C,YAAY;AAAA;AAAA,IAC1D;AAAA,EAAiD,eAAe;AAAA;AAAA,IAChE;AAAA,EAAkD,gBAAgB;AAAA;AAAA,IAClE,wCACE,YAAY,SAAS,IAAI;AAAA,EAAM,WAAW;AAAA,KAAQ,uBACpD;AAAA,IACA,0CACE,cAAc,SAAS,IACnB;AAAA,EAAM,aAAa;AAAA,KACnB,uBACN;AAAA,IACA,2CACE,kBAAkB,SAAS,IACvB;AAAA,EAAM,iBAAiB;AAAA,KACvB,uBACN;AAAA,IACA,6CACE,oBAAoB,SAAS,IACzB;AAAA,EAAM,mBAAmB;AAAA,KACzB,uBACN;AAAA,IACA,0CACE,iBAAiB,SAAS,IACtB;AAAA,EAAM,gBAAgB;AAAA,KACtB,uBACN;AAAA,IACA,4CACE,mBAAmB,SAAS,IACxB;AAAA,EAAM,kBAAkB;AAAA,KACxB,uBACN;AAAA,IACA,qCACE,aAAa,SAAS,IAClB;AAAA,EAAM,YAAY;AAAA,KAClB,+BACN;AAAA,IACA,mCACE,WAAW,SAAS,IAChB;AAAA,EAAM,UAAU;AAAA,KAChB,+BACN;AAAA,EACF,CAAC;AACH;AAEA,SAAS,0BAA0B,UAAoC;AACrE,MAAI,SAAS,QAAQ,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT;AAEA,SAAS,6BAA6B,UAAoC;AACxE,MAAI,SAAS,QAAQ,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBT;AAEA,SAAS,2BAA2B,UAAoC;AACtE,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAe,SAAS,SAC5B,IAAI,CAAC,YAAY;AAChB,UAAM,cAAc,SAAS,qBAAqB,IAAI,OAAO,KAAK;AAClE,WAAO,KAAK,MAAM,OAAO,CAAC;AAAA;AAAA,oBAEZ,MAAM,OAAO,CAAC;AAAA,6BACL,MAAM,WAAW,CAAC;AAAA;AAAA;AAAA,kBAIzC,cACI,GAAG,oBAAoB,WAAW,CAAC,WACnC,qBACN;AAAA;AAAA,EAEA,CAAC,EACA,KAAK,IAAI,CAAC;AAAA;AACf;AAEA,SAAS,yBAAyB,UAAoC;AACpE,MAAI,SAAS,OAAO,WAAW,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAe,SAAS,OAC5B,IAAI,CAAC,UAAU;AACd,UAAM,YAAY,SAAS,iBAAiB,IAAI,KAAK,KAAK;AAC1D,UAAM,WAAW,SAAS,SAAS,YAAY,CAAC,GAAG;AAAA,MACjD,CAAC,cAAc,UAAU,OAAO;AAAA,IAClC;AACA,WAAO,KAAK,MAAM,KAAK,CAAC;AAAA;AAAA,oBAEV,MAAM,KAAK,CAAC;AAAA,2BACL,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA,uBAGpB,SAAS,SAAS,CAAC;AAAA;AAAA,kBAGpC,YACI,GAAG,kBAAkB,SAAS,CAAC,WAC/B,qBACN;AAAA;AAAA,EAEA,CAAC,EACA,KAAK,IAAI,CAAC;AAAA;AACf;AAEA,SAAS,8BACP,OACA,gBACQ;AACR,QAAM,WACJ,MAAM,MAAM,UAAU,cAClB,eAAe,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,IAC9C;AACN,SAAO;AAAA,oBACW,MAAM,cAAc,CAAC;AAAA,wBACjB,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA;AAAA,cAGvC,MAAM,cACF,aAAa,MAAM,MAAM,WAAW,CAAC,MACrC,uCACN;AAAA,uBACmB,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,gBAEzC,WACI,aAAa,MAAM,QAAQ,CAAC,MAC5B,oCACN;AAAA;AAAA,cAEU,GAAG,oBAAoB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAgB1C,GAAG,yBAAyB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAWnD,GAAG,4BAA4B,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBActD,GAAG,6BAA6B,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAIzE;AAEA,SAAS,0BACP,OACA,gBACQ;AACR,QAAM,WACJ,MAAM,MAAM,UAAU,cAClB,eAAe,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,IAC9C;AACN,SAAO;AAAA,oBACW,MAAM,cAAc,CAAC;AAAA,wBACjB,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA;AAAA,cAGvC,MAAM,cACF,aAAa,MAAM,MAAM,WAAW,CAAC,MACrC,uCACN;AAAA,uBACmB,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,gBAEzC,WACI,aAAa,MAAM,QAAQ,CAAC,MAC5B,oCACN;AAAA;AAAA,cAEU,GAAG,oBAAoB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAU1C,GAAG,yBAAyB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAuBnD,GAAG,sBAAsB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAUhD,GAAG,wBAAwB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAIpE;AAEA,SAAS,6BACP,OACA,gBACQ;AACR,QAAM,WACJ,MAAM,MAAM,UAAU,cAClB,eAAe,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,IAC9C;AACN,SAAO;AAAA,oBACW,MAAM,cAAc,CAAC;AAAA,wBACjB,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA;AAAA,cAGvC,MAAM,cACF,aAAa,MAAM,MAAM,WAAW,CAAC,MACrC,uCACN;AAAA,uBACmB,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,gBAEzC,WACI,aAAa,MAAM,QAAQ,CAAC,MAC5B,oCACN;AAAA;AAAA,cAEU,GAAG,oBAAoB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAU1C,GAAG,yBAAyB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAWnD,GAAG,4BAA4B,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBActD,GAAG,6BAA6B,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAUvD,GAAG,sBAAsB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAUhD,GAAG,wBAAwB,MAAM,MAAM,EAAE,CAAC,QAAQ;AAAA;AAAA;AAAA;AAIpE;AAEA,SAAS,2BAA2B,UAAoC;AACtE,MAAI,SAAS,SAAS,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAe,SAAS,eAC5B;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB,IAAI,CAAC,mBAAmB;AAC5C,YAAM,SACJ,MAAM,WAAW,QACb,0BAA0B,OAAO,cAAc,IAC/C,MAAM,WAAW,WACf,6BAA6B,OAAO,cAAc,IAClD,8BAA8B,OAAO,cAAc;AAC3D,aAAO,KAAK,MAAM,cAAc,CAAC,KAAK,MAAM;AAAA,IAC9C,CAAC;AAAA,EACH,EACC,KAAK,IAAI,CAAC;AAAA;AACf;AAEA,SAAS,8BAA8B,UAAoC;AACzE,QAAM,YAAY,SAAS,eAAe;AAAA,IACxC,CAAC,UAAqC,MAAM,WAAW;AAAA,EACzD;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAe,UACnB;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF,EACC,KAAK,IAAI,CAAC;AAAA;AACf;AAEA,SAAS,iCAAiC,UAAoC;AAC5E,QAAM,eAAe,SAAS,eAAe;AAAA,IAC3C,CAAC,UAAwC,MAAM,WAAW;AAAA,EAC5D;AACA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,EAAe,aACnB;AAAA,IAAQ,CAAC,UACR,MAAM,gBAAgB;AAAA,MACpB,CAAC,mBACC,KAAK,MAAM,cAAc,CAAC,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACL;AAAA,EACF,EACC,KAAK,IAAI,CAAC;AAAA;AACf;AAEA,SAAS,0BAA0B,UAAoC;AACrE,QAAM,mBAAmB,0BAA0B,SAAS,gBAAgB;AAC5E,QAAM,uBAAuB;AAAA,IAC3B,SAAS;AAAA,EACX;AACA,QAAM,mBAAmB,0BAA0B,SAAS,gBAAgB;AAC5E,QAAM,2BAA2B;AAAA,IAC/B,SAAS;AAAA,EACX;AACA,QAAM,kBAAkB,mBAAmB,SAAS,eAAe;AACnE,QAAM,0BAA0B;AAAA,IAC9B,SAAS;AAAA,EACX;AACA,QAAM,mBAAmB,0BAA0B,SAAS,gBAAgB;AAC5E,QAAM,oBAAoB;AAAA,IACxB,SAAS;AAAA,EACX;AACA,QAAM,uBAAuB;AAAA,IAC3B,aAAa,SAAS,oBAAoB;AAAA,EAC5C;AACA,QAAM,mBAAmB,0BAA0B,SAAS,gBAAgB;AAC5E,QAAM,wBAAwB;AAAA,IAC5B,SAAS;AAAA,EACX;AACA,QAAM,yBAAyB;AAAA,IAC7B,aAAa,SAAS,sBAAsB;AAAA,EAC9C;AACA,QAAM,2BAA2B;AAAA,IAC/B,SAAS;AAAA,EACX;AACA,QAAM,kBAAkB,0BAA0B,SAAS,eAAe;AAC1E,QAAM,4BAA4B;AAAA,IAChC,aAAa,SAAS,yBAAyB;AAAA,EACjD;AACA,QAAM,oBAAoB;AAAA,IACxB,SAAS;AAAA,EACX;AACA,QAAM,8BAA8B;AAAA,IAClC,aAAa,SAAS,2BAA2B;AAAA,EACnD;AACA,QAAM,4BAA4B;AAAA,IAChC;AAAA,MACE,SAAS,eACN,OAAO,CAAC,UAAqC,MAAM,WAAW,KAAK,EACnE;AAAA,QAAQ,CAAC,UACR,MAAM,gBAAgB,IAAI,CAAC,mBAAmB;AAAA,UAC5C;AAAA,UACA,MAAM,cAAc,IAAI,CAAC,SAAS;AAChC,kBAAM,eAKF;AAAA,cACF,KAAK,UAAU,KAAK,GAAG;AAAA,cACvB,QAAQ;AAAA,gBACN,GAAG;AAAA,kBACD,MAAM;AAAA,kBACN;AAAA,gBACF;AAAA,gBACA,GAAI,KAAK,UAAU,CAAC;AAAA,cACtB;AAAA,YACF;AACA,gBAAI,KAAK,WAAW,QAAQ,KAAK,WAAW,QAAW;AACrD,2BAAa,SAAS,KAAK;AAAA,YAC7B;AACA,gBAAI,KAAK,UAAU,QAAQ,KAAK,UAAU,QAAW;AACnD,2BAAa,QAAQ,KAAK;AAAA,YAC5B;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACA,QAAM,+BAA+B;AAAA,IACnC;AAAA,MACE,SAAS,eACN,OAAO,CAAC,UAAqC,MAAM,WAAW,KAAK,EACnE;AAAA,QAAQ,CAAC,UACR,MAAM,gBAAgB,IAAI,CAAC,mBAAmB;AAAA,UAC5C;AAAA,UACA,MAAM,iBAAiB,IAAI,CAAC,WAAW;AACrC,kBAAM,eAKF;AAAA,cACF,KAAK,UAAU,OAAO,GAAG;AAAA,cACzB,QAAQ;AAAA,gBACN,GAAG;AAAA,kBACD,MAAM;AAAA,kBACN;AAAA,gBACF;AAAA,gBACA,GAAI,OAAO,UAAU,CAAC;AAAA,cACxB;AAAA,YACF;AACA,gBAAI,OAAO,WAAW,QAAQ,OAAO,WAAW,QAAW;AACzD,2BAAa,SAAS,OAAO;AAAA,YAC/B;AACA,gBAAI,OAAO,UAAU,QAAQ,OAAO,UAAU,QAAW;AACvD,2BAAa,QAAQ,OAAO;AAAA,YAC9B;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACA,QAAM,oCAAoC;AAAA,IACxC;AAAA,MACE,SAAS,eACN,OAAO,CAAC,UAAqC,MAAM,WAAW,KAAK,EACnE;AAAA,QAAQ,CAAC,UACR,MAAM,gBAAgB,IAAI,CAAC,mBAAmB;AAAA,UAC5C;AAAA,UACA;AAAA,YACE,MAAM,cAAc,IAAI,CAAC,SAAS;AAAA,cAChC,iBAAiB,KAAK,IAAI,MAAM;AAAA,cAChC,KAAK;AAAA,YACP,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AACA,QAAM,sCAAsC;AAAA,IAC1C;AAAA,MACE,SAAS,eACN,OAAO,CAAC,UAAqC,MAAM,WAAW,KAAK,EACnE;AAAA,QAAQ,CAAC,UACR,MAAM,gBAAgB,IAAI,CAAC,mBAAmB;AAAA,UAC5C;AAAA,UACA;AAAA,YACE,MAAM,iBAAiB,IAAI,CAAC,WAAW;AAAA,cACrC,iBAAiB,OAAO,IAAI,MAAM;AAAA,cAClC,OAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACJ;AAAA,EACF;AAOA,SAAO,kCAAkC,gBAAgB;AAAA,qCACtB,oBAAoB;AAAA,iCACxB,gBAAgB;AAAA,yCACR,wBAAwB;AAAA,gCACjC,eAAe;AAAA,wCACP,uBAAuB;AAAA,iCAC9B,gBAAgB;AAAA,kCACf,iBAAiB;AAAA,qCACd,oBAAoB;AAAA,iCACxB,gBAAgB;AAAA,sCACX,qBAAqB;AAAA,uCACpB,sBAAsB;AAAA,yCACpB,wBAAwB;AAAA,gCACjC,eAAe;AAAA,0CACL,yBAAyB;AAAA,kCACjC,iBAAiB;AAAA,4CACP,2BAA2B;AAAA,0CAC7B,yBAAyB;AAAA,6CACtB,4BAA4B;AAAA,kDACvB,iCAAiC;AAAA,oDAC/B,mCAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["HEX_CORNERS","HEX_CORNER_OFFSETS","cubeFromAxial","cornerGeometryKey","template","cardSetIds","zoneIds","isHexBoardTemplateSpec","isHexBoardSpec","renderCardInstanceIds","expandSeedIds","resolveHexSpaces"]}