@plasius/gpu-shared 0.1.11 → 0.1.14
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.
- package/CHANGELOG.md +58 -3
- package/README.md +110 -4
- package/assets/brigantine.gltf +549 -24
- package/assets/cutter.gltf +538 -0
- package/assets/harbor-dock.gltf +680 -0
- package/assets/lighthouse.gltf +604 -0
- package/dist/chunk-2GM64LB6.js +9 -0
- package/dist/chunk-2GM64LB6.js.map +1 -0
- package/dist/chunk-3ARPGHCQ.js +119 -0
- package/dist/chunk-3ARPGHCQ.js.map +1 -0
- package/dist/chunk-4ZJ24VRS.js +402 -0
- package/dist/chunk-4ZJ24VRS.js.map +1 -0
- package/dist/chunk-W5GA3VA6.js +442 -0
- package/dist/chunk-W5GA3VA6.js.map +1 -0
- package/dist/gltf-loader-YDPLZS5Q.js +8 -0
- package/dist/index.cjs +2432 -6424
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +45 -6
- package/dist/index.js.map +1 -1
- package/dist/product-studio-runtime-HDAUDWYO.js +11 -0
- package/dist/showcase-inline-assets-WT4PSNKI.js +7 -0
- package/dist/showcase-inline-assets-WT4PSNKI.js.map +1 -0
- package/dist/showcase-runtime-SNCUFSSC.js +3785 -0
- package/dist/showcase-runtime-SNCUFSSC.js.map +1 -0
- package/package.json +20 -8
- package/src/asset-url.js +62 -11
- package/src/feature-flags.js +2 -0
- package/src/gltf-loader.js +330 -32
- package/src/i18n.js +71 -0
- package/src/index.d.ts +187 -2
- package/src/index.js +42 -1
- package/src/product-studio-runtime.js +465 -0
- package/src/showcase-inline-assets.js +3 -0
- package/src/showcase-runtime.js +1779 -252
- package/src/translations/en-GB.js +55 -0
- package/dist/chunk-DGUM43GV.js +0 -11
- package/dist/chunk-OTCJ3VOK.js +0 -35
- package/dist/chunk-OTCJ3VOK.js.map +0 -1
- package/dist/chunk-QBMXJ3V2.js +0 -142
- package/dist/chunk-QBMXJ3V2.js.map +0 -1
- package/dist/gltf-loader-LKALCZAV.js +0 -8
- package/dist/showcase-runtime-2ZNPKD7D.js +0 -8593
- package/dist/showcase-runtime-2ZNPKD7D.js.map +0 -1
- /package/dist/{chunk-DGUM43GV.js.map → gltf-loader-YDPLZS5Q.js.map} +0 -0
- /package/dist/{gltf-loader-LKALCZAV.js.map → product-studio-runtime-HDAUDWYO.js.map} +0 -0
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/asset-url.js","../src/gltf-loader.js","../node_modules/@plasius/gpu-cloth/src/types.ts","../node_modules/@plasius/gpu-cloth/src/validation.ts","../node_modules/@plasius/gpu-cloth/src/continuity.ts","../node_modules/@plasius/gpu-cloth/src/representation.ts","../node_modules/@plasius/gpu-cloth/src/worker.ts","../node_modules/@plasius/gpu-fluid/src/types.ts","../node_modules/@plasius/gpu-fluid/src/validation.ts","../node_modules/@plasius/gpu-fluid/src/continuity.ts","../node_modules/@plasius/gpu-fluid/src/representation.ts","../node_modules/@plasius/gpu-fluid/src/worker.ts","../node_modules/@plasius/gpu-lighting/src/index.js","../node_modules/@plasius/gpu-performance/src/validation.ts","../node_modules/@plasius/gpu-performance/src/device.ts","../node_modules/@plasius/gpu-performance/src/budget.ts","../node_modules/@plasius/gpu-performance/src/governor.ts","../node_modules/@plasius/gpu-performance/src/ladder.ts","../node_modules/@plasius/gpu-performance/src/worker.ts","../node_modules/@plasius/gpu-debug/src/validation.ts","../node_modules/@plasius/gpu-debug/src/session.ts","../node_modules/@plasius/gpu-physics/src/browser.js","../node_modules/@plasius/gpu-physics/dist/browser.js","../src/showcase-runtime.js","../src/index.js"],"sourcesContent":["const INLINE_BRIGANTINE_GLTF_URL =\n \"data:application/json;base64,ewogICJhc3NldCI6IHsKICAgICJ2ZXJzaW9uIjogIjIuMCIsCiAgICAiZ2VuZXJhdG9yIjogIlBsYXNpdXMgZGVtbyBhc3NldCBnZW5lcmF0b3IiCiAgfSwKICAic2NlbmUiOiAwLAogICJzY2VuZXMiOiBbCiAgICB7CiAgICAgICJub2RlcyI6IFswXQogICAgfQogIF0sCiAgIm5vZGVzIjogWwogICAgewogICAgICAibWVzaCI6IDAsCiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUiLAogICAgICAiZXh0cmFzIjogewogICAgICAgICJwaHlzaWNzIjogewogICAgICAgICAgInNoYXBlIjogImJveCIsCiAgICAgICAgICAiaGFsZkV4dGVudHMiOiBbMS4zNSwgMC45NSwgMy45XSwKICAgICAgICAgICJtYXNzIjogMzIwMCwKICAgICAgICAgICJyZXN0aXR1dGlvbiI6IDAuMjIsCiAgICAgICAgICAibGluZWFyRGFtcGluZyI6IDAuMDQsCiAgICAgICAgICAiYW5ndWxhckRhbXBpbmciOiAwLjA4LAogICAgICAgICAgIndhdGVybGluZSI6IDAuNDIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICBdLAogICJtZXNoZXMiOiBbCiAgICB7CiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUtaHVsbCIsCiAgICAgICJwcmltaXRpdmVzIjogWwogICAgICAgIHsKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiUE9TSVRJT04iOiAwCiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiAxLAogICAgICAgICAgIm1hdGVyaWFsIjogMAogICAgICAgIH0KICAgICAgXQogICAgfQogIF0sCiAgIm1hdGVyaWFscyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAicGFpbnRlZC1odWxsIiwKICAgICAgInBick1ldGFsbGljUm91Z2huZXNzIjogewogICAgICAgICJiYXNlQ29sb3JGYWN0b3IiOiBbMC41NiwgMC4zMywgMC4yMiwgMV0sCiAgICAgICAgIm1ldGFsbGljRmFjdG9yIjogMC4wOCwKICAgICAgICAicm91Z2huZXNzRmFjdG9yIjogMC45MgogICAgICB9CiAgICB9CiAgXSwKICAiYnVmZmVycyI6IFsKICAgIHsKICAgICAgInVyaSI6ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsbXBtWnZ3QUFBTC9OekV6QW1wbVpQd0FBQUwvTnpFekF6Y3lzdnpNenM3NHpNN08vemN5c1B6TXpzNzR6TTdPL0FBQ2d2ODNNVEwzTnpNdy9BQUNnUDgzTVRMM056TXcvQUFBQUFPeFJPTDR6TTROQUFBQUFBR1ptNWo0QUFIQkFNek56dnpNenN6NmFtUm5BTXpOelB6TXpzejZhbVJuQXpjeE12ejBLMXo3TnpFdy96Y3hNUHowSzF6N056RXcvQUFBQUFETXpjejltWm1hL0FBQUNBQU1BQUFBREFBRUFBZ0FFQUFVQUFnQUZBQU1BQkFBSEFBVUFCQUFHQUFjQUJRQUhBQVlBQUFBQkFBa0FBQUFKQUFnQUNBQUpBQXdBQWdBSUFBd0FBd0FNQUFrQUFnQU1BQW9BQXdBTEFBd0FBZ0FLQUFRQUF3QUZBQXNBQ2dBTUFBc0FBQUFJQUFJQUFRQURBQWtBQkFBS0FBWUFCUUFHQUFzQUFnQUtBQXNBQWdBTEFBTUEiLAogICAgICAiYnl0ZUxlbmd0aCI6IDI5NAogICAgfQogIF0sCiAgImJ1ZmZlclZpZXdzIjogWwogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiYnl0ZUxlbmd0aCI6IDE1NiwKICAgICAgInRhcmdldCI6IDM0OTYyCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAxNTYsCiAgICAgICJieXRlTGVuZ3RoIjogMTM4LAogICAgICAidGFyZ2V0IjogMzQ5NjMKICAgIH0KICBdLAogICJhY2Nlc3NvcnMiOiBbCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjYsCiAgICAgICJjb3VudCI6IDEzLAogICAgICAidHlwZSI6ICJWRUMzIiwKICAgICAgIm1pbiI6IFstMS4zNSwgLTAuNSwgLTMuMl0sCiAgICAgICJtYXgiOiBbMS4zNSwgMC45NSwgNC4xXQogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlclZpZXciOiAxLAogICAgICAiYnl0ZU9mZnNldCI6IDAsCiAgICAgICJjb21wb25lbnRUeXBlIjogNTEyMywKICAgICAgImNvdW50IjogNjksCiAgICAgICJ0eXBlIjogIlNDQUxBUiIsCiAgICAgICJtYXgiOiBbMTJdLAogICAgICAibWluIjogWzBdCiAgICB9CiAgXQp9Cg==\";\n\nfunction createInlineShowcaseAssetUrl() {\n return new URL(INLINE_BRIGANTINE_GLTF_URL);\n}\n\nfunction getBrowserBaseUrl() {\n if (typeof document !== \"undefined\" && typeof document.baseURI === \"string\" && document.baseURI.length > 0) {\n return document.baseURI;\n }\n if (\n typeof window !== \"undefined\" &&\n typeof window.location?.href === \"string\" &&\n window.location.href.length > 0\n ) {\n return window.location.href;\n }\n return null;\n}\n\nexport function resolveShowcaseAssetUrl(baseUrl = import.meta.url) {\n try {\n return new URL(\"../assets/brigantine.gltf\", baseUrl);\n } catch {\n const browserBaseUrl = getBrowserBaseUrl();\n if (browserBaseUrl) {\n try {\n const normalizedBaseUrl = new URL(baseUrl, browserBaseUrl);\n return new URL(\"../assets/brigantine.gltf\", normalizedBaseUrl);\n } catch {\n return createInlineShowcaseAssetUrl();\n }\n }\n return createInlineShowcaseAssetUrl();\n }\n}\n","function decodeDataUri(uri) {\n const match = /^data:.*?;base64,(.+)$/i.exec(uri);\n if (!match) {\n throw new Error(`Unsupported glTF buffer URI: ${uri.slice(0, 48)}`);\n }\n\n const binary = atob(match[1]);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes.buffer;\n}\n\nfunction getComponentArray(componentType, buffer, byteOffset, count) {\n switch (componentType) {\n case 5123:\n return new Uint16Array(buffer, byteOffset, count);\n case 5125:\n return new Uint32Array(buffer, byteOffset, count);\n case 5126:\n return new Float32Array(buffer, byteOffset, count);\n default:\n throw new Error(`Unsupported glTF componentType: ${componentType}`);\n }\n}\n\nfunction getTypeSize(type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n default:\n throw new Error(`Unsupported glTF accessor type: ${type}`);\n }\n}\n\nfunction readAccessor(document, accessorIndex, buffers) {\n const accessor = document.accessors[accessorIndex];\n const bufferView = document.bufferViews[accessor.bufferView];\n const buffer = buffers[bufferView.buffer];\n const componentCount = getTypeSize(accessor.type);\n const byteOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);\n const valueCount = accessor.count * componentCount;\n return getComponentArray(accessor.componentType, buffer, byteOffset, valueCount);\n}\n\nfunction getMaterialColor(document, primitive) {\n const material = document.materials?.[primitive.material] ?? null;\n const factor =\n material?.pbrMetallicRoughness?.baseColorFactor ?? [0.56, 0.33, 0.22, 1];\n return {\n r: factor[0],\n g: factor[1],\n b: factor[2],\n a: factor[3] ?? 1,\n };\n}\n\nfunction computeBounds(positions) {\n const min = [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY];\n const max = [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY];\n for (let index = 0; index < positions.length; index += 3) {\n min[0] = Math.min(min[0], positions[index]);\n min[1] = Math.min(min[1], positions[index + 1]);\n min[2] = Math.min(min[2], positions[index + 2]);\n max[0] = Math.max(max[0], positions[index]);\n max[1] = Math.max(max[1], positions[index + 1]);\n max[2] = Math.max(max[2], positions[index + 2]);\n }\n return { min, max };\n}\n\nfunction resolveBrowserRequestBaseUrl() {\n if (typeof document !== \"undefined\" && typeof document.baseURI === \"string\" && document.baseURI.length > 0) {\n return document.baseURI;\n }\n if (\n typeof window !== \"undefined\" &&\n typeof window.location?.href === \"string\" &&\n window.location.href.length > 0\n ) {\n return window.location.href;\n }\n return null;\n}\n\nfunction resolveFetchBaseUrl(requestUrl, responseUrl) {\n if (typeof responseUrl === \"string\" && responseUrl.length > 0) {\n try {\n return new URL(responseUrl);\n } catch {\n // Keep trying the other candidates when an environment reports a malformed response URL.\n }\n }\n\n try {\n return new URL(requestUrl);\n } catch {\n const browserBaseUrl = resolveBrowserRequestBaseUrl();\n if (browserBaseUrl) {\n return new URL(requestUrl, browserBaseUrl);\n }\n throw new Error(`Unable to resolve a stable base URL for glTF asset loading: ${String(requestUrl)}`);\n }\n}\n\nexport async function loadGltfModel(url) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load glTF asset: ${response.status} ${response.statusText}`);\n }\n\n const document = await response.json();\n const baseUrl = resolveFetchBaseUrl(url, response.url);\n const buffers = await Promise.all(\n (document.buffers ?? []).map(async (buffer) => {\n if (typeof buffer.uri !== \"string\") {\n throw new Error(\"glTF buffer URI is required for demo asset loading.\");\n }\n if (buffer.uri.startsWith(\"data:\")) {\n return decodeDataUri(buffer.uri);\n }\n const nested = await fetch(new URL(buffer.uri, baseUrl));\n if (!nested.ok) {\n throw new Error(`Failed to load glTF buffer: ${nested.status} ${nested.statusText}`);\n }\n return nested.arrayBuffer();\n })\n );\n\n const scene = document.scenes?.[document.scene ?? 0];\n if (!scene || !Array.isArray(scene.nodes) || scene.nodes.length === 0) {\n throw new Error(\"glTF demo asset must expose a default scene with at least one node.\");\n }\n\n const node = document.nodes[scene.nodes[0]];\n const mesh = document.meshes[node.mesh];\n const primitive = mesh.primitives[0];\n const positions = Array.from(readAccessor(document, primitive.attributes.POSITION, buffers));\n const indices = Array.from(readAccessor(document, primitive.indices, buffers));\n\n return Object.freeze({\n name: node.name ?? mesh.name ?? \"gltf-model\",\n positions,\n indices,\n bounds: computeBounds(positions),\n color: getMaterialColor(document, primitive),\n physics: Object.freeze({ ...(node.extras?.physics ?? {}) }),\n });\n}\n","/**\n * Supported cloth planning profiles.\n */\nexport const clothProfileNames = [\"interactive\", \"cinematic\"] as const;\n\n/**\n * Cloth planning profile identifier.\n */\nexport type ClothProfileName = (typeof clothProfileNames)[number];\n\n/**\n * Cloth asset categories currently modeled by the package.\n */\nexport const clothGarmentKinds = [\n \"cape\",\n \"skirt\",\n \"flag\",\n \"curtain\",\n \"custom\",\n] as const;\n\n/**\n * Cloth garment kind.\n */\nexport type ClothGarmentKind = (typeof clothGarmentKinds)[number];\n\n/**\n * Distance-banded representation tiers.\n */\nexport const clothRepresentationBands = [\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n] as const;\n\n/**\n * Supported distance band name.\n */\nexport type ClothRepresentationBand = (typeof clothRepresentationBands)[number];\n\n/**\n * Supported render outputs for each cloth band.\n */\nexport const clothRepresentationOutputs = [\n \"fullSimulation\",\n \"reducedSimulation\",\n \"poseProxy\",\n \"silhouetteImpression\",\n] as const;\n\n/**\n * Render output type for a banded cloth representation.\n */\nexport type ClothRepresentationOutput =\n (typeof clothRepresentationOutputs)[number];\n\n/**\n * Cloth continuity strategies across range transitions.\n */\nexport const clothContinuityStrategies = [\n \"shared-solver-state\",\n \"shared-motion-field\",\n \"phase-locked-proxy\",\n] as const;\n\n/**\n * Continuity strategy identifier.\n */\nexport type ClothContinuityStrategy =\n (typeof clothContinuityStrategies)[number];\n\n/**\n * Coarse RT participation level for a representation.\n */\nexport const clothRtParticipationModes = [\n \"full\",\n \"selective\",\n \"proxy\",\n \"disabled\",\n] as const;\n\n/**\n * RT participation mode.\n */\nexport type ClothRtParticipation = (typeof clothRtParticipationModes)[number];\n\n/**\n * Shadow-source mode for a cloth representation.\n */\nexport const clothShadowModes = [\n \"ray-traced-primary\",\n \"selective-raster\",\n \"proxy-caster\",\n \"baked-impression\",\n] as const;\n\n/**\n * Shadow mode identifier.\n */\nexport type ClothShadowMode = (typeof clothShadowModes)[number];\n\n/**\n * Worker queues used by cloth preparation.\n */\nexport const clothWorkerQueueClasses = [\"simulation\", \"render\"] as const;\n\n/**\n * Worker queue class.\n */\nexport type ClothWorkerQueueClass =\n (typeof clothWorkerQueueClasses)[number];\n\n/**\n * Safety classification for cloth jobs.\n */\nexport const clothWorkerAuthorities = [\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n] as const;\n\n/**\n * Worker authority classification.\n */\nexport type ClothWorkerAuthority =\n (typeof clothWorkerAuthorities)[number];\n\n/**\n * Importance ranking for cloth jobs.\n */\nexport const clothWorkerImportances = [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n] as const;\n\n/**\n * Worker importance classification.\n */\nexport type ClothWorkerImportance =\n (typeof clothWorkerImportances)[number];\n\n/**\n * Domains aligned with `@plasius/gpu-performance`.\n */\nexport const clothPerformanceDomains = [\n \"cloth\",\n \"geometry\",\n \"custom\",\n] as const;\n\n/**\n * Performance domain used by cloth jobs.\n */\nexport type ClothPerformanceDomain =\n (typeof clothPerformanceDomains)[number];\n\n/**\n * Motion classes aligned with `@plasius/gpu-performance`.\n */\nexport const clothMotionClasses = [\"stable\", \"dynamic\", \"volatile\"] as const;\n\n/**\n * Motion class.\n */\nexport type ClothMotionClass = (typeof clothMotionClasses)[number];\n\n/**\n * Quality emphasis weights aligned with `@plasius/gpu-performance`.\n */\nexport interface ClothPerformanceQualityDimensions {\n geometry?: number;\n deformation?: number;\n shading?: number;\n rayTracing?: number;\n updateCadence?: number;\n temporalReuse?: number;\n}\n\n/**\n * Additional signals aligned with `@plasius/gpu-performance`.\n */\nexport interface ClothPerformanceImportanceSignals {\n visible?: boolean;\n playerRelevant?: boolean;\n imageCritical?: boolean;\n motionClass?: ClothMotionClass;\n shadowSignificance?: ClothWorkerImportance;\n}\n\n/**\n * User-supplied band continuity overrides.\n */\nexport interface ClothContinuityBandInput {\n blendWindowMeters?: number;\n silhouetteFloor?: number;\n broadMotionFloor?: number;\n wrinkleFloor?: number;\n retainPinnedAnchors?: boolean;\n retainWindPhase?: boolean;\n}\n\n/**\n * User-supplied continuity envelope input.\n */\nexport interface ClothContinuityEnvelopeInput {\n garmentId: string;\n continuityGroupId?: string;\n motionFieldId?: string;\n strategy?: ClothContinuityStrategy;\n bands?: Partial<Record<ClothRepresentationBand, ClothContinuityBandInput>>;\n}\n\n/**\n * Normalized continuity settings for one band.\n */\nexport interface ClothContinuityBandSettings {\n inheritsFromBand?: ClothRepresentationBand;\n blendWindowMeters: number;\n silhouetteFloor: number;\n broadMotionFloor: number;\n wrinkleFloor: number;\n retainPinnedAnchors: boolean;\n retainWindPhase: boolean;\n}\n\n/**\n * Shared continuity contract across all bands.\n */\nexport interface ClothContinuityEnvelope {\n schemaVersion: 1;\n owner: \"cloth\";\n garmentId: string;\n continuityGroupId: string;\n motionFieldId: string;\n strategy: ClothContinuityStrategy;\n bands: Readonly<Record<ClothRepresentationBand, ClothContinuityBandSettings>>;\n}\n\n/**\n * Range thresholds used to select a cloth band.\n */\nexport interface ClothRangeThresholds {\n nearMaxMeters: number;\n midMaxMeters: number;\n farMaxMeters: number;\n}\n\n/**\n * Mesh and solver hints for a representation band.\n */\nexport interface ClothMeshResolution {\n simulationVertices: number;\n collisionSamples: number;\n solverIterations: number;\n wrinkleLayers: number;\n}\n\n/**\n * Shading hints for a representation band.\n */\nexport interface ClothShadingPlan {\n mode: \"full\" | \"balanced\" | \"proxy\" | \"horizon\";\n selfShadowing: boolean;\n reflectionMode: \"full\" | \"selective\" | \"proxy\" | \"disabled\";\n}\n\n/**\n * Per-band scheduling and performance hints.\n */\nexport interface ClothRepresentationPerformanceHints {\n owner: \"cloth\";\n queueClass: \"render\";\n priorityHint: number;\n importance: ClothWorkerImportance;\n representationBand: ClothRepresentationBand;\n qualityDimensions: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals: Readonly<ClothPerformanceImportanceSignals>;\n}\n\n/**\n * Normalized representation descriptor for a single band.\n */\nexport interface ClothRepresentationDescriptor {\n id: string;\n garmentId: string;\n kind: ClothGarmentKind;\n profile: ClothProfileName;\n band: ClothRepresentationBand;\n output: ClothRepresentationOutput;\n mesh: Readonly<ClothMeshResolution>;\n updateCadenceDivisor: number;\n rtParticipation: ClothRtParticipation;\n shadowMode: ClothShadowMode;\n shading: Readonly<ClothShadingPlan>;\n continuity: Readonly<ClothContinuityBandSettings> & {\n continuityGroupId: string;\n motionFieldId: string;\n strategy: ClothContinuityStrategy;\n };\n performance: Readonly<ClothRepresentationPerformanceHints>;\n}\n\n/**\n * Options for creating a representation plan.\n */\nexport interface ClothRepresentationPlanOptions {\n garmentId: string;\n kind?: ClothGarmentKind;\n profile?: ClothProfileName;\n supportsRayTracing?: boolean;\n nearFieldMaxMeters?: number;\n midFieldMaxMeters?: number;\n farFieldMaxMeters?: number;\n continuity?: Partial<Omit<ClothContinuityEnvelopeInput, \"garmentId\">>;\n}\n\n/**\n * Full cloth representation plan.\n */\nexport interface ClothRepresentationPlan {\n schemaVersion: 1;\n owner: \"cloth\";\n garmentId: string;\n kind: ClothGarmentKind;\n profile: ClothProfileName;\n supportsRayTracing: boolean;\n thresholds: Readonly<ClothRangeThresholds>;\n continuity: Readonly<ClothContinuityEnvelope>;\n bands: readonly ClothRepresentationBand[];\n representations: readonly ClothRepresentationDescriptor[];\n}\n\n/**\n * One quality level in a worker budget ladder.\n */\nexport interface ClothWorkerBudgetLevel {\n id: string;\n estimatedCostMs: number;\n config: Readonly<{\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n metadata: Readonly<{\n owner: \"cloth\";\n queueClass: ClothWorkerQueueClass;\n jobType: string;\n quality: \"low\" | \"medium\" | \"high\";\n }>;\n }>;\n}\n\n/**\n * Single worker job emitted by the cloth package.\n */\nexport interface ClothWorkerManifestJob {\n key: string;\n label: string;\n worker: Readonly<{\n jobType: string;\n queueClass: ClothWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n schedulerMode: \"dag\";\n }>;\n performance: Readonly<{\n id: string;\n jobType: string;\n queueClass: ClothWorkerQueueClass;\n domain: ClothPerformanceDomain;\n authority: ClothWorkerAuthority;\n importance: ClothWorkerImportance;\n representationBand?: ClothRepresentationBand;\n qualityDimensions?: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals?: Readonly<ClothPerformanceImportanceSignals>;\n levels: readonly ClothWorkerBudgetLevel[];\n }>;\n debug: Readonly<{\n owner: \"cloth\";\n queueClass: ClothWorkerQueueClass;\n jobType: string;\n tags: readonly string[];\n suggestedAllocationIds: readonly string[];\n }>;\n}\n\n/**\n * Worker manifest compatible with `@plasius/gpu-worker` and\n * `@plasius/gpu-performance`.\n */\nexport interface ClothWorkerManifest {\n schemaVersion: 1;\n owner: \"cloth\";\n profile: ClothProfileName;\n schedulerMode: \"dag\";\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: readonly ClothWorkerManifestJob[];\n}\n\n/**\n * Ordered cloth simulation stages.\n */\nexport const clothSimulationStageOrder = [\n \"snapshot-ingest\",\n \"wind-field-advance\",\n \"pin-constraint-update\",\n \"cloth-solve\",\n \"near-cloth\",\n \"mid-cloth\",\n \"far-proxy\",\n \"horizon-impression\",\n \"wrinkle-history\",\n \"render-snapshot\",\n] as const;\n\n/**\n * Cloth simulation stage identifier.\n */\nexport type ClothSimulationStageId =\n (typeof clothSimulationStageOrder)[number];\n\n/**\n * One stage in the cloth simulation/scene-prep plan.\n */\nexport interface ClothSimulationPlanStage {\n id: ClothSimulationStageId;\n label: string;\n queueClass: ClothWorkerQueueClass;\n root: boolean;\n dependencies: readonly ClothSimulationStageId[];\n output: string;\n snapshotStable: boolean;\n}\n\n/**\n * High-level simulation plan for the cloth package.\n */\nexport interface ClothSimulationPlan {\n schemaVersion: 1;\n owner: \"cloth\";\n profile: ClothProfileName;\n description: string;\n snapshotSource: Readonly<{\n packageName: \"@plasius/gpu-physics\";\n contract: \"physics.worldSnapshot\";\n stage: \"snapshot-ingest\";\n required: true;\n }>;\n continuityContract: Readonly<{\n strategy: ClothContinuityStrategy;\n requiresSharedMotionField: true;\n bands: readonly ClothRepresentationBand[];\n }>;\n stages: readonly ClothSimulationPlanStage[];\n}\n","import {\n clothContinuityStrategies,\n clothGarmentKinds,\n clothProfileNames,\n clothRepresentationBands,\n} from \"./types.js\";\n\ntype EnumValues = readonly string[];\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nexport function assertFinitePositiveNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n\n return value;\n}\n\nexport function assertFiniteNonNegativeNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function assertRatio(name: string, value: unknown): number {\n const parsed = assertFiniteNonNegativeNumber(name, value);\n if (parsed > 1) {\n throw new Error(`${name} must be less than or equal to 1.`);\n }\n return parsed;\n}\n\nexport function assertEnumValue<T extends EnumValues>(\n name: string,\n value: unknown,\n allowed: T\n): T[number] {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new Error(`${name} must be one of: ${allowed.join(\", \")}.`);\n }\n\n return value as T[number];\n}\n\nexport function normalizeClothProfile(value: unknown) {\n return assertEnumValue(\"profile\", value, clothProfileNames);\n}\n\nexport function normalizeClothGarmentKind(value: unknown) {\n return assertEnumValue(\"kind\", value, clothGarmentKinds);\n}\n\nexport function normalizeClothContinuityStrategy(value: unknown) {\n return assertEnumValue(\"continuity.strategy\", value, clothContinuityStrategies);\n}\n\nexport function normalizeClothRepresentationBand(value: unknown) {\n return assertEnumValue(\"band\", value, clothRepresentationBands);\n}\n","import type {\n ClothContinuityBandInput,\n ClothContinuityBandSettings,\n ClothContinuityEnvelope,\n ClothContinuityEnvelopeInput,\n ClothRepresentationBand,\n} from \"./types.js\";\nimport { clothRepresentationBands } from \"./types.js\";\nimport {\n assertFinitePositiveNumber,\n assertIdentifier,\n assertRatio,\n normalizeClothContinuityStrategy,\n} from \"./validation.js\";\n\nconst clothBandInheritance: Readonly<\n Record<ClothRepresentationBand, ClothRepresentationBand | undefined>\n> = Object.freeze({\n near: undefined,\n mid: \"near\",\n far: \"mid\",\n horizon: \"far\",\n});\n\nconst defaultBandInputs: Readonly<\n Record<ClothRepresentationBand, Required<ClothContinuityBandInput>>\n> = Object.freeze({\n near: Object.freeze({\n blendWindowMeters: 3,\n silhouetteFloor: 1,\n broadMotionFloor: 1,\n wrinkleFloor: 1,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n mid: Object.freeze({\n blendWindowMeters: 8,\n silhouetteFloor: 0.82,\n broadMotionFloor: 0.78,\n wrinkleFloor: 0.5,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n far: Object.freeze({\n blendWindowMeters: 20,\n silhouetteFloor: 0.58,\n broadMotionFloor: 0.48,\n wrinkleFloor: 0.2,\n retainPinnedAnchors: true,\n retainWindPhase: true,\n }),\n horizon: Object.freeze({\n blendWindowMeters: 40,\n silhouetteFloor: 0.28,\n broadMotionFloor: 0.24,\n wrinkleFloor: 0.05,\n retainPinnedAnchors: true,\n retainWindPhase: false,\n }),\n});\n\nfunction buildBandSettings(\n band: ClothRepresentationBand,\n input: ClothContinuityBandInput | undefined\n): ClothContinuityBandSettings {\n const defaults = defaultBandInputs[band];\n\n return Object.freeze({\n inheritsFromBand: clothBandInheritance[band],\n blendWindowMeters:\n input?.blendWindowMeters === undefined\n ? defaults.blendWindowMeters\n : assertFinitePositiveNumber(\n `continuity.bands.${band}.blendWindowMeters`,\n input.blendWindowMeters\n ),\n silhouetteFloor:\n input?.silhouetteFloor === undefined\n ? defaults.silhouetteFloor\n : assertRatio(\n `continuity.bands.${band}.silhouetteFloor`,\n input.silhouetteFloor\n ),\n broadMotionFloor:\n input?.broadMotionFloor === undefined\n ? defaults.broadMotionFloor\n : assertRatio(\n `continuity.bands.${band}.broadMotionFloor`,\n input.broadMotionFloor\n ),\n wrinkleFloor:\n input?.wrinkleFloor === undefined\n ? defaults.wrinkleFloor\n : assertRatio(\n `continuity.bands.${band}.wrinkleFloor`,\n input.wrinkleFloor\n ),\n retainPinnedAnchors:\n input?.retainPinnedAnchors ?? defaults.retainPinnedAnchors,\n retainWindPhase: input?.retainWindPhase ?? defaults.retainWindPhase,\n });\n}\n\n/**\n * Creates the normalized continuity envelope shared across all cloth\n * representation bands.\n */\nexport function createClothContinuityEnvelope(\n input: ClothContinuityEnvelopeInput\n): ClothContinuityEnvelope {\n const garmentId = assertIdentifier(\"garmentId\", input.garmentId);\n const continuityGroupId = input.continuityGroupId\n ? assertIdentifier(\"continuityGroupId\", input.continuityGroupId)\n : `${garmentId}.continuity`;\n const motionFieldId = input.motionFieldId\n ? assertIdentifier(\"motionFieldId\", input.motionFieldId)\n : `${garmentId}.motion-field`;\n const strategy = input.strategy\n ? normalizeClothContinuityStrategy(input.strategy)\n : \"shared-motion-field\";\n\n const bands = Object.freeze(\n Object.fromEntries(\n clothRepresentationBands.map((band) => [\n band,\n buildBandSettings(band, input.bands?.[band]),\n ])\n ) as Record<ClothRepresentationBand, ClothContinuityBandSettings>\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n garmentId,\n continuityGroupId,\n motionFieldId,\n strategy,\n bands,\n });\n}\n","import { createClothContinuityEnvelope } from \"./continuity.js\";\nimport type {\n ClothGarmentKind,\n ClothProfileName,\n ClothRangeThresholds,\n ClothRepresentationBand,\n ClothRepresentationDescriptor,\n ClothRepresentationPlan,\n ClothRepresentationPlanOptions,\n} from \"./types.js\";\nimport { clothRepresentationBands } from \"./types.js\";\nimport {\n assertFiniteNonNegativeNumber,\n assertFinitePositiveNumber,\n assertIdentifier,\n normalizeClothGarmentKind,\n normalizeClothProfile,\n} from \"./validation.js\";\n\ntype BandDescriptorSpec = Omit<\n ClothRepresentationDescriptor,\n | \"id\"\n | \"garmentId\"\n | \"kind\"\n | \"profile\"\n | \"band\"\n | \"continuity\"\n>;\n\ntype ProfileRepresentationSpec = Record<ClothRepresentationBand, BandDescriptorSpec>;\n\nconst profileRepresentationSpecs: Readonly<\n Record<ClothProfileName, ProfileRepresentationSpec>\n> = Object.freeze({\n interactive: Object.freeze({\n near: Object.freeze({\n output: \"fullSimulation\",\n mesh: Object.freeze({\n simulationVertices: 12000,\n collisionSamples: 96,\n solverIterations: 10,\n wrinkleLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n selfShadowing: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 450,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.85,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"reducedSimulation\",\n mesh: Object.freeze({\n simulationVertices: 4200,\n collisionSamples: 40,\n solverIterations: 6,\n wrinkleLayers: 2,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n selfShadowing: true,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 320,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.68,\n deformation: 0.7,\n shading: 0.64,\n rayTracing: 0.45,\n updateCadence: 0.75,\n temporalReuse: 0.55,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"poseProxy\",\n mesh: Object.freeze({\n simulationVertices: 700,\n collisionSamples: 8,\n solverIterations: 2,\n wrinkleLayers: 1,\n }),\n updateCadenceDivisor: 3,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 200,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.28,\n deformation: 0.3,\n shading: 0.25,\n rayTracing: 0.1,\n updateCadence: 0.3,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"silhouetteImpression\",\n mesh: Object.freeze({\n simulationVertices: 80,\n collisionSamples: 0,\n solverIterations: 0,\n wrinkleLayers: 0,\n }),\n updateCadenceDivisor: 8,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 100,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.1,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n cinematic: Object.freeze({\n near: Object.freeze({\n output: \"fullSimulation\",\n mesh: Object.freeze({\n simulationVertices: 18000,\n collisionSamples: 128,\n solverIterations: 14,\n wrinkleLayers: 4,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n selfShadowing: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 490,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.9,\n updateCadence: 1,\n temporalReuse: 0.1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"critical\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"reducedSimulation\",\n mesh: Object.freeze({\n simulationVertices: 6800,\n collisionSamples: 56,\n solverIterations: 8,\n wrinkleLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n selfShadowing: true,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 350,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.76,\n deformation: 0.8,\n shading: 0.7,\n rayTracing: 0.5,\n updateCadence: 0.82,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"poseProxy\",\n mesh: Object.freeze({\n simulationVertices: 1200,\n collisionSamples: 12,\n solverIterations: 3,\n wrinkleLayers: 1,\n }),\n updateCadenceDivisor: 2,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 220,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.35,\n deformation: 0.38,\n shading: 0.3,\n rayTracing: 0.12,\n updateCadence: 0.35,\n temporalReuse: 0.88,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"silhouetteImpression\",\n mesh: Object.freeze({\n simulationVertices: 120,\n collisionSamples: 0,\n solverIterations: 0,\n wrinkleLayers: 0,\n }),\n updateCadenceDivisor: 6,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n selfShadowing: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"cloth\",\n queueClass: \"render\",\n priorityHint: 110,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n});\n\nfunction normalizeThresholds(\n nearFieldMaxMeters: unknown,\n midFieldMaxMeters: unknown,\n farFieldMaxMeters: unknown\n): ClothRangeThresholds {\n const nearMaxMeters = assertFinitePositiveNumber(\n \"nearFieldMaxMeters\",\n nearFieldMaxMeters\n );\n const midMaxMeters = assertFinitePositiveNumber(\n \"midFieldMaxMeters\",\n midFieldMaxMeters\n );\n const farMaxMeters = assertFinitePositiveNumber(\n \"farFieldMaxMeters\",\n farFieldMaxMeters\n );\n\n if (!(nearMaxMeters < midMaxMeters && midMaxMeters < farMaxMeters)) {\n throw new Error(\n \"Cloth range thresholds must satisfy nearFieldMaxMeters < midFieldMaxMeters < farFieldMaxMeters.\"\n );\n }\n\n return Object.freeze({\n nearMaxMeters,\n midMaxMeters,\n farMaxMeters,\n });\n}\n\nfunction buildRepresentationDescriptor(\n garmentId: string,\n kind: ClothGarmentKind,\n profile: ClothProfileName,\n band: ClothRepresentationBand,\n supportsRayTracing: boolean,\n options: ClothRepresentationPlanOptions\n): ClothRepresentationDescriptor {\n const continuityEnvelope = createClothContinuityEnvelope({\n garmentId,\n continuityGroupId: options.continuity?.continuityGroupId,\n motionFieldId: options.continuity?.motionFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n const profileSpec = profileRepresentationSpecs[profile][band];\n const continuity = continuityEnvelope.bands[band];\n const rtParticipation =\n supportsRayTracing || profileSpec.rtParticipation === \"disabled\"\n ? profileSpec.rtParticipation\n : band === \"near\"\n ? \"selective\"\n : band === \"mid\"\n ? \"proxy\"\n : \"disabled\";\n\n return Object.freeze({\n id: `${garmentId}.${band}.${profileSpec.output}`,\n garmentId,\n kind,\n profile,\n band,\n output: profileSpec.output,\n mesh: profileSpec.mesh,\n updateCadenceDivisor: profileSpec.updateCadenceDivisor,\n rtParticipation,\n shadowMode:\n rtParticipation === \"disabled\" && band === \"near\"\n ? \"selective-raster\"\n : profileSpec.shadowMode,\n shading: profileSpec.shading,\n continuity: Object.freeze({\n continuityGroupId: continuityEnvelope.continuityGroupId,\n motionFieldId: continuityEnvelope.motionFieldId,\n strategy: continuityEnvelope.strategy,\n inheritsFromBand: continuity.inheritsFromBand,\n blendWindowMeters: continuity.blendWindowMeters,\n silhouetteFloor: continuity.silhouetteFloor,\n broadMotionFloor: continuity.broadMotionFloor,\n wrinkleFloor: continuity.wrinkleFloor,\n retainPinnedAnchors: continuity.retainPinnedAnchors,\n retainWindPhase: continuity.retainWindPhase,\n }),\n performance: profileSpec.performance,\n });\n}\n\n/**\n * Selects the active cloth representation band for a given distance.\n */\nexport function selectClothRepresentationBand(\n distanceMeters: number,\n thresholds: ClothRangeThresholds\n): ClothRepresentationBand {\n const distance = assertFiniteNonNegativeNumber(\"distanceMeters\", distanceMeters);\n\n if (distance <= thresholds.nearMaxMeters) {\n return \"near\";\n }\n if (distance <= thresholds.midMaxMeters) {\n return \"mid\";\n }\n if (distance <= thresholds.farMaxMeters) {\n return \"far\";\n }\n return \"horizon\";\n}\n\n/**\n * Creates a continuity-aware cloth representation plan spanning near, mid, far,\n * and horizon bands.\n */\nexport function createClothRepresentationPlan(\n options: ClothRepresentationPlanOptions\n): ClothRepresentationPlan {\n const garmentId = assertIdentifier(\"garmentId\", options.garmentId);\n const kind = options.kind\n ? normalizeClothGarmentKind(options.kind)\n : \"cape\";\n const profile = options.profile\n ? normalizeClothProfile(options.profile)\n : \"interactive\";\n const supportsRayTracing = options.supportsRayTracing ?? true;\n const thresholds = normalizeThresholds(\n options.nearFieldMaxMeters ?? 18,\n options.midFieldMaxMeters ?? 55,\n options.farFieldMaxMeters ?? 180\n );\n const continuity = createClothContinuityEnvelope({\n garmentId,\n continuityGroupId: options.continuity?.continuityGroupId,\n motionFieldId: options.continuity?.motionFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n garmentId,\n kind,\n profile,\n supportsRayTracing,\n thresholds,\n continuity,\n bands: clothRepresentationBands,\n representations: Object.freeze(\n clothRepresentationBands.map((band) =>\n buildRepresentationDescriptor(garmentId, kind, profile, band, supportsRayTracing, options)\n )\n ),\n });\n}\n","import type {\n ClothPerformanceDomain,\n ClothPerformanceImportanceSignals,\n ClothPerformanceQualityDimensions,\n ClothProfileName,\n ClothRepresentationBand,\n ClothSimulationPlan,\n ClothSimulationPlanStage,\n ClothSimulationStageId,\n ClothWorkerAuthority,\n ClothWorkerBudgetLevel,\n ClothWorkerImportance,\n ClothWorkerManifest,\n ClothWorkerManifestJob,\n ClothWorkerQueueClass,\n} from \"./types.js\";\nimport { clothProfileNames, clothRepresentationBands } from \"./types.js\";\nimport { normalizeClothProfile } from \"./validation.js\";\n\nexport const clothDebugOwner = \"cloth\";\nexport const defaultClothProfile = \"interactive\";\n\ntype BudgetPreset = {\n estimatedCostMs: number;\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n};\n\ntype WorkerLevelSpec = {\n low: BudgetPreset;\n medium: BudgetPreset;\n high: BudgetPreset;\n};\n\ntype WorkerJobSpec = {\n label: string;\n queueClass: ClothWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n domain: ClothPerformanceDomain;\n authority: ClothWorkerAuthority;\n importance: ClothWorkerImportance;\n representationBand?: ClothRepresentationBand;\n qualityDimensions?: Readonly<ClothPerformanceQualityDimensions>;\n importanceSignals?: Readonly<ClothPerformanceImportanceSignals>;\n suggestedAllocationIds: readonly string[];\n levels: WorkerLevelSpec;\n};\n\ntype WorkerProfileSpec = {\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: Readonly<Record<string, WorkerJobSpec>>;\n};\n\nconst simulationStageLabels: Readonly<Record<ClothSimulationStageId, string>> =\n Object.freeze({\n \"snapshot-ingest\": \"Ingest stable physics snapshot\",\n \"wind-field-advance\": \"Advance wind and external force field\",\n \"pin-constraint-update\": \"Resolve pin and attachment constraints\",\n \"cloth-solve\": \"Solve cloth state\",\n \"near-cloth\": \"Prepare near-field cloth simulation output\",\n \"mid-cloth\": \"Prepare mid-field cloth simulation output\",\n \"far-proxy\": \"Prepare far-field garment proxy\",\n \"horizon-impression\": \"Prepare horizon silhouette impression\",\n \"wrinkle-history\": \"Propagate wrinkle and crease history\",\n \"render-snapshot\": \"Commit stable render snapshot\",\n });\n\nfunction createSimulationStage(\n stage: ClothSimulationPlanStage\n): ClothSimulationPlanStage {\n return Object.freeze({\n ...stage,\n dependencies: Object.freeze([...stage.dependencies]),\n });\n}\n\nfunction buildBudgetLevels(\n jobType: string,\n queueClass: ClothWorkerQueueClass,\n levels: WorkerLevelSpec\n): readonly ClothWorkerBudgetLevel[] {\n return Object.freeze(\n ([\"low\", \"medium\", \"high\"] as const).map((quality) =>\n Object.freeze({\n id: quality,\n estimatedCostMs: levels[quality].estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: levels[quality].maxDispatchesPerFrame,\n maxJobsPerDispatch: levels[quality].maxJobsPerDispatch,\n cadenceDivisor: levels[quality].cadenceDivisor,\n workgroupScale: levels[quality].workgroupScale,\n maxQueueDepth: levels[quality].maxQueueDepth,\n metadata: Object.freeze({\n owner: \"cloth\",\n queueClass,\n jobType,\n quality,\n }),\n }),\n })\n )\n );\n}\n\nfunction buildManifestJob(\n profile: ClothProfileName,\n key: string,\n spec: WorkerJobSpec\n): ClothWorkerManifestJob {\n return Object.freeze({\n key,\n label: spec.label,\n worker: Object.freeze({\n jobType: spec.label,\n queueClass: spec.queueClass,\n priority: spec.priority,\n dependencies: Object.freeze([...spec.dependencies]),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: spec.label,\n jobType: spec.label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n representationBand: spec.representationBand,\n qualityDimensions: spec.qualityDimensions,\n importanceSignals: spec.importanceSignals,\n levels: buildBudgetLevels(spec.label, spec.queueClass, spec.levels),\n }),\n debug: Object.freeze({\n owner: \"cloth\",\n queueClass: spec.queueClass,\n jobType: spec.label,\n tags: Object.freeze([\n \"cloth\",\n profile,\n key,\n spec.authority,\n spec.domain,\n ...(spec.representationBand ? [spec.representationBand] : []),\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nconst interactiveWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Interactive cloth profile that preserves stable attachment and silhouette continuity while scaling distant garment cost before near-field fidelity.\",\n suggestedAllocationIds: Object.freeze([\n \"cloth.snapshot\",\n \"cloth.solve\",\n \"cloth.near\",\n ]),\n jobs: Object.freeze({\n \"snapshot-ingest\": Object.freeze({\n label: \"cloth.snapshot-ingest\",\n queueClass: \"simulation\",\n priority: 500,\n dependencies: Object.freeze([]),\n domain: \"cloth\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"cloth.snapshot\"]),\n levels: {\n low: { estimatedCostMs: 0.2, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.4, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 64, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"wind-field-advance\": Object.freeze({\n label: \"cloth.wind-field-advance\",\n queueClass: \"simulation\",\n priority: 470,\n dependencies: Object.freeze([]),\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"cloth.wind\"]),\n levels: {\n low: { estimatedCostMs: 0.25, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.45, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.7, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"pin-constraint-update\": Object.freeze({\n label: \"cloth.pin-constraint-update\",\n queueClass: \"simulation\",\n priority: 450,\n dependencies: Object.freeze([\"snapshot-ingest\"]),\n domain: \"cloth\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"cloth.pins\"]),\n levels: {\n low: { estimatedCostMs: 0.35, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 0.55, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n high: { estimatedCostMs: 0.8, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 48, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"cloth-solve\": Object.freeze({\n label: \"cloth.solve\",\n queueClass: \"simulation\",\n priority: 430,\n dependencies: Object.freeze([\"pin-constraint-update\", \"wind-field-advance\"]),\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"cloth.solve\"]),\n levels: {\n low: { estimatedCostMs: 0.8, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 64 },\n medium: { estimatedCostMs: 1.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 96 },\n high: { estimatedCostMs: 1.9, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 32, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 128 },\n },\n }),\n \"near-cloth\": Object.freeze({\n label: \"cloth.near-cloth\",\n queueClass: \"render\",\n priority: 420,\n dependencies: Object.freeze([\"cloth-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n deformation: 1,\n shading: 1,\n rayTracing: 0.85,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.near\"]),\n levels: {\n low: { estimatedCostMs: 0.9, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.6, maxQueueDepth: 48 },\n medium: { estimatedCostMs: 1.5, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 64 },\n high: { estimatedCostMs: 2.2, maxDispatchesPerFrame: 2, maxJobsPerDispatch: 24, cadenceDivisor: 1, workgroupScale: 1, maxQueueDepth: 96 },\n },\n }),\n \"mid-cloth\": Object.freeze({\n label: \"cloth.mid-cloth\",\n queueClass: \"render\",\n priority: 320,\n dependencies: Object.freeze([\"cloth-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.68,\n deformation: 0.7,\n shading: 0.64,\n rayTracing: 0.45,\n updateCadence: 0.75,\n temporalReuse: 0.55,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.mid\"]),\n levels: {\n low: { estimatedCostMs: 0.5, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.55, maxQueueDepth: 48 },\n medium: { estimatedCostMs: 0.9, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.72, maxQueueDepth: 64 },\n high: { estimatedCostMs: 1.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 20, cadenceDivisor: 1, workgroupScale: 0.9, maxQueueDepth: 96 },\n },\n }),\n \"far-proxy\": Object.freeze({\n label: \"cloth.far-proxy\",\n queueClass: \"render\",\n priority: 200,\n dependencies: Object.freeze([\"wind-field-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.28,\n deformation: 0.3,\n shading: 0.25,\n rayTracing: 0.1,\n updateCadence: 0.3,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.far\"]),\n levels: {\n low: { estimatedCostMs: 0.15, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 6, workgroupScale: 0.4, maxQueueDepth: 32 },\n medium: { estimatedCostMs: 0.25, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 4, workgroupScale: 0.55, maxQueueDepth: 32 },\n high: { estimatedCostMs: 0.4, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 3, workgroupScale: 0.7, maxQueueDepth: 48 },\n },\n }),\n \"horizon-impression\": Object.freeze({\n label: \"cloth.horizon-impression\",\n queueClass: \"render\",\n priority: 100,\n dependencies: Object.freeze([\"wind-field-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.1,\n deformation: 0.12,\n shading: 0.08,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.horizon\"]),\n levels: {\n low: { estimatedCostMs: 0.08, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 4, cadenceDivisor: 10, workgroupScale: 0.25, maxQueueDepth: 16 },\n medium: { estimatedCostMs: 0.12, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 6, cadenceDivisor: 8, workgroupScale: 0.35, maxQueueDepth: 24 },\n high: { estimatedCostMs: 0.2, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 6, workgroupScale: 0.45, maxQueueDepth: 32 },\n },\n }),\n \"wrinkle-history\": Object.freeze({\n label: \"cloth.wrinkle-history\",\n queueClass: \"render\",\n priority: 300,\n dependencies: Object.freeze([\"near-cloth\", \"mid-cloth\"]),\n domain: \"custom\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n deformation: 0.5,\n shading: 0.4,\n updateCadence: 0.5,\n temporalReuse: 0.85,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"cloth.wrinkles\"]),\n levels: {\n low: { estimatedCostMs: 0.18, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 8, cadenceDivisor: 3, workgroupScale: 0.45, maxQueueDepth: 32 },\n medium: { estimatedCostMs: 0.3, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 12, cadenceDivisor: 2, workgroupScale: 0.65, maxQueueDepth: 48 },\n high: { estimatedCostMs: 0.45, maxDispatchesPerFrame: 1, maxJobsPerDispatch: 16, cadenceDivisor: 1, workgroupScale: 0.8, maxQueueDepth: 64 },\n },\n }),\n }),\n});\n\nconst cinematicWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Cinematic cloth profile that spends more budget on near and mid-field garment deformation before degrading distant cloth work.\",\n suggestedAllocationIds: Object.freeze([\n \"cloth.snapshot\",\n \"cloth.solve\",\n \"cloth.mid\",\n ]),\n jobs: Object.freeze(\n Object.fromEntries(\n Object.entries(interactiveWorkerProfileSpec.jobs).map(([key, spec]) => [\n key,\n Object.freeze({\n ...spec,\n priority:\n key === \"near-cloth\" || key === \"mid-cloth\"\n ? spec.priority + 30\n : spec.priority,\n levels: {\n low: { ...spec.levels.low, estimatedCostMs: Number((spec.levels.low.estimatedCostMs * 1.1).toFixed(2)) },\n medium: { ...spec.levels.medium, estimatedCostMs: Number((spec.levels.medium.estimatedCostMs * 1.15).toFixed(2)) },\n high: { ...spec.levels.high, estimatedCostMs: Number((spec.levels.high.estimatedCostMs * 1.2).toFixed(2)) },\n },\n }),\n ])\n ) as Record<string, WorkerJobSpec>\n ),\n});\n\nconst clothWorkerProfileSpecs: Readonly<Record<ClothProfileName, WorkerProfileSpec>> =\n Object.freeze({\n interactive: interactiveWorkerProfileSpec,\n cinematic: cinematicWorkerProfileSpec,\n });\n\nconst interactiveSimulationStages: readonly ClothSimulationPlanStage[] = Object.freeze([\n createSimulationStage({ id: \"snapshot-ingest\", label: simulationStageLabels[\"snapshot-ingest\"], queueClass: \"simulation\", root: true, dependencies: [], output: \"physics-snapshot\", snapshotStable: true }),\n createSimulationStage({ id: \"wind-field-advance\", label: simulationStageLabels[\"wind-field-advance\"], queueClass: \"simulation\", root: true, dependencies: [], output: \"wind-field\", snapshotStable: false }),\n createSimulationStage({ id: \"pin-constraint-update\", label: simulationStageLabels[\"pin-constraint-update\"], queueClass: \"simulation\", root: false, dependencies: [\"snapshot-ingest\"], output: \"pin-constraints\", snapshotStable: true }),\n createSimulationStage({ id: \"cloth-solve\", label: simulationStageLabels[\"cloth-solve\"], queueClass: \"simulation\", root: false, dependencies: [\"pin-constraint-update\", \"wind-field-advance\"], output: \"cloth-state\", snapshotStable: true }),\n createSimulationStage({ id: \"near-cloth\", label: simulationStageLabels[\"near-cloth\"], queueClass: \"render\", root: false, dependencies: [\"cloth-solve\"], output: \"near-cloth-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"mid-cloth\", label: simulationStageLabels[\"mid-cloth\"], queueClass: \"render\", root: false, dependencies: [\"cloth-solve\"], output: \"mid-cloth-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"far-proxy\", label: simulationStageLabels[\"far-proxy\"], queueClass: \"render\", root: false, dependencies: [\"wind-field-advance\"], output: \"far-proxy-representation\", snapshotStable: true }),\n createSimulationStage({ id: \"horizon-impression\", label: simulationStageLabels[\"horizon-impression\"], queueClass: \"render\", root: false, dependencies: [\"wind-field-advance\"], output: \"horizon-cloth-impression\", snapshotStable: true }),\n createSimulationStage({ id: \"wrinkle-history\", label: simulationStageLabels[\"wrinkle-history\"], queueClass: \"render\", root: false, dependencies: [\"near-cloth\", \"mid-cloth\"], output: \"wrinkle-history-state\", snapshotStable: true }),\n createSimulationStage({ id: \"render-snapshot\", label: simulationStageLabels[\"render-snapshot\"], queueClass: \"render\", root: false, dependencies: [\"near-cloth\", \"mid-cloth\", \"far-proxy\", \"horizon-impression\", \"wrinkle-history\"], output: \"cloth-render-snapshot\", snapshotStable: true }),\n]);\n\nconst cinematicSimulationStages: readonly ClothSimulationPlanStage[] = Object.freeze(\n interactiveSimulationStages.map((stage) =>\n stage.id === \"far-proxy\" || stage.id === \"horizon-impression\"\n ? createSimulationStage({\n ...stage,\n output:\n stage.id === \"far-proxy\"\n ? \"far-proxy-representation-cinematic\"\n : \"horizon-cloth-impression-cinematic\",\n })\n : stage\n )\n);\n\nconst clothSimulationPlanSpecs: Readonly<\n Record<ClothProfileName, readonly ClothSimulationPlanStage[]>\n> = Object.freeze({\n interactive: interactiveSimulationStages,\n cinematic: cinematicSimulationStages,\n});\n\n/**\n * Returns the normalized worker manifest for the selected cloth profile.\n */\nexport function getClothWorkerManifest(\n profile: ClothProfileName = defaultClothProfile\n): ClothWorkerManifest {\n const profileName = normalizeClothProfile(profile);\n const spec = clothWorkerProfileSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: spec.suggestedAllocationIds,\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\n/**\n * Creates the high-level cloth simulation and scene-preparation plan for the\n * selected profile.\n */\nexport function createClothSimulationPlan(\n profile: ClothProfileName = defaultClothProfile\n): ClothSimulationPlan {\n const profileName = normalizeClothProfile(profile);\n const stages = clothSimulationPlanSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"cloth\",\n profile: profileName,\n description: clothWorkerProfileSpecs[profileName].description,\n snapshotSource: Object.freeze({\n packageName: \"@plasius/gpu-physics\",\n contract: \"physics.worldSnapshot\",\n stage: \"snapshot-ingest\",\n required: true,\n }),\n continuityContract: Object.freeze({\n strategy: \"shared-motion-field\",\n requiresSharedMotionField: true,\n bands: clothRepresentationBands,\n }),\n stages,\n });\n}\n","/**\n * Supported fluid planning profiles.\n */\nexport const fluidProfileNames = [\"interactive\", \"cinematic\"] as const;\n\n/**\n * Fluid planning profile identifier.\n */\nexport type FluidProfileName = (typeof fluidProfileNames)[number];\n\n/**\n * Fluid body categories currently modeled by the package.\n */\nexport const fluidBodyKinds = [\n \"ocean\",\n \"lake\",\n \"river\",\n \"waterfall\",\n \"custom\",\n] as const;\n\n/**\n * Fluid body kind.\n */\nexport type FluidBodyKind = (typeof fluidBodyKinds)[number];\n\n/**\n * Distance-banded representation tiers.\n */\nexport const fluidRepresentationBands = [\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n] as const;\n\n/**\n * Supported distance band name.\n */\nexport type FluidRepresentationBand = (typeof fluidRepresentationBands)[number];\n\n/**\n * Supported render outputs for each fluid band.\n */\nexport const fluidRepresentationOutputs = [\n \"liveSurface\",\n \"simplifiedSurface\",\n \"mergedProxy\",\n \"horizonShell\",\n] as const;\n\n/**\n * Render output type for a banded fluid representation.\n */\nexport type FluidRepresentationOutput =\n (typeof fluidRepresentationOutputs)[number];\n\n/**\n * Fluid continuity strategies across range transitions.\n */\nexport const fluidContinuityStrategies = [\n \"shared-spectrum\",\n \"shared-heightfield\",\n \"phase-locked-proxy\",\n] as const;\n\n/**\n * Continuity strategy identifier.\n */\nexport type FluidContinuityStrategy =\n (typeof fluidContinuityStrategies)[number];\n\n/**\n * Coarse RT participation level for a representation.\n */\nexport const fluidRtParticipationModes = [\n \"full\",\n \"selective\",\n \"proxy\",\n \"disabled\",\n] as const;\n\n/**\n * RT participation mode.\n */\nexport type FluidRtParticipation = (typeof fluidRtParticipationModes)[number];\n\n/**\n * Shadow-source mode for a fluid representation.\n */\nexport const fluidShadowModes = [\n \"ray-traced-primary\",\n \"selective-raster\",\n \"proxy-caster\",\n \"baked-impression\",\n] as const;\n\n/**\n * Shadow mode identifier.\n */\nexport type FluidShadowMode = (typeof fluidShadowModes)[number];\n\n/**\n * Worker queues used by fluid preparation.\n */\nexport const fluidWorkerQueueClasses = [\"simulation\", \"render\"] as const;\n\n/**\n * Worker queue class.\n */\nexport type FluidWorkerQueueClass =\n (typeof fluidWorkerQueueClasses)[number];\n\n/**\n * Safety classification for fluid jobs.\n */\nexport const fluidWorkerAuthorities = [\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n] as const;\n\n/**\n * Worker authority classification.\n */\nexport type FluidWorkerAuthority =\n (typeof fluidWorkerAuthorities)[number];\n\n/**\n * Importance ranking for fluid jobs.\n */\nexport const fluidWorkerImportances = [\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n] as const;\n\n/**\n * Worker importance classification.\n */\nexport type FluidWorkerImportance =\n (typeof fluidWorkerImportances)[number];\n\n/**\n * Domains aligned with `@plasius/gpu-performance`.\n */\nexport const fluidPerformanceDomains = [\n \"physics\",\n \"geometry\",\n \"custom\",\n] as const;\n\n/**\n * Performance domain used by fluid jobs.\n */\nexport type FluidPerformanceDomain =\n (typeof fluidPerformanceDomains)[number];\n\n/**\n * Motion classes aligned with `@plasius/gpu-performance`.\n */\nexport const fluidMotionClasses = [\"stable\", \"dynamic\", \"volatile\"] as const;\n\n/**\n * Motion class.\n */\nexport type FluidMotionClass = (typeof fluidMotionClasses)[number];\n\n/**\n * Quality emphasis weights aligned with `@plasius/gpu-performance`.\n */\nexport interface FluidPerformanceQualityDimensions {\n geometry?: number;\n shading?: number;\n rayTracing?: number;\n updateCadence?: number;\n temporalReuse?: number;\n}\n\n/**\n * Additional signals aligned with `@plasius/gpu-performance`.\n */\nexport interface FluidPerformanceImportanceSignals {\n visible?: boolean;\n playerRelevant?: boolean;\n imageCritical?: boolean;\n motionClass?: FluidMotionClass;\n shadowSignificance?: FluidWorkerImportance;\n}\n\n/**\n * User-supplied band continuity overrides.\n */\nexport interface FluidContinuityBandInput {\n blendWindowMeters?: number;\n amplitudeFloor?: number;\n frequencyFloor?: number;\n retainFoamHistory?: boolean;\n retainLowFrequencyWaves?: boolean;\n retainDirectionality?: boolean;\n}\n\n/**\n * User-supplied continuity envelope input.\n */\nexport interface FluidContinuityEnvelopeInput {\n fluidBodyId: string;\n continuityGroupId?: string;\n waveFieldId?: string;\n strategy?: FluidContinuityStrategy;\n bands?: Partial<Record<FluidRepresentationBand, FluidContinuityBandInput>>;\n}\n\n/**\n * Normalized continuity settings for one band.\n */\nexport interface FluidContinuityBandSettings {\n inheritsFromBand?: FluidRepresentationBand;\n blendWindowMeters: number;\n amplitudeFloor: number;\n frequencyFloor: number;\n retainFoamHistory: boolean;\n retainLowFrequencyWaves: boolean;\n retainDirectionality: boolean;\n}\n\n/**\n * Shared continuity contract across all bands.\n */\nexport interface FluidContinuityEnvelope {\n schemaVersion: 1;\n owner: \"fluid\";\n fluidBodyId: string;\n continuityGroupId: string;\n waveFieldId: string;\n strategy: FluidContinuityStrategy;\n bands: Readonly<Record<FluidRepresentationBand, FluidContinuityBandSettings>>;\n}\n\n/**\n * Range thresholds used to select a fluid band.\n */\nexport interface FluidRangeThresholds {\n nearMaxMeters: number;\n midMaxMeters: number;\n farMaxMeters: number;\n}\n\n/**\n * Resolution hints for a representation band.\n */\nexport interface FluidMeshResolution {\n patchSizeMeters: number;\n subdivisions: number;\n activeWaveOctaves: number;\n foamLayers: number;\n}\n\n/**\n * Shading hints for a representation band.\n */\nexport interface FluidShadingPlan {\n mode: \"full\" | \"balanced\" | \"proxy\" | \"horizon\";\n caustics: boolean;\n reflectionMode: \"full\" | \"selective\" | \"proxy\" | \"disabled\";\n}\n\n/**\n * Per-band scheduling and performance hints.\n */\nexport interface FluidRepresentationPerformanceHints {\n owner: \"fluid\";\n queueClass: \"render\";\n priorityHint: number;\n importance: FluidWorkerImportance;\n representationBand: FluidRepresentationBand;\n qualityDimensions: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals: Readonly<FluidPerformanceImportanceSignals>;\n}\n\n/**\n * Normalized representation descriptor for a single band.\n */\nexport interface FluidRepresentationDescriptor {\n id: string;\n fluidBodyId: string;\n kind: FluidBodyKind;\n profile: FluidProfileName;\n band: FluidRepresentationBand;\n output: FluidRepresentationOutput;\n mesh: Readonly<FluidMeshResolution>;\n updateCadenceDivisor: number;\n rtParticipation: FluidRtParticipation;\n shadowMode: FluidShadowMode;\n shading: Readonly<FluidShadingPlan>;\n continuity: Readonly<FluidContinuityBandSettings> & {\n continuityGroupId: string;\n waveFieldId: string;\n strategy: FluidContinuityStrategy;\n };\n performance: Readonly<FluidRepresentationPerformanceHints>;\n}\n\n/**\n * Options for creating a representation plan.\n */\nexport interface FluidRepresentationPlanOptions {\n fluidBodyId: string;\n kind?: FluidBodyKind;\n profile?: FluidProfileName;\n supportsRayTracing?: boolean;\n nearFieldMaxMeters?: number;\n midFieldMaxMeters?: number;\n farFieldMaxMeters?: number;\n continuity?: Partial<Omit<FluidContinuityEnvelopeInput, \"fluidBodyId\">>;\n}\n\n/**\n * Full fluid representation plan.\n */\nexport interface FluidRepresentationPlan {\n schemaVersion: 1;\n owner: \"fluid\";\n fluidBodyId: string;\n kind: FluidBodyKind;\n profile: FluidProfileName;\n supportsRayTracing: boolean;\n thresholds: Readonly<FluidRangeThresholds>;\n continuity: Readonly<FluidContinuityEnvelope>;\n bands: readonly FluidRepresentationBand[];\n representations: readonly FluidRepresentationDescriptor[];\n}\n\n/**\n * One quality level in a worker budget ladder.\n */\nexport interface FluidWorkerBudgetLevel {\n id: string;\n estimatedCostMs: number;\n config: Readonly<{\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n metadata: Readonly<{\n owner: \"fluid\";\n queueClass: FluidWorkerQueueClass;\n jobType: string;\n quality: \"low\" | \"medium\" | \"high\";\n }>;\n }>;\n}\n\n/**\n * Single worker job emitted by the fluid package.\n */\nexport interface FluidWorkerManifestJob {\n key: string;\n label: string;\n worker: Readonly<{\n jobType: string;\n queueClass: FluidWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n schedulerMode: \"dag\";\n }>;\n performance: Readonly<{\n id: string;\n jobType: string;\n queueClass: FluidWorkerQueueClass;\n domain: FluidPerformanceDomain;\n authority: FluidWorkerAuthority;\n importance: FluidWorkerImportance;\n representationBand?: FluidRepresentationBand;\n qualityDimensions?: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals?: Readonly<FluidPerformanceImportanceSignals>;\n levels: readonly FluidWorkerBudgetLevel[];\n }>;\n debug: Readonly<{\n owner: \"fluid\";\n queueClass: FluidWorkerQueueClass;\n jobType: string;\n tags: readonly string[];\n suggestedAllocationIds: readonly string[];\n }>;\n}\n\n/**\n * Worker manifest compatible with `@plasius/gpu-worker` and\n * `@plasius/gpu-performance`.\n */\nexport interface FluidWorkerManifest {\n schemaVersion: 1;\n owner: \"fluid\";\n profile: FluidProfileName;\n schedulerMode: \"dag\";\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: readonly FluidWorkerManifestJob[];\n}\n\n/**\n * Ordered fluid simulation stages.\n */\nexport const fluidSimulationStageOrder = [\n \"snapshot-ingest\",\n \"spectrum-advance\",\n \"boundary-coupling\",\n \"surface-solve\",\n \"near-surface\",\n \"mid-surface\",\n \"far-proxy\",\n \"horizon-shell\",\n \"foam-history\",\n \"render-snapshot\",\n] as const;\n\n/**\n * Fluid simulation stage identifier.\n */\nexport type FluidSimulationStageId =\n (typeof fluidSimulationStageOrder)[number];\n\n/**\n * One stage in the fluid simulation/scene-prep plan.\n */\nexport interface FluidSimulationPlanStage {\n id: FluidSimulationStageId;\n label: string;\n queueClass: FluidWorkerQueueClass;\n root: boolean;\n dependencies: readonly FluidSimulationStageId[];\n output: string;\n snapshotStable: boolean;\n}\n\n/**\n * High-level simulation plan for the fluid package.\n */\nexport interface FluidSimulationPlan {\n schemaVersion: 1;\n owner: \"fluid\";\n profile: FluidProfileName;\n description: string;\n snapshotSource: Readonly<{\n packageName: \"@plasius/gpu-physics\";\n contract: \"physics.worldSnapshot\";\n stage: \"snapshot-ingest\";\n required: true;\n }>;\n continuityContract: Readonly<{\n strategy: FluidContinuityStrategy;\n requiresSharedWaveField: true;\n bands: readonly FluidRepresentationBand[];\n }>;\n stages: readonly FluidSimulationPlanStage[];\n}\n","import {\n fluidBodyKinds,\n fluidContinuityStrategies,\n fluidProfileNames,\n fluidRepresentationBands,\n} from \"./types.js\";\n\ntype EnumValues = readonly string[];\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value.trim();\n}\n\nexport function assertFinitePositiveNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n\n return value;\n}\n\nexport function assertFiniteNonNegativeNumber(\n name: string,\n value: unknown\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function assertRatio(name: string, value: unknown): number {\n const parsed = assertFiniteNonNegativeNumber(name, value);\n if (parsed > 1) {\n throw new Error(`${name} must be less than or equal to 1.`);\n }\n return parsed;\n}\n\nexport function assertEnumValue<T extends EnumValues>(\n name: string,\n value: unknown,\n allowed: T\n): T[number] {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new Error(`${name} must be one of: ${allowed.join(\", \")}.`);\n }\n\n return value as T[number];\n}\n\nexport function normalizeFluidProfile(value: unknown) {\n return assertEnumValue(\"profile\", value, fluidProfileNames);\n}\n\nexport function normalizeFluidBodyKind(value: unknown) {\n return assertEnumValue(\"kind\", value, fluidBodyKinds);\n}\n\nexport function normalizeFluidContinuityStrategy(value: unknown) {\n return assertEnumValue(\"continuity.strategy\", value, fluidContinuityStrategies);\n}\n\nexport function normalizeFluidRepresentationBand(value: unknown) {\n return assertEnumValue(\"band\", value, fluidRepresentationBands);\n}\n","import type {\n FluidContinuityBandInput,\n FluidContinuityBandSettings,\n FluidContinuityEnvelope,\n FluidContinuityEnvelopeInput,\n FluidRepresentationBand,\n} from \"./types.js\";\nimport { fluidRepresentationBands } from \"./types.js\";\nimport {\n assertIdentifier,\n assertFinitePositiveNumber,\n assertRatio,\n normalizeFluidContinuityStrategy,\n} from \"./validation.js\";\n\nconst fluidBandInheritance: Readonly<\n Record<FluidRepresentationBand, FluidRepresentationBand | undefined>\n> = Object.freeze({\n near: undefined,\n mid: \"near\",\n far: \"mid\",\n horizon: \"far\",\n});\n\nconst defaultBandInputs: Readonly<\n Record<FluidRepresentationBand, Required<FluidContinuityBandInput>>\n> = Object.freeze({\n near: Object.freeze({\n blendWindowMeters: 6,\n amplitudeFloor: 1,\n frequencyFloor: 1,\n retainFoamHistory: true,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n mid: Object.freeze({\n blendWindowMeters: 14,\n amplitudeFloor: 0.72,\n frequencyFloor: 0.78,\n retainFoamHistory: true,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n far: Object.freeze({\n blendWindowMeters: 32,\n amplitudeFloor: 0.34,\n frequencyFloor: 0.42,\n retainFoamHistory: false,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n horizon: Object.freeze({\n blendWindowMeters: 72,\n amplitudeFloor: 0.16,\n frequencyFloor: 0.18,\n retainFoamHistory: false,\n retainLowFrequencyWaves: true,\n retainDirectionality: true,\n }),\n});\n\nfunction buildBandSettings(\n band: FluidRepresentationBand,\n input: FluidContinuityBandInput | undefined\n): FluidContinuityBandSettings {\n const defaults = defaultBandInputs[band];\n\n return Object.freeze({\n inheritsFromBand: fluidBandInheritance[band],\n blendWindowMeters:\n input?.blendWindowMeters === undefined\n ? defaults.blendWindowMeters\n : assertFinitePositiveNumber(\n `continuity.bands.${band}.blendWindowMeters`,\n input.blendWindowMeters\n ),\n amplitudeFloor:\n input?.amplitudeFloor === undefined\n ? defaults.amplitudeFloor\n : assertRatio(\n `continuity.bands.${band}.amplitudeFloor`,\n input.amplitudeFloor\n ),\n frequencyFloor:\n input?.frequencyFloor === undefined\n ? defaults.frequencyFloor\n : assertRatio(\n `continuity.bands.${band}.frequencyFloor`,\n input.frequencyFloor\n ),\n retainFoamHistory: input?.retainFoamHistory ?? defaults.retainFoamHistory,\n retainLowFrequencyWaves:\n input?.retainLowFrequencyWaves ?? defaults.retainLowFrequencyWaves,\n retainDirectionality:\n input?.retainDirectionality ?? defaults.retainDirectionality,\n });\n}\n\n/**\n * Creates the normalized continuity envelope shared across all fluid\n * representation bands.\n */\nexport function createFluidContinuityEnvelope(\n input: FluidContinuityEnvelopeInput\n): FluidContinuityEnvelope {\n const fluidBodyId = assertIdentifier(\"fluidBodyId\", input.fluidBodyId);\n const continuityGroupId = input.continuityGroupId\n ? assertIdentifier(\"continuityGroupId\", input.continuityGroupId)\n : `${fluidBodyId}.continuity`;\n const waveFieldId = input.waveFieldId\n ? assertIdentifier(\"waveFieldId\", input.waveFieldId)\n : `${fluidBodyId}.wave-field`;\n const strategy = input.strategy\n ? normalizeFluidContinuityStrategy(input.strategy)\n : \"shared-spectrum\";\n\n const bands = Object.freeze(\n Object.fromEntries(\n fluidRepresentationBands.map((band) => [\n band,\n buildBandSettings(band, input.bands?.[band]),\n ])\n ) as Record<FluidRepresentationBand, FluidContinuityBandSettings>\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n fluidBodyId,\n continuityGroupId,\n waveFieldId,\n strategy,\n bands,\n });\n}\n","import { createFluidContinuityEnvelope } from \"./continuity.js\";\nimport type {\n FluidBodyKind,\n FluidProfileName,\n FluidRangeThresholds,\n FluidRepresentationBand,\n FluidRepresentationDescriptor,\n FluidRepresentationPlan,\n FluidRepresentationPlanOptions,\n} from \"./types.js\";\nimport { fluidRepresentationBands } from \"./types.js\";\nimport {\n assertFiniteNonNegativeNumber,\n assertFinitePositiveNumber,\n assertIdentifier,\n normalizeFluidBodyKind,\n normalizeFluidProfile,\n} from \"./validation.js\";\n\ntype BandDescriptorSpec = Omit<\n FluidRepresentationDescriptor,\n | \"id\"\n | \"fluidBodyId\"\n | \"kind\"\n | \"profile\"\n | \"band\"\n | \"continuity\"\n>;\n\ntype ProfileRepresentationSpec = Record<FluidRepresentationBand, BandDescriptorSpec>;\n\nconst profileRepresentationSpecs: Readonly<\n Record<FluidProfileName, ProfileRepresentationSpec>\n> = Object.freeze({\n interactive: Object.freeze({\n near: Object.freeze({\n output: \"liveSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 0.5,\n subdivisions: 256,\n activeWaveOctaves: 8,\n foamLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n caustics: true,\n reflectionMode: \"full\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 460,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"simplifiedSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 1.5,\n subdivisions: 128,\n activeWaveOctaves: 6,\n foamLayers: 2,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n caustics: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 330,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.72,\n shading: 0.72,\n rayTracing: 0.58,\n updateCadence: 0.72,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"mergedProxy\",\n mesh: Object.freeze({\n patchSizeMeters: 6,\n subdivisions: 48,\n activeWaveOctaves: 4,\n foamLayers: 1,\n }),\n updateCadenceDivisor: 3,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n caustics: false,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 210,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.32,\n shading: 0.38,\n rayTracing: 0.2,\n updateCadence: 0.25,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"horizonShell\",\n mesh: Object.freeze({\n patchSizeMeters: 24,\n subdivisions: 12,\n activeWaveOctaves: 2,\n foamLayers: 0,\n }),\n updateCadenceDivisor: 8,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n caustics: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 110,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n shading: 0.14,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n cinematic: Object.freeze({\n near: Object.freeze({\n output: \"liveSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 0.35,\n subdivisions: 320,\n activeWaveOctaves: 9,\n foamLayers: 4,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"full\",\n shadowMode: \"ray-traced-primary\",\n shading: Object.freeze({\n mode: \"full\",\n caustics: true,\n reflectionMode: \"full\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 500,\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"critical\",\n }),\n }),\n }),\n mid: Object.freeze({\n output: \"simplifiedSurface\",\n mesh: Object.freeze({\n patchSizeMeters: 1,\n subdivisions: 192,\n activeWaveOctaves: 7,\n foamLayers: 3,\n }),\n updateCadenceDivisor: 1,\n rtParticipation: \"selective\",\n shadowMode: \"selective-raster\",\n shading: Object.freeze({\n mode: \"balanced\",\n caustics: true,\n reflectionMode: \"selective\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 360,\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.8,\n shading: 0.78,\n rayTracing: 0.64,\n updateCadence: 0.74,\n temporalReuse: 0.45,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n }),\n }),\n far: Object.freeze({\n output: \"mergedProxy\",\n mesh: Object.freeze({\n patchSizeMeters: 4,\n subdivisions: 80,\n activeWaveOctaves: 5,\n foamLayers: 1,\n }),\n updateCadenceDivisor: 2,\n rtParticipation: \"proxy\",\n shadowMode: \"proxy-caster\",\n shading: Object.freeze({\n mode: \"proxy\",\n caustics: false,\n reflectionMode: \"proxy\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 220,\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.4,\n shading: 0.42,\n rayTracing: 0.24,\n updateCadence: 0.34,\n temporalReuse: 0.88,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n }),\n }),\n horizon: Object.freeze({\n output: \"horizonShell\",\n mesh: Object.freeze({\n patchSizeMeters: 18,\n subdivisions: 18,\n activeWaveOctaves: 2,\n foamLayers: 0,\n }),\n updateCadenceDivisor: 6,\n rtParticipation: \"disabled\",\n shadowMode: \"baked-impression\",\n shading: Object.freeze({\n mode: \"horizon\",\n caustics: false,\n reflectionMode: \"disabled\",\n }),\n performance: Object.freeze({\n owner: \"fluid\",\n queueClass: \"render\",\n priorityHint: 120,\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.14,\n shading: 0.18,\n rayTracing: 0,\n updateCadence: 0.12,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n }),\n }),\n }),\n});\n\nfunction normalizeThresholds(\n nearFieldMaxMeters: unknown,\n midFieldMaxMeters: unknown,\n farFieldMaxMeters: unknown\n): FluidRangeThresholds {\n const nearMaxMeters = assertFinitePositiveNumber(\n \"nearFieldMaxMeters\",\n nearFieldMaxMeters\n );\n const midMaxMeters = assertFinitePositiveNumber(\n \"midFieldMaxMeters\",\n midFieldMaxMeters\n );\n const farMaxMeters = assertFinitePositiveNumber(\n \"farFieldMaxMeters\",\n farFieldMaxMeters\n );\n\n if (!(nearMaxMeters < midMaxMeters && midMaxMeters < farMaxMeters)) {\n throw new Error(\n \"Fluid range thresholds must satisfy nearFieldMaxMeters < midFieldMaxMeters < farFieldMaxMeters.\"\n );\n }\n\n return Object.freeze({\n nearMaxMeters,\n midMaxMeters,\n farMaxMeters,\n });\n}\n\nfunction buildRepresentationDescriptor(\n fluidBodyId: string,\n kind: FluidBodyKind,\n profile: FluidProfileName,\n band: FluidRepresentationBand,\n supportsRayTracing: boolean,\n thresholds: FluidRangeThresholds,\n options: FluidRepresentationPlanOptions\n): FluidRepresentationDescriptor {\n const continuityEnvelope = createFluidContinuityEnvelope({\n fluidBodyId,\n continuityGroupId: options.continuity?.continuityGroupId,\n waveFieldId: options.continuity?.waveFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n const profileSpec = profileRepresentationSpecs[profile][band];\n const continuity = continuityEnvelope.bands[band];\n const rtParticipation =\n supportsRayTracing || profileSpec.rtParticipation === \"disabled\"\n ? profileSpec.rtParticipation\n : band === \"near\"\n ? \"selective\"\n : band === \"mid\"\n ? \"proxy\"\n : \"disabled\";\n\n return Object.freeze({\n id: `${fluidBodyId}.${band}.${profileSpec.output}`,\n fluidBodyId,\n kind,\n profile,\n band,\n output: profileSpec.output,\n mesh: profileSpec.mesh,\n updateCadenceDivisor: profileSpec.updateCadenceDivisor,\n rtParticipation,\n shadowMode:\n rtParticipation === \"disabled\" && band === \"near\"\n ? \"selective-raster\"\n : profileSpec.shadowMode,\n shading: profileSpec.shading,\n continuity: Object.freeze({\n continuityGroupId: continuityEnvelope.continuityGroupId,\n waveFieldId: continuityEnvelope.waveFieldId,\n strategy: continuityEnvelope.strategy,\n inheritsFromBand: continuity.inheritsFromBand,\n blendWindowMeters: continuity.blendWindowMeters,\n amplitudeFloor: continuity.amplitudeFloor,\n frequencyFloor: continuity.frequencyFloor,\n retainFoamHistory: continuity.retainFoamHistory,\n retainLowFrequencyWaves: continuity.retainLowFrequencyWaves,\n retainDirectionality: continuity.retainDirectionality,\n }),\n performance: Object.freeze({\n ...profileSpec.performance,\n importanceSignals: Object.freeze({\n ...profileSpec.performance.importanceSignals,\n visible: band === \"near\" ? true : thresholds.nearMaxMeters > 0,\n }),\n }),\n });\n}\n\n/**\n * Selects the active fluid representation band for a given distance.\n */\nexport function selectFluidRepresentationBand(\n distanceMeters: number,\n thresholds: FluidRangeThresholds\n): FluidRepresentationBand {\n const distance = assertFiniteNonNegativeNumber(\"distanceMeters\", distanceMeters);\n\n if (distance <= thresholds.nearMaxMeters) {\n return \"near\";\n }\n if (distance <= thresholds.midMaxMeters) {\n return \"mid\";\n }\n if (distance <= thresholds.farMaxMeters) {\n return \"far\";\n }\n return \"horizon\";\n}\n\n/**\n * Creates a continuity-aware fluid representation plan spanning near, mid, far,\n * and horizon bands.\n */\nexport function createFluidRepresentationPlan(\n options: FluidRepresentationPlanOptions\n): FluidRepresentationPlan {\n const fluidBodyId = assertIdentifier(\"fluidBodyId\", options.fluidBodyId);\n const kind = options.kind\n ? normalizeFluidBodyKind(options.kind)\n : \"ocean\";\n const profile = options.profile\n ? normalizeFluidProfile(options.profile)\n : \"interactive\";\n const supportsRayTracing = options.supportsRayTracing ?? true;\n const thresholds = normalizeThresholds(\n options.nearFieldMaxMeters ?? 40,\n options.midFieldMaxMeters ?? 160,\n options.farFieldMaxMeters ?? 700\n );\n const continuity = createFluidContinuityEnvelope({\n fluidBodyId,\n continuityGroupId: options.continuity?.continuityGroupId,\n waveFieldId: options.continuity?.waveFieldId,\n strategy: options.continuity?.strategy,\n bands: options.continuity?.bands,\n });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n fluidBodyId,\n kind,\n profile,\n supportsRayTracing,\n thresholds,\n continuity,\n bands: fluidRepresentationBands,\n representations: Object.freeze(\n fluidRepresentationBands.map((band) =>\n buildRepresentationDescriptor(\n fluidBodyId,\n kind,\n profile,\n band,\n supportsRayTracing,\n thresholds,\n options\n )\n )\n ),\n });\n}\n","import type {\n FluidPerformanceDomain,\n FluidPerformanceImportanceSignals,\n FluidPerformanceQualityDimensions,\n FluidProfileName,\n FluidRepresentationBand,\n FluidSimulationPlan,\n FluidSimulationPlanStage,\n FluidSimulationStageId,\n FluidWorkerAuthority,\n FluidWorkerBudgetLevel,\n FluidWorkerImportance,\n FluidWorkerManifest,\n FluidWorkerManifestJob,\n FluidWorkerQueueClass,\n} from \"./types.js\";\nimport { fluidProfileNames, fluidRepresentationBands } from \"./types.js\";\nimport { normalizeFluidProfile } from \"./validation.js\";\n\nexport const fluidDebugOwner = \"fluid\";\nexport const defaultFluidProfile = \"interactive\";\n\ntype BudgetPreset = {\n estimatedCostMs: number;\n maxDispatchesPerFrame: number;\n maxJobsPerDispatch: number;\n cadenceDivisor: number;\n workgroupScale: number;\n maxQueueDepth: number;\n};\n\ntype WorkerLevelSpec = {\n low: BudgetPreset;\n medium: BudgetPreset;\n high: BudgetPreset;\n};\n\ntype WorkerJobSpec = {\n label: string;\n queueClass: FluidWorkerQueueClass;\n priority: number;\n dependencies: readonly string[];\n domain: FluidPerformanceDomain;\n authority: FluidWorkerAuthority;\n importance: FluidWorkerImportance;\n representationBand?: FluidRepresentationBand;\n qualityDimensions?: Readonly<FluidPerformanceQualityDimensions>;\n importanceSignals?: Readonly<FluidPerformanceImportanceSignals>;\n suggestedAllocationIds: readonly string[];\n levels: WorkerLevelSpec;\n};\n\ntype WorkerProfileSpec = {\n description: string;\n suggestedAllocationIds: readonly string[];\n jobs: Readonly<Record<string, WorkerJobSpec>>;\n};\n\nconst simulationStageLabels: Readonly<Record<FluidSimulationStageId, string>> =\n Object.freeze({\n \"snapshot-ingest\": \"Ingest stable physics snapshot\",\n \"spectrum-advance\": \"Advance shared wave spectrum\",\n \"boundary-coupling\": \"Resolve boundaries and buoyancy coupling\",\n \"surface-solve\": \"Solve fluid surface state\",\n \"near-surface\": \"Prepare near-field live surface\",\n \"mid-surface\": \"Prepare mid-field simplified surface\",\n \"far-proxy\": \"Prepare far-field merged proxy\",\n \"horizon-shell\": \"Prepare horizon shell\",\n \"foam-history\": \"Propagate foam and crest history\",\n \"render-snapshot\": \"Commit stable render snapshot\",\n });\n\nfunction createSimulationStage(\n stage: FluidSimulationPlanStage\n): FluidSimulationPlanStage {\n return Object.freeze({\n ...stage,\n dependencies: Object.freeze([...stage.dependencies]),\n });\n}\n\nfunction buildBudgetLevels(\n jobType: string,\n queueClass: FluidWorkerQueueClass,\n levels: WorkerLevelSpec\n): readonly FluidWorkerBudgetLevel[] {\n return Object.freeze(\n ([\"low\", \"medium\", \"high\"] as const).map((quality) =>\n Object.freeze({\n id: quality,\n estimatedCostMs: levels[quality].estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: levels[quality].maxDispatchesPerFrame,\n maxJobsPerDispatch: levels[quality].maxJobsPerDispatch,\n cadenceDivisor: levels[quality].cadenceDivisor,\n workgroupScale: levels[quality].workgroupScale,\n maxQueueDepth: levels[quality].maxQueueDepth,\n metadata: Object.freeze({\n owner: \"fluid\",\n queueClass,\n jobType,\n quality,\n }),\n }),\n })\n )\n );\n}\n\nfunction buildManifestJob(\n profile: FluidProfileName,\n key: string,\n spec: WorkerJobSpec\n): FluidWorkerManifestJob {\n return Object.freeze({\n key,\n label: spec.label,\n worker: Object.freeze({\n jobType: spec.label,\n queueClass: spec.queueClass,\n priority: spec.priority,\n dependencies: Object.freeze([...spec.dependencies]),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: spec.label,\n jobType: spec.label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n representationBand: spec.representationBand,\n qualityDimensions: spec.qualityDimensions,\n importanceSignals: spec.importanceSignals,\n levels: buildBudgetLevels(spec.label, spec.queueClass, spec.levels),\n }),\n debug: Object.freeze({\n owner: \"fluid\",\n queueClass: spec.queueClass,\n jobType: spec.label,\n tags: Object.freeze([\n \"fluid\",\n profile,\n key,\n spec.authority,\n spec.domain,\n ...(spec.representationBand ? [spec.representationBand] : []),\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nconst interactiveWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Interactive fluid profile that preserves stable snapshot coupling while scaling distant surface cost before near-field continuity.\",\n suggestedAllocationIds: Object.freeze([\n \"fluid.snapshot\",\n \"fluid.spectrum\",\n \"fluid.surface.near\",\n ]),\n jobs: Object.freeze({\n \"snapshot-ingest\": Object.freeze({\n label: \"fluid.snapshot-ingest\",\n queueClass: \"simulation\",\n priority: 500,\n dependencies: Object.freeze([]),\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"fluid.snapshot\"]),\n levels: {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n },\n }),\n \"spectrum-advance\": Object.freeze({\n label: \"fluid.spectrum-advance\",\n queueClass: \"simulation\",\n priority: 470,\n dependencies: Object.freeze([]),\n domain: \"physics\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"fluid.spectrum\"]),\n levels: {\n low: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.6,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"boundary-coupling\": Object.freeze({\n label: \"fluid.boundary-coupling\",\n queueClass: \"simulation\",\n priority: 450,\n dependencies: Object.freeze([\"snapshot-ingest\"]),\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n suggestedAllocationIds: Object.freeze([\"fluid.boundary\"]),\n levels: {\n low: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.85,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"surface-solve\": Object.freeze({\n label: \"fluid.surface-solve\",\n queueClass: \"simulation\",\n priority: 430,\n dependencies: Object.freeze([\"boundary-coupling\", \"spectrum-advance\"]),\n domain: \"physics\",\n authority: \"non-authoritative-simulation\",\n importance: \"high\",\n suggestedAllocationIds: Object.freeze([\"fluid.surface.solve\"]),\n levels: {\n low: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.65,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.82,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 2.1,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n },\n }),\n \"near-surface\": Object.freeze({\n label: \"fluid.near-surface\",\n queueClass: \"render\",\n priority: 420,\n dependencies: Object.freeze([\"surface-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"critical\",\n representationBand: \"near\",\n qualityDimensions: Object.freeze({\n geometry: 1,\n shading: 1,\n rayTracing: 1,\n updateCadence: 1,\n temporalReuse: 0.2,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: true,\n motionClass: \"dynamic\",\n shadowSignificance: \"high\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.near\"]),\n levels: {\n low: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.6,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 1,\n workgroupScale: 0.82,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 2.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n },\n }),\n \"mid-surface\": Object.freeze({\n label: \"fluid.mid-surface\",\n queueClass: \"render\",\n priority: 330,\n dependencies: Object.freeze([\"surface-solve\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n geometry: 0.72,\n shading: 0.72,\n rayTracing: 0.58,\n updateCadence: 0.72,\n temporalReuse: 0.5,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.mid\"]),\n levels: {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.55,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 1.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.9,\n maxQueueDepth: 128,\n },\n },\n }),\n \"far-proxy\": Object.freeze({\n label: \"fluid.far-proxy\",\n queueClass: \"render\",\n priority: 220,\n dependencies: Object.freeze([\"spectrum-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"medium\",\n representationBand: \"far\",\n qualityDimensions: Object.freeze({\n geometry: 0.32,\n shading: 0.38,\n rayTracing: 0.2,\n updateCadence: 0.25,\n temporalReuse: 0.9,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"medium\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.far\"]),\n levels: {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 6,\n workgroupScale: 0.4,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 4,\n workgroupScale: 0.55,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 20,\n cadenceDivisor: 3,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n },\n }),\n \"horizon-shell\": Object.freeze({\n label: \"fluid.horizon-shell\",\n queueClass: \"render\",\n priority: 120,\n dependencies: Object.freeze([\"spectrum-advance\"]),\n domain: \"geometry\",\n authority: \"visual\",\n importance: \"low\",\n representationBand: \"horizon\",\n qualityDimensions: Object.freeze({\n geometry: 0.12,\n shading: 0.14,\n rayTracing: 0,\n updateCadence: 0.1,\n temporalReuse: 1,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: false,\n imageCritical: false,\n motionClass: \"stable\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.surface.horizon\"]),\n levels: {\n low: {\n estimatedCostMs: 0.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 10,\n workgroupScale: 0.25,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.18,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 8,\n workgroupScale: 0.35,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.28,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 6,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n },\n }),\n \"foam-history\": Object.freeze({\n label: \"fluid.foam-history\",\n queueClass: \"render\",\n priority: 310,\n dependencies: Object.freeze([\"near-surface\", \"mid-surface\"]),\n domain: \"custom\",\n authority: \"visual\",\n importance: \"high\",\n representationBand: \"mid\",\n qualityDimensions: Object.freeze({\n shading: 0.6,\n updateCadence: 0.6,\n temporalReuse: 0.85,\n }),\n importanceSignals: Object.freeze({\n visible: true,\n playerRelevant: true,\n imageCritical: false,\n motionClass: \"dynamic\",\n shadowSignificance: \"low\",\n }),\n suggestedAllocationIds: Object.freeze([\"fluid.foam\"]),\n levels: {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 12,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 20,\n cadenceDivisor: 1,\n workgroupScale: 0.85,\n maxQueueDepth: 96,\n },\n },\n }),\n }),\n});\n\nconst cinematicWorkerProfileSpec: WorkerProfileSpec = Object.freeze({\n description:\n \"Cinematic fluid profile that spends more budget on near and mid-field continuity before degrading distant fluid work.\",\n suggestedAllocationIds: Object.freeze([\n \"fluid.snapshot\",\n \"fluid.surface.near\",\n \"fluid.surface.mid\",\n ]),\n jobs: Object.freeze(\n Object.fromEntries(\n Object.entries(interactiveWorkerProfileSpec.jobs).map(([key, spec]) => [\n key,\n Object.freeze({\n ...spec,\n priority:\n key === \"near-surface\" || key === \"mid-surface\"\n ? spec.priority + 30\n : spec.priority,\n levels: {\n low: {\n ...spec.levels.low,\n estimatedCostMs: Number((spec.levels.low.estimatedCostMs * 1.1).toFixed(2)),\n },\n medium: {\n ...spec.levels.medium,\n estimatedCostMs: Number((spec.levels.medium.estimatedCostMs * 1.15).toFixed(2)),\n },\n high: {\n ...spec.levels.high,\n estimatedCostMs: Number((spec.levels.high.estimatedCostMs * 1.2).toFixed(2)),\n },\n },\n }),\n ])\n ) as Record<string, WorkerJobSpec>\n ),\n});\n\nconst fluidWorkerProfileSpecs: Readonly<Record<FluidProfileName, WorkerProfileSpec>> =\n Object.freeze({\n interactive: interactiveWorkerProfileSpec,\n cinematic: cinematicWorkerProfileSpec,\n });\n\nconst interactiveSimulationStages: readonly FluidSimulationPlanStage[] = Object.freeze(\n [\n createSimulationStage({\n id: \"snapshot-ingest\",\n label: simulationStageLabels[\"snapshot-ingest\"],\n queueClass: \"simulation\",\n root: true,\n dependencies: [],\n output: \"physics-snapshot\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"spectrum-advance\",\n label: simulationStageLabels[\"spectrum-advance\"],\n queueClass: \"simulation\",\n root: true,\n dependencies: [],\n output: \"wave-spectrum\",\n snapshotStable: false,\n }),\n createSimulationStage({\n id: \"boundary-coupling\",\n label: simulationStageLabels[\"boundary-coupling\"],\n queueClass: \"simulation\",\n root: false,\n dependencies: [\"snapshot-ingest\"],\n output: \"boundary-constraints\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"surface-solve\",\n label: simulationStageLabels[\"surface-solve\"],\n queueClass: \"simulation\",\n root: false,\n dependencies: [\"boundary-coupling\", \"spectrum-advance\"],\n output: \"surface-state\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"near-surface\",\n label: simulationStageLabels[\"near-surface\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"surface-solve\"],\n output: \"near-surface-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"mid-surface\",\n label: simulationStageLabels[\"mid-surface\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"surface-solve\"],\n output: \"mid-surface-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"far-proxy\",\n label: simulationStageLabels[\"far-proxy\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"spectrum-advance\"],\n output: \"far-proxy-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"horizon-shell\",\n label: simulationStageLabels[\"horizon-shell\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"spectrum-advance\"],\n output: \"horizon-shell-representation\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"foam-history\",\n label: simulationStageLabels[\"foam-history\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\"near-surface\", \"mid-surface\"],\n output: \"foam-history-state\",\n snapshotStable: true,\n }),\n createSimulationStage({\n id: \"render-snapshot\",\n label: simulationStageLabels[\"render-snapshot\"],\n queueClass: \"render\",\n root: false,\n dependencies: [\n \"near-surface\",\n \"mid-surface\",\n \"far-proxy\",\n \"horizon-shell\",\n \"foam-history\",\n ],\n output: \"fluid-render-snapshot\",\n snapshotStable: true,\n }),\n ]\n);\n\nconst cinematicSimulationStages: readonly FluidSimulationPlanStage[] = Object.freeze(\n interactiveSimulationStages.map((stage) =>\n stage.id === \"far-proxy\" || stage.id === \"horizon-shell\"\n ? Object.freeze({\n ...stage,\n output: stage.id === \"far-proxy\"\n ? \"far-proxy-representation-cinematic\"\n : \"horizon-shell-representation-cinematic\",\n })\n : stage\n )\n);\n\nconst fluidSimulationPlanSpecs: Readonly<\n Record<FluidProfileName, readonly FluidSimulationPlanStage[]>\n> = Object.freeze({\n interactive: interactiveSimulationStages,\n cinematic: cinematicSimulationStages,\n});\n\n/**\n * Returns the normalized worker manifest for the selected fluid profile.\n */\nexport function getFluidWorkerManifest(\n profile: FluidProfileName = defaultFluidProfile\n): FluidWorkerManifest {\n const profileName = normalizeFluidProfile(profile);\n const spec = fluidWorkerProfileSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: spec.suggestedAllocationIds,\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\n/**\n * Creates the high-level fluid simulation and scene-preparation plan for the\n * selected profile.\n */\nexport function createFluidSimulationPlan(\n profile: FluidProfileName = defaultFluidProfile\n): FluidSimulationPlan {\n const profileName = normalizeFluidProfile(profile);\n const stages = fluidSimulationPlanSpecs[profileName];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: \"fluid\",\n profile: profileName,\n description: fluidWorkerProfileSpecs[profileName].description,\n snapshotSource: Object.freeze({\n packageName: \"@plasius/gpu-physics\",\n contract: \"physics.worldSnapshot\",\n stage: \"snapshot-ingest\",\n required: true,\n }),\n continuityContract: Object.freeze({\n strategy: \"shared-spectrum\",\n requiresSharedWaveField: true,\n bands: fluidRepresentationBands,\n }),\n stages,\n });\n}\n","function createModuleBaseUrl(metaUrl) {\n return Reflect.construct(URL, [String(metaUrl)]);\n}\n\nconst baseUrl = (() => {\n if (typeof __IMPORT_META_URL__ !== \"undefined\") {\n return createModuleBaseUrl(__IMPORT_META_URL__);\n }\n if (typeof __filename !== \"undefined\" && typeof require !== \"undefined\") {\n const { pathToFileURL } = require(\"node:url\");\n return pathToFileURL(__filename);\n }\n const base =\n typeof process !== \"undefined\" && process.cwd\n ? `file://${process.cwd()}/`\n : \"file:///\";\n return new URL(\"./index.js\", base);\n})();\n\nconst techniqueSpecs = {\n hybrid: {\n description:\n \"Lumen-inspired hybrid realtime GI and reflections with radiance cache final gather.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n directLighting: \"direct-lighting.job.wgsl\",\n screenTrace: \"screen-trace.job.wgsl\",\n radianceCache: \"radiance-cache.job.wgsl\",\n finalGather: \"final-gather.job.wgsl\",\n reflectionResolve: \"reflection-resolve.job.wgsl\",\n },\n },\n pathtracer: {\n description:\n \"Monte Carlo path-traced reference mode with progressive accumulation and denoise stage.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n pathTrace: \"pathtrace.job.wgsl\",\n accumulate: \"accumulate.job.wgsl\",\n denoise: \"denoise.job.wgsl\",\n },\n },\n volumetrics: {\n description:\n \"Froxel volumetric lighting for fog, shafts, and participating media shadows.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n froxelIntegrate: \"froxel-integrate.job.wgsl\",\n volumetricShadow: \"volumetric-shadow.job.wgsl\",\n },\n },\n hdri: {\n description:\n \"HDRI and IBL precompute passes including irradiance, specular prefilter, and BRDF LUT.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n irradianceConvolution: \"irradiance-convolution.job.wgsl\",\n specularPrefilter: \"specular-prefilter.job.wgsl\",\n brdfLut: \"brdf-lut.job.wgsl\",\n },\n },\n};\n\nfunction buildTechnique(name, spec) {\n const preludeUrl = new URL(`./techniques/${name}/${spec.prelude}`, baseUrl);\n const jobs = Object.entries(spec.jobs).map(([key, file]) => {\n const label = `lighting.${name}.${key}`;\n return {\n key,\n label,\n url: new URL(`./techniques/${name}/${file}`, baseUrl),\n sourceName: label,\n };\n });\n return {\n name,\n description: spec.description,\n preludeUrl,\n jobs,\n };\n}\n\nexport const lightingTechniques = Object.freeze(\n Object.fromEntries(\n Object.entries(techniqueSpecs).map(([name, spec]) => [\n name,\n buildTechnique(name, spec),\n ])\n )\n);\n\nexport const lightingTechniqueNames = Object.freeze(Object.keys(lightingTechniques));\n\nexport const defaultLightingTechnique = \"hybrid\";\n\nconst profileSpecs = {\n realtime: {\n description:\n \"Primary runtime profile: hybrid GI/reflections with volumetrics and HDRI/IBL.\",\n techniques: [\"hybrid\", \"volumetrics\", \"hdri\"],\n },\n hybrid: {\n description:\n \"Hybrid-focused profile for direct tuning of Lumen-inspired realtime passes.\",\n techniques: [\"hybrid\", \"hdri\"],\n },\n reference: {\n description:\n \"Reference quality profile: path tracing plus volumetrics and HDRI/IBL validation.\",\n techniques: [\"pathtracer\", \"volumetrics\", \"hdri\"],\n },\n};\n\nfunction buildProfile(name, spec) {\n return {\n name,\n description: spec.description,\n techniques: [...spec.techniques],\n };\n}\n\nexport const lightingProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(profileSpecs).map(([name, spec]) => [\n name,\n buildProfile(name, spec),\n ])\n )\n);\n\nexport const lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));\n\nexport const defaultLightingProfile = \"realtime\";\nexport const lightingDistanceBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\n\nexport const lightingWorkerQueueClass = \"lighting\";\nexport const lightingDebugOwner = \"lighting\";\n\nconst lightingImportanceLevels = Object.freeze([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]);\n\nconst lightingBandPolicySpecs = Object.freeze({\n near: Object.freeze({\n primaryShadowSource: \"ray-traced-primary\",\n assistShadowSources: Object.freeze([\"visibility-raster\", \"shadow-map-assist\"]),\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n mid: Object.freeze({\n primaryShadowSource: \"selective-raster-and-proxy\",\n assistShadowSources: Object.freeze([\n \"regional-shadow-map\",\n \"proxy-caster\",\n \"temporal-history\",\n ]),\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n far: Object.freeze({\n primaryShadowSource: \"merged-proxy-casters\",\n assistShadowSources: Object.freeze([\n \"coarse-directional\",\n \"semi-static-occlusion\",\n ]),\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n liveObjectShadows: false,\n impressionOnly: false,\n }),\n horizon: Object.freeze({\n primaryShadowSource: \"baked-impression\",\n assistShadowSources: Object.freeze([\"atmospheric-gradient\", \"skyline-darkening\"]),\n temporalReuse: \"baked\",\n updateCadenceDivisor: 60,\n liveObjectShadows: false,\n impressionOnly: true,\n }),\n});\n\nfunction assertLightingImportance(name, value) {\n if (!lightingImportanceLevels.includes(value)) {\n throw new Error(\n `${name} must be one of: ${lightingImportanceLevels.join(\", \")}.`\n );\n }\n return value;\n}\n\nfunction resolveBandParticipation(profileName, band, importance) {\n const referenceProfile = profileName === \"reference\";\n const premiumImportance =\n importance === \"critical\" || importance === \"high\";\n\n if (band === \"near\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"premium\" : \"selective\",\n reflections: premiumImportance ? \"premium\" : \"selective\",\n globalIllumination:\n referenceProfile || importance === \"critical\" ? \"premium\" : \"selective\",\n });\n }\n\n if (band === \"mid\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"selective\" : \"proxy\",\n reflections:\n referenceProfile && premiumImportance ? \"selective\" : \"proxy\",\n globalIllumination:\n referenceProfile && importance === \"critical\" ? \"selective\" : \"disabled\",\n });\n }\n\n if (band === \"far\") {\n return Object.freeze({\n directShadows: \"proxy\",\n reflections:\n referenceProfile && importance === \"critical\" ? \"proxy\" : \"disabled\",\n globalIllumination: \"disabled\",\n });\n }\n\n return Object.freeze({\n directShadows: \"disabled\",\n reflections: \"disabled\",\n globalIllumination: \"disabled\",\n });\n}\n\nexport function createLightingBandPlan(options = {}) {\n const profileName = options.profile ?? defaultLightingProfile;\n const profile = getLightingProfile(profileName);\n const importance = assertLightingImportance(\n \"importance\",\n options.importance ?? \"high\"\n );\n\n const bands = Object.freeze(\n lightingDistanceBands.map((band) =>\n Object.freeze({\n band,\n profile: profile.name,\n importance,\n primaryShadowSource: lightingBandPolicySpecs[band].primaryShadowSource,\n assistShadowSources: Object.freeze([\n ...lightingBandPolicySpecs[band].assistShadowSources,\n ]),\n rtParticipation: resolveBandParticipation(profile.name, band, importance),\n temporalReuse: lightingBandPolicySpecs[band].temporalReuse,\n updateCadenceDivisor: lightingBandPolicySpecs[band].updateCadenceDivisor,\n liveObjectShadows: lightingBandPolicySpecs[band].liveObjectShadows,\n impressionOnly: lightingBandPolicySpecs[band].impressionOnly,\n })\n )\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n importance,\n techniques: Object.freeze([...profile.techniques]),\n bands,\n });\n}\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst lightingWorkerSpecPresets = {\n hybrid: {\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n \"lighting.hybrid.shadow-atlas\",\n ],\n jobs: {\n directLighting: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.directLighting\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.shadow-atlas\"],\n },\n screenTrace: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.screenTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 2.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n radianceCache: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.radianceCache\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.radiance-cache\"],\n },\n finalGather: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.finalGather\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 2.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n ],\n },\n reflectionResolve: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.reflectionResolve\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n },\n },\n pathtracer: {\n suggestedAllocationIds: [\n \"lighting.pathtracer.path-state\",\n \"lighting.pathtracer.accumulation\",\n \"lighting.pathtracer.denoise-history\",\n ],\n jobs: {\n pathTrace: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.pathTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 3,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 2.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 3.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.path-state\"],\n },\n accumulate: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.accumulate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.accumulation\"],\n },\n denoise: {\n domain: \"post-processing\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.denoise\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.denoise-history\"],\n },\n },\n },\n volumetrics: {\n suggestedAllocationIds: [\n \"lighting.volumetrics.froxel-grid\",\n \"lighting.volumetrics.shadow-history\",\n ],\n jobs: {\n froxelIntegrate: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.froxelIntegrate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.7,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.froxel-grid\"],\n },\n volumetricShadow: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.volumetricShadow\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.shadow-history\"],\n },\n },\n },\n hdri: {\n suggestedAllocationIds: [\n \"lighting.hdri.cubemap\",\n \"lighting.hdri.prefilter\",\n \"lighting.hdri.brdf-lut\",\n ],\n jobs: {\n irradianceConvolution: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.irradianceConvolution\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.cubemap\"],\n },\n specularPrefilter: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.specularPrefilter\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.prefilter\"],\n },\n brdfLut: {\n domain: \"lighting\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.brdfLut\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 4,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 8,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 16,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 24,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.brdf-lut\"],\n },\n },\n },\n};\n\nconst lightingWorkerDagSpecs = {\n hybrid: {\n directLighting: { priority: 4, dependencies: [] },\n screenTrace: { priority: 3, dependencies: [] },\n radianceCache: { priority: 4, dependencies: [\"directLighting\"] },\n finalGather: { priority: 2, dependencies: [\"radianceCache\", \"screenTrace\"] },\n reflectionResolve: {\n priority: 1,\n dependencies: [\"screenTrace\", \"finalGather\"],\n },\n },\n pathtracer: {\n pathTrace: { priority: 4, dependencies: [] },\n accumulate: { priority: 3, dependencies: [\"pathTrace\"] },\n denoise: { priority: 2, dependencies: [\"accumulate\"] },\n },\n volumetrics: {\n volumetricShadow: { priority: 3, dependencies: [] },\n froxelIntegrate: { priority: 2, dependencies: [\"volumetricShadow\"] },\n },\n hdri: {\n irradianceConvolution: { priority: 3, dependencies: [] },\n specularPrefilter: { priority: 3, dependencies: [] },\n brdfLut: {\n priority: 2,\n dependencies: [\"irradianceConvolution\", \"specularPrefilter\"],\n },\n },\n};\n\nfunction resolveLightingQualityDimensions(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { shadows: 1, lightingSamples: 0.7 },\n \"hybrid.screenTrace\": { rayTracing: 1, temporalReuse: 0.4 },\n \"hybrid.radianceCache\": {\n lightingSamples: 0.8,\n updateCadence: 0.7,\n temporalReuse: 1,\n },\n \"hybrid.finalGather\": { lightingSamples: 1, rayTracing: 0.6 },\n \"hybrid.reflectionResolve\": {\n rayTracing: 0.5,\n temporalReuse: 1,\n shading: 0.3,\n },\n \"pathtracer.pathTrace\": { rayTracing: 1, lightingSamples: 1 },\n \"pathtracer.accumulate\": { temporalReuse: 1, updateCadence: 0.4 },\n \"pathtracer.denoise\": { temporalReuse: 1, shading: 0.4 },\n \"volumetrics.froxelIntegrate\": {\n lightingSamples: 0.6,\n shading: 0.4,\n updateCadence: 0.3,\n },\n \"volumetrics.volumetricShadow\": { shadows: 0.8, updateCadence: 0.5 },\n \"hdri.irradianceConvolution\": {\n lightingSamples: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.specularPrefilter\": {\n lightingSamples: 0.5,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.brdfLut\": {\n shading: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n }[key] ?? {}\n );\n}\n\nfunction resolveLightingImportanceSignals(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { visible: true, shadowSignificance: \"high\" },\n \"hybrid.screenTrace\": { visible: true, reflectionSignificance: \"high\" },\n \"hybrid.radianceCache\": { visible: true },\n \"hybrid.finalGather\": {\n visible: true,\n shadowSignificance: \"critical\",\n reflectionSignificance: \"high\",\n },\n \"hybrid.reflectionResolve\": { visible: true, reflectionSignificance: \"high\" },\n \"pathtracer.pathTrace\": {\n visible: true,\n shadowSignificance: \"high\",\n reflectionSignificance: \"high\",\n },\n \"pathtracer.accumulate\": { visible: true },\n \"pathtracer.denoise\": { visible: true },\n \"volumetrics.froxelIntegrate\": { visible: true },\n \"volumetrics.volumetricShadow\": { visible: true, shadowSignificance: \"high\" },\n \"hdri.irradianceConvolution\": { visible: false },\n \"hdri.specularPrefilter\": { visible: false, reflectionSignificance: \"medium\" },\n \"hdri.brdfLut\": { visible: false },\n }[key] ?? {}\n );\n}\n\nfunction buildWorkerManifestJob(techniqueName, job) {\n const spec = lightingWorkerSpecPresets[techniqueName].jobs[job.key];\n const dag = lightingWorkerDagSpecs[techniqueName][job.key];\n const dependencies = dag.dependencies.map(\n (dependency) => `lighting.${techniqueName}.${dependency}`\n );\n\n return Object.freeze({\n key: job.key,\n label: job.label,\n worker: Object.freeze({\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: job.label,\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n qualityDimensions: resolveLightingQualityDimensions(techniqueName, job.key),\n importanceSignals: resolveLightingImportanceSignals(techniqueName, job.key),\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: lightingDebugOwner,\n queueClass: lightingWorkerQueueClass,\n jobType: job.label,\n tags: Object.freeze([\n \"lighting\",\n techniqueName,\n job.key,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildLightingWorkerManifest(name, technique) {\n const spec = lightingWorkerSpecPresets[name];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n technique: name,\n description: technique.description,\n queueClass: lightingWorkerQueueClass,\n schedulerMode: \"dag\",\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n technique.jobs.map((job) => buildWorkerManifestJob(name, job))\n ),\n });\n}\n\nexport const lightingWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(lightingTechniques).map(([name, technique]) => [\n name,\n buildLightingWorkerManifest(name, technique),\n ])\n )\n);\n\nfunction getTechniqueJob(technique, key) {\n const job = technique.jobs.find((entry) => entry.key === key);\n if (!job) {\n const available = technique.jobs.map((entry) => entry.key).join(\", \");\n throw new Error(\n `Unknown job \"${key}\" for technique \"${technique.name}\". ` +\n `Available: ${available}.`\n );\n }\n return job;\n}\n\nexport function getLightingTechnique(name = defaultLightingTechnique) {\n const technique = lightingTechniques[name];\n if (!technique) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(`Unknown lighting technique \"${name}\". Available: ${available}.`);\n }\n return technique;\n}\n\nexport function getLightingProfile(name = defaultLightingProfile) {\n const profile = lightingProfiles[name];\n if (!profile) {\n const available = lightingProfileNames.join(\", \");\n throw new Error(`Unknown lighting profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getLightingTechniqueWorkerManifest(\n name = defaultLightingTechnique\n) {\n const manifest = lightingWorkerManifests[name];\n if (!manifest) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(\n `Unknown lighting technique \"${name}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function getLightingProfileWorkerManifest(\n name = defaultLightingProfile\n) {\n const profile = getLightingProfile(name);\n const techniques = profile.techniques.map((techniqueName) =>\n getLightingTechniqueWorkerManifest(techniqueName)\n );\n const lightingBandPlan = createLightingBandPlan({ profile: profile.name });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n description: profile.description,\n schedulerMode: \"dag\",\n techniques: Object.freeze(techniques),\n lightingBands: lightingBandPlan.bands,\n jobs: Object.freeze(techniques.flatMap((technique) => technique.jobs)),\n });\n}\n\nconst defaultTechnique = getLightingTechnique(defaultLightingTechnique);\n\nexport const lightingPreludeWgslUrl = defaultTechnique.preludeUrl;\n\nexport const lightingJobLabels = Object.freeze(\n Object.fromEntries(defaultTechnique.jobs.map((job) => [job.key, job.label]))\n);\n\nexport const lightingJobs = defaultTechnique.jobs.map((job) => ({\n label: job.label,\n url: job.url,\n sourceName: job.sourceName,\n}));\n\nfunction assertNotHtmlWgsl(source, context) {\n const sample = source.slice(0, 200).toLowerCase();\n if (\n sample.includes(\"<!doctype\") ||\n sample.includes(\"<html\") ||\n sample.includes(\"<meta\")\n ) {\n const label = context ? ` for ${context}` : \"\";\n throw new Error(\n `Expected WGSL${label} but received HTML. Check the URL or server root.`\n );\n }\n}\n\nasync function loadWgslSource(options = {}) {\n const { wgsl, url, fetcher = globalThis.fetch, base } = options ?? {};\n if (typeof wgsl === \"string\") {\n assertNotHtmlWgsl(wgsl, \"inline WGSL\");\n return wgsl;\n }\n if (!url) {\n return null;\n }\n const resolved = url instanceof URL ? url : new URL(url, base ?? baseUrl);\n if (!fetcher || resolved.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const source = await readFile(fileURLToPath(resolved), \"utf8\");\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n }\n const response = await fetcher(resolved);\n if (!response.ok) {\n const status = \"status\" in response ? response.status : \"unknown\";\n const statusText = \"statusText\" in response ? response.statusText : \"\";\n const detail = statusText ? `${status} ${statusText}` : `${status}`;\n throw new Error(`Failed to load WGSL (${detail})`);\n }\n const source = await response.text();\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n}\n\nasync function loadTechniquePrelude(technique, fetcher) {\n const source = await loadWgslSource({ url: technique.preludeUrl, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(`Failed to load ${technique.name} prelude WGSL source.`);\n }\n return source;\n}\n\nasync function loadTechniqueJob(technique, job, fetcher) {\n const source = await loadWgslSource({ url: job.url, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(\n `Failed to load ${technique.name} job \"${job.key}\" WGSL source.`\n );\n }\n return source;\n}\n\nexport async function loadLightingTechniquePreludeWgsl(\n techniqueName,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n return loadTechniquePrelude(technique, fetcher);\n}\n\nexport async function loadLightingTechniqueJobWgsl(\n techniqueName,\n jobKey,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const job = getTechniqueJob(technique, jobKey);\n return loadTechniqueJob(technique, job, fetcher);\n}\n\nexport async function loadLightingTechniqueJobs(techniqueName, options = {}) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const preludeWgsl = await loadTechniquePrelude(technique, fetcher);\n const jobSources = await Promise.all(\n technique.jobs.map((job) => loadTechniqueJob(technique, job, fetcher))\n );\n const jobs = technique.jobs.map((job, index) => ({\n wgsl: jobSources[index],\n label: job.label,\n sourceName: job.sourceName,\n }));\n return { preludeWgsl, jobs };\n}\n\nexport async function loadLightingTechniqueWorkerBundle(\n techniqueName = defaultLightingTechnique,\n options = {}\n) {\n const technique = getLightingTechnique(techniqueName);\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n technique.name,\n options\n );\n\n return {\n technique: technique.name,\n preludeWgsl,\n jobs,\n workerManifest: getLightingTechniqueWorkerManifest(technique.name),\n };\n}\n\nexport async function loadLightingPreludeWgsl(options = {}) {\n const { fetcher } = options ?? {};\n return loadTechniquePrelude(defaultTechnique, fetcher);\n}\n\nexport async function loadLightingJobs(options = {}) {\n return loadLightingTechniqueJobs(defaultLightingTechnique, options);\n}\n\nexport async function loadLightingProfile(profileName, options = {}) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map(async (techniqueName) => {\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n techniqueName,\n options\n );\n return {\n technique: techniqueName,\n preludeWgsl,\n jobs,\n };\n })\n );\n return { profile, techniques };\n}\n\nexport async function loadLightingProfileWorkerPlan(\n profileName = defaultLightingProfile,\n options = {}\n) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map((techniqueName) =>\n loadLightingTechniqueWorkerBundle(techniqueName, options)\n )\n );\n\n return {\n profile,\n techniques,\n lightingBandPlan: createLightingBandPlan({ profile: profile.name }),\n workerManifest: getLightingProfileWorkerManifest(profile.name),\n };\n}\n","import type {\n DeviceClass,\n GpuTier,\n ModuleAuthority,\n ModuleImportance,\n PerformanceDomain,\n RuntimeMode,\n ThermalState,\n WorkerJobQueueClass,\n WorkerSchedulerMode,\n} from \"./types.js\";\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/u;\n\nexport const runtimeModes = Object.freeze([\n \"flat\",\n \"immersive-vr\",\n \"immersive-ar\",\n]) satisfies readonly RuntimeMode[];\n\nexport const deviceClasses = Object.freeze([\n \"mobile\",\n \"tablet\",\n \"desktop\",\n \"xr-headset\",\n \"unknown\",\n]) satisfies readonly DeviceClass[];\n\nexport const gpuTiers = Object.freeze([\n \"low\",\n \"mid\",\n \"high\",\n \"ultra\",\n \"unknown\",\n]) satisfies readonly GpuTier[];\n\nexport const thermalStates = Object.freeze([\n \"nominal\",\n \"fair\",\n \"serious\",\n \"critical\",\n]) satisfies readonly ThermalState[];\n\nexport const performanceDomains = Object.freeze([\n \"resolution\",\n \"shadows\",\n \"volumetrics\",\n \"reflections\",\n \"post-processing\",\n \"lighting\",\n \"particles\",\n \"cloth\",\n \"geometry\",\n \"textures\",\n \"animation\",\n \"xr\",\n \"physics\",\n \"custom\",\n]) satisfies readonly PerformanceDomain[];\n\nexport const moduleAuthorities = Object.freeze([\n \"visual\",\n \"non-authoritative-simulation\",\n \"authoritative\",\n]) satisfies readonly ModuleAuthority[];\n\nexport const moduleImportances = Object.freeze([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]) satisfies readonly ModuleImportance[];\n\nexport const workerJobQueueClasses = Object.freeze([\n \"render\",\n \"simulation\",\n \"lighting\",\n \"post-processing\",\n \"voxel\",\n \"custom\",\n]) satisfies readonly WorkerJobQueueClass[];\n\nexport const workerSchedulerModes = Object.freeze([\n \"flat\",\n \"dag\",\n]) satisfies readonly WorkerSchedulerMode[];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Ensures a value is one of the allowed string literal members.\n */\nexport function assertEnumValue<T extends string>(\n name: string,\n value: unknown,\n allowedValues: readonly T[]\n): T {\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(\n `${name} must be one of: ${allowedValues.join(\", \")}.`\n );\n }\n\n return value as T;\n}\n\n/**\n * Validates numeric input that must be finite and greater than zero.\n */\nexport function readPositiveNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n\n return value;\n}\n\n/**\n * Validates numeric input that must be finite and zero or greater.\n */\nexport function readNonNegativeNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\n/**\n * Validates bounded identifier strings used for module and frame ids.\n */\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value)) {\n throw new Error(\n `${name} must match ${IDENTIFIER_PATTERN.toString()} and be at most 64 characters long.`\n );\n }\n\n return value;\n}\n\n/**\n * Validates that a value is a plain object and returns a shallow-frozen copy.\n */\nexport function normalizePlainObject(\n name: string,\n value: unknown\n): Readonly<Record<string, unknown>> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isRecord(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n return Object.freeze({ ...value });\n}\n\n/**\n * Validates bounded arrays of positive numeric buckets.\n */\nexport function readFrameRateBuckets(\n name: string,\n value: unknown,\n maxEntries = 16\n): number[] {\n if (value === undefined) {\n return [];\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${name} must be an array of frame-rate numbers.`);\n }\n\n if (value.length > maxEntries) {\n throw new Error(`${name} cannot contain more than ${maxEntries} entries.`);\n }\n\n return value.map((entry, index) => {\n const parsed = readPositiveNumber(`${name}[${index}]`, entry);\n return Math.round(parsed ?? 0);\n });\n}\n\n/**\n * Best-effort validation for AbortSignal-like objects without depending on a specific runtime implementation.\n */\nexport function isAbortSignalLike(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"aborted\" in value &&\n typeof (value as AbortSignal).aborted === \"boolean\"\n );\n}\n","import type {\n DeviceProfile,\n DeviceProfileInput,\n FrameTargetNegotiationOptions,\n FrameTargetProfile,\n RuntimeMode,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n deviceClasses,\n gpuTiers,\n normalizePlainObject,\n readFrameRateBuckets,\n readPositiveNumber,\n runtimeModes,\n thermalStates,\n} from \"./validation.js\";\n\nconst DEFAULT_FRAME_RATE_BUCKETS = Object.freeze([120, 90, 72, 60, 45, 36, 30]);\n\nfunction uniqueSortedFrameRates(values: readonly number[]): number[] {\n if (values.length === 0) {\n return [];\n }\n\n return [...new Set(values.map((value) => Math.round(value)))].sort(\n (left, right) => right - left\n );\n}\n\nfunction defaultModeForDevice(deviceClass: DeviceProfileInput[\"deviceClass\"]): RuntimeMode {\n return deviceClass === \"xr-headset\" ? \"immersive-vr\" : \"flat\";\n}\n\n/**\n * Normalizes the caller-supplied device profile into a deterministic runtime profile.\n */\nexport function createDeviceProfile(input: DeviceProfileInput = {}): DeviceProfile {\n const deviceClass =\n input.deviceClass === undefined\n ? \"unknown\"\n : assertEnumValue(\"deviceClass\", input.deviceClass, deviceClasses);\n const mode =\n input.mode === undefined\n ? defaultModeForDevice(deviceClass)\n : assertEnumValue(\"mode\", input.mode, runtimeModes);\n const defaultRefreshRateHz = mode === \"flat\" ? 60 : 72;\n const refreshRateHz =\n readPositiveNumber(\"refreshRateHz\", input.refreshRateHz) ?? defaultRefreshRateHz;\n const supportedFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"supportedFrameRates\", input.supportedFrameRates)\n );\n const metadata = normalizePlainObject(\"metadata\", input.metadata);\n\n return Object.freeze({\n deviceClass,\n mode,\n refreshRateHz,\n supportedFrameRates: Object.freeze(\n supportedFrameRates.length > 0 ? supportedFrameRates : [refreshRateHz]\n ),\n gpuTier:\n input.gpuTier === undefined\n ? \"unknown\"\n : assertEnumValue(\"gpuTier\", input.gpuTier, gpuTiers),\n supportsWebGpu: input.supportsWebGpu ?? true,\n supportsFoveation: input.supportsFoveation ?? false,\n thermalState:\n input.thermalState === undefined\n ? \"nominal\"\n : assertEnumValue(\"thermalState\", input.thermalState, thermalStates),\n metadata,\n });\n}\n\n/**\n * Negotiates a device-specific frame target and guardrails for the adaptive governor.\n */\nexport function negotiateFrameTarget(\n options: FrameTargetNegotiationOptions = {}\n): FrameTargetProfile {\n const mode =\n options.mode === undefined\n ? \"flat\"\n : assertEnumValue(\"mode\", options.mode, runtimeModes);\n const minimumFrameRate = Math.round(\n readPositiveNumber(\"minimumFrameRate\", options.minimumFrameRate) ?? 60\n );\n const maximumFrameRate = readPositiveNumber(\n \"maximumFrameRate\",\n options.maximumFrameRate\n );\n const deviceRefreshRateHz = readPositiveNumber(\n \"deviceRefreshRateHz\",\n options.deviceRefreshRateHz\n );\n const supportedFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"supportedFrameRates\", options.supportedFrameRates)\n );\n const preferredFrameRates = uniqueSortedFrameRates(\n readFrameRateBuckets(\"preferredFrameRates\", options.preferredFrameRates)\n );\n\n if (maximumFrameRate !== undefined && maximumFrameRate < minimumFrameRate) {\n throw new Error(\"maximumFrameRate must be greater than or equal to minimumFrameRate.\");\n }\n\n const rationale: string[] = [];\n\n const candidateFrameRates = uniqueSortedFrameRates([\n ...preferredFrameRates,\n ...supportedFrameRates,\n ...DEFAULT_FRAME_RATE_BUCKETS,\n ]).filter((rate) => {\n if (maximumFrameRate && rate > maximumFrameRate) {\n return false;\n }\n\n if (deviceRefreshRateHz && rate > deviceRefreshRateHz) {\n return false;\n }\n\n return true;\n });\n\n let targetFrameRate =\n candidateFrameRates.find((rate) => rate >= minimumFrameRate) ??\n candidateFrameRates[0] ??\n deviceRefreshRateHz ??\n minimumFrameRate;\n\n if (\n mode !== \"flat\" &&\n deviceRefreshRateHz &&\n supportedFrameRates.includes(Math.round(deviceRefreshRateHz))\n ) {\n targetFrameRate = Math.round(deviceRefreshRateHz);\n rationale.push(\n `Using native ${targetFrameRate} Hz immersive session target supported by the device.`\n );\n } else if (targetFrameRate >= minimumFrameRate) {\n rationale.push(\n `Selected ${targetFrameRate} FPS from the negotiated device frame-rate bucket set.`\n );\n } else {\n rationale.push(\n `Device could not meet the requested ${minimumFrameRate} FPS floor, falling back to ${targetFrameRate} FPS.`\n );\n }\n\n if (mode === \"flat\") {\n rationale.push(\"Flat mode keeps a 60 FPS floor by default and negotiates upward.\");\n } else {\n rationale.push(\"Immersive modes prefer headset-native cadence when the session supports it.\");\n }\n\n const targetFrameTimeMs = 1000 / targetFrameRate;\n const downgradeMultiplier = mode === \"flat\" ? 1.05 : 1.03;\n const upgradeMultiplier = mode === \"flat\" ? 0.92 : 0.95;\n\n return Object.freeze({\n mode,\n minimumFrameRate,\n targetFrameRate,\n targetFrameTimeMs,\n downgradeFrameTimeMs: targetFrameTimeMs * downgradeMultiplier,\n upgradeFrameTimeMs: targetFrameTimeMs * upgradeMultiplier,\n candidateFrameRates: Object.freeze(candidateFrameRates),\n rationale: Object.freeze(rationale),\n });\n}\n","import type {\n MotionClass,\n PerformanceBudgetMetadata,\n PerformanceImportanceSignals,\n PerformanceQualityDimensions,\n QualityDimension,\n RepresentationBand,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n moduleImportances,\n readNonNegativeNumber,\n} from \"./validation.js\";\n\nexport const representationBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]) satisfies readonly RepresentationBand[];\n\nexport const rayTracingQualityDimensions = Object.freeze([\n \"geometry\",\n \"animation\",\n \"deformation\",\n \"shading\",\n \"shadows\",\n \"rayTracing\",\n \"lightingSamples\",\n \"updateCadence\",\n \"temporalReuse\",\n]) satisfies readonly QualityDimension[];\n\nexport const motionClasses = Object.freeze([\n \"stable\",\n \"dynamic\",\n \"volatile\",\n]) satisfies readonly MotionClass[];\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeQualityDimensions(\n name: string,\n value: unknown\n): PerformanceQualityDimensions {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isPlainObject(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n const normalized = Object.fromEntries(\n Object.entries(value).flatMap(([key, rawValue]) => {\n const dimension = assertEnumValue(\n `${name}.${key}`,\n key,\n rayTracingQualityDimensions\n );\n const weight = readNonNegativeNumber(`${name}.${key}`, rawValue) ?? 0;\n return weight > 0 ? [[dimension, weight]] : [];\n })\n );\n\n return Object.freeze(normalized);\n}\n\nfunction normalizeImportanceSignals(\n name: string,\n value: unknown\n): Readonly<PerformanceImportanceSignals> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isPlainObject(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n const normalized: PerformanceImportanceSignals = {};\n\n if (value.visible !== undefined) {\n if (typeof value.visible !== \"boolean\") {\n throw new Error(`${name}.visible must be a boolean when provided.`);\n }\n normalized.visible = value.visible;\n }\n\n if (value.playerRelevant !== undefined) {\n if (typeof value.playerRelevant !== \"boolean\") {\n throw new Error(`${name}.playerRelevant must be a boolean when provided.`);\n }\n normalized.playerRelevant = value.playerRelevant;\n }\n\n if (value.imageCritical !== undefined) {\n if (typeof value.imageCritical !== \"boolean\") {\n throw new Error(`${name}.imageCritical must be a boolean when provided.`);\n }\n normalized.imageCritical = value.imageCritical;\n }\n\n if (value.motionClass !== undefined) {\n normalized.motionClass = assertEnumValue(\n `${name}.motionClass`,\n value.motionClass,\n motionClasses\n );\n }\n\n if (value.shadowSignificance !== undefined) {\n normalized.shadowSignificance = assertEnumValue(\n `${name}.shadowSignificance`,\n value.shadowSignificance,\n moduleImportances\n );\n }\n\n if (value.reflectionSignificance !== undefined) {\n normalized.reflectionSignificance = assertEnumValue(\n `${name}.reflectionSignificance`,\n value.reflectionSignificance,\n moduleImportances\n );\n }\n\n return Object.freeze(normalized);\n}\n\nexport function normalizePerformanceBudgetMetadata(\n name: string,\n value: unknown\n): Required<Omit<PerformanceBudgetMetadata, \"representationBand\">> &\n Pick<PerformanceBudgetMetadata, \"representationBand\"> {\n const source = isPlainObject(value) ? value : {};\n const representationBand =\n source.representationBand === undefined\n ? undefined\n : assertEnumValue(\n `${name}.representationBand`,\n source.representationBand,\n representationBands\n );\n\n return Object.freeze({\n representationBand,\n qualityDimensions: normalizeQualityDimensions(\n `${name}.qualityDimensions`,\n source.qualityDimensions\n ),\n importanceSignals: normalizeImportanceSignals(\n `${name}.importanceSignals`,\n source.importanceSignals\n ),\n });\n}\n","import { createDeviceProfile, negotiateFrameTarget } from \"./device.js\";\nimport type {\n FrameSample,\n GovernorAdaptationOptions,\n GovernorDecision,\n GovernorErrorRecord,\n GovernorMetrics,\n GovernorState,\n GovernorWorkerGraphSummary,\n GpuPerformanceGovernorOptions,\n PerformanceAdjustmentContext,\n PerformanceAdjustmentRecord,\n PerformanceDomain,\n PerformanceGovernor,\n PerformanceModuleAdapter,\n PerformanceModuleSnapshot,\n PressureLevel,\n ThermalState,\n} from \"./types.js\";\nimport {\n assertIdentifier,\n isAbortSignalLike,\n performanceDomains,\n readNonNegativeNumber,\n readPositiveNumber,\n thermalStates,\n} from \"./validation.js\";\n\nconst MAX_MODULE_COUNT = 128;\nconst MAX_SAMPLE_WINDOW_SIZE = 240;\n\nexport const defaultDomainOrder = Object.freeze<readonly PerformanceDomain[]>([\n \"resolution\",\n \"shadows\",\n \"volumetrics\",\n \"reflections\",\n \"post-processing\",\n \"lighting\",\n \"particles\",\n \"cloth\",\n \"geometry\",\n \"textures\",\n \"animation\",\n \"xr\",\n \"physics\",\n \"custom\",\n]);\n\nconst DEFAULT_ADAPTATION_OPTIONS = Object.freeze<Required<GovernorAdaptationOptions>>({\n sampleWindowSize: 24,\n minimumSamplesBeforeAdjustment: 8,\n degradeCooldownFrames: 6,\n upgradeCooldownFrames: 24,\n minStableFramesForRecovery: 10,\n trendSensitivityMs: 0.35,\n emaAlpha: 0.25,\n maxStepChangesPerCycle: 2,\n allowAuthoritativeScaling: false,\n domainOrder: defaultDomainOrder,\n maxRetainedErrors: 50,\n maxRetainedFrameIds: 512,\n});\n\nfunction clampPositiveInteger(\n value: number | undefined,\n fallback: number,\n maximum?: number\n): number {\n if (!value || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n\n const rounded = Math.round(value);\n return maximum ? Math.min(rounded, maximum) : rounded;\n}\n\nfunction clampRatio(value: number | undefined, fallback: number): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value <= 0 ||\n value >= 1\n ) {\n return fallback;\n }\n\n return value;\n}\n\nfunction buildAdaptationOptions(\n options: GovernorAdaptationOptions | undefined\n): Required<GovernorAdaptationOptions> {\n const domainOrder =\n options?.domainOrder?.length && options.domainOrder.length <= performanceDomains.length\n ? [...new Set(options.domainOrder)]\n : DEFAULT_ADAPTATION_OPTIONS.domainOrder;\n\n return {\n sampleWindowSize: clampPositiveInteger(\n options?.sampleWindowSize,\n DEFAULT_ADAPTATION_OPTIONS.sampleWindowSize,\n MAX_SAMPLE_WINDOW_SIZE\n ),\n minimumSamplesBeforeAdjustment: clampPositiveInteger(\n options?.minimumSamplesBeforeAdjustment,\n DEFAULT_ADAPTATION_OPTIONS.minimumSamplesBeforeAdjustment\n ),\n degradeCooldownFrames: clampPositiveInteger(\n options?.degradeCooldownFrames,\n DEFAULT_ADAPTATION_OPTIONS.degradeCooldownFrames\n ),\n upgradeCooldownFrames: clampPositiveInteger(\n options?.upgradeCooldownFrames,\n DEFAULT_ADAPTATION_OPTIONS.upgradeCooldownFrames\n ),\n minStableFramesForRecovery: clampPositiveInteger(\n options?.minStableFramesForRecovery,\n DEFAULT_ADAPTATION_OPTIONS.minStableFramesForRecovery\n ),\n trendSensitivityMs:\n typeof options?.trendSensitivityMs === \"number\" &&\n Number.isFinite(options.trendSensitivityMs) &&\n options.trendSensitivityMs > 0\n ? options.trendSensitivityMs\n : DEFAULT_ADAPTATION_OPTIONS.trendSensitivityMs,\n emaAlpha: clampRatio(options?.emaAlpha, DEFAULT_ADAPTATION_OPTIONS.emaAlpha),\n maxStepChangesPerCycle: clampPositiveInteger(\n options?.maxStepChangesPerCycle,\n DEFAULT_ADAPTATION_OPTIONS.maxStepChangesPerCycle\n ),\n allowAuthoritativeScaling:\n options?.allowAuthoritativeScaling ??\n DEFAULT_ADAPTATION_OPTIONS.allowAuthoritativeScaling,\n domainOrder,\n maxRetainedErrors: clampPositiveInteger(\n options?.maxRetainedErrors,\n DEFAULT_ADAPTATION_OPTIONS.maxRetainedErrors\n ),\n maxRetainedFrameIds: clampPositiveInteger(\n options?.maxRetainedFrameIds,\n DEFAULT_ADAPTATION_OPTIONS.maxRetainedFrameIds\n ),\n };\n}\n\nfunction averageOf(values: readonly number[]): number | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n return values.reduce((total, value) => total + value, 0) / values.length;\n}\n\nfunction percentile(values: readonly number[], ratio: number): number {\n if (values.length === 0) {\n return 0;\n }\n\n const sorted = [...values].sort((left, right) => left - right);\n const index = Math.min(\n sorted.length - 1,\n Math.max(0, Math.ceil(sorted.length * ratio) - 1)\n );\n\n return sorted[index] ?? 0;\n}\n\nfunction averageFrameMetric(\n samples: readonly FrameSample[],\n key: \"cpuTimeMs\" | \"gpuTimeMs\"\n) {\n const values = samples\n .map((sample) => sample[key])\n .filter((value): value is number => typeof value === \"number\");\n\n return averageOf(values);\n}\n\nfunction computeTrendDelta(samples: readonly FrameSample[]): number {\n if (samples.length < 4) {\n return 0;\n }\n\n const midpoint = Math.floor(samples.length / 2);\n const older = samples.slice(0, midpoint).map((sample) => sample.frameTimeMs);\n const newer = samples.slice(midpoint).map((sample) => sample.frameTimeMs);\n const olderAverage = averageOf(older) ?? 0;\n const newerAverage = averageOf(newer) ?? 0;\n return newerAverage - olderAverage;\n}\n\nfunction createMetrics(\n samples: readonly FrameSample[],\n emaFrameTimeMs: number,\n targetFrameTimeMs: number,\n thermalState: ThermalState\n): GovernorMetrics {\n const frameTimes = samples.map((sample) => sample.frameTimeMs);\n const latestFrameTimeMs = frameTimes[frameTimes.length - 1] ?? targetFrameTimeMs;\n const averageFrameTimeMs = averageOf(frameTimes) ?? targetFrameTimeMs;\n const fps = averageFrameTimeMs > 0 ? 1000 / averageFrameTimeMs : 0;\n const p95FrameTimeMs = percentile(frameTimes, 0.95);\n const dropRatio =\n samples.filter(\n (sample) =>\n sample.dropped === true || sample.frameTimeMs > targetFrameTimeMs * 1.1\n ).length / Math.max(1, samples.length);\n\n return {\n sampleCount: samples.length,\n fps,\n latestFrameTimeMs,\n averageFrameTimeMs,\n emaFrameTimeMs,\n p95FrameTimeMs,\n averageCpuTimeMs: averageFrameMetric(samples, \"cpuTimeMs\"),\n averageGpuTimeMs: averageFrameMetric(samples, \"gpuTimeMs\"),\n targetFrameTimeMs,\n frameTimeDeltaMs: averageFrameTimeMs - targetFrameTimeMs,\n trendDeltaMs: computeTrendDelta(samples),\n dropRatio,\n thermalState,\n };\n}\n\nfunction classifyPressure(\n metrics: GovernorMetrics,\n downgradeFrameTimeMs: number,\n upgradeFrameTimeMs: number,\n trendSensitivityMs: number\n): PressureLevel {\n if (\n metrics.thermalState === \"critical\" ||\n metrics.averageFrameTimeMs >= metrics.targetFrameTimeMs * 1.25 ||\n metrics.latestFrameTimeMs >= metrics.targetFrameTimeMs * 1.5 ||\n metrics.dropRatio >= 0.35\n ) {\n return \"starved\";\n }\n\n if (\n metrics.thermalState === \"serious\" ||\n metrics.averageFrameTimeMs >= metrics.targetFrameTimeMs * 1.12 ||\n metrics.p95FrameTimeMs >= metrics.targetFrameTimeMs * 1.25 ||\n metrics.trendDeltaMs >= trendSensitivityMs * 1.5\n ) {\n return \"critical\";\n }\n\n if (\n metrics.thermalState === \"fair\" ||\n metrics.averageFrameTimeMs >= downgradeFrameTimeMs ||\n metrics.trendDeltaMs >= trendSensitivityMs ||\n metrics.dropRatio >= 0.1\n ) {\n return \"elevated\";\n }\n\n if (\n metrics.averageFrameTimeMs <= upgradeFrameTimeMs &&\n metrics.trendDeltaMs <= 0 &&\n metrics.dropRatio <= 0.05\n ) {\n return \"recovering\";\n }\n\n return \"stable\";\n}\n\nfunction domainRank(\n domain: PerformanceDomain,\n domainOrder: readonly PerformanceDomain[]\n): number {\n const index = domainOrder.indexOf(domain);\n return index >= 0 ? index : domainOrder.length + 1;\n}\n\ntype WorkerDagSnapshot = PerformanceModuleSnapshot & {\n priority: number;\n dependencies: readonly string[];\n dependents: readonly string[];\n dependencyCount: number;\n unresolvedDependencyCount: number;\n dependentCount: number;\n root: boolean;\n schedulerMode: \"flat\" | \"dag\";\n};\n\nfunction toWorkerDagSnapshot(\n snapshot: PerformanceModuleSnapshot\n): WorkerDagSnapshot | null {\n if (\n typeof (snapshot as { priority?: unknown }).priority !== \"number\" ||\n !Array.isArray((snapshot as { dependencies?: unknown }).dependencies) ||\n !Array.isArray((snapshot as { dependents?: unknown }).dependents) ||\n typeof (snapshot as { dependencyCount?: unknown }).dependencyCount !== \"number\" ||\n typeof (snapshot as { unresolvedDependencyCount?: unknown }).unresolvedDependencyCount !==\n \"number\" ||\n typeof (snapshot as { dependentCount?: unknown }).dependentCount !== \"number\" ||\n typeof (snapshot as { root?: unknown }).root !== \"boolean\" ||\n ((snapshot as { schedulerMode?: unknown }).schedulerMode !== \"flat\" &&\n (snapshot as { schedulerMode?: unknown }).schedulerMode !== \"dag\")\n ) {\n return null;\n }\n\n return snapshot as WorkerDagSnapshot;\n}\n\nconst representationBandProtectionScores = Object.freeze({\n near: 140,\n mid: 80,\n far: 20,\n horizon: 0,\n});\n\nconst motionProtectionScores = Object.freeze({\n stable: 0,\n dynamic: 12,\n volatile: 24,\n});\n\nconst dimensionBiasScores = Object.freeze({\n geometry: 22,\n animation: 16,\n deformation: 20,\n shading: 10,\n shadows: 8,\n rayTracing: 4,\n lightingSamples: -8,\n updateCadence: -24,\n temporalReuse: -20,\n});\n\nfunction importanceWeight(value: string | undefined): number {\n return value === \"critical\"\n ? 20\n : value === \"high\"\n ? 12\n : value === \"medium\"\n ? 6\n : 0;\n}\n\nfunction rankBudgetMetadata(snapshot: PerformanceModuleSnapshot): number {\n const representationBand =\n snapshot.representationBand &&\n snapshot.representationBand in representationBandProtectionScores\n ? snapshot.representationBand\n : undefined;\n const qualityDimensions =\n snapshot.qualityDimensions && typeof snapshot.qualityDimensions === \"object\"\n ? snapshot.qualityDimensions\n : {};\n const importanceSignals =\n snapshot.importanceSignals && typeof snapshot.importanceSignals === \"object\"\n ? snapshot.importanceSignals\n : {};\n\n const bandScore = representationBand\n ? representationBandProtectionScores[representationBand]\n : 0;\n const visibilityScore =\n (importanceSignals.visible ? 26 : 0) +\n (importanceSignals.playerRelevant ? 24 : 0) +\n (importanceSignals.imageCritical ? 18 : 0);\n const motionScore =\n importanceSignals.motionClass &&\n importanceSignals.motionClass in motionProtectionScores\n ? motionProtectionScores[importanceSignals.motionClass]\n : 0;\n const significanceScore =\n importanceWeight(importanceSignals.shadowSignificance) +\n importanceWeight(importanceSignals.reflectionSignificance);\n const dimensionScore = Object.entries(qualityDimensions).reduce(\n (total, [dimension, weight]) =>\n total +\n ((dimensionBiasScores as Record<string, number>)[dimension] ?? 0) *\n (typeof weight === \"number\" ? weight : 0),\n 0\n );\n\n return bandScore + visibilityScore + motionScore + significanceScore + dimensionScore;\n}\n\nfunction buildWorkerGraphSummary(\n snapshots: readonly PerformanceModuleSnapshot[]\n): GovernorWorkerGraphSummary | null {\n const dagSnapshots = snapshots\n .map((snapshot) => toWorkerDagSnapshot(snapshot))\n .filter((snapshot): snapshot is WorkerDagSnapshot => snapshot?.schedulerMode === \"dag\");\n\n if (dagSnapshots.length === 0) {\n return null;\n }\n\n const lanes = new Map<number, { priority: number; jobCount: number; rootCount: number; protectedJobCount: number }>();\n const roots: string[] = [];\n let protectedJobCount = 0;\n let maxPriority = 0;\n let maxDependentCount = 0;\n\n for (const snapshot of dagSnapshots) {\n if (snapshot.root) {\n roots.push(snapshot.id);\n }\n\n const isProtected =\n snapshot.authority === \"authoritative\" ||\n snapshot.root ||\n snapshot.priority > 0 ||\n snapshot.dependentCount > 0;\n if (isProtected) {\n protectedJobCount += 1;\n }\n\n maxPriority = Math.max(maxPriority, snapshot.priority);\n maxDependentCount = Math.max(maxDependentCount, snapshot.dependentCount);\n\n const lane = lanes.get(snapshot.priority) ?? {\n priority: snapshot.priority,\n jobCount: 0,\n rootCount: 0,\n protectedJobCount: 0,\n };\n lane.jobCount += 1;\n if (snapshot.root) {\n lane.rootCount += 1;\n }\n if (isProtected) {\n lane.protectedJobCount += 1;\n }\n lanes.set(snapshot.priority, lane);\n }\n\n return Object.freeze({\n schedulerMode: \"dag\",\n jobCount: dagSnapshots.length,\n rootCount: roots.length,\n protectedJobCount,\n degradableJobCount: dagSnapshots.length - protectedJobCount,\n maxPriority,\n maxDependentCount,\n roots: Object.freeze([...roots]),\n priorityLanes: Object.freeze(\n [...lanes.values()]\n .sort((left, right) => right.priority - left.priority)\n .map((lane) =>\n Object.freeze({\n priority: lane.priority,\n jobCount: lane.jobCount,\n rootCount: lane.rootCount,\n protectedJobCount: lane.protectedJobCount,\n })\n )\n ),\n });\n}\n\nfunction rankForDegrade(\n snapshot: PerformanceModuleSnapshot,\n domainOrder: readonly PerformanceDomain[],\n allowAuthoritativeScaling: boolean\n): number {\n if (snapshot.authority === \"authoritative\" && !allowAuthoritativeScaling) {\n return Number.POSITIVE_INFINITY;\n }\n\n const authorityScore =\n snapshot.authority === \"visual\"\n ? 0\n : snapshot.authority === \"non-authoritative-simulation\"\n ? 100\n : 300;\n const importanceScore =\n snapshot.importance === \"low\"\n ? 0\n : snapshot.importance === \"medium\"\n ? 20\n : snapshot.importance === \"high\"\n ? 40\n : 60;\n const costScore = -(snapshot.estimatedCostMs ?? 0);\n const workerDag = toWorkerDagSnapshot(snapshot);\n const dagProtectionScore =\n workerDag?.schedulerMode === \"dag\"\n ? (workerDag.root ? 120 : 0) +\n workerDag.priority * 25 +\n workerDag.dependentCount * 18\n : 0;\n const budgetMetadataScore = rankBudgetMetadata(snapshot);\n\n return (\n authorityScore +\n importanceScore +\n domainRank(snapshot.domain, domainOrder) * 10 +\n costScore +\n dagProtectionScore +\n budgetMetadataScore\n );\n}\n\nfunction buildReason(\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null\n): string {\n const average = metrics.averageFrameTimeMs.toFixed(2);\n const target = metrics.targetFrameTimeMs.toFixed(2);\n const trend = metrics.trendDeltaMs.toFixed(2);\n const graphNote =\n workerGraph && workerGraph.schedulerMode === \"dag\"\n ? ` DAG roots ${workerGraph.rootCount}/${workerGraph.jobCount}, max priority ${workerGraph.maxPriority}, max fan-out ${workerGraph.maxDependentCount}.`\n : \"\";\n return `${pressureLevel} pressure: avg ${average} ms vs target ${target} ms, trend delta ${trend} ms.${graphNote}`;\n}\n\nfunction sanitizeErrorMessage(error: unknown): string {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"Unexpected runtime failure.\";\n\n return message.replace(/\\s+/gu, \" \").trim().slice(0, 160) || \"Unexpected runtime failure.\";\n}\n\nfunction validateTelemetryHooks(\n telemetry: GpuPerformanceGovernorOptions[\"telemetry\"]\n): void {\n if (!telemetry) {\n return;\n }\n\n for (const [name, hook] of Object.entries(telemetry)) {\n if (hook !== undefined && typeof hook !== \"function\") {\n throw new Error(`telemetry.${name} must be a function when provided.`);\n }\n }\n}\n\nfunction validateFrameSample(sample: FrameSample): void {\n readPositiveNumber(\"frameTimeMs\", sample.frameTimeMs);\n readNonNegativeNumber(\"cpuTimeMs\", sample.cpuTimeMs);\n readNonNegativeNumber(\"gpuTimeMs\", sample.gpuTimeMs);\n readNonNegativeNumber(\"timestampMs\", sample.timestampMs);\n\n if (sample.dropped !== undefined && typeof sample.dropped !== \"boolean\") {\n throw new Error(\"dropped must be a boolean when provided.\");\n }\n\n if (sample.thermalState !== undefined && !thermalStates.includes(sample.thermalState)) {\n throw new Error(`thermalState must be one of: ${thermalStates.join(\", \")}.`);\n }\n\n if (sample.frameId !== undefined) {\n assertIdentifier(\"frameId\", sample.frameId);\n }\n\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"signal must be an AbortSignal-like object when provided.\");\n }\n}\n\nfunction validateModuleAdapter(module: PerformanceModuleAdapter): void {\n if (!module || typeof module !== \"object\") {\n throw new Error(\"modules entries must be objects that implement the adapter contract.\");\n }\n\n assertIdentifier(\"module.id\", module.id);\n\n if (typeof module.getSnapshot !== \"function\") {\n throw new Error(`Module \"${module.id}\" must implement getSnapshot().`);\n }\n\n if (typeof module.stepDown !== \"function\" || typeof module.stepUp !== \"function\") {\n throw new Error(`Module \"${module.id}\" must implement stepDown() and stepUp().`);\n }\n}\n\nfunction createErrorRecord(input: {\n cycle: number;\n source: GovernorErrorRecord[\"source\"];\n code: string;\n message: string;\n retryable: boolean;\n moduleId?: string;\n correlationId?: string;\n}): GovernorErrorRecord {\n return Object.freeze({\n cycle: input.cycle,\n source: input.source,\n code: input.code,\n message: input.message,\n retryable: input.retryable,\n moduleId: input.moduleId,\n correlationId: input.correlationId,\n });\n}\n\n/**\n * Creates the local closed-loop GPU performance governor.\n */\nexport function createGpuPerformanceGovernor(\n options: GpuPerformanceGovernorOptions\n): PerformanceGovernor {\n if (!options || typeof options !== \"object\") {\n throw new Error(\"createGpuPerformanceGovernor requires an options object.\");\n }\n\n validateTelemetryHooks(options.telemetry);\n\n const device = createDeviceProfile(options.device);\n if (!device.supportsWebGpu) {\n throw new Error(\n \"WebGPU support is required to create the GPU performance governor.\"\n );\n }\n\n const adaptation = buildAdaptationOptions(options.adaptation);\n const target = negotiateFrameTarget({\n mode: options.target?.mode ?? device.mode,\n deviceRefreshRateHz: options.target?.deviceRefreshRateHz ?? device.refreshRateHz,\n supportedFrameRates:\n options.target?.supportedFrameRates ?? device.supportedFrameRates,\n preferredFrameRates: options.target?.preferredFrameRates,\n minimumFrameRate: options.target?.minimumFrameRate,\n maximumFrameRate: options.target?.maximumFrameRate,\n });\n\n const modules = new Map<string, PerformanceModuleAdapter>();\n if ((options.modules?.length ?? 0) > MAX_MODULE_COUNT) {\n throw new Error(`modules cannot contain more than ${MAX_MODULE_COUNT} adapters.`);\n }\n\n for (const module of options.modules ?? []) {\n validateModuleAdapter(module);\n if (modules.has(module.id)) {\n throw new Error(`Duplicate module id \"${module.id}\" detected.`);\n }\n modules.set(module.id, module);\n }\n\n let cycle = 0;\n let samples: FrameSample[] = [];\n let emaFrameTimeMs = target.targetFrameTimeMs;\n let lastThermalState = device.thermalState;\n let lastDecision: GovernorDecision | null = null;\n let stableRecoveryFrames = 0;\n let lastDownCycle = Number.NEGATIVE_INFINITY;\n let lastUpCycle = Number.NEGATIVE_INFINITY;\n let recoveryStack: string[] = [];\n let recentErrors: GovernorErrorRecord[] = [];\n let recentFrameIds = new Set<string>();\n let recentFrameIdQueue: string[] = [];\n\n const appendError = (error: GovernorErrorRecord, decisionErrors?: GovernorErrorRecord[]) => {\n if (decisionErrors) {\n decisionErrors.push(error);\n }\n\n recentErrors = [...recentErrors, error].slice(-adaptation.maxRetainedErrors);\n\n if (typeof options.telemetry?.onError === \"function\") {\n try {\n options.telemetry.onError(error);\n } catch {\n // Error reporting must never cause recursive runtime failure.\n }\n }\n };\n\n const emitTelemetry = <Payload>(\n hook: ((payload: Payload) => void) | undefined,\n payload: Payload,\n errorFactory: () => GovernorErrorRecord,\n decisionErrors?: GovernorErrorRecord[]\n ) => {\n if (typeof hook !== \"function\") {\n return;\n }\n\n try {\n hook(payload);\n } catch {\n appendError(errorFactory(), decisionErrors);\n }\n };\n\n emitTelemetry(\n options.telemetry?.onTargetNegotiated,\n target,\n () =>\n createErrorRecord({\n cycle,\n source: \"telemetry\",\n code: \"TELEMETRY_TARGET_HOOK_FAILED\",\n message: \"Target-negotiated telemetry callback failed.\",\n retryable: true,\n })\n );\n\n const getModuleSnapshots = (): PerformanceModuleSnapshot[] =>\n [...modules.values()]\n .map((module) => {\n try {\n return module.getSnapshot();\n } catch {\n return null;\n }\n })\n .filter((snapshot): snapshot is PerformanceModuleSnapshot => snapshot !== null);\n\n const createContext = (\n cause: \"degrade\" | \"recover\",\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null\n ): PerformanceAdjustmentContext => ({\n cycle,\n cause,\n pressureLevel,\n metrics,\n target,\n workerGraph,\n });\n\n const classifyCurrentPressure = (metrics: GovernorMetrics) =>\n classifyPressure(\n metrics,\n target.downgradeFrameTimeMs,\n target.upgradeFrameTimeMs,\n adaptation.trendSensitivityMs\n );\n\n const buildDecision = (\n processed: boolean,\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n adjustments: readonly PerformanceAdjustmentRecord[],\n errors: readonly GovernorErrorRecord[],\n reason: string\n ): GovernorDecision => ({\n cycle,\n processed,\n pressureLevel,\n metrics,\n workerGraph,\n adjustments,\n errors,\n reason,\n });\n\n const buildIgnoredDecision = (\n reason: string,\n errors: readonly GovernorErrorRecord[] = []\n ): GovernorDecision => {\n const metrics =\n lastDecision?.metrics ??\n createMetrics(samples, emaFrameTimeMs, target.targetFrameTimeMs, lastThermalState);\n const pressureLevel = lastDecision?.pressureLevel ?? classifyCurrentPressure(metrics);\n const workerGraph =\n lastDecision?.workerGraph ?? buildWorkerGraphSummary(getModuleSnapshots());\n\n return buildDecision(\n false,\n pressureLevel,\n metrics,\n workerGraph,\n [],\n errors,\n reason\n );\n };\n\n const rememberFrameId = (frameId: string): boolean => {\n if (recentFrameIds.has(frameId)) {\n return false;\n }\n\n recentFrameIds.add(frameId);\n recentFrameIdQueue.push(frameId);\n\n while (recentFrameIdQueue.length > adaptation.maxRetainedFrameIds) {\n const oldest = recentFrameIdQueue.shift();\n if (oldest) {\n recentFrameIds.delete(oldest);\n }\n }\n\n return true;\n };\n\n const selectDegradeCandidates = (\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceModuleAdapter[] =>\n [...modules.values()]\n .map((module) => {\n try {\n return {\n module,\n snapshot: module.getSnapshot(),\n };\n } catch {\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_SNAPSHOT_FAILED\",\n message: `Module \"${module.id}\" snapshot failed and the module was skipped.`,\n retryable: true,\n moduleId: module.id,\n correlationId,\n }),\n decisionErrors\n );\n return null;\n }\n })\n .filter(\n (\n candidate\n ): candidate is {\n module: PerformanceModuleAdapter;\n snapshot: PerformanceModuleSnapshot;\n } => candidate !== null\n )\n .sort((left, right) => {\n const leftRank = rankForDegrade(\n left.snapshot,\n adaptation.domainOrder,\n adaptation.allowAuthoritativeScaling\n );\n const rightRank = rankForDegrade(\n right.snapshot,\n adaptation.domainOrder,\n adaptation.allowAuthoritativeScaling\n );\n\n return leftRank - rightRank;\n })\n .map((candidate) => candidate.module);\n\n const attemptDowngrade = (\n pressureLevel: PressureLevel,\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceAdjustmentRecord[] => {\n const changesAllowed =\n pressureLevel === \"starved\"\n ? adaptation.maxStepChangesPerCycle\n : Math.min(\n adaptation.maxStepChangesPerCycle,\n pressureLevel === \"critical\" ? 2 : 1\n );\n const context = createContext(\"degrade\", pressureLevel, metrics, workerGraph);\n const adjustments: PerformanceAdjustmentRecord[] = [];\n\n for (const module of selectDegradeCandidates(decisionErrors, correlationId)) {\n if (adjustments.length >= changesAllowed) {\n break;\n }\n\n try {\n const adjustment = module.stepDown(context);\n if (!adjustment) {\n continue;\n }\n\n adjustments.push(adjustment);\n recoveryStack.push(module.id);\n } catch {\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_STEP_DOWN_FAILED\",\n message: `Module \"${module.id}\" could not be reduced during degrade handling.`,\n retryable: true,\n moduleId: module.id,\n correlationId,\n }),\n decisionErrors\n );\n }\n }\n\n return adjustments;\n };\n\n const attemptRecovery = (\n metrics: GovernorMetrics,\n workerGraph: GovernorWorkerGraphSummary | null,\n decisionErrors: GovernorErrorRecord[],\n correlationId?: string\n ): PerformanceAdjustmentRecord[] => {\n const context = createContext(\"recover\", \"recovering\", metrics, workerGraph);\n\n while (recoveryStack.length > 0) {\n const moduleId = recoveryStack[recoveryStack.length - 1];\n if (!moduleId) {\n recoveryStack.pop();\n continue;\n }\n\n const module = modules.get(moduleId);\n if (!module) {\n recoveryStack.pop();\n continue;\n }\n\n try {\n const adjustment = module.stepUp(context);\n recoveryStack.pop();\n\n if (adjustment) {\n return [adjustment];\n }\n } catch {\n recoveryStack.pop();\n appendError(\n createErrorRecord({\n cycle,\n source: \"module\",\n code: \"MODULE_STEP_UP_FAILED\",\n message: `Module \"${moduleId}\" could not be restored during recovery handling.`,\n retryable: true,\n moduleId,\n correlationId,\n }),\n decisionErrors\n );\n }\n }\n\n return [];\n };\n\n return {\n recordFrame(sample) {\n if (!sample || typeof sample !== \"object\") {\n throw new Error(\"recordFrame requires a frame sample object.\");\n }\n\n validateFrameSample(sample);\n\n if (sample.signal?.aborted) {\n return buildIgnoredDecision(\n \"Ignored frame sample because its AbortSignal was already aborted.\"\n );\n }\n\n if (sample.frameId && !rememberFrameId(sample.frameId)) {\n return buildIgnoredDecision(\n `Ignored duplicate frame sample \"${sample.frameId}\".`\n );\n }\n\n cycle += 1;\n const decisionErrors: GovernorErrorRecord[] = [];\n lastThermalState = sample.thermalState ?? lastThermalState;\n emaFrameTimeMs =\n cycle === 1\n ? sample.frameTimeMs\n : sample.frameTimeMs * adaptation.emaAlpha +\n emaFrameTimeMs * (1 - adaptation.emaAlpha);\n\n samples = [...samples, sample].slice(-adaptation.sampleWindowSize);\n\n const metrics = createMetrics(\n samples,\n emaFrameTimeMs,\n target.targetFrameTimeMs,\n lastThermalState\n );\n const workerGraph = buildWorkerGraphSummary(getModuleSnapshots());\n const pressureLevel = classifyCurrentPressure(metrics);\n\n if (pressureLevel === \"recovering\" || pressureLevel === \"stable\") {\n stableRecoveryFrames += 1;\n } else {\n stableRecoveryFrames = 0;\n }\n\n let adjustments: PerformanceAdjustmentRecord[] = [];\n const enoughSamples =\n metrics.sampleCount >= adaptation.minimumSamplesBeforeAdjustment;\n\n if (\n enoughSamples &&\n (pressureLevel === \"elevated\" ||\n pressureLevel === \"critical\" ||\n pressureLevel === \"starved\") &&\n (pressureLevel === \"starved\" ||\n cycle - lastDownCycle >= adaptation.degradeCooldownFrames)\n ) {\n adjustments = attemptDowngrade(\n pressureLevel,\n metrics,\n workerGraph,\n decisionErrors,\n sample.frameId\n );\n if (adjustments.length > 0) {\n lastDownCycle = cycle;\n stableRecoveryFrames = 0;\n }\n } else if (\n enoughSamples &&\n pressureLevel === \"recovering\" &&\n stableRecoveryFrames >= adaptation.minStableFramesForRecovery &&\n cycle - lastUpCycle >= adaptation.upgradeCooldownFrames\n ) {\n adjustments = attemptRecovery(\n metrics,\n workerGraph,\n decisionErrors,\n sample.frameId\n );\n if (adjustments.length > 0) {\n lastUpCycle = cycle;\n stableRecoveryFrames = 0;\n }\n }\n\n const decision = buildDecision(\n true,\n pressureLevel,\n metrics,\n workerGraph,\n adjustments,\n decisionErrors,\n buildReason(pressureLevel, metrics, workerGraph)\n );\n\n emitTelemetry(\n options.telemetry?.onDecision,\n decision,\n () =>\n createErrorRecord({\n cycle,\n source: \"telemetry\",\n code: \"TELEMETRY_DECISION_HOOK_FAILED\",\n message: \"Decision telemetry callback failed.\",\n retryable: true,\n correlationId: sample.frameId,\n }),\n decisionErrors\n );\n\n const finalizedDecision =\n decisionErrors.length === 0\n ? decision\n : {\n ...decision,\n errors: [...decisionErrors],\n };\n\n lastDecision = finalizedDecision;\n return finalizedDecision;\n },\n registerModule(module) {\n validateModuleAdapter(module);\n if (modules.has(module.id)) {\n throw new Error(`Module \"${module.id}\" is already registered.`);\n }\n\n modules.set(module.id, module);\n\n return () => {\n modules.delete(module.id);\n recoveryStack = recoveryStack.filter((id) => id !== module.id);\n };\n },\n getTarget() {\n return target;\n },\n getState(): GovernorState {\n const moduleSnapshots = getModuleSnapshots();\n return {\n cycle,\n target,\n device,\n metrics: lastDecision?.metrics ?? null,\n modules: moduleSnapshots,\n workerGraph: buildWorkerGraphSummary(moduleSnapshots),\n lastDecision,\n recentErrors,\n };\n },\n reset() {\n cycle = 0;\n samples = [];\n emaFrameTimeMs = target.targetFrameTimeMs;\n lastThermalState = device.thermalState;\n lastDecision = null;\n stableRecoveryFrames = 0;\n lastDownCycle = Number.NEGATIVE_INFINITY;\n lastUpCycle = Number.NEGATIVE_INFINITY;\n recoveryStack = [];\n recentErrors = [];\n recentFrameIds = new Set();\n recentFrameIdQueue = [];\n },\n };\n}\n\n/**\n * Alias for createGpuPerformanceGovernor.\n */\nexport const createPerformanceGovernor = createGpuPerformanceGovernor;\n","import type {\n ModuleImportance,\n ModuleQualityLevel,\n ModuleAuthority,\n PerformanceBudgetMetadata,\n PerformanceAdjustmentContext,\n PerformanceAdjustmentRecord,\n PerformanceDomain,\n PerformanceModuleSnapshot,\n QualityLadderAdapter,\n QualityLadderAdapterOptions,\n} from \"./types.js\";\nimport { normalizePerformanceBudgetMetadata } from \"./budget.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n moduleAuthorities,\n moduleImportances,\n performanceDomains,\n readNonNegativeNumber,\n} from \"./validation.js\";\n\nfunction resolveLevelIndex<Payload>(\n levels: readonly ModuleQualityLevel<Payload>[],\n initialLevel: number | string | undefined\n): number {\n if (typeof initialLevel === \"number\") {\n if (initialLevel < 0 || initialLevel >= levels.length) {\n throw new Error(`Initial level index ${initialLevel} is out of range.`);\n }\n\n return initialLevel;\n }\n\n if (typeof initialLevel === \"string\") {\n const index = levels.findIndex((level) => level.id === initialLevel);\n if (index < 0) {\n throw new Error(`Initial level \"${initialLevel}\" does not exist in the ladder.`);\n }\n\n return index;\n }\n\n return levels.length - 1;\n}\n\nfunction assertUniqueLevelIds<Payload>(\n levels: readonly ModuleQualityLevel<Payload>[]\n): void {\n const seen = new Set<string>();\n\n for (const level of levels) {\n assertIdentifier(\"levels[].id\", level.id);\n\n if (readNonNegativeNumber(`estimatedCostMs for level \"${level.id}\"`, level.estimatedCostMs) === undefined) {\n // no-op\n }\n\n if (seen.has(level.id)) {\n throw new Error(`Duplicate ladder level id \"${level.id}\" detected.`);\n }\n\n seen.add(level.id);\n }\n}\n\nfunction buildSnapshot<Payload>(\n id: string,\n domain: PerformanceDomain,\n authority: ModuleAuthority,\n importance: ModuleImportance,\n metadata: PerformanceBudgetMetadata,\n levels: readonly ModuleQualityLevel<Payload>[],\n currentLevelIndex: number\n): PerformanceModuleSnapshot<Payload> {\n const currentLevel = levels[currentLevelIndex]!;\n\n return {\n id,\n domain,\n authority,\n importance,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n currentLevelIndex,\n currentLevel,\n levelCount: levels.length,\n isAtMinimum: currentLevelIndex === 0,\n isAtMaximum: currentLevelIndex === levels.length - 1,\n estimatedCostMs: currentLevel.estimatedCostMs,\n };\n}\n\nfunction buildAdjustment<Payload>(\n direction: \"down\" | \"up\",\n id: string,\n domain: PerformanceDomain,\n authority: ModuleAuthority,\n importance: ModuleImportance,\n previousLevelIndex: number,\n nextLevelIndex: number,\n levels: readonly ModuleQualityLevel<Payload>[],\n context: PerformanceAdjustmentContext\n): PerformanceAdjustmentRecord<Payload> {\n const previousLevel = levels[previousLevelIndex]!;\n const nextLevel = levels[nextLevelIndex]!;\n\n return {\n moduleId: id,\n domain,\n authority,\n importance,\n direction,\n fromLevelIndex: previousLevelIndex,\n toLevelIndex: nextLevelIndex,\n fromLevelId: previousLevel.id,\n toLevelId: nextLevel.id,\n appliedConfig: nextLevel.config,\n reason:\n direction === \"down\"\n ? `Reduced ${id} while ${context.pressureLevel} pressure exceeded the negotiated frame budget.`\n : `Restored ${id} after sustained recovery under the negotiated frame budget.`,\n };\n}\n\n/**\n * Creates a ladder-backed module adapter ordered from lowest quality to highest quality.\n */\nexport function createQualityLadderAdapter<Payload>(\n options: QualityLadderAdapterOptions<Payload>\n): QualityLadderAdapter<Payload> {\n const id = assertIdentifier(\"adapter id\", options.id);\n\n if (!Array.isArray(options.levels) || options.levels.length === 0) {\n throw new Error(`Quality ladder adapter \"${id}\" requires at least one level.`);\n }\n\n if (options.levels.length > 64) {\n throw new Error(`Quality ladder adapter \"${id}\" cannot exceed 64 quality levels.`);\n }\n\n assertUniqueLevelIds(options.levels);\n\n const authority =\n options.authority === undefined\n ? \"visual\"\n : assertEnumValue(\"authority\", options.authority, moduleAuthorities);\n const importance =\n options.importance === undefined\n ? \"medium\"\n : assertEnumValue(\"importance\", options.importance, moduleImportances);\n const domain = assertEnumValue(\"domain\", options.domain, performanceDomains);\n const levels = [...options.levels];\n const metadata = normalizePerformanceBudgetMetadata(\"budget metadata\", options);\n let currentLevelIndex = resolveLevelIndex(levels, options.initialLevel);\n\n const emitChange = (\n context: PerformanceAdjustmentContext,\n adjustment: PerformanceAdjustmentRecord<Payload>,\n previousLevelIndex: number\n ) => {\n if (typeof options.onLevelChange !== \"function\") {\n return;\n }\n\n try {\n options.onLevelChange({\n context,\n previousLevel: levels[previousLevelIndex]!,\n currentLevel: levels[currentLevelIndex]!,\n adjustment,\n });\n } catch {\n // Change notifications must not destabilize the governor.\n }\n };\n\n const apply = (\n direction: \"down\" | \"up\",\n context: PerformanceAdjustmentContext\n ): PerformanceAdjustmentRecord<Payload> | null => {\n const nextLevelIndex =\n direction === \"down\" ? currentLevelIndex - 1 : currentLevelIndex + 1;\n\n if (nextLevelIndex < 0 || nextLevelIndex >= levels.length) {\n return null;\n }\n\n const previousLevelIndex = currentLevelIndex;\n currentLevelIndex = nextLevelIndex;\n\n const adjustment = buildAdjustment<Payload>(\n direction,\n id,\n domain,\n authority,\n importance,\n previousLevelIndex,\n nextLevelIndex,\n levels,\n context\n );\n\n emitChange(context, adjustment, previousLevelIndex);\n return adjustment;\n };\n\n return {\n id,\n domain,\n authority,\n importance,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n getCurrentLevel() {\n return levels[currentLevelIndex]!;\n },\n getSnapshot() {\n return buildSnapshot(\n id,\n domain,\n authority,\n importance,\n metadata,\n levels,\n currentLevelIndex\n );\n },\n stepDown(context) {\n return apply(\"down\", context);\n },\n stepUp(context) {\n return apply(\"up\", context);\n },\n };\n}\n","import { createQualityLadderAdapter } from \"./ladder.js\";\nimport { normalizePerformanceBudgetMetadata } from \"./budget.js\";\nimport type {\n ModuleQualityLevel,\n WorkerJobBudgetAdapter,\n WorkerJobBudgetManifest,\n WorkerJobBudgetManifestGraph,\n WorkerJobBudgetManifestGraphJob,\n WorkerJobBudgetManifestPriorityLane,\n WorkerJobBudgetManifestAdapterOptions,\n WorkerJobBudgetManifestJob,\n WorkerJobBudgetAdapterOptions,\n WorkerJobBudgetConfig,\n WorkerJobBudgetSnapshot,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n normalizePlainObject,\n readNonNegativeNumber,\n readPositiveNumber,\n workerJobQueueClasses,\n workerSchedulerModes,\n} from \"./validation.js\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readPositiveInteger(name: string, value: unknown): number | undefined {\n const parsed = readPositiveNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than zero.`);\n }\n\n return parsed;\n}\n\nfunction readNonNegativeInteger(name: string, value: unknown): number | undefined {\n const parsed = readNonNegativeNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than or equal to zero.`);\n }\n\n return parsed;\n}\n\nfunction normalizeDependencies(\n name: string,\n value: unknown\n): readonly string[] {\n if (value === undefined) {\n return Object.freeze([]);\n }\n\n if (!Array.isArray(value)) {\n throw new Error(`${name} must be an array of dependency ids.`);\n }\n\n return Object.freeze(\n [...new Set(value.map((entry, index) => assertIdentifier(`${name}[${index}]`, entry)))]\n );\n}\n\nfunction normalizeBudgetLevel(\n level: ModuleQualityLevel<WorkerJobBudgetConfig>,\n index: number\n): ModuleQualityLevel<WorkerJobBudgetConfig> {\n if (!isPlainObject(level.config)) {\n throw new Error(`Worker job budget level ${index} must provide an object config.`);\n }\n\n const levelId = assertIdentifier(`levels[${index}].id`, level.id);\n const maxDispatchesPerFrame = readPositiveInteger(\n `levels[${index}].config.maxDispatchesPerFrame`,\n level.config.maxDispatchesPerFrame\n );\n const maxJobsPerDispatch = readPositiveInteger(\n `levels[${index}].config.maxJobsPerDispatch`,\n level.config.maxJobsPerDispatch\n );\n const cadenceDivisor = readPositiveInteger(\n `levels[${index}].config.cadenceDivisor`,\n level.config.cadenceDivisor\n );\n const workgroupScale = readPositiveNumber(\n `levels[${index}].config.workgroupScale`,\n level.config.workgroupScale\n );\n const maxQueueDepth = readNonNegativeInteger(\n `levels[${index}].config.maxQueueDepth`,\n level.config.maxQueueDepth\n );\n\n if (workgroupScale !== undefined && workgroupScale > 1) {\n throw new Error(\n `levels[${index}].config.workgroupScale must be less than or equal to 1.`\n );\n }\n\n return {\n ...level,\n id: levelId,\n config: {\n maxDispatchesPerFrame: maxDispatchesPerFrame ?? 1,\n maxJobsPerDispatch: maxJobsPerDispatch ?? 1,\n cadenceDivisor,\n workgroupScale,\n maxQueueDepth,\n metadata: normalizePlainObject(\n `levels[${index}].config.metadata`,\n level.config.metadata\n ),\n },\n };\n}\n\nfunction normalizeManifestJobs(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): readonly WorkerJobBudgetManifestJob[] {\n if (Array.isArray(manifest)) {\n return manifest;\n }\n\n if (!isPlainObject(manifest) || !Array.isArray(manifest.jobs)) {\n throw new Error(\n \"Worker job manifests must provide a jobs array or be an array of jobs.\"\n );\n }\n\n return manifest.jobs;\n}\n\nfunction buildPriorityLanes(\n jobs: readonly WorkerJobBudgetManifestGraphJob[]\n): readonly WorkerJobBudgetManifestPriorityLane[] {\n const lanes = new Map<number, {\n priority: number;\n jobIds: string[];\n rootJobIds: string[];\n }>();\n\n for (const job of jobs) {\n const lane = lanes.get(job.priority) ?? {\n priority: job.priority,\n jobIds: [],\n rootJobIds: [],\n };\n lane.jobIds.push(job.id);\n if (job.root) {\n lane.rootJobIds.push(job.id);\n }\n lanes.set(job.priority, lane);\n }\n\n return Object.freeze(\n [...lanes.values()]\n .sort((left, right) => right.priority - left.priority)\n .map((lane) =>\n Object.freeze({\n priority: lane.priority,\n jobIds: Object.freeze([...lane.jobIds]),\n rootJobIds: Object.freeze([...lane.rootJobIds]),\n jobCount: lane.jobIds.length,\n rootCount: lane.rootJobIds.length,\n })\n )\n );\n}\n\nfunction resolveManifestJobType(job: WorkerJobBudgetManifestJob, index: number): string {\n const jobType = job.performance?.jobType ?? job.worker?.jobType;\n if (typeof jobType !== \"string\") {\n throw new Error(\n `Manifest job ${index} must provide performance.jobType or worker.jobType.`\n );\n }\n\n return assertIdentifier(`jobs[${index}].jobType`, jobType);\n}\n\nfunction resolveManifestQueueClass(\n job: WorkerJobBudgetManifestJob,\n index: number\n): WorkerJobBudgetAdapter[\"queueClass\"] {\n const queueClass = job.performance?.queueClass ?? job.worker?.queueClass;\n if (queueClass === undefined) {\n throw new Error(\n `Manifest job ${index} must provide performance.queueClass or worker.queueClass.`\n );\n }\n\n return assertEnumValue(`jobs[${index}].queueClass`, queueClass, workerJobQueueClasses);\n}\n\nfunction resolveManifestSchedulerMode(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[],\n job: WorkerJobBudgetManifestJob,\n index: number\n): WorkerJobBudgetAdapter[\"schedulerMode\"] {\n const topLevelMode =\n !Array.isArray(manifest) && isPlainObject(manifest)\n ? manifest.schedulerMode\n : undefined;\n const schedulerMode = job.worker?.schedulerMode ?? topLevelMode;\n\n if (schedulerMode === undefined) {\n return \"flat\";\n }\n\n return assertEnumValue(\n `jobs[${index}].schedulerMode`,\n schedulerMode,\n workerSchedulerModes\n );\n}\n\nfunction resolveManifestDependencies(\n job: WorkerJobBudgetManifestJob,\n index: number\n): readonly string[] {\n return normalizeDependencies(\n `jobs[${index}].dependencies`,\n job.worker?.dependencies\n );\n}\n\nfunction resolveManifestPriority(\n job: WorkerJobBudgetManifestJob,\n index: number\n): number {\n return readNonNegativeInteger(\n `jobs[${index}].priority`,\n job.worker?.priority\n ) ?? 0;\n}\n\nfunction buildManifestGraph(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): WorkerJobBudgetManifestGraph {\n const jobs = normalizeManifestJobs(manifest);\n const normalized = jobs.map((job, index) => {\n if (!isPlainObject(job.performance)) {\n throw new Error(`Manifest job ${index} must provide a performance object.`);\n }\n\n const id = assertIdentifier(`jobs[${index}].performance.id`, job.performance.id);\n const metadata = normalizePerformanceBudgetMetadata(\n `jobs[${index}].performance`,\n job.performance\n );\n\n return {\n id,\n key: typeof job.key === \"string\" ? job.key : undefined,\n label: typeof job.label === \"string\" ? job.label : undefined,\n jobType: resolveManifestJobType(job, index),\n queueClass: resolveManifestQueueClass(job, index),\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n priority: resolveManifestPriority(job, index),\n dependencies: resolveManifestDependencies(job, index),\n schedulerMode: resolveManifestSchedulerMode(manifest, job, index),\n };\n });\n\n const ids = new Set<string>();\n for (const job of normalized) {\n if (ids.has(job.id)) {\n throw new Error(`Duplicate worker manifest job id detected: ${job.id}`);\n }\n ids.add(job.id);\n }\n\n for (const job of normalized) {\n for (const dependency of job.dependencies) {\n if (!ids.has(dependency)) {\n throw new Error(\n `Worker manifest job \"${job.id}\" depends on unknown job \"${dependency}\".`\n );\n }\n if (dependency === job.id) {\n throw new Error(`Worker manifest job \"${job.id}\" cannot depend on itself.`);\n }\n }\n }\n\n const dependentsById = new Map(normalized.map((job) => [job.id, [] as string[]]));\n const indegree = new Map(\n normalized.map((job) => [job.id, job.dependencies.length] as const)\n );\n\n for (const job of normalized) {\n for (const dependency of job.dependencies) {\n dependentsById.get(dependency)?.push(job.id);\n }\n }\n\n const roots = normalized\n .filter((job) => job.dependencies.length === 0)\n .map((job) => job.id);\n const queue = [...roots];\n const topologicalOrder: string[] = [];\n\n while (queue.length > 0) {\n const currentId = queue.shift();\n if (!currentId) {\n continue;\n }\n topologicalOrder.push(currentId);\n for (const dependentId of dependentsById.get(currentId) ?? []) {\n const next = (indegree.get(dependentId) ?? 0) - 1;\n indegree.set(dependentId, next);\n if (next === 0) {\n queue.push(dependentId);\n }\n }\n }\n\n if (topologicalOrder.length !== normalized.length) {\n throw new Error(\"Worker manifest graph contains a cycle.\");\n }\n\n const graphJobs = normalized.map((job) =>\n Object.freeze({\n ...job,\n dependencies: Object.freeze([...job.dependencies]),\n dependents: Object.freeze([...(dependentsById.get(job.id) ?? [])]),\n dependencyCount: job.dependencies.length,\n unresolvedDependencyCount: job.dependencies.length,\n dependentCount: (dependentsById.get(job.id) ?? []).length,\n root: job.dependencies.length === 0,\n })\n );\n\n return Object.freeze({\n schedulerMode: graphJobs.some(\n (job) => job.schedulerMode === \"dag\" || job.dependencies.length > 0\n )\n ? \"dag\"\n : \"flat\",\n jobCount: graphJobs.length,\n maxPriority: graphJobs.reduce(\n (current, job) => Math.max(current, job.priority),\n 0\n ),\n representationBands: Object.freeze(\n [\n ...new Set(\n graphJobs\n .map((job) => job.representationBand)\n .filter((band): band is NonNullable<typeof band> => typeof band === \"string\")\n ),\n ]\n ),\n jobIds: Object.freeze(graphJobs.map((job) => job.id)),\n roots: Object.freeze(graphJobs.filter((job) => job.root).map((job) => job.id)),\n topologicalOrder: Object.freeze(topologicalOrder),\n priorityLanes: buildPriorityLanes(graphJobs),\n jobs: Object.freeze(graphJobs),\n });\n}\n\n/**\n * Creates a ladder-backed adapter specialized for gpu-worker job budgets.\n */\nexport function createWorkerJobBudgetAdapter(\n options: WorkerJobBudgetAdapterOptions\n): WorkerJobBudgetAdapter {\n const jobType = assertIdentifier(\"jobType\", options.jobType);\n const queueClass =\n options.queueClass === undefined\n ? \"custom\"\n : assertEnumValue(\"queueClass\", options.queueClass, workerJobQueueClasses);\n const priority = readNonNegativeInteger(\"priority\", options.priority) ?? 0;\n const dependencies = normalizeDependencies(\"dependencies\", options.dependencies);\n const dependents = normalizeDependencies(\"dependents\", options.dependents);\n const schedulerMode =\n options.schedulerMode === undefined\n ? \"flat\"\n : assertEnumValue(\"schedulerMode\", options.schedulerMode, workerSchedulerModes);\n const dependencyCount = dependencies.length;\n const unresolvedDependencyCount = dependencyCount;\n const dependentCount = dependents.length;\n const root = dependencyCount === 0;\n const metadata = normalizePerformanceBudgetMetadata(\"budget metadata\", options);\n\n const levels = options.levels.map(normalizeBudgetLevel);\n\n const ladder = createQualityLadderAdapter<WorkerJobBudgetConfig>({\n id: options.id,\n domain: options.domain ?? \"custom\",\n authority: options.authority,\n importance: options.importance,\n levels,\n initialLevel: options.initialLevel,\n onLevelChange: options.onLevelChange,\n });\n\n const getWorkerSnapshot = (): WorkerJobBudgetSnapshot => ({\n ...ladder.getSnapshot(),\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n jobType,\n queueClass,\n priority,\n dependencies,\n dependents,\n dependencyCount,\n unresolvedDependencyCount,\n dependentCount,\n root,\n schedulerMode,\n });\n\n return {\n ...ladder,\n jobType,\n queueClass,\n representationBand: metadata.representationBand,\n qualityDimensions: metadata.qualityDimensions,\n importanceSignals: metadata.importanceSignals,\n priority,\n dependencies,\n dependents,\n dependencyCount,\n unresolvedDependencyCount,\n dependentCount,\n root,\n schedulerMode,\n getSnapshot() {\n return getWorkerSnapshot();\n },\n getBudget() {\n return ladder.getCurrentLevel().config;\n },\n getWorkerSnapshot,\n };\n}\n\n/**\n * Normalizes a worker manifest into a graph with roots, dependents, and\n * priority lanes so runtimes can reason about multi-root DAG workloads.\n */\nexport function createWorkerJobBudgetManifestGraph(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[]\n): WorkerJobBudgetManifestGraph {\n return buildManifestGraph(manifest);\n}\n\n/**\n * Creates worker budget adapters from a consumer worker-manifest shape.\n */\nexport function createWorkerJobBudgetAdaptersFromManifest(\n manifest: WorkerJobBudgetManifest | readonly WorkerJobBudgetManifestJob[],\n options: WorkerJobBudgetManifestAdapterOptions = {}\n): readonly WorkerJobBudgetAdapter[] {\n const graph = buildManifestGraph(manifest);\n const graphJobById = new Map(graph.jobs.map((job) => [job.id, job]));\n const jobs = normalizeManifestJobs(manifest);\n const { initialLevels, selectJob, onLevelChange } = options;\n\n return jobs.flatMap((job, index) => {\n if (selectJob && !selectJob(job, index)) {\n return [];\n }\n\n if (!isPlainObject(job.performance)) {\n throw new Error(`Manifest job ${index} must provide a performance object.`);\n }\n\n const id = assertIdentifier(`jobs[${index}].performance.id`, job.performance.id);\n const graphJob = graphJobById.get(id);\n if (!graphJob) {\n throw new Error(`Worker manifest graph is missing job \"${id}\".`);\n }\n\n return [\n createWorkerJobBudgetAdapter({\n id,\n jobType: graphJob.jobType,\n queueClass: graphJob.queueClass,\n priority: graphJob.priority,\n dependencies: graphJob.dependencies,\n dependents: graphJob.dependents,\n schedulerMode: graphJob.schedulerMode,\n domain: job.performance.domain,\n authority: job.performance.authority,\n importance: job.performance.importance,\n representationBand: job.performance.representationBand,\n qualityDimensions: job.performance.qualityDimensions,\n importanceSignals: job.performance.importanceSignals,\n levels: job.performance.levels,\n initialLevel: initialLevels?.[id],\n onLevelChange:\n onLevelChange === undefined\n ? undefined\n : (event) => {\n onLevelChange(job, event);\n },\n }),\n ];\n });\n}\n","import type {\n GpuDebugAdapterInfo,\n GpuPipelinePhase,\n GpuDebugQueueClass,\n GpuResourceCategory,\n GpuVector3,\n} from \"./types.js\";\n\nconst IDENTIFIER_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,63}$/u;\n\nexport const gpuDebugQueueClasses = Object.freeze([\n \"render\",\n \"simulation\",\n \"lighting\",\n \"post-processing\",\n \"voxel\",\n \"transfer\",\n \"custom\",\n]) satisfies readonly GpuDebugQueueClass[];\n\nexport const gpuResourceCategories = Object.freeze([\n \"buffer\",\n \"texture\",\n \"bind-group\",\n \"pipeline\",\n \"custom\",\n]) satisfies readonly GpuResourceCategory[];\n\nexport const gpuPipelinePhases = Object.freeze([\n \"simulation\",\n \"secondary-simulation\",\n \"scene-preparation\",\n \"render\",\n]) satisfies readonly GpuPipelinePhase[];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function assertIdentifier(name: string, value: unknown): string {\n if (typeof value !== \"string\" || !IDENTIFIER_PATTERN.test(value)) {\n throw new Error(\n `${name} must match ${IDENTIFIER_PATTERN.toString()} and be at most 64 characters long.`\n );\n }\n\n return value;\n}\n\nexport function assertEnumValue<T extends string>(\n name: string,\n value: unknown,\n allowedValues: readonly T[]\n): T {\n if (typeof value !== \"string\" || !allowedValues.includes(value as T)) {\n throw new Error(`${name} must be one of: ${allowedValues.join(\", \")}.`);\n }\n\n return value as T;\n}\n\nexport function readPositiveNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new Error(`${name} must be a finite number greater than zero.`);\n }\n\n return value;\n}\n\nexport function readNonNegativeNumber(\n name: string,\n value: unknown\n): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nexport function readPositiveInteger(\n name: string,\n value: unknown\n): number | undefined {\n const parsed = readPositiveNumber(name, value);\n if (parsed === undefined) {\n return undefined;\n }\n\n if (!Number.isInteger(parsed)) {\n throw new Error(`${name} must be an integer greater than zero.`);\n }\n\n return parsed;\n}\n\nexport function normalizePlainObject(\n name: string,\n value: unknown\n): Readonly<Record<string, unknown>> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (!isRecord(value)) {\n throw new Error(`${name} must be a plain object when provided.`);\n }\n\n return Object.freeze({ ...value });\n}\n\nexport function normalizeVector(\n name: string,\n value: GpuVector3\n): Required<GpuVector3> {\n const x = readPositiveInteger(`${name}.x`, value.x) ?? 1;\n const y = readPositiveInteger(`${name}.y`, value.y) ?? 1;\n const z = readPositiveInteger(`${name}.z`, value.z) ?? 1;\n return { x, y, z };\n}\n\nexport function isAbortSignalLike(value: unknown): value is AbortSignal {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"aborted\" in value &&\n typeof (value as AbortSignal).aborted === \"boolean\"\n );\n}\n\nexport function normalizeAdapterInfo(\n value: GpuDebugAdapterInfo | undefined\n): Readonly<GpuDebugAdapterInfo> {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n const adapter: GpuDebugAdapterInfo = {};\n\n if (value.label !== undefined) {\n adapter.label = String(value.label).trim().slice(0, 120);\n }\n if (value.vendor !== undefined) {\n adapter.vendor = String(value.vendor).trim().slice(0, 120);\n }\n if (value.architecture !== undefined) {\n adapter.architecture = String(value.architecture).trim().slice(0, 120);\n }\n if (value.driver !== undefined) {\n adapter.driver = String(value.driver).trim().slice(0, 120);\n }\n\n adapter.maxBufferSizeBytes = readPositiveInteger(\n \"adapter.maxBufferSizeBytes\",\n value.maxBufferSizeBytes\n );\n adapter.maxStorageBufferBindingSizeBytes = readPositiveInteger(\n \"adapter.maxStorageBufferBindingSizeBytes\",\n value.maxStorageBufferBindingSizeBytes\n );\n adapter.maxComputeInvocationsPerWorkgroup = readPositiveInteger(\n \"adapter.maxComputeInvocationsPerWorkgroup\",\n value.maxComputeInvocationsPerWorkgroup\n );\n adapter.maxComputeWorkgroupsPerDimension = readPositiveInteger(\n \"adapter.maxComputeWorkgroupsPerDimension\",\n value.maxComputeWorkgroupsPerDimension\n );\n adapter.memoryCapacityHintBytes = readPositiveInteger(\n \"adapter.memoryCapacityHintBytes\",\n value.memoryCapacityHintBytes\n );\n adapter.coreCountHint = readPositiveInteger(\n \"adapter.coreCountHint\",\n value.coreCountHint\n );\n adapter.metadata = normalizePlainObject(\"adapter.metadata\", value.metadata);\n\n return Object.freeze(adapter);\n}\n","import type {\n GpuDebugDagSnapshot,\n GpuDebugDispatchSnapshot,\n GpuDebugPipelineSnapshot,\n GpuDebugQueueSnapshot,\n GpuDebugSession,\n GpuDebugSessionOptions,\n GpuDebugSnapshot,\n GpuDependencyUnlockSample,\n GpuDispatchSample,\n GpuFrameSample,\n GpuPipelinePhaseSample,\n GpuQueueSample,\n GpuReadyLaneSample,\n GpuResourceCategory,\n TrackedGpuAllocation,\n} from \"./types.js\";\nimport {\n assertEnumValue,\n assertIdentifier,\n gpuDebugQueueClasses,\n gpuPipelinePhases,\n gpuResourceCategories,\n isAbortSignalLike,\n normalizeAdapterInfo,\n normalizeVector,\n readNonNegativeNumber,\n readPositiveInteger,\n readPositiveNumber,\n} from \"./validation.js\";\n\nconst DEFAULT_OPTIONS = Object.freeze({\n enabled: false,\n maxRetainedDispatches: 240,\n maxRetainedQueueSamples: 240,\n maxRetainedReadyLaneSamples: 240,\n maxRetainedDependencyUnlockSamples: 240,\n maxRetainedPipelinePhaseSamples: 240,\n maxRetainedFrameSamples: 240,\n maxTrackedAllocations: 512,\n});\n\nconst LIMITATIONS = Object.freeze([\n \"Tracked memory reflects only allocations reported to this debug session.\",\n \"Portable WebGPU does not expose authoritative live GPU core-count or total-memory counters.\",\n \"Hardware hints are optional caller-supplied metadata and may be platform-specific.\",\n \"Ready-lane and dependency-unlock diagnostics are caller-reported integration samples, not automatic WebGPU counters.\",\n \"Pipeline phase and snapshot-lag diagnostics are caller-reported integration samples, not automatic WebGPU counters.\",\n]);\n\ninterface NormalizedAllocation extends Omit<TrackedGpuAllocation, \"signal\"> {\n label?: string;\n}\n\ntype NormalizedQueueSample = Omit<GpuQueueSample, \"signal\">;\n\ninterface NormalizedReadyLaneSample extends Omit<GpuReadyLaneSample, \"signal\"> {\n priority?: number;\n}\n\ninterface NormalizedDispatchSample extends Omit<GpuDispatchSample, \"signal\"> {\n workgroups: { x: number; y: number; z: number };\n workgroupSize: { x: number; y: number; z: number };\n}\n\ntype NormalizedFrameSample = Omit<GpuFrameSample, \"signal\">;\n\ninterface NormalizedDependencyUnlockSample\n extends Omit<GpuDependencyUnlockSample, \"signal\"> {\n priority?: number;\n unlockCount: number;\n}\n\ninterface NormalizedPipelinePhaseSample\n extends Omit<GpuPipelinePhaseSample, \"signal\"> {\n durationMs?: number;\n snapshotAgeFrames?: number;\n snapshotAgeMs?: number;\n}\n\nfunction clampCount(value: number | undefined, fallback: number): number {\n if (!value || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n\n return Math.min(Math.round(value), 4096);\n}\n\nfunction trimHistory<T>(items: T[], maxEntries: number): void {\n while (items.length > maxEntries) {\n items.shift();\n }\n}\n\nfunction average(values: readonly number[]): number | undefined {\n if (values.length === 0) {\n return undefined;\n }\n\n return values.reduce((total, value) => total + value, 0) / values.length;\n}\n\nfunction pushAggregate<T extends string | number>(\n map: Map<T, number>,\n key: T,\n value: number\n): void {\n map.set(key, (map.get(key) ?? 0) + value);\n}\n\nfunction normalizeAllocation(allocation: TrackedGpuAllocation): NormalizedAllocation {\n if (allocation.signal !== undefined && !isAbortSignalLike(allocation.signal)) {\n throw new Error(\"allocation.signal must be an AbortSignal when provided.\");\n }\n\n return {\n id: assertIdentifier(\"allocation.id\", allocation.id),\n owner: assertIdentifier(\"allocation.owner\", allocation.owner),\n category: assertEnumValue(\n \"allocation.category\",\n allocation.category,\n gpuResourceCategories\n ),\n sizeBytes: readPositiveInteger(\"allocation.sizeBytes\", allocation.sizeBytes) ?? 1,\n label:\n allocation.label === undefined\n ? undefined\n : String(allocation.label).trim().slice(0, 120),\n };\n}\n\nfunction normalizeQueueSample(sample: GpuQueueSample): NormalizedQueueSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"queue.signal must be an AbortSignal when provided.\");\n }\n\n const capacity = readPositiveInteger(\"queue.capacity\", sample.capacity);\n const depth = readNonNegativeNumber(\"queue.depth\", sample.depth) ?? 0;\n\n if (capacity !== undefined && depth > capacity) {\n throw new Error(\"queue.depth cannot exceed queue.capacity.\");\n }\n\n return {\n owner: assertIdentifier(\"queue.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"queue.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n depth,\n capacity,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"queue.frameId\", sample.frameId),\n };\n}\n\nfunction normalizeReadyLaneSample(\n sample: GpuReadyLaneSample\n): NormalizedReadyLaneSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"readyLane.signal must be an AbortSignal when provided.\");\n }\n\n const capacity = readPositiveInteger(\"readyLane.capacity\", sample.capacity);\n const depth = readNonNegativeNumber(\"readyLane.depth\", sample.depth) ?? 0;\n\n if (capacity !== undefined && depth > capacity) {\n throw new Error(\"readyLane.depth cannot exceed readyLane.capacity.\");\n }\n\n const priority = readNonNegativeNumber(\"readyLane.priority\", sample.priority);\n if (priority !== undefined && !Number.isInteger(priority)) {\n throw new Error(\"readyLane.priority must be an integer greater than or equal to zero.\");\n }\n\n return {\n owner: assertIdentifier(\"readyLane.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"readyLane.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n laneId: assertIdentifier(\"readyLane.laneId\", sample.laneId),\n priority,\n depth,\n capacity,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"readyLane.frameId\", sample.frameId),\n };\n}\n\nfunction normalizeDispatchSample(\n sample: GpuDispatchSample\n): NormalizedDispatchSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"dispatch.signal must be an AbortSignal when provided.\");\n }\n\n return {\n id:\n sample.id === undefined ? undefined : assertIdentifier(\"dispatch.id\", sample.id),\n owner: assertIdentifier(\"dispatch.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"dispatch.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n jobType: assertIdentifier(\"dispatch.jobType\", sample.jobType),\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"dispatch.frameId\", sample.frameId),\n durationMs: readNonNegativeNumber(\"dispatch.durationMs\", sample.durationMs),\n workgroups: normalizeVector(\"dispatch.workgroups\", sample.workgroups),\n workgroupSize: normalizeVector(\n \"dispatch.workgroupSize\",\n sample.workgroupSize ?? { x: 1, y: 1, z: 1 }\n ),\n bytesRead: readNonNegativeNumber(\"dispatch.bytesRead\", sample.bytesRead),\n bytesWritten: readNonNegativeNumber(\"dispatch.bytesWritten\", sample.bytesWritten),\n };\n}\n\nfunction normalizeFrameSample(sample: GpuFrameSample): NormalizedFrameSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"frame.signal must be an AbortSignal when provided.\");\n }\n\n if (sample.dropped !== undefined && typeof sample.dropped !== \"boolean\") {\n throw new Error(\"frame.dropped must be a boolean when provided.\");\n }\n\n return {\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"frame.frameId\", sample.frameId),\n frameTimeMs: readPositiveNumber(\"frame.frameTimeMs\", sample.frameTimeMs) ?? 0,\n targetFrameTimeMs: readPositiveNumber(\n \"frame.targetFrameTimeMs\",\n sample.targetFrameTimeMs\n ),\n gpuBusyMs: readNonNegativeNumber(\"frame.gpuBusyMs\", sample.gpuBusyMs),\n dropped: sample.dropped,\n };\n}\n\nfunction normalizeDependencyUnlockSample(\n sample: GpuDependencyUnlockSample\n): NormalizedDependencyUnlockSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"dependencyUnlock.signal must be an AbortSignal when provided.\");\n }\n\n const priority = readNonNegativeNumber(\n \"dependencyUnlock.priority\",\n sample.priority\n );\n if (priority !== undefined && !Number.isInteger(priority)) {\n throw new Error(\n \"dependencyUnlock.priority must be an integer greater than or equal to zero.\"\n );\n }\n\n return {\n owner: assertIdentifier(\"dependencyUnlock.owner\", sample.owner),\n queueClass: assertEnumValue(\n \"dependencyUnlock.queueClass\",\n sample.queueClass,\n gpuDebugQueueClasses\n ),\n sourceJobType: assertIdentifier(\n \"dependencyUnlock.sourceJobType\",\n sample.sourceJobType\n ),\n unlockedJobType: assertIdentifier(\n \"dependencyUnlock.unlockedJobType\",\n sample.unlockedJobType\n ),\n priority,\n unlockCount:\n readPositiveInteger(\"dependencyUnlock.unlockCount\", sample.unlockCount) ?? 1,\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"dependencyUnlock.frameId\", sample.frameId),\n };\n}\n\nfunction normalizePipelinePhaseSample(\n sample: GpuPipelinePhaseSample\n): NormalizedPipelinePhaseSample {\n if (sample.signal !== undefined && !isAbortSignalLike(sample.signal)) {\n throw new Error(\"pipelinePhase.signal must be an AbortSignal when provided.\");\n }\n\n const snapshotAgeFrames = readNonNegativeNumber(\n \"pipelinePhase.snapshotAgeFrames\",\n sample.snapshotAgeFrames\n );\n if (snapshotAgeFrames !== undefined && !Number.isInteger(snapshotAgeFrames)) {\n throw new Error(\n \"pipelinePhase.snapshotAgeFrames must be an integer greater than or equal to zero.\"\n );\n }\n\n return {\n owner: assertIdentifier(\"pipelinePhase.owner\", sample.owner),\n pipeline: assertEnumValue(\n \"pipelinePhase.pipeline\",\n sample.pipeline,\n gpuPipelinePhases\n ),\n stage: assertIdentifier(\"pipelinePhase.stage\", sample.stage),\n frameId:\n sample.frameId === undefined\n ? undefined\n : assertIdentifier(\"pipelinePhase.frameId\", sample.frameId),\n durationMs: readNonNegativeNumber(\n \"pipelinePhase.durationMs\",\n sample.durationMs\n ),\n snapshotFrameId:\n sample.snapshotFrameId === undefined\n ? undefined\n : assertIdentifier(\"pipelinePhase.snapshotFrameId\", sample.snapshotFrameId),\n snapshotAgeFrames,\n snapshotAgeMs: readNonNegativeNumber(\n \"pipelinePhase.snapshotAgeMs\",\n sample.snapshotAgeMs\n ),\n };\n}\n\nexport function estimateDispatchInvocations(sample: GpuDispatchSample): number {\n const normalized = normalizeDispatchSample(sample);\n return (\n normalized.workgroups.x *\n normalized.workgroups.y *\n normalized.workgroups.z *\n normalized.workgroupSize.x *\n normalized.workgroupSize.y *\n normalized.workgroupSize.z\n );\n}\n\nexport function createGpuDebugSession(\n options: GpuDebugSessionOptions = {}\n): GpuDebugSession {\n const settings = {\n enabled: options.enabled ?? DEFAULT_OPTIONS.enabled,\n maxRetainedDispatches: clampCount(\n options.maxRetainedDispatches,\n DEFAULT_OPTIONS.maxRetainedDispatches\n ),\n maxRetainedQueueSamples: clampCount(\n options.maxRetainedQueueSamples,\n DEFAULT_OPTIONS.maxRetainedQueueSamples\n ),\n maxRetainedReadyLaneSamples: clampCount(\n options.maxRetainedReadyLaneSamples,\n DEFAULT_OPTIONS.maxRetainedReadyLaneSamples\n ),\n maxRetainedDependencyUnlockSamples: clampCount(\n options.maxRetainedDependencyUnlockSamples,\n DEFAULT_OPTIONS.maxRetainedDependencyUnlockSamples\n ),\n maxRetainedPipelinePhaseSamples: clampCount(\n options.maxRetainedPipelinePhaseSamples,\n DEFAULT_OPTIONS.maxRetainedPipelinePhaseSamples\n ),\n maxRetainedFrameSamples: clampCount(\n options.maxRetainedFrameSamples,\n DEFAULT_OPTIONS.maxRetainedFrameSamples\n ),\n maxTrackedAllocations: clampCount(\n options.maxTrackedAllocations,\n DEFAULT_OPTIONS.maxTrackedAllocations\n ),\n };\n\n const adapter = normalizeAdapterInfo(options.adapter);\n let enabled = settings.enabled;\n const allocations = new Map<string, NormalizedAllocation>();\n const allocationOrder: string[] = [];\n const queueSamples: NormalizedQueueSample[] = [];\n const readyLaneSamples: NormalizedReadyLaneSample[] = [];\n const dispatchSamples: NormalizedDispatchSample[] = [];\n const dependencyUnlockSamples: NormalizedDependencyUnlockSample[] = [];\n const pipelinePhaseSamples: NormalizedPipelinePhaseSample[] = [];\n const frameSamples: NormalizedFrameSample[] = [];\n let peakTrackedBytes = 0;\n\n const totalTrackedBytes = (): number =>\n [...allocations.values()].reduce((total, allocation) => total + allocation.sizeBytes, 0);\n\n const updatePeakTrackedBytes = (): void => {\n peakTrackedBytes = Math.max(peakTrackedBytes, totalTrackedBytes());\n };\n\n const ensureAllocationCapacity = (): void => {\n while (allocationOrder.length > settings.maxTrackedAllocations) {\n const oldestId = allocationOrder.shift();\n if (oldestId !== undefined) {\n allocations.delete(oldestId);\n }\n }\n };\n\n const buildDispatchSnapshot = (): GpuDebugDispatchSnapshot => {\n const durations = dispatchSamples\n .map((sample) => sample.durationMs)\n .filter((value): value is number => value !== undefined);\n const bytesRead = dispatchSamples\n .map((sample) => sample.bytesRead)\n .filter((value): value is number => value !== undefined);\n const bytesWritten = dispatchSamples\n .map((sample) => sample.bytesWritten)\n .filter((value): value is number => value !== undefined);\n\n const byQueueClass = new Map<\n NormalizedDispatchSample[\"queueClass\"],\n {\n queueClass: NormalizedDispatchSample[\"queueClass\"];\n dispatches: number;\n totalDurationMs: number;\n estimatedInvocations: number;\n }\n >();\n\n let estimatedWorkgroups = 0;\n let estimatedInvocations = 0;\n\n for (const sample of dispatchSamples) {\n const workgroupCount =\n sample.workgroups.x * sample.workgroups.y * sample.workgroups.z;\n const invocationCount =\n workgroupCount *\n sample.workgroupSize.x *\n sample.workgroupSize.y *\n sample.workgroupSize.z;\n estimatedWorkgroups += workgroupCount;\n estimatedInvocations += invocationCount;\n\n const bucket = byQueueClass.get(sample.queueClass) ?? {\n queueClass: sample.queueClass,\n dispatches: 0,\n totalDurationMs: 0,\n estimatedInvocations: 0,\n };\n bucket.dispatches += 1;\n bucket.totalDurationMs += sample.durationMs ?? 0;\n bucket.estimatedInvocations += invocationCount;\n byQueueClass.set(sample.queueClass, bucket);\n }\n\n const frameTimes = frameSamples.map((sample) => sample.frameTimeMs);\n const totalFrameTimeMs = frameTimes.reduce((total, value) => total + value, 0);\n const totalDurationMs = durations.reduce((total, value) => total + value, 0);\n\n return {\n sampleCount: dispatchSamples.length,\n totalDurationMs,\n averageDurationMs: average(durations),\n estimatedWorkgroups,\n estimatedInvocations,\n averageBytesRead: average(bytesRead),\n averageBytesWritten: average(bytesWritten),\n busyRatio:\n totalFrameTimeMs > 0 ? Math.min(totalDurationMs / totalFrameTimeMs, 1) : undefined,\n byQueueClass: [...byQueueClass.values()].sort(\n (left, right) => right.totalDurationMs - left.totalDurationMs\n ),\n };\n };\n\n const buildQueueSnapshot = (): GpuDebugQueueSnapshot => {\n const depths = queueSamples.map((sample) => sample.depth);\n const hottestQueues = queueSamples\n .map((sample) => ({\n owner: sample.owner,\n queueClass: sample.queueClass,\n depth: sample.depth,\n capacity: sample.capacity,\n utilizationRatio:\n sample.capacity !== undefined ? sample.depth / sample.capacity : undefined,\n }))\n .sort((left, right) => {\n const leftScore = left.utilizationRatio ?? left.depth;\n const rightScore = right.utilizationRatio ?? right.depth;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n const peakUtilizationRatio = queueSamples.reduce<number | undefined>(\n (peak, sample) => {\n if (sample.capacity === undefined) {\n return peak;\n }\n\n const nextRatio = sample.depth / sample.capacity;\n return peak === undefined ? nextRatio : Math.max(peak, nextRatio);\n },\n undefined\n );\n\n return {\n sampleCount: queueSamples.length,\n averageDepth: average(depths) ?? 0,\n peakDepth: depths.length === 0 ? 0 : Math.max(...depths),\n peakUtilizationRatio,\n hottestQueues,\n };\n };\n\n const buildDagSnapshot = (): GpuDebugDagSnapshot => {\n const laneDepths = readyLaneSamples.map((sample) => sample.depth);\n const hottestReadyLanes = readyLaneSamples\n .map((sample) => ({\n owner: sample.owner,\n queueClass: sample.queueClass,\n laneId: sample.laneId,\n priority: sample.priority,\n depth: sample.depth,\n capacity: sample.capacity,\n utilizationRatio:\n sample.capacity !== undefined ? sample.depth / sample.capacity : undefined,\n }))\n .sort((left, right) => {\n const leftScore = left.utilizationRatio ?? left.depth;\n const rightScore = right.utilizationRatio ?? right.depth;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n const peakReadyLaneUtilizationRatio = readyLaneSamples.reduce<number | undefined>(\n (peak, sample) => {\n if (sample.capacity === undefined) {\n return peak;\n }\n\n const nextRatio = sample.depth / sample.capacity;\n return peak === undefined ? nextRatio : Math.max(peak, nextRatio);\n },\n undefined\n );\n\n const bySourceJobType = new Map<\n string,\n {\n owner: string;\n queueClass: NormalizedDependencyUnlockSample[\"queueClass\"];\n sourceJobType: string;\n unlockCount: number;\n }\n >();\n const byUnlockedJobType = new Map<\n string,\n {\n owner: string;\n queueClass: NormalizedDependencyUnlockSample[\"queueClass\"];\n unlockedJobType: string;\n priority?: number;\n unlockCount: number;\n }\n >();\n\n let totalUnlockCount = 0;\n\n for (const sample of dependencyUnlockSamples) {\n totalUnlockCount += sample.unlockCount;\n\n const sourceKey = `${sample.owner}:${sample.queueClass}:${sample.sourceJobType}`;\n const unlockedKey =\n `${sample.owner}:${sample.queueClass}:` +\n `${sample.unlockedJobType}:${sample.priority ?? \"none\"}`;\n\n const sourceBucket = bySourceJobType.get(sourceKey) ?? {\n owner: sample.owner,\n queueClass: sample.queueClass,\n sourceJobType: sample.sourceJobType,\n unlockCount: 0,\n };\n sourceBucket.unlockCount += sample.unlockCount;\n bySourceJobType.set(sourceKey, sourceBucket);\n\n const unlockedBucket = byUnlockedJobType.get(unlockedKey) ?? {\n owner: sample.owner,\n queueClass: sample.queueClass,\n unlockedJobType: sample.unlockedJobType,\n priority: sample.priority,\n unlockCount: 0,\n };\n unlockedBucket.unlockCount += sample.unlockCount;\n byUnlockedJobType.set(unlockedKey, unlockedBucket);\n }\n\n return {\n readyLaneSampleCount: readyLaneSamples.length,\n averageReadyLaneDepth: average(laneDepths) ?? 0,\n peakReadyLaneDepth: laneDepths.length === 0 ? 0 : Math.max(...laneDepths),\n peakReadyLaneUtilizationRatio,\n hottestReadyLanes,\n dependencyUnlockSampleCount: dependencyUnlockSamples.length,\n totalUnlockCount,\n bySourceJobType: [...bySourceJobType.values()].sort(\n (left, right) => right.unlockCount - left.unlockCount\n ),\n byUnlockedJobType: [...byUnlockedJobType.values()].sort(\n (left, right) => right.unlockCount - left.unlockCount\n ),\n };\n };\n\n const buildPipelineSnapshot = (): GpuDebugPipelineSnapshot => {\n const durations = pipelinePhaseSamples\n .map((sample) => sample.durationMs)\n .filter((value): value is number => value !== undefined);\n const snapshotAgeMsValues = pipelinePhaseSamples\n .map((sample) => sample.snapshotAgeMs)\n .filter((value): value is number => value !== undefined);\n const snapshotAgeFrameValues = pipelinePhaseSamples\n .map((sample) => sample.snapshotAgeFrames)\n .filter((value): value is number => value !== undefined);\n\n const byPipeline = new Map<\n NormalizedPipelinePhaseSample[\"pipeline\"],\n {\n pipeline: NormalizedPipelinePhaseSample[\"pipeline\"];\n sampleCount: number;\n totalDurationMs: number;\n durationValues: number[];\n snapshotAgeMsValues: number[];\n snapshotAgeFramesValues: number[];\n }\n >();\n\n for (const sample of pipelinePhaseSamples) {\n const bucket = byPipeline.get(sample.pipeline) ?? {\n pipeline: sample.pipeline,\n sampleCount: 0,\n totalDurationMs: 0,\n durationValues: [],\n snapshotAgeMsValues: [],\n snapshotAgeFramesValues: [],\n };\n bucket.sampleCount += 1;\n bucket.totalDurationMs += sample.durationMs ?? 0;\n if (sample.durationMs !== undefined) {\n bucket.durationValues.push(sample.durationMs);\n }\n if (sample.snapshotAgeMs !== undefined) {\n bucket.snapshotAgeMsValues.push(sample.snapshotAgeMs);\n }\n if (sample.snapshotAgeFrames !== undefined) {\n bucket.snapshotAgeFramesValues.push(sample.snapshotAgeFrames);\n }\n byPipeline.set(sample.pipeline, bucket);\n }\n\n const hottestStages = pipelinePhaseSamples\n .map((sample) => ({\n owner: sample.owner,\n pipeline: sample.pipeline,\n stage: sample.stage,\n frameId: sample.frameId,\n durationMs: sample.durationMs,\n snapshotFrameId: sample.snapshotFrameId,\n snapshotAgeFrames: sample.snapshotAgeFrames,\n snapshotAgeMs: sample.snapshotAgeMs,\n }))\n .sort((left, right) => {\n const leftScore =\n left.durationMs ??\n left.snapshotAgeMs ??\n left.snapshotAgeFrames ??\n 0;\n const rightScore =\n right.durationMs ??\n right.snapshotAgeMs ??\n right.snapshotAgeFrames ??\n 0;\n return rightScore - leftScore;\n })\n .slice(0, 5);\n\n return {\n sampleCount: pipelinePhaseSamples.length,\n totalDurationMs: durations.reduce((total, value) => total + value, 0),\n averageDurationMs: average(durations),\n averageSnapshotAgeMs: average(snapshotAgeMsValues),\n maxSnapshotAgeMs:\n snapshotAgeMsValues.length > 0 ? Math.max(...snapshotAgeMsValues) : undefined,\n maxSnapshotAgeFrames:\n snapshotAgeFrameValues.length > 0\n ? Math.max(...snapshotAgeFrameValues)\n : undefined,\n byPipeline: [...byPipeline.values()]\n .map((bucket) => ({\n pipeline: bucket.pipeline,\n sampleCount: bucket.sampleCount,\n totalDurationMs: bucket.totalDurationMs,\n averageDurationMs: average(bucket.durationValues),\n averageSnapshotAgeMs: average(bucket.snapshotAgeMsValues),\n maxSnapshotAgeMs:\n bucket.snapshotAgeMsValues.length > 0\n ? Math.max(...bucket.snapshotAgeMsValues)\n : undefined,\n maxSnapshotAgeFrames:\n bucket.snapshotAgeFramesValues.length > 0\n ? Math.max(...bucket.snapshotAgeFramesValues)\n : undefined,\n }))\n .sort((left, right) => right.totalDurationMs - left.totalDurationMs),\n hottestStages,\n };\n };\n\n return {\n isEnabled() {\n return enabled;\n },\n setEnabled(nextEnabled) {\n enabled = Boolean(nextEnabled);\n },\n trackAllocation(allocation) {\n if (!enabled || allocation.signal?.aborted === true) {\n return () => {};\n }\n\n const normalized = normalizeAllocation(allocation);\n if (!allocations.has(normalized.id)) {\n allocationOrder.push(normalized.id);\n }\n allocations.set(normalized.id, normalized);\n ensureAllocationCapacity();\n updatePeakTrackedBytes();\n\n return () => {\n this.releaseAllocation(normalized.id);\n };\n },\n releaseAllocation(id) {\n const normalizedId = assertIdentifier(\"allocation.id\", id);\n const deleted = allocations.delete(normalizedId);\n if (!deleted) {\n return false;\n }\n\n const index = allocationOrder.indexOf(normalizedId);\n if (index >= 0) {\n allocationOrder.splice(index, 1);\n }\n\n return true;\n },\n recordQueue(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n queueSamples.push(normalizeQueueSample(sample));\n trimHistory(queueSamples, settings.maxRetainedQueueSamples);\n return true;\n },\n recordReadyLane(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n readyLaneSamples.push(normalizeReadyLaneSample(sample));\n trimHistory(readyLaneSamples, settings.maxRetainedReadyLaneSamples);\n return true;\n },\n recordDispatch(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n dispatchSamples.push(normalizeDispatchSample(sample));\n trimHistory(dispatchSamples, settings.maxRetainedDispatches);\n return true;\n },\n recordDependencyUnlock(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n dependencyUnlockSamples.push(normalizeDependencyUnlockSample(sample));\n trimHistory(\n dependencyUnlockSamples,\n settings.maxRetainedDependencyUnlockSamples\n );\n return true;\n },\n recordPipelinePhase(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n pipelinePhaseSamples.push(normalizePipelinePhaseSample(sample));\n trimHistory(\n pipelinePhaseSamples,\n settings.maxRetainedPipelinePhaseSamples\n );\n return true;\n },\n recordFrame(sample) {\n if (!enabled || sample.signal?.aborted === true) {\n return false;\n }\n\n frameSamples.push(normalizeFrameSample(sample));\n trimHistory(frameSamples, settings.maxRetainedFrameSamples);\n return true;\n },\n getSnapshot() {\n const memoryByOwner = new Map<string, number>();\n const memoryByCategory = new Map<GpuResourceCategory, number>();\n for (const allocation of allocations.values()) {\n pushAggregate(memoryByOwner, allocation.owner, allocation.sizeBytes);\n pushAggregate(memoryByCategory, allocation.category, allocation.sizeBytes);\n }\n\n const totalBytes = totalTrackedBytes();\n const frameTimes = frameSamples.map((sample) => sample.frameTimeMs);\n const targetFrameTimes = frameSamples\n .map((sample) => sample.targetFrameTimeMs)\n .filter((value): value is number => value !== undefined);\n const gpuBusyTimes = frameSamples\n .map((sample) => sample.gpuBusyMs)\n .filter((value): value is number => value !== undefined);\n\n const snapshot: GpuDebugSnapshot = {\n enabled,\n adapter,\n memory: {\n totalTrackedBytes: totalBytes,\n peakTrackedBytes,\n allocationCount: allocations.size,\n trackedUsageRatio:\n adapter.memoryCapacityHintBytes !== undefined\n ? totalBytes / adapter.memoryCapacityHintBytes\n : undefined,\n byOwner: [...memoryByOwner.entries()]\n .map(([owner, bytes]) => ({ owner, bytes }))\n .sort((left, right) => right.bytes - left.bytes),\n byCategory: [...memoryByCategory.entries()]\n .map(([category, bytes]) => ({ category, bytes }))\n .sort((left, right) => right.bytes - left.bytes),\n },\n dispatch: buildDispatchSnapshot(),\n queues: buildQueueSnapshot(),\n frames: {\n sampleCount: frameSamples.length,\n latestFrameTimeMs: frameSamples[frameSamples.length - 1]?.frameTimeMs,\n averageFrameTimeMs: average(frameTimes),\n averageTargetFrameTimeMs: average(targetFrameTimes),\n droppedFrameRatio:\n frameSamples.length > 0\n ? frameSamples.filter((sample) => sample.dropped === true).length /\n frameSamples.length\n : undefined,\n averageGpuBusyMs: average(gpuBusyTimes),\n },\n dag: buildDagSnapshot(),\n pipeline: buildPipelineSnapshot(),\n limitations: LIMITATIONS,\n };\n\n return snapshot;\n },\n reset() {\n allocations.clear();\n allocationOrder.splice(0, allocationOrder.length);\n queueSamples.splice(0, queueSamples.length);\n readyLaneSamples.splice(0, readyLaneSamples.length);\n dispatchSamples.splice(0, dispatchSamples.length);\n dependencyUnlockSamples.splice(0, dependencyUnlockSamples.length);\n pipelinePhaseSamples.splice(0, pipelinePhaseSamples.length);\n frameSamples.splice(0, frameSamples.length);\n peakTrackedBytes = 0;\n },\n };\n}\n","export const physicsDebugOwner = \"physics\";\nexport const physicsWorkerQueueClasses = Object.freeze({\n simulation: \"simulation\",\n render: \"render\",\n});\nexport const defaultPhysicsWorkerProfile = \"gameplay\";\nexport const physicsSimulationStageOrder = Object.freeze([\n \"intentResolution\",\n \"broadphase\",\n \"narrowphase\",\n \"solver\",\n \"authoritativeCommit\",\n \"secondarySimulation\",\n \"animationStateInputs\",\n \"worldSnapshot\",\n \"visualFollowUp\",\n]);\n\nfunction assertIdentifier(name, value) {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${name} must be a non-empty string.`);\n }\n\n return value;\n}\n\nfunction assertNonNegativeInteger(name, value) {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${name} must be an integer greater than or equal to zero.`);\n }\n\n return value;\n}\n\nfunction assertNonNegativeNumber(name, value) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) {\n throw new Error(`${name} must be a finite number greater than or equal to zero.`);\n }\n\n return value;\n}\n\nfunction normalizeMetadata(value) {\n if (value === undefined) {\n return Object.freeze({});\n }\n\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(\"snapshot.metadata must be a plain object when provided.\");\n }\n\n return Object.freeze({ ...value });\n}\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: physicsDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst physicsWorkerProfileSpecs = {\n gameplay: {\n description:\n \"Authoritative gameplay profile that preserves rigid-body stability while scaling visual sync and contact presentation work.\",\n suggestedAllocationIds: [\n \"physics.gameplay.broadphase.grid\",\n \"physics.gameplay.contacts\",\n \"physics.gameplay.transforms\",\n ],\n jobs: {\n broadphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.broadphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n high: {\n estimatedCostMs: 0.95,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1024,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.broadphase.grid\"],\n },\n narrowphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.narrowphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n medium: {\n estimatedCostMs: 0.95,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n solver: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.solver\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n authoritativeCommit: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.authoritativeCommit\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n animationStateInputs: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.animationStateInputs\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n worldSnapshot: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.worldSnapshot\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"physics.gameplay.contacts\",\n \"physics.gameplay.transforms\",\n ],\n },\n transforms: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.transforms\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.45,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.transforms\"],\n },\n contactVisuals: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"post-processing\",\n authority: \"visual\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.gameplay.contactVisuals\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.15,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 4,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 0.55,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.gameplay.contacts\"],\n },\n },\n },\n cinematic: {\n description:\n \"Cinematic profile that keeps authoritative rigid-body work stable while enabling degradable cloth and fracture assistance passes.\",\n suggestedAllocationIds: [\n \"physics.cinematic.broadphase.grid\",\n \"physics.cinematic.contacts\",\n \"physics.cinematic.transforms\",\n \"physics.cinematic.cloth.state\",\n \"physics.cinematic.fracture.proxy\",\n ],\n jobs: {\n broadphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.broadphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 640,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 896,\n },\n high: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 1152,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.broadphase.grid\"],\n },\n narrowphase: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.narrowphase\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n medium: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n high: {\n estimatedCostMs: 1.45,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 320,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 960,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n solver: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.solver\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 1.05,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 2.05,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 768,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n authoritativeCommit: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.authoritativeCommit\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n high: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 448,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n animationStateInputs: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.animationStateInputs\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 256,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 384,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n transforms: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"animation\",\n authority: \"visual\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.transforms\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 320,\n },\n medium: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 0.8,\n maxQueueDepth: 512,\n },\n high: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 384,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 640,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.transforms\"],\n },\n clothAssist: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"cloth\",\n authority: \"non-authoritative-simulation\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.clothAssist\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.75,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.cloth.state\"],\n },\n fracturePreview: {\n queueClass: physicsWorkerQueueClasses.simulation,\n domain: \"geometry\",\n authority: \"non-authoritative-simulation\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.fracturePreview\",\n physicsWorkerQueueClasses.simulation,\n {\n low: {\n estimatedCostMs: 0.25,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 4,\n workgroupScale: 0.35,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.65,\n maxQueueDepth: 160,\n },\n high: {\n estimatedCostMs: 0.85,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.fracture.proxy\"],\n },\n worldSnapshot: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"physics\",\n authority: \"authoritative\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.worldSnapshot\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n medium: {\n estimatedCostMs: 0.35,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 160,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n high: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 448,\n },\n }\n ),\n suggestedAllocationIds: [\n \"physics.cinematic.contacts\",\n \"physics.cinematic.transforms\",\n \"physics.cinematic.cloth.state\",\n ],\n },\n contactVisuals: {\n queueClass: physicsWorkerQueueClasses.render,\n domain: \"post-processing\",\n authority: \"visual\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"physics.cinematic.contactVisuals\",\n physicsWorkerQueueClasses.render,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 4,\n workgroupScale: 0.4,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 224,\n },\n high: {\n estimatedCostMs: 0.65,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 224,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 320,\n },\n }\n ),\n suggestedAllocationIds: [\"physics.cinematic.contacts\"],\n },\n },\n },\n};\n\nconst physicsWorkerDagSpecs = {\n gameplay: {\n broadphase: { priority: 4, dependencies: [] },\n narrowphase: { priority: 4, dependencies: [\"broadphase\"] },\n solver: { priority: 4, dependencies: [\"narrowphase\"] },\n authoritativeCommit: { priority: 4, dependencies: [\"solver\"] },\n animationStateInputs: { priority: 3, dependencies: [\"authoritativeCommit\"] },\n worldSnapshot: { priority: 3, dependencies: [\"animationStateInputs\"] },\n transforms: { priority: 2, dependencies: [\"worldSnapshot\"] },\n contactVisuals: { priority: 1, dependencies: [\"worldSnapshot\"] },\n },\n cinematic: {\n broadphase: { priority: 4, dependencies: [] },\n narrowphase: { priority: 4, dependencies: [\"broadphase\"] },\n solver: { priority: 4, dependencies: [\"narrowphase\"] },\n authoritativeCommit: { priority: 4, dependencies: [\"solver\"] },\n animationStateInputs: { priority: 3, dependencies: [\"authoritativeCommit\"] },\n clothAssist: { priority: 2, dependencies: [\"authoritativeCommit\"] },\n fracturePreview: { priority: 1, dependencies: [\"authoritativeCommit\"] },\n worldSnapshot: {\n priority: 3,\n dependencies: [\n \"animationStateInputs\",\n \"clothAssist\",\n \"fracturePreview\",\n ],\n },\n transforms: { priority: 2, dependencies: [\"worldSnapshot\"] },\n contactVisuals: { priority: 1, dependencies: [\"worldSnapshot\"] },\n },\n};\n\nexport const physicsSimulationPlans = Object.freeze({\n gameplay: Object.freeze({\n description:\n \"Gameplay simulation plan that hands off a stable post-commit world snapshot to visual preparation.\",\n snapshotStageId: \"worldSnapshot\",\n secondarySimulationStageIds: Object.freeze([]),\n stages: Object.freeze([\n Object.freeze({\n id: \"intentResolution\",\n phase: \"simulation\",\n authority: \"authoritative\",\n dependencies: Object.freeze([]),\n output: \"resolved-movement-intents\",\n }),\n Object.freeze({\n id: \"broadphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.broadphase\",\n dependencies: Object.freeze([\"intentResolution\"]),\n output: \"broadphase-pairs\",\n }),\n Object.freeze({\n id: \"narrowphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.narrowphase\",\n dependencies: Object.freeze([\"broadphase\"]),\n output: \"contacts\",\n }),\n Object.freeze({\n id: \"solver\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.solver\",\n dependencies: Object.freeze([\"narrowphase\"]),\n output: \"resolved-motion\",\n }),\n Object.freeze({\n id: \"authoritativeCommit\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.gameplay.authoritativeCommit\",\n dependencies: Object.freeze([\"solver\"]),\n output: \"committed-authoritative-transforms\",\n }),\n Object.freeze({\n id: \"animationStateInputs\",\n phase: \"animation-inputs\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.animationStateInputs\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"resolved-animation-inputs\",\n }),\n Object.freeze({\n id: \"worldSnapshot\",\n phase: \"handoff\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.worldSnapshot\",\n dependencies: Object.freeze([\"animationStateInputs\"]),\n output: \"stable-world-snapshot\",\n }),\n Object.freeze({\n id: \"transforms\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.transforms\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"render-transform-sync\",\n }),\n Object.freeze({\n id: \"contactVisuals\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.gameplay.contactVisuals\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"visual-contact-effects\",\n }),\n ]),\n }),\n cinematic: Object.freeze({\n description:\n \"Cinematic simulation plan that runs degradable secondary simulation before publishing a stable world snapshot.\",\n snapshotStageId: \"worldSnapshot\",\n secondarySimulationStageIds: Object.freeze([\n \"clothAssist\",\n \"fracturePreview\",\n ]),\n stages: Object.freeze([\n Object.freeze({\n id: \"intentResolution\",\n phase: \"simulation\",\n authority: \"authoritative\",\n dependencies: Object.freeze([]),\n output: \"resolved-movement-intents\",\n }),\n Object.freeze({\n id: \"broadphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.broadphase\",\n dependencies: Object.freeze([\"intentResolution\"]),\n output: \"broadphase-pairs\",\n }),\n Object.freeze({\n id: \"narrowphase\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.narrowphase\",\n dependencies: Object.freeze([\"broadphase\"]),\n output: \"contacts\",\n }),\n Object.freeze({\n id: \"solver\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.solver\",\n dependencies: Object.freeze([\"narrowphase\"]),\n output: \"resolved-motion\",\n }),\n Object.freeze({\n id: \"authoritativeCommit\",\n phase: \"simulation\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.authoritativeCommit\",\n dependencies: Object.freeze([\"solver\"]),\n output: \"committed-authoritative-transforms\",\n }),\n Object.freeze({\n id: \"clothAssist\",\n phase: \"secondary-simulation\",\n authority: \"non-authoritative-simulation\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.clothAssist\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"cloth-secondary-state\",\n }),\n Object.freeze({\n id: \"fracturePreview\",\n phase: \"secondary-simulation\",\n authority: \"non-authoritative-simulation\",\n queueClass: physicsWorkerQueueClasses.simulation,\n jobType: \"physics.cinematic.fracturePreview\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"fracture-preview-state\",\n }),\n Object.freeze({\n id: \"animationStateInputs\",\n phase: \"animation-inputs\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.animationStateInputs\",\n dependencies: Object.freeze([\"authoritativeCommit\"]),\n output: \"resolved-animation-inputs\",\n }),\n Object.freeze({\n id: \"worldSnapshot\",\n phase: \"handoff\",\n authority: \"authoritative\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.worldSnapshot\",\n dependencies: Object.freeze([\n \"animationStateInputs\",\n \"clothAssist\",\n \"fracturePreview\",\n ]),\n output: \"stable-world-snapshot\",\n }),\n Object.freeze({\n id: \"transforms\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.transforms\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"render-transform-sync\",\n }),\n Object.freeze({\n id: \"contactVisuals\",\n phase: \"visual-follow-up\",\n authority: \"visual\",\n queueClass: physicsWorkerQueueClasses.render,\n jobType: \"physics.cinematic.contactVisuals\",\n dependencies: Object.freeze([\"worldSnapshot\"]),\n output: \"visual-contact-effects\",\n }),\n ]),\n }),\n});\n\nfunction buildPhysicsWorkerManifestJob(profileName, key, spec) {\n const label = `physics.${profileName}.${key}`;\n const dag = physicsWorkerDagSpecs[profileName][key];\n const dependencies = dag.dependencies.map(\n (dependency) => `physics.${profileName}.${dependency}`\n );\n\n return Object.freeze({\n key,\n label,\n worker: Object.freeze({\n jobType: label,\n queueClass: spec.queueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: label,\n jobType: label,\n queueClass: spec.queueClass,\n domain: spec.domain,\n authority: spec.authority,\n importance: spec.importance,\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: physicsDebugOwner,\n queueClass: spec.queueClass,\n jobType: label,\n tags: Object.freeze([\n \"physics\",\n profileName,\n key,\n spec.authority,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildPhysicsWorkerManifest(profileName, spec) {\n return Object.freeze({\n schemaVersion: 1,\n owner: physicsDebugOwner,\n profile: profileName,\n schedulerMode: \"dag\",\n description: spec.description,\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n Object.entries(spec.jobs).map(([key, jobSpec]) =>\n buildPhysicsWorkerManifestJob(profileName, key, jobSpec)\n )\n ),\n });\n}\n\nexport const physicsWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(physicsWorkerProfileSpecs).map(([profileName, spec]) => [\n profileName,\n buildPhysicsWorkerManifest(profileName, spec),\n ])\n )\n);\n\nexport const physicsWorkerProfileNames = Object.freeze(\n Object.keys(physicsWorkerManifests)\n);\n\nexport function getPhysicsWorkerManifest(\n profile = defaultPhysicsWorkerProfile\n) {\n const manifest = physicsWorkerManifests[profile];\n if (!manifest) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function createPhysicsSimulationPlan(\n profile = defaultPhysicsWorkerProfile\n) {\n const plan = physicsSimulationPlans[profile];\n if (!plan) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n\n return Object.freeze({\n profile,\n description: plan.description,\n snapshotStageId: plan.snapshotStageId,\n snapshotStability: \"post-authoritative-commit\",\n stageOrder: Object.freeze(plan.stages.map((stage) => stage.id)),\n secondarySimulationStageIds: plan.secondarySimulationStageIds,\n stages: plan.stages,\n });\n}\n\nexport function createPhysicsWorldSnapshot(input) {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new Error(\"snapshot input must be a plain object.\");\n }\n\n const profile = input.profile ?? defaultPhysicsWorkerProfile;\n if (!physicsWorkerManifests[profile]) {\n const available = physicsWorkerProfileNames.join(\", \");\n throw new Error(\n `Unknown physics worker profile \"${profile}\". Available: ${available}.`\n );\n }\n\n const bodyCount =\n input.bodyCount === undefined\n ? undefined\n : assertNonNegativeInteger(\"snapshot.bodyCount\", input.bodyCount);\n const dynamicBodyCount =\n input.dynamicBodyCount === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.dynamicBodyCount\",\n input.dynamicBodyCount\n );\n const contactCount =\n input.contactCount === undefined\n ? undefined\n : assertNonNegativeInteger(\"snapshot.contactCount\", input.contactCount);\n\n return Object.freeze({\n schemaVersion: 1,\n stage: \"worldSnapshot\",\n stability: \"post-authoritative-commit\",\n profile,\n frameId: assertIdentifier(\"snapshot.frameId\", input.frameId),\n tick: assertNonNegativeInteger(\"snapshot.tick\", input.tick),\n simulationTimeMs: assertNonNegativeNumber(\n \"snapshot.simulationTimeMs\",\n input.simulationTimeMs\n ),\n authoritativeTransformRevision: assertNonNegativeInteger(\n \"snapshot.authoritativeTransformRevision\",\n input.authoritativeTransformRevision\n ),\n secondarySimulationRevision:\n input.secondarySimulationRevision === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.secondarySimulationRevision\",\n input.secondarySimulationRevision\n ),\n animationInputRevision:\n input.animationInputRevision === undefined\n ? undefined\n : assertNonNegativeInteger(\n \"snapshot.animationInputRevision\",\n input.animationInputRevision\n ),\n bodyCount,\n dynamicBodyCount,\n contactCount,\n includesSecondarySimulation: input.secondarySimulationRevision !== undefined,\n metadata: normalizeMetadata(input.metadata),\n });\n}\n","import {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n physicsDebugOwner,\n physicsSimulationPlans,\n physicsSimulationStageOrder,\n physicsWorkerManifests,\n physicsWorkerProfileNames,\n physicsWorkerQueueClasses\n} from \"./chunk-PFUNZLNF.js\";\nexport {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n physicsDebugOwner,\n physicsSimulationPlans,\n physicsSimulationStageOrder,\n physicsWorkerManifests,\n physicsWorkerProfileNames,\n physicsWorkerQueueClasses\n};\n//# sourceMappingURL=browser.js.map","import {\n clothGarmentKinds,\n clothProfileNames,\n createClothRepresentationPlan,\n selectClothRepresentationBand,\n} from \"@plasius/gpu-cloth\";\nimport {\n fluidBodyKinds,\n fluidProfileNames,\n createFluidContinuityEnvelope,\n createFluidRepresentationPlan,\n selectFluidRepresentationBand,\n} from \"@plasius/gpu-fluid\";\nimport {\n createLightingBandPlan,\n defaultLightingProfile,\n getLightingProfile,\n lightingDistanceBands,\n} from \"@plasius/gpu-lighting\";\nimport {\n createDeviceProfile,\n createGpuPerformanceGovernor,\n createQualityLadderAdapter,\n} from \"@plasius/gpu-performance\";\nimport { createGpuDebugSession } from \"@plasius/gpu-debug\";\nimport {\n createPhysicsSimulationPlan,\n createPhysicsWorldSnapshot,\n defaultPhysicsWorkerProfile,\n getPhysicsWorkerManifest,\n} from \"@plasius/gpu-physics/browser\";\n\nimport { resolveShowcaseAssetUrl } from \"./asset-url.js\";\nimport { loadGltfModel } from \"./gltf-loader.js\";\n\nconst STYLE_ID = \"plasius-shared-3d-showcase-style\";\nconst ROOT_CLASS = \"plasius-showcase-root\";\nconst DEFAULT_TITLE = \"Flag by the Sea\";\nconst DEFAULT_SUBTITLE =\n \"Shared 3D validation scene using GLTF ships, cloth, fluid continuity, adaptive performance, and telemetry.\";\nconst SHIP_SCALE = 1.1;\nconst HARBOR_BOUNDS = Object.freeze({\n minX: -11.2,\n maxX: 11.2,\n minZ: 1.8,\n maxZ: 17.2,\n});\nconst CAMERA_PRESETS = Object.freeze({\n integrated: Object.freeze({ yaw: -0.55, pitch: 0.34, distance: 27, target: [0, 2.2, 0] }),\n lighting: Object.freeze({ yaw: -0.28, pitch: 0.28, distance: 23, target: [0, 2.8, 0] }),\n cloth: Object.freeze({ yaw: -1.1, pitch: 0.25, distance: 15, target: [-8.4, 5.3, -1.5] }),\n fluid: Object.freeze({ yaw: -0.4, pitch: 0.18, distance: 18, target: [0, 1.2, 6] }),\n physics: Object.freeze({ yaw: -0.12, pitch: 0.27, distance: 16, target: [0, 1.8, 6.8] }),\n performance: Object.freeze({ yaw: -0.65, pitch: 0.36, distance: 24, target: [0, 2.2, 0] }),\n debug: Object.freeze({ yaw: -0.7, pitch: 0.32, distance: 24, target: [0, 2.2, 0] }),\n});\nexport const showcaseFocusModes = Object.freeze(Object.keys(CAMERA_PRESETS));\n\nconst SCENE_NOTES = Object.freeze([\n \"Ships are loaded from a GLTF asset and carry mass, damping, restitution, and hull extents from node extras.\",\n \"Moonlight sets the cold ambient read while deck lanterns and harbor torches provide warm local contrast.\",\n \"Cloth and fluid continuity stay coherent across near, mid, far, and horizon bands even in the darker night palette.\",\n \"Performance pressure reduces visual detail before mass-weighted authoritative collision motion is touched.\",\n]);\n\nconst UNIT_BOX_MESH = Object.freeze({\n positions: Object.freeze([\n -0.5, -0.5, -0.5,\n 0.5, -0.5, -0.5,\n 0.5, 0.5, -0.5,\n -0.5, 0.5, -0.5,\n -0.5, -0.5, 0.5,\n 0.5, -0.5, 0.5,\n 0.5, 0.5, 0.5,\n -0.5, 0.5, 0.5,\n ]),\n indices: Object.freeze([\n 0, 1, 2, 0, 2, 3,\n 5, 4, 7, 5, 7, 6,\n 4, 0, 3, 4, 3, 7,\n 1, 5, 6, 1, 6, 2,\n 3, 2, 6, 3, 6, 7,\n 4, 5, 1, 4, 1, 0,\n ]),\n});\n\nconst SHIP_LANTERNS = Object.freeze([\n Object.freeze({ x: 0.94, y: 1.54, z: 2.52, glow: 1 }),\n Object.freeze({ x: -0.9, y: 1.58, z: 2.44, glow: 0.92 }),\n Object.freeze({ x: 0.62, y: 1.42, z: -2.18, glow: 0.88 }),\n Object.freeze({ x: -0.58, y: 1.46, z: -2.04, glow: 0.84 }),\n]);\n\nconst HARBOR_TORCHES = Object.freeze([\n Object.freeze({ x: -5.2, y: 1.25, z: 1.36, glow: 1.1 }),\n Object.freeze({ x: -8.6, y: 2.48, z: -0.72, glow: 1 }),\n Object.freeze({ x: -10.4, y: 1.28, z: 0.82, glow: 0.92 }),\n]);\nconst FLAG_LAYOUT = Object.freeze({\n origin: Object.freeze({ x: -3.5, y: 5.9, z: 2.4 }),\n width: 4.8,\n height: 2.7,\n mastOffsetX: 1.8,\n});\nfunction injectStyles() {\n if (document.getElementById(STYLE_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n .${ROOT_CLASS} {\n color-scheme: dark;\n --plasius-paper: #081321;\n --plasius-ink: #edf4ff;\n --plasius-muted: #b6c5dd;\n --plasius-accent: #f3b16a;\n --plasius-panel: rgba(8, 19, 33, 0.72);\n --plasius-border: rgba(159, 185, 223, 0.18);\n --plasius-shadow: 0 24px 56px rgba(1, 6, 14, 0.44);\n margin: 0;\n min-height: 100%;\n font-family: \"Fraunces\", \"Iowan Old Style\", serif;\n color: var(--plasius-ink);\n background:\n radial-gradient(circle at 18% 12%, rgba(73, 101, 170, 0.28), transparent 30%),\n radial-gradient(circle at 82% 18%, rgba(240, 188, 103, 0.08), transparent 18%),\n linear-gradient(180deg, #04101d 0%, #0b1930 42%, #081321 100%);\n }\n .${ROOT_CLASS},\n .${ROOT_CLASS} * {\n box-sizing: border-box;\n }\n .plasius-demo {\n width: min(1560px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 28px 0 40px;\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero,\n .plasius-demo__layout {\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero {\n grid-template-columns: minmax(0, 1.5fr) minmax(320px, 0.85fr);\n align-items: start;\n }\n .plasius-panel {\n border: 1px solid var(--plasius-border);\n border-radius: 24px;\n background: var(--plasius-panel);\n box-shadow: var(--plasius-shadow);\n backdrop-filter: blur(12px);\n }\n .plasius-demo__hero-card,\n .plasius-demo__status {\n padding: 20px 22px;\n }\n .plasius-demo__eyebrow {\n margin: 0 0 8px;\n text-transform: uppercase;\n letter-spacing: 0.18em;\n font-size: 12px;\n color: rgba(226, 236, 255, 0.58);\n }\n .plasius-demo h1,\n .plasius-demo h2,\n .plasius-demo h3 {\n margin: 0;\n }\n .plasius-demo__lead {\n margin: 12px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n max-width: 760px;\n }\n .plasius-demo__status-badge {\n width: fit-content;\n margin: 0;\n padding: 8px 12px;\n border-radius: 999px;\n background: rgba(243, 177, 106, 0.14);\n color: var(--plasius-accent);\n font-weight: 700;\n }\n .plasius-demo__status-text {\n margin: 10px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n }\n .plasius-demo__layout {\n grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.68fr);\n align-items: start;\n }\n .plasius-demo__canvas-panel {\n padding: 18px;\n position: relative;\n }\n .plasius-demo__canvas {\n width: 100%;\n aspect-ratio: 16 / 9;\n display: block;\n border-radius: 20px;\n border: 1px solid rgba(159, 185, 223, 0.12);\n background: linear-gradient(180deg, #071220 0%, #132440 42%, #10344b 42%, #05111d 100%);\n }\n .plasius-demo__toolbar {\n position: absolute;\n top: 26px;\n left: 26px;\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n align-items: center;\n }\n .plasius-demo button,\n .plasius-demo label,\n .plasius-demo select {\n font-family: \"JetBrains Mono\", monospace;\n font-size: 13px;\n }\n .plasius-demo button,\n .plasius-demo .plasius-toggle,\n .plasius-demo select {\n border: 1px solid rgba(159, 185, 223, 0.18);\n border-radius: 999px;\n background: rgba(9, 20, 34, 0.84);\n color: var(--plasius-ink);\n padding: 10px 14px;\n }\n .plasius-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .plasius-demo__sidebar {\n display: grid;\n gap: 18px;\n }\n .plasius-demo__card {\n padding: 18px;\n }\n .plasius-demo__metrics,\n .plasius-demo__metrics li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .plasius-demo__metrics {\n margin-top: 12px;\n display: grid;\n gap: 8px;\n color: var(--plasius-muted);\n line-height: 1.55;\n }\n .plasius-demo__metrics li {\n border-top: 1px solid rgba(21, 32, 40, 0.08);\n padding-top: 8px;\n }\n .plasius-demo__legend {\n position: absolute;\n right: 24px;\n bottom: 24px;\n padding: 10px 14px;\n border-radius: 16px;\n background: rgba(9, 20, 34, 0.82);\n border: 1px solid rgba(159, 185, 223, 0.16);\n color: var(--plasius-muted);\n font-size: 12px;\n line-height: 1.45;\n }\n .plasius-demo__legend strong {\n display: block;\n color: var(--plasius-ink);\n margin-bottom: 4px;\n }\n .plasius-demo__footer {\n margin-top: 4px;\n color: rgba(226, 236, 255, 0.68);\n font-size: 13px;\n line-height: 1.6;\n }\n @media (max-width: 1200px) {\n .plasius-demo__hero,\n .plasius-demo__layout {\n grid-template-columns: 1fr;\n }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction mix(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction smoothstep(min, max, value) {\n const t = clamp((value - min) / Math.max(0.0001, max - min), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\nfunction pseudoRandom(seed) {\n const value = Math.sin(seed * 12.9898 + seed * seed * 0.0017) * 43758.5453;\n return value - Math.floor(value);\n}\n\nfunction vec3(x = 0, y = 0, z = 0) {\n return { x, y, z };\n}\n\nfunction addVec3(a, b) {\n return vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\nfunction subVec3(a, b) {\n return vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction scaleVec3(a, s) {\n return vec3(a.x * s, a.y * s, a.z * s);\n}\n\nfunction dotVec3(a, b) {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\nfunction crossVec3(a, b) {\n return vec3(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x\n );\n}\n\nfunction lengthVec3(a) {\n return Math.hypot(a.x, a.y, a.z);\n}\n\nfunction normalizeVec3(a) {\n const length = lengthVec3(a) || 1;\n return vec3(a.x / length, a.y / length, a.z / length);\n}\n\nfunction reflectVec3(vector, normal) {\n const unitNormal = normalizeVec3(normal);\n return subVec3(vector, scaleVec3(unitNormal, 2 * dotVec3(vector, unitNormal)));\n}\n\nfunction directionFromYaw(yaw) {\n return normalizeVec3(vec3(Math.sin(yaw), 0, Math.cos(yaw)));\n}\n\nfunction perpendicularOnWater(direction) {\n return vec3(-direction.z, 0, direction.x);\n}\n\nfunction rotateY(point, angle) {\n const cosine = Math.cos(angle);\n const sine = Math.sin(angle);\n return vec3(\n point.x * cosine - point.z * sine,\n point.y,\n point.x * sine + point.z * cosine\n );\n}\n\nfunction transformPoint(point, transform) {\n const scale =\n typeof transform.scale === \"number\"\n ? { x: transform.scale, y: transform.scale, z: transform.scale }\n : transform.scale;\n const scaled = vec3(point.x * scale.x, point.y * scale.y, point.z * scale.z);\n const rotated = rotateY(scaled, transform.rotationY);\n return addVec3(rotated, transform.position);\n}\n\nfunction projectPoint(point, camera, viewport) {\n const relative = subVec3(point, camera.eye);\n const viewX = dotVec3(relative, camera.right);\n const viewY = dotVec3(relative, camera.up);\n const viewZ = dotVec3(relative, camera.forward);\n if (viewZ <= 0.1) {\n return null;\n }\n const focal = 1 / Math.tan((camera.fov * Math.PI) / 360);\n const ndcX = (viewX * focal) / (viewZ * camera.aspect);\n const ndcY = (viewY * focal) / viewZ;\n return {\n x: (ndcX * 0.5 + 0.5) * viewport.width,\n y: (-ndcY * 0.5 + 0.5) * viewport.height,\n depth: viewZ,\n };\n}\n\nfunction colorToRgba(color, alpha = 1) {\n const r = Math.round(clamp(color.r, 0, 1) * 255);\n const g = Math.round(clamp(color.g, 0, 1) * 255);\n const b = Math.round(clamp(color.b, 0, 1) * 255);\n return `rgba(${r}, ${g}, ${b}, ${clamp(alpha, 0, 1)})`;\n}\n\nfunction projectShadowPoint(point, lightDir, planeY) {\n const shadowDir = scaleVec3(lightDir, -1);\n if (Math.abs(shadowDir.y) < 0.0001) {\n return null;\n }\n\n const distance = (planeY - point.y) / shadowDir.y;\n if (!Number.isFinite(distance) || distance < 0) {\n return null;\n }\n\n return addVec3(point, scaleVec3(shadowDir, distance));\n}\n\nfunction shadeColor(base, normal, lightDir, heightBias = 0, accent = 0) {\n const diffuse = clamp(dotVec3(normalizeVec3(normal), lightDir), 0, 1);\n const brightness = 0.24 + diffuse * 0.72 + heightBias * 0.08 + accent;\n return {\n r: clamp(base.r * brightness, 0, 1),\n g: clamp(base.g * brightness, 0, 1),\n b: clamp(base.b * (brightness + 0.03), 0, 1),\n };\n}\n\nfunction buildCamera(state, canvas) {\n const preset = CAMERA_PRESETS[state.focus] ?? CAMERA_PRESETS.integrated;\n const yaw = state.camera.yaw ?? preset.yaw;\n const pitch = state.camera.pitch ?? preset.pitch;\n const distance = state.camera.distance ?? preset.distance;\n const target = state.camera.target ?? vec3(...preset.target);\n const eye = vec3(\n target.x + Math.sin(yaw) * Math.cos(pitch) * distance,\n target.y + Math.sin(pitch) * distance,\n target.z + Math.cos(yaw) * Math.cos(pitch) * distance\n );\n const forward = normalizeVec3(subVec3(target, eye));\n const right = normalizeVec3(crossVec3(forward, vec3(0, 1, 0)));\n const up = normalizeVec3(crossVec3(right, forward));\n return {\n eye,\n target,\n forward,\n right,\n up,\n fov: 54,\n aspect: canvas.width / canvas.height,\n };\n}\n\nfunction buildTrianglesFromMesh(mesh, transform, baseColor, camera, viewport, triangles, accent = 0) {\n for (let index = 0; index < mesh.indices.length; index += 3) {\n const aIndex = mesh.indices[index] * 3;\n const bIndex = mesh.indices[index + 1] * 3;\n const cIndex = mesh.indices[index + 2] * 3;\n\n const a = transformPoint(\n vec3(mesh.positions[aIndex], mesh.positions[aIndex + 1], mesh.positions[aIndex + 2]),\n transform\n );\n const b = transformPoint(\n vec3(mesh.positions[bIndex], mesh.positions[bIndex + 1], mesh.positions[bIndex + 2]),\n transform\n );\n const c = transformPoint(\n vec3(mesh.positions[cIndex], mesh.positions[cIndex + 1], mesh.positions[cIndex + 2]),\n transform\n );\n\n const ab = subVec3(b, a);\n const ac = subVec3(c, a);\n const normal = normalizeVec3(crossVec3(ab, ac));\n const viewDir = normalizeVec3(subVec3(camera.eye, a));\n if (dotVec3(normal, viewDir) <= 0) {\n continue;\n }\n\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor,\n accent,\n });\n }\n}\n\nfunction createPerformanceGovernor() {\n const fluidDetail = createQualityLadderAdapter({\n id: \"fluid-detail\",\n domain: \"geometry\",\n levels: [\n { id: \"low\", config: { nearResolution: 10, midResolution: 6, splashCount: 10 }, estimatedCostMs: 0.8 },\n { id: \"medium\", config: { nearResolution: 16, midResolution: 8, splashCount: 18 }, estimatedCostMs: 1.4 },\n { id: \"high\", config: { nearResolution: 24, midResolution: 12, splashCount: 28 }, estimatedCostMs: 2.4 },\n ],\n initialLevel: \"high\",\n });\n\n const clothDetail = createQualityLadderAdapter({\n id: \"cloth-detail\",\n domain: \"cloth\",\n levels: [\n { id: \"low\", config: { cols: 10, rows: 7 }, estimatedCostMs: 0.7 },\n { id: \"medium\", config: { cols: 16, rows: 11 }, estimatedCostMs: 1.3 },\n { id: \"high\", config: { cols: 24, rows: 16 }, estimatedCostMs: 2.1 },\n ],\n initialLevel: \"high\",\n });\n\n const lightingDetail = createQualityLadderAdapter({\n id: \"lighting-detail\",\n domain: \"lighting\",\n levels: [\n { id: \"low\", config: { shadowStrength: 0.18, reflectionStrength: 0.08 }, estimatedCostMs: 0.5 },\n { id: \"medium\", config: { shadowStrength: 0.34, reflectionStrength: 0.16 }, estimatedCostMs: 1.0 },\n { id: \"high\", config: { shadowStrength: 0.5, reflectionStrength: 0.24 }, estimatedCostMs: 1.8 },\n ],\n initialLevel: \"high\",\n });\n\n const governor = createGpuPerformanceGovernor({\n device: createDeviceProfile({\n deviceClass: \"desktop\",\n mode: \"flat\",\n refreshRateHz: 60,\n supportedFrameRates: [60, 90],\n supportsWebGpu: true,\n }),\n modules: [fluidDetail, clothDetail, lightingDetail],\n adaptation: {\n sampleWindowSize: 10,\n minimumSamplesBeforeAdjustment: 4,\n degradeCooldownFrames: 1,\n upgradeCooldownFrames: 4,\n minStableFramesForRecovery: 3,\n },\n });\n\n return { governor, fluidDetail, clothDetail, lightingDetail };\n}\n\nfunction buildDemoDom(root, options) {\n root.innerHTML = `\n <main class=\"plasius-demo\">\n <section class=\"plasius-demo__hero\">\n <section class=\"plasius-panel plasius-demo__hero-card\">\n <p class=\"plasius-demo__eyebrow\">${options.packageName}</p>\n <h1>${options.title}</h1>\n <p class=\"plasius-demo__lead\">${options.subtitle}</p>\n </section>\n <section class=\"plasius-panel plasius-demo__status\">\n <p id=\"demoStatus\" class=\"plasius-demo__status-badge\">Booting 3D scene…</p>\n <p id=\"demoDetails\" class=\"plasius-demo__status-text\">\n Preparing a moonlit harbor scene, GLTF hull data, cloth and fluid continuity plans, and adaptive quality metadata.\n </p>\n </section>\n </section>\n <section class=\"plasius-demo__layout\">\n <section class=\"plasius-panel plasius-demo__canvas-panel\">\n <canvas id=\"demoCanvas\" class=\"plasius-demo__canvas\" width=\"1280\" height=\"720\"></canvas>\n <div class=\"plasius-demo__toolbar\">\n <button id=\"pauseButton\" type=\"button\">Pause</button>\n <label class=\"plasius-toggle\">\n <input id=\"stressToggle\" type=\"checkbox\" />\n Stress mode\n </label>\n <label class=\"plasius-toggle\">\n Focus\n <select id=\"focusMode\">\n <option value=\"integrated\">integrated</option>\n <option value=\"lighting\">lighting</option>\n <option value=\"cloth\">cloth</option>\n <option value=\"fluid\">fluid</option>\n <option value=\"physics\">physics</option>\n <option value=\"performance\">performance</option>\n <option value=\"debug\">debug</option>\n </select>\n </label>\n </div>\n <div class=\"plasius-demo__legend\">\n <strong>Scene</strong>\n GLTF ships carry hull mass and damping metadata.<br />\n Lanterns and torches warm the moonlit harbor.<br />\n Mass-aware collisions stay authoritative near the camera.\n </div>\n </section>\n <aside class=\"plasius-demo__sidebar\">\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Scene State</h2>\n <ul id=\"sceneMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Quality + Budgets</h2>\n <ul id=\"qualityMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Debug Telemetry</h2>\n <ul id=\"debugMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>Notes</h2>\n <ul id=\"sceneNotes\" class=\"plasius-demo__metrics\"></ul>\n </section>\n </aside>\n </section>\n <p class=\"plasius-demo__footer\">\n This visual example is shared across the GPU packages to keep manual validation fast and consistent.\n </p>\n </main>\n `;\n\n return {\n status: root.querySelector(\"#demoStatus\"),\n details: root.querySelector(\"#demoDetails\"),\n canvas: root.querySelector(\"#demoCanvas\"),\n pauseButton: root.querySelector(\"#pauseButton\"),\n stressToggle: root.querySelector(\"#stressToggle\"),\n focusMode: root.querySelector(\"#focusMode\"),\n sceneMetrics: root.querySelector(\"#sceneMetrics\"),\n qualityMetrics: root.querySelector(\"#qualityMetrics\"),\n debugMetrics: root.querySelector(\"#debugMetrics\"),\n sceneNotes: root.querySelector(\"#sceneNotes\"),\n };\n}\n\nfunction buildSceneSnapshot(state, shipModel) {\n return Object.freeze({\n focus: state.focus,\n frame: state.frame,\n time: state.time,\n stress: state.stress,\n collisions: state.contactCount,\n collisionCount: state.collisionCount,\n collisionFlash: state.collisionFlash,\n sprays: Object.freeze(\n state.sprays.map((spray) =>\n Object.freeze({\n life: spray.life,\n position: Object.freeze({ ...spray.position }),\n velocity: Object.freeze({ ...spray.velocity }),\n })\n )\n ),\n ships: Object.freeze(\n state.ships.map((ship) =>\n Object.freeze({\n id: ship.id,\n position: Object.freeze({ ...ship.position }),\n velocity: Object.freeze({ ...ship.velocity }),\n rotationY: ship.rotationY,\n angularVelocity: ship.angularVelocity,\n tint: Object.freeze({ ...ship.tint }),\n })\n )\n ),\n waveImpulses: Object.freeze(\n state.waveImpulses.map((impulse) =>\n Object.freeze({\n x: impulse.x,\n z: impulse.z,\n strength: impulse.strength,\n radius: impulse.radius,\n life: impulse.life,\n })\n )\n ),\n shipPhysics: shipModel?.physics ?? null,\n physics: Object.freeze({\n profile: state.physics.profile,\n plan: state.physics.plan,\n manifest: state.physics.manifest,\n snapshot: state.physics.snapshot,\n shipPhysics: shipModel?.physics ?? null,\n }),\n });\n}\n\nfunction resolveSceneDescription(state, options, shipModel) {\n const scene = buildSceneSnapshot(state, shipModel);\n if (typeof options.describeState !== \"function\") {\n return { scene, description: null };\n }\n\n const description = options.describeState(state.packageState, scene) ?? null;\n return { scene, description };\n}\n\nfunction updatePackageState(state, options, shipModel, dt) {\n if (typeof options.updateState !== \"function\") {\n return;\n }\n\n const scene = buildSceneSnapshot(state, shipModel);\n const nextState = options.updateState(state.packageState, scene, dt);\n if (typeof nextState !== \"undefined\") {\n state.packageState = nextState;\n }\n}\n\nfunction normalizeColorOverride(color, fallback) {\n if (!color || typeof color !== \"object\") {\n return fallback;\n }\n\n return {\n r: typeof color.r === \"number\" ? color.r : fallback.r,\n g: typeof color.g === \"number\" ? color.g : fallback.g,\n b: typeof color.b === \"number\" ? color.b : fallback.b,\n };\n}\n\nfunction readVisualNumber(value, fallback) {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction resolveClothPresentation(state, meshDetail) {\n const clothPlan = createClothRepresentationPlan({\n garmentId: \"shore-flag\",\n kind: state.focus === \"cloth\" ? \"flag\" : clothGarmentKinds[0],\n profile: state.focus === \"cloth\" ? \"cinematic\" : clothProfileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 18,\n midFieldMaxMeters: 55,\n farFieldMaxMeters: 180,\n });\n const preset = CAMERA_PRESETS[state.focus] ?? CAMERA_PRESETS.integrated;\n const fallbackEye = state.camera.eye\n ? state.camera.eye\n : addVec3(\n state.camera.target,\n vec3(\n Math.sin(state.camera.yaw ?? preset.yaw) * Math.cos(state.camera.pitch ?? preset.pitch) * (state.camera.distance ?? preset.distance),\n Math.sin(state.camera.pitch ?? preset.pitch) * (state.camera.distance ?? preset.distance),\n Math.cos(state.camera.yaw ?? preset.yaw) * Math.cos(state.camera.pitch ?? preset.pitch) * (state.camera.distance ?? preset.distance)\n )\n );\n const cameraDistance = lengthVec3(subVec3(state.camera.target, fallbackEye));\n const band = selectClothRepresentationBand(cameraDistance, clothPlan.thresholds);\n const representation =\n clothPlan.representations.find((entry) => entry.band === band) ?? clothPlan.representations[0];\n return {\n clothPlan,\n band,\n continuity: representation.continuity,\n representation,\n };\n}\n\nfunction getFlagRestPosition(rows, cols, row, column) {\n const u = cols <= 1 ? 0 : column / (cols - 1);\n const v = rows <= 1 ? 0 : row / (rows - 1);\n return vec3(\n FLAG_LAYOUT.origin.x + u * FLAG_LAYOUT.mastOffsetX,\n FLAG_LAYOUT.origin.y - FLAG_LAYOUT.height * v - u * u * 0.08,\n FLAG_LAYOUT.origin.z + FLAG_LAYOUT.width * u\n );\n}\n\nfunction buildClothConstraints(rows, cols, restPositions) {\n const constraints = [];\n const indexFor = (row, column) => row * cols + column;\n const pushConstraint = (a, b, stiffness) => {\n constraints.push(\n Object.freeze({\n a,\n b,\n restLength: lengthVec3(subVec3(restPositions[a], restPositions[b])),\n stiffness,\n })\n );\n };\n\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const index = indexFor(row, column);\n if (column + 1 < cols) {\n pushConstraint(index, indexFor(row, column + 1), 0.92);\n }\n if (row + 1 < rows) {\n pushConstraint(index, indexFor(row + 1, column), 0.9);\n }\n if (column + 1 < cols && row + 1 < rows) {\n pushConstraint(index, indexFor(row + 1, column + 1), 0.66);\n }\n if (column - 1 >= 0 && row + 1 < rows) {\n pushConstraint(index, indexFor(row + 1, column - 1), 0.66);\n }\n if (column + 2 < cols) {\n pushConstraint(index, indexFor(row, column + 2), 0.22);\n }\n if (row + 2 < rows) {\n pushConstraint(index, indexFor(row + 2, column), 0.18);\n }\n }\n }\n\n return Object.freeze(constraints);\n}\n\nfunction createShowcaseClothSimulationState(options = {}) {\n const rows = Math.max(4, options.rows ?? 11);\n const cols = Math.max(4, options.cols ?? 16);\n const continuity = options.continuity ?? {\n broadMotionFloor: 0.72,\n wrinkleFloor: 0.56,\n };\n const representation = options.representation ?? {\n mesh: {\n solverIterations: 6,\n wrinkleLayers: 2,\n },\n };\n const restPositions = [];\n const positions = [];\n const previousPositions = [];\n const uvs = [];\n const phaseOffsets = [];\n const pinned = [];\n\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const index = row * cols + column;\n const u = cols <= 1 ? 0 : column / (cols - 1);\n const v = rows <= 1 ? 0 : row / (rows - 1);\n const rest = getFlagRestPosition(rows, cols, row, column);\n const preload = vec3(\n u * 0.04,\n Math.sin(v * Math.PI) * 0.02 * continuity.wrinkleFloor,\n -u * 0.12\n );\n const pinnedPoint = column === 0;\n restPositions.push(rest);\n positions.push(pinnedPoint ? vec3(rest.x, rest.y, rest.z) : addVec3(rest, preload));\n previousPositions.push(\n pinnedPoint\n ? vec3(rest.x, rest.y, rest.z)\n : addVec3(rest, scaleVec3(preload, 0.35))\n );\n uvs.push(Object.freeze({ u, v }));\n phaseOffsets.push(pseudoRandom(index + 17) * Math.PI * 2);\n pinned.push(pinnedPoint);\n }\n }\n\n return {\n rows,\n cols,\n continuity,\n representation,\n restPositions,\n positions,\n previousPositions,\n constraints: buildClothConstraints(rows, cols, restPositions),\n indices: Object.freeze(\n Array.from({ length: (rows - 1) * (cols - 1) * 6 }, (_, listIndex) => listIndex)\n .map((_, listIndex, source) => {\n if (listIndex >= source.length) {\n return 0;\n }\n const quadIndex = Math.floor(listIndex / 6);\n const quadColumn = quadIndex % (cols - 1);\n const quadRow = Math.floor(quadIndex / (cols - 1));\n const base = quadRow * cols + quadColumn;\n return [base, base + 1, base + cols + 1, base, base + cols + 1, base + cols][listIndex % 6];\n })\n ),\n uvs,\n phaseOffsets,\n pinned,\n };\n}\n\nfunction resetPinnedClothPoints(clothState) {\n for (let index = 0; index < clothState.positions.length; index += 1) {\n if (!clothState.pinned[index]) {\n continue;\n }\n const anchor = clothState.restPositions[index];\n clothState.positions[index] = vec3(anchor.x, anchor.y, anchor.z);\n clothState.previousPositions[index] = vec3(anchor.x, anchor.y, anchor.z);\n }\n}\n\nfunction satisfyClothConstraint(clothState, constraint) {\n const a = clothState.positions[constraint.a];\n const b = clothState.positions[constraint.b];\n const delta = subVec3(b, a);\n const distance = lengthVec3(delta);\n if (distance <= 0.0001) {\n return;\n }\n\n const correctionScale =\n ((distance - constraint.restLength) / distance) * 0.5 * constraint.stiffness;\n const correction = scaleVec3(delta, correctionScale);\n if (!clothState.pinned[constraint.a]) {\n clothState.positions[constraint.a] = addVec3(a, correction);\n }\n if (!clothState.pinned[constraint.b]) {\n clothState.positions[constraint.b] = subVec3(b, correction);\n }\n}\n\nfunction advanceShowcaseClothSimulationState(clothState, options = {}) {\n const dt = clamp(options.dt ?? 1 / 60, 1 / 240, 1 / 18);\n const time = readVisualNumber(options.time, 0);\n const flagMotion = readVisualNumber(options.flagMotion, 0.92);\n const waveInfluence = readVisualNumber(options.waveInfluence, 0);\n const wrinkleLayers = Math.max(1, clothState.representation.mesh?.wrinkleLayers ?? 2);\n const solverIterations = clamp(\n Math.round(clothState.representation.mesh?.solverIterations ?? 6),\n 2,\n 10\n );\n\n for (let index = 0; index < clothState.positions.length; index += 1) {\n if (clothState.pinned[index]) {\n continue;\n }\n\n const current = clothState.positions[index];\n const previous = clothState.previousPositions[index];\n const { u, v } = clothState.uvs[index];\n const phase = clothState.phaseOffsets[index];\n const broadMotion = clothState.continuity.broadMotionFloor;\n const wrinkleMotion = clothState.continuity.wrinkleFloor;\n const gustPhase = time * 2.1 + phase + u * 4.4 + v * 2.3;\n const wrinklePhase = time * 5.3 + phase * 0.72 + u * 9.6 + v * 7.1;\n const windDirection = normalizeVec3(\n vec3(\n 0.18 + Math.sin(gustPhase) * (0.12 + broadMotion * 0.09),\n Math.cos(time * 1.4 + phase + v * 4.8) * 0.06 * wrinkleMotion,\n 1 + Math.sin(gustPhase * 0.74) * 0.18\n )\n );\n const windStrength =\n (1.6 + broadMotion * 1.25 + wrinkleLayers * 0.12) *\n flagMotion *\n (0.44 + u * 1.14);\n const wrinkleForce = vec3(\n Math.sin(wrinklePhase) * 0.22 * wrinkleMotion * flagMotion,\n Math.cos(wrinklePhase * 0.7) * 0.08 * wrinkleMotion,\n Math.cos(wrinklePhase) * 0.14 * broadMotion * flagMotion\n );\n const acceleration = addVec3(\n vec3(0, -0.48 - u * 0.08, 0),\n addVec3(\n scaleVec3(windDirection, windStrength),\n addVec3(\n wrinkleForce,\n vec3(waveInfluence * (0.04 + u * 0.08), 0, waveInfluence * 0.16)\n )\n )\n );\n const inertia = scaleVec3(subVec3(current, previous), 0.987);\n const next = addVec3(addVec3(current, inertia), scaleVec3(acceleration, dt * dt));\n clothState.previousPositions[index] = vec3(current.x, current.y, current.z);\n clothState.positions[index] = next;\n }\n\n resetPinnedClothPoints(clothState);\n for (let iteration = 0; iteration < solverIterations; iteration += 1) {\n for (const constraint of clothState.constraints) {\n satisfyClothConstraint(clothState, constraint);\n }\n resetPinnedClothPoints(clothState);\n }\n\n return clothState;\n}\n\nfunction ensureShowcaseClothState(state, meshDetail, clothPresentation) {\n if (\n !state.clothState ||\n state.clothState.rows !== meshDetail.rows ||\n state.clothState.cols !== meshDetail.cols\n ) {\n state.clothState = createShowcaseClothSimulationState({\n rows: meshDetail.rows,\n cols: meshDetail.cols,\n continuity: clothPresentation.continuity,\n representation: clothPresentation.representation,\n });\n } else {\n state.clothState.continuity = clothPresentation.continuity;\n state.clothState.representation = clothPresentation.representation;\n }\n\n return state.clothState;\n}\n\nfunction resolveVisualConfig(nearLighting, lightingSnapshot, customVisuals = {}) {\n const premiumShadows = nearLighting.primaryShadowSource === \"ray-traced-primary\";\n const defaults = {\n skyTop: premiumShadows ? \"#040c1a\" : \"#06101f\",\n skyMid: premiumShadows ? \"#11203b\" : \"#152643\",\n skyBottom: premiumShadows ? \"#2f4468\" : \"#364d73\",\n duskGlow: premiumShadows ? \"rgba(116, 142, 201, 0.26)\" : \"rgba(104, 128, 188, 0.22)\",\n seaTop: premiumShadows ? \"#102946\" : \"#153050\",\n seaMid: premiumShadows ? \"#0a1d33\" : \"#0d2138\",\n seaBottom: \"#04101d\",\n moonCore: \"rgba(241, 246, 255, 0.98)\",\n moonHalo: \"rgba(167, 191, 255, 0.24)\",\n moonReflection: \"rgba(192, 214, 255, 0.22)\",\n starColor: \"rgba(232, 239, 255, 0.82)\",\n ambientMist: \"rgba(41, 63, 97, 0.16)\",\n reflectionStrength: lightingSnapshot.currentLevel.config.reflectionStrength,\n shadowAccent: lightingSnapshot.currentLevel.config.shadowStrength,\n waveAmplitude: 0.94,\n waveDirection: { x: 0.88, z: 0.28 },\n wavePhaseSpeed: 0.88,\n wakeStrength: 0.31,\n wakeLength: 18,\n collisionRippleStrength: 0.42,\n waterNear: { r: 0.08, g: 0.23, b: 0.33 },\n waterFar: { r: 0.18, g: 0.35, b: 0.49 },\n harborWall: { r: 0.26, g: 0.24, b: 0.28 },\n harborDeck: { r: 0.33, g: 0.22, b: 0.16 },\n harborTower: { r: 0.23, g: 0.24, b: 0.29 },\n flagColor: { r: 0.66, g: 0.16, b: 0.13 },\n flagMotion: 0.92,\n lanternCore: { r: 0.98, g: 0.8, b: 0.48 },\n lanternGlow: { r: 1, g: 0.56, b: 0.2 },\n lanternReflectionStrength: 0.42,\n torchCore: { r: 0.99, g: 0.72, b: 0.36 },\n torchGlow: { r: 0.98, g: 0.38, b: 0.15 },\n collisionFlash: \"rgba(255, 212, 168, 0.16)\",\n };\n\n return {\n skyTop: typeof customVisuals.skyTop === \"string\" ? customVisuals.skyTop : defaults.skyTop,\n skyMid: typeof customVisuals.skyMid === \"string\" ? customVisuals.skyMid : defaults.skyMid,\n skyBottom:\n typeof customVisuals.skyBottom === \"string\" ? customVisuals.skyBottom : defaults.skyBottom,\n seaTop: typeof customVisuals.seaTop === \"string\" ? customVisuals.seaTop : defaults.seaTop,\n seaMid: typeof customVisuals.seaMid === \"string\" ? customVisuals.seaMid : defaults.seaMid,\n seaBottom:\n typeof customVisuals.seaBottom === \"string\" ? customVisuals.seaBottom : defaults.seaBottom,\n duskGlow:\n typeof customVisuals.duskGlow === \"string\" ? customVisuals.duskGlow : defaults.duskGlow,\n moonCore:\n typeof customVisuals.moonCore === \"string\"\n ? customVisuals.moonCore\n : typeof customVisuals.sunCore === \"string\"\n ? customVisuals.sunCore\n : defaults.moonCore,\n moonHalo:\n typeof customVisuals.moonHalo === \"string\" ? customVisuals.moonHalo : defaults.moonHalo,\n moonReflection:\n typeof customVisuals.moonReflection === \"string\"\n ? customVisuals.moonReflection\n : defaults.moonReflection,\n starColor:\n typeof customVisuals.starColor === \"string\" ? customVisuals.starColor : defaults.starColor,\n ambientMist:\n typeof customVisuals.ambientMist === \"string\"\n ? customVisuals.ambientMist\n : defaults.ambientMist,\n reflectionStrength: readVisualNumber(\n customVisuals.reflectionStrength,\n defaults.reflectionStrength\n ),\n shadowAccent: readVisualNumber(customVisuals.shadowAccent, defaults.shadowAccent),\n waveAmplitude: readVisualNumber(customVisuals.waveAmplitude, defaults.waveAmplitude),\n waveDirection:\n customVisuals.waveDirection &&\n typeof customVisuals.waveDirection.x === \"number\" &&\n typeof customVisuals.waveDirection.z === \"number\"\n ? { x: customVisuals.waveDirection.x, z: customVisuals.waveDirection.z }\n : defaults.waveDirection,\n wavePhaseSpeed: readVisualNumber(customVisuals.wavePhaseSpeed, defaults.wavePhaseSpeed),\n wakeStrength: readVisualNumber(customVisuals.wakeStrength, defaults.wakeStrength),\n wakeLength: readVisualNumber(customVisuals.wakeLength, defaults.wakeLength),\n collisionRippleStrength: readVisualNumber(\n customVisuals.collisionRippleStrength,\n defaults.collisionRippleStrength\n ),\n waterNear: normalizeColorOverride(customVisuals.waterNear, defaults.waterNear),\n waterFar: normalizeColorOverride(customVisuals.waterFar, defaults.waterFar),\n harborWall: normalizeColorOverride(customVisuals.harborWall, defaults.harborWall),\n harborDeck: normalizeColorOverride(customVisuals.harborDeck, defaults.harborDeck),\n harborTower: normalizeColorOverride(customVisuals.harborTower, defaults.harborTower),\n flagColor: normalizeColorOverride(customVisuals.flagColor, defaults.flagColor),\n flagMotion: readVisualNumber(customVisuals.flagMotion, defaults.flagMotion),\n lanternCore: normalizeColorOverride(customVisuals.lanternCore, defaults.lanternCore),\n lanternGlow: normalizeColorOverride(customVisuals.lanternGlow, defaults.lanternGlow),\n lanternReflectionStrength: readVisualNumber(\n customVisuals.lanternReflectionStrength,\n defaults.lanternReflectionStrength\n ),\n torchCore: normalizeColorOverride(customVisuals.torchCore, defaults.torchCore),\n torchGlow: normalizeColorOverride(customVisuals.torchGlow, defaults.torchGlow),\n collisionFlash:\n typeof customVisuals.collisionFlash === \"string\"\n ? customVisuals.collisionFlash\n : defaults.collisionFlash,\n };\n}\n\nfunction buildClothSurface(model, state, meshDetail, visuals) {\n const clothPresentation = resolveClothPresentation(state, meshDetail);\n const clothState = ensureShowcaseClothState(state, meshDetail, clothPresentation);\n\n return {\n clothPlan: clothPresentation.clothPlan,\n band: clothPresentation.band,\n representation: clothPresentation.representation,\n continuity: clothPresentation.continuity,\n color: visuals.flagColor,\n positions: clothState.positions.map((point) => vec3(point.x, point.y, point.z)),\n indices: clothState.indices,\n grid: { rows: clothState.rows, cols: clothState.cols },\n };\n}\n\nfunction resolveWaveDirection(state) {\n const direction = state.demoVisuals?.waveDirection;\n if (\n direction &&\n typeof direction === \"object\" &&\n typeof direction.x === \"number\" &&\n typeof direction.z === \"number\"\n ) {\n return normalizeVec3(vec3(direction.x, 0, direction.z));\n }\n\n return normalizeVec3(vec3(0.86, 0, 0.34));\n}\n\nfunction sampleShipWake(state, x, z, time) {\n const wakeStrength = readVisualNumber(state.demoVisuals?.wakeStrength, 0.24);\n const wakeLength = readVisualNumber(state.demoVisuals?.wakeLength, 15);\n let total = 0;\n\n for (const ship of state.ships) {\n const speed = Math.hypot(ship.velocity.x, ship.velocity.z);\n if (speed <= 0.05) {\n continue;\n }\n\n const direction = normalizeVec3(vec3(ship.velocity.x, 0, ship.velocity.z));\n const behind = scaleVec3(direction, -1);\n const lateral = vec3(-direction.z, 0, direction.x);\n const delta = vec3(x - ship.position.x, 0, z - ship.position.z);\n const along = dotVec3(delta, behind);\n if (along < 0 || along > wakeLength) {\n continue;\n }\n\n const cross = Math.abs(dotVec3(delta, lateral));\n const width = 0.9 + along * 0.2;\n if (cross > width * 3.2) {\n continue;\n }\n\n const envelope =\n Math.exp(-along * 0.14) * Math.exp(-((cross * cross) / Math.max(0.4, width * width * 2.4)));\n total += Math.sin(along * 1.6 - time * 4.2) * speed * wakeStrength * envelope;\n }\n\n return total;\n}\n\nfunction sampleWaveImpulses(state, x, z, time) {\n const rippleStrength = readVisualNumber(state.demoVisuals?.collisionRippleStrength, 0.34);\n let total = 0;\n\n for (const impulse of state.waveImpulses) {\n const dx = x - impulse.x;\n const dz = z - impulse.z;\n const distance = Math.hypot(dx, dz);\n const radius = impulse.radius + (1 - impulse.life) * 4.8;\n if (distance > radius * 2.8) {\n continue;\n }\n\n const phase = distance * 1.8 - (1 - impulse.life) * 10 - time * 0.4;\n const envelope = Math.exp(-distance / Math.max(0.1, radius)) * impulse.life;\n total += Math.sin(phase) * impulse.strength * rippleStrength * envelope * 0.18;\n }\n\n return total;\n}\n\nfunction sampleWave(state, x, z, time) {\n const direction = resolveWaveDirection(state);\n const lateral = vec3(-direction.z, 0, direction.x);\n const along = x * direction.x + z * direction.z;\n const cross = x * lateral.x + z * lateral.z;\n const phaseSpeed = readVisualNumber(state.demoVisuals?.wavePhaseSpeed, 1);\n const amplitude = readVisualNumber(state.demoVisuals?.waveAmplitude, 1);\n const base =\n Math.sin(along * 0.22 - time * 1.12 * phaseSpeed) * 0.42 +\n Math.cos(along * 0.11 + cross * 0.07 - time * 0.78 * phaseSpeed) * 0.26 +\n Math.sin(cross * 0.19 - time * 1.34 * phaseSpeed) * 0.16;\n\n return (\n base * amplitude +\n sampleShipWake(state, x, z, time) +\n sampleWaveImpulses(state, x, z, time)\n );\n}\n\nfunction resolveFluidBandContinuity(continuity, band) {\n if (continuity?.bands && continuity.bands[band]) {\n return continuity.bands[band];\n }\n\n return continuity ?? { amplitudeFloor: 1, frequencyFloor: 1 };\n}\n\nfunction buildWaterMotionEffects(state) {\n const wakeTrails = [];\n const rippleRings = state.waveImpulses.map((impulse) => {\n const radius = impulse.radius + (1 - impulse.life) * 4.8;\n return Object.freeze({\n center: vec3(\n impulse.x,\n sampleWave(state, impulse.x, impulse.z, state.time) * 0.24 + 0.06,\n impulse.z\n ),\n radius,\n opacity: clamp(impulse.life * 0.28, 0.08, 0.3),\n });\n });\n\n for (const ship of state.ships) {\n const speed = Math.hypot(ship.velocity.x, ship.velocity.z);\n if (speed <= 0.18) {\n continue;\n }\n\n const direction = normalizeVec3(vec3(ship.velocity.x, 0, ship.velocity.z));\n const behind = scaleVec3(direction, -1);\n const lateral = vec3(-direction.z, 0, direction.x);\n const points = [];\n for (let sampleIndex = 0; sampleIndex < 6; sampleIndex += 1) {\n const along = 1 + sampleIndex * 1.45;\n const lateralOffset =\n Math.sin(state.time * 1.2 + sampleIndex * 0.8 + readVisualNumber(ship.wanderPhase, 0)) * 0.12;\n const worldPoint = addVec3(\n ship.position,\n addVec3(scaleVec3(behind, along), scaleVec3(lateral, lateralOffset))\n );\n points.push(\n Object.freeze({\n center: vec3(\n worldPoint.x,\n sampleWave(state, worldPoint.x, worldPoint.z, state.time) * 0.24 + 0.04,\n worldPoint.z\n ),\n width: 0.34 + sampleIndex * 0.13,\n })\n );\n }\n wakeTrails.push(\n Object.freeze({\n opacity: clamp(0.18 + speed * 0.09, 0.22, 0.46),\n points: Object.freeze(points),\n })\n );\n }\n\n return Object.freeze({\n wakeTrails: Object.freeze(wakeTrails),\n rippleRings: Object.freeze(rippleRings),\n });\n}\n\nfunction buildWaterBands(state, fluidDetail, visuals) {\n const fluidPlan = createFluidRepresentationPlan({\n fluidBodyId: \"harbor\",\n kind: state.focus === \"fluid\" ? \"ocean\" : fluidBodyKinds[0],\n profile: state.focus === \"fluid\" ? \"cinematic\" : fluidProfileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 40,\n midFieldMaxMeters: 150,\n farFieldMaxMeters: 600,\n });\n\n const bandMeshes = [];\n const bandExtents = Object.freeze([\n { band: \"near\", width: 20, depth: 18, step: 1, y: 0.2 },\n { band: \"mid\", width: 34, depth: 28, step: 2, y: 0.05 },\n { band: \"far\", width: 54, depth: 42, step: 3.5, y: -0.05 },\n { band: \"horizon\", width: 80, depth: 76, step: 7, y: -0.14 },\n ]);\n\n for (const bandSpec of bandExtents) {\n const representation =\n fluidPlan.representations.find((entry) => entry.band === bandSpec.band) ??\n fluidPlan.representations[0];\n const continuity = createFluidContinuityEnvelope({ fluidBodyId: \"harbor\" });\n const bandContinuity = resolveFluidBandContinuity(continuity, bandSpec.band);\n const bandResolution =\n bandSpec.band === \"near\"\n ? fluidDetail.nearResolution\n : bandSpec.band === \"mid\"\n ? fluidDetail.midResolution\n : bandSpec.band === \"far\"\n ? 5\n : 3;\n const cols = Math.max(4, bandResolution * 2);\n const rows = Math.max(4, bandResolution + 2);\n const positions = [];\n const indices = [];\n const originX = -bandSpec.width * 0.5;\n const originZ = -6;\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const u = column / (cols - 1);\n const v = row / (rows - 1);\n const x = originX + bandSpec.width * u;\n const z = originZ + bandSpec.depth * v;\n const y =\n bandSpec.y +\n sampleWave(state, x, z, state.time) *\n bandContinuity.amplitudeFloor *\n (bandSpec.band === \"near\" ? 0.9 : bandSpec.band === \"mid\" ? 0.55 : 0.3);\n positions.push(vec3(x, y, z));\n }\n }\n for (let row = 0; row < rows - 1; row += 1) {\n for (let column = 0; column < cols - 1; column += 1) {\n const a = row * cols + column;\n const b = a + 1;\n const c = a + cols + 1;\n const d = a + cols;\n indices.push(a, b, c, a, c, d);\n }\n }\n\n bandMeshes.push({\n band: bandSpec.band,\n representation,\n continuity: bandContinuity,\n rows,\n cols,\n positions,\n indices,\n color:\n bandSpec.band === \"near\"\n ? visuals.waterNear\n : bandSpec.band === \"mid\"\n ? {\n r: mix(visuals.waterNear.r, visuals.waterFar.r, 0.4),\n g: mix(visuals.waterNear.g, visuals.waterFar.g, 0.4),\n b: mix(visuals.waterNear.b, visuals.waterFar.b, 0.4),\n }\n : bandSpec.band === \"far\"\n ? visuals.waterFar\n : {\n r: mix(visuals.waterFar.r, 0.76, 0.2),\n g: mix(visuals.waterFar.g, 0.78, 0.2),\n b: mix(visuals.waterFar.b, 0.82, 0.2),\n },\n });\n }\n\n return { fluidPlan, bandMeshes };\n}\n\nfunction createSceneState(options) {\n const { governor, fluidDetail, clothDetail, lightingDetail } = createPerformanceGovernor();\n const physicsProfile = defaultPhysicsWorkerProfile;\n const physicsPlan = createPhysicsSimulationPlan(physicsProfile);\n const physicsManifest = getPhysicsWorkerManifest(physicsProfile);\n const debugSession = createGpuDebugSession({\n enabled: true,\n adapter: {\n label: \"3D showcase\",\n memoryCapacityHintBytes: 6 * 1024 * 1024 * 1024,\n coreCountHint: 12,\n },\n });\n debugSession.trackAllocation({\n id: \"showcase.color\",\n owner: \"renderer\",\n category: \"texture\",\n sizeBytes: 1280 * 720 * 4,\n label: \"Main color buffer\",\n });\n debugSession.trackAllocation({\n id: \"showcase.shadow-impression\",\n owner: \"lighting\",\n category: \"texture\",\n sizeBytes: 12 * 1024 * 1024,\n label: \"Shadow impression atlas\",\n });\n\n return {\n focus: options.focus,\n governor,\n fluidDetail,\n clothDetail,\n lightingDetail,\n debugSession,\n packageState: undefined,\n demoDescription: null,\n demoVisuals: null,\n time: 0,\n lastTimeMs: null,\n paused: false,\n stress: false,\n camera: {\n ...CAMERA_PRESETS[options.focus],\n target: vec3(...CAMERA_PRESETS[options.focus].target),\n },\n ships: [\n {\n id: \"northwind\",\n position: vec3(-5.2, 0, 7.2),\n velocity: vec3(2.35, 0, -1.08),\n rotationY: 0.58,\n angularVelocity: 0.09,\n tint: { r: 0.62, g: 0.39, b: 0.23 },\n massScale: 1.42,\n cruiseSpeed: 2.25,\n throttleResponse: 0.46,\n rudderResponse: 0.54,\n wanderPhase: 0.35,\n lanterns: SHIP_LANTERNS,\n lanternStrength: 1.06,\n collisionRadiusScale: 1.04,\n },\n {\n id: \"tidecaller\",\n position: vec3(4.8, 0, 4.4),\n velocity: vec3(-2.15, 0, 1.74),\n rotationY: -2.48,\n angularVelocity: -0.2,\n tint: { r: 0.48, g: 0.28, b: 0.19 },\n massScale: 0.84,\n cruiseSpeed: 2.68,\n throttleResponse: 0.7,\n rudderResponse: 0.78,\n wanderPhase: 1.6,\n lanterns: SHIP_LANTERNS,\n lanternStrength: 1.18,\n collisionRadiusScale: 0.94,\n },\n ],\n sprays: [],\n waveImpulses: [],\n frame: 0,\n contactCount: 0,\n collisionCount: 0,\n collisionFlash: 0,\n clothState: null,\n physics: {\n profile: physicsProfile,\n plan: physicsPlan,\n manifest: physicsManifest,\n snapshot: null,\n },\n shipModel: null,\n };\n}\n\nfunction setListContent(element, values) {\n element.innerHTML = values.map((value) => `<li>${value}</li>`).join(\"\");\n}\n\nfunction drawSkyAndShore(ctx, canvas, state, nearLighting, reflectionStrength, shadowStrength, visuals) {\n const sky = ctx.createLinearGradient(0, 0, 0, canvas.height * 0.5);\n sky.addColorStop(0, visuals.skyTop);\n sky.addColorStop(0.54, visuals.skyMid);\n sky.addColorStop(1, visuals.skyBottom);\n ctx.fillStyle = sky;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n for (let index = 0; index < 70; index += 1) {\n const x = pseudoRandom(index + 13) * canvas.width;\n const y = pseudoRandom(index * 7 + 5) * canvas.height * 0.42;\n const twinkle = 0.45 + Math.sin(state.time * 1.4 + index * 0.73) * 0.25;\n const radius = 0.6 + pseudoRandom(index * 11 + 2) * 1.9;\n ctx.fillStyle = visuals.starColor.replace(/[\\d.]+\\)$/u, `${clamp(twinkle, 0.16, 0.92)})`);\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n\n const horizonGlow = ctx.createLinearGradient(0, canvas.height * 0.22, 0, canvas.height * 0.62);\n horizonGlow.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n horizonGlow.addColorStop(1, visuals.duskGlow);\n ctx.fillStyle = horizonGlow;\n ctx.fillRect(0, canvas.height * 0.2, canvas.width, canvas.height * 0.45);\n\n const shoreline = ctx.createLinearGradient(0, canvas.height * 0.45, 0, canvas.height);\n shoreline.addColorStop(0, visuals.seaTop);\n shoreline.addColorStop(0.52, visuals.seaMid);\n shoreline.addColorStop(1, visuals.seaBottom);\n ctx.fillStyle = shoreline;\n ctx.fillRect(0, canvas.height * 0.45, canvas.width, canvas.height * 0.55);\n\n const moonX = canvas.width * 0.76 + Math.sin(state.time * 0.045) * 18;\n const moonY = canvas.height * 0.17 + Math.cos(state.time * 0.05) * 10;\n const moon = ctx.createRadialGradient(moonX, moonY, 14, moonX, moonY, 126);\n moon.addColorStop(0, visuals.moonCore);\n moon.addColorStop(0.46, visuals.moonHalo);\n moon.addColorStop(1, \"rgba(167, 191, 255, 0)\");\n ctx.fillStyle = moon;\n ctx.beginPath();\n ctx.arc(moonX, moonY, 94, 0, Math.PI * 2);\n ctx.fill();\n\n const moonCore = ctx.createRadialGradient(moonX, moonY, 4, moonX, moonY, 28);\n moonCore.addColorStop(0, \"rgba(255, 255, 255, 0.98)\");\n moonCore.addColorStop(1, visuals.moonCore);\n ctx.fillStyle = moonCore;\n ctx.beginPath();\n ctx.arc(moonX, moonY, 24, 0, Math.PI * 2);\n ctx.fill();\n\n const track = ctx.createLinearGradient(moonX, canvas.height * 0.44, moonX, canvas.height * 0.98);\n track.addColorStop(0, visuals.moonReflection.replace(/[\\d.]+\\)$/u, `${0.08 + reflectionStrength * 0.12})`));\n track.addColorStop(0.42, visuals.moonReflection.replace(/[\\d.]+\\)$/u, `${0.04 + reflectionStrength * 0.18})`));\n track.addColorStop(1, \"rgba(192, 214, 255, 0)\");\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = track;\n ctx.beginPath();\n ctx.ellipse(moonX, canvas.height * 0.75, 38 + shadowStrength * 42, canvas.height * 0.24, 0, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n const mist = ctx.createLinearGradient(0, canvas.height * 0.5, 0, canvas.height);\n mist.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n mist.addColorStop(1, visuals.ambientMist);\n ctx.fillStyle = mist;\n ctx.fillRect(0, canvas.height * 0.45, canvas.width, canvas.height * 0.55);\n\n if (state.collisionFlash > 0.01) {\n ctx.fillStyle = visuals.collisionFlash.replace(\n /[\\d.]+\\)$/u,\n `${clamp(state.collisionFlash * 0.22, 0, 0.26)})`\n );\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n}\n\nfunction drawTriangles(ctx, triangles, lightDir, reflectionStrength, camera, shadowStrength) {\n triangles.sort((left, right) => right.depth - left.depth);\n for (const triangle of triangles) {\n const surfaceNormal = normalizeVec3(triangle.normal);\n const shaded = shadeColor(\n triangle.baseColor,\n surfaceNormal,\n lightDir,\n clamp((triangle.worldCenter.y + 3) / 10, 0, 1),\n triangle.accent\n );\n const reflection = triangle.worldCenter.y < 0.8 ? reflectionStrength : 0;\n const viewDir = normalizeVec3(subVec3(camera.eye, triangle.worldCenter));\n const reflectedLight = reflectVec3(scaleVec3(lightDir, -1), surfaceNormal);\n const gloss = triangle.worldCenter.y < 0.9 ? 1 : triangle.accent > 0.05 ? 0.55 : 0.3;\n const specular = Math.pow(clamp(dotVec3(reflectedLight, viewDir), 0, 1), triangle.worldCenter.y < 0.9 ? 18 : 12) * gloss;\n const occlusion = triangle.worldCenter.y < 0.9 ? shadowStrength * 0.035 : 0;\n const fill = colorToRgba(\n {\n r: clamp(shaded.r + reflection * 0.08 + specular * 0.14 - occlusion, 0, 1),\n g: clamp(shaded.g + reflection * 0.08 + specular * 0.15 - occlusion, 0, 1),\n b: clamp(shaded.b + reflection * 0.16 + specular * 0.2 - occlusion * 0.5, 0, 1),\n },\n 0.98\n );\n ctx.fillStyle = fill;\n ctx.beginPath();\n ctx.moveTo(triangle.points[0].x, triangle.points[0].y);\n ctx.lineTo(triangle.points[1].x, triangle.points[1].y);\n ctx.lineTo(triangle.points[2].x, triangle.points[2].y);\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction renderProjectedShadow(ctx, worldPoints, camera, viewport, lightDir, options = {}) {\n const planeY = options.planeY ?? 0;\n const projected = worldPoints\n .map((point) => projectShadowPoint(point, lightDir, planeY))\n .filter(Boolean)\n .map((point) => projectPoint(point, camera, viewport))\n .filter(Boolean);\n\n if (projected.length < 3) {\n return;\n }\n\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = options.color ?? `rgba(12, 24, 36, ${clamp(options.alpha ?? 0.16, 0, 0.5)})`;\n ctx.shadowColor = options.color ?? \"rgba(12, 24, 36, 0.22)\";\n ctx.shadowBlur = options.blur ?? 18;\n ctx.beginPath();\n ctx.moveTo(projected[0].x, projected[0].y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].x, projected[index].y);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nfunction pushHarborGeometry(camera, viewport, triangles, visuals) {\n const harborObjects = [\n {\n position: vec3(-8.2, 1.1, -0.9),\n rotationY: -0.16,\n scale: { x: 5.4, y: 2.4, z: 4.2 },\n color: visuals.harborWall,\n accent: 0.06,\n },\n {\n position: vec3(-5.7, 0.45, 1.4),\n rotationY: -0.08,\n scale: { x: 6.8, y: 0.3, z: 2.1 },\n color: visuals.harborDeck,\n accent: 0.04,\n },\n {\n position: vec3(-10.4, 0.28, 0.8),\n rotationY: 0.22,\n scale: { x: 1.2, y: 0.9, z: 1.2 },\n color: visuals.harborTower,\n accent: 0.02,\n },\n ];\n\n for (const object of harborObjects) {\n buildTrianglesFromMesh(\n UNIT_BOX_MESH,\n {\n position: object.position,\n rotationY: object.rotationY,\n scale: object.scale,\n },\n object.color,\n camera,\n viewport,\n triangles,\n object.accent\n );\n }\n}\n\nfunction renderShipRigging(ctx, ship, camera, viewport) {\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE };\n const mastBase = transformPoint(vec3(0, 0.38, -0.4), transform);\n const mastTop = transformPoint(vec3(0, 3.8, -0.2), transform);\n const aftBase = transformPoint(vec3(-0.25, 0.32, -1.9), transform);\n const aftTop = transformPoint(vec3(-0.15, 2.7, -1.75), transform);\n const sailA = transformPoint(vec3(0.08, 3.2, -0.2), transform);\n const sailB = transformPoint(vec3(0.12, 1.2, -0.5), transform);\n const sailC = transformPoint(vec3(2.25, 2.25, 0.15), transform);\n const projected = [mastBase, mastTop, aftBase, aftTop, sailA, sailB, sailC].map((point) =>\n projectPoint(point, camera, viewport)\n );\n if (projected.some((value) => value === null)) {\n return;\n }\n\n ctx.strokeStyle = \"rgba(73, 54, 45, 0.94)\";\n ctx.lineWidth = 3.5;\n ctx.beginPath();\n ctx.moveTo(projected[0].x, projected[0].y);\n ctx.lineTo(projected[1].x, projected[1].y);\n ctx.moveTo(projected[2].x, projected[2].y);\n ctx.lineTo(projected[3].x, projected[3].y);\n ctx.stroke();\n\n ctx.fillStyle = \"rgba(238, 232, 214, 0.88)\";\n ctx.beginPath();\n ctx.moveTo(projected[4].x, projected[4].y);\n ctx.lineTo(projected[5].x, projected[5].y);\n ctx.lineTo(projected[6].x, projected[6].y);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction renderClothAccent(ctx, cloth, camera, viewport) {\n const projected = cloth.positions.map((point) => projectPoint(point, camera, viewport));\n ctx.strokeStyle = \"rgba(255, 241, 226, 0.92)\";\n ctx.lineWidth = 1.7;\n\n for (\n let row = 0;\n row < cloth.grid.rows;\n row += Math.max(1, Math.floor(cloth.grid.rows / 5))\n ) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < cloth.grid.cols; column += 1) {\n const point = projected[row * cloth.grid.cols + column];\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n\n const borderIndices = [\n 0,\n cloth.grid.cols - 1,\n cloth.grid.rows * cloth.grid.cols - 1,\n (cloth.grid.rows - 1) * cloth.grid.cols,\n ];\n ctx.fillStyle = colorToRgba(cloth.color, 0.95);\n for (const index of borderIndices) {\n const point = projected[index];\n if (!point) {\n continue;\n }\n ctx.beginPath();\n ctx.arc(point.x, point.y, 2.8, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderWaterHighlights(ctx, waterBands, camera, viewport) {\n for (const band of waterBands) {\n if (band.band === \"horizon\") {\n continue;\n }\n const interval = band.band === \"near\" ? 2 : 3;\n const alpha = band.band === \"near\" ? 0.22 : 0.14;\n ctx.strokeStyle = `rgba(232, 247, 255, ${alpha})`;\n ctx.lineWidth = band.band === \"near\" ? 1.3 : 0.9;\n for (let row = interval; row < band.rows - 1; row += interval) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < band.cols; column += 1) {\n const point = projectPoint(\n band.positions[row * band.cols + column],\n camera,\n viewport\n );\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n }\n}\n\nfunction readPhysicsNumber(physics, key, fallback) {\n const value = physics?.[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction getShipMass(ship, shipModel) {\n const baseMass = readPhysicsNumber(shipModel.physics, \"mass\", 3200);\n return baseMass * readVisualNumber(ship.massScale, 1);\n}\n\nfunction getShipHalfExtents(ship, shipModel) {\n const physicsHalfExtents = Array.isArray(shipModel.physics.halfExtents)\n ? shipModel.physics.halfExtents\n : [1.35, 0.95, 3.9];\n const scale = SHIP_SCALE * readVisualNumber(ship.collisionRadiusScale, 1);\n return {\n x: physicsHalfExtents[0] * scale,\n y: physicsHalfExtents[1] * scale,\n z: physicsHalfExtents[2] * scale,\n };\n}\n\nfunction getShipCollisionRadius(ship, shipModel) {\n const halfExtents = getShipHalfExtents(ship, shipModel);\n return Math.max(halfExtents.x * 1.08, halfExtents.z * 0.62);\n}\n\nfunction getShipInverseMass(ship, shipModel) {\n return 1 / Math.max(1, getShipMass(ship, shipModel));\n}\n\nfunction getShipInverseInertia(ship, shipModel) {\n const radius = getShipCollisionRadius(ship, shipModel);\n const inertia = getShipMass(ship, shipModel) * radius * radius * 0.72;\n return 1 / Math.max(1, inertia);\n}\n\nfunction spawnSpray(state, point, intensity) {\n const count = state.fluidDetail.getSnapshot().currentLevel.config.splashCount;\n for (let index = 0; index < count; index += 1) {\n const angle = (index / count) * Math.PI * 2;\n const speed = 0.9 + Math.random() * intensity * 0.45;\n state.sprays.push({\n position: vec3(point.x, point.y, point.z),\n velocity: vec3(Math.cos(angle) * speed * 0.35, 1.1 + Math.random() * 0.8, Math.sin(angle) * speed * 0.25),\n life: 1.2 + Math.random() * 0.4,\n });\n }\n}\n\nfunction resolveShipRoute(ship, state, radius) {\n if (typeof ship.routeDirection !== \"number\") {\n ship.routeDirection = ship.velocity.x >= 0 ? 1 : -1;\n }\n\n if (ship.position.x > HARBOR_BOUNDS.maxX - radius * 1.1) {\n ship.routeDirection = -1;\n } else if (ship.position.x < HARBOR_BOUNDS.minX + radius * 1.1) {\n ship.routeDirection = 1;\n }\n\n const wander = Math.sin(state.time * 0.22 + readVisualNumber(ship.wanderPhase, 0));\n const crossCurrent = Math.cos(state.time * 0.31 + readVisualNumber(ship.wanderPhase, 0));\n const laneCenter =\n ship.id === \"northwind\"\n ? 10.2 + wander * 2.1 + crossCurrent * 0.6\n : 7 + wander * 3.3 - crossCurrent * 1.1;\n const targetX =\n ship.routeDirection > 0\n ? HARBOR_BOUNDS.maxX - radius * 1.7\n : HARBOR_BOUNDS.minX + radius * 1.7;\n return vec3(targetX, 0, clamp(laneCenter, HARBOR_BOUNDS.minZ + 1.8, HARBOR_BOUNDS.maxZ - 1.8));\n}\n\nfunction updateShipMotion(state, ship, dt, shipModel) {\n const physics = shipModel.physics;\n const massScale = Math.max(0.55, readVisualNumber(ship.massScale, 1));\n const radius = getShipCollisionRadius(ship, shipModel);\n const waterline = readPhysicsNumber(physics, \"waterline\", 0.42);\n const linearDamping = readPhysicsNumber(physics, \"linearDamping\", 0.04);\n const angularDamping = readPhysicsNumber(physics, \"angularDamping\", 0.08);\n const throttleResponse = readVisualNumber(ship.throttleResponse, 0.58);\n const rudderResponse = readVisualNumber(ship.rudderResponse, 0.62);\n const cruiseSpeed = readVisualNumber(ship.cruiseSpeed, 2.4);\n\n ship.collisionCooldown = Math.max(0, readVisualNumber(ship.collisionCooldown, 0) - dt);\n\n const forward = directionFromYaw(ship.rotationY);\n const lateral = perpendicularOnWater(forward);\n const routeTarget = resolveShipRoute(ship, state, radius);\n const desiredHeading = Math.atan2(routeTarget.x - ship.position.x, routeTarget.z - ship.position.z);\n const headingError = Math.atan2(\n Math.sin(desiredHeading - ship.rotationY),\n Math.cos(desiredHeading - ship.rotationY)\n );\n ship.angularVelocity +=\n headingError * rudderResponse * dt * (1.18 / Math.sqrt(massScale)) +\n Math.sin(state.time * 0.9 + readVisualNumber(ship.wanderPhase, 0)) * dt * 0.04;\n\n const waveDirection = resolveWaveDirection(state);\n const forwardSpeed = dotVec3(ship.velocity, forward);\n const lateralSpeed = dotVec3(ship.velocity, lateral);\n const thrust = (cruiseSpeed - forwardSpeed) * throttleResponse;\n const currentDrift = sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.016;\n const acceleration = addVec3(\n scaleVec3(forward, thrust),\n addVec3(\n scaleVec3(lateral, -lateralSpeed * (1.28 + rudderResponse * 0.4)),\n scaleVec3(waveDirection, currentDrift / Math.sqrt(massScale))\n )\n );\n\n ship.velocity = addVec3(ship.velocity, scaleVec3(acceleration, dt));\n ship.velocity = scaleVec3(\n ship.velocity,\n Math.max(0, 1 - (linearDamping / Math.pow(massScale, 0.22)) * dt)\n );\n ship.angularVelocity *= Math.max(\n 0,\n 1 - (angularDamping / Math.pow(massScale, 0.15)) * dt\n );\n ship.rotationY += ship.angularVelocity * dt;\n ship.position = addVec3(ship.position, scaleVec3(ship.velocity, dt));\n ship.position.y =\n sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.24 + waterline;\n}\n\nfunction resolveBoundaryCollision(ship, state, shipModel) {\n const restitution = readPhysicsNumber(shipModel.physics, \"restitution\", 0.22) * 0.56;\n const radius = getShipCollisionRadius(ship, shipModel);\n const boundaries = [\n { axis: \"x\", min: HARBOR_BOUNDS.minX + radius, max: HARBOR_BOUNDS.maxX - radius, normalMin: vec3(1, 0, 0), normalMax: vec3(-1, 0, 0) },\n { axis: \"z\", min: HARBOR_BOUNDS.minZ + radius, max: HARBOR_BOUNDS.maxZ - radius, normalMin: vec3(0, 0, 1), normalMax: vec3(0, 0, -1) },\n ];\n\n for (const boundary of boundaries) {\n if (ship.position[boundary.axis] < boundary.min) {\n ship.position[boundary.axis] = boundary.min;\n const normal = boundary.normalMin;\n const speedIntoWall = dotVec3(ship.velocity, normal);\n if (speedIntoWall < 0) {\n ship.velocity = subVec3(\n ship.velocity,\n scaleVec3(normal, (1 + restitution) * speedIntoWall)\n );\n const tangent = vec3(-normal.z, 0, normal.x);\n const tangentSpeed = dotVec3(ship.velocity, tangent);\n ship.velocity = subVec3(ship.velocity, scaleVec3(tangent, tangentSpeed * 0.12));\n ship.angularVelocity += tangentSpeed * 0.004;\n }\n } else if (ship.position[boundary.axis] > boundary.max) {\n ship.position[boundary.axis] = boundary.max;\n const normal = boundary.normalMax;\n const speedIntoWall = dotVec3(ship.velocity, normal);\n if (speedIntoWall < 0) {\n ship.velocity = subVec3(\n ship.velocity,\n scaleVec3(normal, (1 + restitution) * speedIntoWall)\n );\n const tangent = vec3(-normal.z, 0, normal.x);\n const tangentSpeed = dotVec3(ship.velocity, tangent);\n ship.velocity = subVec3(ship.velocity, scaleVec3(tangent, tangentSpeed * 0.12));\n ship.angularVelocity += tangentSpeed * 0.004;\n }\n }\n }\n}\n\nfunction resolveShipCollision(state, a, b, shipModel) {\n const delta = subVec3(b.position, a.position);\n const radiusA = getShipCollisionRadius(a, shipModel);\n const radiusB = getShipCollisionRadius(b, shipModel);\n const distance = Math.hypot(delta.x, delta.z);\n const minDistance = radiusA + radiusB;\n if (distance >= minDistance) {\n return false;\n }\n\n const normal =\n distance > 0.0001\n ? normalizeVec3(vec3(delta.x / distance, 0, delta.z / distance))\n : normalizeVec3(vec3(Math.cos(state.time * 5.2), 0, Math.sin(state.time * 4.8)));\n const tangent = vec3(-normal.z, 0, normal.x);\n const penetration = minDistance - distance;\n const invMassA = getShipInverseMass(a, shipModel);\n const invMassB = getShipInverseMass(b, shipModel);\n const invMassSum = invMassA + invMassB;\n const correction = scaleVec3(normal, (penetration / Math.max(0.0001, invMassSum)) * 0.72);\n a.position = subVec3(a.position, scaleVec3(correction, invMassA));\n b.position = addVec3(b.position, scaleVec3(correction, invMassB));\n\n const relativeVelocity = subVec3(b.velocity, a.velocity);\n const velocityAlongNormal = dotVec3(relativeVelocity, normal);\n const restitution = readPhysicsNumber(shipModel.physics, \"restitution\", 0.22) * 0.88;\n if (velocityAlongNormal < 0) {\n const impulseMagnitude =\n (-(1 + restitution) * velocityAlongNormal) / Math.max(0.0001, invMassSum);\n const impulse = scaleVec3(normal, impulseMagnitude);\n a.velocity = subVec3(a.velocity, scaleVec3(impulse, invMassA));\n b.velocity = addVec3(b.velocity, scaleVec3(impulse, invMassB));\n\n const tangentSpeed = dotVec3(relativeVelocity, tangent);\n const frictionMagnitude = clamp(\n (-tangentSpeed / Math.max(0.0001, invMassSum)),\n -impulseMagnitude * 0.16,\n impulseMagnitude * 0.16\n );\n const frictionImpulse = scaleVec3(tangent, frictionMagnitude);\n a.velocity = subVec3(a.velocity, scaleVec3(frictionImpulse, invMassA));\n b.velocity = addVec3(b.velocity, scaleVec3(frictionImpulse, invMassB));\n\n a.angularVelocity -=\n tangentSpeed * radiusA * getShipInverseInertia(a, shipModel) * 0.2 +\n impulseMagnitude * 0.00024;\n b.angularVelocity +=\n tangentSpeed * radiusB * getShipInverseInertia(b, shipModel) * 0.2 +\n impulseMagnitude * 0.00024;\n\n const impactSpeed = Math.abs(velocityAlongNormal);\n if (\n impactSpeed > 0.18 &&\n Math.max(readVisualNumber(a.collisionCooldown, 0), readVisualNumber(b.collisionCooldown, 0)) <= 0\n ) {\n const contactPoint = vec3(\n (a.position.x + b.position.x) * 0.5,\n (a.position.y + b.position.y) * 0.5 + 0.14,\n (a.position.z + b.position.z) * 0.5\n );\n spawnSpray(state, contactPoint, impactSpeed * 2.4 + penetration * 8);\n state.waveImpulses.push({\n x: contactPoint.x,\n z: contactPoint.z,\n strength: clamp(0.24 + impactSpeed * 0.46 + penetration * 0.9, 0.2, 1.7),\n radius: 0.9 + penetration * 1.4,\n life: 1,\n });\n state.collisionCount += 1;\n state.collisionFlash = Math.max(\n state.collisionFlash,\n clamp(impactSpeed * 0.55 + penetration * 1.8, 0.16, 1)\n );\n a.collisionCooldown = 0.2;\n b.collisionCooldown = 0.2;\n }\n }\n\n state.contactCount += 1;\n return true;\n}\n\nfunction updateShips(state, dt, shipModel) {\n let collided = false;\n state.contactCount = 0;\n\n for (const ship of state.ships) {\n updateShipMotion(state, ship, dt, shipModel);\n resolveBoundaryCollision(ship, state, shipModel);\n }\n\n for (let index = 0; index < state.ships.length; index += 1) {\n for (let otherIndex = index + 1; otherIndex < state.ships.length; otherIndex += 1) {\n collided =\n resolveShipCollision(state, state.ships[index], state.ships[otherIndex], shipModel) ||\n collided;\n }\n }\n\n state.collisionFlash = collided\n ? Math.max(0.12, state.collisionFlash)\n : Math.max(0, state.collisionFlash - dt * 1.3);\n}\n\nfunction updateWaveImpulses(state, dt) {\n state.waveImpulses = state.waveImpulses\n .map((impulse) => ({\n ...impulse,\n life: impulse.life - dt * 0.55,\n }))\n .filter((impulse) => impulse.life > 0);\n}\n\nfunction updateSpray(state, dt) {\n state.sprays = state.sprays\n .map((particle) => {\n const nextVelocity = vec3(particle.velocity.x, particle.velocity.y - 4.2 * dt, particle.velocity.z);\n const nextPosition = addVec3(particle.position, scaleVec3(nextVelocity, dt));\n return {\n position: nextPosition,\n velocity: nextVelocity,\n life: particle.life - dt,\n };\n })\n .filter((particle) => particle.life > 0 && particle.position.y > -0.2);\n}\n\nfunction recordTelemetry(state, frameTimeMs) {\n const frameId = `showcase-${state.frame}`;\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: state.lightingDetail.getSnapshot(),\n };\n const synthetic = frameTimeMs + state.sprays.length * 0.1 + (state.stress ? 6.5 : 0);\n const decision = state.governor.recordFrame({ frameTimeMs: synthetic });\n const queueDepth = Math.min(32, Math.round(6 + state.sprays.length / 2 + (state.stress ? 10 : 0)));\n const readyLaneDepth = Math.min(\n 16,\n 4 + Math.round(Math.max(0, Math.sin(state.time * 1.7 + 0.8)) * 9)\n );\n state.debugSession.recordQueue({\n owner: \"renderer\",\n queueClass: \"render\",\n depth: queueDepth,\n capacity: 32,\n frameId,\n });\n state.debugSession.recordReadyLane({\n owner: \"lighting\",\n queueClass: \"lighting\",\n laneId: \"critical\",\n priority: 920,\n depth: readyLaneDepth,\n capacity: 16,\n frameId,\n });\n state.debugSession.recordDispatch({\n owner: \"lighting\",\n queueClass: \"lighting\",\n jobType: \"lighting.integration\",\n frameId,\n durationMs: quality.lighting.currentLevel.estimatedCostMs ?? 1.2,\n workgroups: { x: quality.fluid.currentLevel.config.nearResolution, y: 1, z: 1 },\n workgroupSize: { x: 8, y: 8, z: 1 },\n });\n state.debugSession.recordDependencyUnlock({\n owner: \"scene\",\n queueClass: \"render\",\n sourceJobType: \"physics.resolve\",\n unlockedJobType: \"lighting.integration\",\n priority: 920,\n unlockCount: 2 + Math.round(Math.max(0, Math.sin(state.time * 1.1)) * 4),\n frameId,\n });\n state.debugSession.recordPipelinePhase({\n owner: \"scene\",\n pipeline: \"scene-preparation\",\n stage: \"stable-visual-snapshot\",\n frameId,\n durationMs: synthetic * 0.38,\n snapshotAgeMs: Math.max(0, synthetic - 8),\n });\n state.debugSession.recordFrame({\n frameId,\n frameTimeMs: synthetic,\n targetFrameTimeMs: 16.67,\n gpuBusyMs: synthetic * 0.56,\n dropped: synthetic > 18,\n });\n return decision;\n}\n\nfunction renderSprays(ctx, sprays, camera, viewport) {\n for (const spray of sprays) {\n const projected = projectPoint(spray.position, camera, viewport);\n if (!projected) {\n continue;\n }\n const radius = clamp((1 / projected.depth) * 260, 1.5, 7.5);\n ctx.fillStyle = `rgba(225, 243, 250, ${clamp(spray.life / 1.6, 0, 0.9)})`;\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderFlagPole(ctx, camera, viewport) {\n const base = projectPoint(vec3(-3.5, 0.7, 2.4), camera, viewport);\n const top = projectPoint(vec3(-3.5, 6.3, 2.4), camera, viewport);\n if (!base || !top) {\n return;\n }\n ctx.strokeStyle = \"rgba(77, 52, 41, 0.95)\";\n ctx.lineWidth = 6;\n ctx.beginPath();\n ctx.moveTo(base.x, base.y);\n ctx.lineTo(top.x, top.y);\n ctx.stroke();\n}\n\nfunction renderShipShadow(ctx, shipModel, ship, state, camera, viewport, lightDir, shadowStrength) {\n const bounds = shipModel.bounds;\n const keelY = (shipModel.physics.waterline ?? 0.42) - 0.28;\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE };\n const hullCorners = [\n vec3(bounds.min[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.max[2]),\n vec3(bounds.min[0], keelY, bounds.max[2]),\n ].map((point) => transformPoint(point, transform));\n\n renderProjectedShadow(ctx, hullCorners, camera, viewport, lightDir, {\n planeY: sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.24 - 0.03,\n alpha: 0.08 + shadowStrength * 0.2,\n blur: 14 + shadowStrength * 24,\n });\n}\n\nfunction renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength) {\n const clothPoints = [\n cloth.positions[0],\n cloth.positions[cloth.grid.cols - 1],\n cloth.positions[cloth.positions.length - 1],\n cloth.positions[cloth.positions.length - cloth.grid.cols],\n ];\n\n renderProjectedShadow(ctx, clothPoints, camera, viewport, lightDir, {\n planeY: 0.56,\n alpha: 0.05 + shadowStrength * 0.16,\n blur: 12 + shadowStrength * 20,\n });\n}\n\nfunction collectSceneLightSources(state, visuals) {\n const directLights = [];\n const reflectionLights = [];\n const pushLight = (point, glowScale, reflectionStrength, coreColor, glowColor) => {\n directLights.push(\n Object.freeze({\n pass: \"direct-glow\",\n point,\n coreColor,\n glowColor,\n glowScale,\n })\n );\n if (reflectionStrength > 0) {\n reflectionLights.push(\n Object.freeze({\n pass: \"water-reflection\",\n point,\n coreColor,\n glowColor,\n glowScale,\n reflectionStrength,\n })\n );\n }\n };\n\n for (const torch of HARBOR_TORCHES) {\n pushLight(\n vec3(torch.x, torch.y, torch.z),\n torch.glow,\n visuals.lanternReflectionStrength * 0.55,\n visuals.torchCore,\n visuals.torchGlow\n );\n }\n\n for (const ship of state.ships) {\n const lanterns = Array.isArray(ship.lanterns) ? ship.lanterns : SHIP_LANTERNS;\n const strength = readVisualNumber(ship.lanternStrength, 1);\n for (const lantern of lanterns) {\n const point = transformPoint(\n vec3(lantern.x, lantern.y, lantern.z),\n { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE }\n );\n pushLight(\n point,\n lantern.glow * strength,\n visuals.lanternReflectionStrength,\n visuals.lanternCore,\n visuals.lanternGlow\n );\n }\n }\n\n return Object.freeze({\n directLights: Object.freeze(directLights),\n reflectionLights: Object.freeze(reflectionLights),\n });\n}\n\nfunction renderDirectLightGlow(ctx, source, camera, viewport) {\n const projected = projectPoint(source.point, camera, viewport);\n if (!projected) {\n return;\n }\n\n const radius = clamp((1 / projected.depth) * 420 * source.glowScale, 4, 34);\n const halo = ctx.createRadialGradient(projected.x, projected.y, radius * 0.12, projected.x, projected.y, radius);\n halo.addColorStop(0, colorToRgba(source.coreColor, 0.98));\n halo.addColorStop(0.5, colorToRgba(source.glowColor, 0.42));\n halo.addColorStop(1, colorToRgba(source.glowColor, 0));\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = halo;\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, radius, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n ctx.fillStyle = colorToRgba(source.coreColor, 0.98);\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, Math.max(1.2, radius * 0.16), 0, Math.PI * 2);\n ctx.fill();\n}\n\nfunction renderWaterLightReflection(ctx, source, state, camera, viewport) {\n const projected = projectPoint(source.point, camera, viewport);\n if (!projected) {\n return;\n }\n\n const radius = clamp((1 / projected.depth) * 420 * source.glowScale, 4, 34);\n const waterline = sampleWave(state, source.point.x, source.point.z, state.time) * 0.22;\n const reflectedPoint = vec3(\n source.point.x,\n waterline - (source.point.y - waterline) * 0.58,\n source.point.z + 0.08\n );\n const reflected = projectPoint(reflectedPoint, camera, viewport);\n if (!reflected) {\n return;\n }\n\n const reflectionRadius = radius * 0.72;\n const glow = ctx.createRadialGradient(\n reflected.x,\n reflected.y,\n reflectionRadius * 0.1,\n reflected.x,\n reflected.y,\n reflectionRadius\n );\n glow.addColorStop(0, colorToRgba(source.coreColor, source.reflectionStrength * 0.34));\n glow.addColorStop(1, colorToRgba(source.glowColor, 0));\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.ellipse(\n reflected.x,\n reflected.y,\n reflectionRadius * 0.34,\n reflectionRadius,\n 0,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n ctx.restore();\n}\n\nfunction renderWaterMotionEffects(ctx, effects, camera, viewport) {\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n\n for (const wake of effects.wakeTrails) {\n const projected = wake.points\n .map((point) => ({\n projected: projectPoint(point.center, camera, viewport),\n width: point.width,\n }))\n .filter((entry) => entry.projected);\n if (projected.length < 2) {\n continue;\n }\n\n const averageDepth =\n projected.reduce((total, entry) => total + entry.projected.depth, 0) / projected.length;\n const averageWidth =\n projected.reduce((total, entry) => total + entry.width, 0) / projected.length;\n const baseWidth = clamp((averageWidth / Math.max(0.25, averageDepth)) * 180, 1.6, 5.4);\n ctx.strokeStyle = `rgba(146, 194, 236, ${wake.opacity * 0.52})`;\n ctx.lineWidth = baseWidth * 1.9;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n ctx.moveTo(projected[0].projected.x, projected[0].projected.y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].projected.x, projected[index].projected.y);\n }\n ctx.stroke();\n\n ctx.strokeStyle = `rgba(234, 247, 255, ${wake.opacity})`;\n ctx.lineWidth = baseWidth;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n ctx.moveTo(projected[0].projected.x, projected[0].projected.y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].projected.x, projected[index].projected.y);\n }\n ctx.stroke();\n\n for (const entry of projected.slice(1, 5)) {\n ctx.fillStyle = `rgba(239, 248, 255, ${wake.opacity * 0.76})`;\n ctx.beginPath();\n ctx.ellipse(\n entry.projected.x,\n entry.projected.y,\n baseWidth * 0.72,\n baseWidth * 0.44,\n 0,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n }\n }\n\n for (const ring of effects.rippleRings) {\n const center = projectPoint(ring.center, camera, viewport);\n const xAxis = projectPoint(addVec3(ring.center, vec3(ring.radius, 0, 0)), camera, viewport);\n const zAxis = projectPoint(addVec3(ring.center, vec3(0, 0, ring.radius)), camera, viewport);\n if (!center || !xAxis || !zAxis) {\n continue;\n }\n\n const radiusX = Math.hypot(xAxis.x - center.x, xAxis.y - center.y);\n const radiusY = Math.hypot(zAxis.x - center.x, zAxis.y - center.y);\n ctx.strokeStyle = `rgba(216, 235, 255, ${ring.opacity})`;\n ctx.lineWidth = clamp((radiusX + radiusY) * 0.02, 1, 3.1);\n ctx.beginPath();\n ctx.ellipse(center.x, center.y, radiusX, radiusY, 0, 0, Math.PI * 2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\nfunction renderScene(ctx, canvas, state, shipModel, dom) {\n const viewport = { width: canvas.width, height: canvas.height };\n const camera = buildCamera(state, canvas);\n state.camera.eye = camera.eye;\n const lightingPlan = createLightingBandPlan({\n profile: state.focus === \"lighting\" ? defaultLightingProfile : getLightingProfile(defaultLightingProfile).name,\n importance: state.focus === \"lighting\" ? \"critical\" : \"high\",\n });\n const nearLighting = lightingPlan.bands.find((entry) => entry.band === \"near\") ?? lightingPlan.bands[0];\n const lightDir = normalizeVec3(vec3(-0.22, 0.94, -0.31));\n const lightingSnapshot = state.lightingDetail.getSnapshot();\n const visuals = resolveVisualConfig(\n nearLighting,\n lightingSnapshot,\n state.demoDescription?.visuals\n );\n state.demoVisuals = visuals;\n const reflectionStrength = visuals.reflectionStrength;\n const shadowStrength = visuals.shadowAccent;\n drawSkyAndShore(\n ctx,\n canvas,\n state,\n nearLighting,\n reflectionStrength,\n shadowStrength,\n visuals\n );\n\n const waterTriangles = [];\n const sceneTriangles = [];\n const water = buildWaterBands(\n state,\n state.fluidDetail.getSnapshot().currentLevel.config,\n visuals\n );\n for (const bandMesh of water.bandMeshes) {\n const bandAccent = bandMesh.band === \"near\" ? 0.06 : bandMesh.band === \"mid\" ? 0.04 : 0;\n for (let index = 0; index < bandMesh.indices.length; index += 3) {\n const a = bandMesh.positions[bandMesh.indices[index]];\n const b = bandMesh.positions[bandMesh.indices[index + 1]];\n const c = bandMesh.positions[bandMesh.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n waterTriangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: bandMesh.color,\n accent: bandAccent,\n });\n }\n }\n\n const waterMotionEffects = buildWaterMotionEffects(state);\n const lightSources = collectSceneLightSources(state, visuals);\n\n pushHarborGeometry(camera, viewport, sceneTriangles, visuals);\n const cloth = buildClothSurface(\n state,\n state,\n state.clothDetail.getSnapshot().currentLevel.config,\n visuals\n );\n for (let index = 0; index < cloth.indices.length; index += 3) {\n const a = cloth.positions[cloth.indices[index]];\n const b = cloth.positions[cloth.indices[index + 1]];\n const c = cloth.positions[cloth.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n sceneTriangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: cloth.color,\n accent: cloth.band === \"near\" ? 0.1 : 0.04,\n });\n }\n\n for (const ship of state.ships) {\n buildTrianglesFromMesh(\n shipModel,\n { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE },\n ship.tint,\n camera,\n viewport,\n sceneTriangles,\n nearLighting.rtParticipation.directShadows === \"premium\" ? 0.08 : 0.02\n );\n }\n\n drawTriangles(ctx, waterTriangles, lightDir, reflectionStrength, camera, shadowStrength);\n for (const ship of state.ships) {\n renderShipShadow(ctx, shipModel, ship, state, camera, viewport, lightDir, shadowStrength);\n }\n renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength);\n for (const source of lightSources.reflectionLights) {\n renderWaterLightReflection(ctx, source, state, camera, viewport);\n }\n renderWaterMotionEffects(ctx, waterMotionEffects, camera, viewport);\n renderWaterHighlights(ctx, water.bandMeshes, camera, viewport);\n drawTriangles(ctx, sceneTriangles, lightDir, reflectionStrength, camera, shadowStrength);\n renderFlagPole(ctx, camera, viewport);\n renderClothAccent(ctx, cloth, camera, viewport);\n for (const source of lightSources.directLights) {\n renderDirectLightGlow(ctx, source, camera, viewport);\n }\n for (const ship of state.ships) {\n renderShipRigging(ctx, ship, camera, viewport);\n }\n renderSprays(ctx, state.sprays, camera, viewport);\n\n const debugSnapshot = state.debugSession.getSnapshot();\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: lightingSnapshot,\n };\n\n const sceneMetrics = [\n `focus: ${state.focus}`,\n `ships: ${state.ships.length} active GLTF hulls`,\n `moonlight: cold overhead key + ${HARBOR_TORCHES.length + state.ships.length * SHIP_LANTERNS.length} warm deck and harbor lights`,\n `physics snapshot: ${state.physics.snapshot.stage} (${state.physics.snapshot.stability})`,\n `physics contacts: ${state.contactCount}`,\n `mass split: ${state.ships.map((ship) => `${ship.id} ${(getShipMass(ship, shipModel) / 1000).toFixed(1)}t`).join(\" · \")}`,\n `cloth band: ${cloth.band} -> ${cloth.representation.output}`,\n `fluid near band: ${water.bandMeshes[0].representation.output}`,\n `lighting profile: ${lightingPlan.profile} (${lightingDistanceBands.length} bands)`,\n ];\n const qualityMetrics = [\n `fluid detail: ${quality.fluid.currentLevel.id} (${quality.fluid.currentLevel.config.nearResolution} near cells)`,\n `cloth detail: ${quality.cloth.currentLevel.id} (${quality.cloth.currentLevel.config.cols}x${quality.cloth.currentLevel.config.rows})`,\n `lighting detail: ${quality.lighting.currentLevel.id}`,\n `near shadows: ${nearLighting.primaryShadowSource}`,\n `near reflections: ${nearLighting.rtParticipation.reflections}`,\n `governor pressure: ${state.lastDecision.pressureLevel}`,\n `frame avg: ${state.lastDecision.metrics.averageFrameTimeMs.toFixed(2)} ms`,\n ];\n const debugMetrics = [\n `queue samples: ${debugSnapshot.queues.sampleCount}`,\n `dispatch avg: ${(debugSnapshot.dispatch.averageDurationMs ?? 0).toFixed(2)} ms`,\n `ready lane peak: ${debugSnapshot.dag.peakReadyLaneDepth.toFixed(1)}`,\n `pipeline samples: ${debugSnapshot.pipeline.sampleCount}`,\n `tracked memory: ${(debugSnapshot.memory.totalTrackedBytes / (1024 * 1024)).toFixed(1)} MB`,\n ];\n const sceneNotes =\n state.focus === \"physics\"\n ? [\n \"Stable world snapshots are taken after the authoritative rigid-body commit and before visual follow-up work.\",\n \"The ships collide with mass-weighted impulses and positional correction, so the heavier hull keeps more of its line.\",\n \"Moonlight keeps the overall read legible while lanterns and torches make collision moments easy to track against the water.\",\n ]\n : SCENE_NOTES;\n const custom = state.demoDescription ?? null;\n\n setListContent(\n dom.sceneMetrics,\n Array.isArray(custom?.sceneMetrics) ? custom.sceneMetrics : sceneMetrics\n );\n setListContent(\n dom.qualityMetrics,\n Array.isArray(custom?.qualityMetrics) ? custom.qualityMetrics : qualityMetrics\n );\n setListContent(\n dom.debugMetrics,\n Array.isArray(custom?.debugMetrics) ? custom.debugMetrics : debugMetrics\n );\n setListContent(dom.sceneNotes, Array.isArray(custom?.notes) ? custom.notes : sceneNotes);\n\n dom.status.textContent =\n typeof custom?.status === \"string\"\n ? custom.status\n : `3D scene live · ${state.lastDecision.metrics.fps.toFixed(1)} FPS`;\n dom.details.textContent =\n typeof custom?.details === \"string\"\n ? custom.details\n : state.focus === \"physics\"\n ? `Stable world snapshots are emitted from ${state.physics.plan.snapshotStageId} after the authoritative solver; the heavier hull now carries momentum through mass-aware collision impulses while cloth and fluid remain downstream.`\n : `Moonlit GLTF ships collide on ${shipModel.physics.shape ?? \"box\"} physics volumes; lantern reflections, cloth, and fluid remain continuous while the governor pressure is ${state.lastDecision.pressureLevel}.`;\n}\n\nfunction updateSceneState(state, dt, shipModel) {\n updateShips(state, dt, shipModel);\n updateWaveImpulses(state, dt);\n updateSpray(state, dt);\n const clothPresentation = resolveClothPresentation(\n state,\n state.clothDetail.getSnapshot().currentLevel.config\n );\n const clothState = ensureShowcaseClothState(\n state,\n state.clothDetail.getSnapshot().currentLevel.config,\n clothPresentation\n );\n advanceShowcaseClothSimulationState(clothState, {\n dt,\n time: state.time,\n flagMotion: readVisualNumber(state.demoVisuals?.flagMotion, 0.92),\n waveInfluence: sampleWave(state, FLAG_LAYOUT.origin.x + FLAG_LAYOUT.width * 0.55, FLAG_LAYOUT.origin.z + FLAG_LAYOUT.width * 0.48, state.time),\n });\n updatePhysicsSnapshot(state, shipModel);\n}\n\nfunction syncTextState(state, shipModel) {\n const snapshot = {\n coordinateSystem: \"right-handed world; +x right, +y up, +z forward from the shore\",\n focus: state.focus,\n stress: state.stress,\n ships: state.ships.map((ship) => ({\n id: ship.id,\n x: Number(ship.position.x.toFixed(2)),\n y: Number(ship.position.y.toFixed(2)),\n z: Number(ship.position.z.toFixed(2)),\n vx: Number(ship.velocity.x.toFixed(2)),\n vz: Number(ship.velocity.z.toFixed(2)),\n massKg: Math.round(getShipMass(ship, shipModel)),\n lanterns: Array.isArray(ship.lanterns) ? ship.lanterns.length : 0,\n })),\n shipPhysics: shipModel.physics,\n sprays: state.sprays.length,\n waveImpulses: state.waveImpulses.length,\n pressure: state.lastDecision?.pressureLevel ?? \"stable\",\n physics: {\n profile: state.physics.profile,\n snapshotStageId: state.physics.plan.snapshotStageId,\n workerJobCount: state.physics.manifest.jobs.length,\n snapshot: state.physics.snapshot,\n },\n package: state.demoDescription?.textState ?? null,\n };\n window.render_game_to_text = () => JSON.stringify(snapshot);\n window.advanceTime = (ms) => {\n const step = Math.max(1, Math.round(ms / (1000 / 60)));\n for (let index = 0; index < step; index += 1) {\n state.frame += 1;\n state.time += 1 / 60;\n updateSceneState(state, 1 / 60, shipModel);\n state.lastDecision = recordTelemetry(state, 16.67 + (state.stress ? 6.5 : 0));\n }\n };\n}\n\nexport async function mountGpuShowcase(options = {}) {\n injectStyles();\n const root = options.root ?? document.body;\n root.classList?.add?.(ROOT_CLASS);\n const previousMarkup = root.innerHTML;\n const previousRenderGameToText = window.render_game_to_text;\n const previousAdvanceTime = window.advanceTime;\n const focus = options.focus ?? new URLSearchParams(window.location.search).get(\"focus\") ?? \"integrated\";\n const dom = buildDemoDom(root, {\n packageName: options.packageName ?? \"@plasius/gpu-demo-viewer\",\n title: options.title ?? DEFAULT_TITLE,\n subtitle: options.subtitle ?? DEFAULT_SUBTITLE,\n });\n dom.focusMode.value = focus;\n\n const state = createSceneState({ focus });\n const shipModel = await loadGltfModel(resolveShowcaseAssetUrl());\n state.shipModel = shipModel;\n state.packageState =\n typeof options.createState === \"function\" ? options.createState() : undefined;\n updatePhysicsSnapshot(state, shipModel);\n state.lastDecision = recordTelemetry(state, 16.4);\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n syncTextState(state, shipModel);\n\n const ctx = dom.canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"2D canvas context is required for the shared showcase.\");\n }\n let animationFrameId = 0;\n let destroyed = false;\n const renderFrame = (nowMs) => {\n if (destroyed) {\n return;\n }\n if (!state.paused) {\n if (state.lastTimeMs == null) {\n state.lastTimeMs = nowMs;\n }\n const dt = Math.min(0.033, (nowMs - state.lastTimeMs) / 1000);\n state.lastTimeMs = nowMs;\n state.time += dt;\n state.frame += 1;\n updateSceneState(state, dt, shipModel);\n updatePackageState(state, options, shipModel, dt);\n const syntheticFrame = 14.2 + state.sprays.length * 0.1 + (state.stress ? 6.4 : 0);\n state.lastDecision = recordTelemetry(state, syntheticFrame);\n }\n\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n renderScene(ctx, dom.canvas, state, shipModel, dom);\n syncTextState(state, shipModel);\n animationFrameId = requestAnimationFrame(renderFrame);\n };\n\n const handlePauseClick = () => {\n state.paused = !state.paused;\n dom.pauseButton.textContent = state.paused ? \"Resume\" : \"Pause\";\n };\n const handleStressChange = () => {\n state.stress = dom.stressToggle.checked;\n };\n const handleFocusChange = () => {\n state.focus = dom.focusMode.value;\n Object.assign(state.camera, {\n ...CAMERA_PRESETS[state.focus],\n target: vec3(...CAMERA_PRESETS[state.focus].target),\n });\n };\n\n dom.pauseButton.addEventListener(\"click\", handlePauseClick);\n dom.stressToggle.addEventListener(\"change\", handleStressChange);\n dom.focusMode.addEventListener(\"change\", handleFocusChange);\n\n animationFrameId = requestAnimationFrame(renderFrame);\n const destroy = () => {\n if (destroyed) {\n return;\n }\n destroyed = true;\n if (animationFrameId) {\n cancelAnimationFrame(animationFrameId);\n }\n dom.pauseButton.removeEventListener(\"click\", handlePauseClick);\n dom.stressToggle.removeEventListener(\"change\", handleStressChange);\n dom.focusMode.removeEventListener(\"change\", handleFocusChange);\n try {\n if (typeof options.destroyState === \"function\") {\n options.destroyState(state.packageState);\n }\n } finally {\n state.packageState = undefined;\n }\n root.classList?.remove?.(ROOT_CLASS);\n root.innerHTML = previousMarkup;\n if (typeof previousRenderGameToText === \"function\") {\n window.render_game_to_text = previousRenderGameToText;\n } else {\n delete window.render_game_to_text;\n }\n if (typeof previousAdvanceTime === \"function\") {\n window.advanceTime = previousAdvanceTime;\n } else {\n delete window.advanceTime;\n }\n };\n return {\n state,\n shipModel,\n canvas: dom.canvas,\n destroy,\n };\n}\n\nfunction updatePhysicsSnapshot(state, shipModel) {\n state.physics.snapshot = createPhysicsWorldSnapshot({\n frameId: `showcase-${state.frame}`,\n tick: state.frame,\n simulationTimeMs: Number((state.time * 1000).toFixed(2)),\n profile: state.physics.profile,\n authoritativeTransformRevision: state.frame,\n secondarySimulationRevision: state.frame,\n animationInputRevision: state.frame,\n bodyCount: state.ships.length + 2,\n dynamicBodyCount: state.ships.length,\n contactCount: state.contactCount,\n metadata: {\n collisionCount: state.collisionCount,\n contactCount: state.contactCount,\n snapshotStageId: state.physics.plan.snapshotStageId,\n rigidBodyShape: shipModel.physics.shape ?? \"box\",\n },\n });\n}\n\nexport {\n advanceShowcaseClothSimulationState as __testOnlyAdvanceShowcaseClothSimulationState,\n buildWaterBands as __testOnlyBuildWaterBands,\n buildWaterMotionEffects as __testOnlyBuildWaterMotionEffects,\n collectSceneLightSources as __testOnlyCollectSceneLightSources,\n createShowcaseClothSimulationState as __testOnlyCreateShowcaseClothSimulationState,\n};\n","export { resolveShowcaseAssetUrl } from \"./asset-url.js\";\n\nexport const showcaseFocusModes = Object.freeze([\n \"integrated\",\n \"lighting\",\n \"cloth\",\n \"fluid\",\n \"physics\",\n \"performance\",\n \"debug\",\n]);\n\nexport async function loadGltfModel(url) {\n const module = await import(\"./gltf-loader.js\");\n return module.loadGltfModel(url);\n}\n\nexport async function mountGpuShowcase(options = {}) {\n const runtimeLoader =\n typeof options.__runtimeLoader === \"function\"\n ? options.__runtimeLoader\n : () => import(\"./showcase-runtime.js\");\n const module = await runtimeLoader();\n if (typeof module.mountGpuShowcase !== \"function\") {\n throw new Error(\"showcase runtime loader must provide mountGpuShowcase.\");\n }\n\n const publicOptions = { ...options };\n delete publicOptions.__runtimeLoader;\n return module.mountGpuShowcase(publicOptions);\n}\n"],"mappings":"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","names":["baseUrl","document","baseUrl","assertIdentifier","assertFinitePositiveNumber","assertFiniteNonNegativeNumber","assertRatio","assertEnumValue","buildBandSettings","defaultBandInputs","normalizeThresholds","buildRepresentationDescriptor","profileRepresentationSpecs","createSimulationStage","simulationStageLabels","interactiveWorkerProfileSpec","cinematicWorkerProfileSpec","interactiveSimulationStages","cinematicSimulationStages","import_meta","assertEnumValue","assertIdentifier","average","module","isRecord","assertIdentifier","IDENTIFIER_PATTERN","assertEnumValue","readPositiveNumber","readNonNegativeNumber","normalizePlainObject","isAbortSignalLike","assertIdentifier","buildWorkerBudgetLevels","init_dist","loadGltfModel","mountGpuShowcase","showcaseFocusModes","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/showcase-inline-assets.js","../src/asset-url.js","../src/translations/en-GB.js","../src/i18n.js","../src/feature-flags.js","../src/gltf-loader.js","../src/product-studio-runtime.js","../src/showcase-runtime.js","../src/index.js"],"sourcesContent":["export const INLINE_SHOWCASE_ASSET_URLS = Object.freeze({\n \"brigantine\": \"data:application/json;base64,ewogICJhc3NldCI6IHsKICAgICJ2ZXJzaW9uIjogIjIuMCIsCiAgICAiZ2VuZXJhdG9yIjogIkBwbGFzaXVzL2dwdS1zaGFyZWQgc2hvd2Nhc2UgYXNzZXQgZ2VuZXJhdG9yIgogIH0sCiAgInNjZW5lIjogMCwKICAic2NlbmVzIjogWwogICAgewogICAgICAibm9kZXMiOiBbCiAgICAgICAgMAogICAgICBdCiAgICB9CiAgXSwKICAibm9kZXMiOiBbCiAgICB7CiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUiLAogICAgICAiY2hpbGRyZW4iOiBbCiAgICAgICAgMSwKICAgICAgICAyLAogICAgICAgIDMKICAgICAgXSwKICAgICAgImV4dHJhcyI6IHsKICAgICAgICAicGh5c2ljcyI6IHsKICAgICAgICAgICJzaGFwZSI6ICJib3giLAogICAgICAgICAgImhhbGZFeHRlbnRzIjogWwogICAgICAgICAgICAxLjU4LAogICAgICAgICAgICAxLjEyLAogICAgICAgICAgICA0LjQKICAgICAgICAgIF0sCiAgICAgICAgICAibWFzcyI6IDQ3MDAsCiAgICAgICAgICAicmVzdGl0dXRpb24iOiAwLjIsCiAgICAgICAgICAibGluZWFyRGFtcGluZyI6IDAuMDM4LAogICAgICAgICAgImFuZ3VsYXJEYW1waW5nIjogMC4wNzYsCiAgICAgICAgICAid2F0ZXJsaW5lIjogMC40NAogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAiYnJpZ2FudGluZS1odWxsIiwKICAgICAgIm1lc2giOiAwCiAgICB9LAogICAgewogICAgICAibmFtZSI6ICJicmlnYW50aW5lLXJpZyIsCiAgICAgICJtZXNoIjogMQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAiYnJpZ2FudGluZS1sYW50ZXJucyIsCiAgICAgICJtZXNoIjogMgogICAgfQogIF0sCiAgIm1lc2hlcyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiYnJpZ2FudGluZS1odWxsIiwKICAgICAgInByaW1pdGl2ZXMiOiBbCiAgICAgICAgewogICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICJQT1NJVElPTiI6IDAsCiAgICAgICAgICAgICJOT1JNQUwiOiAxCiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiAyLAogICAgICAgICAgIm1hdGVyaWFsIjogMAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICJQT1NJVElPTiI6IDMsCiAgICAgICAgICAgICJOT1JNQUwiOiA0CiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiA1LAogICAgICAgICAgIm1hdGVyaWFsIjogMQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgImF0dHJpYnV0ZXMiOiB7CiAgICAgICAgICAgICJQT1NJVElPTiI6IDYsCiAgICAgICAgICAgICJOT1JNQUwiOiA3CiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiA4LAogICAgICAgICAgIm1hdGVyaWFsIjogMgogICAgICAgIH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAiYnJpZ2FudGluZS1yaWciLAogICAgICAicHJpbWl0aXZlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgIlBPU0lUSU9OIjogOSwKICAgICAgICAgICAgIk5PUk1BTCI6IDEwCiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiAxMSwKICAgICAgICAgICJtYXRlcmlhbCI6IDMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiUE9TSVRJT04iOiAxMiwKICAgICAgICAgICAgIk5PUk1BTCI6IDEzCiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiAxNCwKICAgICAgICAgICJtYXRlcmlhbCI6IDQKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJhdHRyaWJ1dGVzIjogewogICAgICAgICAgICAiUE9TSVRJT04iOiAxNSwKICAgICAgICAgICAgIk5PUk1BTCI6IDE2CiAgICAgICAgICB9LAogICAgICAgICAgImluZGljZXMiOiAxNywKICAgICAgICAgICJtYXRlcmlhbCI6IDUKICAgICAgICB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJuYW1lIjogImJyaWdhbnRpbmUtbGFudGVybnMiLAogICAgICAicHJpbWl0aXZlcyI6IFsKICAgICAgICB7CiAgICAgICAgICAiYXR0cmlidXRlcyI6IHsKICAgICAgICAgICAgIlBPU0lUSU9OIjogMTgsCiAgICAgICAgICAgICJOT1JNQUwiOiAxOQogICAgICAgICAgfSwKICAgICAgICAgICJpbmRpY2VzIjogMjAsCiAgICAgICAgICAibWF0ZXJpYWwiOiA2CiAgICAgICAgfQogICAgICBdCiAgICB9CiAgXSwKICAibWF0ZXJpYWxzIjogWwogICAgewogICAgICAibmFtZSI6ICJwYWludGVkLWh1bGwiLAogICAgICAicGJyTWV0YWxsaWNSb3VnaG5lc3MiOiB7CiAgICAgICAgImJhc2VDb2xvckZhY3RvciI6IFsKICAgICAgICAgIDAuNDIsCiAgICAgICAgICAwLjI0LAogICAgICAgICAgMC4xNiwKICAgICAgICAgIDEKICAgICAgICBdLAogICAgICAgICJtZXRhbGxpY0ZhY3RvciI6IDAuMDgsCiAgICAgICAgInJvdWdobmVzc0ZhY3RvciI6IDAuNzYKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAiZGVjay1wbGFuayIsCiAgICAgICJwYnJNZXRhbGxpY1JvdWdobmVzcyI6IHsKICAgICAgICAiYmFzZUNvbG9yRmFjdG9yIjogWwogICAgICAgICAgMC41MywKICAgICAgICAgIDAuMzksCiAgICAgICAgICAwLjI2LAogICAgICAgICAgMQogICAgICAgIF0sCiAgICAgICAgIm1ldGFsbGljRmFjdG9yIjogMC4wMiwKICAgICAgICAicm91Z2huZXNzRmFjdG9yIjogMC45CiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJuYW1lIjogImh1bGwtdHJpbSIsCiAgICAgICJwYnJNZXRhbGxpY1JvdWdobmVzcyI6IHsKICAgICAgICAiYmFzZUNvbG9yRmFjdG9yIjogWwogICAgICAgICAgMC43MiwKICAgICAgICAgIDAuNzEsCiAgICAgICAgICAwLjY2LAogICAgICAgICAgMQogICAgICAgIF0sCiAgICAgICAgIm1ldGFsbGljRmFjdG9yIjogMC4xOCwKICAgICAgICAicm91Z2huZXNzRmFjdG9yIjogMC40MgogICAgICB9CiAgICB9LAogICAgewogICAgICAibmFtZSI6ICJtYXN0LXdvb2QiLAogICAgICAicGJyTWV0YWxsaWNSb3VnaG5lc3MiOiB7CiAgICAgICAgImJhc2VDb2xvckZhY3RvciI6IFsKICAgICAgICAgIDAuMzcsCiAgICAgICAgICAwLjI3LAogICAgICAgICAgMC4xOCwKICAgICAgICAgIDEKICAgICAgICBdLAogICAgICAgICJtZXRhbGxpY0ZhY3RvciI6IDAuMDIsCiAgICAgICAgInJvdWdobmVzc0ZhY3RvciI6IDAuODIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAic2FpbC1jYW52YXMiLAogICAgICAicGJyTWV0YWxsaWNSb3VnaG5lc3MiOiB7CiAgICAgICAgImJhc2VDb2xvckZhY3RvciI6IFsKICAgICAgICAgIDAuODIsCiAgICAgICAgICAwLjc5LAogICAgICAgICAgMC43MiwKICAgICAgICAgIDEKICAgICAgICBdLAogICAgICAgICJtZXRhbGxpY0ZhY3RvciI6IDAsCiAgICAgICAgInJvdWdobmVzc0ZhY3RvciI6IDAuOTYKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm5hbWUiOiAibWV0YWwtZGFyayIsCiAgICAgICJwYnJNZXRhbGxpY1JvdWdobmVzcyI6IHsKICAgICAgICAiYmFzZUNvbG9yRmFjdG9yIjogWwogICAgICAgICAgMC4yMSwKICAgICAgICAgIDAuMjIsCiAgICAgICAgICAwLjI0LAogICAgICAgICAgMQogICAgICAgIF0sCiAgICAgICAgIm1ldGFsbGljRmFjdG9yIjogMC44NCwKICAgICAgICAicm91Z2huZXNzRmFjdG9yIjogMC4zNAogICAgICB9CiAgICB9LAogICAgewogICAgICAibmFtZSI6ICJ3YXJtLWdsYXNzIiwKICAgICAgInBick1ldGFsbGljUm91Z2huZXNzIjogewogICAgICAgICJiYXNlQ29sb3JGYWN0b3IiOiBbCiAgICAgICAgICAwLjk1LAogICAgICAgICAgMC44MiwKICAgICAgICAgIDAuNTYsCiAgICAgICAgICAwLjg0CiAgICAgICAgXSwKICAgICAgICAibWV0YWxsaWNGYWN0b3IiOiAwLjAyLAogICAgICAgICJyb3VnaG5lc3NGYWN0b3IiOiAwLjE2CiAgICAgIH0sCiAgICAgICJlbWlzc2l2ZUZhY3RvciI6IFsKICAgICAgICAwLjkyLAogICAgICAgIDAuNywKICAgICAgICAwLjM0CiAgICAgIF0sCiAgICAgICJhbHBoYU1vZGUiOiAiQkxFTkQiCiAgICB9CiAgXSwKICAiYnVmZmVycyI6IFsKICAgIHsKICAgICAgInVyaSI6ICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsQUFBQUFJWHJVYi9Oekl6QWZQS3dQc2U2dUw3TnpJekFsLzhRUDlQZTRMNEFBRkRBQUFBQUFJWHJVYi9Oekl6QWwvOFFQOVBlNEw0QUFGREFBQUFBQUkvQ2RiOEFBRkRBZlBLd1BzZTZ1TDdOekl6QW5ETWlQeHBSMmo3TnpJekFTK3FFUDBJKzZENEFBRkRBZlBLd1BzZTZ1TDdOekl6QVMrcUVQMEkrNkQ0QUFGREFsLzhRUDlQZTRMNEFBRkRBbkRNaVB4cFIyajdOekl6QTdGRTRQNFhyVVQvTnpJekFQUXFYUDJabVpqOEFBRkRBbkRNaVB4cFIyajdOekl6QVBRcVhQMlptWmo4QUFGREFTK3FFUDBJKzZENEFBRkRBN0ZFNHY0WHJVVC9Oekl6QW5ETWl2eHBSMmo3TnpJekFTK3FFdjBJKzZENEFBRkRBN0ZFNHY0WHJVVC9Oekl6QVMrcUV2MEkrNkQ0QUFGREFQUXFYdjJabVpqOEFBRkRBbkRNaXZ4cFIyajdOekl6QWZQS3d2c2U2dUw3TnpJekFsLzhRdjlQZTRMNEFBRkRBbkRNaXZ4cFIyajdOekl6QWwvOFF2OVBlNEw0QUFGREFTK3FFdjBJKzZENEFBRkRBZlBLd3ZzZTZ1TDdOekl6QUFBQUFBSVhyVWIvTnpJekFBQUFBQUkvQ2RiOEFBRkRBZlBLd3ZzZTZ1TDdOekl6QUFBQUFBSS9DZGI4QUFGREFsLzhRdjlQZTRMNEFBRkRBQUFBQUFJL0NkYjhBQUZEQWwvOFFQOVBlNEw0QUFGREFvV2N6UDQvazhyNW1aZ2JBQUFBQUFJL0NkYjhBQUZEQW9XY3pQNC9rOHI1bVpnYkFBQUFBQUxnZWhiOW1aZ2JBbC84UVA5UGU0TDRBQUZEQVMrcUVQMEkrNkQ0QUFGREFWSFNrUDl1Sy9UNW1aZ2JBbC84UVA5UGU0TDRBQUZEQVZIU2tQOXVLL1Q1bVpnYkFvV2N6UDQvazhyNW1aZ2JBUytxRVAwSSs2RDRBQUZEQVBRcVhQMlptWmo4QUFGREFTT0c2UDBqaGVqOW1aZ2JBUytxRVAwSSs2RDRBQUZEQVNPRzZQMGpoZWo5bVpnYkFWSFNrUDl1Sy9UNW1aZ2JBUFFxWHYyWm1aajhBQUZEQVMrcUV2MEkrNkQ0QUFGREFWSFNrdjl1Sy9UNW1aZ2JBUFFxWHYyWm1aajhBQUZEQVZIU2t2OXVLL1Q1bVpnYkFTT0c2djBqaGVqOW1aZ2JBUytxRXYwSSs2RDRBQUZEQWwvOFF2OVBlNEw0QUFGREFvV2N6djQvazhyNW1aZ2JBUytxRXYwSSs2RDRBQUZEQW9XY3p2NC9rOHI1bVpnYkFWSFNrdjl1Sy9UNW1aZ2JBbC84UXY5UGU0TDRBQUZEQUFBQUFBSS9DZGI4QUFGREFBQUFBQUxnZWhiOW1aZ2JBbC84UXY5UGU0TDRBQUZEQUFBQUFBTGdlaGI5bVpnYkFvV2N6djQvazhyNW1aZ2JBQUFBQUFMZ2VoYjltWmdiQW9XY3pQNC9rOHI1bVpnYkFnU1pDUDIzbis3NHpNek8vQUFBQUFMZ2VoYjltWmdiQWdTWkNQMjNuKzc0ek16Ty9BQUFBQUhFOWlyOHpNek8vb1djelA0L2s4cjVtWmdiQVZIU2tQOXVLL1Q1bVpnYkFvZml4UDVNWUJEOHpNek8vb1djelA0L2s4cjVtWmdiQW9maXhQNU1ZQkQ4ek16Ty9nU1pDUDIzbis3NHpNek8vVkhTa1A5dUsvVDVtWmdiQVNPRzZQMGpoZWo5bVpnYkFjVDNLUDF5UGdqOHpNek8vVkhTa1A5dUsvVDVtWmdiQWNUM0tQMXlQZ2o4ek16Ty9vZml4UDVNWUJEOHpNek8vU09HNnYwamhlajltWmdiQVZIU2t2OXVLL1Q1bVpnYkFvZml4djVNWUJEOHpNek8vU09HNnYwamhlajltWmdiQW9maXh2NU1ZQkQ4ek16Ty9jVDNLdjF5UGdqOHpNek8vVkhTa3Y5dUsvVDVtWmdiQW9XY3p2NC9rOHI1bVpnYkFnU1pDdjIzbis3NHpNek8vVkhTa3Y5dUsvVDVtWmdiQWdTWkN2MjNuKzc0ek16Ty9vZml4djVNWUJEOHpNek8vb1djenY0L2s4cjVtWmdiQUFBQUFBTGdlaGI5bVpnYkFBQUFBQUhFOWlyOHpNek8vb1djenY0L2s4cjVtWmdiQUFBQUFBSEU5aXI4ek16Ty9nU1pDdjIzbis3NHpNek8vQUFBQUFIRTlpcjh6TXpPL2dTWkNQMjNuKzc0ek16Ty9WbjB1UDBDazM3NW1ab1kvQUFBQUFIRTlpcjh6TXpPL1ZuMHVQMENrMzc1bVpvWS9BQUFBQUVqaGVyOW1ab1kvZ1NaQ1AyM24rNzR6TXpPL29maXhQNU1ZQkQ4ek16Ty81ZktmUC84aC9UNW1ab1kvZ1NaQ1AyM24rNzR6TXpPLzVmS2ZQLzhoL1Q1bVpvWS9WbjB1UDBDazM3NW1ab1kvb2ZpeFA1TVlCRDh6TXpPL2NUM0tQMXlQZ2o4ek16Ty9qOEsxUDQvQ2RUOW1ab1kvb2ZpeFA1TVlCRDh6TXpPL2o4SzFQNC9DZFQ5bVpvWS81ZktmUC84aC9UNW1ab1kvY1QzS3YxeVBnajh6TXpPL29maXh2NU1ZQkQ4ek16Ty81Zktmdi84aC9UNW1ab1kvY1QzS3YxeVBnajh6TXpPLzVmS2Z2LzhoL1Q1bVpvWS9qOEsxdjQvQ2RUOW1ab1kvb2ZpeHY1TVlCRDh6TXpPL2dTWkN2MjNuKzc0ek16Ty9WbjB1djBDazM3NW1ab1kvb2ZpeHY1TVlCRDh6TXpPL1ZuMHV2MENrMzc1bVpvWS81Zktmdi84aC9UNW1ab1kvZ1NaQ3YyM24rNzR6TXpPL0FBQUFBSEU5aXI4ek16Ty9BQUFBQUVqaGVyOW1ab1kvZ1NaQ3YyM24rNzR6TXpPL0FBQUFBRWpoZXI5bVpvWS9WbjB1djBDazM3NW1ab1kvQUFBQUFFamhlcjltWm9ZL1ZuMHVQMENrMzc1bVpvWS9zQVBuUGpTQXQ3NHpNeU5BQUFBQUFFamhlcjltWm9ZL3NBUG5QalNBdDc0ek15TkFBQUFBQUQwS1Y3OHpNeU5BVm4wdVAwQ2szNzVtWm9ZLzVmS2ZQLzhoL1Q1bVpvWS9ZY05UUDljMDd6NHpNeU5BVm4wdVAwQ2szNzVtWm9ZL1ljTlRQOWMwN3o0ek15TkFzQVBuUGpTQXQ3NHpNeU5BNWZLZlAvOGgvVDVtWm9ZL2o4SzFQNC9DZFQ5bVpvWS8xNk53UDY1SFlUOHpNeU5BNWZLZlAvOGgvVDVtWm9ZLzE2TndQNjVIWVQ4ek15TkFZY05UUDljMDd6NHpNeU5BajhLMXY0L0NkVDltWm9ZLzVmS2Z2LzhoL1Q1bVpvWS9ZY05UdjljMDd6NHpNeU5BajhLMXY0L0NkVDltWm9ZL1ljTlR2OWMwN3o0ek15TkExNk53djY1SFlUOHpNeU5BNWZLZnYvOGgvVDVtWm9ZL1ZuMHV2MENrMzc1bVpvWS9zQVBudmpTQXQ3NHpNeU5BNWZLZnYvOGgvVDVtWm9ZL3NBUG52alNBdDc0ek15TkFZY05UdjljMDd6NHpNeU5BVm4wdXYwQ2szNzVtWm9ZL0FBQUFBRWpoZXI5bVpvWS9BQUFBQUQwS1Y3OHpNeU5BVm4wdXYwQ2szNzVtWm9ZL0FBQUFBRDBLVjc4ek15TkFzQVBudmpTQXQ3NHpNeU5BQUFBQUFEMEtWNzh6TXlOQXNBUG5QalNBdDc0ek15TkErdTNyUGJyYWlyNmFtWGxBQUFBQUFEMEtWNzh6TXlOQSt1M3JQYnJhaXI2YW1YbEFBQUFBQUhzVUxyK2FtWGxBc0FQblBqU0F0NzR6TXlOQVljTlRQOWMwN3o0ek15TkEwRVJZUG9qMDJ6NmFtWGxBc0FQblBqU0F0NzR6TXlOQTBFUllQb2owMno2YW1YbEErdTNyUGJyYWlyNmFtWGxBWWNOVFA5YzA3ejR6TXlOQTE2TndQNjVIWVQ4ek15TkFqOEoxUGhTdVJ6K2FtWGxBWWNOVFA5YzA3ejR6TXlOQWo4SjFQaFN1UnorYW1YbEEwRVJZUG9qMDJ6NmFtWGxBMTZOd3Y2NUhZVDh6TXlOQVljTlR2OWMwN3o0ek15TkEwRVJZdm9qMDJ6NmFtWGxBMTZOd3Y2NUhZVDh6TXlOQTBFUll2b2owMno2YW1YbEFqOEoxdmhTdVJ6K2FtWGxBWWNOVHY5YzA3ejR6TXlOQXNBUG52alNBdDc0ek15TkErdTNydmJyYWlyNmFtWGxBWWNOVHY5YzA3ejR6TXlOQSt1M3J2YnJhaXI2YW1YbEEwRVJZdm9qMDJ6NmFtWGxBc0FQbnZqU0F0NzR6TXlOQUFBQUFBRDBLVjc4ek15TkFBQUFBQUhzVUxyK2FtWGxBc0FQbnZqU0F0NzR6TXlOQUFBQUFBSHNVTHIrYW1YbEErdTNydmJyYWlyNmFtWGxBajhKMVBoU3VSeithbVhsQUFBQUFBTTNNVEQrYW1YbEFqOEoxdmhTdVJ6K2FtWGxBajhKMVBoU3VSeithbVhsQWo4SjF2aFN1UnorYW1YbEEwRVJZdm9qMDJ6NmFtWGxBajhKMVBoU3VSeithbVhsQTBFUll2b2owMno2YW1YbEErdTNydmJyYWlyNmFtWGxBajhKMVBoU3VSeithbVhsQSt1M3J2YnJhaXI2YW1YbEFBQUFBQUhzVUxyK2FtWGxBajhKMVBoU3VSeithbVhsQUFBQUFBSHNVTHIrYW1YbEErdTNyUGJyYWlyNmFtWGxBajhKMVBoU3VSeithbVhsQSt1M3JQYnJhaXI2YW1YbEEwRVJZUG9qMDJ6NmFtWGxBN0ZFNHY0WHJVVC9Oekl6QUFBQUFBUFlvWEQvTnpJekE3RkU0UDRYclVUL056SXpBN0ZFNHY0WHJVVC9Oekl6QTdGRTRQNFhyVVQvTnpJekFuRE1pUHhwUjJqN056SXpBN0ZFNHY0WHJVVC9Oekl6QW5ETWlQeHBSMmo3TnpJekFmUEt3UHNlNnVMN056SXpBN0ZFNHY0WHJVVC9Oekl6QWZQS3dQc2U2dUw3TnpJekFBQUFBQUlYclViL056SXpBN0ZFNHY0WHJVVC9Oekl6QUFBQUFBSVhyVWIvTnpJekFmUEt3dnNlNnVMN056SXpBN0ZFNHY0WHJVVC9Oekl6QWZQS3d2c2U2dUw3TnpJekFuRE1pdnhwUjJqN056SXpBeHNoSVArY2NGNy8vYUVPK3hzaElQK2NjRjcvL2FFTyt4c2hJUCtjY0Y3Ly9hRU8rUHBVc1A2V3hPNzh0ekxhOVBwVXNQNld4Tzc4dHpMYTlQcFVzUDZXeE83OHR6TGE5aGRCa1A5OXNwNzRlSUoyK2hkQmtQOTlzcDc0ZUlKMitoZEJrUDk5c3A3NGVJSjIrN05wZFAvcVQ2cjUxWGtxKzdOcGRQL3FUNnI1MVhrcSs3TnBkUC9xVDZyNTFYa3ErekJCcVAyS0ZUYjZiR3JTK3pCQnFQMktGVGI2YkdyUyt6QkJxUDJLRlRiNmJHclMrbk5ablA0a1VrNzVEdkorK25OWm5QNGtVazc1RHZKKytuTlpuUDRrVWs3NUR2SisrN3ROc3YwanlUNzZDUktTKzd0TnN2MGp5VDc2Q1JLUys3dE5zdjBqeVQ3NkNSS1MrVDVObHZ3YWxrYjVPaDYyK1Q1Tmx2d2Fsa2I1T2g2MitUNU5sdndhbGtiNU9oNjIrZHBOcnYybGZyTDdQYkV5K2RwTnJ2Mmxmckw3UGJFeStkcE5ydjJsZnJMN1BiRXkrSE1SWXYzTXk1YjZxTHBPK0hNUll2M015NWI2cUxwTytITVJZdjNNeTViNnFMcE8rVFA5THYvS0hHYitnaHBXOVRQOUx2L0tIR2IrZ2hwVzlUUDlMdi9LSEdiK2docFc5b0ljcXZ3RjJPYitSaWpXK29JY3F2d0YyT2IrUmlqVytvSWNxdndGMk9iK1JpalcrOG1Jc1AvSjZPNzhFRmMrOThtSXNQL0o2Tzc4RUZjKzk4bUlzUC9KNk83OEVGYys5allzZ1ArbnJScitIYUYyOWpZc2dQK25yUnIrSGFGMjlqWXNnUCtuclJyK0hhRjI5UUFaZlAzblE2NzY2RkM2K1FBWmZQM25RNjc2NkZDNitRQVpmUDNuUTY3NjZGQzYrQjlaWlAzTTBBNytaeSt1OUI5WlpQM00wQTcrWnkrdTlCOVpaUDNNMEE3K1p5K3U5S01KdVAyeDRsNzZ2ZEZPK0tNSnVQMng0bDc2dmRGTytLTUp1UDJ4NGw3NnZkRk8rTXBCc1B6djdxcjc0WHo2K01wQnNQenY3cXI3NFh6NitNcEJzUHp2N3FyNzRYejYrUnBWdnYxditsNzQwVmtLK1JwVnZ2MXYrbDc0MFZrSytScFZ2djF2K2w3NDBWa0srQTlkcnYyTjFxcjY1K0UyK0E5ZHJ2Mk4xcXI2NStFMitBOWRydjJOMXFyNjUrRTIrNThSZ3Y3Mm83YjVFUCsrOTU4Umd2NzJvN2I1RVArKzk1OFJndjcybzdiNUVQKys5aGw5WXYrRlNBcjk3bFNhK2hsOVl2K0ZTQXI5N2xTYStobDlZditGU0FyOTdsU2ErUGd3dHZ4RXpQTDltZVZHOVBnd3R2eEV6UEw5bWVWRzlQZ3d0dnhFelBMOW1lVkc5bGdZZ3Z5cEhScjlhSzhhOWxnWWd2eXBIUnI5YUs4YTlsZ1lndnlwSFJyOWFLOGE5bzYwZ1B5VVdSNzhwMFJHOW82MGdQeVVXUjc4cDBSRzlvNjBnUHlVV1I3OHAwUkc5Z2RFY1A0RkRTcjlEN2JpOGdkRWNQNEZEU3I5RDdiaThnZEVjUDRGRFNyOUQ3Ymk4alBCYVA1M2VBNyt2NFdpOWpQQmFQNTNlQTcrdjRXaTlqUEJhUDUzZUE3K3Y0V2k5QTdWWVB6WGZCNzhlL0NtOUE3VllQelhmQjc4ZS9DbTlBN1ZZUHpYZkI3OGUvQ205WXlod1AxS1VyYjZMMTVDOVl5aHdQMUtVcmI2TDE1QzlZeWh3UDFLVXJiNkwxNUM5bWhodlB5L2tzNzQwbG9XOW1oaHZQeS9rczc0MGxvVzltaGh2UHkva3M3NDBsb1c5WGoxd3YzeWpyYjcvcFlhOVhqMXd2M3lqcmI3L3BZYTlYajF3djN5anJiNy9wWWE5eXdSdnYwalZzNzZnV0krOXl3UnZ2MGpWczc2Z1dJKzl5d1J2djBqVnM3NmdXSSs5aWhwYnYrajNBNy8reGlxOWlocGJ2K2ozQTcvK3hpcTlpaHBiditqM0E3Lyt4aXE5OG8xWXY3YkdCNzhKRTJXOThvMVl2N2JHQjc4SkUyVzk4bzFZdjdiR0I3OEpFMlc5ajcwZ3Y5OHBSNytvRjdhOGo3MGd2OThwUjcrb0Y3YThqNzBndjk4cFI3K29GN2E4OXNJY3Y4QXdTci94M0ErOTlzSWN2OEF3U3IveDNBKzk5c0ljdjhBd1NyL3gzQSs5NzZVY1AwOExTcjl5OWxNOTc2VWNQMDhMU3I5eTlsTTk3NlVjUDA4TFNyOXk5bE05MjJNZlB5QUFTTCtMMnpZOTIyTWZQeUFBU0wrTDJ6WTkyMk1mUHlBQVNMK0wyelk5eEh0WVAxQzdCNytQNEhzOXhIdFlQMUM3QjcrUDRIczl4SHRZUDFDN0I3K1A0SHM5R3p4YVA2QWRCYjk2YTF3OUd6eGFQNkFkQmI5NmExdzlHenhhUDZBZEJiOTZhMXc5TlBadVAwN0tzNzVpSUpZOU5QWnVQMDdLczc1aUlKWTlOUFp1UDA3S3M3NWlJSlk5OWN0dlAzU0ZyNzVlcnBFOTljdHZQM1NGcjc1ZXJwRTk5Y3R2UDNTRnI3NWVycEU5WWdGdnY3ZlNzNzZjOVpBOVlnRnZ2N2ZTczc2YzlaQTlZZ0Z2djdmU3M3NmM5WkE5czc5dnYzdDhyNzdlU3BjOXM3OXZ2M3Q4cjc3ZVNwYzlzNzl2djN0OHI3N2VTcGM5UVpSWXY2dktCNytZbTF3OVFaUll2NnZLQjcrWW0xdzlRWlJZdjZ2S0I3K1ltMXc5RFNGYXZ4OE5CYjlsaG40OURTRmF2eDhOQmI5bGhuNDlEU0Zhdng4TkJiOWxobjQ5MnJJY3Yva2JTcjhleVRnOTJySWN2L2tiU3I4ZXlUZzkyckljdi9rYlNyOGV5VGc5YlZVZnZ3WHVSNzhCeUZROWJWVWZ2d1h1Ujc4QnlGUTliVlVmdndYdVI3OEJ5RlE5dlJRZVA2QmJScjlTbUFvK3ZSUWVQNkJiUnI5U21Bbyt2UlFlUDZCYlJyOVNtQW8rdlhBNlAvYXJMci9yYTRJOXZYQTZQL2FyTHIvcmE0STl2WEE2UC9hckxyL3JhNEk5RC9KVVA3VGpBYi9IY0dZK0QvSlVQN1RqQWIvSGNHWStEL0pVUDdUakFiL0hjR1kraXY5bFA1WiswYjdHTlNNK2l2OWxQNVorMGI3R05TTStpdjlsUDVaKzBiN0dOU00rNjE1blA1ZGFxYjZMQzRzKzYxNW5QNWRhcWI2TEM0cys2MTVuUDVkYXFiNkxDNHMrdnBodVAxWmxncjVjQTRRK3ZwaHVQMVpsZ3I1Y0E0USt2cGh1UDFabGdyNWNBNFErWGNWb3YvVmdxcjdQQVlBK1hjVm92L1ZncXI3UEFZQStYY1Zvdi9WZ3FyN1BBWUErR2VGc3Z4RjFnYjdJc3BBK0dlRnN2eEYxZ2I3SXNwQStHZUZzdnhGMWdiN0lzcEErcU54WHZ4cXJBNzh1SnlBK3FOeFh2eHFyQTc4dUp5QStxTnhYdnhxckE3OHVKeUErRkJaaXYyanV6Yjd5TVhjK0ZCWml2Mmp1emI3eU1YYytGQlppdjJqdXpiN3lNWGMrTmlBZnZ6K3JSNzhORnBVOU5pQWZ2eityUjc4TkZwVTlOaUFmdnorclI3OE5GcFU5cXM4NHZ6Y2xMYjgydnhVK3FzODR2emNsTGI4MnZ4VStxczg0dnpjbExiODJ2eFUrWnpzMlA2RzZLcitRaUdFK1p6czJQNkc2S3IrUWlHRStaenMyUDZHNktyK1FpR0UrcTBaMlB5Zk5pcjZ4bWdNOXEwWjJQeWZOaXI2eG1nTTlxMFoyUHlmTmlyNnhtZ005Q3dsWVA4REd4TDd4cTc4K0N3bFlQOERHeEw3eHE3OCtDd2xZUDhER3hMN3hxNzgrOWI1MVA4S25Ccjc1V1gwKzliNTFQOEtuQnI3NVdYMCs5YjUxUDhLbkJyNzVXWDArSjVKZVAzSkdjNzdaemQwK0o1SmVQM0pHYzc3WnpkMCtKNUplUDNKR2M3N1p6ZDArZFhOb1B6SFltTDJkRWRNK2RYTm9QekhZbUwyZEVkTStkWE5vUHpIWW1MMmRFZE0rTXFGaXZ5UzJkNzcyWHNzK01xRml2eVMyZDc3MlhzcytNcUZpdnlTMmQ3NzJYc3MrNkRoanZ3eG9sYjBFMytnKzZEaGp2d3hvbGIwRTMrZys2RGhqdnd4b2xiMEUzK2crWGRoaHZ6RzJ6YjZVYW5zK1hkaGh2ekcyemI2VWFucytYZGhodnpHMnpiNlVhbnMrZW5CbnY5YWgvYjJlY2RFK2VuQm52OWFoL2IyZWNkRStlbkJudjlhaC9iMmVjZEUra2pVNnY0ZDBMci9NYUtVOWtqVTZ2NGQwTHIvTWFLVTlralU2djRkMExyL01hS1U5dmFSdXYrdC9ocjVQOVg0K3ZhUnV2K3QvaHI1UDlYNCt2YVJ1dit0L2hyNVA5WDQrQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQkFBSUFBd0FFQUFVQUJnQUhBQWdBQ1FBS0FBc0FEQUFOQUE0QUR3QVFBQkVBRWdBVEFCUUFGUUFXQUJjQUdBQVpBQm9BR3dBY0FCMEFIZ0FmQUNBQUlRQWlBQ01BSkFBbEFDWUFKd0FvQUNrQUtnQXJBQ3dBTFFBdUFDOEFNQUF4QURJQU13QTBBRFVBTmdBM0FEZ0FPUUE2QURzQVBBQTlBRDRBUHdCQUFFRUFRZ0JEQUVRQVJRQkdBRWNBU0FCSkFFb0FTd0JNQUUwQVRnQlBBRkFBVVFCU0FGTUFWQUJWQUZZQVZ3QllBRmtBV2dCYkFGd0FYUUJlQUY4QVlBQmhBR0lBWXdCa0FHVUFaZ0JuQUdnQWFRQnFBR3NBYkFCdEFHNEFid0J3QUhFQWNnQnpBSFFBZFFCMkFIY0FlQUI1QUhvQWV3QjhBSDBBZmdCL0FJQUFnUUNDQUlNQWhBQ0ZBSVlBaHdDSUFJa0FpZ0NMQUl3QWpRQ09BSThBa0FDUkFKSUFrd0NVQUpVQWxnQ1hBSmdBbVFDYUFKc0FuQUNkQUo0QW53Q2dBS0VBb2dDakFLUUFwUUNtQUtjQXFBQ3BBS29BcXdDc0FLMEFyZ0N2QUxBQXNRQ3lBTE1BdEFDMUFMWUF0d0M0QUxrQXVnQzdBTHdBdlFDK0FMOEF3QURCQU1JQXd3REVBTVVBeGdESEFNZ0F5UURLQU1zQXpBRE5BTTRBendEUUFORUEwZ0RUQU5RQTFRRFdBTmNBMkFEWkFOb0Eyd0RjQU4wQTNnRGZBT0FBNFFEaUFPTUE1QURsQU9ZQTV3RG9BT2tBNmdEckFPd0E3UUR1QU84QThBRHhBUElBOHdEMEFQVUE5Z0QzQVBnQStRRDZBUHNBQUFBQUFQWW9YRC9Oekl6QTdGRTRQNFhyVVQvTnpJekFQUXFYUDJabVpqOEFBRkRBQUFBQUFQWW9YRC9Oekl6QVBRcVhQMlptWmo4QUFGREFBQUFBQURNemN6OEFBRkRBN0ZFNHY0WHJVVC9Oekl6QUFBQUFBUFlvWEQvTnpJekFBQUFBQURNemN6OEFBRkRBN0ZFNHY0WHJVVC9Oekl6QUFBQUFBRE16Y3o4QUFGREFQUXFYdjJabVpqOEFBRkRBQUFBQUFETXpjejhBQUZEQVBRcVhQMlptWmo4QUFGREFTT0c2UDBqaGVqOW1aZ2JBQUFBQUFETXpjejhBQUZEQVNPRzZQMGpoZWo5bVpnYkFBQUFBQUFyWGd6OW1aZ2JBUFFxWHYyWm1aajhBQUZEQUFBQUFBRE16Y3o4QUFGREFBQUFBQUFyWGd6OW1aZ2JBUFFxWHYyWm1aajhBQUZEQUFBQUFBQXJYZ3o5bVpnYkFTT0c2djBqaGVqOW1aZ2JBQUFBQUFBclhnejltWmdiQVNPRzZQMGpoZWo5bVpnYkFjVDNLUDF5UGdqOHpNek8vQUFBQUFBclhnejltWmdiQWNUM0tQMXlQZ2o4ek16Ty9BQUFBQUhFOWlqOHpNek8vU09HNnYwamhlajltWmdiQUFBQUFBQXJYZ3o5bVpnYkFBQUFBQUhFOWlqOHpNek8vU09HNnYwamhlajltWmdiQUFBQUFBSEU5aWo4ek16Ty9jVDNLdjF5UGdqOHpNek8vQUFBQUFIRTlpajh6TXpPL2NUM0tQMXlQZ2o4ek16Ty9qOEsxUDQvQ2RUOW1ab1kvQUFBQUFIRTlpajh6TXpPL2o4SzFQNC9DZFQ5bVpvWS9BQUFBQUs1SGdUOW1ab1kvY1QzS3YxeVBnajh6TXpPL0FBQUFBSEU5aWo4ek16Ty9BQUFBQUs1SGdUOW1ab1kvY1QzS3YxeVBnajh6TXpPL0FBQUFBSzVIZ1Q5bVpvWS9qOEsxdjQvQ2RUOW1ab1kvQUFBQUFLNUhnVDltWm9ZL2o4SzFQNC9DZFQ5bVpvWS8xNk53UDY1SFlUOHpNeU5BQUFBQUFLNUhnVDltWm9ZLzE2TndQNjVIWVQ4ek15TkFBQUFBQUIrRmF6OHpNeU5BajhLMXY0L0NkVDltWm9ZL0FBQUFBSzVIZ1Q5bVpvWS9BQUFBQUIrRmF6OHpNeU5BajhLMXY0L0NkVDltWm9ZL0FBQUFBQitGYXo4ek15TkExNk53djY1SFlUOHpNeU5BQUFBQUFCK0Zhejh6TXlOQTE2TndQNjVIWVQ4ek15TkFqOEoxUGhTdVJ6K2FtWGxBQUFBQUFCK0Zhejh6TXlOQWo4SjFQaFN1UnorYW1YbEFBQUFBQU0zTVREK2FtWGxBMTZOd3Y2NUhZVDh6TXlOQUFBQUFBQitGYXo4ek15TkFBQUFBQU0zTVREK2FtWGxBMTZOd3Y2NUhZVDh6TXlOQUFBQUFBTTNNVEQrYW1YbEFqOEoxdmhTdVJ6K2FtWGxBZXhRdXZ3QUFnRCthbVJtL2V4UXVQd0FBZ0QrYW1SbS9leFF1UDdnZXhUK2FtUm0vZXhRdXZ3QUFnRCthbVJtL2V4UXVQN2dleFQrYW1SbS9leFF1djdnZXhUK2FtUm0vZXhRdVB3QUFnRDltWmhiQWV4UXV2d0FBZ0Q5bVpoYkFleFF1djdnZXhUOW1aaGJBZXhRdVB3QUFnRDltWmhiQWV4UXV2N2dleFQ5bVpoYkFleFF1UDdnZXhUOW1aaGJBZXhRdXZ3QUFnRDltWmhiQWV4UXV2d0FBZ0QrYW1SbS9leFF1djdnZXhUK2FtUm0vZXhRdXZ3QUFnRDltWmhiQWV4UXV2N2dleFQrYW1SbS9leFF1djdnZXhUOW1aaGJBZXhRdVB3QUFnRCthbVJtL2V4UXVQd0FBZ0Q5bVpoYkFleFF1UDdnZXhUOW1aaGJBZXhRdVB3QUFnRCthbVJtL2V4UXVQN2dleFQ5bVpoYkFleFF1UDdnZXhUK2FtUm0vZXhRdXY3Z2V4VCthbVJtL2V4UXVQN2dleFQrYW1SbS9leFF1UDdnZXhUOW1aaGJBZXhRdXY3Z2V4VCthbVJtL2V4UXVQN2dleFQ5bVpoYkFleFF1djdnZXhUOW1aaGJBZXhRdXZ3QUFnRDltWmhiQWV4UXVQd0FBZ0Q5bVpoYkFleFF1UHdBQWdEK2FtUm0vZXhRdXZ3QUFnRDltWmhiQWV4UXVQd0FBZ0QrYW1SbS9leFF1dndBQWdEK2FtUm0vcmtmaHZseVBnaithbWRrL3JrZmhQbHlQZ2orYW1kay9ya2ZoUHRlanNEK2FtZGsvcmtmaHZseVBnaithbWRrL3JrZmhQdGVqc0QrYW1kay9ya2ZodnRlanNEK2FtZGsvcmtmaFBseVBnajhBQUFBL3JrZmh2bHlQZ2o4QUFBQS9ya2ZodnRlanNEOEFBQUEvcmtmaFBseVBnajhBQUFBL3JrZmh2dGVqc0Q4QUFBQS9ya2ZoUHRlanNEOEFBQUEvcmtmaHZseVBnajhBQUFBL3JrZmh2bHlQZ2orYW1kay9ya2ZodnRlanNEK2FtZGsvcmtmaHZseVBnajhBQUFBL3JrZmh2dGVqc0QrYW1kay9ya2ZodnRlanNEOEFBQUEvcmtmaFBseVBnaithbWRrL3JrZmhQbHlQZ2o4QUFBQS9ya2ZoUHRlanNEOEFBQUEvcmtmaFBseVBnaithbWRrL3JrZmhQdGVqc0Q4QUFBQS9ya2ZoUHRlanNEK2FtZGsvcmtmaHZ0ZWpzRCthbWRrL3JrZmhQdGVqc0QrYW1kay9ya2ZoUHRlanNEOEFBQUEvcmtmaHZ0ZWpzRCthbWRrL3JrZmhQdGVqc0Q4QUFBQS9ya2ZodnRlanNEOEFBQUEvcmtmaHZseVBnajhBQUFBL3JrZmhQbHlQZ2o4QUFBQS9ya2ZoUGx5UGdqK2FtZGsvcmtmaHZseVBnajhBQUFBL3JrZmhQbHlQZ2orYW1kay9ya2Zodmx5UGdqK2FtZGsvekVGaXZRYUtmcjl4NkxvOXpFRml2UWFLZnI5eDZMbzl6RUZpdlFhS2ZyOXg2TG85UnVBc3ZRRCtmcisxcFo4OVJ1QXN2UUQrZnIrMXBaODlSdUFzdlFEK2ZyKzFwWjg5eElOaVBUM1VmcitQaTU4OXhJTmlQVDNVZnIrUGk1ODl4SU5pUFQzVWZyK1BpNTg5Y3NJc1BRTFNmcjl2WGJBOWNzSXNQUUxTZnI5dlhiQTljc0lzUFFMU2ZyOXZYYkE5cGRvc3ZiUDFmcjhMNzZJOXBkb3N2YlAxZnI4TDc2STlwZG9zdmJQMWZyOEw3Nkk5ck5vTHZlRTdmNzhRQzQ0OXJOb0x2ZUU3Zjc4UUM0NDlyTm9MdmVFN2Y3OFFDNDQ5aGZ3c1Bhc25mNy9SLzQwOWhmd3NQYXNuZjcvUi80MDloZndzUGFzbmY3L1IvNDA5ME1RTFBmc1RmNy9KK0o0OTBNUUxQZnNUZjcvSitKNDkwTVFMUGZzVGY3L0orSjQ5VVI4TXZTaTVmNytkNlFBOVVSOE12U2k1ZjcrZDZRQTlVUjhNdlNpNWY3K2Q2UUE5V0ZVYnZTS25mNzljRmhJOVdGVWJ2U0tuZjc5Y0ZoSTlXRlVidlNLbmY3OWNGaEk5UWhvTVBldXZmNzlpR3hJOVFob01QZXV2Zjc5aUd4STlRaG9NUGV1dmY3OWlHeEk5amxvYlBiU3ZmNytETXdJOWpsb2JQYlN2ZjcrRE13STlqbG9iUGJTdmY3K0RNd0k5WGxJYnZUdWlmNzhvYnhxOVhsSWJ2VHVpZjc4b2J4cTlYbElidlR1aWY3OG9ieHE5WUFVUXZTU2pmNytjbXlPOVlBVVF2U1NqZjcrY215TzlZQVVRdlNTamY3K2NteU85Nms0YlBZdWNmNzlqbHlPOTZrNGJQWXVjZjc5amx5Tzk2azRiUFl1Y2Y3OWpseU85N2dnUVBYU3BmNy93YWhtOTdnZ1FQWFNwZjcvd2FobTk3Z2dRUFhTcGY3L3dhaG05S3RZUHZWZFBmNzh6OG9POUt0WVB2VmRQZjc4ejhvTzlLdFlQdlZkUGY3OHo4b085QjlRdHZXdFBmNzhLR1hXOUI5UXR2V3RQZjc4S0dYVzlCOVF0dld0UGY3OEtHWFc5cXVBUFBmdGhmNy9kS25XOXF1QVBQZnRoZjcvZEtuVzlxdUFQUGZ0aGY3L2RLblc5aE1BdFBjRXlmNzlXcjRpOWhNQXRQY0V5Zjc5V3I0aTloTUF0UGNFeWY3OVdyNGk5cmxjdHZjZVlmcjhWME1POXJsY3R2Y2VZZnI4VjBNTzlybGN0dmNlWWZyOFYwTU85N1dtcHZlTWVmcjlCdGJTOTdXbXB2ZU1lZnI5QnRiUzk3V21wdmVNZWZyOUJ0YlM5SlhVdFBRN0VmcisxS3JXOUpYVXRQUTdFZnIrMUtyVzlKWFV0UFE3RWZyKzFLclc5WCsyb1BRNWtmYi9idisyOVgrMm9QUTVrZmIvYnYrMjlYKzJvUFE1a2ZiL2J2KzI5QUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBSUFBQUFBQUFBQ0FQd0FBQUlBQUFBQUFBQUNBUHdBQUFJQUFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBSUFBQUFBQUFBQ0FQd0FBQUlBQUFBQUFBQUNBUHdBQUFJQUFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQkFBSUFBd0FFQUFVQUJnQUhBQWdBQ1FBS0FBc0FEQUFOQUE0QUR3QVFBQkVBRWdBVEFCUUFGUUFXQUJjQUdBQVpBQm9BR3dBY0FCMEFIZ0FmQUNBQUlRQWlBQ01BSkFBbEFDWUFKd0FvQUNrQUtnQXJBQ3dBTFFBdUFDOEFNQUF4QURJQU13QTBBRFVBTmdBM0FEZ0FPUUE2QURzQVBBQTlBRDRBUHdCQUFFRUFRZ0JEQUVRQVJRQkdBRWNBU0FCSkFFb0FTd0JNQUUwQVRnQlBBRkFBVVFCU0FGTUFWQUJWQUZZQVZ3QllBRmtBV2dCYkFGd0FYUUJlQUY4QVlBQmhBR0lBWXdCa0FHVUFaZ0JuQUdnQWFRQnFBR3NBYkFCdEFHNEFid0J3QUhFQWNnQnpBSFFBZFFCMkFIY0FlQUI1QUhvQWV3QjhBSDBBZmdCL0FJQUFnUUNDQUlNQWhBQ0ZBSVlBaHdDSUFJa0FpZ0NMQUl3QWpRQ09BSThBcEhDOXZ6MEtWeithbVJsQXBIQzlQejBLVnorYW1SbEFwSEM5UHpNemN6K2FtUmxBcEhDOXZ6MEtWeithbVJsQXBIQzlQek16Y3orYW1SbEFwSEM5dnpNemN6K2FtUmxBcEhDOVB6MEtWei9OekF6QXBIQzl2ejBLVnovTnpBekFwSEM5dnpNemN6L056QXpBcEhDOVB6MEtWei9OekF6QXBIQzl2ek16Y3ovTnpBekFwSEM5UHpNemN6L056QXpBcEhDOXZ6MEtWei9OekF6QXBIQzl2ejBLVnorYW1SbEFwSEM5dnpNemN6K2FtUmxBcEhDOXZ6MEtWei9OekF6QXBIQzl2ek16Y3orYW1SbEFwSEM5dnpNemN6L056QXpBcEhDOVB6MEtWeithbVJsQXBIQzlQejBLVnovTnpBekFwSEM5UHpNemN6L056QXpBcEhDOVB6MEtWeithbVJsQXBIQzlQek16Y3ovTnpBekFwSEM5UHpNemN6K2FtUmxBcEhDOXZ6TXpjeithbVJsQXBIQzlQek16Y3orYW1SbEFwSEM5UHpNemN6L056QXpBcEhDOXZ6TXpjeithbVJsQXBIQzlQek16Y3ovTnpBekFwSEM5dnpNemN6L056QXpBcEhDOXZ6MEtWei9OekF6QXBIQzlQejBLVnovTnpBekFwSEM5UHowS1Z6K2FtUmxBcEhDOXZ6MEtWei9OekF6QXBIQzlQejBLVnorYW1SbEFwSEM5dnowS1Z6K2FtUmxBS1Z3UHZ4K0Zxejk3Rkc2L0tWd1BQeCtGcXo5N0ZHNi9oZXZSUGlsY3p6OTdGRzYvS1Z3UHZ4K0Zxejk3Rkc2L2hldlJQaWxjeno5N0ZHNi9oZXZSdmlsY3p6OTdGRzYvS1Z3UFB4K0ZxeitGNndIQUtWd1B2eCtGcXorRjZ3SEFoZXZSdmlsY3p6K0Y2d0hBS1Z3UFB4K0ZxeitGNndIQWhldlJ2aWxjenorRjZ3SEFoZXZSUGlsY3p6K0Y2d0hBS1Z3UHZ4K0ZxeitGNndIQUtWd1B2eCtGcXo5N0ZHNi9oZXZSdmlsY3p6OTdGRzYvS1Z3UHZ4K0ZxeitGNndIQWhldlJ2aWxjeno5N0ZHNi9oZXZSdmlsY3p6K0Y2d0hBS1Z3UFB4K0Zxejk3Rkc2L0tWd1BQeCtGcXorRjZ3SEFoZXZSUGlsY3p6K0Y2d0hBS1Z3UFB4K0Zxejk3Rkc2L2hldlJQaWxjenorRjZ3SEFoZXZSUGlsY3p6OTdGRzYvaGV2UnZpbGN6ejk3Rkc2L2hldlJQaWxjeno5N0ZHNi9oZXZSUGlsY3p6K0Y2d0hBaGV2UnZpbGN6ejk3Rkc2L2hldlJQaWxjenorRjZ3SEFoZXZSdmlsY3p6K0Y2d0hBS1Z3UHZ4K0ZxeitGNndIQUtWd1BQeCtGcXorRjZ3SEFLVndQUHgrRnF6OTdGRzYvS1Z3UHZ4K0ZxeitGNndIQUtWd1BQeCtGcXo5N0ZHNi9LVndQdngrRnF6OTdGRzYvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBSUFBQUFBQUFBQ0FQd0FBQUlBQUFBQUFBQUNBUHdBQUFJQUFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvcktoaHZ3SEg4VDRBQUFBQXJLaGh2d0hIOFQ0QUFBQUFyS2hodndISDhUNEFBQUFBcktoaHZ3SEg4VDRBQUFBQXJLaGh2d0hIOFQ0QUFBQUFyS2hodndISDhUNEFBQUFBcktoaFB3SEg4VDRBQUFBQXJLaGhQd0hIOFQ0QUFBQUFyS2hoUHdISDhUNEFBQUFBcktoaFB3SEg4VDRBQUFBQXJLaGhQd0hIOFQ0QUFBQUFyS2hoUHdISDhUNEFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQkFBSUFBd0FFQUFVQUJnQUhBQWdBQ1FBS0FBc0FEQUFOQUE0QUR3QVFBQkVBRWdBVEFCUUFGUUFXQUJjQUdBQVpBQm9BR3dBY0FCMEFIZ0FmQUNBQUlRQWlBQ01BSkFBbEFDWUFKd0FvQUNrQUtnQXJBQ3dBTFFBdUFDOEFNQUF4QURJQU13QTBBRFVBTmdBM0FEZ0FPUUE2QURzQVBBQTlBRDRBUHdCQUFFRUFRZ0JEQUVRQVJRQkdBRWNBemN6TVBacVpXVDhmaFd1L0tWeVBQUUFBeUVBZmhXdS8zN2FHUFFBQXlFQVpaR1cvemN6TVBacVpXVDhmaFd1LzM3YUdQUUFBeUVBWlpHVy85WExBUFpxWldUK293MksvOVhMQVBacVpXVCtvdzJLLzM3YUdQUUFBeUVBWlpHVy82S05iUFFBQXlFQlNBR0MvOVhMQVBacVpXVCtvdzJLLzZLTmJQUUFBeUVCU0FHQy95dUtjUFpxWldUK01FRnUveXVLY1BacVpXVCtNRUZ1LzZLTmJQUUFBeUVCU0FHQy9LVndQUFFBQXlFQTJBRnkveXVLY1BacVpXVCtNRUZ1L0tWd1BQUUFBeUVBMkFGeS96Y3hNUFpxWldUK0pXVlcvemN4TVBacVpXVCtKV1ZXL0tWd1BQUUFBeUVBMkFGeS9WQ2RIUEFBQXlFQkwzMW0vemN4TVBacVpXVCtKV1ZXL1ZDZEhQQUFBeUVCTDMxbS9xa0NPUEpxWldUOFZUMUsvcWtDT1BKcVpXVDhWVDFLL1ZDZEhQQUFBeUVCTDMxbS9WQ2RIdkFBQXlFQkwzMW0vcWtDT1BKcVpXVDhWVDFLL1ZDZEh2QUFBeUVCTDMxbS9xa0NPdkpxWldUOFZUMUsvcWtDT3ZKcVpXVDhWVDFLL1ZDZEh2QUFBeUVCTDMxbS9LVndQdlFBQXlFQTJBRnkvcWtDT3ZKcVpXVDhWVDFLL0tWd1B2UUFBeUVBMkFGeS96Y3hNdlpxWldUK0pXVlcvemN4TXZacVpXVCtKV1ZXL0tWd1B2UUFBeUVBMkFGeS82S05idlFBQXlFQlNBR0MvemN4TXZacVpXVCtKV1ZXLzZLTmJ2UUFBeUVCU0FHQy95dUtjdlpxWldUK01FRnUveXVLY3ZacVpXVCtNRUZ1LzZLTmJ2UUFBeUVCU0FHQy8zN2FHdlFBQXlFQVpaR1cveXVLY3ZacVpXVCtNRUZ1LzM3YUd2UUFBeUVBWlpHVy85WExBdlpxWldUK293MksvOVhMQXZacVpXVCtvdzJLLzM3YUd2UUFBeUVBWlpHVy9LVnlQdlFBQXlFQWZoV3UvOVhMQXZacVpXVCtvdzJLL0tWeVB2UUFBeUVBZmhXdS96Y3pNdlpxWldUOGZoV3UvemN6TXZacVpXVDhmaFd1L0tWeVB2UUFBeUVBZmhXdS8zN2FHdlFBQXlFQWxwbkcvemN6TXZacVpXVDhmaFd1LzM3YUd2UUFBeUVBbHBuRy85WExBdlpxWldUK1ZSblMvOVhMQXZacVpXVCtWUm5TLzM3YUd2UUFBeUVBbHBuRy82S05idlFBQXlFRHNDWGUvOVhMQXZacVpXVCtWUm5TLzZLTmJ2UUFBeUVEc0NYZS95dUtjdlpxWldUK3grWHUveXVLY3ZacVpXVCt4K1h1LzZLTmJ2UUFBeUVEc0NYZS9LVndQdlFBQXlFQUhDbnUveXVLY3ZacVpXVCt4K1h1L0tWd1B2UUFBeUVBSENudS96Y3hNdlpxWldUOWEySUMvemN4TXZacVpXVDlhMklDL0tWd1B2UUFBeUVBSENudS9WQ2RIdkFBQXlFRHlLbjIvemN4TXZacVpXVDlhMklDL1ZDZEh2QUFBeUVEeUtuMi9xa0NPdkpxWldUK1VYWUsvcWtDT3ZKcVpXVCtVWFlLL1ZDZEh2QUFBeUVEeUtuMi9WQ2RIUEFBQXlFRHlLbjIvcWtDT3ZKcVpXVCtVWFlLL1ZDZEhQQUFBeUVEeUtuMi9xa0NPUEpxWldUK1VYWUsvcWtDT1BKcVpXVCtVWFlLL1ZDZEhQQUFBeUVEeUtuMi9LVndQUFFBQXlFQUhDbnUvcWtDT1BKcVpXVCtVWFlLL0tWd1BQUUFBeUVBSENudS96Y3hNUFpxWldUOWEySUMvemN4TVBacVpXVDlhMklDL0tWd1BQUUFBeUVBSENudS82S05iUFFBQXlFRHNDWGUvemN4TVBacVpXVDlhMklDLzZLTmJQUUFBeUVEc0NYZS95dUtjUFpxWldUK3grWHUveXVLY1BacVpXVCt4K1h1LzZLTmJQUUFBeUVEc0NYZS8zN2FHUFFBQXlFQWxwbkcveXVLY1BacVpXVCt4K1h1LzM3YUdQUUFBeUVBbHBuRy85WExBUFpxWldUK1ZSblMvOVhMQVBacVpXVCtWUm5TLzM3YUdQUUFBeUVBbHBuRy9LVnlQUFFBQXlFQWZoV3UvOVhMQVBacVpXVCtWUm5TL0tWeVBQUUFBeUVBZmhXdS96Y3pNUFpxWldUOGZoV3UvMzdhR1BRQUF5RUFscG5HLzZLTmJQUUFBeUVEc0NYZS9LVndQUFFBQXlFQUhDbnUvMzdhR1BRQUF5RUFscG5HL0tWd1BQUUFBeUVBSENudS9WQ2RIUEFBQXlFRHlLbjIvMzdhR1BRQUF5RUFscG5HL1ZDZEhQQUFBeUVEeUtuMi9WQ2RIdkFBQXlFRHlLbjIvMzdhR1BRQUF5RUFscG5HL1ZDZEh2QUFBeUVEeUtuMi9LVndQdlFBQXlFQUhDbnUvMzdhR1BRQUF5RUFscG5HL0tWd1B2UUFBeUVBSENudS82S05idlFBQXlFRHNDWGUvMzdhR1BRQUF5RUFscG5HLzZLTmJ2UUFBeUVEc0NYZS8zN2FHdlFBQXlFQWxwbkcvMzdhR1BRQUF5RUFscG5HLzM3YUd2UUFBeUVBbHBuRy9LVnlQdlFBQXlFQWZoV3UvMzdhR1BRQUF5RUFscG5HL0tWeVB2UUFBeUVBZmhXdS8zN2FHdlFBQXlFQVpaR1cvMzdhR1BRQUF5RUFscG5HLzM3YUd2UUFBeUVBWlpHVy82S05idlFBQXlFQlNBR0MvMzdhR1BRQUF5RUFscG5HLzZLTmJ2UUFBeUVCU0FHQy9LVndQdlFBQXlFQTJBRnkvMzdhR1BRQUF5RUFscG5HL0tWd1B2UUFBeUVBMkFGeS9WQ2RIdkFBQXlFQkwzMW0vMzdhR1BRQUF5RUFscG5HL1ZDZEh2QUFBeUVCTDMxbS9WQ2RIUEFBQXlFQkwzMW0vMzdhR1BRQUF5RUFscG5HL1ZDZEhQQUFBeUVCTDMxbS9LVndQUFFBQXlFQTJBRnkvMzdhR1BRQUF5RUFscG5HL0tWd1BQUUFBeUVBMkFGeS82S05iUFFBQXlFQlNBR0MvMzdhR1BRQUF5RUFscG5HLzZLTmJQUUFBeUVCU0FHQy8zN2FHUFFBQXlFQVpaR1cvMzdhR1BRQUF5RUFscG5HLzM3YUdQUUFBeUVBWlpHVy9LVnlQUFFBQXlFQWZoV3UvemN6TVBacVpXVDhmaFd1LzlYTEFQWnFaV1Qrb3cySy95dUtjUFpxWldUK01FRnUvemN6TVBacVpXVDhmaFd1L3l1S2NQWnFaV1QrTUVGdS96Y3hNUFpxWldUK0pXVlcvemN6TVBacVpXVDhmaFd1L3pjeE1QWnFaV1QrSldWVy9xa0NPUEpxWldUOFZUMUsvemN6TVBacVpXVDhmaFd1L3FrQ09QSnFaV1Q4VlQxSy9xa0NPdkpxWldUOFZUMUsvemN6TVBacVpXVDhmaFd1L3FrQ092SnFaV1Q4VlQxSy96Y3hNdlpxWldUK0pXVlcvemN6TVBacVpXVDhmaFd1L3pjeE12WnFaV1QrSldWVy95dUtjdlpxWldUK01FRnUvemN6TVBacVpXVDhmaFd1L3l1S2N2WnFaV1QrTUVGdS85WExBdlpxWldUK293MksvemN6TVBacVpXVDhmaFd1LzlYTEF2WnFaV1Qrb3cySy96Y3pNdlpxWldUOGZoV3UvemN6TVBacVpXVDhmaFd1L3pjek12WnFaV1Q4ZmhXdS85WExBdlpxWldUK1ZSblMvemN6TVBacVpXVDhmaFd1LzlYTEF2WnFaV1QrVlJuUy95dUtjdlpxWldUK3grWHUvemN6TVBacVpXVDhmaFd1L3l1S2N2WnFaV1QreCtYdS96Y3hNdlpxWldUOWEySUMvemN6TVBacVpXVDhmaFd1L3pjeE12WnFaV1Q5YTJJQy9xa0NPdkpxWldUK1VYWUsvemN6TVBacVpXVDhmaFd1L3FrQ092SnFaV1QrVVhZSy9xa0NPUEpxWldUK1VYWUsvemN6TVBacVpXVDhmaFd1L3FrQ09QSnFaV1QrVVhZSy96Y3hNUFpxWldUOWEySUMvemN6TVBacVpXVDhmaFd1L3pjeE1QWnFaV1Q5YTJJQy95dUtjUFpxWldUK3grWHUvemN6TVBacVpXVDhmaFd1L3l1S2NQWnFaV1QreCtYdS85WExBUFpxWldUK1ZSblMvQUFBQUFJL0NkVDlJNFRyQWo4TDF2T3hSbUVCSTRUckFJRHNIdmV4Um1FQVp5VG5BQUFBQUFJL0NkVDlJNFRyQUlEc0h2ZXhSbUVBWnlUbkFtUmVldTQvQ2RULzlJRG5BbVJlZXU0L0NkVC85SURuQUlEc0h2ZXhSbUVBWnlUbkFTc3NxdmV4Um1FQzEwampBbVJlZXU0L0NkVC85SURuQVNzc3F2ZXhSbUVDMTBqakFPMU9adkkvQ2RUL0VsamZBTzFPWnZJL0NkVC9FbGpmQVNzc3F2ZXhSbUVDMTBqakFya2RodmV4Um1FRFZHempBTzFPWnZJL0NkVC9FbGpmQXJrZGh2ZXhSbUVEVkd6akFDdGNqdlkvQ2RUOHFjamJBQ3RjanZZL0NkVDhxY2piQXJrZGh2ZXhSbUVEVkd6akE5UTZTdmV4Um1FQ0h1amZBQ3RjanZZL0NkVDhxY2piQTlRNlN2ZXhSbUVDSHVqZkF0V09IdlkvQ2RUOTUxalhBdFdPSHZZL0NkVDk1MWpYQTlRNlN2ZXhSbUVDSHVqZkFINSsxdmV4Um1FQ0h1amZBdFdPSHZZL0NkVDk1MWpYQUg1KzF2ZXhSbUVDSHVqZkFYMHJBdlkvQ2RUOTUxalhBWDByQXZZL0NkVDk1MWpYQUg1KzF2ZXhSbUVDSHVqZkFQUXJYdmV4Um1FRFZHempBWDByQXZZL0NkVDk1MWpYQVBRclh2ZXhSbUVEVkd6akFqOEwxdlkvQ2RUOHFjamJBajhMMXZZL0NkVDhxY2piQVBRclh2ZXhSbUVEVkd6akFiMGp5dmV4Um1FQzEwampBajhMMXZZL0NkVDhxY2piQWIwanl2ZXhSbUVDMTBqakFvNndRdm8vQ2RUL0VsamZBbzZ3UXZvL0NkVC9FbGpmQWIwanl2ZXhSbUVDMTBqakFRZ2dDdnV4Um1FQVp5VG5BbzZ3UXZvL0NkVC9FbGpmQVFnZ0N2dXhSbUVBWnlUbkFUZVlldm8vQ2RULzlJRG5BVGVZZXZvL0NkVC85SURuQVFnZ0N2dXhSbUVBWnlUbkF1QjRGdnV4Um1FQkk0VHJBVGVZZXZvL0NkVC85SURuQXVCNEZ2dXhSbUVCSTRUckFDdGNqdm8vQ2RUOUk0VHJBQ3RjanZvL0NkVDlJNFRyQXVCNEZ2dXhSbUVCSTRUckFRZ2dDdnV4Um1FQjMrVHZBQ3RjanZvL0NkVDlJNFRyQVFnZ0N2dXhSbUVCMytUdkFUZVlldm8vQ2RUK1RvVHpBVGVZZXZvL0NkVCtUb1R6QVFnZ0N2dXhSbUVCMytUdkFiMGp5dmV4Um1FRGE3enpBVGVZZXZvL0NkVCtUb1R6QWIwanl2ZXhSbUVEYTd6ekFvNndRdm8vQ2RUL0xLejdBbzZ3UXZvL0NkVC9MS3o3QWIwanl2ZXhSbUVEYTd6ekFQUXJYdmV4Um1FQzZwajNBbzZ3UXZvL0NkVC9MS3o3QVBRclh2ZXhSbUVDNnBqM0FqOEwxdlkvQ2RUOW1VRC9BajhMMXZZL0NkVDltVUQvQVBRclh2ZXhSbUVDNnBqM0FINSsxdmV4Um1FQUpDRDdBajhMMXZZL0NkVDltVUQvQUg1KzF2ZXhSbUVBSkNEN0FYMHJBdlkvQ2RUOFc3RC9BWDByQXZZL0NkVDhXN0QvQUg1KzF2ZXhSbUVBSkNEN0E5UTZTdmV4Um1FQUpDRDdBWDByQXZZL0NkVDhXN0QvQTlRNlN2ZXhSbUVBSkNEN0F0V09IdlkvQ2RUOFc3RC9BdFdPSHZZL0NkVDhXN0QvQTlRNlN2ZXhSbUVBSkNEN0Fya2RodmV4Um1FQzZwajNBdFdPSHZZL0NkVDhXN0QvQXJrZGh2ZXhSbUVDNnBqM0FDdGNqdlkvQ2RUOW1VRC9BQ3RjanZZL0NkVDltVUQvQXJrZGh2ZXhSbUVDNnBqM0FTc3NxdmV4Um1FRGE3enpBQ3RjanZZL0NkVDltVUQvQVNzc3F2ZXhSbUVEYTd6ekFPMU9adkkvQ2RUL0xLejdBTzFPWnZJL0NkVC9MS3o3QVNzc3F2ZXhSbUVEYTd6ekFJRHNIdmV4Um1FQjMrVHZBTzFPWnZJL0NkVC9MS3o3QUlEc0h2ZXhSbUVCMytUdkFtUmVldTQvQ2RUK1RvVHpBbVJlZXU0L0NkVCtUb1R6QUlEc0h2ZXhSbUVCMytUdkFqOEwxdk94Um1FQkk0VHJBbVJlZXU0L0NkVCtUb1R6QWo4TDF2T3hSbUVCSTRUckFBQUFBQUkvQ2RUOUk0VHJBSURzSHZleFJtRUIzK1R2QVNzc3F2ZXhSbUVEYTd6ekFya2RodmV4Um1FQzZwajNBSURzSHZleFJtRUIzK1R2QXJrZGh2ZXhSbUVDNnBqM0E5UTZTdmV4Um1FQUpDRDdBSURzSHZleFJtRUIzK1R2QTlRNlN2ZXhSbUVBSkNEN0FINSsxdmV4Um1FQUpDRDdBSURzSHZleFJtRUIzK1R2QUg1KzF2ZXhSbUVBSkNEN0FQUXJYdmV4Um1FQzZwajNBSURzSHZleFJtRUIzK1R2QVBRclh2ZXhSbUVDNnBqM0FiMGp5dmV4Um1FRGE3enpBSURzSHZleFJtRUIzK1R2QWIwanl2ZXhSbUVEYTd6ekFRZ2dDdnV4Um1FQjMrVHZBSURzSHZleFJtRUIzK1R2QVFnZ0N2dXhSbUVCMytUdkF1QjRGdnV4Um1FQkk0VHJBSURzSHZleFJtRUIzK1R2QXVCNEZ2dXhSbUVCSTRUckFRZ2dDdnV4Um1FQVp5VG5BSURzSHZleFJtRUIzK1R2QVFnZ0N2dXhSbUVBWnlUbkFiMGp5dmV4Um1FQzEwampBSURzSHZleFJtRUIzK1R2QWIwanl2ZXhSbUVDMTBqakFQUXJYdmV4Um1FRFZHempBSURzSHZleFJtRUIzK1R2QVBRclh2ZXhSbUVEVkd6akFINSsxdmV4Um1FQ0h1amZBSURzSHZleFJtRUIzK1R2QUg1KzF2ZXhSbUVDSHVqZkE5UTZTdmV4Um1FQ0h1amZBSURzSHZleFJtRUIzK1R2QTlRNlN2ZXhSbUVDSHVqZkFya2RodmV4Um1FRFZHempBSURzSHZleFJtRUIzK1R2QXJrZGh2ZXhSbUVEVkd6akFTc3NxdmV4Um1FQzEwampBSURzSHZleFJtRUIzK1R2QVNzc3F2ZXhSbUVDMTBqakFJRHNIdmV4Um1FQVp5VG5BSURzSHZleFJtRUIzK1R2QUlEc0h2ZXhSbUVBWnlUbkFqOEwxdk94Um1FQkk0VHJBQUFBQUFJL0NkVDlJNFRyQW1SZWV1NC9DZFQvOUlEbkFPMU9adkkvQ2RUL0VsamZBQUFBQUFJL0NkVDlJNFRyQU8xT1p2SS9DZFQvRWxqZkFDdGNqdlkvQ2RUOHFjamJBQUFBQUFJL0NkVDlJNFRyQUN0Y2p2WS9DZFQ4cWNqYkF0V09IdlkvQ2RUOTUxalhBQUFBQUFJL0NkVDlJNFRyQXRXT0h2WS9DZFQ5NTFqWEFYMHJBdlkvQ2RUOTUxalhBQUFBQUFJL0NkVDlJNFRyQVgwckF2WS9DZFQ5NTFqWEFqOEwxdlkvQ2RUOHFjamJBQUFBQUFJL0NkVDlJNFRyQWo4TDF2WS9DZFQ4cWNqYkFvNndRdm8vQ2RUL0VsamZBQUFBQUFJL0NkVDlJNFRyQW82d1F2by9DZFQvRWxqZkFUZVlldm8vQ2RULzlJRG5BQUFBQUFJL0NkVDlJNFRyQVRlWWV2by9DZFQvOUlEbkFDdGNqdm8vQ2RUOUk0VHJBQUFBQUFJL0NkVDlJNFRyQUN0Y2p2by9DZFQ5STRUckFUZVlldm8vQ2RUK1RvVHpBQUFBQUFJL0NkVDlJNFRyQVRlWWV2by9DZFQrVG9UekFvNndRdm8vQ2RUL0xLejdBQUFBQUFJL0NkVDlJNFRyQW82d1F2by9DZFQvTEt6N0FqOEwxdlkvQ2RUOW1VRC9BQUFBQUFJL0NkVDlJNFRyQWo4TDF2WS9DZFQ5bVVEL0FYMHJBdlkvQ2RUOFc3RC9BQUFBQUFJL0NkVDlJNFRyQVgwckF2WS9DZFQ4VzdEL0F0V09IdlkvQ2RUOFc3RC9BQUFBQUFJL0NkVDlJNFRyQXRXT0h2WS9DZFQ4VzdEL0FDdGNqdlkvQ2RUOW1VRC9BQUFBQUFJL0NkVDlJNFRyQUN0Y2p2WS9DZFQ5bVVEL0FPMU9adkkvQ2RUL0xLejdBQUFBQUFJL0NkVDlJNFRyQU8xT1p2SS9DZFQvTEt6N0FtUmVldTQvQ2RUK1RvVHpBQ3RlanZUTXpVMEN1UjJHL0g0VUxRRE16VTBDdVIyRy9INFVMUU94UldFQ3VSMkcvQ3RlanZUTXpVMEN1UjJHL0g0VUxRT3hSV0VDdVIyRy9DdGVqdmV4UldFQ3VSMkcvSDRVTFFETXpVMEFBQUlDL0N0ZWp2VE16VTBBQUFJQy9DdGVqdmV4UldFQUFBSUMvSDRVTFFETXpVMEFBQUlDL0N0ZWp2ZXhSV0VBQUFJQy9INFVMUU94UldFQUFBSUMvQ3RlanZUTXpVMEFBQUlDL0N0ZWp2VE16VTBDdVIyRy9DdGVqdmV4UldFQ3VSMkcvQ3RlanZUTXpVMEFBQUlDL0N0ZWp2ZXhSV0VDdVIyRy9DdGVqdmV4UldFQUFBSUMvSDRVTFFETXpVMEN1UjJHL0g0VUxRRE16VTBBQUFJQy9INFVMUU94UldFQUFBSUMvSDRVTFFETXpVMEN1UjJHL0g0VUxRT3hSV0VBQUFJQy9INFVMUU94UldFQ3VSMkcvQ3RlanZleFJXRUN1UjJHL0g0VUxRT3hSV0VDdVIyRy9INFVMUU94UldFQUFBSUMvQ3RlanZleFJXRUN1UjJHL0g0VUxRT3hSV0VBQUFJQy9DdGVqdmV4UldFQUFBSUMvQ3RlanZUTXpVMEFBQUlDL0g0VUxRRE16VTBBQUFJQy9INFVMUURNelUwQ3VSMkcvQ3RlanZUTXpVMEFBQUlDL0g0VUxRRE16VTBDdVIyRy9DdGVqdlRNelUwQ3VSMkcvS1Z3UHZwcVpHVUNhbVRuQUN0ZWpQNXFaR1VDYW1UbkFDdGVqUDFLNEhrQ2FtVG5BS1Z3UHZwcVpHVUNhbVRuQUN0ZWpQMUs0SGtDYW1UbkFLVndQdmxLNEhrQ2FtVG5BQ3RlalA1cVpHVUFBQUVEQUtWd1B2cHFaR1VBQUFFREFLVndQdmxLNEhrQUFBRURBQ3RlalA1cVpHVUFBQUVEQUtWd1B2bEs0SGtBQUFFREFDdGVqUDFLNEhrQUFBRURBS1Z3UHZwcVpHVUFBQUVEQUtWd1B2cHFaR1VDYW1UbkFLVndQdmxLNEhrQ2FtVG5BS1Z3UHZwcVpHVUFBQUVEQUtWd1B2bEs0SGtDYW1UbkFLVndQdmxLNEhrQUFBRURBQ3RlalA1cVpHVUNhbVRuQUN0ZWpQNXFaR1VBQUFFREFDdGVqUDFLNEhrQUFBRURBQ3RlalA1cVpHVUNhbVRuQUN0ZWpQMUs0SGtBQUFFREFDdGVqUDFLNEhrQ2FtVG5BS1Z3UHZsSzRIa0NhbVRuQUN0ZWpQMUs0SGtDYW1UbkFDdGVqUDFLNEhrQUFBRURBS1Z3UHZsSzRIa0NhbVRuQUN0ZWpQMUs0SGtBQUFFREFLVndQdmxLNEhrQUFBRURBS1Z3UHZwcVpHVUFBQUVEQUN0ZWpQNXFaR1VBQUFFREFDdGVqUDVxWkdVQ2FtVG5BS1Z3UHZwcVpHVUFBQUVEQUN0ZWpQNXFaR1VDYW1UbkFLVndQdnBxWkdVQ2FtVG5BQ3RjanZZL0N0VCthbWFGQWo4SjFQWS9DdFQrYW1hRkFqOEoxUFFBQXdEK2FtYUZBQ3RjanZZL0N0VCthbWFGQWo4SjFQUUFBd0QrYW1hRkFDdGNqdlFBQXdEK2FtYUZBajhKMVBZL0N0VC9Oekd4QUN0Y2p2WS9DdFQvTnpHeEFDdGNqdlFBQXdEL056R3hBajhKMVBZL0N0VC9Oekd4QUN0Y2p2UUFBd0QvTnpHeEFqOEoxUFFBQXdEL056R3hBQ3RjanZZL0N0VC9Oekd4QUN0Y2p2WS9DdFQrYW1hRkFDdGNqdlFBQXdEK2FtYUZBQ3RjanZZL0N0VC9Oekd4QUN0Y2p2UUFBd0QrYW1hRkFDdGNqdlFBQXdEL056R3hBajhKMVBZL0N0VCthbWFGQWo4SjFQWS9DdFQvTnpHeEFqOEoxUFFBQXdEL056R3hBajhKMVBZL0N0VCthbWFGQWo4SjFQUUFBd0QvTnpHeEFqOEoxUFFBQXdEK2FtYUZBQ3RjanZRQUF3RCthbWFGQWo4SjFQUUFBd0QrYW1hRkFqOEoxUFFBQXdEL056R3hBQ3RjanZRQUF3RCthbWFGQWo4SjFQUUFBd0QvTnpHeEFDdGNqdlFBQXdEL056R3hBQ3RjanZZL0N0VC9Oekd4QWo4SjFQWS9DdFQvTnpHeEFqOEoxUFkvQ3RUK2FtYUZBQ3RjanZZL0N0VC9Oekd4QWo4SjFQWS9DdFQrYW1hRkFDdGNqdlkvQ3RUK2FtYUZBL2Y1L1A2a0t0anNBQUFBQS9mNS9QNmtLdGpzQUFBQUF2NDV3UDZrS3RqdVRISzgrL2Y1L1A2a0t0anNBQUFBQXY0NXdQNmtLdGp1VEhLOCt2NDV3UDZrS3RqdVRISzgrdjQ1d1A2a0t0anVUSEs4K3Y0NXdQNmtLdGp1VEhLOCt0eHBFUDZrS3Rqc1VqU1EvdjQ1d1A2a0t0anVUSEs4K3R4cEVQNmtLdGpzVWpTUS90eHBFUDZrS3Rqc1VqU1EvdHhwRVA2a0t0anNValNRL3R4cEVQNmtLdGpzVWpTUS8vZjcvUHFrS3RqdjNzbDAvdHhwRVA2a0t0anNValNRLy9mNy9QcWtLdGp2M3NsMC8vZjcvUHFrS3RqdjNzbDAvL2Y3L1Bxa0t0anYzc2wwLy9mNy9QcWtLdGp2M3NsMC9JTkF4UHFrS3RqdGRHM3cvL2Y3L1Bxa0t0anYzc2wwL0lOQXhQcWtLdGp0ZEczdy9JTkF4UHFrS3RqdGRHM3cvSU5BeFBxa0t0anRkRzN3L0lOQXhQcWtLdGp0ZEczdy9JTkF4dnFrS3RqdGRHM3cvSU5BeFBxa0t0anRkRzN3L0lOQXh2cWtLdGp0ZEczdy9JTkF4dnFrS3RqdGRHM3cvSU5BeHZxa0t0anRkRzN3L0lOQXh2cWtLdGp0ZEczdy8vZjcvdnFrS3RqdjNzbDAvSU5BeHZxa0t0anRkRzN3Ly9mNy92cWtLdGp2M3NsMC8vZjcvdnFrS3RqdjNzbDAvL2Y3L3Zxa0t0anYzc2wwLy9mNy92cWtLdGp2M3NsMC90eHBFdjZrS3Rqc1VqU1EvL2Y3L3Zxa0t0anYzc2wwL3R4cEV2NmtLdGpzVWpTUS90eHBFdjZrS3Rqc1VqU1EvdHhwRXY2a0t0anNValNRL3R4cEV2NmtLdGpzVWpTUS92NDV3djZrS3RqdVRISzgrdHhwRXY2a0t0anNValNRL3Y0NXd2NmtLdGp1VEhLOCt2NDV3djZrS3RqdVRISzgrdjQ1d3Y2a0t0anVUSEs4K3Y0NXd2NmtLdGp1VEhLOCsvZjUvdjZrS3RqdWpNQTBsdjQ1d3Y2a0t0anVUSEs4Ky9mNS92NmtLdGp1ak1BMGwvZjUvdjZrS3RqdWpNQTBsL2Y1L3Y2a0t0anVqTUEwbC9mNS92NmtLdGp1ak1BMGx2NDV3djZrS3RqdVRISysrL2Y1L3Y2a0t0anVqTUEwbHY0NXd2NmtLdGp1VEhLKyt2NDV3djZrS3RqdVRISysrdjQ1d3Y2a0t0anVUSEsrK3Y0NXd2NmtLdGp1VEhLKyt0eHBFdjZrS3Rqc1VqU1MvdjQ1d3Y2a0t0anVUSEsrK3R4cEV2NmtLdGpzVWpTUy90eHBFdjZrS3Rqc1VqU1MvdHhwRXY2a0t0anNValNTL3R4cEV2NmtLdGpzVWpTUy8vZjcvdnFrS3RqdjNzbDIvdHhwRXY2a0t0anNValNTLy9mNy92cWtLdGp2M3NsMi8vZjcvdnFrS3RqdjNzbDIvL2Y3L3Zxa0t0anYzc2wyLy9mNy92cWtLdGp2M3NsMi9JTkF4dnFrS3RqdGRHM3kvL2Y3L3Zxa0t0anYzc2wyL0lOQXh2cWtLdGp0ZEczeS9JTkF4dnFrS3RqdGRHM3kvSU5BeHZxa0t0anRkRzN5L0lOQXh2cWtLdGp0ZEczeS9JTkF4UHFrS3RqdGRHM3kvSU5BeHZxa0t0anRkRzN5L0lOQXhQcWtLdGp0ZEczeS9JTkF4UHFrS3RqdGRHM3kvSU5BeFBxa0t0anRkRzN5L0lOQXhQcWtLdGp0ZEczeS8vZjcvUHFrS3RqdjNzbDIvSU5BeFBxa0t0anRkRzN5Ly9mNy9QcWtLdGp2M3NsMi8vZjcvUHFrS3RqdjNzbDIvL2Y3L1Bxa0t0anYzc2wyLy9mNy9QcWtLdGp2M3NsMi90eHBFUDZrS3Rqc1VqU1MvL2Y3L1Bxa0t0anYzc2wyL3R4cEVQNmtLdGpzVWpTUy90eHBFUDZrS3Rqc1VqU1MvdHhwRVA2a0t0anNValNTL3R4cEVQNmtLdGpzVWpTUy92NDV3UDZrS3RqdVRISysrdHhwRVA2a0t0anNValNTL3Y0NXdQNmtLdGp1VEhLKyt2NDV3UDZrS3RqdVRISysrdjQ1d1A2a0t0anVUSEsrK3Y0NXdQNmtLdGp1VEhLKysvZjUvUDZrS3Rqc0FBQUFBdjQ1d1A2a0t0anVUSEsrKy9mNS9QNmtLdGpzQUFBQUEvZjUvUDZrS3Rqc0FBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFDQUFBQUFBQUFBZ0Q4QUFBQ0FBQUFBQUFBQWdEOEFBQUNBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQWdBQUFnTDhBQUFBQUFBQUFnQUFBZ0w4QUFBQUFBQUFBZ0FBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBOWYxL1ArVlhBVHdBQUFBQTlmMS9QK1ZYQVR3QUFBQUF4NDF3UCtWWEFUemVHNjgrOWYxL1ArVlhBVHdBQUFBQXg0MXdQK1ZYQVR6ZUc2OCt4NDF3UCtWWEFUemVHNjgreDQxd1ArVlhBVHplRzY4K3g0MXdQK1ZYQVR6ZUc2OCs3UmxFUCtWWEFUeHJqQ1EveDQxd1ArVlhBVHplRzY4KzdSbEVQK1ZYQVR4cmpDUS83UmxFUCtWWEFUeHJqQ1EvN1JsRVArVlhBVHhyakNRLzdSbEVQK1ZYQVR4cmpDUS85ZjMvUHVWWEFUd1NzbDAvN1JsRVArVlhBVHhyakNRLzlmMy9QdVZYQVR3U3NsMC85ZjMvUHVWWEFUd1NzbDAvOWYzL1B1VlhBVHdTc2wwLzlmMy9QdVZYQVR3U3NsMC9hYzh4UHVWWEFUeGFHbncvOWYzL1B1VlhBVHdTc2wwL2FjOHhQdVZYQVR4YUdudy9hYzh4UHVWWEFUeGFHbncvYWM4eFB1VlhBVHhhR253L2FjOHhQdVZYQVR4YUdudy9hYzh4dnVWWEFUeGFHbncvYWM4eFB1VlhBVHhhR253L2FjOHh2dVZYQVR4YUdudy9hYzh4dnVWWEFUeGFHbncvYWM4eHZ1VlhBVHhhR253L2FjOHh2dVZYQVR4YUdudy85ZjMvdnVWWEFUd1NzbDAvYWM4eHZ1VlhBVHhhR253LzlmMy92dVZYQVR3U3NsMC85ZjMvdnVWWEFUd1NzbDAvOWYzL3Z1VlhBVHdTc2wwLzlmMy92dVZYQVR3U3NsMC83UmxFditWWEFUeHJqQ1EvOWYzL3Z1VlhBVHdTc2wwLzdSbEV2K1ZYQVR4cmpDUS83UmxFditWWEFUeHJqQ1EvN1JsRXYrVlhBVHhyakNRLzdSbEV2K1ZYQVR4cmpDUS94NDF3ditWWEFUemVHNjgrN1JsRXYrVlhBVHhyakNRL3g0MXd2K1ZYQVR6ZUc2OCt4NDF3ditWWEFUemVHNjgreDQxd3YrVlhBVHplRzY4K3g0MXd2K1ZYQVR6ZUc2OCs5ZjEvditWWEFUd1JNQTBseDQxd3YrVlhBVHplRzY4KzlmMS92K1ZYQVR3Uk1BMGw5ZjEvditWWEFUd1JNQTBsOWYxL3YrVlhBVHdSTUEwbDlmMS92K1ZYQVR3Uk1BMGx4NDF3ditWWEFUemVHNisrOWYxL3YrVlhBVHdSTUEwbHg0MXd2K1ZYQVR6ZUc2Kyt4NDF3ditWWEFUemVHNisreDQxd3YrVlhBVHplRzYrK3g0MXd2K1ZYQVR6ZUc2Kys3UmxFditWWEFUeHJqQ1MveDQxd3YrVlhBVHplRzYrKzdSbEV2K1ZYQVR4cmpDUy83UmxFditWWEFUeHJqQ1MvN1JsRXYrVlhBVHhyakNTLzdSbEV2K1ZYQVR4cmpDUy85ZjMvdnVWWEFUd1NzbDIvN1JsRXYrVlhBVHhyakNTLzlmMy92dVZYQVR3U3NsMi85ZjMvdnVWWEFUd1NzbDIvOWYzL3Z1VlhBVHdTc2wyLzlmMy92dVZYQVR3U3NsMi9hYzh4dnVWWEFUeGFHbnkvOWYzL3Z1VlhBVHdTc2wyL2FjOHh2dVZYQVR4YUdueS9hYzh4dnVWWEFUeGFHbnkvYWM4eHZ1VlhBVHhhR255L2FjOHh2dVZYQVR4YUdueS9hYzh4UHVWWEFUeGFHbnkvYWM4eHZ1VlhBVHhhR255L2FjOHhQdVZYQVR4YUdueS9hYzh4UHVWWEFUeGFHbnkvYWM4eFB1VlhBVHhhR255L2FjOHhQdVZYQVR4YUdueS85ZjMvUHVWWEFUd1NzbDIvYWM4eFB1VlhBVHhhR255LzlmMy9QdVZYQVR3U3NsMi85ZjMvUHVWWEFUd1NzbDIvOWYzL1B1VlhBVHdTc2wyLzlmMy9QdVZYQVR3U3NsMi83UmxFUCtWWEFUeHJqQ1MvOWYzL1B1VlhBVHdTc2wyLzdSbEVQK1ZYQVR4cmpDUy83UmxFUCtWWEFUeHJqQ1MvN1JsRVArVlhBVHhyakNTLzdSbEVQK1ZYQVR4cmpDUy94NDF3UCtWWEFUemVHNisrN1JsRVArVlhBVHhyakNTL3g0MXdQK1ZYQVR6ZUc2Kyt4NDF3UCtWWEFUemVHNisreDQxd1ArVlhBVHplRzYrK3g0MXdQK1ZYQVR6ZUc2Kys5ZjEvUCtWWEFUd0FBQUFBeDQxd1ArVlhBVHplRzYrKzlmMS9QK1ZYQVR3QUFBQUE5ZjEvUCtWWEFUd0FBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFDQUFBQUFBQUFBZ0Q4QUFBQ0FBQUFBQUFBQWdEOEFBQUNBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQWdBQUFnTDhBQUFBQUFBQUFnQUFBZ0w4QUFBQUFBQUFBZ0FBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBSUFBQUFBQUFBQ0FQd0FBQUlBQUFBQUFBQUNBUHdBQUFJQUFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBSUFBQUFBQUFBQ0FQd0FBQUlBQUFBQUFBQUNBUHdBQUFJQUFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBSUFBQUFBQUFBQ0FQd0FBQUlBQUFBQUFBQUNBUHdBQUFJQUFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQkFBSUFBd0FFQUFVQUJnQUhBQWdBQ1FBS0FBc0FEQUFOQUE0QUR3QVFBQkVBRWdBVEFCUUFGUUFXQUJjQUdBQVpBQm9BR3dBY0FCMEFIZ0FmQUNBQUlRQWlBQ01BSkFBbEFDWUFKd0FvQUNrQUtnQXJBQ3dBTFFBdUFDOEFNQUF4QURJQU13QTBBRFVBTmdBM0FEZ0FPUUE2QURzQVBBQTlBRDRBUHdCQUFFRUFRZ0JEQUVRQVJRQkdBRWNBU0FCSkFFb0FTd0JNQUUwQVRnQlBBRkFBVVFCU0FGTUFWQUJWQUZZQVZ3QllBRmtBV2dCYkFGd0FYUUJlQUY4QVlBQmhBR0lBWXdCa0FHVUFaZ0JuQUdnQWFRQnFBR3NBYkFCdEFHNEFid0J3QUhFQWNnQnpBSFFBZFFCMkFIY0FlQUI1QUhvQWV3QjhBSDBBZmdCL0FJQUFnUUNDQUlNQWhBQ0ZBSVlBaHdDSUFJa0FpZ0NMQUl3QWpRQ09BSThBa0FDUkFKSUFrd0NVQUpVQWxnQ1hBSmdBbVFDYUFKc0FuQUNkQUo0QW53Q2dBS0VBb2dDakFLUUFwUUNtQUtjQXFBQ3BBS29BcXdDc0FLMEFyZ0N2QUxBQXNRQ3lBTE1BdEFDMUFMWUF0d0M0QUxrQXVnQzdBTHdBdlFDK0FMOEF3QURCQU1JQXd3REVBTVVBeGdESEFNZ0F5UURLQU1zQXpBRE5BTTRBendEUUFORUEwZ0RUQU5RQTFRRFdBTmNBMkFEWkFOb0Eyd0RjQU4wQTNnRGZBT0FBNFFEaUFPTUE1QURsQU9ZQTV3RG9BT2tBNmdEckFPd0E3UUR1QU84QThBRHhBUElBOHdEMEFQVUE5Z0QzQVBnQStRRDZBUHNBL0FEOUFQNEEvd0FBQVFFQkFnRURBUVFCQlFFR0FRY0JDQUVKQVFvQkN3RU1BUTBCRGdFUEFSQUJFUUVTQVJNQkZBRVZBUllCRndFWUFSa0JHZ0ViQVJ3QkhRRWVBUjhCSUFFaEFTSUJJd0VrQVNVQkpnRW5BU2dCS1FFcUFTc0JMQUV0QVM0Qkx3RXdBVEVCTWdFekFUUUJOUUUyQVRjQk9BRTVBVG9CT3dFOEFUMEJQZ0UvQVVBQlFRRkNBVU1CUkFGRkFVWUJSd0ZJQVVrQlNnRkxBVXdCVFFGT0FVOEJVQUZSQVZJQlV3RlVBVlVCVmdGWEFWZ0JXUUZhQVZzQlhBRmRBVjRCWHdGZ0FXRUJZZ0ZqQVdRQlpRRm1BV2NCYUFGcEFXb0Jhd0ZzQVcwQmJnRnZBWEFCY1FGeUFYTUJkQUYxQVhZQmR3RjRBWGtCZWdGN0FYd0JmUUYrQVg4QmdBR0JBWUlCZ3dHRUFZVUJoZ0dIQVlnQmlRR0tBWXNCakFHTkFZNEJqd0dRQVpFQmtnR1RBWlFCbFFHV0FaY0JtQUdaQVpvQm13R2NBWjBCbmdHZkFhQUJvUUdpQWFNQnBBR2xBYVlCcHdHb0Fha0JxZ0dyQWF3QnJRR3VBYThCc0FHeEFiSUJzd0cwQWJVQnRnRzNBYmdCdVFHNkFic0J2QUc5QWI0QnZ3SEFBY0VCd2dIREFjUUJ4UUhHQWNjQnlBSEpBY29CeXdITUFjMEJ6Z0hQQWRBQjBRSFNBZE1CMUFIVkFkWUIxd0hZQWRrQjJnSGJBZHdCM1FIZUFkOEI0QUhoQWVJQjR3SGtBZVVCNWdIbkFlZ0I2UUhxQWVzQjdBSHRBZTRCN3dId0FmRUI4Z0h6QWZRQjlRSDJBZmNCK0FINUFmb0Ird0g4QWYwQi9nSC9BUUFDQVFJQ0FnTUNDdGVqUFhFOW1rQWZoV3UvZXhUdVAwamhXa0E5Q2xlL3VCN0ZQeWxjenora2NEMi9DdGVqUFhFOW1rQWZoV3UvdUI3RlB5bGN6eitrY0QyL0N0ZWpQTGdlQlVEMktGeS96Y3hNdlQwS2QwQ2tjRDNBTXpPVFA2UndIVUE5Q2pmQWo4SjFQeWxjanorRjZ6SEF6Y3hNdlQwS2QwQ2tjRDNBajhKMVB5bGNqeitGNnpIQUN0ZWp2UlN1eHo5STRUckExMWFQT3JyL1k3MWFtbisvMTFhUE9yci9ZNzFhbW4rLzExYVBPcnIvWTcxYW1uKy8rYmVTUFZxNnY3eWNSWCsvK2JlU1BWcTZ2N3ljUlgrLytiZVNQVnE2djd5Y1JYKy9tdmMvUE1IZGVyMTJnSCsvbXZjL1BNSGRlcjEyZ0grL212Yy9QTUhkZXIxMmdIKy9TNHdBUGdtN21yekY3WDIvUzR3QVBnbTdtcnpGN1gyL1M0d0FQZ203bXJ6RjdYMi9BQUFCQUFJQUF3QUVBQVVBQmdBSEFBZ0FDUUFLQUFzQWo4SjF2eFN1Unovc1ViZy9qOEoxUHhTdVJ6L3NVYmcvajhKMVA2NUhZVC9zVWJnL2o4SjF2eFN1Unovc1ViZy9qOEoxUDY1SFlUL3NVYmcvajhKMXY2NUhZVC9zVWJnL2o4SjFQeFN1UnordVI2RS9qOEoxdnhTdVJ6K3VSNkUvajhKMXY2NUhZVCt1UjZFL2o4SjFQeFN1UnordVI2RS9qOEoxdjY1SFlUK3VSNkUvajhKMVA2NUhZVCt1UjZFL2o4SjF2eFN1UnordVI2RS9qOEoxdnhTdVJ6L3NVYmcvajhKMXY2NUhZVC9zVWJnL2o4SjF2eFN1UnordVI2RS9qOEoxdjY1SFlUL3NVYmcvajhKMXY2NUhZVCt1UjZFL2o4SjFQeFN1Unovc1ViZy9qOEoxUHhTdVJ6K3VSNkUvajhKMVA2NUhZVCt1UjZFL2o4SjFQeFN1Unovc1ViZy9qOEoxUDY1SFlUK3VSNkUvajhKMVA2NUhZVC9zVWJnL2o4SjF2NjVIWVQvc1ViZy9qOEoxUDY1SFlUL3NVYmcvajhKMVA2NUhZVCt1UjZFL2o4SjF2NjVIWVQvc1ViZy9qOEoxUDY1SFlUK3VSNkUvajhKMXY2NUhZVCt1UjZFL2o4SjF2eFN1UnordVI2RS9qOEoxUHhTdVJ6K3VSNkUvajhKMVB4U3VSei9zVWJnL2o4SjF2eFN1UnordVI2RS9qOEoxUHhTdVJ6L3NVYmcvajhKMXZ4U3VSei9zVWJnL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQS9BQUFBQUFBQUFBQUFBSUEvQUFBQUFBQUFBQUFBQUlBL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQUFBQUFBQUFBQUFJQy9BQUFBQUFBQUFBQUFBSUMvQUFBQUFBQUFBQUFBQUlDL0FBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0F2d0FBQUFBQUFBQUFBQUNBdndBQUFBQUFBQUFBQUFDQXZ3QUFBQUFBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQ0FQd0FBQUlBQUFBQUFBQUNBUHdBQUFJQUFBQUFBQUFDQVB3QUFBSUFBQUFBQUFBQUFnQUFBZ0Q4QUFBQUFBQUFBZ0FBQWdEOEFBQUFBQUFBQWdBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUJBQUlBQXdBRUFBVUFCZ0FIQUFnQUNRQUtBQXNBREFBTkFBNEFEd0FRQUJFQUVnQVRBQlFBRlFBV0FCY0FHQUFaQUJvQUd3QWNBQjBBSGdBZkFDQUFJUUFpQUNNQXpjeE1QeWxjanorUHduVS96Y3hNUDNzVXJqK1B3blUvdGoxTFAzc1Vyai9zbUgwL3pjeE1QeWxjanorUHduVS90ajFMUDNzVXJqL3NtSDAvdGoxTFB5bGNqei9zbUgwL3RqMUxQeWxjanovc21IMC90ajFMUDNzVXJqL3NtSDAvTXMxR1Azc1Vyai9ySG9JL3RqMUxQeWxjanovc21IMC9NczFHUDNzVXJqL3JIb0kvTXMxR1B5bGNqei9ySG9JL01zMUdQeWxjanovckhvSS9NczFHUDNzVXJqL3JIb0kvU1NoQVAzc1Vyajh0VjRRL01zMUdQeWxjanovckhvSS9TU2hBUDNzVXJqOHRWNFEvU1NoQVB5bGNqejh0VjRRL1NTaEFQeWxjano4dFY0US9TU2hBUDNzVXJqOHRWNFEvN0ZFNFAzc1Vyais0SG9VL1NTaEFQeWxjano4dFY0US83RkU0UDNzVXJqKzRIb1UvN0ZFNFB5bGNqeis0SG9VLzdGRTRQeWxjanorNEhvVS83RkU0UDNzVXJqKzRIb1UvajNzd1Azc1Vyajh0VjRRLzdGRTRQeWxjanorNEhvVS9qM3N3UDNzVXJqOHRWNFEvajNzd1B5bGNqejh0VjRRL2ozc3dQeWxjano4dFY0US9qM3N3UDNzVXJqOHRWNFEvcGRZcFAzc1Vyai9ySG9JL2ozc3dQeWxjano4dFY0US9wZFlwUDNzVXJqL3JIb0kvcGRZcFB5bGNqei9ySG9JL3BkWXBQeWxjanovckhvSS9wZFlwUDNzVXJqL3JIb0kvSVdZbFAzc1Vyai9zbUgwL3BkWXBQeWxjanovckhvSS9JV1lsUDNzVXJqL3NtSDAvSVdZbFB5bGNqei9zbUgwL0lXWWxQeWxjanovc21IMC9JV1lsUDNzVXJqL3NtSDAvQ3RjalAzc1VyaitQd25VL0lXWWxQeWxjanovc21IMC9DdGNqUDNzVXJqK1B3blUvQ3RjalB5bGNqeitQd25VL0N0Y2pQeWxjanorUHduVS9DdGNqUDNzVXJqK1B3blUvSVdZbFAzc1Vyajh5N0cwL0N0Y2pQeWxjanorUHduVS9JV1lsUDNzVXJqOHk3RzAvSVdZbFB5bGNqejh5N0cwL0lXWWxQeWxjano4eTdHMC9JV1lsUDNzVXJqOHk3RzAvcGRZcFAzc1VyajlKUjJjL0lXWWxQeWxjano4eTdHMC9wZFlwUDNzVXJqOUpSMmMvcGRZcFB5bGNqejlKUjJjL3BkWXBQeWxjano5SlIyYy9wZFlwUDNzVXJqOUpSMmMvajNzd1Azc1Vyai9GMW1JL3BkWXBQeWxjano5SlIyYy9qM3N3UDNzVXJqL0YxbUkvajNzd1B5bGNqei9GMW1JL2ozc3dQeWxjanovRjFtSS9qM3N3UDNzVXJqL0YxbUkvN0ZFNFAzc1Vyait1UjJFL2ozc3dQeWxjanovRjFtSS83RkU0UDNzVXJqK3VSMkUvN0ZFNFB5bGNqeit1UjJFLzdGRTRQeWxjanordVIyRS83RkU0UDNzVXJqK3VSMkUvU1NoQVAzc1Vyai9GMW1JLzdGRTRQeWxjanordVIyRS9TU2hBUDNzVXJqL0YxbUkvU1NoQVB5bGNqei9GMW1JL1NTaEFQeWxjanovRjFtSS9TU2hBUDNzVXJqL0YxbUkvTXMxR1Azc1VyajlKUjJjL1NTaEFQeWxjanovRjFtSS9NczFHUDNzVXJqOUpSMmMvTXMxR1B5bGNqejlKUjJjL01zMUdQeWxjano5SlIyYy9NczFHUDNzVXJqOUpSMmMvdGoxTFAzc1Vyajh5N0cwL01zMUdQeWxjano5SlIyYy90ajFMUDNzVXJqOHk3RzAvdGoxTFB5bGNqejh5N0cwL3RqMUxQeWxjano4eTdHMC90ajFMUDNzVXJqOHk3RzAvemN4TVAzc1VyaitQd25VL3RqMUxQeWxjano4eTdHMC96Y3hNUDNzVXJqK1B3blUvemN4TVB5bGNqeitQd25VL3RqMUxQM3NVcmo4eTdHMC9NczFHUDNzVXJqOUpSMmMvU1NoQVAzc1Vyai9GMW1JL3RqMUxQM3NVcmo4eTdHMC9TU2hBUDNzVXJqL0YxbUkvN0ZFNFAzc1Vyait1UjJFL3RqMUxQM3NVcmo4eTdHMC83RkU0UDNzVXJqK3VSMkUvajNzd1Azc1Vyai9GMW1JL3RqMUxQM3NVcmo4eTdHMC9qM3N3UDNzVXJqL0YxbUkvcGRZcFAzc1VyajlKUjJjL3RqMUxQM3NVcmo4eTdHMC9wZFlwUDNzVXJqOUpSMmMvSVdZbFAzc1Vyajh5N0cwL3RqMUxQM3NVcmo4eTdHMC9JV1lsUDNzVXJqOHk3RzAvQ3RjalAzc1VyaitQd25VL3RqMUxQM3NVcmo4eTdHMC9DdGNqUDNzVXJqK1B3blUvSVdZbFAzc1Vyai9zbUgwL3RqMUxQM3NVcmo4eTdHMC9JV1lsUDNzVXJqL3NtSDAvcGRZcFAzc1Vyai9ySG9JL3RqMUxQM3NVcmo4eTdHMC9wZFlwUDNzVXJqL3JIb0kvajNzd1Azc1Vyajh0VjRRL3RqMUxQM3NVcmo4eTdHMC9qM3N3UDNzVXJqOHRWNFEvN0ZFNFAzc1Vyais0SG9VL3RqMUxQM3NVcmo4eTdHMC83RkU0UDNzVXJqKzRIb1UvU1NoQVAzc1Vyajh0VjRRL3RqMUxQM3NVcmo4eTdHMC9TU2hBUDNzVXJqOHRWNFEvTXMxR1Azc1Vyai9ySG9JL3RqMUxQM3NVcmo4eTdHMC9NczFHUDNzVXJqL3JIb0kvdGoxTFAzc1Vyai9zbUgwL3RqMUxQM3NVcmo4eTdHMC90ajFMUDNzVXJqL3NtSDAvemN4TVAzc1VyaitQd25VL3pjeE1QeWxjanorUHduVS90ajFMUHlsY2p6L3NtSDAvTXMxR1B5bGNqei9ySG9JL3pjeE1QeWxjanorUHduVS9NczFHUHlsY2p6L3JIb0kvU1NoQVB5bGNqejh0VjRRL3pjeE1QeWxjanorUHduVS9TU2hBUHlsY2p6OHRWNFEvN0ZFNFB5bGNqeis0SG9VL3pjeE1QeWxjanorUHduVS83RkU0UHlsY2p6KzRIb1UvajNzd1B5bGNqejh0VjRRL3pjeE1QeWxjanorUHduVS9qM3N3UHlsY2p6OHRWNFEvcGRZcFB5bGNqei9ySG9JL3pjeE1QeWxjanorUHduVS9wZFlwUHlsY2p6L3JIb0kvSVdZbFB5bGNqei9zbUgwL3pjeE1QeWxjanorUHduVS9JV1lsUHlsY2p6L3NtSDAvQ3RjalB5bGNqeitQd25VL3pjeE1QeWxjanorUHduVS9DdGNqUHlsY2p6K1B3blUvSVdZbFB5bGNqejh5N0cwL3pjeE1QeWxjanorUHduVS9JV1lsUHlsY2p6OHk3RzAvcGRZcFB5bGNqejlKUjJjL3pjeE1QeWxjanorUHduVS9wZFlwUHlsY2p6OUpSMmMvajNzd1B5bGNqei9GMW1JL3pjeE1QeWxjanorUHduVS9qM3N3UHlsY2p6L0YxbUkvN0ZFNFB5bGNqeit1UjJFL3pjeE1QeWxjanorUHduVS83RkU0UHlsY2p6K3VSMkUvU1NoQVB5bGNqei9GMW1JL3pjeE1QeWxjanorUHduVS9TU2hBUHlsY2p6L0YxbUkvTXMxR1B5bGNqejlKUjJjL3pjeE1QeWxjanorUHduVS9NczFHUHlsY2p6OUpSMmMvdGoxTFB5bGNqejh5N0cwL0N0Y2p2eFN1aHorNEhzVy9DdGNqdjJabXBqKzRIc1cvSVdZbHYyWm1waitLTThHL0N0Y2p2eFN1aHorNEhzVy9JV1lsdjJabXBqK0tNOEcvSVdZbHZ4U3VoeitLTThHL0lXWWx2eFN1aHorS004Ry9JV1lsdjJabXBqK0tNOEcvcGRZcHYyWm1wajhWNGIyL0lXWWx2eFN1aHorS004Ry9wZFlwdjJabXBqOFY0YjIvcGRZcHZ4U3VoejhWNGIyL3BkWXB2eFN1aHo4VjRiMi9wZFlwdjJabXBqOFY0YjIvajNzd3YyWm1wai9UcUx1L3BkWXB2eFN1aHo4VjRiMi9qM3N3djJabXBqL1RxTHUvajNzd3Z4U3Voei9UcUx1L2ozc3d2eFN1aHovVHFMdS9qM3N3djJabXBqL1RxTHUvN0ZFNHYyWm1wajlJNGJxL2ozc3d2eFN1aHovVHFMdS83RkU0djJabXBqOUk0YnEvN0ZFNHZ4U3VoejlJNGJxLzdGRTR2eFN1aHo5STRicS83RkU0djJabXBqOUk0YnEvU1NoQXYyWm1wai9UcUx1LzdGRTR2eFN1aHo5STRicS9TU2hBdjJabXBqL1RxTHUvU1NoQXZ4U3Voei9UcUx1L1NTaEF2eFN1aHovVHFMdS9TU2hBdjJabXBqL1RxTHUvTXMxR3YyWm1wajhWNGIyL1NTaEF2eFN1aHovVHFMdS9NczFHdjJabXBqOFY0YjIvTXMxR3Z4U3VoejhWNGIyL01zMUd2eFN1aHo4VjRiMi9NczFHdjJabXBqOFY0YjIvdGoxTHYyWm1waitLTThHL01zMUd2eFN1aHo4VjRiMi90ajFMdjJabXBqK0tNOEcvdGoxTHZ4U3VoeitLTThHL3RqMUx2eFN1aHorS004Ry90ajFMdjJabXBqK0tNOEcvemN4TXYyWm1wais0SHNXL3RqMUx2eFN1aHorS004Ry96Y3hNdjJabXBqKzRIc1cvemN4TXZ4U3Voeis0SHNXL3pjeE12eFN1aHorNEhzVy96Y3hNdjJabXBqKzRIc1cvdGoxTHYyWm1wai9uQ2NtL3pjeE12eFN1aHorNEhzVy90ajFMdjJabXBqL25DY20vdGoxTHZ4U3Voei9uQ2NtL3RqMUx2eFN1aHovbkNjbS90ajFMdjJabXBqL25DY20vTXMxR3YyWm1wajljWE15L3RqMUx2eFN1aHovbkNjbS9NczFHdjJabXBqOWNYTXkvTXMxR3Z4U3VoejljWE15L01zMUd2eFN1aHo5Y1hNeS9NczFHdjJabXBqOWNYTXkvU1NoQXYyWm1waitkbE02L01zMUd2eFN1aHo5Y1hNeS9TU2hBdjJabXBqK2RsTTYvU1NoQXZ4U3VoeitkbE02L1NTaEF2eFN1aHorZGxNNi9TU2hBdjJabXBqK2RsTTYvN0ZFNHYyWm1wajhwWE0rL1NTaEF2eFN1aHorZGxNNi83RkU0djJabXBqOHBYTSsvN0ZFNHZ4U3VoejhwWE0rLzdGRTR2eFN1aHo4cFhNKy83RkU0djJabXBqOHBYTSsvajNzd3YyWm1waitkbE02LzdGRTR2eFN1aHo4cFhNKy9qM3N3djJabXBqK2RsTTYvajNzd3Z4U3VoeitkbE02L2ozc3d2eFN1aHorZGxNNi9qM3N3djJabXBqK2RsTTYvcGRZcHYyWm1wajljWE15L2ozc3d2eFN1aHorZGxNNi9wZFlwdjJabXBqOWNYTXkvcGRZcHZ4U3VoejljWE15L3BkWXB2eFN1aHo5Y1hNeS9wZFlwdjJabXBqOWNYTXkvSVdZbHYyWm1wai9uQ2NtL3BkWXB2eFN1aHo5Y1hNeS9JV1lsdjJabXBqL25DY20vSVdZbHZ4U3Voei9uQ2NtL0lXWWx2eFN1aHovbkNjbS9JV1lsdjJabXBqL25DY20vQ3RjanYyWm1wais0SHNXL0lXWWx2eFN1aHovbkNjbS9DdGNqdjJabXBqKzRIc1cvQ3RjanZ4U3Voeis0SHNXL0lXWWx2MlptcGovbkNjbS9wZFlwdjJabXBqOWNYTXkvajNzd3YyWm1waitkbE02L0lXWWx2MlptcGovbkNjbS9qM3N3djJabXBqK2RsTTYvN0ZFNHYyWm1wajhwWE0rL0lXWWx2MlptcGovbkNjbS83RkU0djJabXBqOHBYTSsvU1NoQXYyWm1waitkbE02L0lXWWx2MlptcGovbkNjbS9TU2hBdjJabXBqK2RsTTYvTXMxR3YyWm1wajljWE15L0lXWWx2MlptcGovbkNjbS9NczFHdjJabXBqOWNYTXkvdGoxTHYyWm1wai9uQ2NtL0lXWWx2MlptcGovbkNjbS90ajFMdjJabXBqL25DY20vemN4TXYyWm1wais0SHNXL0lXWWx2MlptcGovbkNjbS96Y3hNdjJabXBqKzRIc1cvdGoxTHYyWm1waitLTThHL0lXWWx2MlptcGovbkNjbS90ajFMdjJabXBqK0tNOEcvTXMxR3YyWm1wajhWNGIyL0lXWWx2MlptcGovbkNjbS9NczFHdjJabXBqOFY0YjIvU1NoQXYyWm1wai9UcUx1L0lXWWx2MlptcGovbkNjbS9TU2hBdjJabXBqL1RxTHUvN0ZFNHYyWm1wajlJNGJxL0lXWWx2MlptcGovbkNjbS83RkU0djJabXBqOUk0YnEvajNzd3YyWm1wai9UcUx1L0lXWWx2MlptcGovbkNjbS9qM3N3djJabXBqL1RxTHUvcGRZcHYyWm1wajhWNGIyL0lXWWx2MlptcGovbkNjbS9wZFlwdjJabXBqOFY0YjIvSVdZbHYyWm1waitLTThHL0lXWWx2MlptcGovbkNjbS9JV1lsdjJabXBqK0tNOEcvQ3RjanYyWm1wais0SHNXL0N0Y2p2eFN1aHorNEhzVy9JV1lsdnhTdWh6K0tNOEcvcGRZcHZ4U3VoejhWNGIyL0N0Y2p2eFN1aHorNEhzVy9wZFlwdnhTdWh6OFY0YjIvajNzd3Z4U3Voei9UcUx1L0N0Y2p2eFN1aHorNEhzVy9qM3N3dnhTdWh6L1RxTHUvN0ZFNHZ4U3VoejlJNGJxL0N0Y2p2eFN1aHorNEhzVy83RkU0dnhTdWh6OUk0YnEvU1NoQXZ4U3Voei9UcUx1L0N0Y2p2eFN1aHorNEhzVy9TU2hBdnhTdWh6L1RxTHUvTXMxR3Z4U3VoejhWNGIyL0N0Y2p2eFN1aHorNEhzVy9NczFHdnhTdWh6OFY0YjIvdGoxTHZ4U3VoeitLTThHL0N0Y2p2eFN1aHorNEhzVy90ajFMdnhTdWh6K0tNOEcvemN4TXZ4U3Voeis0SHNXL0N0Y2p2eFN1aHorNEhzVy96Y3hNdnhTdWh6KzRIc1cvdGoxTHZ4U3Voei9uQ2NtL0N0Y2p2eFN1aHorNEhzVy90ajFMdnhTdWh6L25DY20vTXMxR3Z4U3VoejljWE15L0N0Y2p2eFN1aHorNEhzVy9NczFHdnhTdWh6OWNYTXkvU1NoQXZ4U3VoeitkbE02L0N0Y2p2eFN1aHorNEhzVy9TU2hBdnhTdWh6K2RsTTYvN0ZFNHZ4U3VoejhwWE0rL0N0Y2p2eFN1aHorNEhzVy83RkU0dnhTdWh6OHBYTSsvajNzd3Z4U3VoeitkbE02L0N0Y2p2eFN1aHorNEhzVy9qM3N3dnhTdWh6K2RsTTYvcGRZcHZ4U3VoejljWE15L0N0Y2p2eFN1aHorNEhzVy9wZFlwdnhTdWh6OWNYTXkvSVdZbHZ4U3Voei9uQ2NtL0FBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBWG9Oc1B3QUFBQUFWNzhNK0FBQ0FQd0FBQUFBQUFBQUFYb05zUHdBQUFBQVY3OE0rWG9Oc1B3QUFBQUFWNzhNK1hvTnNQd0FBQUFBVjc4TStYb05zUHdBQUFBQVY3OE0rOHdRMVB3QUFBQUR6QkRVL1hvTnNQd0FBQUFBVjc4TSs4d1ExUHdBQUFBRHpCRFUvOHdRMVB3QUFBQUR6QkRVLzh3UTFQd0FBQUFEekJEVS84d1ExUHdBQUFBRHpCRFUvRmUvRFBnQUFBQUJlZzJ3Lzh3UTFQd0FBQUFEekJEVS9GZS9EUGdBQUFBQmVnMncvRmUvRFBnQUFBQUJlZzJ3L0ZlL0RQZ0FBQUFCZWcydy9GZS9EUGdBQUFBQmVnMncvTWpHTkpBQUFBQUFBQUlBL0ZlL0RQZ0FBQUFCZWcydy9NakdOSkFBQUFBQUFBSUEvTWpHTkpBQUFBQUFBQUlBL01qR05KQUFBQUFBQUFJQS9NakdOSkFBQUFBQUFBSUEvRmUvRHZnQUFBQUJlZzJ3L01qR05KQUFBQUFBQUFJQS9GZS9EdmdBQUFBQmVnMncvRmUvRHZnQUFBQUJlZzJ3L0ZlL0R2Z0FBQUFCZWcydy9GZS9EdmdBQUFBQmVnMncvOHdRMXZ3QUFBQUR6QkRVL0ZlL0R2Z0FBQUFCZWcydy84d1ExdndBQUFBRHpCRFUvOHdRMXZ3QUFBQUR6QkRVLzh3UTF2d0FBQUFEekJEVS84d1ExdndBQUFBRHpCRFUvWG9Oc3Z3QUFBQUFWNzhNKzh3UTF2d0FBQUFEekJEVS9Yb05zdndBQUFBQVY3OE0rWG9Oc3Z3QUFBQUFWNzhNK1hvTnN2d0FBQUFBVjc4TStYb05zdndBQUFBQVY3OE0rQUFDQXZ3QUFBQUF5TVEwbFhvTnN2d0FBQUFBVjc4TStBQUNBdndBQUFBQXlNUTBsQUFDQXZ3QUFBQUF5TVEwbEFBQ0F2d0FBQUFBeU1RMGxBQUNBdndBQUFBQXlNUTBsWG9Oc3Z3QUFBQUFWNzhPK0FBQ0F2d0FBQUFBeU1RMGxYb05zdndBQUFBQVY3OE8rWG9Oc3Z3QUFBQUFWNzhPK1hvTnN2d0FBQUFBVjc4TytYb05zdndBQUFBQVY3OE8rOHdRMXZ3QUFBQUR6QkRXL1hvTnN2d0FBQUFBVjc4Tys4d1ExdndBQUFBRHpCRFcvOHdRMXZ3QUFBQUR6QkRXLzh3UTF2d0FBQUFEekJEVy84d1ExdndBQUFBRHpCRFcvRmUvRHZnQUFBQUJlZzJ5Lzh3UTF2d0FBQUFEekJEVy9GZS9EdmdBQUFBQmVnMnkvRmUvRHZnQUFBQUJlZzJ5L0ZlL0R2Z0FBQUFCZWcyeS9GZS9EdmdBQUFBQmVnMnkveXNsVHBRQUFBQUFBQUlDL0ZlL0R2Z0FBQUFCZWcyeS95c2xUcFFBQUFBQUFBSUMveXNsVHBRQUFBQUFBQUlDL3lzbFRwUUFBQUFBQUFJQy95c2xUcFFBQUFBQUFBSUMvRmUvRFBnQUFBQUJlZzJ5L3lzbFRwUUFBQUFBQUFJQy9GZS9EUGdBQUFBQmVnMnkvRmUvRFBnQUFBQUJlZzJ5L0ZlL0RQZ0FBQUFCZWcyeS9GZS9EUGdBQUFBQmVnMnkvOHdRMVB3QUFBQUR6QkRXL0ZlL0RQZ0FBQUFCZWcyeS84d1ExUHdBQUFBRHpCRFcvOHdRMVB3QUFBQUR6QkRXLzh3UTFQd0FBQUFEekJEVy84d1ExUHdBQUFBRHpCRFcvWG9Oc1B3QUFBQUFWNzhPKzh3UTFQd0FBQUFEekJEVy9Yb05zUHdBQUFBQVY3OE8rWG9Oc1B3QUFBQUFWNzhPK1hvTnNQd0FBQUFBVjc4TytYb05zUHdBQUFBQVY3OE8rQUFDQVB3QUFBQUFBQUFBQVhvTnNQd0FBQUFBVjc4TytBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQ0FBQUFBQUFBQWdEOEFBQUNBQUFBQUFBQUFnRDhBQUFDQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFnQUFBZ0w4QUFBQUFBQUFBZ0FBQWdMOEFBQUFBQUFBQWdBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQ0FQd0FBQUFBQUFBQUFBQUNBUHdBQUFBQUFBQUFBWG9Oc1B3QUFBQUFWNzhNK0FBQ0FQd0FBQUFBQUFBQUFYb05zUHdBQUFBQVY3OE0rWG9Oc1B3QUFBQUFWNzhNK1hvTnNQd0FBQUFBVjc4TStYb05zUHdBQUFBQVY3OE0rOHdRMVB3QUFBQUR6QkRVL1hvTnNQd0FBQUFBVjc4TSs4d1ExUHdBQUFBRHpCRFUvOHdRMVB3QUFBQUR6QkRVLzh3UTFQd0FBQUFEekJEVS84d1ExUHdBQUFBRHpCRFUvRmUvRFBnQUFBQUJlZzJ3Lzh3UTFQd0FBQUFEekJEVS9GZS9EUGdBQUFBQmVnMncvRmUvRFBnQUFBQUJlZzJ3L0ZlL0RQZ0FBQUFCZWcydy9GZS9EUGdBQUFBQmVnMncvTWpHTkpBQUFBQUFBQUlBL0ZlL0RQZ0FBQUFCZWcydy9NakdOSkFBQUFBQUFBSUEvTWpHTkpBQUFBQUFBQUlBL01qR05KQUFBQUFBQUFJQS9NakdOSkFBQUFBQUFBSUEvRmUvRHZnQUFBQUJlZzJ3L01qR05KQUFBQUFBQUFJQS9GZS9EdmdBQUFBQmVnMncvRmUvRHZnQUFBQUJlZzJ3L0ZlL0R2Z0FBQUFCZWcydy9GZS9EdmdBQUFBQmVnMncvOHdRMXZ3QUFBQUR6QkRVL0ZlL0R2Z0FBQUFCZWcydy84d1ExdndBQUFBRHpCRFUvOHdRMXZ3QUFBQUR6QkRVLzh3UTF2d0FBQUFEekJEVS84d1ExdndBQUFBRHpCRFUvWG9Oc3Z3QUFBQUFWNzhNKzh3UTF2d0FBQUFEekJEVS9Yb05zdndBQUFBQVY3OE0rWG9Oc3Z3QUFBQUFWNzhNK1hvTnN2d0FBQUFBVjc4TStYb05zdndBQUFBQVY3OE0rQUFDQXZ3QUFBQUF5TVEwbFhvTnN2d0FBQUFBVjc4TStBQUNBdndBQUFBQXlNUTBsQUFDQXZ3QUFBQUF5TVEwbEFBQ0F2d0FBQUFBeU1RMGxBQUNBdndBQUFBQXlNUTBsWG9Oc3Z3QUFBQUFWNzhPK0FBQ0F2d0FBQUFBeU1RMGxYb05zdndBQUFBQVY3OE8rWG9Oc3Z3QUFBQUFWNzhPK1hvTnN2d0FBQUFBVjc4TytYb05zdndBQUFBQVY3OE8rOHdRMXZ3QUFBQUR6QkRXL1hvTnN2d0FBQUFBVjc4Tys4d1ExdndBQUFBRHpCRFcvOHdRMXZ3QUFBQUR6QkRXLzh3UTF2d0FBQUFEekJEVy84d1ExdndBQUFBRHpCRFcvRmUvRHZnQUFBQUJlZzJ5Lzh3UTF2d0FBQUFEekJEVy9GZS9EdmdBQUFBQmVnMnkvRmUvRHZnQUFBQUJlZzJ5L0ZlL0R2Z0FBQUFCZWcyeS9GZS9EdmdBQUFBQmVnMnkveXNsVHBRQUFBQUFBQUlDL0ZlL0R2Z0FBQUFCZWcyeS95c2xUcFFBQUFBQUFBSUMveXNsVHBRQUFBQUFBQUlDL3lzbFRwUUFBQUFBQUFJQy95c2xUcFFBQUFBQUFBSUMvRmUvRFBnQUFBQUJlZzJ5L3lzbFRwUUFBQUFBQUFJQy9GZS9EUGdBQUFBQmVnMnkvRmUvRFBnQUFBQUJlZzJ5L0ZlL0RQZ0FBQUFCZWcyeS9GZS9EUGdBQUFBQmVnMnkvOHdRMVB3QUFBQUR6QkRXL0ZlL0RQZ0FBQUFCZWcyeS84d1ExUHdBQUFBRHpCRFcvOHdRMVB3QUFBQUR6QkRXLzh3UTFQd0FBQUFEekJEVy84d1ExUHdBQUFBRHpCRFcvWG9Oc1B3QUFBQUFWNzhPKzh3UTFQd0FBQUFEekJEVy9Yb05zUHdBQUFBQVY3OE8rWG9Oc1B3QUFBQUFWNzhPK1hvTnNQd0FBQUFBVjc4TytYb05zUHdBQUFBQVY3OE8rQUFDQVB3QUFBQUFBQUFBQVhvTnNQd0FBQUFBVjc4TytBQUNBUHdBQUFBQUFBQUFBQUFDQVB3QUFBQUFBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0Q4QUFBQ0FBQUFBQUFBQWdEOEFBQUNBQUFBQUFBQUFnRDhBQUFDQUFBQUFBQUFBZ0Q4QUFBQUFBQUFBQUFBQWdEOEFBQUFBQUFBQUFBQUFnRDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFnQUFBZ0w4QUFBQUFBQUFBZ0FBQWdMOEFBQUFBQUFBQWdBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUFBQUFBZ0w4QUFBQUFBQUFBQUFBQWdMOEFBQUFBQUFBQUFBQUFnTDhBQUFBQUFBQUJBQUlBQXdBRUFBVUFCZ0FIQUFnQUNRQUtBQXNBREFBTkFBNEFEd0FRQUJFQUVnQVRBQlFBRlFBV0FCY0FHQUFaQUJvQUd3QWNBQjBBSGdBZkFDQUFJUUFpQUNNQUpBQWxBQ1lBSndBb0FDa0FLZ0FyQUN3QUxRQXVBQzhBTUFBeEFESUFNd0EwQURVQU5nQTNBRGdBT1FBNkFEc0FQQUE5QUQ0QVB3QkFBRUVBUWdCREFFUUFSUUJHQUVjQVNBQkpBRW9BU3dCTUFFMEFUZ0JQQUZBQVVRQlNBRk1BVkFCVkFGWUFWd0JZQUZrQVdnQmJBRndBWFFCZUFGOEFZQUJoQUdJQVl3QmtBR1VBWmdCbkFHZ0FhUUJxQUdzQWJBQnRBRzRBYndCd0FIRUFjZ0J6QUhRQWRRQjJBSGNBZUFCNUFIb0Fld0I4QUgwQWZnQi9BSUFBZ1FDQ0FJTUFoQUNGQUlZQWh3Q0lBSWtBaWdDTEFJd0FqUUNPQUk4QWtBQ1JBSklBa3dDVUFKVUFsZ0NYQUpnQW1RQ2FBSnNBbkFDZEFKNEFud0NnQUtFQW9nQ2pBS1FBcFFDbUFLY0FxQUNwQUtvQXF3Q3NBSzBBcmdDdkFMQUFzUUN5QUxNQXRBQzFBTFlBdHdDNEFMa0F1Z0M3QUx3QXZRQytBTDhBd0FEQkFNSUF3d0RFQU1VQXhnREhBTWdBeVFES0FNc0F6QUROQU00QXp3RFFBTkVBMGdEVEFOUUExUURXQU5jQTJBRFpBTm9BMndEY0FOMEEzZ0RmQU9BQTRRRGlBT01BNUFEbEFPWUE1d0RvQU9rQTZnRHJBT3dBN1FEdUFPOEE4QUR4QVBJQTh3RDBBUFVBOWdEM0FQZ0ErUUQ2QVBzQS9BRDlBUDRBL3dBQUFRRUJBZ0VEQVFRQkJRRUdBUWNCQ0FFSkFRb0JDd0VNQVEwQkRnRVBBUkFCRVFFU0FSTUJGQUVWQVJZQkZ3RVlBUmtCR2dFYkFSd0JIUUVlQVI4QklBRWhBU0lCSXdFa0FTVUJKZ0VuQVNnQktRRXFBU3NCTEFFdEFTNEJMd0V3QVRFQk1nRXpBVFFCTlFFMkFUY0JPQUU1QVRvQk93RThBVDBCUGdFL0FVQUJRUUZDQVVNQlJBRkZBVVlCUndGSUFVa0JTZ0ZMQVV3QlRRRk9BVThCVUFGUkFWSUJVd0ZVQVZVQlZnRlhBVmdCV1FGYUFWc0JYQUZkQVY0Qlh3RmdBV0VCWWdGakFXUUJaUUZtQVdjQiIsCiAgICAgICJieXRlTGVuZ3RoIjogMzYxOTIKICAgIH0KICBdLAogICJidWZmZXJWaWV3cyI6IFsKICAgIHsKICAgICAgImJ1ZmZlciI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImJ5dGVMZW5ndGgiOiAzMDI0LAogICAgICAidGFyZ2V0IjogMzQ5NjIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXIiOiAwLAogICAgICAiYnl0ZU9mZnNldCI6IDMwMjQsCiAgICAgICJieXRlTGVuZ3RoIjogMzAyNCwKICAgICAgInRhcmdldCI6IDM0OTYyCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiA2MDQ4LAogICAgICAiYnl0ZUxlbmd0aCI6IDUwNCwKICAgICAgInRhcmdldCI6IDM0OTYzCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiA2NTUyLAogICAgICAiYnl0ZUxlbmd0aCI6IDE3MjgsCiAgICAgICJ0YXJnZXQiOiAzNDk2MgogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlciI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogODI4MCwKICAgICAgImJ5dGVMZW5ndGgiOiAxNzI4LAogICAgICAidGFyZ2V0IjogMzQ5NjIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXIiOiAwLAogICAgICAiYnl0ZU9mZnNldCI6IDEwMDA4LAogICAgICAiYnl0ZUxlbmd0aCI6IDI4OCwKICAgICAgInRhcmdldCI6IDM0OTYzCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAxMDI5NiwKICAgICAgImJ5dGVMZW5ndGgiOiA4NjQsCiAgICAgICJ0YXJnZXQiOiAzNDk2MgogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlciI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogMTExNjAsCiAgICAgICJieXRlTGVuZ3RoIjogODY0LAogICAgICAidGFyZ2V0IjogMzQ5NjIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXIiOiAwLAogICAgICAiYnl0ZU9mZnNldCI6IDEyMDI0LAogICAgICAiYnl0ZUxlbmd0aCI6IDE0NCwKICAgICAgInRhcmdldCI6IDM0OTYzCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAxMjE2OCwKICAgICAgImJ5dGVMZW5ndGgiOiA2MTkyLAogICAgICAidGFyZ2V0IjogMzQ5NjIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXIiOiAwLAogICAgICAiYnl0ZU9mZnNldCI6IDE4MzYwLAogICAgICAiYnl0ZUxlbmd0aCI6IDYxOTIsCiAgICAgICJ0YXJnZXQiOiAzNDk2MgogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlciI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogMjQ1NTIsCiAgICAgICJieXRlTGVuZ3RoIjogMTAzMiwKICAgICAgInRhcmdldCI6IDM0OTYzCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAyNTU4NCwKICAgICAgImJ5dGVMZW5ndGgiOiAxNDQsCiAgICAgICJ0YXJnZXQiOiAzNDk2MgogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlciI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogMjU3MjgsCiAgICAgICJieXRlTGVuZ3RoIjogMTQ0LAogICAgICAidGFyZ2V0IjogMzQ5NjIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXIiOiAwLAogICAgICAiYnl0ZU9mZnNldCI6IDI1ODcyLAogICAgICAiYnl0ZUxlbmd0aCI6IDI0LAogICAgICAidGFyZ2V0IjogMzQ5NjMKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXIiOiAwLAogICAgICAiYnl0ZU9mZnNldCI6IDI1ODk2LAogICAgICAiYnl0ZUxlbmd0aCI6IDQzMiwKICAgICAgInRhcmdldCI6IDM0OTYyCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAyNjMyOCwKICAgICAgImJ5dGVMZW5ndGgiOiA0MzIsCiAgICAgICJ0YXJnZXQiOiAzNDk2MgogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlciI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogMjY3NjAsCiAgICAgICJieXRlTGVuZ3RoIjogNzIsCiAgICAgICJ0YXJnZXQiOiAzNDk2MwogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlciI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogMjY4MzIsCiAgICAgICJieXRlTGVuZ3RoIjogNDMyMCwKICAgICAgInRhcmdldCI6IDM0OTYyCiAgICB9LAogICAgewogICAgICAiYnVmZmVyIjogMCwKICAgICAgImJ5dGVPZmZzZXQiOiAzMTE1MiwKICAgICAgImJ5dGVMZW5ndGgiOiA0MzIwLAogICAgICAidGFyZ2V0IjogMzQ5NjIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXIiOiAwLAogICAgICAiYnl0ZU9mZnNldCI6IDM1NDcyLAogICAgICAiYnl0ZUxlbmd0aCI6IDcyMCwKICAgICAgInRhcmdldCI6IDM0OTYzCiAgICB9CiAgXSwKICAiYWNjZXNzb3JzIjogWwogICAgewogICAgICAiYnVmZmVyVmlldyI6IDAsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiAyNTIsCiAgICAgICJ0eXBlIjogIlZFQzMiLAogICAgICAibWluIjogWwogICAgICAgIC0xLjU4LAogICAgICAgIC0xLjA4LAogICAgICAgIC00LjQKICAgICAgXSwKICAgICAgIm1heCI6IFsKICAgICAgICAxLjU4LAogICAgICAgIDEuMDIsCiAgICAgICAgMy45CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMSwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjYsCiAgICAgICJjb3VudCI6IDI1MiwKICAgICAgInR5cGUiOiAiVkVDMyIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMiwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjMsCiAgICAgICJjb3VudCI6IDI1MiwKICAgICAgInR5cGUiOiAiU0NBTEFSIiwKICAgICAgIm1pbiI6IFsKICAgICAgICAwCiAgICAgIF0sCiAgICAgICJtYXgiOiBbCiAgICAgICAgMjUxCiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMywKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjYsCiAgICAgICJjb3VudCI6IDE0NCwKICAgICAgInR5cGUiOiAiVkVDMyIsCiAgICAgICJtaW4iOiBbCiAgICAgICAgLTEuNTgsCiAgICAgICAgMC43OCwKICAgICAgICAtNC40CiAgICAgIF0sCiAgICAgICJtYXgiOiBbCiAgICAgICAgMS41OCwKICAgICAgICAxLjU0LAogICAgICAgIDMuOQogICAgICBdCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDQsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiAxNDQsCiAgICAgICJ0eXBlIjogIlZFQzMiCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDUsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTIzLAogICAgICAiY291bnQiOiAxNDQsCiAgICAgICJ0eXBlIjogIlNDQUxBUiIsCiAgICAgICJtaW4iOiBbCiAgICAgICAgMAogICAgICBdLAogICAgICAibWF4IjogWwogICAgICAgIDE0MwogICAgICBdCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDYsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiA3MiwKICAgICAgInR5cGUiOiAiVkVDMyIsCiAgICAgICJtaW4iOiBbCiAgICAgICAgLTEuNDgsCiAgICAgICAgMC44NCwKICAgICAgICAtMi4yCiAgICAgIF0sCiAgICAgICJtYXgiOiBbCiAgICAgICAgMS40OCwKICAgICAgICAxLjYyLAogICAgICAgIDIuNAogICAgICBdCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDcsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiA3MiwKICAgICAgInR5cGUiOiAiVkVDMyIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogOCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjMsCiAgICAgICJjb3VudCI6IDcyLAogICAgICAidHlwZSI6ICJTQ0FMQVIiLAogICAgICAibWluIjogWwogICAgICAgIDAKICAgICAgXSwKICAgICAgIm1heCI6IFsKICAgICAgICA3MQogICAgICBdCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDksCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiA1MTYsCiAgICAgICJ0eXBlIjogIlZFQzMiLAogICAgICAibWluIjogWwogICAgICAgIC0wLjE2LAogICAgICAgIDAuODQ5OTk5OTk5OTk5OTk5NiwKICAgICAgICAtMwogICAgICBdLAogICAgICAibWF4IjogWwogICAgICAgIDIuMTgsCiAgICAgICAgNi4yNSwKICAgICAgICA1LjA1CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMTAsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiA1MTYsCiAgICAgICJ0eXBlIjogIlZFQzMiCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDExLAogICAgICAiYnl0ZU9mZnNldCI6IDAsCiAgICAgICJjb21wb25lbnRUeXBlIjogNTEyMywKICAgICAgImNvdW50IjogNTE2LAogICAgICAidHlwZSI6ICJTQ0FMQVIiLAogICAgICAibWluIjogWwogICAgICAgIDAKICAgICAgXSwKICAgICAgIm1heCI6IFsKICAgICAgICA1MTUKICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlclZpZXciOiAxMiwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjYsCiAgICAgICJjb3VudCI6IDEyLAogICAgICAidHlwZSI6ICJWRUMzIiwKICAgICAgIm1pbiI6IFsKICAgICAgICAtMC4wOCwKICAgICAgICAxLjEyLAogICAgICAgIC0yLjk2CiAgICAgIF0sCiAgICAgICJtYXgiOiBbCiAgICAgICAgMS44NiwKICAgICAgICA0LjgyLAogICAgICAgIC0wLjc0CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMTMsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiAxMiwKICAgICAgInR5cGUiOiAiVkVDMyIKICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMTQsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTIzLAogICAgICAiY291bnQiOiAxMiwKICAgICAgInR5cGUiOiAiU0NBTEFSIiwKICAgICAgIm1pbiI6IFsKICAgICAgICAwCiAgICAgIF0sCiAgICAgICJtYXgiOiBbCiAgICAgICAgMTEKICAgICAgXQogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlclZpZXciOiAxNSwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjYsCiAgICAgICJjb3VudCI6IDM2LAogICAgICAidHlwZSI6ICJWRUMzIiwKICAgICAgIm1pbiI6IFsKICAgICAgICAtMC45NiwKICAgICAgICAwLjc4LAogICAgICAgIDEuMjYKICAgICAgXSwKICAgICAgIm1heCI6IFsKICAgICAgICAwLjk2LAogICAgICAgIDAuODgsCiAgICAgICAgMS40NAogICAgICBdCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDE2LAogICAgICAiYnl0ZU9mZnNldCI6IDAsCiAgICAgICJjb21wb25lbnRUeXBlIjogNTEyNiwKICAgICAgImNvdW50IjogMzYsCiAgICAgICJ0eXBlIjogIlZFQzMiCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDE3LAogICAgICAiYnl0ZU9mZnNldCI6IDAsCiAgICAgICJjb21wb25lbnRUeXBlIjogNTEyMywKICAgICAgImNvdW50IjogMzYsCiAgICAgICJ0eXBlIjogIlNDQUxBUiIsCiAgICAgICJtaW4iOiBbCiAgICAgICAgMAogICAgICBdLAogICAgICAibWF4IjogWwogICAgICAgIDM1CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgICJidWZmZXJWaWV3IjogMTgsCiAgICAgICJieXRlT2Zmc2V0IjogMCwKICAgICAgImNvbXBvbmVudFR5cGUiOiA1MTI2LAogICAgICAiY291bnQiOiAzNjAsCiAgICAgICJ0eXBlIjogIlZFQzMiLAogICAgICAibWluIjogWwogICAgICAgIC0wLjc5OTk5OTk5OTk5OTk5OTksCiAgICAgICAgMS4wNiwKICAgICAgICAtMS42MgogICAgICBdLAogICAgICAibWF4IjogWwogICAgICAgIDAuNzk5OTk5OTk5OTk5OTk5OSwKICAgICAgICAxLjM1OTk5OTk5OTk5OTk5OTksCiAgICAgICAgMS4wNAogICAgICBdCiAgICB9LAogICAgewogICAgICAiYnVmZmVyVmlldyI6IDE5LAogICAgICAiYnl0ZU9mZnNldCI6IDAsCiAgICAgICJjb21wb25lbnRUeXBlIjogNTEyNiwKICAgICAgImNvdW50IjogMzYwLAogICAgICAidHlwZSI6ICJWRUMzIgogICAgfSwKICAgIHsKICAgICAgImJ1ZmZlclZpZXciOiAyMCwKICAgICAgImJ5dGVPZmZzZXQiOiAwLAogICAgICAiY29tcG9uZW50VHlwZSI6IDUxMjMsCiAgICAgICJjb3VudCI6IDM2MCwKICAgICAgInR5cGUiOiAiU0NBTEFSIiwKICAgICAgIm1pbiI6IFsKICAgICAgICAwCiAgICAgIF0sCiAgICAgICJtYXgiOiBbCiAgICAgICAgMzU5CiAgICAgIF0KICAgIH0KICBdCn0K\",\n});\n","import { INLINE_SHOWCASE_ASSET_URLS } from \"./showcase-inline-assets.js\";\n\nconst SHOWCASE_ASSET_FILES = Object.freeze({\n brigantine: \"brigantine.gltf\",\n cutter: \"cutter.gltf\",\n lighthouse: \"lighthouse.gltf\",\n \"harbor-dock\": \"harbor-dock.gltf\",\n});\n\nfunction createInlineShowcaseAssetUrl(assetName) {\n const inlineUrl = INLINE_SHOWCASE_ASSET_URLS[assetName];\n return inlineUrl ? new URL(inlineUrl) : null;\n}\n\nfunction getBrowserBaseUrl() {\n if (\n typeof document !== \"undefined\" &&\n typeof document.baseURI === \"string\" &&\n document.baseURI.length > 0\n ) {\n return document.baseURI;\n }\n if (\n typeof window !== \"undefined\" &&\n typeof window.location?.href === \"string\" &&\n window.location.href.length > 0\n ) {\n return window.location.href;\n }\n return null;\n}\n\nfunction normalizeAssetName(assetName) {\n return typeof assetName === \"string\" && assetName in SHOWCASE_ASSET_FILES\n ? assetName\n : \"brigantine\";\n}\n\nfunction parseResolveArgs(baseUrlOrAssetName, assetName) {\n if (\n typeof baseUrlOrAssetName === \"string\" &&\n baseUrlOrAssetName in SHOWCASE_ASSET_FILES &&\n typeof assetName === \"undefined\"\n ) {\n return {\n baseUrl: import.meta.url,\n assetName: baseUrlOrAssetName,\n };\n }\n\n return {\n baseUrl: baseUrlOrAssetName ?? import.meta.url,\n assetName: normalizeAssetName(assetName),\n };\n}\n\nexport function resolveShowcaseAssetUrl(baseUrlOrAssetName, assetName) {\n const resolved = parseResolveArgs(baseUrlOrAssetName, assetName);\n const fileName = SHOWCASE_ASSET_FILES[resolved.assetName];\n\n try {\n return new URL(`../assets/${fileName}`, resolved.baseUrl);\n } catch {\n const browserBaseUrl = getBrowserBaseUrl();\n if (browserBaseUrl) {\n try {\n const normalizedBaseUrl = new URL(resolved.baseUrl, browserBaseUrl);\n return new URL(`../assets/${fileName}`, normalizedBaseUrl);\n } catch {\n const inlineAsset = createInlineShowcaseAssetUrl(resolved.assetName);\n if (inlineAsset) {\n return inlineAsset;\n }\n }\n }\n\n try {\n return new URL(`../assets/${fileName}`, import.meta.url);\n } catch {\n return new URL(`assets/${fileName}`, \"file:///\");\n }\n }\n}\n\nexport function shouldUseInlineShowcaseFallback(url) {\n const href = url instanceof URL ? url.href : String(url ?? \"\");\n return href.includes(\"/assets/\");\n}\n","export const gpuSharedEnGbTranslations = Object.freeze({\n \"gpuShared.showcase.title\": \"Flag by the Sea\",\n \"gpuShared.showcase.subtitle\":\n \"Shared 3D validation scene using GLTF ships, cloth, fluid continuity, adaptive performance, and telemetry.\",\n \"gpuShared.showcase.status.booting\": \"Booting 3D scene...\",\n \"gpuShared.showcase.status.live\": \"3D scene live - {fps} FPS\",\n \"gpuShared.showcase.details.booting\":\n \"Preparing a moonlit harbor scene, GLTF hull data, cloth and fluid continuity plans, and adaptive quality metadata.\",\n \"gpuShared.showcase.details.physics\":\n \"Stable world snapshots are emitted from {snapshotStageId} after the authoritative solver; the heavier hull now carries momentum through mass-aware collision impulses while cloth and fluid remain downstream.\",\n \"gpuShared.showcase.details.realistic\":\n \"Moonlit GLTF ships now mix a brigantine and a cutter against modeled harbor assets; cloth, fluid, and ship-local lighting stay continuous while the governor pressure is {pressureLevel}.\",\n \"gpuShared.showcase.details.legacy\":\n \"Moonlit GLTF ships use the legacy brigantine and placeholder harbor blocks while cloth, fluid, and ship-local lighting stay continuous while the governor pressure is {pressureLevel}.\",\n \"gpuShared.showcase.action.pause\": \"Pause\",\n \"gpuShared.showcase.action.resume\": \"Resume\",\n \"gpuShared.showcase.control.stressMode\": \"Stress mode\",\n \"gpuShared.showcase.control.focus\": \"Focus\",\n \"gpuShared.showcase.focus.integrated\": \"integrated\",\n \"gpuShared.showcase.focus.lighting\": \"lighting\",\n \"gpuShared.showcase.focus.cloth\": \"cloth\",\n \"gpuShared.showcase.focus.fluid\": \"fluid\",\n \"gpuShared.showcase.focus.physics\": \"physics\",\n \"gpuShared.showcase.focus.performance\": \"performance\",\n \"gpuShared.showcase.focus.debug\": \"debug\",\n \"gpuShared.showcase.legend.title\": \"Scene\",\n \"gpuShared.showcase.legend.shipMetadata\":\n \"GLTF ships carry hull mass and damping metadata.\",\n \"gpuShared.showcase.legend.lighting\":\n \"Lanterns and torches warm the moonlit harbor.\",\n \"gpuShared.showcase.legend.collisions\":\n \"Mass-aware collisions stay authoritative near the camera.\",\n \"gpuShared.showcase.section.sceneState\": \"Scene State\",\n \"gpuShared.showcase.section.qualityBudgets\": \"Quality + Budgets\",\n \"gpuShared.showcase.section.debugTelemetry\": \"Debug Telemetry\",\n \"gpuShared.showcase.section.notes\": \"Notes\",\n \"gpuShared.showcase.note.assetLoading\":\n \"Ships are loaded from a GLTF asset and carry mass, damping, restitution, and hull extents from node extras.\",\n \"gpuShared.showcase.note.moonlight\":\n \"Moonlight sets the cold ambient read while deck lanterns and harbor torches provide warm local contrast.\",\n \"gpuShared.showcase.note.continuity\":\n \"Cloth and fluid continuity stay coherent across near, mid, far, and horizon bands even in the darker night palette.\",\n \"gpuShared.showcase.note.performance\":\n \"Performance pressure reduces visual detail before mass-weighted authoritative collision motion is touched.\",\n \"gpuShared.showcase.note.physicsSnapshots\":\n \"Stable world snapshots are taken after the authoritative rigid-body commit and before visual follow-up work.\",\n \"gpuShared.showcase.note.physicsCollisions\":\n \"The ships collide with mass-weighted impulses and positional correction, so the heavier hull keeps more of its line.\",\n \"gpuShared.showcase.note.physicsLighting\":\n \"Moonlight keeps the overall read legible while lanterns and torches make collision moments easy to track against the water.\",\n \"gpuShared.debug.adapter.showcase\": \"3D showcase\",\n \"gpuShared.debug.allocation.mainColorBuffer\": \"Main color buffer\",\n \"gpuShared.debug.allocation.shadowImpressionAtlas\": \"Shadow impression atlas\",\n});\n\n","import { gpuSharedEnGbTranslations } from \"./translations/en-GB.js\";\n\nexport const gpuSharedTranslationKeys = Object.freeze({\n showcaseTitle: \"gpuShared.showcase.title\",\n showcaseSubtitle: \"gpuShared.showcase.subtitle\",\n statusBooting: \"gpuShared.showcase.status.booting\",\n statusLive: \"gpuShared.showcase.status.live\",\n detailsBooting: \"gpuShared.showcase.details.booting\",\n detailsPhysics: \"gpuShared.showcase.details.physics\",\n detailsRealistic: \"gpuShared.showcase.details.realistic\",\n detailsLegacy: \"gpuShared.showcase.details.legacy\",\n pause: \"gpuShared.showcase.action.pause\",\n resume: \"gpuShared.showcase.action.resume\",\n stressMode: \"gpuShared.showcase.control.stressMode\",\n focus: \"gpuShared.showcase.control.focus\",\n focusIntegrated: \"gpuShared.showcase.focus.integrated\",\n focusLighting: \"gpuShared.showcase.focus.lighting\",\n focusCloth: \"gpuShared.showcase.focus.cloth\",\n focusFluid: \"gpuShared.showcase.focus.fluid\",\n focusPhysics: \"gpuShared.showcase.focus.physics\",\n focusPerformance: \"gpuShared.showcase.focus.performance\",\n focusDebug: \"gpuShared.showcase.focus.debug\",\n legendTitle: \"gpuShared.showcase.legend.title\",\n legendShipMetadata: \"gpuShared.showcase.legend.shipMetadata\",\n legendLighting: \"gpuShared.showcase.legend.lighting\",\n legendCollisions: \"gpuShared.showcase.legend.collisions\",\n sceneState: \"gpuShared.showcase.section.sceneState\",\n qualityBudgets: \"gpuShared.showcase.section.qualityBudgets\",\n debugTelemetry: \"gpuShared.showcase.section.debugTelemetry\",\n notes: \"gpuShared.showcase.section.notes\",\n noteAssetLoading: \"gpuShared.showcase.note.assetLoading\",\n noteMoonlight: \"gpuShared.showcase.note.moonlight\",\n noteContinuity: \"gpuShared.showcase.note.continuity\",\n notePerformance: \"gpuShared.showcase.note.performance\",\n notePhysicsSnapshots: \"gpuShared.showcase.note.physicsSnapshots\",\n notePhysicsCollisions: \"gpuShared.showcase.note.physicsCollisions\",\n notePhysicsLighting: \"gpuShared.showcase.note.physicsLighting\",\n debugAdapterShowcase: \"gpuShared.debug.adapter.showcase\",\n debugMainColorBuffer: \"gpuShared.debug.allocation.mainColorBuffer\",\n debugShadowImpressionAtlas: \"gpuShared.debug.allocation.shadowImpressionAtlas\",\n});\n\nexport const gpuSharedTranslations = Object.freeze({\n \"en-GB\": gpuSharedEnGbTranslations,\n});\n\nfunction formatTranslation(template, args = {}) {\n return template.replace(/\\{([A-Za-z0-9_]+)\\}/g, (match, name) => {\n if (!Object.prototype.hasOwnProperty.call(args, name)) {\n return match;\n }\n\n const value = args[name];\n return value == null ? \"\" : String(value);\n });\n}\n\nexport function translateGpuSharedText(key, args, translate) {\n const translated = translate?.(key, args);\n if (translated && translated !== key) {\n return translated;\n }\n\n const fallback = gpuSharedEnGbTranslations[key];\n return fallback ? formatTranslation(fallback, args) : key;\n}\n\nexport function createGpuSharedTranslator(translate) {\n return (key, args) => translateGpuSharedText(key, args, translate);\n}\n\n","export const GPU_SHOWCASE_REALISTIC_MODELS_FEATURE = \"gpu_showcase_realistic_models_v1\";\nexport const GPU_SHOWCASE_PRODUCT_STUDIO_FEATURE = \"gpu_showcase_product_studio_wavefront_v1\";\n","import { shouldUseInlineShowcaseFallback } from \"./asset-url.js\";\n\nfunction decodeDataUri(uri) {\n const match = /^data:.*?;base64,(.+)$/i.exec(uri);\n if (!match) {\n throw new Error(`Unsupported glTF buffer URI: ${uri.slice(0, 48)}`);\n }\n\n const binary = atob(match[1]);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes.buffer;\n}\n\nfunction getComponentArray(componentType, buffer, byteOffset, count) {\n switch (componentType) {\n case 5121:\n return new Uint8Array(buffer, byteOffset, count);\n case 5123:\n return new Uint16Array(buffer, byteOffset, count);\n case 5125:\n return new Uint32Array(buffer, byteOffset, count);\n case 5126:\n return new Float32Array(buffer, byteOffset, count);\n default:\n throw new Error(`Unsupported glTF componentType: ${componentType}`);\n }\n}\n\nfunction getNormalizationScale(componentType) {\n switch (componentType) {\n case 5121:\n return 255;\n case 5123:\n return 65535;\n default:\n return 1;\n }\n}\n\nfunction getTypeSize(type) {\n switch (type) {\n case \"SCALAR\":\n return 1;\n case \"VEC2\":\n return 2;\n case \"VEC3\":\n return 3;\n case \"VEC4\":\n return 4;\n default:\n throw new Error(`Unsupported glTF accessor type: ${type}`);\n }\n}\n\nfunction readAccessor(document, accessorIndex, buffers) {\n const accessor = document.accessors?.[accessorIndex];\n if (!accessor) {\n throw new Error(`glTF accessor ${accessorIndex} is missing.`);\n }\n\n const bufferView = document.bufferViews?.[accessor.bufferView];\n if (!bufferView) {\n throw new Error(`glTF bufferView ${accessor.bufferView} is missing.`);\n }\n\n const buffer = buffers[bufferView.buffer];\n const componentCount = getTypeSize(accessor.type);\n const byteOffset = (bufferView.byteOffset ?? 0) + (accessor.byteOffset ?? 0);\n const valueCount = accessor.count * componentCount;\n const values = Array.from(\n getComponentArray(accessor.componentType, buffer, byteOffset, valueCount)\n );\n\n if (accessor.normalized) {\n const scale = getNormalizationScale(accessor.componentType);\n return values.map((value) => value / scale);\n }\n\n return values;\n}\n\nfunction getMaterialInfo(document, primitive) {\n const material = document.materials?.[primitive.material] ?? null;\n const factor =\n material?.pbrMetallicRoughness?.baseColorFactor ?? [0.56, 0.33, 0.22, 1];\n const emissive = material?.emissiveFactor ?? [0, 0, 0];\n\n return Object.freeze({\n name: material?.name ?? \"default-material\",\n color: Object.freeze({\n r: factor[0],\n g: factor[1],\n b: factor[2],\n a: factor[3] ?? 1,\n }),\n roughness:\n typeof material?.pbrMetallicRoughness?.roughnessFactor === \"number\"\n ? material.pbrMetallicRoughness.roughnessFactor\n : 0.92,\n metallic:\n typeof material?.pbrMetallicRoughness?.metallicFactor === \"number\"\n ? material.pbrMetallicRoughness.metallicFactor\n : 0.08,\n emissive: Object.freeze({\n r: emissive[0] ?? 0,\n g: emissive[1] ?? 0,\n b: emissive[2] ?? 0,\n }),\n });\n}\n\nfunction computeBounds(positions) {\n const min = [\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n ];\n const max = [\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ];\n\n for (let index = 0; index < positions.length; index += 3) {\n min[0] = Math.min(min[0], positions[index]);\n min[1] = Math.min(min[1], positions[index + 1]);\n min[2] = Math.min(min[2], positions[index + 2]);\n max[0] = Math.max(max[0], positions[index]);\n max[1] = Math.max(max[1], positions[index + 1]);\n max[2] = Math.max(max[2], positions[index + 2]);\n }\n\n return Object.freeze({\n min: Object.freeze([min[0], min[1], min[2]]),\n max: Object.freeze([max[0], max[1], max[2]]),\n });\n}\n\nfunction appendValues(target, values) {\n for (let index = 0; index < values.length; index += 1) {\n target.push(values[index]);\n }\n}\n\nfunction resolveBrowserRequestBaseUrl() {\n if (\n typeof document !== \"undefined\" &&\n typeof document.baseURI === \"string\" &&\n document.baseURI.length > 0\n ) {\n return document.baseURI;\n }\n if (\n typeof window !== \"undefined\" &&\n typeof window.location?.href === \"string\" &&\n window.location.href.length > 0\n ) {\n return window.location.href;\n }\n return null;\n}\n\nfunction resolveFetchBaseUrl(requestUrl, responseUrl) {\n if (typeof responseUrl === \"string\" && responseUrl.length > 0) {\n try {\n return new URL(responseUrl);\n } catch {\n // Keep trying the other candidates when an environment reports a malformed response URL.\n }\n }\n\n try {\n return new URL(requestUrl);\n } catch {\n const browserBaseUrl = resolveBrowserRequestBaseUrl();\n if (browserBaseUrl) {\n return new URL(requestUrl, browserBaseUrl);\n }\n throw new Error(\n `Unable to resolve a stable base URL for glTF asset loading: ${String(requestUrl)}`\n );\n }\n}\n\nfunction createIdentityMatrix() {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\nfunction multiplyMatrices(a, b) {\n const out = new Array(16).fill(0);\n for (let column = 0; column < 4; column += 1) {\n for (let row = 0; row < 4; row += 1) {\n out[column * 4 + row] =\n a[0 * 4 + row] * b[column * 4 + 0] +\n a[1 * 4 + row] * b[column * 4 + 1] +\n a[2 * 4 + row] * b[column * 4 + 2] +\n a[3 * 4 + row] * b[column * 4 + 3];\n }\n }\n return out;\n}\n\nfunction composeNodeMatrix(node) {\n if (Array.isArray(node.matrix) && node.matrix.length === 16) {\n return [...node.matrix];\n }\n\n const translation = Array.isArray(node.translation) ? node.translation : [0, 0, 0];\n const rotation = Array.isArray(node.rotation) ? node.rotation : [0, 0, 0, 1];\n const scale = Array.isArray(node.scale) ? node.scale : [1, 1, 1];\n const [x, y, z, w] = rotation;\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n\n return [\n (1 - (yy + zz)) * scale[0],\n (xy + wz) * scale[0],\n (xz - wy) * scale[0],\n 0,\n (xy - wz) * scale[1],\n (1 - (xx + zz)) * scale[1],\n (yz + wx) * scale[1],\n 0,\n (xz + wy) * scale[2],\n (yz - wx) * scale[2],\n (1 - (xx + yy)) * scale[2],\n 0,\n translation[0],\n translation[1],\n translation[2],\n 1,\n ];\n}\n\nfunction transformPosition(position, matrix) {\n return [\n matrix[0] * position[0] + matrix[4] * position[1] + matrix[8] * position[2] + matrix[12],\n matrix[1] * position[0] + matrix[5] * position[1] + matrix[9] * position[2] + matrix[13],\n matrix[2] * position[0] + matrix[6] * position[1] + matrix[10] * position[2] + matrix[14],\n ];\n}\n\nfunction transformNormal(normal, matrix) {\n const transformed = [\n matrix[0] * normal[0] + matrix[4] * normal[1] + matrix[8] * normal[2],\n matrix[1] * normal[0] + matrix[5] * normal[1] + matrix[9] * normal[2],\n matrix[2] * normal[0] + matrix[6] * normal[1] + matrix[10] * normal[2],\n ];\n const length = Math.hypot(transformed[0], transformed[1], transformed[2]) || 1;\n return [transformed[0] / length, transformed[1] / length, transformed[2] / length];\n}\n\nfunction collectScenePrimitives(document, buffers) {\n const scene = document.scenes?.[document.scene ?? 0];\n if (!scene || !Array.isArray(scene.nodes) || scene.nodes.length === 0) {\n throw new Error(\"glTF demo asset must expose a default scene with at least one node.\");\n }\n\n const results = [];\n let modelName = null;\n let physics = null;\n\n function visit(nodeIndex, parentMatrix) {\n const node = document.nodes?.[nodeIndex];\n if (!node) {\n throw new Error(`glTF node ${nodeIndex} is missing.`);\n }\n\n const localMatrix = composeNodeMatrix(node);\n const worldMatrix = multiplyMatrices(parentMatrix, localMatrix);\n\n if (!modelName && typeof node.name === \"string\" && node.name.length > 0) {\n modelName = node.name;\n }\n\n if (!physics && node.extras?.physics && typeof node.extras.physics === \"object\") {\n physics = Object.freeze({ ...node.extras.physics });\n }\n\n if (typeof node.mesh === \"number\") {\n const mesh = document.meshes?.[node.mesh];\n if (!mesh || !Array.isArray(mesh.primitives)) {\n throw new Error(`glTF mesh ${node.mesh} is missing primitives.`);\n }\n\n mesh.primitives.forEach((primitive, primitiveIndex) => {\n const positions = readAccessor(document, primitive.attributes.POSITION, buffers);\n const normals =\n typeof primitive.attributes.NORMAL === \"number\"\n ? readAccessor(document, primitive.attributes.NORMAL, buffers)\n : null;\n const colors =\n typeof primitive.attributes.COLOR_0 === \"number\"\n ? readAccessor(document, primitive.attributes.COLOR_0, buffers)\n : null;\n const transformedPositions = [];\n const transformedNormals = [];\n\n for (let index = 0; index < positions.length; index += 3) {\n const point = transformPosition(\n [positions[index], positions[index + 1], positions[index + 2]],\n worldMatrix\n );\n transformedPositions.push(point[0], point[1], point[2]);\n\n if (normals) {\n const normal = transformNormal(\n [normals[index], normals[index + 1], normals[index + 2]],\n worldMatrix\n );\n transformedNormals.push(normal[0], normal[1], normal[2]);\n }\n }\n\n const indices =\n typeof primitive.indices === \"number\"\n ? readAccessor(document, primitive.indices, buffers).map((value) => Number(value))\n : Array.from({ length: transformedPositions.length / 3 }, (_, index) => index);\n const material = getMaterialInfo(document, primitive);\n const primitiveName =\n `${node.name ?? mesh.name ?? \"mesh\"}-${primitiveIndex}`;\n\n results.push(\n Object.freeze({\n name: primitiveName,\n positions: Object.freeze(transformedPositions),\n indices: Object.freeze(indices),\n normals:\n transformedNormals.length > 0\n ? Object.freeze(transformedNormals)\n : null,\n colors: colors ? Object.freeze(colors) : null,\n material,\n bounds: computeBounds(transformedPositions),\n })\n );\n });\n }\n\n if (Array.isArray(node.children)) {\n for (const childIndex of node.children) {\n visit(childIndex, worldMatrix);\n }\n }\n }\n\n for (const rootNodeIndex of scene.nodes) {\n visit(rootNodeIndex, createIdentityMatrix());\n }\n\n if (results.length === 0) {\n throw new Error(\"glTF demo asset must contain at least one mesh primitive.\");\n }\n\n return {\n name: modelName ?? \"gltf-model\",\n physics: physics ?? Object.freeze({}),\n primitives: results,\n };\n}\n\nasync function loadGltfDocument(url) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load glTF asset: ${response.status} ${response.statusText}`);\n }\n\n return {\n document: await response.json(),\n baseUrl: resolveFetchBaseUrl(url, response.url),\n };\n}\n\nasync function loadInlineShowcaseDocument() {\n const module = await import(\"./showcase-inline-assets.js\");\n return loadGltfDocument(new URL(module.INLINE_SHOWCASE_ASSET_URLS.brigantine));\n}\n\nasync function buildGltfModel(document, baseUrl) {\n const buffers = await Promise.all(\n (document.buffers ?? []).map(async (buffer) => {\n if (typeof buffer.uri !== \"string\") {\n throw new Error(\"glTF buffer URI is required for demo asset loading.\");\n }\n if (buffer.uri.startsWith(\"data:\")) {\n return decodeDataUri(buffer.uri);\n }\n const nested = await fetch(new URL(buffer.uri, baseUrl));\n if (!nested.ok) {\n throw new Error(`Failed to load glTF buffer: ${nested.status} ${nested.statusText}`);\n }\n return nested.arrayBuffer();\n })\n );\n\n const scene = collectScenePrimitives(document, buffers);\n const aggregatePositions = [];\n const aggregateIndices = [];\n\n for (const primitive of scene.primitives) {\n const vertexOffset = aggregatePositions.length / 3;\n appendValues(aggregatePositions, primitive.positions);\n for (const index of primitive.indices) {\n aggregateIndices.push(index + vertexOffset);\n }\n }\n\n const color = scene.primitives[0]?.material?.color ?? { r: 0.56, g: 0.33, b: 0.22, a: 1 };\n\n return Object.freeze({\n name: scene.name,\n positions: Object.freeze(aggregatePositions),\n indices: Object.freeze(aggregateIndices),\n bounds: computeBounds(aggregatePositions),\n color: Object.freeze({ ...color }),\n physics: scene.physics,\n primitives: Object.freeze(scene.primitives),\n });\n}\n\nfunction shouldRetryWithInlineShowcaseFallback(url, error) {\n if (!shouldUseInlineShowcaseFallback(url)) {\n return false;\n }\n\n return error instanceof TypeError || /^Failed to load glTF asset:/u.test(error.message);\n}\n\nexport async function loadGltfModel(url) {\n try {\n const { document, baseUrl } = await loadGltfDocument(url);\n return buildGltfModel(document, baseUrl);\n } catch (error) {\n if (!shouldRetryWithInlineShowcaseFallback(url, error)) {\n throw error;\n }\n\n const { document, baseUrl } = await loadInlineShowcaseDocument();\n return buildGltfModel(document, baseUrl);\n }\n}\n","import { loadGltfModel } from \"./gltf-loader.js\";\n\nconst STYLE_ID = \"plasius-product-studio-wavefront-style\";\nconst DEFAULT_PRODUCT_ASSET_URL =\n \"/data/models/eames-lounge-chair-ottoman/Eames_Lounge_Chair_Ottoman.gltf\";\nconst DEFAULT_TARGET_CENTER = Object.freeze([0, 0.74, 0]);\nconst DEFAULT_TARGET_SIZE = 2.25;\n\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction isFiniteVector(value) {\n return (\n Array.isArray(value) &&\n value.length >= 3 &&\n Number.isFinite(value[0]) &&\n Number.isFinite(value[1]) &&\n Number.isFinite(value[2])\n );\n}\n\nfunction createEmptyBounds() {\n return {\n min: [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],\n max: [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],\n };\n}\n\nfunction expandBounds(bounds, point) {\n bounds.min[0] = Math.min(bounds.min[0], point[0]);\n bounds.min[1] = Math.min(bounds.min[1], point[1]);\n bounds.min[2] = Math.min(bounds.min[2], point[2]);\n bounds.max[0] = Math.max(bounds.max[0], point[0]);\n bounds.max[1] = Math.max(bounds.max[1], point[1]);\n bounds.max[2] = Math.max(bounds.max[2], point[2]);\n}\n\nfunction getBoundsSize(bounds) {\n return [\n bounds.max[0] - bounds.min[0],\n bounds.max[1] - bounds.min[1],\n bounds.max[2] - bounds.min[2],\n ];\n}\n\nfunction getBoundsCenter(bounds) {\n return [\n (bounds.min[0] + bounds.max[0]) * 0.5,\n (bounds.min[1] + bounds.max[1]) * 0.5,\n (bounds.min[2] + bounds.max[2]) * 0.5,\n ];\n}\n\nfunction getModelBounds(model) {\n if (isFiniteVector(model?.bounds?.min) && isFiniteVector(model?.bounds?.max)) {\n return {\n min: [...model.bounds.min],\n max: [...model.bounds.max],\n };\n }\n\n const bounds = createEmptyBounds();\n for (const primitive of model?.primitives ?? []) {\n for (let index = 0; index < primitive.positions.length; index += 3) {\n expandBounds(bounds, [\n primitive.positions[index],\n primitive.positions[index + 1],\n primitive.positions[index + 2],\n ]);\n }\n }\n return bounds;\n}\n\nfunction transformPoint(point, modelCenter, scale, targetCenter) {\n return [\n (point[0] - modelCenter[0]) * scale + targetCenter[0],\n (point[1] - modelCenter[1]) * scale + targetCenter[1],\n (point[2] - modelCenter[2]) * scale + targetCenter[2],\n ];\n}\n\nfunction readMaterialColor(material) {\n const color = material?.color ?? {};\n return [\n Number.isFinite(color.r) ? color.r : 0.62,\n Number.isFinite(color.g) ? color.g : 0.56,\n Number.isFinite(color.b) ? color.b : 0.48,\n Number.isFinite(color.a) ? color.a : 1,\n ];\n}\n\nfunction readMaterialKind(material) {\n const emissive = material?.emissive ?? {};\n if ((emissive.r ?? 0) + (emissive.g ?? 0) + (emissive.b ?? 0) > 0.001) {\n return \"emissive\";\n }\n if ((material?.metallic ?? 0) >= 0.5) {\n return \"metal\";\n }\n const alpha = readMaterialColor(material)[3];\n if (alpha < 0.9) {\n return \"transparent\";\n }\n return \"diffuse\";\n}\n\nfunction readEmission(material) {\n const emissive = material?.emissive ?? {};\n return [\n Number.isFinite(emissive.r) ? emissive.r : 0,\n Number.isFinite(emissive.g) ? emissive.g : 0,\n Number.isFinite(emissive.b) ? emissive.b : 0,\n 1,\n ];\n}\n\nfunction createQuadMesh({\n id,\n corners,\n color,\n emission = [0, 0, 0, 1],\n materialKind = \"diffuse\",\n roughness = 0.72,\n metallic = 0,\n opacity = color[3] ?? 1,\n}) {\n const [a, b, c] = corners;\n const edge1 = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];\n const edge2 = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];\n const normal = [\n edge1[1] * edge2[2] - edge1[2] * edge2[1],\n edge1[2] * edge2[0] - edge1[0] * edge2[2],\n edge1[0] * edge2[1] - edge1[1] * edge2[0],\n ];\n const length = Math.hypot(normal[0], normal[1], normal[2]) || 1;\n const unitNormal = normal.map((value) => value / length);\n\n return Object.freeze({\n id,\n positions: Object.freeze(corners.flat()),\n indices: Object.freeze([0, 1, 2, 0, 2, 3]),\n normals: Object.freeze([unitNormal, unitNormal, unitNormal, unitNormal].flat()),\n color: Object.freeze([...color]),\n emission: Object.freeze([...emission]),\n materialKind,\n roughness,\n metallic,\n opacity,\n });\n}\n\nfunction createProductStudioEnvironmentMeshes() {\n return [\n createQuadMesh({\n id: 1,\n corners: [\n [-3.2, -0.08, 2.4],\n [3.2, -0.08, 2.4],\n [3.2, -0.08, -3.1],\n [-3.2, -0.08, -3.1],\n ],\n color: [0.48, 0.55, 0.55, 1],\n roughness: 0.82,\n }),\n createQuadMesh({\n id: 2,\n corners: [\n [-3.2, -0.08, -2.45],\n [3.2, -0.08, -2.45],\n [3.2, 2.65, -2.45],\n [-3.2, 2.65, -2.45],\n ],\n color: [0.43, 0.42, 0.38, 1],\n roughness: 0.86,\n }),\n createQuadMesh({\n id: 3,\n corners: [\n [-2.85, -0.08, -2.45],\n [-2.85, 2.55, -2.45],\n [-2.85, 2.55, 2.15],\n [-2.85, -0.08, 2.15],\n ],\n color: [0.36, 0.42, 0.45, 1],\n roughness: 0.8,\n }),\n createQuadMesh({\n id: 4,\n corners: [\n [0.78, 2.55, -0.82],\n [-0.78, 2.55, -0.82],\n [-0.78, 2.55, -1.78],\n [0.78, 2.55, -1.78],\n ],\n color: [1, 0.94, 0.78, 1],\n emission: [8.5, 7.2, 4.8, 1],\n materialKind: \"emissive\",\n roughness: 0,\n }),\n ];\n}\n\nfunction createProductStudioMeshFromPrimitive(primitive, primitiveIndex, transform) {\n if (!Array.isArray(primitive?.positions) || primitive.positions.length < 9) {\n return null;\n }\n\n const positions = [];\n for (let index = 0; index < primitive.positions.length; index += 3) {\n const point = transform([\n primitive.positions[index],\n primitive.positions[index + 1],\n primitive.positions[index + 2],\n ]);\n positions.push(point[0], point[1], point[2]);\n }\n\n const indices =\n Array.isArray(primitive.indices) && primitive.indices.length >= 3\n ? [...primitive.indices]\n : Array.from({ length: positions.length / 3 }, (_, index) => index);\n const material = primitive.material ?? {};\n const color = readMaterialColor(material);\n\n return Object.freeze({\n id: 1000 + primitiveIndex,\n positions: Object.freeze(positions),\n indices: Object.freeze(indices),\n normals: Array.isArray(primitive.normals) ? Object.freeze([...primitive.normals]) : null,\n color: Object.freeze(color),\n emission: Object.freeze(readEmission(material)),\n materialKind: readMaterialKind(material),\n materialRefId: 1000 + primitiveIndex,\n roughness: Number.isFinite(material.roughness) ? material.roughness : 0.72,\n metallic: Number.isFinite(material.metallic) ? material.metallic : 0,\n opacity: color[3],\n });\n}\n\nexport function createProductStudioMeshes(model, options = {}) {\n const primitives = Array.isArray(model?.primitives) ? model.primitives : [];\n if (primitives.length === 0) {\n throw new Error(\"Product Studio model must contain at least one renderable primitive.\");\n }\n\n const targetCenter = isFiniteVector(options.targetCenter)\n ? [...options.targetCenter]\n : [...DEFAULT_TARGET_CENTER];\n const targetSize = Number.isFinite(options.targetSize)\n ? Math.max(options.targetSize, 0.25)\n : DEFAULT_TARGET_SIZE;\n const modelBounds = getModelBounds(model);\n const modelSize = getBoundsSize(modelBounds);\n const modelCenter = getBoundsCenter(modelBounds);\n const scale = targetSize / Math.max(modelSize[0], modelSize[1], modelSize[2], 0.000001);\n const transform = (point) => transformPoint(point, modelCenter, scale, targetCenter);\n const modelMeshes = primitives\n .map((primitive, index) => createProductStudioMeshFromPrimitive(primitive, index, transform))\n .filter(Boolean);\n\n return Object.freeze([...createProductStudioEnvironmentMeshes(), ...modelMeshes]);\n}\n\nfunction ensureStyles(documentRef) {\n if (documentRef.getElementById?.(STYLE_ID)) {\n return;\n }\n const style = documentRef.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n .plasius-product-studio-wavefront {\n position: relative;\n width: 100%;\n min-height: 420px;\n overflow: hidden;\n background: #0f1418;\n display: grid;\n place-items: center;\n }\n\n .plasius-product-studio-wavefront canvas {\n display: block;\n width: 100%;\n height: auto;\n max-height: 100%;\n aspect-ratio: 16 / 9;\n min-height: 420px;\n object-fit: contain;\n }\n `;\n documentRef.head?.appendChild?.(style);\n}\n\nfunction resolveRoot(options) {\n const documentRef = options.document ?? globalThis.document;\n if (options.root) {\n return options.root;\n }\n const root =\n documentRef?.querySelector?.(\"[data-plasius-gpu-product-studio]\") ?? documentRef?.body;\n if (!root) {\n throw new Error(\"Product Studio requires a DOM root.\");\n }\n return root;\n}\n\nfunction resolveRenderSize(root, options) {\n const rect = root.getBoundingClientRect?.() ?? { width: 1280, height: 720 };\n const devicePixelRatio =\n Number.isFinite(options.devicePixelRatio)\n ? options.devicePixelRatio\n : Number.isFinite(globalThis.window?.devicePixelRatio)\n ? globalThis.window.devicePixelRatio\n : 1;\n const cssWidth = Number.isFinite(rect.width) && rect.width > 0 ? rect.width : 1280;\n const cssHeight =\n Number.isFinite(rect.height) && rect.height > 0 ? rect.height : cssWidth * (9 / 16);\n const width = Number.isFinite(options.width)\n ? Math.trunc(options.width)\n : clamp(Math.round(cssWidth * devicePixelRatio), 640, 1920);\n const height = Number.isFinite(options.height)\n ? Math.trunc(options.height)\n : clamp(Math.round(cssHeight * devicePixelRatio), 360, 1080);\n\n return {\n width,\n height,\n };\n}\n\nfunction installSnapshotHook(state) {\n if (typeof globalThis.window === \"undefined\") {\n return () => {};\n }\n const previous = globalThis.window.render_game_to_text;\n globalThis.window.render_game_to_text = () =>\n JSON.stringify({\n surface: \"gpu-product-studio-wavefront\",\n model: state.modelName,\n sourceTriangles: state.sourceTriangleCount,\n meshCount: state.meshCount,\n geometryMode: state.geometryMode,\n requiresTriangleMeshRenderer: state.requiresTriangleMeshRenderer,\n displayQuality: state.displayQuality,\n requiresMeshBvhForDisplayQuality: state.requiresMeshBvhForDisplayQuality,\n renderer: state.rendererStats,\n });\n return () => {\n if (previous === undefined) {\n delete globalThis.window.render_game_to_text;\n } else {\n globalThis.window.render_game_to_text = previous;\n }\n };\n}\n\nfunction countSourceTriangles(model) {\n return (model.primitives ?? []).reduce(\n (total, primitive) => total + Math.floor((primitive.indices?.length ?? 0) / 3),\n 0\n );\n}\n\nasync function resolveWavefrontLightingOptions(options) {\n const fallback = {\n environmentColor: [0.35, 0.43, 0.49, 1],\n ambientColor: [0.02, 0.024, 0.028, 1],\n };\n const lightingLoader =\n typeof options.__lightingLoader === \"function\"\n ? options.__lightingLoader\n : () => import(\"@plasius/gpu-lighting\").catch(() => null);\n const lightingModule = await lightingLoader();\n\n if (\n typeof lightingModule?.createWavefrontEnvironmentLightingOptions !== \"function\"\n ) {\n return fallback;\n }\n\n return lightingModule.createWavefrontEnvironmentLightingOptions({\n preset: options.lightingPreset ?? \"product-studio\",\n intensity: options.lightingIntensity,\n });\n}\n\nexport async function mountGpuProductStudio(options = {}, featureFlags = null) {\n const root = resolveRoot(options);\n const documentRef = options.document ?? root.ownerDocument ?? globalThis.document;\n ensureStyles(documentRef);\n const previousMarkup = root.innerHTML;\n root.innerHTML = \"\";\n root.classList?.add?.(\"plasius-product-studio-wavefront\");\n\n const canvas = documentRef.createElement(\"canvas\");\n canvas.dataset.plasiusGpuProductStudio = \"wavefront\";\n root.appendChild(canvas);\n\n const modelLoader =\n typeof options.__modelLoader === \"function\" ? options.__modelLoader : loadGltfModel;\n const rendererLoader =\n typeof options.__rendererLoader === \"function\"\n ? options.__rendererLoader\n : () => import(\"@plasius/gpu-renderer\");\n const assetUrl = options.productAssetUrl ?? options.assetUrl ?? DEFAULT_PRODUCT_ASSET_URL;\n const model = await modelLoader(assetUrl);\n const meshes = createProductStudioMeshes(model, {\n targetCenter: options.targetCenter,\n targetSize: options.targetSize,\n });\n const rendererModule = await rendererLoader();\n if (typeof rendererModule.createWavefrontPathTracingComputeRenderer !== \"function\") {\n throw new Error(\"Product Studio renderer loader must provide createWavefrontPathTracingComputeRenderer.\");\n }\n\n const size = resolveRenderSize(root, options);\n const lightingOptions = await resolveWavefrontLightingOptions(options);\n const renderer = await rendererModule.createWavefrontPathTracingComputeRenderer({\n canvas,\n width: size.width,\n height: size.height,\n maxDepth: Number.isFinite(options.maxDepth) ? options.maxDepth : 6,\n tileSize: Number.isFinite(options.tileSize) ? options.tileSize : 128,\n samplesPerPixel: Number.isFinite(options.samplesPerPixel) ? options.samplesPerPixel : 8,\n denoise: options.denoise !== false,\n displayQuality: true,\n meshes,\n camera: {\n position: [0, 1.12, 5.05],\n target: [0, 0.72, 0],\n up: [0, 1, 0],\n fovYDegrees: 43,\n },\n ...lightingOptions,\n });\n const rendererStats = renderer.renderOnce();\n const state = Object.freeze({\n featureFlags,\n modelName: model.name,\n sourceTriangleCount: countSourceTriangles(model),\n meshCount: meshes.length,\n geometryMode: \"mesh-bvh-display-quality\",\n requiresTriangleMeshRenderer: true,\n displayQuality: true,\n requiresMeshBvhForDisplayQuality: true,\n rendererStats,\n });\n const restoreSnapshotHook = installSnapshotHook(state);\n\n return Object.freeze({\n state,\n model,\n canvas,\n renderer,\n meshes,\n destroy() {\n restoreSnapshotHook();\n renderer.destroy();\n root.classList?.remove?.(\"plasius-product-studio-wavefront\");\n root.innerHTML = previousMarkup;\n },\n });\n}\n","import { resolveShowcaseAssetUrl } from \"./asset-url.js\";\nimport { loadGltfModel } from \"./gltf-loader.js\";\nimport { GPU_SHOWCASE_REALISTIC_MODELS_FEATURE } from \"./feature-flags.js\";\nimport {\n createGpuSharedTranslator,\n gpuSharedTranslationKeys,\n} from \"./i18n.js\";\n\nconst STYLE_ID = \"plasius-shared-3d-showcase-style\";\nconst ROOT_CLASS = \"plasius-showcase-root\";\nconst CAPTURE_CLASS = \"plasius-showcase-root--capture\";\nconst DEFAULT_CANVAS_WIDTH = 1280;\nconst DEFAULT_CANVAS_HEIGHT = 720;\nconst CAPTURE_CANVAS_PIXEL_BUDGET = 1920 * 1080;\nconst SHIP_SCALE = 1.1;\nconst HARBOR_BOUNDS = Object.freeze({\n minX: -11.2,\n maxX: 11.2,\n minZ: 1.8,\n maxZ: 17.2,\n});\nconst CAMERA_PRESETS = Object.freeze({\n integrated: Object.freeze({ yaw: -0.55, pitch: 0.34, distance: 27, target: [0, 2.2, 0] }),\n lighting: Object.freeze({ yaw: -0.28, pitch: 0.28, distance: 23, target: [0, 2.8, 0] }),\n cloth: Object.freeze({ yaw: -1.1, pitch: 0.25, distance: 15, target: [-8.4, 5.3, -1.5] }),\n fluid: Object.freeze({ yaw: -0.4, pitch: 0.18, distance: 18, target: [0, 1.2, 6] }),\n physics: Object.freeze({ yaw: -0.12, pitch: 0.27, distance: 16, target: [0, 1.8, 6.8] }),\n performance: Object.freeze({ yaw: -0.65, pitch: 0.36, distance: 24, target: [0, 2.2, 0] }),\n debug: Object.freeze({ yaw: -0.7, pitch: 0.32, distance: 24, target: [0, 2.2, 0] }),\n});\n\nconst FALLBACK_LIGHTING_DISTANCE_BANDS = Object.freeze([\n Object.freeze({\n band: \"near\",\n primaryShadowSource: \"ray-traced-primary\",\n rtParticipation: Object.freeze({\n reflections: \"full\",\n globalIllumination: \"high\",\n directShadows: \"premium\",\n }),\n updateCadenceDivisor: 1,\n }),\n Object.freeze({\n band: \"mid\",\n primaryShadowSource: \"ray-traced-secondary\",\n rtParticipation: Object.freeze({\n reflections: \"medium\",\n globalIllumination: \"medium\",\n directShadows: \"selective\",\n }),\n updateCadenceDivisor: 2,\n }),\n Object.freeze({\n band: \"far\",\n primaryShadowSource: \"baked\",\n rtParticipation: Object.freeze({\n reflections: \"low\",\n globalIllumination: \"low\",\n directShadows: \"none\",\n }),\n updateCadenceDivisor: 4,\n }),\n Object.freeze({\n band: \"horizon\",\n primaryShadowSource: \"impression\",\n rtParticipation: Object.freeze({\n reflections: \"off\",\n globalIllumination: \"off\",\n directShadows: \"none\",\n }),\n updateCadenceDivisor: 8,\n }),\n]);\nconst FALLBACK_LIGHTING_PROFILE = \"cinematic\";\nconst FALLBACK_PHYSICS_PROFILE = \"cinematic\";\nconst FALLBACK_PERFORMANCE_LEVELS = Object.freeze({\n fluid: Object.freeze([\n Object.freeze({\n id: \"low\",\n config: Object.freeze({ nearResolution: 10, midResolution: 6, splashCount: 10 }),\n estimatedCostMs: 0.8,\n }),\n Object.freeze({\n id: \"medium\",\n config: Object.freeze({ nearResolution: 16, midResolution: 8, splashCount: 18 }),\n estimatedCostMs: 1.4,\n }),\n Object.freeze({\n id: \"high\",\n config: Object.freeze({ nearResolution: 24, midResolution: 12, splashCount: 28 }),\n estimatedCostMs: 2.4,\n }),\n ]),\n cloth: Object.freeze([\n Object.freeze({\n id: \"low\",\n config: Object.freeze({ cols: 10, rows: 7 }),\n estimatedCostMs: 0.7,\n }),\n Object.freeze({\n id: \"medium\",\n config: Object.freeze({ cols: 16, rows: 11 }),\n estimatedCostMs: 1.3,\n }),\n Object.freeze({\n id: \"high\",\n config: Object.freeze({ cols: 24, rows: 16 }),\n estimatedCostMs: 2.1,\n }),\n ]),\n lighting: Object.freeze([\n Object.freeze({\n id: \"low\",\n config: Object.freeze({ shadowStrength: 0.18, reflectionStrength: 0.08 }),\n estimatedCostMs: 0.5,\n }),\n Object.freeze({\n id: \"medium\",\n config: Object.freeze({ shadowStrength: 0.34, reflectionStrength: 0.16 }),\n estimatedCostMs: 1.0,\n }),\n Object.freeze({\n id: \"high\",\n config: Object.freeze({ shadowStrength: 0.5, reflectionStrength: 0.24 }),\n estimatedCostMs: 1.8,\n }),\n ]),\n});\n\nfunction createFallbackClothFeatureModule() {\n const fallback = createFallbackClothFeatureAdapters();\n return {\n clothGarmentKinds: fallback.garmentKinds,\n clothProfileNames: fallback.profileNames,\n createClothRepresentationPlan: fallback.createPlan,\n selectClothRepresentationBand: fallback.selectBand,\n };\n}\n\nfunction createFallbackFluidFeatureModule() {\n const fallback = createFallbackFluidFeatureAdapters();\n return {\n fluidBodyKinds: fallback.bodyKinds,\n fluidProfileNames: fallback.profileNames,\n createFluidContinuityEnvelope: fallback.createContinuityEnvelope,\n createFluidRepresentationPlan: fallback.createPlan,\n selectFluidRepresentationBand: fallback.selectBand,\n };\n}\n\nfunction createFallbackLightingFeatureModule() {\n return {\n createLightingBandPlan({ profile = FALLBACK_LIGHTING_PROFILE, importance = \"high\" } = {}) {\n const defaultPlan = {\n profile,\n importance,\n bands: FALLBACK_LIGHTING_DISTANCE_BANDS,\n };\n return defaultPlan;\n },\n defaultLightingProfile: FALLBACK_LIGHTING_PROFILE,\n getLightingProfile(profile = FALLBACK_LIGHTING_PROFILE) {\n return {\n name: profile,\n bands: FALLBACK_LIGHTING_DISTANCE_BANDS,\n };\n },\n lightingDistanceBands: FALLBACK_LIGHTING_DISTANCE_BANDS,\n };\n}\n\nfunction createFallbackPerformanceQualityState(levels = [], initialLevel = \"high\", profile = \"\") {\n const fallbackLevels = levels.length ? levels : FALLBACK_PERFORMANCE_LEVELS[profile] ?? [];\n const resolvedLevels = fallbackLevels.map((entry) => ({\n id: String(entry?.id ?? \"high\"),\n config: entry?.config ?? {},\n estimatedCostMs: Number.isFinite(Number(entry?.estimatedCostMs))\n ? Number(entry.estimatedCostMs)\n : 1.0,\n }));\n if (resolvedLevels.length === 0) {\n return {\n module: {\n id: \"high\",\n config: Object.freeze({}),\n estimatedCostMs: 1.0,\n },\n getSnapshot() {\n return {\n currentLevel: {\n id: \"high\",\n config: Object.freeze({}),\n estimatedCostMs: 1.0,\n },\n };\n },\n id: \"high\",\n };\n }\n const initial = resolvedLevels.find((entry) => entry.id === initialLevel) ?? resolvedLevels[0];\n return {\n id: initial.id,\n getSnapshot() {\n return {\n currentLevel: {\n id: initial.id,\n config: initial.config,\n estimatedCostMs: initial.estimatedCostMs,\n },\n };\n },\n };\n}\n\nfunction createFallbackPerformanceFeatureModule() {\n const moduleIds = new Set([\"fluid-detail\", \"cloth-detail\", \"lighting-detail\"]);\n\n return {\n createDeviceProfile(profile = {}) {\n return {\n deviceClass: \"desktop\",\n mode: \"flat\",\n refreshRateHz: Number.isFinite(profile?.refreshRateHz)\n ? Number(profile.refreshRateHz)\n : 60,\n supportedFrameRates: Array.isArray(profile?.supportedFrameRates)\n ? profile.supportedFrameRates\n : [60, 90],\n supportsWebGpu: true,\n };\n },\n createQualityLadderAdapter({ id, domain, levels, initialLevel }) {\n return {\n id: String(id ?? \"\"),\n domain,\n ...createFallbackPerformanceQualityState(\n domain === \"fluid\" ? FALLBACK_PERFORMANCE_LEVELS.fluid : domain === \"cloth\" ? FALLBACK_PERFORMANCE_LEVELS.cloth : FALLBACK_PERFORMANCE_LEVELS.lighting,\n initialLevel,\n domain\n ),\n };\n },\n createGpuPerformanceGovernor({ device, modules = [], adaptation = {} } = {}) {\n let pressureLevel = \"stable\";\n let frameSamples = 0;\n let averageMs = 16.67;\n\n const clamp = (next = 16.67) => (Number.isFinite(next) ? Math.max(1, next) : 16.67);\n const target = Object.freeze({\n targetFrameTimeMs: 16.67,\n downgradeFrameTimeMs: clamp(adaptation?.degradeThresholdMs ?? 20),\n upgradeFrameTimeMs: clamp(adaptation?.upgradeThresholdMs ?? 14),\n });\n\n return {\n recordFrame({ frameTimeMs = averageMs } = {}) {\n const sample = Number.isFinite(Number(frameTimeMs)) ? Number(frameTimeMs) : averageMs;\n frameSamples += 1;\n averageMs = clamp((averageMs * (frameSamples - 1) + sample) / frameSamples);\n const fps = 1000 / averageMs;\n\n pressureLevel =\n sample > target.downgradeFrameTimeMs\n ? \"degrade\"\n : pressureLevel === \"degrade\" && sample <= target.upgradeFrameTimeMs\n ? \"stable\"\n : pressureLevel;\n\n return {\n pressureLevel,\n metrics: {\n fps,\n averageFrameTimeMs: averageMs,\n },\n adjustments: pressureLevel === \"degrade\" ? [{ type: \"capability-step-down\" }] : [],\n };\n },\n getTarget() {\n return target;\n },\n getState() {\n return {\n modules: modules\n .filter((entry) => entry != null && typeof entry.id === \"string\" && moduleIds.has(entry.id))\n .map((entry) => ({\n isAtMaximum: pressureLevel === \"stable\",\n })),\n };\n },\n };\n },\n };\n}\n\nfunction createFallbackDebugFeatureModule() {\n let queueSamples = 0;\n let queuePeakDepth = 0;\n let readyLaneSamples = 0;\n let readyLanePeakDepth = 0;\n let dispatchSamples = 0;\n let dispatchDurationTotal = 0;\n let dependencyUnlockSamples = 0;\n let dependencyUnlockCount = 0;\n let pipelineSamples = 0;\n let pipelineAgeTotal = 0;\n let frameSamples = 0;\n let frameTimeTotal = 0;\n let gpuBusyTotal = 0;\n let frameDroppedSamples = 0;\n let memoryTotalBytes = 0;\n\n function ensureNumber(value, fallback = 0) {\n const asNumber = Number(value);\n return Number.isFinite(asNumber) ? asNumber : fallback;\n }\n\n function createDebugSession({ adapter } = {}) {\n const memoryHint = Number.isFinite(Number(adapter?.memoryCapacityHintBytes))\n ? Number(adapter.memoryCapacityHintBytes)\n : 0;\n\n memoryTotalBytes = Math.max(0, memoryHint);\n\n return {\n trackAllocation({ sizeBytes = 0 } = {}) {\n memoryTotalBytes += ensureNumber(sizeBytes);\n },\n recordQueue({ depth = 0 } = {}) {\n queueSamples += 1;\n queuePeakDepth = Math.max(queuePeakDepth, ensureNumber(depth, 0));\n },\n recordReadyLane({ depth = 0 } = {}) {\n readyLaneSamples += 1;\n readyLanePeakDepth = Math.max(readyLanePeakDepth, ensureNumber(depth, 0));\n },\n recordDispatch({ durationMs = 0 } = {}) {\n dispatchSamples += 1;\n dispatchDurationTotal += ensureNumber(durationMs);\n },\n recordDependencyUnlock({ unlockCount = 0 } = {}) {\n dependencyUnlockSamples += 1;\n dependencyUnlockCount += ensureNumber(unlockCount);\n },\n recordPipelinePhase({ snapshotAgeMs = 0 } = {}) {\n pipelineSamples += 1;\n pipelineAgeTotal += ensureNumber(snapshotAgeMs);\n },\n recordFrame({\n frameTimeMs = 16.67,\n targetFrameTimeMs = 16.67,\n gpuBusyMs = 0,\n dropped = false,\n } = {}) {\n frameSamples += 1;\n frameTimeTotal += ensureNumber(frameTimeMs);\n gpuBusyTotal += ensureNumber(gpuBusyMs);\n frameDroppedSamples += dropped === true ? 1 : 0;\n targetFrameTimeMs;\n },\n getSnapshot() {\n const queueAverageDepth = queueSamples > 0 ? queuePeakDepth / queueSamples : 0;\n return {\n frames: {\n sampleCount: frameSamples,\n averageFrameTimeMs: frameSamples > 0 ? frameTimeTotal / frameSamples : 0,\n averageGpuBusyMs: frameSamples > 0 ? gpuBusyTotal / frameSamples : 0,\n droppedCount: frameDroppedSamples,\n },\n queues: {\n sampleCount: queueSamples,\n peakDepth: queuePeakDepth,\n averageDepth: queueAverageDepth,\n },\n dispatch: {\n sampleCount: dispatchSamples,\n averageDurationMs: dispatchSamples > 0 ? dispatchDurationTotal / dispatchSamples : 0,\n },\n dag: {\n peakReadyLaneDepth: readyLanePeakDepth,\n totalUnlockCount: dependencyUnlockCount,\n unlockSamples: dependencyUnlockSamples,\n },\n pipeline: {\n sampleCount: pipelineSamples,\n averageSnapshotAgeMs: pipelineSamples > 0 ? pipelineAgeTotal / pipelineSamples : 0,\n },\n memory: {\n totalTrackedBytes: memoryTotalBytes,\n },\n };\n },\n };\n }\n\n return {\n createGpuDebugSession({ adapter } = {}) {\n return createDebugSession({ adapter });\n },\n createSession({ adapter } = {}) {\n return createDebugSession({ adapter });\n },\n };\n}\n\nfunction createFallbackPhysicsFeatureModule() {\n const fallbackPlan = Object.freeze({\n snapshotStageId: \"baseline\",\n stageOrder: Object.freeze([\"authoritative\"]),\n secondarySimulationStageIds: Object.freeze([\"visual\"]),\n });\n return {\n createPhysicsSimulationPlan() {\n return {\n snapshotStageId: \"baseline\",\n stageOrder: fallbackPlan.stageOrder,\n secondarySimulationStageIds: fallbackPlan.secondarySimulationStageIds,\n };\n },\n createPhysicsWorldSnapshot(input = {}) {\n return {\n stage: \"baseline\",\n stability: \"stable\",\n stageId: fallbackPlan.snapshotStageId,\n metadata: input.metadata ?? {},\n bodyCount: input.bodyCount ?? 0,\n dynamicBodyCount: input.dynamicBodyCount ?? 0,\n contactCount: input.contactCount ?? 0,\n snapshotStageId: fallbackPlan.snapshotStageId,\n };\n },\n defaultPhysicsWorkerProfile: FALLBACK_PHYSICS_PROFILE,\n getPhysicsWorkerManifest() {\n return {\n jobs: [\n Object.freeze({\n worker: Object.freeze({ authority: \"authoritative\", jobType: \"simulate\" }),\n }),\n ],\n suggestedAllocationIds: Object.freeze([\"physics-workspace\"]),\n };\n },\n };\n}\n\nconst SHOWCASE_FEATURE_LOADERS = Object.freeze({\n cloth: () => Promise.resolve(createFallbackClothFeatureModule()),\n fluid: () => Promise.resolve(createFallbackFluidFeatureModule()),\n lighting: () => Promise.resolve(createFallbackLightingFeatureModule()),\n performance: () => Promise.resolve(createFallbackPerformanceFeatureModule()),\n debug: () => Promise.resolve(createFallbackDebugFeatureModule()),\n physics: () => Promise.resolve(createFallbackPhysicsFeatureModule()),\n});\n\nconst DEFAULT_FLUID_BAND_THRESHOLDS = Object.freeze({\n near: Object.freeze({ minDistance: 0, maxDistance: 22 }),\n mid: Object.freeze({ minDistance: 22, maxDistance: 90 }),\n far: Object.freeze({ minDistance: 90, maxDistance: 260 }),\n horizon: Object.freeze({ minDistance: 260, maxDistance: Number.POSITIVE_INFINITY }),\n});\n\nconst DEFAULT_CLOTH_BAND_THRESHOLDS = Object.freeze({\n near: Object.freeze({ minDistance: 0, maxDistance: 24 }),\n mid: Object.freeze({ minDistance: 24, maxDistance: 86 }),\n far: Object.freeze({ minDistance: 86, maxDistance: 190 }),\n horizon: Object.freeze({ minDistance: 190, maxDistance: Number.POSITIVE_INFINITY }),\n});\n\nfunction resolveFluidBandSelection(distance, thresholds = DEFAULT_FLUID_BAND_THRESHOLDS) {\n if (!Number.isFinite(distance)) {\n return \"horizon\";\n }\n if (distance <= (thresholds.near?.maxDistance ?? DEFAULT_FLUID_BAND_THRESHOLDS.near.maxDistance)) {\n return \"near\";\n }\n if (distance <= (thresholds.mid?.maxDistance ?? DEFAULT_FLUID_BAND_THRESHOLDS.mid.maxDistance)) {\n return \"mid\";\n }\n if (distance <= (thresholds.far?.maxDistance ?? DEFAULT_FLUID_BAND_THRESHOLDS.far.maxDistance)) {\n return \"far\";\n }\n return \"horizon\";\n}\n\nfunction createFallbackFluidFeatureAdapters() {\n const defaultContinuityBand = Object.freeze({\n amplitudeFloor: 0.22,\n frequencyFloor: 0.05,\n blendWindowMeters: 14,\n retainFoamHistory: true,\n retainDirectionality: true,\n });\n return {\n bodyKinds: Object.freeze([\"ocean\"]),\n profileNames: Object.freeze([\"cinematic\"]),\n createContinuityEnvelope() {\n return Object.freeze({\n bands: Object.freeze({\n near: defaultContinuityBand,\n mid: Object.freeze({\n ...defaultContinuityBand,\n blendWindowMeters: 22,\n amplitudeFloor: 0.17,\n }),\n far: Object.freeze({\n ...defaultContinuityBand,\n blendWindowMeters: 34,\n amplitudeFloor: 0.12,\n }),\n horizon: Object.freeze({\n ...defaultContinuityBand,\n blendWindowMeters: 42,\n amplitudeFloor: 0.09,\n }),\n }),\n });\n },\n createPlan({ fluidBodyId = \"harbor\", kind = \"ocean\", profile = \"cinematic\" }) {\n return Object.freeze({\n fluidBodyId,\n kind,\n profile,\n thresholds: DEFAULT_FLUID_BAND_THRESHOLDS,\n representations: Object.freeze([\n Object.freeze({\n band: \"near\",\n output: \"raster\",\n rtParticipation: \"full\",\n shading: Object.freeze({ refraction: 0.14, reflectionMode: \"full\", caustics: true }),\n }),\n Object.freeze({\n band: \"mid\",\n output: \"raster\",\n rtParticipation: \"reduced\",\n shading: Object.freeze({ reflectionMode: \"partial\" }),\n }),\n Object.freeze({\n band: \"far\",\n output: \"raster\",\n rtParticipation: \"low\",\n shading: Object.freeze({ reflectionMode: \"partial\" }),\n }),\n Object.freeze({\n band: \"horizon\",\n output: \"coarse\",\n rtParticipation: \"off\",\n shading: Object.freeze({ reflectionMode: \"reduced\" }),\n }),\n ]),\n });\n },\n selectBand(distance, thresholds = DEFAULT_FLUID_BAND_THRESHOLDS) {\n return resolveFluidBandSelection(distance, thresholds);\n },\n };\n}\n\nfunction createFallbackClothFeatureAdapters() {\n const defaultContinuity = Object.freeze({\n amplitudeFloor: 0.22,\n wrinkleFloor: 0.32,\n damping: 0.58,\n creaseBias: 0.14,\n });\n return {\n garmentKinds: Object.freeze([\"flag\"]),\n profileNames: Object.freeze([\"cinematic\"]),\n createPlan() {\n return Object.freeze({\n thresholds: DEFAULT_CLOTH_BAND_THRESHOLDS,\n representations: Object.freeze([\n Object.freeze({\n band: \"near\",\n continuity: defaultContinuity,\n }),\n Object.freeze({\n band: \"mid\",\n continuity: defaultContinuity,\n }),\n Object.freeze({\n band: \"far\",\n continuity: defaultContinuity,\n }),\n Object.freeze({\n band: \"horizon\",\n continuity: defaultContinuity,\n }),\n ]),\n });\n },\n selectBand(distance, thresholds = DEFAULT_CLOTH_BAND_THRESHOLDS) {\n if (!Number.isFinite(distance)) {\n return \"horizon\";\n }\n if (distance <= (thresholds.near?.maxDistance ?? DEFAULT_CLOTH_BAND_THRESHOLDS.near.maxDistance)) {\n return \"near\";\n }\n if (distance <= (thresholds.mid?.maxDistance ?? DEFAULT_CLOTH_BAND_THRESHOLDS.mid.maxDistance)) {\n return \"mid\";\n }\n if (distance <= (thresholds.far?.maxDistance ?? DEFAULT_CLOTH_BAND_THRESHOLDS.far.maxDistance)) {\n return \"far\";\n }\n return \"horizon\";\n },\n };\n}\n\nfunction normalizeClothFeatureAdapters(clothFeatures) {\n const fallback = createFallbackClothFeatureAdapters();\n if (clothFeatures == null || typeof clothFeatures !== \"object\") {\n return fallback;\n }\n\n return {\n garmentKinds:\n Array.isArray(clothFeatures.garmentKinds) && clothFeatures.garmentKinds.length > 0\n ? clothFeatures.garmentKinds\n : fallback.garmentKinds,\n profileNames:\n Array.isArray(clothFeatures.profileNames) && clothFeatures.profileNames.length > 0\n ? clothFeatures.profileNames\n : fallback.profileNames,\n createPlan: assertRequiredFunction(clothFeatures, \"cloth\", \"createPlan\"),\n selectBand: assertRequiredFunction(clothFeatures, \"cloth\", \"selectBand\"),\n };\n}\n\nfunction normalizeFluidFeatureAdapters(fluidFeatures) {\n const fallback = createFallbackFluidFeatureAdapters();\n if (fluidFeatures == null || typeof fluidFeatures !== \"object\") {\n return fallback;\n }\n\n return {\n bodyKinds:\n Array.isArray(fluidFeatures.bodyKinds) && fluidFeatures.bodyKinds.length > 0\n ? fluidFeatures.bodyKinds\n : fallback.bodyKinds,\n profileNames:\n Array.isArray(fluidFeatures.profileNames) && fluidFeatures.profileNames.length > 0\n ? fluidFeatures.profileNames\n : fallback.profileNames,\n createContinuityEnvelope: assertRequiredFunction(\n fluidFeatures,\n \"fluid\",\n \"createContinuityEnvelope\"\n ),\n createPlan: assertRequiredFunction(fluidFeatures, \"fluid\", \"createPlan\"),\n selectBand: assertRequiredFunction(fluidFeatures, \"fluid\", \"selectBand\"),\n };\n}\n\nfunction assertRequiredFunction(module, featureLabel, exportName) {\n const value = module?.[exportName];\n if (typeof value !== \"function\") {\n throw new Error(\n `Showcase ${featureLabel} feature package must export \"${exportName}\" as a function.`\n );\n }\n return value;\n}\n\nfunction assertRequiredArray(module, featureLabel, exportName) {\n const value = module?.[exportName];\n if (!Array.isArray(value)) {\n throw new Error(\n `Showcase ${featureLabel} feature package must export \"${exportName}\" as an array.`\n );\n }\n return value;\n}\n\nasync function loadShowcaseFeatureModule(featureLabel, loader) {\n try {\n const module = await loader();\n if (module == null || typeof module !== \"object\") {\n throw new Error(\"module is missing or not an object.\");\n }\n return module;\n } catch (error) {\n const message = error?.message ?? String(error);\n throw new Error(`Unable to load showcase ${featureLabel} feature package: ${message}`, {\n cause: error,\n });\n }\n}\n\nfunction resolveShowcaseFeatureLoaders(options = {}) {\n const overrides = options.__showcaseFeatureLoaders;\n return {\n cloth:\n typeof overrides?.cloth === \"function\"\n ? overrides.cloth\n : SHOWCASE_FEATURE_LOADERS.cloth,\n fluid:\n typeof overrides?.fluid === \"function\"\n ? overrides.fluid\n : SHOWCASE_FEATURE_LOADERS.fluid,\n lighting:\n typeof overrides?.lighting === \"function\"\n ? overrides.lighting\n : SHOWCASE_FEATURE_LOADERS.lighting,\n performance:\n typeof overrides?.performance === \"function\"\n ? overrides.performance\n : SHOWCASE_FEATURE_LOADERS.performance,\n debug:\n typeof overrides?.debug === \"function\"\n ? overrides.debug\n : SHOWCASE_FEATURE_LOADERS.debug,\n physics:\n typeof overrides?.physics === \"function\"\n ? overrides.physics\n : SHOWCASE_FEATURE_LOADERS.physics,\n };\n}\n\nasync function resolveShowcaseFeatureAdapters(options = {}) {\n const loaders = resolveShowcaseFeatureLoaders(options);\n const [\n clothModule,\n fluidModule,\n lightingModule,\n performanceModule,\n debugModule,\n physicsModule,\n ] = await Promise.all([\n loadShowcaseFeatureModule(\"cloth\", loaders.cloth),\n loadShowcaseFeatureModule(\"fluid\", loaders.fluid),\n loadShowcaseFeatureModule(\"lighting\", loaders.lighting),\n loadShowcaseFeatureModule(\"performance\", loaders.performance),\n loadShowcaseFeatureModule(\"debug\", loaders.debug),\n loadShowcaseFeatureModule(\"physics\", loaders.physics),\n ]);\n\n return {\n cloth: {\n garmentKinds: assertRequiredArray(clothModule, \"cloth\", \"clothGarmentKinds\"),\n profileNames: assertRequiredArray(clothModule, \"cloth\", \"clothProfileNames\"),\n createPlan: assertRequiredFunction(clothModule, \"cloth\", \"createClothRepresentationPlan\"),\n selectBand: assertRequiredFunction(clothModule, \"cloth\", \"selectClothRepresentationBand\"),\n },\n fluid: {\n bodyKinds: assertRequiredArray(fluidModule, \"fluid\", \"fluidBodyKinds\"),\n profileNames: assertRequiredArray(fluidModule, \"fluid\", \"fluidProfileNames\"),\n createContinuityEnvelope: assertRequiredFunction(\n fluidModule,\n \"fluid\",\n \"createFluidContinuityEnvelope\"\n ),\n createPlan: assertRequiredFunction(fluidModule, \"fluid\", \"createFluidRepresentationPlan\"),\n selectBand: assertRequiredFunction(fluidModule, \"fluid\", \"selectFluidRepresentationBand\"),\n },\n lighting: {\n createBandPlan: assertRequiredFunction(lightingModule, \"lighting\", \"createLightingBandPlan\"),\n defaultProfile: lightingModule.defaultLightingProfile,\n getProfile: assertRequiredFunction(lightingModule, \"lighting\", \"getLightingProfile\"),\n distanceBands: assertRequiredArray(lightingModule, \"lighting\", \"lightingDistanceBands\"),\n },\n performance: {\n createDeviceProfile: assertRequiredFunction(\n performanceModule,\n \"performance\",\n \"createDeviceProfile\"\n ),\n createGovernor: assertRequiredFunction(\n performanceModule,\n \"performance\",\n \"createGpuPerformanceGovernor\"\n ),\n createQualityAdapter: assertRequiredFunction(\n performanceModule,\n \"performance\",\n \"createQualityLadderAdapter\"\n ),\n },\n debug: {\n createSession: assertRequiredFunction(debugModule, \"debug\", \"createGpuDebugSession\"),\n },\n physics: {\n createSimulationPlan: assertRequiredFunction(\n physicsModule,\n \"physics\",\n \"createPhysicsSimulationPlan\"\n ),\n createWorldSnapshot: assertRequiredFunction(\n physicsModule,\n \"physics\",\n \"createPhysicsWorldSnapshot\"\n ),\n defaultProfile: physicsModule.defaultPhysicsWorkerProfile,\n getManifest: assertRequiredFunction(physicsModule, \"physics\", \"getPhysicsWorkerManifest\"),\n },\n };\n}\n\nexport const showcaseFocusModes = Object.freeze(Object.keys(CAMERA_PRESETS));\n\nconst FOCUS_MODE_TRANSLATION_KEYS = Object.freeze({\n integrated: gpuSharedTranslationKeys.focusIntegrated,\n lighting: gpuSharedTranslationKeys.focusLighting,\n cloth: gpuSharedTranslationKeys.focusCloth,\n fluid: gpuSharedTranslationKeys.focusFluid,\n physics: gpuSharedTranslationKeys.focusPhysics,\n performance: gpuSharedTranslationKeys.focusPerformance,\n debug: gpuSharedTranslationKeys.focusDebug,\n});\n\nconst SCENE_NOTE_KEYS = Object.freeze([\n gpuSharedTranslationKeys.noteAssetLoading,\n gpuSharedTranslationKeys.noteMoonlight,\n gpuSharedTranslationKeys.noteContinuity,\n gpuSharedTranslationKeys.notePerformance,\n]);\n\nconst PHYSICS_SCENE_NOTE_KEYS = Object.freeze([\n gpuSharedTranslationKeys.notePhysicsSnapshots,\n gpuSharedTranslationKeys.notePhysicsCollisions,\n gpuSharedTranslationKeys.notePhysicsLighting,\n]);\n\nconst LEGACY_HARBOR_LAYOUT = Object.freeze([\n Object.freeze({\n position: Object.freeze({ x: -8.2, y: 1.1, z: -0.9 }),\n rotationY: -0.16,\n scale: 5.4,\n color: { r: 0.32, g: 0.27, b: 0.23, a: 1 },\n accent: 0.06,\n }),\n Object.freeze({\n position: Object.freeze({ x: -5.7, y: 0.45, z: 1.4 }),\n rotationY: -0.08,\n scale: { x: 6.8, y: 0.3, z: 2.1 },\n color: { r: 0.31, g: 0.31, b: 0.34, a: 1 },\n accent: 0.04,\n }),\n Object.freeze({\n position: Object.freeze({ x: -10.4, y: 0.28, z: 0.8 }),\n rotationY: 0.22,\n scale: { x: 1.2, y: 0.9, z: 1.2 },\n color: { r: 0.31, g: 0.35, b: 0.39, a: 1 },\n accent: 0.02,\n }),\n]);\n\nconst SHOWCASE_ENVIRONMENT_LAYOUT = Object.freeze([\n Object.freeze({\n assetKey: \"harbor-dock\",\n position: Object.freeze({ x: -4.6, y: 0.16, z: 0.7 }),\n rotationY: -0.08,\n scale: 0.84,\n accent: 0.04,\n }),\n Object.freeze({\n assetKey: \"lighthouse\",\n position: Object.freeze({ x: -9.8, y: 0, z: -0.58 }),\n rotationY: 0.12,\n scale: 0.56,\n accent: 0.08,\n }),\n]);\n\nconst SHIP_LANTERNS = Object.freeze([\n Object.freeze({ x: 0.94, y: 1.54, z: 2.52, glow: 1 }),\n Object.freeze({ x: -0.9, y: 1.58, z: 2.44, glow: 0.92 }),\n Object.freeze({ x: 0.62, y: 1.42, z: -2.18, glow: 0.88 }),\n Object.freeze({ x: -0.58, y: 1.46, z: -2.04, glow: 0.84 }),\n]);\nconst CUTTER_LANTERNS = Object.freeze([\n Object.freeze({ x: 0.42, y: 1.04, z: 1.18, glow: 0.94 }),\n Object.freeze({ x: -0.42, y: 1.04, z: 1.12, glow: 0.88 }),\n]);\n\nconst HARBOR_TORCHES = Object.freeze([\n Object.freeze({ x: -5.2, y: 1.25, z: 1.36, glow: 1.1 }),\n Object.freeze({ x: -8.6, y: 2.48, z: -0.72, glow: 1 }),\n Object.freeze({ x: -10.4, y: 1.28, z: 0.82, glow: 0.92 }),\n]);\nconst FLAG_LAYOUT = Object.freeze({\n origin: Object.freeze({ x: -3.5, y: 5.9, z: 2.4 }),\n width: 4.8,\n height: 2.7,\n mastOffsetX: 1.8,\n});\nfunction injectStyles() {\n if (document.getElementById(STYLE_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n .${ROOT_CLASS} {\n color-scheme: dark;\n --plasius-paper: #081321;\n --plasius-ink: #edf4ff;\n --plasius-muted: #b6c5dd;\n --plasius-accent: #f3b16a;\n --plasius-panel: rgba(8, 19, 33, 0.72);\n --plasius-border: rgba(159, 185, 223, 0.18);\n --plasius-shadow: 0 24px 56px rgba(1, 6, 14, 0.44);\n margin: 0;\n min-height: 100%;\n font-family: \"Fraunces\", \"Iowan Old Style\", serif;\n color: var(--plasius-ink);\n background:\n radial-gradient(circle at 18% 12%, rgba(73, 101, 170, 0.28), transparent 30%),\n radial-gradient(circle at 82% 18%, rgba(240, 188, 103, 0.08), transparent 18%),\n linear-gradient(180deg, #04101d 0%, #0b1930 42%, #081321 100%);\n }\n .${ROOT_CLASS}.${CAPTURE_CLASS} {\n min-height: 100vh;\n overflow: hidden;\n background: #030710;\n }\n .${ROOT_CLASS},\n .${ROOT_CLASS} * {\n box-sizing: border-box;\n }\n .plasius-demo {\n width: min(1560px, calc(100vw - 32px));\n margin: 0 auto;\n padding: 28px 0 40px;\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero,\n .plasius-demo__layout {\n display: grid;\n gap: 20px;\n }\n .plasius-demo__hero {\n grid-template-columns: minmax(0, 1.5fr) minmax(320px, 0.85fr);\n align-items: start;\n }\n .plasius-panel {\n border: 1px solid var(--plasius-border);\n border-radius: 24px;\n background: var(--plasius-panel);\n box-shadow: var(--plasius-shadow);\n backdrop-filter: blur(12px);\n }\n .plasius-demo__hero-card,\n .plasius-demo__status {\n padding: 20px 22px;\n }\n .plasius-demo__eyebrow {\n margin: 0 0 8px;\n text-transform: uppercase;\n letter-spacing: 0.18em;\n font-size: 12px;\n color: rgba(226, 236, 255, 0.58);\n }\n .plasius-demo h1,\n .plasius-demo h2,\n .plasius-demo h3 {\n margin: 0;\n }\n .plasius-demo__lead {\n margin: 12px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n max-width: 760px;\n }\n .plasius-demo__status-badge {\n width: fit-content;\n margin: 0;\n padding: 8px 12px;\n border-radius: 999px;\n background: rgba(243, 177, 106, 0.14);\n color: var(--plasius-accent);\n font-weight: 700;\n }\n .plasius-demo__status-text {\n margin: 10px 0 0;\n color: var(--plasius-muted);\n line-height: 1.6;\n }\n .plasius-demo__layout {\n grid-template-columns: minmax(0, 1.45fr) minmax(320px, 0.68fr);\n align-items: start;\n }\n .plasius-demo__canvas-panel {\n padding: 18px;\n position: relative;\n }\n .plasius-demo__canvas {\n width: 100%;\n aspect-ratio: 16 / 9;\n display: block;\n border-radius: 20px;\n border: 1px solid rgba(159, 185, 223, 0.12);\n background: linear-gradient(180deg, #071220 0%, #132440 42%, #10344b 42%, #05111d 100%);\n }\n .${CAPTURE_CLASS} .plasius-demo {\n width: 100vw;\n height: 100vh;\n padding: 0;\n display: block;\n }\n .${CAPTURE_CLASS} .plasius-demo__hero,\n .${CAPTURE_CLASS} .plasius-demo__toolbar,\n .${CAPTURE_CLASS} .plasius-demo__legend,\n .${CAPTURE_CLASS} .plasius-demo__sidebar,\n .${CAPTURE_CLASS} .plasius-demo__footer {\n display: none;\n }\n .${CAPTURE_CLASS} .plasius-demo__layout {\n display: block;\n height: 100%;\n }\n .${CAPTURE_CLASS} .plasius-demo__canvas-panel {\n height: 100%;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n backdrop-filter: none;\n }\n .${CAPTURE_CLASS} .plasius-demo__canvas {\n width: 100%;\n height: 100%;\n aspect-ratio: auto;\n border: 0;\n border-radius: 0;\n background: #030710;\n }\n .plasius-demo__toolbar {\n position: absolute;\n top: 26px;\n left: 26px;\n display: flex;\n gap: 12px;\n flex-wrap: wrap;\n align-items: center;\n }\n .plasius-demo button,\n .plasius-demo label,\n .plasius-demo select {\n font-family: \"JetBrains Mono\", monospace;\n font-size: 13px;\n }\n .plasius-demo button,\n .plasius-demo .plasius-toggle,\n .plasius-demo select {\n border: 1px solid rgba(159, 185, 223, 0.18);\n border-radius: 999px;\n background: rgba(9, 20, 34, 0.84);\n color: var(--plasius-ink);\n padding: 10px 14px;\n }\n .plasius-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n }\n .plasius-demo__sidebar {\n display: grid;\n gap: 18px;\n }\n .plasius-demo__card {\n padding: 18px;\n }\n .plasius-demo__metrics,\n .plasius-demo__metrics li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n .plasius-demo__metrics {\n margin-top: 12px;\n display: grid;\n gap: 8px;\n color: var(--plasius-muted);\n line-height: 1.55;\n }\n .plasius-demo__metrics li {\n border-top: 1px solid rgba(21, 32, 40, 0.08);\n padding-top: 8px;\n }\n .plasius-demo__legend {\n position: absolute;\n right: 24px;\n bottom: 24px;\n padding: 10px 14px;\n border-radius: 16px;\n background: rgba(9, 20, 34, 0.82);\n border: 1px solid rgba(159, 185, 223, 0.16);\n color: var(--plasius-muted);\n font-size: 12px;\n line-height: 1.45;\n }\n .plasius-demo__legend strong {\n display: block;\n color: var(--plasius-ink);\n margin-bottom: 4px;\n }\n .plasius-demo__footer {\n margin-top: 4px;\n color: rgba(226, 236, 255, 0.68);\n font-size: 13px;\n line-height: 1.6;\n }\n @media (max-width: 1200px) {\n .plasius-demo__hero,\n .plasius-demo__layout {\n grid-template-columns: 1fr;\n }\n }\n `;\n document.head.appendChild(style);\n}\n\nfunction clamp(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n\nfunction mix(a, b, t) {\n return a + (b - a) * t;\n}\n\nfunction smoothstep(min, max, value) {\n const t = clamp((value - min) / Math.max(0.0001, max - min), 0, 1);\n return t * t * (3 - 2 * t);\n}\n\nfunction pseudoRandom(seed) {\n const value = Math.sin(seed * 12.9898 + seed * seed * 0.0017) * 43758.5453;\n return value - Math.floor(value);\n}\n\nfunction vec3(x = 0, y = 0, z = 0) {\n return { x, y, z };\n}\n\nfunction addVec3(a, b) {\n return vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\nfunction subVec3(a, b) {\n return vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction scaleVec3(a, s) {\n return vec3(a.x * s, a.y * s, a.z * s);\n}\n\nfunction dotVec3(a, b) {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\nfunction crossVec3(a, b) {\n return vec3(\n a.y * b.z - a.z * b.y,\n a.z * b.x - a.x * b.z,\n a.x * b.y - a.y * b.x\n );\n}\n\nfunction lengthVec3(a) {\n return Math.hypot(a.x, a.y, a.z);\n}\n\nfunction normalizeVec3(a) {\n const length = lengthVec3(a) || 1;\n return vec3(a.x / length, a.y / length, a.z / length);\n}\n\nfunction reflectVec3(vector, normal) {\n const unitNormal = normalizeVec3(normal);\n return subVec3(vector, scaleVec3(unitNormal, 2 * dotVec3(vector, unitNormal)));\n}\n\nfunction directionFromYaw(yaw) {\n return normalizeVec3(vec3(Math.sin(yaw), 0, Math.cos(yaw)));\n}\n\nfunction perpendicularOnWater(direction) {\n return vec3(-direction.z, 0, direction.x);\n}\n\nfunction rotateY(point, angle) {\n const cosine = Math.cos(angle);\n const sine = Math.sin(angle);\n return vec3(\n point.x * cosine - point.z * sine,\n point.y,\n point.x * sine + point.z * cosine\n );\n}\n\nfunction transformPoint(point, transform) {\n const scale =\n typeof transform.scale === \"number\"\n ? { x: transform.scale, y: transform.scale, z: transform.scale }\n : transform.scale;\n const scaled = vec3(point.x * scale.x, point.y * scale.y, point.z * scale.z);\n const rotated = rotateY(scaled, transform.rotationY);\n return addVec3(rotated, transform.position);\n}\n\nfunction transformDirection(direction, transform) {\n const scale =\n typeof transform.scale === \"number\"\n ? { x: transform.scale, y: transform.scale, z: transform.scale }\n : transform.scale;\n const scaled = vec3(direction.x * scale.x, direction.y * scale.y, direction.z * scale.z);\n return normalizeVec3(rotateY(scaled, transform.rotationY));\n}\n\nfunction projectPoint(point, camera, viewport) {\n const relative = subVec3(point, camera.eye);\n const viewX = dotVec3(relative, camera.right);\n const viewY = dotVec3(relative, camera.up);\n const viewZ = dotVec3(relative, camera.forward);\n if (viewZ <= 0.1) {\n return null;\n }\n const focal = 1 / Math.tan((camera.fov * Math.PI) / 360);\n const ndcX = (viewX * focal) / (viewZ * camera.aspect);\n const ndcY = (viewY * focal) / viewZ;\n return {\n x: (ndcX * 0.5 + 0.5) * viewport.width,\n y: (-ndcY * 0.5 + 0.5) * viewport.height,\n depth: viewZ,\n };\n}\n\nfunction colorToRgba(color, alpha = 1) {\n const r = Math.round(clamp(color.r, 0, 1) * 255);\n const g = Math.round(clamp(color.g, 0, 1) * 255);\n const b = Math.round(clamp(color.b, 0, 1) * 255);\n return `rgba(${r}, ${g}, ${b}, ${clamp(alpha, 0, 1)})`;\n}\n\nfunction mixColor(a, b, t) {\n return {\n r: mix(a.r, b.r, t),\n g: mix(a.g, b.g, t),\n b: mix(a.b, b.b, t),\n a: mix(a.a ?? 1, b.a ?? 1, t),\n };\n}\n\nfunction multiplyColor(a, b) {\n return {\n r: a.r * b.r,\n g: a.g * b.g,\n b: a.b * b.b,\n a: (a.a ?? 1) * (b.a ?? 1),\n };\n}\n\nfunction createLegacyMeshPrimitive(mesh) {\n return Object.freeze({\n name: mesh.name ?? \"legacy-mesh\",\n positions: mesh.positions,\n indices: mesh.indices,\n normals: null,\n colors: null,\n material: Object.freeze({\n name: \"legacy-material\",\n color: mesh.color ?? { r: 0.56, g: 0.33, b: 0.22, a: 1 },\n roughness: 0.88,\n metallic: 0.08,\n emissive: Object.freeze({ r: 0, g: 0, b: 0 }),\n }),\n });\n}\n\nfunction isFeatureEnabled(featureFlags, featureName, fallback = true) {\n const directValue =\n typeof featureFlags?.[featureName] === \"boolean\"\n ? featureFlags[featureName]\n : featureFlags?.flags?.[featureName];\n if (typeof directValue === \"boolean\") {\n return directValue;\n }\n\n const enabledValue =\n typeof featureFlags?.enabled?.[featureName] === \"boolean\"\n ? featureFlags.enabled[featureName]\n : undefined;\n if (typeof enabledValue === \"boolean\") {\n return enabledValue;\n }\n\n return fallback;\n}\n\nfunction getMeshPrimitives(mesh) {\n return Array.isArray(mesh?.primitives) && mesh.primitives.length > 0\n ? mesh.primitives\n : [createLegacyMeshPrimitive(mesh)];\n}\n\nfunction tintPrimitiveColor(material, colorOverride) {\n if (!colorOverride) {\n return material.color;\n }\n\n const name = String(material.name ?? \"\").toLowerCase();\n if (name.includes(\"sail\") || name.includes(\"glass\") || name.includes(\"roof\")) {\n return material.color;\n }\n\n const tintAmount = name.includes(\"hull\")\n ? 0.54\n : name.includes(\"trim\")\n ? 0.22\n : name.includes(\"deck\")\n ? 0.12\n : 0;\n\n if (tintAmount <= 0) {\n return material.color;\n }\n\n return mixColor(material.color, multiplyColor(material.color, colorOverride), tintAmount);\n}\n\nfunction projectShadowPoint(point, lightDir, planeY) {\n const shadowDir = scaleVec3(lightDir, -1);\n if (Math.abs(shadowDir.y) < 0.0001) {\n return null;\n }\n\n const distance = (planeY - point.y) / shadowDir.y;\n if (!Number.isFinite(distance) || distance < 0) {\n return null;\n }\n\n return addVec3(point, scaleVec3(shadowDir, distance));\n}\n\nfunction shadeColor(base, normal, lightDir, heightBias = 0, accent = 0) {\n const diffuse = clamp(dotVec3(normalizeVec3(normal), lightDir), 0, 1);\n const brightness = 0.24 + diffuse * 0.72 + heightBias * 0.08 + accent;\n return {\n r: clamp(base.r * brightness, 0, 1),\n g: clamp(base.g * brightness, 0, 1),\n b: clamp(base.b * (brightness + 0.03), 0, 1),\n };\n}\n\nfunction getMaterialSeed(materialName) {\n let seed = 0;\n for (let index = 0; index < materialName.length; index += 1) {\n seed += materialName.charCodeAt(index) * (index + 1);\n }\n return seed;\n}\n\nfunction getMaterialDetailStrength(material, surfaceType) {\n const name = String(material?.name ?? \"\").toLowerCase();\n if (surfaceType === \"water\" || name.includes(\"glass\")) {\n return 0.018;\n }\n if (name.includes(\"wood\") || name.includes(\"timber\") || name.includes(\"plank\")) {\n return 0.13;\n }\n if (name.includes(\"stone\") || name.includes(\"concrete\") || name.includes(\"plaster\")) {\n return 0.1;\n }\n if (name.includes(\"roof\") || name.includes(\"crate\")) {\n return 0.09;\n }\n if (name.includes(\"paint\")) {\n return 0.045;\n }\n if (name.includes(\"metal\")) {\n return 0.035;\n }\n return 0.04;\n}\n\nfunction applyMaterialDetail(color, material, worldCenter, normal, surfaceType) {\n const materialName = String(material?.name ?? surfaceType ?? \"material\");\n const detailStrength = getMaterialDetailStrength(material, surfaceType);\n const sample =\n worldCenter.x * 3.17 +\n worldCenter.y * 5.29 +\n worldCenter.z * 7.83 +\n getMaterialSeed(materialName) * 0.013;\n const grain = (pseudoRandom(sample) - 0.5) * detailStrength;\n const lowerSurface = smoothstep(7.5, -0.8, worldCenter.y);\n const verticalSurface = 1 - clamp(Math.abs(normal.y), 0, 1);\n const materialLowerWear =\n /stone|concrete|plaster|paint|wood|timber|plank|crate/.test(materialName.toLowerCase())\n ? lowerSurface * verticalSurface * 0.055\n : 0;\n const wetlineWear =\n surfaceType === \"ship\" && worldCenter.y < 0.72\n ? smoothstep(0.72, -0.1, worldCenter.y) * 0.05\n : 0;\n\n return {\n r: clamp(color.r * (1 + grain) - materialLowerWear - wetlineWear, 0, 1),\n g: clamp(color.g * (1 + grain * 0.82) - materialLowerWear * 0.9 - wetlineWear, 0, 1),\n b: clamp(color.b * (1 + grain * 0.62) - materialLowerWear * 0.68 - wetlineWear * 0.75, 0, 1),\n };\n}\n\nfunction buildCamera(state, canvas) {\n const preset = CAMERA_PRESETS[state.focus] ?? CAMERA_PRESETS.integrated;\n const yaw = state.camera.yaw ?? preset.yaw;\n const pitch = state.camera.pitch ?? preset.pitch;\n const distance = state.camera.distance ?? preset.distance;\n const target = state.camera.target ?? vec3(...preset.target);\n const eye = vec3(\n target.x + Math.sin(yaw) * Math.cos(pitch) * distance,\n target.y + Math.sin(pitch) * distance,\n target.z + Math.cos(yaw) * Math.cos(pitch) * distance\n );\n const forward = normalizeVec3(subVec3(target, eye));\n const right = normalizeVec3(crossVec3(forward, vec3(0, 1, 0)));\n const up = normalizeVec3(crossVec3(right, forward));\n return {\n eye,\n target,\n forward,\n right,\n up,\n fov: 54,\n aspect: canvas.width / canvas.height,\n };\n}\n\nfunction buildTrianglesFromMesh(\n mesh,\n transform,\n colorOverride,\n camera,\n viewport,\n triangles,\n options = {}\n) {\n const primitives = getMeshPrimitives(mesh);\n for (const primitive of primitives) {\n const resolvedColor = tintPrimitiveColor(primitive.material, colorOverride);\n for (let index = 0; index < primitive.indices.length; index += 3) {\n const aIndex = primitive.indices[index] * 3;\n const bIndex = primitive.indices[index + 1] * 3;\n const cIndex = primitive.indices[index + 2] * 3;\n\n const a = transformPoint(\n vec3(\n primitive.positions[aIndex],\n primitive.positions[aIndex + 1],\n primitive.positions[aIndex + 2]\n ),\n transform\n );\n const b = transformPoint(\n vec3(\n primitive.positions[bIndex],\n primitive.positions[bIndex + 1],\n primitive.positions[bIndex + 2]\n ),\n transform\n );\n const c = transformPoint(\n vec3(\n primitive.positions[cIndex],\n primitive.positions[cIndex + 1],\n primitive.positions[cIndex + 2]\n ),\n transform\n );\n\n const ab = subVec3(b, a);\n const ac = subVec3(c, a);\n const faceNormal = normalizeVec3(crossVec3(ab, ac));\n let normal = faceNormal;\n if (Array.isArray(primitive.normals)) {\n const aNormal = transformDirection(\n vec3(\n primitive.normals[aIndex],\n primitive.normals[aIndex + 1],\n primitive.normals[aIndex + 2]\n ),\n transform\n );\n const bNormal = transformDirection(\n vec3(\n primitive.normals[bIndex],\n primitive.normals[bIndex + 1],\n primitive.normals[bIndex + 2]\n ),\n transform\n );\n const cNormal = transformDirection(\n vec3(\n primitive.normals[cIndex],\n primitive.normals[cIndex + 1],\n primitive.normals[cIndex + 2]\n ),\n transform\n );\n normal = normalizeVec3(\n scaleVec3(addVec3(addVec3(aNormal, bNormal), cNormal), 1 / 3)\n );\n }\n\n const viewDir = normalizeVec3(subVec3(camera.eye, a));\n if (dotVec3(faceNormal, viewDir) <= 0) {\n continue;\n }\n\n const projected = [\n projectPoint(a, camera, viewport),\n projectPoint(b, camera, viewport),\n projectPoint(c, camera, viewport),\n ];\n if (projected.some((value) => value === null)) {\n continue;\n }\n\n triangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: resolvedColor,\n accent: options.accent ?? 0,\n material: primitive.material,\n reflection: options.reflection ?? 0,\n surfaceType: options.surfaceType ?? \"solid\",\n });\n }\n }\n}\n\nasync function loadShowcaseAssetCatalog() {\n const [brigantine, cutter, lighthouse, harborDock] = await Promise.all([\n loadGltfModel(resolveShowcaseAssetUrl(\"brigantine\")),\n loadGltfModel(resolveShowcaseAssetUrl(\"cutter\")),\n loadGltfModel(resolveShowcaseAssetUrl(\"lighthouse\")),\n loadGltfModel(resolveShowcaseAssetUrl(\"harbor-dock\")),\n ]);\n\n return Object.freeze({\n primaryShipKey: \"brigantine\",\n ships: Object.freeze({\n brigantine,\n cutter,\n }),\n environment: Object.freeze({\n lighthouse,\n \"harbor-dock\": harborDock,\n }),\n });\n}\n\nfunction createLegacyShowcaseAssetCatalog() {\n const brigantine = loadGltfModel(resolveShowcaseAssetUrl(\"brigantine\"));\n return Promise.resolve(brigantine).then((primary) =>\n Object.freeze({\n primaryShipKey: \"brigantine\",\n ships: Object.freeze({\n brigantine: primary,\n }),\n environment: Object.freeze({}),\n })\n );\n}\n\nfunction resolveShipModel(state, ship, fallbackModel = null) {\n return (\n state.assetCatalog?.ships?.[ship.modelKey ?? state.assetCatalog?.primaryShipKey ?? \"brigantine\"] ??\n fallbackModel ??\n state.shipModel\n );\n}\n\nfunction createPerformanceGovernor(performanceFeatures) {\n const createQualityLadderAdapter = assertRequiredFunction(\n performanceFeatures,\n \"performance\",\n \"createQualityAdapter\"\n );\n const createDeviceProfile = assertRequiredFunction(\n performanceFeatures,\n \"performance\",\n \"createDeviceProfile\"\n );\n const createGpuPerformanceGovernor = assertRequiredFunction(\n performanceFeatures,\n \"performance\",\n \"createGovernor\"\n );\n\n const fluidDetail = createQualityLadderAdapter({\n id: \"fluid-detail\",\n domain: \"geometry\",\n levels: [\n { id: \"low\", config: { nearResolution: 10, midResolution: 6, splashCount: 10 }, estimatedCostMs: 0.8 },\n { id: \"medium\", config: { nearResolution: 16, midResolution: 8, splashCount: 18 }, estimatedCostMs: 1.4 },\n { id: \"high\", config: { nearResolution: 24, midResolution: 12, splashCount: 28 }, estimatedCostMs: 2.4 },\n ],\n initialLevel: \"high\",\n });\n\n const clothDetail = createQualityLadderAdapter({\n id: \"cloth-detail\",\n domain: \"cloth\",\n levels: [\n { id: \"low\", config: { cols: 10, rows: 7 }, estimatedCostMs: 0.7 },\n { id: \"medium\", config: { cols: 16, rows: 11 }, estimatedCostMs: 1.3 },\n { id: \"high\", config: { cols: 24, rows: 16 }, estimatedCostMs: 2.1 },\n ],\n initialLevel: \"high\",\n });\n\n const lightingDetail = createQualityLadderAdapter({\n id: \"lighting-detail\",\n domain: \"lighting\",\n levels: [\n { id: \"low\", config: { shadowStrength: 0.18, reflectionStrength: 0.08 }, estimatedCostMs: 0.5 },\n { id: \"medium\", config: { shadowStrength: 0.34, reflectionStrength: 0.16 }, estimatedCostMs: 1.0 },\n { id: \"high\", config: { shadowStrength: 0.5, reflectionStrength: 0.24 }, estimatedCostMs: 1.8 },\n ],\n initialLevel: \"high\",\n });\n\n const governor = createGpuPerformanceGovernor({\n device: createDeviceProfile({\n deviceClass: \"desktop\",\n mode: \"flat\",\n refreshRateHz: 60,\n supportedFrameRates: [60, 90],\n supportsWebGpu: true,\n }),\n modules: [fluidDetail, clothDetail, lightingDetail],\n adaptation: {\n sampleWindowSize: 10,\n minimumSamplesBeforeAdjustment: 4,\n degradeCooldownFrames: 1,\n upgradeCooldownFrames: 4,\n minStableFramesForRecovery: 3,\n },\n });\n\n return { governor, fluidDetail, clothDetail, lightingDetail };\n}\n\nfunction buildDemoDom(root, options) {\n const t = options.translate;\n root.innerHTML = `\n <main class=\"plasius-demo\">\n <section class=\"plasius-demo__hero\">\n <section class=\"plasius-panel plasius-demo__hero-card\">\n <p class=\"plasius-demo__eyebrow\">${options.packageName}</p>\n <h1>${options.title}</h1>\n <p class=\"plasius-demo__lead\">${options.subtitle}</p>\n </section>\n <section class=\"plasius-panel plasius-demo__status\">\n <p id=\"demoStatus\" class=\"plasius-demo__status-badge\">${t(gpuSharedTranslationKeys.statusBooting)}</p>\n <p id=\"demoDetails\" class=\"plasius-demo__status-text\">\n ${t(gpuSharedTranslationKeys.detailsBooting)}\n </p>\n </section>\n </section>\n <section class=\"plasius-demo__layout\">\n <section class=\"plasius-panel plasius-demo__canvas-panel\">\n <canvas id=\"demoCanvas\" class=\"plasius-demo__canvas\" width=\"${DEFAULT_CANVAS_WIDTH}\" height=\"${DEFAULT_CANVAS_HEIGHT}\"></canvas>\n <div class=\"plasius-demo__toolbar\">\n <button id=\"pauseButton\" type=\"button\">${t(gpuSharedTranslationKeys.pause)}</button>\n <label class=\"plasius-toggle\">\n <input id=\"stressToggle\" type=\"checkbox\" />\n ${t(gpuSharedTranslationKeys.stressMode)}\n </label>\n <label class=\"plasius-toggle\">\n ${t(gpuSharedTranslationKeys.focus)}\n <select id=\"focusMode\">\n ${showcaseFocusModes\n .map(\n (mode) =>\n `<option value=\"${mode}\">${t(FOCUS_MODE_TRANSLATION_KEYS[mode])}</option>`\n )\n .join(\"\")}\n </select>\n </label>\n </div>\n <div class=\"plasius-demo__legend\">\n <strong>${t(gpuSharedTranslationKeys.legendTitle)}</strong>\n ${t(gpuSharedTranslationKeys.legendShipMetadata)}<br />\n ${t(gpuSharedTranslationKeys.legendLighting)}<br />\n ${t(gpuSharedTranslationKeys.legendCollisions)}\n </div>\n </section>\n <aside class=\"plasius-demo__sidebar\">\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>${t(gpuSharedTranslationKeys.sceneState)}</h2>\n <ul id=\"sceneMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>${t(gpuSharedTranslationKeys.qualityBudgets)}</h2>\n <ul id=\"qualityMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>${t(gpuSharedTranslationKeys.debugTelemetry)}</h2>\n <ul id=\"debugMetrics\" class=\"plasius-demo__metrics\"></ul>\n </section>\n <section class=\"plasius-panel plasius-demo__card\">\n <h2>${t(gpuSharedTranslationKeys.notes)}</h2>\n <ul id=\"sceneNotes\" class=\"plasius-demo__metrics\"></ul>\n </section>\n </aside>\n </section>\n <p class=\"plasius-demo__footer\">\n This visual example is shared across the GPU packages to keep manual validation fast and consistent.\n </p>\n </main>\n `;\n\n return {\n status: root.querySelector(\"#demoStatus\"),\n details: root.querySelector(\"#demoDetails\"),\n canvas: root.querySelector(\"#demoCanvas\"),\n pauseButton: root.querySelector(\"#pauseButton\"),\n stressToggle: root.querySelector(\"#stressToggle\"),\n focusMode: root.querySelector(\"#focusMode\"),\n sceneMetrics: root.querySelector(\"#sceneMetrics\"),\n qualityMetrics: root.querySelector(\"#qualityMetrics\"),\n debugMetrics: root.querySelector(\"#debugMetrics\"),\n sceneNotes: root.querySelector(\"#sceneNotes\"),\n };\n}\n\nfunction buildSceneSnapshot(state, shipModel) {\n const shipPhysics = Object.freeze(\n Object.fromEntries(\n state.ships.map((ship) => [ship.id, resolveShipModel(state, ship, shipModel)?.physics ?? null])\n )\n );\n\n return Object.freeze({\n focus: state.focus,\n frame: state.frame,\n time: state.time,\n stress: state.stress,\n collisions: state.contactCount,\n collisionCount: state.collisionCount,\n collisionFlash: state.collisionFlash,\n sprays: Object.freeze(\n state.sprays.map((spray) =>\n Object.freeze({\n life: spray.life,\n position: Object.freeze({ ...spray.position }),\n velocity: Object.freeze({ ...spray.velocity }),\n })\n )\n ),\n ships: Object.freeze(\n state.ships.map((ship) =>\n Object.freeze({\n id: ship.id,\n modelKey: ship.modelKey ?? \"brigantine\",\n position: Object.freeze({ ...ship.position }),\n velocity: Object.freeze({ ...ship.velocity }),\n rotationY: ship.rotationY,\n angularVelocity: ship.angularVelocity,\n tint: Object.freeze({ ...ship.tint }),\n })\n )\n ),\n waveImpulses: Object.freeze(\n state.waveImpulses.map((impulse) =>\n Object.freeze({\n x: impulse.x,\n z: impulse.z,\n strength: impulse.strength,\n radius: impulse.radius,\n life: impulse.life,\n })\n )\n ),\n shipPhysics: shipModel?.physics ?? null,\n shipModels: shipPhysics,\n physics: Object.freeze({\n profile: state.physics.profile,\n plan: state.physics.plan,\n manifest: state.physics.manifest,\n snapshot: state.physics.snapshot,\n shipPhysics,\n }),\n });\n}\n\nfunction resolveSceneDescription(state, options, shipModel) {\n const scene = buildSceneSnapshot(state, shipModel);\n if (typeof options.describeState !== \"function\") {\n return { scene, description: null };\n }\n\n const description = options.describeState(state.packageState, scene) ?? null;\n return { scene, description };\n}\n\nfunction updatePackageState(state, options, shipModel, dt) {\n if (typeof options.updateState !== \"function\") {\n return;\n }\n\n const scene = buildSceneSnapshot(state, shipModel);\n const nextState = options.updateState(state.packageState, scene, dt);\n if (typeof nextState !== \"undefined\") {\n state.packageState = nextState;\n }\n}\n\nfunction normalizeColorOverride(color, fallback) {\n if (!color || typeof color !== \"object\") {\n return fallback;\n }\n\n return {\n r: typeof color.r === \"number\" ? color.r : fallback.r,\n g: typeof color.g === \"number\" ? color.g : fallback.g,\n b: typeof color.b === \"number\" ? color.b : fallback.b,\n };\n}\n\nfunction readVisualNumber(value, fallback) {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction readPositiveNumber(value, fallback) {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : fallback;\n}\n\nfunction isTruthyCaptureValue(value) {\n return value === \"1\" || value === \"true\" || value === \"scene\" || value === \"video\";\n}\n\nfunction resolveCaptureSettings(options) {\n const explicitCaptureMode =\n typeof options.captureMode === \"boolean\" ? options.captureMode : undefined;\n let captureMode = explicitCaptureMode ?? false;\n let renderScale = readPositiveNumber(options.renderScale, undefined);\n\n try {\n const params = new URLSearchParams(window.location.search);\n if (explicitCaptureMode === undefined) {\n captureMode =\n isTruthyCaptureValue(params.get(\"capture\")) ||\n params.get(\"presentation\") === \"capture\";\n }\n renderScale = readPositiveNumber(Number(params.get(\"renderScale\")), renderScale);\n } catch {\n // Query-string capture controls are optional and only available in browsers.\n }\n\n return {\n captureMode,\n renderScale,\n };\n}\n\nfunction getCanvasDisplaySize(canvas) {\n const rect =\n typeof canvas.getBoundingClientRect === \"function\"\n ? canvas.getBoundingClientRect()\n : null;\n const width = Math.round(\n readPositiveNumber(rect?.width, readPositiveNumber(canvas.clientWidth, canvas.width))\n );\n const height = Math.round(\n readPositiveNumber(rect?.height, readPositiveNumber(canvas.clientHeight, canvas.height))\n );\n\n return {\n width: Math.max(1, width || DEFAULT_CANVAS_WIDTH),\n height: Math.max(1, height || DEFAULT_CANVAS_HEIGHT),\n };\n}\n\nfunction resizeCanvasToDisplaySize(canvas, state) {\n const { width, height } = getCanvasDisplaySize(canvas);\n const deviceScale = readPositiveNumber(globalThis.devicePixelRatio, 1);\n const requestedScale = readPositiveNumber(state.renderScale, deviceScale);\n const maxScale = state.captureMode ? 2 : 1.5;\n let scale = clamp(requestedScale, 1, maxScale);\n const pixelBudget = state.captureMode\n ? CAPTURE_CANVAS_PIXEL_BUDGET\n : DEFAULT_CANVAS_WIDTH * DEFAULT_CANVAS_HEIGHT * 1.5;\n const projectedPixels = width * height * scale * scale;\n\n if (projectedPixels > pixelBudget) {\n scale = Math.sqrt(pixelBudget / Math.max(1, width * height));\n }\n\n const targetWidth = Math.max(1, Math.round(width * scale));\n const targetHeight = Math.max(1, Math.round(height * scale));\n if (canvas.width !== targetWidth || canvas.height !== targetHeight) {\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n }\n\n state.renderScale = scale;\n}\n\nfunction resolveClothPresentation(state, meshDetail, clothFeatures) {\n const clothPlan = clothFeatures.createPlan({\n garmentId: \"shore-flag\",\n kind: state.focus === \"cloth\" ? \"flag\" : clothFeatures.garmentKinds[0],\n profile: state.focus === \"cloth\" ? \"cinematic\" : clothFeatures.profileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 18,\n midFieldMaxMeters: 55,\n farFieldMaxMeters: 180,\n });\n const preset = CAMERA_PRESETS[state.focus] ?? CAMERA_PRESETS.integrated;\n const fallbackEye = state.camera.eye\n ? state.camera.eye\n : addVec3(\n state.camera.target,\n vec3(\n Math.sin(state.camera.yaw ?? preset.yaw) * Math.cos(state.camera.pitch ?? preset.pitch) * (state.camera.distance ?? preset.distance),\n Math.sin(state.camera.pitch ?? preset.pitch) * (state.camera.distance ?? preset.distance),\n Math.cos(state.camera.yaw ?? preset.yaw) * Math.cos(state.camera.pitch ?? preset.pitch) * (state.camera.distance ?? preset.distance)\n )\n );\n const cameraDistance = lengthVec3(subVec3(state.camera.target, fallbackEye));\n const band = clothFeatures.selectBand(cameraDistance, clothPlan.thresholds);\n const representation =\n clothPlan.representations.find((entry) => entry.band === band) ?? clothPlan.representations[0];\n return {\n clothPlan,\n band,\n continuity: representation.continuity,\n representation,\n };\n}\n\nfunction getFlagRestPosition(rows, cols, row, column) {\n const u = cols <= 1 ? 0 : column / (cols - 1);\n const v = rows <= 1 ? 0 : row / (rows - 1);\n return vec3(\n FLAG_LAYOUT.origin.x + u * FLAG_LAYOUT.mastOffsetX,\n FLAG_LAYOUT.origin.y - FLAG_LAYOUT.height * v - u * u * 0.08,\n FLAG_LAYOUT.origin.z + FLAG_LAYOUT.width * u\n );\n}\n\nfunction buildClothConstraints(rows, cols, restPositions) {\n const constraints = [];\n const indexFor = (row, column) => row * cols + column;\n const pushConstraint = (a, b, stiffness) => {\n constraints.push(\n Object.freeze({\n a,\n b,\n restLength: lengthVec3(subVec3(restPositions[a], restPositions[b])),\n stiffness,\n })\n );\n };\n\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const index = indexFor(row, column);\n if (column + 1 < cols) {\n pushConstraint(index, indexFor(row, column + 1), 0.92);\n }\n if (row + 1 < rows) {\n pushConstraint(index, indexFor(row + 1, column), 0.9);\n }\n if (column + 1 < cols && row + 1 < rows) {\n pushConstraint(index, indexFor(row + 1, column + 1), 0.66);\n }\n if (column - 1 >= 0 && row + 1 < rows) {\n pushConstraint(index, indexFor(row + 1, column - 1), 0.66);\n }\n if (column + 2 < cols) {\n pushConstraint(index, indexFor(row, column + 2), 0.22);\n }\n if (row + 2 < rows) {\n pushConstraint(index, indexFor(row + 2, column), 0.18);\n }\n }\n }\n\n return Object.freeze(constraints);\n}\n\nfunction createShowcaseClothSimulationState(options = {}) {\n const rows = Math.max(4, options.rows ?? 11);\n const cols = Math.max(4, options.cols ?? 16);\n const continuity = options.continuity ?? {\n broadMotionFloor: 0.72,\n wrinkleFloor: 0.56,\n };\n const representation = options.representation ?? {\n mesh: {\n solverIterations: 6,\n wrinkleLayers: 2,\n },\n };\n const restPositions = [];\n const positions = [];\n const previousPositions = [];\n const uvs = [];\n const phaseOffsets = [];\n const pinned = [];\n\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const index = row * cols + column;\n const u = cols <= 1 ? 0 : column / (cols - 1);\n const v = rows <= 1 ? 0 : row / (rows - 1);\n const rest = getFlagRestPosition(rows, cols, row, column);\n const preload = vec3(\n u * 0.04,\n Math.sin(v * Math.PI) * 0.02 * continuity.wrinkleFloor,\n -u * 0.12\n );\n const pinnedPoint = column === 0;\n restPositions.push(rest);\n positions.push(pinnedPoint ? vec3(rest.x, rest.y, rest.z) : addVec3(rest, preload));\n previousPositions.push(\n pinnedPoint\n ? vec3(rest.x, rest.y, rest.z)\n : addVec3(rest, scaleVec3(preload, 0.35))\n );\n uvs.push(Object.freeze({ u, v }));\n phaseOffsets.push(pseudoRandom(index + 17) * Math.PI * 2);\n pinned.push(pinnedPoint);\n }\n }\n\n return {\n rows,\n cols,\n continuity,\n representation,\n restPositions,\n positions,\n previousPositions,\n constraints: buildClothConstraints(rows, cols, restPositions),\n indices: Object.freeze(\n Array.from({ length: (rows - 1) * (cols - 1) * 6 }, (_, listIndex) => listIndex)\n .map((_, listIndex, source) => {\n if (listIndex >= source.length) {\n return 0;\n }\n const quadIndex = Math.floor(listIndex / 6);\n const quadColumn = quadIndex % (cols - 1);\n const quadRow = Math.floor(quadIndex / (cols - 1));\n const base = quadRow * cols + quadColumn;\n return [base, base + 1, base + cols + 1, base, base + cols + 1, base + cols][listIndex % 6];\n })\n ),\n uvs,\n phaseOffsets,\n pinned,\n };\n}\n\nfunction resetPinnedClothPoints(clothState) {\n for (let index = 0; index < clothState.positions.length; index += 1) {\n if (!clothState.pinned[index]) {\n continue;\n }\n const anchor = clothState.restPositions[index];\n clothState.positions[index] = vec3(anchor.x, anchor.y, anchor.z);\n clothState.previousPositions[index] = vec3(anchor.x, anchor.y, anchor.z);\n }\n}\n\nfunction satisfyClothConstraint(clothState, constraint) {\n const a = clothState.positions[constraint.a];\n const b = clothState.positions[constraint.b];\n const delta = subVec3(b, a);\n const distance = lengthVec3(delta);\n if (distance <= 0.0001) {\n return;\n }\n\n const correctionScale =\n ((distance - constraint.restLength) / distance) * 0.5 * constraint.stiffness;\n const correction = scaleVec3(delta, correctionScale);\n if (!clothState.pinned[constraint.a]) {\n clothState.positions[constraint.a] = addVec3(a, correction);\n }\n if (!clothState.pinned[constraint.b]) {\n clothState.positions[constraint.b] = subVec3(b, correction);\n }\n}\n\nfunction advanceShowcaseClothSimulationState(clothState, options = {}) {\n const dt = clamp(options.dt ?? 1 / 60, 1 / 240, 1 / 18);\n const time = readVisualNumber(options.time, 0);\n const flagMotion = readVisualNumber(options.flagMotion, 0.92);\n const waveInfluence = readVisualNumber(options.waveInfluence, 0);\n const wrinkleLayers = Math.max(1, clothState.representation.mesh?.wrinkleLayers ?? 2);\n const solverIterations = clamp(\n Math.round(clothState.representation.mesh?.solverIterations ?? 6),\n 2,\n 10\n );\n\n for (let index = 0; index < clothState.positions.length; index += 1) {\n if (clothState.pinned[index]) {\n continue;\n }\n\n const current = clothState.positions[index];\n const previous = clothState.previousPositions[index];\n const { u, v } = clothState.uvs[index];\n const phase = clothState.phaseOffsets[index];\n const broadMotion = clothState.continuity.broadMotionFloor;\n const wrinkleMotion = clothState.continuity.wrinkleFloor;\n const gustPhase = time * 2.1 + phase + u * 4.4 + v * 2.3;\n const wrinklePhase = time * 5.3 + phase * 0.72 + u * 9.6 + v * 7.1;\n const windDirection = normalizeVec3(\n vec3(\n 0.18 + Math.sin(gustPhase) * (0.12 + broadMotion * 0.09),\n Math.cos(time * 1.4 + phase + v * 4.8) * 0.06 * wrinkleMotion,\n 1 + Math.sin(gustPhase * 0.74) * 0.18\n )\n );\n const windStrength =\n (1.6 + broadMotion * 1.25 + wrinkleLayers * 0.12) *\n flagMotion *\n (0.44 + u * 1.14);\n const wrinkleForce = vec3(\n Math.sin(wrinklePhase) * 0.22 * wrinkleMotion * flagMotion,\n Math.cos(wrinklePhase * 0.7) * 0.08 * wrinkleMotion,\n Math.cos(wrinklePhase) * 0.14 * broadMotion * flagMotion\n );\n const acceleration = addVec3(\n vec3(0, -0.48 - u * 0.08, 0),\n addVec3(\n scaleVec3(windDirection, windStrength),\n addVec3(\n wrinkleForce,\n vec3(waveInfluence * (0.04 + u * 0.08), 0, waveInfluence * 0.16)\n )\n )\n );\n const inertia = scaleVec3(subVec3(current, previous), 0.987);\n const next = addVec3(addVec3(current, inertia), scaleVec3(acceleration, dt * dt));\n clothState.previousPositions[index] = vec3(current.x, current.y, current.z);\n clothState.positions[index] = next;\n }\n\n resetPinnedClothPoints(clothState);\n for (let iteration = 0; iteration < solverIterations; iteration += 1) {\n for (const constraint of clothState.constraints) {\n satisfyClothConstraint(clothState, constraint);\n }\n resetPinnedClothPoints(clothState);\n }\n\n return clothState;\n}\n\nfunction ensureShowcaseClothState(state, meshDetail, clothPresentation) {\n if (\n !state.clothState ||\n state.clothState.rows !== meshDetail.rows ||\n state.clothState.cols !== meshDetail.cols\n ) {\n state.clothState = createShowcaseClothSimulationState({\n rows: meshDetail.rows,\n cols: meshDetail.cols,\n continuity: clothPresentation.continuity,\n representation: clothPresentation.representation,\n });\n } else {\n state.clothState.continuity = clothPresentation.continuity;\n state.clothState.representation = clothPresentation.representation;\n }\n\n return state.clothState;\n}\n\nfunction resolveVisualConfig(nearLighting, lightingSnapshot, customVisuals = {}) {\n const premiumShadows = nearLighting.primaryShadowSource === \"ray-traced-primary\";\n const defaults = {\n skyTop: premiumShadows ? \"#040c1a\" : \"#06101f\",\n skyMid: premiumShadows ? \"#11203b\" : \"#152643\",\n skyBottom: premiumShadows ? \"#2f4468\" : \"#364d73\",\n duskGlow: premiumShadows ? \"rgba(116, 142, 201, 0.26)\" : \"rgba(104, 128, 188, 0.22)\",\n seaTop: premiumShadows ? \"#102946\" : \"#153050\",\n seaMid: premiumShadows ? \"#0a1d33\" : \"#0d2138\",\n seaBottom: \"#04101d\",\n moonCore: \"rgba(241, 246, 255, 0.98)\",\n moonHalo: \"rgba(167, 191, 255, 0.24)\",\n moonReflection: \"rgba(192, 214, 255, 0.22)\",\n starColor: \"rgba(232, 239, 255, 0.82)\",\n ambientMist: \"rgba(41, 63, 97, 0.16)\",\n reflectionStrength: lightingSnapshot.currentLevel.config.reflectionStrength,\n shadowAccent: lightingSnapshot.currentLevel.config.shadowStrength,\n waveAmplitude: 0.94,\n waveDirection: { x: 0.88, z: 0.28 },\n wavePhaseSpeed: 0.88,\n wakeStrength: 0.31,\n wakeLength: 18,\n collisionRippleStrength: 0.42,\n waterNear: { r: 0.08, g: 0.23, b: 0.33 },\n waterFar: { r: 0.18, g: 0.35, b: 0.49 },\n harborWall: { r: 0.26, g: 0.24, b: 0.28 },\n harborDeck: { r: 0.33, g: 0.22, b: 0.16 },\n harborTower: { r: 0.23, g: 0.24, b: 0.29 },\n flagColor: { r: 0.66, g: 0.16, b: 0.13 },\n flagMotion: 0.92,\n lanternCore: { r: 0.98, g: 0.8, b: 0.48 },\n lanternGlow: { r: 1, g: 0.56, b: 0.2 },\n lanternReflectionStrength: 0.42,\n torchCore: { r: 0.99, g: 0.72, b: 0.36 },\n torchGlow: { r: 0.98, g: 0.38, b: 0.15 },\n collisionFlash: \"rgba(255, 212, 168, 0.16)\",\n };\n\n return {\n skyTop: typeof customVisuals.skyTop === \"string\" ? customVisuals.skyTop : defaults.skyTop,\n skyMid: typeof customVisuals.skyMid === \"string\" ? customVisuals.skyMid : defaults.skyMid,\n skyBottom:\n typeof customVisuals.skyBottom === \"string\" ? customVisuals.skyBottom : defaults.skyBottom,\n seaTop: typeof customVisuals.seaTop === \"string\" ? customVisuals.seaTop : defaults.seaTop,\n seaMid: typeof customVisuals.seaMid === \"string\" ? customVisuals.seaMid : defaults.seaMid,\n seaBottom:\n typeof customVisuals.seaBottom === \"string\" ? customVisuals.seaBottom : defaults.seaBottom,\n duskGlow:\n typeof customVisuals.duskGlow === \"string\" ? customVisuals.duskGlow : defaults.duskGlow,\n moonCore:\n typeof customVisuals.moonCore === \"string\"\n ? customVisuals.moonCore\n : typeof customVisuals.sunCore === \"string\"\n ? customVisuals.sunCore\n : defaults.moonCore,\n moonHalo:\n typeof customVisuals.moonHalo === \"string\" ? customVisuals.moonHalo : defaults.moonHalo,\n moonReflection:\n typeof customVisuals.moonReflection === \"string\"\n ? customVisuals.moonReflection\n : defaults.moonReflection,\n starColor:\n typeof customVisuals.starColor === \"string\" ? customVisuals.starColor : defaults.starColor,\n ambientMist:\n typeof customVisuals.ambientMist === \"string\"\n ? customVisuals.ambientMist\n : defaults.ambientMist,\n reflectionStrength: readVisualNumber(\n customVisuals.reflectionStrength,\n defaults.reflectionStrength\n ),\n shadowAccent: readVisualNumber(customVisuals.shadowAccent, defaults.shadowAccent),\n waveAmplitude: readVisualNumber(customVisuals.waveAmplitude, defaults.waveAmplitude),\n waveDirection:\n customVisuals.waveDirection &&\n typeof customVisuals.waveDirection.x === \"number\" &&\n typeof customVisuals.waveDirection.z === \"number\"\n ? { x: customVisuals.waveDirection.x, z: customVisuals.waveDirection.z }\n : defaults.waveDirection,\n wavePhaseSpeed: readVisualNumber(customVisuals.wavePhaseSpeed, defaults.wavePhaseSpeed),\n wakeStrength: readVisualNumber(customVisuals.wakeStrength, defaults.wakeStrength),\n wakeLength: readVisualNumber(customVisuals.wakeLength, defaults.wakeLength),\n collisionRippleStrength: readVisualNumber(\n customVisuals.collisionRippleStrength,\n defaults.collisionRippleStrength\n ),\n waterNear: normalizeColorOverride(customVisuals.waterNear, defaults.waterNear),\n waterFar: normalizeColorOverride(customVisuals.waterFar, defaults.waterFar),\n harborWall: normalizeColorOverride(customVisuals.harborWall, defaults.harborWall),\n harborDeck: normalizeColorOverride(customVisuals.harborDeck, defaults.harborDeck),\n harborTower: normalizeColorOverride(customVisuals.harborTower, defaults.harborTower),\n flagColor: normalizeColorOverride(customVisuals.flagColor, defaults.flagColor),\n flagMotion: readVisualNumber(customVisuals.flagMotion, defaults.flagMotion),\n lanternCore: normalizeColorOverride(customVisuals.lanternCore, defaults.lanternCore),\n lanternGlow: normalizeColorOverride(customVisuals.lanternGlow, defaults.lanternGlow),\n lanternReflectionStrength: readVisualNumber(\n customVisuals.lanternReflectionStrength,\n defaults.lanternReflectionStrength\n ),\n torchCore: normalizeColorOverride(customVisuals.torchCore, defaults.torchCore),\n torchGlow: normalizeColorOverride(customVisuals.torchGlow, defaults.torchGlow),\n collisionFlash:\n typeof customVisuals.collisionFlash === \"string\"\n ? customVisuals.collisionFlash\n : defaults.collisionFlash,\n };\n}\n\nfunction buildClothSurface(model, state, meshDetail, visuals, clothFeatures) {\n const resolvedClothFeatures = normalizeClothFeatureAdapters(clothFeatures);\n const clothPresentation = resolveClothPresentation(state, meshDetail, resolvedClothFeatures);\n const clothState = ensureShowcaseClothState(state, meshDetail, clothPresentation);\n\n return {\n clothPlan: clothPresentation.clothPlan,\n band: clothPresentation.band,\n representation: clothPresentation.representation,\n continuity: clothPresentation.continuity,\n color: visuals.flagColor,\n positions: clothState.positions.map((point) => vec3(point.x, point.y, point.z)),\n indices: clothState.indices,\n grid: { rows: clothState.rows, cols: clothState.cols },\n };\n}\n\nfunction resolveWaveDirection(state) {\n const direction = state.demoVisuals?.waveDirection;\n if (\n direction &&\n typeof direction === \"object\" &&\n typeof direction.x === \"number\" &&\n typeof direction.z === \"number\"\n ) {\n return normalizeVec3(vec3(direction.x, 0, direction.z));\n }\n\n return normalizeVec3(vec3(0.86, 0, 0.34));\n}\n\nfunction sampleShipWake(state, x, z, time) {\n const wakeStrength = readVisualNumber(state.demoVisuals?.wakeStrength, 0.24);\n const wakeLength = readVisualNumber(state.demoVisuals?.wakeLength, 15);\n let total = 0;\n\n for (const ship of state.ships) {\n const speed = Math.hypot(ship.velocity.x, ship.velocity.z);\n if (speed <= 0.05) {\n continue;\n }\n\n const direction = normalizeVec3(vec3(ship.velocity.x, 0, ship.velocity.z));\n const behind = scaleVec3(direction, -1);\n const lateral = vec3(-direction.z, 0, direction.x);\n const delta = vec3(x - ship.position.x, 0, z - ship.position.z);\n const along = dotVec3(delta, behind);\n if (along < 0 || along > wakeLength) {\n continue;\n }\n\n const cross = Math.abs(dotVec3(delta, lateral));\n const width = 0.9 + along * 0.2;\n if (cross > width * 3.2) {\n continue;\n }\n\n const envelope =\n Math.exp(-along * 0.14) * Math.exp(-((cross * cross) / Math.max(0.4, width * width * 2.4)));\n total += Math.sin(along * 1.6 - time * 4.2) * speed * wakeStrength * envelope;\n }\n\n return total;\n}\n\nfunction sampleWaveImpulses(state, x, z, time) {\n const rippleStrength = readVisualNumber(state.demoVisuals?.collisionRippleStrength, 0.34);\n let total = 0;\n\n for (const impulse of state.waveImpulses) {\n const dx = x - impulse.x;\n const dz = z - impulse.z;\n const distance = Math.hypot(dx, dz);\n const radius = impulse.radius + (1 - impulse.life) * 4.8;\n if (distance > radius * 2.8) {\n continue;\n }\n\n const phase = distance * 1.8 - (1 - impulse.life) * 10 - time * 0.4;\n const envelope = Math.exp(-distance / Math.max(0.1, radius)) * impulse.life;\n total += Math.sin(phase) * impulse.strength * rippleStrength * envelope * 0.18;\n }\n\n return total;\n}\n\nfunction sampleWave(state, x, z, time) {\n const direction = resolveWaveDirection(state);\n const lateral = vec3(-direction.z, 0, direction.x);\n const along = x * direction.x + z * direction.z;\n const cross = x * lateral.x + z * lateral.z;\n const phaseSpeed = readVisualNumber(state.demoVisuals?.wavePhaseSpeed, 1);\n const amplitude = readVisualNumber(state.demoVisuals?.waveAmplitude, 1);\n const base =\n Math.sin(along * 0.22 - time * 1.12 * phaseSpeed) * 0.42 +\n Math.cos(along * 0.11 + cross * 0.07 - time * 0.78 * phaseSpeed) * 0.26 +\n Math.sin(cross * 0.19 - time * 1.34 * phaseSpeed) * 0.16;\n\n return (\n base * amplitude +\n sampleShipWake(state, x, z, time) +\n sampleWaveImpulses(state, x, z, time)\n );\n}\n\nfunction resolveFluidBandContinuity(continuity, band) {\n if (continuity?.bands && continuity.bands[band]) {\n return continuity.bands[band];\n }\n\n return continuity ?? { amplitudeFloor: 1, frequencyFloor: 1 };\n}\n\nfunction buildWaterMotionEffects(state) {\n const wakeTrails = [];\n const rippleRings = state.waveImpulses.map((impulse) => {\n const radius = impulse.radius + (1 - impulse.life) * 4.8;\n return Object.freeze({\n center: vec3(\n impulse.x,\n sampleWave(state, impulse.x, impulse.z, state.time) * 0.24 + 0.06,\n impulse.z\n ),\n radius,\n opacity: clamp(impulse.life * 0.28, 0.08, 0.3),\n });\n });\n\n for (const ship of state.ships) {\n const speed = Math.hypot(ship.velocity.x, ship.velocity.z);\n if (speed <= 0.18) {\n continue;\n }\n\n const direction = normalizeVec3(vec3(ship.velocity.x, 0, ship.velocity.z));\n const behind = scaleVec3(direction, -1);\n const lateral = vec3(-direction.z, 0, direction.x);\n const points = [];\n for (let sampleIndex = 0; sampleIndex < 6; sampleIndex += 1) {\n const along = 1 + sampleIndex * 1.45;\n const lateralOffset =\n Math.sin(state.time * 1.2 + sampleIndex * 0.8 + readVisualNumber(ship.wanderPhase, 0)) * 0.12;\n const worldPoint = addVec3(\n ship.position,\n addVec3(scaleVec3(behind, along), scaleVec3(lateral, lateralOffset))\n );\n points.push(\n Object.freeze({\n center: vec3(\n worldPoint.x,\n sampleWave(state, worldPoint.x, worldPoint.z, state.time) * 0.24 + 0.04,\n worldPoint.z\n ),\n width: 0.34 + sampleIndex * 0.13,\n })\n );\n }\n wakeTrails.push(\n Object.freeze({\n opacity: clamp(0.18 + speed * 0.09, 0.22, 0.46),\n points: Object.freeze(points),\n })\n );\n }\n\n return Object.freeze({\n wakeTrails: Object.freeze(wakeTrails),\n rippleRings: Object.freeze(rippleRings),\n });\n}\n\nfunction buildWaterBands(state, fluidDetail, visuals, fluidFeatures) {\n const resolvedFluidFeatures = normalizeFluidFeatureAdapters(fluidFeatures);\n const fluidPlan = resolvedFluidFeatures.createPlan({\n fluidBodyId: \"harbor\",\n kind: state.focus === \"fluid\" ? \"ocean\" : resolvedFluidFeatures.bodyKinds[0],\n profile: state.focus === \"fluid\" ? \"cinematic\" : resolvedFluidFeatures.profileNames[0],\n supportsRayTracing: true,\n nearFieldMaxMeters: 40,\n midFieldMaxMeters: 150,\n farFieldMaxMeters: 600,\n });\n\n const bandMeshes = [];\n const bandExtents = Object.freeze([\n { band: \"near\", width: 20, depth: 18, step: 1, y: 0.2 },\n { band: \"mid\", width: 34, depth: 28, step: 2, y: 0.05 },\n { band: \"far\", width: 54, depth: 42, step: 3.5, y: -0.05 },\n { band: \"horizon\", width: 80, depth: 76, step: 7, y: -0.14 },\n ]);\n\n for (const bandSpec of bandExtents) {\n const representation =\n fluidPlan.representations.find((entry) => entry.band === bandSpec.band) ??\n fluidPlan.representations[0];\n const continuity = resolvedFluidFeatures.createContinuityEnvelope({ fluidBodyId: \"harbor\" });\n const bandContinuity = resolveFluidBandContinuity(continuity, bandSpec.band);\n const bandResolution =\n bandSpec.band === \"near\"\n ? fluidDetail.nearResolution\n : bandSpec.band === \"mid\"\n ? fluidDetail.midResolution\n : bandSpec.band === \"far\"\n ? 5\n : 3;\n const cols = Math.max(4, bandResolution * 2);\n const rows = Math.max(4, bandResolution + 2);\n const positions = [];\n const indices = [];\n const originX = -bandSpec.width * 0.5;\n const originZ = -6;\n for (let row = 0; row < rows; row += 1) {\n for (let column = 0; column < cols; column += 1) {\n const u = column / (cols - 1);\n const v = row / (rows - 1);\n const x = originX + bandSpec.width * u;\n const z = originZ + bandSpec.depth * v;\n const y =\n bandSpec.y +\n sampleWave(state, x, z, state.time) *\n bandContinuity.amplitudeFloor *\n (bandSpec.band === \"near\" ? 0.9 : bandSpec.band === \"mid\" ? 0.55 : 0.3);\n positions.push(vec3(x, y, z));\n }\n }\n for (let row = 0; row < rows - 1; row += 1) {\n for (let column = 0; column < cols - 1; column += 1) {\n const a = row * cols + column;\n const b = a + 1;\n const c = a + cols + 1;\n const d = a + cols;\n indices.push(a, b, c, a, c, d);\n }\n }\n\n bandMeshes.push({\n band: bandSpec.band,\n representation,\n continuity: bandContinuity,\n rows,\n cols,\n positions,\n indices,\n color:\n bandSpec.band === \"near\"\n ? visuals.waterNear\n : bandSpec.band === \"mid\"\n ? {\n r: mix(visuals.waterNear.r, visuals.waterFar.r, 0.4),\n g: mix(visuals.waterNear.g, visuals.waterFar.g, 0.4),\n b: mix(visuals.waterNear.b, visuals.waterFar.b, 0.4),\n }\n : bandSpec.band === \"far\"\n ? visuals.waterFar\n : {\n r: mix(visuals.waterFar.r, 0.76, 0.2),\n g: mix(visuals.waterFar.g, 0.78, 0.2),\n b: mix(visuals.waterFar.b, 0.82, 0.2),\n },\n });\n }\n\n return { fluidPlan, bandMeshes };\n}\n\nfunction createSceneState(options, featureAdapters) {\n const translate = options.translate;\n const { governor, fluidDetail, clothDetail, lightingDetail } = createPerformanceGovernor(\n featureAdapters.performance\n );\n const physicsProfile = featureAdapters.physics.defaultProfile;\n const createPhysicsSimulationPlan = assertRequiredFunction(\n featureAdapters.physics,\n \"physics\",\n \"createSimulationPlan\"\n );\n const getPhysicsWorkerManifest = assertRequiredFunction(\n featureAdapters.physics,\n \"physics\",\n \"getManifest\"\n );\n const createGpuDebugSession = assertRequiredFunction(\n featureAdapters.debug,\n \"debug\",\n \"createSession\"\n );\n\n const physicsPlan = createPhysicsSimulationPlan(physicsProfile);\n const physicsManifest = getPhysicsWorkerManifest(physicsProfile);\n const debugSession = createGpuDebugSession({\n enabled: true,\n adapter: {\n label: translate(gpuSharedTranslationKeys.debugAdapterShowcase),\n memoryCapacityHintBytes: 6 * 1024 * 1024 * 1024,\n coreCountHint: 12,\n },\n });\n debugSession.trackAllocation({\n id: \"showcase.color\",\n owner: \"renderer\",\n category: \"texture\",\n sizeBytes: 1280 * 720 * 4,\n label: translate(gpuSharedTranslationKeys.debugMainColorBuffer),\n });\n debugSession.trackAllocation({\n id: \"showcase.shadow-impression\",\n owner: \"lighting\",\n category: \"texture\",\n sizeBytes: 12 * 1024 * 1024,\n label: translate(gpuSharedTranslationKeys.debugShadowImpressionAtlas),\n });\n\n return {\n translate,\n focus: options.focus,\n governor,\n fluidDetail,\n clothDetail,\n lightingDetail,\n debugSession,\n showcaseRealisticModelsEnabled: options.realisticModelsEnabled !== false,\n captureMode: options.captureMode === true,\n renderScale: readPositiveNumber(options.renderScale, undefined),\n packageState: undefined,\n demoDescription: null,\n demoVisuals: null,\n time: 0,\n lastTimeMs: null,\n paused: false,\n stress: false,\n camera: {\n ...CAMERA_PRESETS[options.focus],\n target: vec3(...CAMERA_PRESETS[options.focus].target),\n },\n ships: [\n {\n id: \"northwind\",\n modelKey: \"brigantine\",\n position: vec3(-5.2, 0, 7.2),\n velocity: vec3(2.35, 0, -1.08),\n rotationY: 0.58,\n angularVelocity: 0.09,\n tint: { r: 0.62, g: 0.39, b: 0.23 },\n massScale: 1.42,\n cruiseSpeed: 2.25,\n throttleResponse: 0.46,\n rudderResponse: 0.54,\n wanderPhase: 0.35,\n lanterns: CUTTER_LANTERNS,\n lanternStrength: 1.06,\n collisionRadiusScale: 1.04,\n },\n {\n id: \"tidecaller\",\n modelKey: \"cutter\",\n position: vec3(4.8, 0, 4.4),\n velocity: vec3(-2.15, 0, 1.74),\n rotationY: -2.48,\n angularVelocity: -0.2,\n tint: { r: 0.58, g: 0.24, b: 0.16 },\n massScale: 0.84,\n cruiseSpeed: 2.68,\n throttleResponse: 0.7,\n rudderResponse: 0.78,\n wanderPhase: 1.6,\n lanterns: SHIP_LANTERNS,\n lanternStrength: 1.18,\n collisionRadiusScale: 0.94,\n },\n ],\n sprays: [],\n waveImpulses: [],\n frame: 0,\n contactCount: 0,\n collisionCount: 0,\n collisionFlash: 0,\n clothState: null,\n physics: {\n profile: physicsProfile,\n plan: physicsPlan,\n manifest: physicsManifest,\n snapshot: null,\n },\n assetCatalog: null,\n shipModel: null,\n };\n}\n\nfunction setListContent(element, values) {\n element.innerHTML = values.map((value) => `<li>${value}</li>`).join(\"\");\n}\n\nfunction drawSkyAndShore(ctx, canvas, state, nearLighting, reflectionStrength, shadowStrength, visuals) {\n const sky = ctx.createLinearGradient(0, 0, 0, canvas.height * 0.5);\n sky.addColorStop(0, visuals.skyTop);\n sky.addColorStop(0.54, visuals.skyMid);\n sky.addColorStop(1, visuals.skyBottom);\n ctx.fillStyle = sky;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n for (let index = 0; index < 70; index += 1) {\n const x = pseudoRandom(index + 13) * canvas.width;\n const y = pseudoRandom(index * 7 + 5) * canvas.height * 0.42;\n const twinkle = 0.45 + Math.sin(state.time * 1.4 + index * 0.73) * 0.25;\n const radius = 0.6 + pseudoRandom(index * 11 + 2) * 1.9;\n ctx.fillStyle = visuals.starColor.replace(/[\\d.]+\\)$/u, `${clamp(twinkle, 0.16, 0.92)})`);\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n\n const horizonGlow = ctx.createLinearGradient(0, canvas.height * 0.22, 0, canvas.height * 0.62);\n horizonGlow.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n horizonGlow.addColorStop(1, visuals.duskGlow);\n ctx.fillStyle = horizonGlow;\n ctx.fillRect(0, canvas.height * 0.2, canvas.width, canvas.height * 0.45);\n\n const shoreline = ctx.createLinearGradient(0, canvas.height * 0.45, 0, canvas.height);\n shoreline.addColorStop(0, visuals.seaTop);\n shoreline.addColorStop(0.52, visuals.seaMid);\n shoreline.addColorStop(1, visuals.seaBottom);\n ctx.fillStyle = shoreline;\n ctx.fillRect(0, canvas.height * 0.45, canvas.width, canvas.height * 0.55);\n\n const moonX = canvas.width * 0.76 + Math.sin(state.time * 0.045) * 18;\n const moonY = canvas.height * 0.17 + Math.cos(state.time * 0.05) * 10;\n const moon = ctx.createRadialGradient(moonX, moonY, 14, moonX, moonY, 126);\n moon.addColorStop(0, visuals.moonCore);\n moon.addColorStop(0.46, visuals.moonHalo);\n moon.addColorStop(1, \"rgba(167, 191, 255, 0)\");\n ctx.fillStyle = moon;\n ctx.beginPath();\n ctx.arc(moonX, moonY, 94, 0, Math.PI * 2);\n ctx.fill();\n\n const moonCore = ctx.createRadialGradient(moonX, moonY, 4, moonX, moonY, 28);\n moonCore.addColorStop(0, \"rgba(255, 255, 255, 0.98)\");\n moonCore.addColorStop(1, visuals.moonCore);\n ctx.fillStyle = moonCore;\n ctx.beginPath();\n ctx.arc(moonX, moonY, 24, 0, Math.PI * 2);\n ctx.fill();\n\n const track = ctx.createLinearGradient(moonX, canvas.height * 0.44, moonX, canvas.height * 0.98);\n track.addColorStop(0, visuals.moonReflection.replace(/[\\d.]+\\)$/u, `${0.08 + reflectionStrength * 0.12})`));\n track.addColorStop(0.42, visuals.moonReflection.replace(/[\\d.]+\\)$/u, `${0.04 + reflectionStrength * 0.18})`));\n track.addColorStop(1, \"rgba(192, 214, 255, 0)\");\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = track;\n ctx.beginPath();\n ctx.ellipse(moonX, canvas.height * 0.75, 38 + shadowStrength * 42, canvas.height * 0.24, 0, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n const mist = ctx.createLinearGradient(0, canvas.height * 0.5, 0, canvas.height);\n mist.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n mist.addColorStop(1, visuals.ambientMist);\n ctx.fillStyle = mist;\n ctx.fillRect(0, canvas.height * 0.45, canvas.width, canvas.height * 0.55);\n\n if (state.collisionFlash > 0.01) {\n ctx.fillStyle = visuals.collisionFlash.replace(\n /[\\d.]+\\)$/u,\n `${clamp(state.collisionFlash * 0.22, 0, 0.26)})`\n );\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n}\n\nfunction resolveLocalLightContribution(triangle, lightSources) {\n const contribution = { r: 0, g: 0, b: 0 };\n if (!Array.isArray(lightSources) || triangle.surfaceType === \"water\") {\n return contribution;\n }\n\n const normal = normalizeVec3(triangle.normal);\n for (const source of lightSources.slice(0, 8)) {\n const delta = subVec3(source.point, triangle.worldCenter);\n const distance = lengthVec3(delta);\n const attenuation =\n (source.glowScale ?? 1) / Math.max(1, 0.68 + distance * distance * 0.2);\n if (attenuation < 0.012) {\n continue;\n }\n\n const lightDir = normalizeVec3(delta);\n const facing = clamp(dotVec3(normal, lightDir), 0, 1);\n const response = attenuation * (0.18 + facing * 0.82);\n const glowColor = source.glowColor ?? source.coreColor ?? { r: 1, g: 0.72, b: 0.4 };\n contribution.r += glowColor.r * response * 0.32;\n contribution.g += glowColor.g * response * 0.26;\n contribution.b += glowColor.b * response * 0.18;\n }\n\n return contribution;\n}\n\nfunction drawTriangles(\n ctx,\n triangles,\n lightDir,\n reflectionStrength,\n camera,\n shadowStrength,\n localLights = []\n) {\n triangles.sort((left, right) => right.depth - left.depth);\n for (const triangle of triangles) {\n const surfaceNormal = normalizeVec3(triangle.normal);\n const material = triangle.material ?? {\n roughness: 0.88,\n metallic: 0.08,\n emissive: { r: 0, g: 0, b: 0 },\n };\n const shaded = shadeColor(\n triangle.baseColor,\n surfaceNormal,\n lightDir,\n clamp((triangle.worldCenter.y + 3) / 10, 0, 1),\n triangle.accent\n );\n const reflection = reflectionStrength * (triangle.reflection ?? 0);\n const viewDir = normalizeVec3(subVec3(camera.eye, triangle.worldCenter));\n const reflectedLight = reflectVec3(scaleVec3(lightDir, -1), surfaceNormal);\n const gloss = mix(0.78, 0.14, clamp(material.roughness ?? 0.88, 0, 1)) + (material.metallic ?? 0) * 0.18;\n const specularPower = mix(26, 7, clamp(material.roughness ?? 0.88, 0, 1));\n const specular =\n Math.pow(clamp(dotVec3(reflectedLight, viewDir), 0, 1), specularPower) * gloss;\n const emissive = material.emissive ?? { r: 0, g: 0, b: 0 };\n const localLight = resolveLocalLightContribution(triangle, localLights);\n const occlusion = triangle.surfaceType === \"water\" ? shadowStrength * 0.018 : shadowStrength * 0.04;\n const detailed = applyMaterialDetail(\n {\n r: clamp(\n shaded.r + reflection * 0.08 + specular * 0.16 + emissive.r * 0.42 + localLight.r - occlusion,\n 0,\n 1\n ),\n g: clamp(\n shaded.g + reflection * 0.08 + specular * 0.16 + emissive.g * 0.42 + localLight.g - occlusion,\n 0,\n 1\n ),\n b: clamp(\n shaded.b + reflection * 0.16 + specular * 0.22 + emissive.b * 0.46 + localLight.b - occlusion * 0.5,\n 0,\n 1\n ),\n },\n material,\n triangle.worldCenter,\n surfaceNormal,\n triangle.surfaceType\n );\n const fill = colorToRgba(\n detailed,\n triangle.baseColor.a ?? 0.98\n );\n ctx.fillStyle = fill;\n ctx.beginPath();\n ctx.moveTo(triangle.points[0].x, triangle.points[0].y);\n ctx.lineTo(triangle.points[1].x, triangle.points[1].y);\n ctx.lineTo(triangle.points[2].x, triangle.points[2].y);\n ctx.closePath();\n ctx.fill();\n }\n}\n\nfunction renderProjectedShadow(ctx, worldPoints, camera, viewport, lightDir, options = {}) {\n const planeY = options.planeY ?? 0;\n const projected = worldPoints\n .map((point) => projectShadowPoint(point, lightDir, planeY))\n .filter(Boolean)\n .map((point) => projectPoint(point, camera, viewport))\n .filter(Boolean);\n\n if (projected.length < 3) {\n return;\n }\n\n ctx.save();\n ctx.globalCompositeOperation = \"multiply\";\n ctx.fillStyle = options.color ?? `rgba(12, 24, 36, ${clamp(options.alpha ?? 0.16, 0, 0.5)})`;\n ctx.shadowColor = options.color ?? \"rgba(12, 24, 36, 0.22)\";\n ctx.shadowBlur = options.blur ?? 18;\n ctx.beginPath();\n ctx.moveTo(projected[0].x, projected[0].y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].x, projected[index].y);\n }\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n\nfunction pushHarborGeometry(camera, viewport, triangles, state) {\n if (!state.showcaseRealisticModelsEnabled) {\n for (const object of LEGACY_HARBOR_LAYOUT) {\n buildTrianglesFromMesh(\n { positions: [object], indices: [0], normals: null, colors: null, material: createLegacyMeshPrimitive({})?.material, bounds: null, name: \"legacy-structure\" },\n {\n position: object.position,\n rotationY: object.rotationY,\n scale: object.scale,\n },\n object.color,\n camera,\n viewport,\n triangles,\n {\n accent: object.accent,\n reflection: 0,\n surfaceType: \"structure\",\n }\n );\n }\n\n return;\n }\n\n for (const placement of SHOWCASE_ENVIRONMENT_LAYOUT) {\n const mesh = state.assetCatalog?.environment?.[placement.assetKey] ?? null;\n if (!mesh) {\n continue;\n }\n\n buildTrianglesFromMesh(\n mesh,\n {\n position: vec3(placement.position.x, placement.position.y, placement.position.z),\n rotationY: placement.rotationY,\n scale: placement.scale,\n },\n null,\n camera,\n viewport,\n triangles,\n {\n accent: placement.accent,\n reflection: 0,\n surfaceType: \"structure\",\n }\n );\n }\n}\n\nfunction renderShipRigging(ctx, ship, camera, viewport) {\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE };\n const layout =\n ship.modelKey === \"cutter\"\n ? {\n lineColor: \"rgba(85, 89, 97, 0.92)\",\n sailColor: \"rgba(218, 232, 244, 0.28)\",\n points: [\n vec3(0, 0.88, -0.32),\n vec3(0, 2.4, -0.28),\n vec3(0.1, 1.92, -0.3),\n vec3(1.18, 1.72, -0.18),\n vec3(1.04, 1.08, -0.12),\n ],\n mastPairs: [[0, 1], [2, 3]],\n sailTriangle: [2, 3, 4],\n }\n : {\n lineColor: \"rgba(73, 54, 45, 0.94)\",\n sailColor: \"rgba(238, 232, 214, 0.88)\",\n points: [\n vec3(0, 0.38, -0.4),\n vec3(0, 3.8, -0.2),\n vec3(-0.25, 0.32, -1.9),\n vec3(-0.15, 2.7, -1.75),\n vec3(0.08, 3.2, -0.2),\n vec3(0.12, 1.2, -0.5),\n vec3(2.25, 2.25, 0.15),\n ],\n mastPairs: [[0, 1], [2, 3]],\n sailTriangle: [4, 5, 6],\n };\n const projected = layout.points\n .map((point) => transformPoint(point, transform))\n .map((point) => projectPoint(point, camera, viewport));\n if (projected.some((value) => value === null)) {\n return;\n }\n\n ctx.strokeStyle = layout.lineColor;\n ctx.lineWidth = ship.modelKey === \"cutter\" ? 2.2 : 3.5;\n ctx.beginPath();\n for (const [from, to] of layout.mastPairs) {\n ctx.moveTo(projected[from].x, projected[from].y);\n ctx.lineTo(projected[to].x, projected[to].y);\n }\n ctx.stroke();\n\n const [a, b, c] = layout.sailTriangle;\n ctx.fillStyle = layout.sailColor;\n ctx.beginPath();\n ctx.moveTo(projected[a].x, projected[a].y);\n ctx.lineTo(projected[b].x, projected[b].y);\n ctx.lineTo(projected[c].x, projected[c].y);\n ctx.closePath();\n ctx.fill();\n}\n\nfunction renderClothAccent(ctx, cloth, camera, viewport) {\n const projected = cloth.positions.map((point) => projectPoint(point, camera, viewport));\n ctx.strokeStyle = \"rgba(255, 241, 226, 0.92)\";\n ctx.lineWidth = 1.7;\n\n for (\n let row = 0;\n row < cloth.grid.rows;\n row += Math.max(1, Math.floor(cloth.grid.rows / 5))\n ) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < cloth.grid.cols; column += 1) {\n const point = projected[row * cloth.grid.cols + column];\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n\n const borderIndices = [\n 0,\n cloth.grid.cols - 1,\n cloth.grid.rows * cloth.grid.cols - 1,\n (cloth.grid.rows - 1) * cloth.grid.cols,\n ];\n ctx.fillStyle = colorToRgba(cloth.color, 0.95);\n for (const index of borderIndices) {\n const point = projected[index];\n if (!point) {\n continue;\n }\n ctx.beginPath();\n ctx.arc(point.x, point.y, 2.8, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderWaterHighlights(ctx, waterBands, camera, viewport) {\n for (const band of waterBands) {\n if (band.band === \"horizon\") {\n continue;\n }\n const interval = band.band === \"near\" ? 2 : 3;\n const alpha = band.band === \"near\" ? 0.22 : 0.14;\n ctx.strokeStyle = `rgba(232, 247, 255, ${alpha})`;\n ctx.lineWidth = band.band === \"near\" ? 1.3 : 0.9;\n for (let row = interval; row < band.rows - 1; row += interval) {\n ctx.beginPath();\n let started = false;\n for (let column = 0; column < band.cols; column += 1) {\n const point = projectPoint(\n band.positions[row * band.cols + column],\n camera,\n viewport\n );\n if (!point) {\n continue;\n }\n if (!started) {\n ctx.moveTo(point.x, point.y);\n started = true;\n } else {\n ctx.lineTo(point.x, point.y);\n }\n }\n if (started) {\n ctx.stroke();\n }\n }\n }\n}\n\nfunction readPhysicsNumber(physics, key, fallback) {\n const value = physics?.[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction getShipMass(ship, shipModel) {\n const baseMass = readPhysicsNumber(shipModel.physics, \"mass\", 3200);\n return baseMass * readVisualNumber(ship.massScale, 1);\n}\n\nfunction getShipHalfExtents(ship, shipModel) {\n const physicsHalfExtents = Array.isArray(shipModel.physics.halfExtents)\n ? shipModel.physics.halfExtents\n : [1.35, 0.95, 3.9];\n const scale = SHIP_SCALE * readVisualNumber(ship.collisionRadiusScale, 1);\n return {\n x: physicsHalfExtents[0] * scale,\n y: physicsHalfExtents[1] * scale,\n z: physicsHalfExtents[2] * scale,\n };\n}\n\nfunction getShipCollisionRadius(ship, shipModel) {\n const halfExtents = getShipHalfExtents(ship, shipModel);\n return Math.max(halfExtents.x * 1.08, halfExtents.z * 0.62);\n}\n\nfunction getShipInverseMass(ship, shipModel) {\n return 1 / Math.max(1, getShipMass(ship, shipModel));\n}\n\nfunction getShipInverseInertia(ship, shipModel) {\n const radius = getShipCollisionRadius(ship, shipModel);\n const inertia = getShipMass(ship, shipModel) * radius * radius * 0.72;\n return 1 / Math.max(1, inertia);\n}\n\nfunction spawnSpray(state, point, intensity) {\n const count = state.fluidDetail.getSnapshot().currentLevel.config.splashCount;\n for (let index = 0; index < count; index += 1) {\n const angle = (index / count) * Math.PI * 2;\n const speed = 0.9 + Math.random() * intensity * 0.45;\n state.sprays.push({\n position: vec3(point.x, point.y, point.z),\n velocity: vec3(Math.cos(angle) * speed * 0.35, 1.1 + Math.random() * 0.8, Math.sin(angle) * speed * 0.25),\n life: 1.2 + Math.random() * 0.4,\n });\n }\n}\n\nfunction resolveShipRoute(ship, state, radius) {\n if (typeof ship.routeDirection !== \"number\") {\n ship.routeDirection = ship.velocity.x >= 0 ? 1 : -1;\n }\n\n if (ship.position.x > HARBOR_BOUNDS.maxX - radius * 1.1) {\n ship.routeDirection = -1;\n } else if (ship.position.x < HARBOR_BOUNDS.minX + radius * 1.1) {\n ship.routeDirection = 1;\n }\n\n const wander = Math.sin(state.time * 0.22 + readVisualNumber(ship.wanderPhase, 0));\n const crossCurrent = Math.cos(state.time * 0.31 + readVisualNumber(ship.wanderPhase, 0));\n const laneCenter =\n ship.id === \"northwind\"\n ? 10.2 + wander * 2.1 + crossCurrent * 0.6\n : 7 + wander * 3.3 - crossCurrent * 1.1;\n const targetX =\n ship.routeDirection > 0\n ? HARBOR_BOUNDS.maxX - radius * 1.7\n : HARBOR_BOUNDS.minX + radius * 1.7;\n return vec3(targetX, 0, clamp(laneCenter, HARBOR_BOUNDS.minZ + 1.8, HARBOR_BOUNDS.maxZ - 1.8));\n}\n\nfunction updateShipMotion(state, ship, dt, shipModel) {\n const physics = shipModel.physics;\n const massScale = Math.max(0.55, readVisualNumber(ship.massScale, 1));\n const radius = getShipCollisionRadius(ship, shipModel);\n const waterline = readPhysicsNumber(physics, \"waterline\", 0.42);\n const linearDamping = readPhysicsNumber(physics, \"linearDamping\", 0.04);\n const angularDamping = readPhysicsNumber(physics, \"angularDamping\", 0.08);\n const throttleResponse = readVisualNumber(ship.throttleResponse, 0.58);\n const rudderResponse = readVisualNumber(ship.rudderResponse, 0.62);\n const cruiseSpeed = readVisualNumber(ship.cruiseSpeed, 2.4);\n\n ship.collisionCooldown = Math.max(0, readVisualNumber(ship.collisionCooldown, 0) - dt);\n\n const forward = directionFromYaw(ship.rotationY);\n const lateral = perpendicularOnWater(forward);\n const routeTarget = resolveShipRoute(ship, state, radius);\n const desiredHeading = Math.atan2(routeTarget.x - ship.position.x, routeTarget.z - ship.position.z);\n const headingError = Math.atan2(\n Math.sin(desiredHeading - ship.rotationY),\n Math.cos(desiredHeading - ship.rotationY)\n );\n ship.angularVelocity +=\n headingError * rudderResponse * dt * (1.18 / Math.sqrt(massScale)) +\n Math.sin(state.time * 0.9 + readVisualNumber(ship.wanderPhase, 0)) * dt * 0.04;\n\n const waveDirection = resolveWaveDirection(state);\n const forwardSpeed = dotVec3(ship.velocity, forward);\n const lateralSpeed = dotVec3(ship.velocity, lateral);\n const thrust = (cruiseSpeed - forwardSpeed) * throttleResponse;\n const currentDrift = sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.016;\n const acceleration = addVec3(\n scaleVec3(forward, thrust),\n addVec3(\n scaleVec3(lateral, -lateralSpeed * (1.28 + rudderResponse * 0.4)),\n scaleVec3(waveDirection, currentDrift / Math.sqrt(massScale))\n )\n );\n\n ship.velocity = addVec3(ship.velocity, scaleVec3(acceleration, dt));\n ship.velocity = scaleVec3(\n ship.velocity,\n Math.max(0, 1 - (linearDamping / Math.pow(massScale, 0.22)) * dt)\n );\n ship.angularVelocity *= Math.max(\n 0,\n 1 - (angularDamping / Math.pow(massScale, 0.15)) * dt\n );\n ship.rotationY += ship.angularVelocity * dt;\n ship.position = addVec3(ship.position, scaleVec3(ship.velocity, dt));\n ship.position.y =\n sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.24 + waterline;\n}\n\nfunction resolveBoundaryCollision(ship, state, shipModel) {\n const restitution = readPhysicsNumber(shipModel.physics, \"restitution\", 0.22) * 0.56;\n const radius = getShipCollisionRadius(ship, shipModel);\n const boundaries = [\n { axis: \"x\", min: HARBOR_BOUNDS.minX + radius, max: HARBOR_BOUNDS.maxX - radius, normalMin: vec3(1, 0, 0), normalMax: vec3(-1, 0, 0) },\n { axis: \"z\", min: HARBOR_BOUNDS.minZ + radius, max: HARBOR_BOUNDS.maxZ - radius, normalMin: vec3(0, 0, 1), normalMax: vec3(0, 0, -1) },\n ];\n\n for (const boundary of boundaries) {\n if (ship.position[boundary.axis] < boundary.min) {\n ship.position[boundary.axis] = boundary.min;\n const normal = boundary.normalMin;\n const speedIntoWall = dotVec3(ship.velocity, normal);\n if (speedIntoWall < 0) {\n ship.velocity = subVec3(\n ship.velocity,\n scaleVec3(normal, (1 + restitution) * speedIntoWall)\n );\n const tangent = vec3(-normal.z, 0, normal.x);\n const tangentSpeed = dotVec3(ship.velocity, tangent);\n ship.velocity = subVec3(ship.velocity, scaleVec3(tangent, tangentSpeed * 0.12));\n ship.angularVelocity += tangentSpeed * 0.004;\n }\n } else if (ship.position[boundary.axis] > boundary.max) {\n ship.position[boundary.axis] = boundary.max;\n const normal = boundary.normalMax;\n const speedIntoWall = dotVec3(ship.velocity, normal);\n if (speedIntoWall < 0) {\n ship.velocity = subVec3(\n ship.velocity,\n scaleVec3(normal, (1 + restitution) * speedIntoWall)\n );\n const tangent = vec3(-normal.z, 0, normal.x);\n const tangentSpeed = dotVec3(ship.velocity, tangent);\n ship.velocity = subVec3(ship.velocity, scaleVec3(tangent, tangentSpeed * 0.12));\n ship.angularVelocity += tangentSpeed * 0.004;\n }\n }\n }\n}\n\nfunction resolveShipCollision(state, a, b, shipModelA, shipModelB) {\n const delta = subVec3(b.position, a.position);\n const radiusA = getShipCollisionRadius(a, shipModelA);\n const radiusB = getShipCollisionRadius(b, shipModelB);\n const distance = Math.hypot(delta.x, delta.z);\n const minDistance = radiusA + radiusB;\n if (distance >= minDistance) {\n return false;\n }\n\n const normal =\n distance > 0.0001\n ? normalizeVec3(vec3(delta.x / distance, 0, delta.z / distance))\n : normalizeVec3(vec3(Math.cos(state.time * 5.2), 0, Math.sin(state.time * 4.8)));\n const tangent = vec3(-normal.z, 0, normal.x);\n const penetration = minDistance - distance;\n const invMassA = getShipInverseMass(a, shipModelA);\n const invMassB = getShipInverseMass(b, shipModelB);\n const invMassSum = invMassA + invMassB;\n const correction = scaleVec3(normal, (penetration / Math.max(0.0001, invMassSum)) * 0.72);\n a.position = subVec3(a.position, scaleVec3(correction, invMassA));\n b.position = addVec3(b.position, scaleVec3(correction, invMassB));\n\n const relativeVelocity = subVec3(b.velocity, a.velocity);\n const velocityAlongNormal = dotVec3(relativeVelocity, normal);\n const restitution =\n ((readPhysicsNumber(shipModelA.physics, \"restitution\", 0.22) +\n readPhysicsNumber(shipModelB.physics, \"restitution\", 0.22)) /\n 2) *\n 0.88;\n if (velocityAlongNormal < 0) {\n const impulseMagnitude =\n (-(1 + restitution) * velocityAlongNormal) / Math.max(0.0001, invMassSum);\n const impulse = scaleVec3(normal, impulseMagnitude);\n a.velocity = subVec3(a.velocity, scaleVec3(impulse, invMassA));\n b.velocity = addVec3(b.velocity, scaleVec3(impulse, invMassB));\n\n const tangentSpeed = dotVec3(relativeVelocity, tangent);\n const frictionMagnitude = clamp(\n (-tangentSpeed / Math.max(0.0001, invMassSum)),\n -impulseMagnitude * 0.16,\n impulseMagnitude * 0.16\n );\n const frictionImpulse = scaleVec3(tangent, frictionMagnitude);\n a.velocity = subVec3(a.velocity, scaleVec3(frictionImpulse, invMassA));\n b.velocity = addVec3(b.velocity, scaleVec3(frictionImpulse, invMassB));\n\n a.angularVelocity -=\n tangentSpeed * radiusA * getShipInverseInertia(a, shipModelA) * 0.2 +\n impulseMagnitude * 0.00024;\n b.angularVelocity +=\n tangentSpeed * radiusB * getShipInverseInertia(b, shipModelB) * 0.2 +\n impulseMagnitude * 0.00024;\n\n const impactSpeed = Math.abs(velocityAlongNormal);\n if (\n impactSpeed > 0.18 &&\n Math.max(readVisualNumber(a.collisionCooldown, 0), readVisualNumber(b.collisionCooldown, 0)) <= 0\n ) {\n const contactPoint = vec3(\n (a.position.x + b.position.x) * 0.5,\n (a.position.y + b.position.y) * 0.5 + 0.14,\n (a.position.z + b.position.z) * 0.5\n );\n spawnSpray(state, contactPoint, impactSpeed * 2.4 + penetration * 8);\n state.waveImpulses.push({\n x: contactPoint.x,\n z: contactPoint.z,\n strength: clamp(0.24 + impactSpeed * 0.46 + penetration * 0.9, 0.2, 1.7),\n radius: 0.9 + penetration * 1.4,\n life: 1,\n });\n state.collisionCount += 1;\n state.collisionFlash = Math.max(\n state.collisionFlash,\n clamp(impactSpeed * 0.55 + penetration * 1.8, 0.16, 1)\n );\n a.collisionCooldown = 0.2;\n b.collisionCooldown = 0.2;\n }\n }\n\n state.contactCount += 1;\n return true;\n}\n\nfunction updateShips(state, dt, shipModel) {\n let collided = false;\n state.contactCount = 0;\n\n for (const ship of state.ships) {\n const activeShipModel = resolveShipModel(state, ship, shipModel);\n updateShipMotion(state, ship, dt, activeShipModel);\n resolveBoundaryCollision(ship, state, activeShipModel);\n }\n\n for (let index = 0; index < state.ships.length; index += 1) {\n for (let otherIndex = index + 1; otherIndex < state.ships.length; otherIndex += 1) {\n const shipA = state.ships[index];\n const shipB = state.ships[otherIndex];\n const shipModelA = resolveShipModel(state, shipA, shipModel);\n const shipModelB = resolveShipModel(state, shipB, shipModel);\n collided =\n resolveShipCollision(state, shipA, shipB, shipModelA, shipModelB) ||\n collided;\n }\n }\n\n state.collisionFlash = collided\n ? Math.max(0.12, state.collisionFlash)\n : Math.max(0, state.collisionFlash - dt * 1.3);\n}\n\nfunction updateWaveImpulses(state, dt) {\n state.waveImpulses = state.waveImpulses\n .map((impulse) => ({\n ...impulse,\n life: impulse.life - dt * 0.55,\n }))\n .filter((impulse) => impulse.life > 0);\n}\n\nfunction updateSpray(state, dt) {\n state.sprays = state.sprays\n .map((particle) => {\n const nextVelocity = vec3(particle.velocity.x, particle.velocity.y - 4.2 * dt, particle.velocity.z);\n const nextPosition = addVec3(particle.position, scaleVec3(nextVelocity, dt));\n return {\n position: nextPosition,\n velocity: nextVelocity,\n life: particle.life - dt,\n };\n })\n .filter((particle) => particle.life > 0 && particle.position.y > -0.2);\n}\n\nfunction recordTelemetry(state, frameTimeMs) {\n const frameId = `showcase-${state.frame}`;\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: state.lightingDetail.getSnapshot(),\n };\n const synthetic = frameTimeMs + state.sprays.length * 0.1 + (state.stress ? 6.5 : 0);\n const decision = state.governor.recordFrame({ frameTimeMs: synthetic });\n const queueDepth = Math.min(32, Math.round(6 + state.sprays.length / 2 + (state.stress ? 10 : 0)));\n const readyLaneDepth = Math.min(\n 16,\n 4 + Math.round(Math.max(0, Math.sin(state.time * 1.7 + 0.8)) * 9)\n );\n state.debugSession.recordQueue({\n owner: \"renderer\",\n queueClass: \"render\",\n depth: queueDepth,\n capacity: 32,\n frameId,\n });\n state.debugSession.recordReadyLane({\n owner: \"lighting\",\n queueClass: \"lighting\",\n laneId: \"critical\",\n priority: 920,\n depth: readyLaneDepth,\n capacity: 16,\n frameId,\n });\n state.debugSession.recordDispatch({\n owner: \"lighting\",\n queueClass: \"lighting\",\n jobType: \"lighting.integration\",\n frameId,\n durationMs: quality.lighting.currentLevel.estimatedCostMs ?? 1.2,\n workgroups: { x: quality.fluid.currentLevel.config.nearResolution, y: 1, z: 1 },\n workgroupSize: { x: 8, y: 8, z: 1 },\n });\n state.debugSession.recordDependencyUnlock({\n owner: \"scene\",\n queueClass: \"render\",\n sourceJobType: \"physics.resolve\",\n unlockedJobType: \"lighting.integration\",\n priority: 920,\n unlockCount: 2 + Math.round(Math.max(0, Math.sin(state.time * 1.1)) * 4),\n frameId,\n });\n state.debugSession.recordPipelinePhase({\n owner: \"scene\",\n pipeline: \"scene-preparation\",\n stage: \"stable-visual-snapshot\",\n frameId,\n durationMs: synthetic * 0.38,\n snapshotAgeMs: Math.max(0, synthetic - 8),\n });\n state.debugSession.recordFrame({\n frameId,\n frameTimeMs: synthetic,\n targetFrameTimeMs: 16.67,\n gpuBusyMs: synthetic * 0.56,\n dropped: synthetic > 18,\n });\n return decision;\n}\n\nfunction renderSprays(ctx, sprays, camera, viewport) {\n for (const spray of sprays) {\n const projected = projectPoint(spray.position, camera, viewport);\n if (!projected) {\n continue;\n }\n const radius = clamp((1 / projected.depth) * 260, 1.5, 7.5);\n ctx.fillStyle = `rgba(225, 243, 250, ${clamp(spray.life / 1.6, 0, 0.9)})`;\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, radius, 0, Math.PI * 2);\n ctx.fill();\n }\n}\n\nfunction renderFlagPole(ctx, camera, viewport) {\n const base = projectPoint(vec3(-3.5, 0.7, 2.4), camera, viewport);\n const top = projectPoint(vec3(-3.5, 6.3, 2.4), camera, viewport);\n if (!base || !top) {\n return;\n }\n ctx.strokeStyle = \"rgba(77, 52, 41, 0.95)\";\n ctx.lineWidth = 6;\n ctx.beginPath();\n ctx.moveTo(base.x, base.y);\n ctx.lineTo(top.x, top.y);\n ctx.stroke();\n}\n\nfunction renderShipShadow(ctx, shipModel, ship, state, camera, viewport, lightDir, shadowStrength) {\n const bounds = shipModel.bounds;\n const keelY = (shipModel.physics.waterline ?? 0.42) - 0.28;\n const transform = { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE };\n const hullCorners = [\n vec3(bounds.min[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.min[2]),\n vec3(bounds.max[0], keelY, bounds.max[2]),\n vec3(bounds.min[0], keelY, bounds.max[2]),\n ].map((point) => transformPoint(point, transform));\n\n renderProjectedShadow(ctx, hullCorners, camera, viewport, lightDir, {\n planeY: sampleWave(state, ship.position.x, ship.position.z, state.time) * 0.24 - 0.03,\n alpha: 0.08 + shadowStrength * 0.2,\n blur: 14 + shadowStrength * 24,\n });\n}\n\nfunction renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength) {\n const clothPoints = [\n cloth.positions[0],\n cloth.positions[cloth.grid.cols - 1],\n cloth.positions[cloth.positions.length - 1],\n cloth.positions[cloth.positions.length - cloth.grid.cols],\n ];\n\n renderProjectedShadow(ctx, clothPoints, camera, viewport, lightDir, {\n planeY: 0.56,\n alpha: 0.05 + shadowStrength * 0.16,\n blur: 12 + shadowStrength * 20,\n });\n}\n\nfunction collectSceneLightSources(state, visuals) {\n const directLights = [];\n const reflectionLights = [];\n const pushLight = (point, glowScale, reflectionStrength, coreColor, glowColor) => {\n directLights.push(\n Object.freeze({\n pass: \"direct-glow\",\n point,\n coreColor,\n glowColor,\n glowScale,\n })\n );\n if (reflectionStrength > 0) {\n reflectionLights.push(\n Object.freeze({\n pass: \"water-reflection\",\n point,\n coreColor,\n glowColor,\n glowScale,\n reflectionStrength,\n })\n );\n }\n };\n\n for (const torch of HARBOR_TORCHES) {\n pushLight(\n vec3(torch.x, torch.y, torch.z),\n torch.glow,\n visuals.lanternReflectionStrength * 0.55,\n visuals.torchCore,\n visuals.torchGlow\n );\n }\n\n for (const ship of state.ships) {\n const lanterns = Array.isArray(ship.lanterns) ? ship.lanterns : SHIP_LANTERNS;\n const strength = readVisualNumber(ship.lanternStrength, 1);\n for (const lantern of lanterns) {\n const point = transformPoint(\n vec3(lantern.x, lantern.y, lantern.z),\n { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE }\n );\n pushLight(\n point,\n lantern.glow * strength,\n visuals.lanternReflectionStrength,\n visuals.lanternCore,\n visuals.lanternGlow\n );\n }\n }\n\n return Object.freeze({\n directLights: Object.freeze(directLights),\n reflectionLights: Object.freeze(reflectionLights),\n });\n}\n\nfunction renderDirectLightGlow(ctx, source, camera, viewport) {\n const projected = projectPoint(source.point, camera, viewport);\n if (!projected) {\n return;\n }\n\n const radius = clamp((1 / projected.depth) * 420 * source.glowScale, 4, 34);\n const halo = ctx.createRadialGradient(projected.x, projected.y, radius * 0.12, projected.x, projected.y, radius);\n halo.addColorStop(0, colorToRgba(source.coreColor, 0.98));\n halo.addColorStop(0.5, colorToRgba(source.glowColor, 0.42));\n halo.addColorStop(1, colorToRgba(source.glowColor, 0));\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = halo;\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, radius, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n ctx.fillStyle = colorToRgba(source.coreColor, 0.98);\n ctx.beginPath();\n ctx.arc(projected.x, projected.y, Math.max(1.2, radius * 0.16), 0, Math.PI * 2);\n ctx.fill();\n}\n\nfunction renderWaterLightReflection(ctx, source, state, camera, viewport) {\n const projected = projectPoint(source.point, camera, viewport);\n if (!projected) {\n return;\n }\n\n const radius = clamp((1 / projected.depth) * 420 * source.glowScale, 4, 34);\n const waterline = sampleWave(state, source.point.x, source.point.z, state.time) * 0.22;\n const reflectedPoint = vec3(\n source.point.x,\n waterline - (source.point.y - waterline) * 0.58,\n source.point.z + 0.08\n );\n const reflected = projectPoint(reflectedPoint, camera, viewport);\n if (!reflected) {\n return;\n }\n\n const reflectionRadius = radius * 0.72;\n const glow = ctx.createRadialGradient(\n reflected.x,\n reflected.y,\n reflectionRadius * 0.1,\n reflected.x,\n reflected.y,\n reflectionRadius\n );\n glow.addColorStop(0, colorToRgba(source.coreColor, source.reflectionStrength * 0.34));\n glow.addColorStop(1, colorToRgba(source.glowColor, 0));\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = glow;\n ctx.beginPath();\n ctx.ellipse(\n reflected.x,\n reflected.y,\n reflectionRadius * 0.34,\n reflectionRadius,\n 0,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n ctx.restore();\n}\n\nfunction renderLighthouseBeam(ctx, state, camera, viewport, visuals) {\n const lighthousePlacement = SHOWCASE_ENVIRONMENT_LAYOUT.find(\n (placement) => placement.assetKey === \"lighthouse\"\n );\n if (!lighthousePlacement || !state.showcaseRealisticModelsEnabled) {\n return;\n }\n\n const source = transformPoint(\n vec3(0, 11.34, 0),\n {\n position: vec3(\n lighthousePlacement.position.x,\n lighthousePlacement.position.y,\n lighthousePlacement.position.z\n ),\n rotationY: lighthousePlacement.rotationY,\n scale: lighthousePlacement.scale,\n }\n );\n const sweep = state.time * 0.22 + 0.8;\n const direction = normalizeVec3(vec3(Math.sin(sweep), -0.07, Math.cos(sweep)));\n const spread = perpendicularOnWater(direction);\n const farCenter = addVec3(source, scaleVec3(direction, 34));\n const left = addVec3(farCenter, scaleVec3(spread, 7.4));\n const right = addVec3(farCenter, scaleVec3(spread, -7.4));\n const projectedSource = projectPoint(source, camera, viewport);\n const projectedLeft = projectPoint(left, camera, viewport);\n const projectedRight = projectPoint(right, camera, viewport);\n if (!projectedSource || !projectedLeft || !projectedRight) {\n return;\n }\n\n const pulse = 0.72 + Math.sin(state.time * 1.7) * 0.08;\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n ctx.fillStyle = colorToRgba(visuals.torchCore, 0.055 * pulse);\n ctx.beginPath();\n ctx.moveTo(projectedSource.x, projectedSource.y);\n ctx.lineTo(projectedLeft.x, projectedLeft.y);\n ctx.lineTo(projectedRight.x, projectedRight.y);\n ctx.closePath();\n ctx.fill();\n\n const beamLength = Math.hypot(\n projectedLeft.x - projectedSource.x,\n projectedLeft.y - projectedSource.y\n );\n const core = ctx.createRadialGradient(\n projectedSource.x,\n projectedSource.y,\n 2,\n projectedSource.x,\n projectedSource.y,\n clamp(beamLength * 0.22, 18, 80)\n );\n core.addColorStop(0, colorToRgba(visuals.torchCore, 0.58));\n core.addColorStop(0.5, colorToRgba(visuals.torchGlow, 0.18));\n core.addColorStop(1, colorToRgba(visuals.torchGlow, 0));\n ctx.fillStyle = core;\n ctx.beginPath();\n ctx.arc(projectedSource.x, projectedSource.y, clamp(beamLength * 0.18, 14, 64), 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n}\n\nfunction renderAtmosphericGrade(ctx, canvas, state, visuals) {\n const vignette = ctx.createRadialGradient(\n canvas.width * 0.5,\n canvas.height * 0.48,\n canvas.width * 0.2,\n canvas.width * 0.5,\n canvas.height * 0.5,\n canvas.width * 0.72\n );\n vignette.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n vignette.addColorStop(0.68, \"rgba(0, 0, 0, 0.08)\");\n vignette.addColorStop(1, \"rgba(0, 0, 0, 0.32)\");\n ctx.fillStyle = vignette;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n const seaHaze = ctx.createLinearGradient(0, canvas.height * 0.34, 0, canvas.height);\n seaHaze.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n seaHaze.addColorStop(0.5, visuals.ambientMist);\n seaHaze.addColorStop(1, \"rgba(3, 8, 16, 0.18)\");\n ctx.fillStyle = seaHaze;\n ctx.fillRect(0, canvas.height * 0.34, canvas.width, canvas.height * 0.66);\n\n if (state.captureMode) {\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n for (let index = 0; index < 70; index += 1) {\n const x = pseudoRandom(index * 19 + 3) * canvas.width;\n const y = pseudoRandom(index * 23 + 7) * canvas.height;\n const alpha = 0.008 + pseudoRandom(index * 31 + 11) * 0.012;\n ctx.fillStyle = `rgba(255, 255, 255, ${alpha})`;\n ctx.fillRect(x, y, 1.1, 1.1);\n }\n ctx.restore();\n }\n}\n\nfunction renderWaterMotionEffects(ctx, effects, camera, viewport) {\n ctx.save();\n ctx.globalCompositeOperation = \"screen\";\n\n for (const wake of effects.wakeTrails) {\n const projected = wake.points\n .map((point) => ({\n projected: projectPoint(point.center, camera, viewport),\n width: point.width,\n }))\n .filter((entry) => entry.projected);\n if (projected.length < 2) {\n continue;\n }\n\n const averageDepth =\n projected.reduce((total, entry) => total + entry.projected.depth, 0) / projected.length;\n const averageWidth =\n projected.reduce((total, entry) => total + entry.width, 0) / projected.length;\n const baseWidth = clamp((averageWidth / Math.max(0.25, averageDepth)) * 180, 1.6, 5.4);\n ctx.strokeStyle = `rgba(146, 194, 236, ${wake.opacity * 0.52})`;\n ctx.lineWidth = baseWidth * 1.9;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n ctx.moveTo(projected[0].projected.x, projected[0].projected.y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].projected.x, projected[index].projected.y);\n }\n ctx.stroke();\n\n ctx.strokeStyle = `rgba(234, 247, 255, ${wake.opacity})`;\n ctx.lineWidth = baseWidth;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n ctx.beginPath();\n ctx.moveTo(projected[0].projected.x, projected[0].projected.y);\n for (let index = 1; index < projected.length; index += 1) {\n ctx.lineTo(projected[index].projected.x, projected[index].projected.y);\n }\n ctx.stroke();\n\n for (const entry of projected.slice(1, 5)) {\n ctx.fillStyle = `rgba(239, 248, 255, ${wake.opacity * 0.76})`;\n ctx.beginPath();\n ctx.ellipse(\n entry.projected.x,\n entry.projected.y,\n baseWidth * 0.72,\n baseWidth * 0.44,\n 0,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n }\n }\n\n for (const ring of effects.rippleRings) {\n const center = projectPoint(ring.center, camera, viewport);\n const xAxis = projectPoint(addVec3(ring.center, vec3(ring.radius, 0, 0)), camera, viewport);\n const zAxis = projectPoint(addVec3(ring.center, vec3(0, 0, ring.radius)), camera, viewport);\n if (!center || !xAxis || !zAxis) {\n continue;\n }\n\n const radiusX = Math.hypot(xAxis.x - center.x, xAxis.y - center.y);\n const radiusY = Math.hypot(zAxis.x - center.x, zAxis.y - center.y);\n ctx.strokeStyle = `rgba(216, 235, 255, ${ring.opacity})`;\n ctx.lineWidth = clamp((radiusX + radiusY) * 0.02, 1, 3.1);\n ctx.beginPath();\n ctx.ellipse(center.x, center.y, radiusX, radiusY, 0, 0, Math.PI * 2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\nfunction renderScene(\n ctx,\n canvas,\n state,\n shipModel,\n dom,\n lightingFeatures,\n fluidFeatures,\n clothFeatures\n) {\n const viewport = { width: canvas.width, height: canvas.height };\n const camera = buildCamera(state, canvas);\n state.camera.eye = camera.eye;\n const lightingPlan = lightingFeatures.createBandPlan({\n profile:\n state.focus === \"lighting\"\n ? lightingFeatures.defaultProfile\n : lightingFeatures.getProfile(lightingFeatures.defaultProfile).name,\n importance: state.focus === \"lighting\" ? \"critical\" : \"high\",\n });\n const nearLighting = lightingPlan.bands.find((entry) => entry.band === \"near\") ?? lightingPlan.bands[0];\n const lightDir = normalizeVec3(vec3(-0.22, 0.94, -0.31));\n const lightingSnapshot = state.lightingDetail.getSnapshot();\n const visuals = resolveVisualConfig(\n nearLighting,\n lightingSnapshot,\n state.demoDescription?.visuals\n );\n state.demoVisuals = visuals;\n const reflectionStrength = visuals.reflectionStrength;\n const shadowStrength = visuals.shadowAccent;\n drawSkyAndShore(\n ctx,\n canvas,\n state,\n nearLighting,\n reflectionStrength,\n shadowStrength,\n visuals\n );\n\n const waterTriangles = [];\n const sceneTriangles = [];\n const water = buildWaterBands(\n state,\n state.fluidDetail.getSnapshot().currentLevel.config,\n visuals,\n fluidFeatures\n );\n for (const bandMesh of water.bandMeshes) {\n const bandAccent = bandMesh.band === \"near\" ? 0.06 : bandMesh.band === \"mid\" ? 0.04 : 0;\n for (let index = 0; index < bandMesh.indices.length; index += 3) {\n const a = bandMesh.positions[bandMesh.indices[index]];\n const b = bandMesh.positions[bandMesh.indices[index + 1]];\n const c = bandMesh.positions[bandMesh.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n waterTriangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: bandMesh.color,\n accent: bandAccent,\n material: {\n name: \"water-surface\",\n color: bandMesh.color,\n roughness: 0.2,\n metallic: 0,\n emissive: { r: 0, g: 0, b: 0 },\n },\n reflection: 1,\n surfaceType: \"water\",\n });\n }\n }\n\n const waterMotionEffects = buildWaterMotionEffects(state);\n const lightSources = collectSceneLightSources(state, visuals);\n\n pushHarborGeometry(camera, viewport, sceneTriangles, state);\n const cloth = buildClothSurface(\n state,\n state,\n state.clothDetail.getSnapshot().currentLevel.config,\n visuals,\n clothFeatures\n );\n for (let index = 0; index < cloth.indices.length; index += 3) {\n const a = cloth.positions[cloth.indices[index]];\n const b = cloth.positions[cloth.indices[index + 1]];\n const c = cloth.positions[cloth.indices[index + 2]];\n const normal = normalizeVec3(crossVec3(subVec3(b, a), subVec3(c, a)));\n const projected = [projectPoint(a, camera, viewport), projectPoint(b, camera, viewport), projectPoint(c, camera, viewport)];\n if (projected.some((value) => value === null)) {\n continue;\n }\n sceneTriangles.push({\n points: projected,\n depth: (projected[0].depth + projected[1].depth + projected[2].depth) / 3,\n worldCenter: scaleVec3(addVec3(addVec3(a, b), c), 1 / 3),\n normal,\n baseColor: cloth.color,\n accent: cloth.band === \"near\" ? 0.1 : 0.04,\n material: {\n name: \"flag-cloth\",\n color: cloth.color,\n roughness: 0.94,\n metallic: 0,\n emissive: { r: 0, g: 0, b: 0 },\n },\n reflection: 0,\n surfaceType: \"cloth\",\n });\n }\n\n for (const ship of state.ships) {\n const activeShipModel = resolveShipModel(state, ship, shipModel);\n buildTrianglesFromMesh(\n activeShipModel,\n { position: ship.position, rotationY: ship.rotationY, scale: SHIP_SCALE },\n ship.tint,\n camera,\n viewport,\n sceneTriangles,\n {\n accent: nearLighting.rtParticipation.directShadows === \"premium\" ? 0.08 : 0.02,\n reflection: 0,\n surfaceType: \"ship\",\n }\n );\n }\n\n drawTriangles(ctx, waterTriangles, lightDir, reflectionStrength, camera, shadowStrength);\n for (const ship of state.ships) {\n renderShipShadow(\n ctx,\n resolveShipModel(state, ship, shipModel),\n ship,\n state,\n camera,\n viewport,\n lightDir,\n shadowStrength\n );\n }\n renderFlagShadow(ctx, cloth, camera, viewport, lightDir, shadowStrength);\n for (const source of lightSources.reflectionLights) {\n renderWaterLightReflection(ctx, source, state, camera, viewport);\n }\n renderWaterMotionEffects(ctx, waterMotionEffects, camera, viewport);\n renderWaterHighlights(ctx, water.bandMeshes, camera, viewport);\n drawTriangles(\n ctx,\n sceneTriangles,\n lightDir,\n reflectionStrength,\n camera,\n shadowStrength,\n lightSources.directLights\n );\n renderFlagPole(ctx, camera, viewport);\n renderClothAccent(ctx, cloth, camera, viewport);\n renderLighthouseBeam(ctx, state, camera, viewport, visuals);\n for (const source of lightSources.directLights) {\n renderDirectLightGlow(ctx, source, camera, viewport);\n }\n for (const ship of state.ships) {\n renderShipRigging(ctx, ship, camera, viewport);\n }\n renderSprays(ctx, state.sprays, camera, viewport);\n renderAtmosphericGrade(ctx, canvas, state, visuals);\n\n const debugSnapshot = state.debugSession.getSnapshot();\n const quality = {\n fluid: state.fluidDetail.getSnapshot(),\n cloth: state.clothDetail.getSnapshot(),\n lighting: lightingSnapshot,\n };\n\n const sceneMetrics = [\n `focus: ${state.focus}`,\n `ships: ${state.ships.length} active GLTF hulls across ${new Set(state.ships.map((ship) => ship.modelKey)).size} model families`,\n `moonlight: cold overhead key + ${HARBOR_TORCHES.length + state.ships.reduce((total, ship) => total + (Array.isArray(ship.lanterns) ? ship.lanterns.length : 0), 0)} warm deck and harbor lights`,\n `physics snapshot: ${state.physics.snapshot.stage} (${state.physics.snapshot.stability})`,\n `physics contacts: ${state.contactCount}`,\n `mass split: ${state.ships.map((ship) => `${ship.id} ${(getShipMass(ship, resolveShipModel(state, ship, shipModel)) / 1000).toFixed(1)}t`).join(\" · \")}`,\n `cloth band: ${cloth.band} -> ${cloth.representation.output}`,\n `fluid near band: ${water.bandMeshes[0].representation.output}`,\n `lighting profile: ${lightingPlan.profile} (${lightingFeatures.distanceBands.length} bands)`,\n ];\n const qualityMetrics = [\n `fluid detail: ${quality.fluid.currentLevel.id} (${quality.fluid.currentLevel.config.nearResolution} near cells)`,\n `cloth detail: ${quality.cloth.currentLevel.id} (${quality.cloth.currentLevel.config.cols}x${quality.cloth.currentLevel.config.rows})`,\n `lighting detail: ${quality.lighting.currentLevel.id}`,\n `near shadows: ${nearLighting.primaryShadowSource}`,\n `near reflections: ${nearLighting.rtParticipation.reflections}`,\n `governor pressure: ${state.lastDecision.pressureLevel}`,\n `frame avg: ${state.lastDecision.metrics.averageFrameTimeMs.toFixed(2)} ms`,\n ];\n const debugMetrics = [\n `queue samples: ${debugSnapshot.queues.sampleCount}`,\n `dispatch avg: ${(debugSnapshot.dispatch.averageDurationMs ?? 0).toFixed(2)} ms`,\n `ready lane peak: ${debugSnapshot.dag.peakReadyLaneDepth.toFixed(1)}`,\n `pipeline samples: ${debugSnapshot.pipeline.sampleCount}`,\n `tracked memory: ${(debugSnapshot.memory.totalTrackedBytes / (1024 * 1024)).toFixed(1)} MB`,\n ];\n const sceneNotes =\n state.focus === \"physics\"\n ? PHYSICS_SCENE_NOTE_KEYS.map((key) => state.translate(key))\n : SCENE_NOTE_KEYS.map((key) => state.translate(key));\n const custom = state.demoDescription ?? null;\n\n setListContent(\n dom.sceneMetrics,\n Array.isArray(custom?.sceneMetrics) ? custom.sceneMetrics : sceneMetrics\n );\n setListContent(\n dom.qualityMetrics,\n Array.isArray(custom?.qualityMetrics) ? custom.qualityMetrics : qualityMetrics\n );\n setListContent(\n dom.debugMetrics,\n Array.isArray(custom?.debugMetrics) ? custom.debugMetrics : debugMetrics\n );\n setListContent(dom.sceneNotes, Array.isArray(custom?.notes) ? custom.notes : sceneNotes);\n\n dom.status.textContent =\n typeof custom?.status === \"string\"\n ? custom.status\n : state.translate(gpuSharedTranslationKeys.statusLive, {\n fps: state.lastDecision.metrics.fps.toFixed(1),\n });\n dom.details.textContent =\n typeof custom?.details === \"string\"\n ? custom.details\n : state.focus === \"physics\"\n ? state.translate(gpuSharedTranslationKeys.detailsPhysics, {\n snapshotStageId: state.physics.plan.snapshotStageId,\n })\n : state.showcaseRealisticModelsEnabled\n ? state.translate(gpuSharedTranslationKeys.detailsRealistic, {\n pressureLevel: state.lastDecision.pressureLevel,\n })\n : state.translate(gpuSharedTranslationKeys.detailsLegacy, {\n pressureLevel: state.lastDecision.pressureLevel,\n });\n}\n\nfunction updateSceneState(state, dt, shipModel, featureAdapters) {\n updateShips(state, dt, shipModel);\n updateWaveImpulses(state, dt);\n updateSpray(state, dt);\n const clothPresentation = resolveClothPresentation(\n state,\n state.clothDetail.getSnapshot().currentLevel.config,\n featureAdapters.cloth\n );\n const clothState = ensureShowcaseClothState(\n state,\n state.clothDetail.getSnapshot().currentLevel.config,\n clothPresentation\n );\n advanceShowcaseClothSimulationState(clothState, {\n dt,\n time: state.time,\n flagMotion: readVisualNumber(state.demoVisuals?.flagMotion, 0.92),\n waveInfluence: sampleWave(state, FLAG_LAYOUT.origin.x + FLAG_LAYOUT.width * 0.55, FLAG_LAYOUT.origin.z + FLAG_LAYOUT.width * 0.48, state.time),\n });\n updatePhysicsSnapshot(state, shipModel, featureAdapters.physics);\n}\n\nfunction syncTextState(state, shipModel, featureAdapters) {\n const snapshot = {\n coordinateSystem: \"right-handed world; +x right, +y up, +z forward from the shore\",\n focus: state.focus,\n stress: state.stress,\n ships: state.ships.map((ship) => ({\n id: ship.id,\n modelKey: ship.modelKey ?? \"brigantine\",\n x: Number(ship.position.x.toFixed(2)),\n y: Number(ship.position.y.toFixed(2)),\n z: Number(ship.position.z.toFixed(2)),\n vx: Number(ship.velocity.x.toFixed(2)),\n vz: Number(ship.velocity.z.toFixed(2)),\n massKg: Math.round(getShipMass(ship, resolveShipModel(state, ship, shipModel))),\n lanterns: Array.isArray(ship.lanterns) ? ship.lanterns.length : 0,\n })),\n shipPhysics: Object.fromEntries(\n state.ships.map((ship) => [ship.id, resolveShipModel(state, ship, shipModel)?.physics ?? null])\n ),\n sprays: state.sprays.length,\n waveImpulses: state.waveImpulses.length,\n pressure: state.lastDecision?.pressureLevel ?? \"stable\",\n physics: {\n profile: state.physics.profile,\n snapshotStageId: state.physics.plan.snapshotStageId,\n workerJobCount: state.physics.manifest.jobs.length,\n snapshot: state.physics.snapshot,\n },\n package: state.demoDescription?.textState ?? null,\n };\n window.render_game_to_text = () => JSON.stringify(snapshot);\n window.advanceTime = (ms) => {\n const step = Math.max(1, Math.round(ms / (1000 / 60)));\n for (let index = 0; index < step; index += 1) {\n state.frame += 1;\n state.time += 1 / 60;\n updateSceneState(state, 1 / 60, shipModel, featureAdapters);\n state.lastDecision = recordTelemetry(state, 16.67 + (state.stress ? 6.5 : 0));\n }\n };\n}\n\nexport async function mountGpuShowcase(options = {}, featureFlags = null) {\n const featureAdapters = await resolveShowcaseFeatureAdapters(options);\n injectStyles();\n const root = options.root ?? document.body;\n root.classList?.add?.(ROOT_CLASS);\n const captureSettings = resolveCaptureSettings(options);\n if (captureSettings.captureMode) {\n root.classList?.add?.(CAPTURE_CLASS);\n }\n const previousMarkup = root.innerHTML;\n const previousRenderGameToText = window.render_game_to_text;\n const previousAdvanceTime = window.advanceTime;\n const focus = options.focus ?? new URLSearchParams(window.location.search).get(\"focus\") ?? \"integrated\";\n const translate = createGpuSharedTranslator(options.translate);\n const dom = buildDemoDom(root, {\n packageName: options.packageName ?? \"@plasius/gpu-demo-viewer\",\n title: options.title ?? translate(gpuSharedTranslationKeys.showcaseTitle),\n subtitle: options.subtitle ?? translate(gpuSharedTranslationKeys.showcaseSubtitle),\n translate,\n });\n dom.focusMode.value = focus;\n const state = createSceneState(\n {\n focus,\n translate,\n realisticModelsEnabled: isFeatureEnabled(featureFlags, GPU_SHOWCASE_REALISTIC_MODELS_FEATURE, true),\n captureMode: captureSettings.captureMode,\n renderScale: captureSettings.renderScale,\n },\n featureAdapters\n );\n const assetCatalog = await (state.showcaseRealisticModelsEnabled\n ? loadShowcaseAssetCatalog()\n : createLegacyShowcaseAssetCatalog());\n const shipModel = assetCatalog.ships[assetCatalog.primaryShipKey];\n\n state.assetCatalog = assetCatalog;\n state.shipModel = shipModel;\n state.packageState =\n typeof options.createState === \"function\" ? options.createState() : undefined;\n updatePhysicsSnapshot(state, shipModel, featureAdapters.physics);\n state.lastDecision = recordTelemetry(state, 16.4);\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n syncTextState(state, shipModel, featureAdapters);\n\n const ctx = dom.canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"2D canvas context is required for the shared showcase.\");\n }\n ctx.imageSmoothingEnabled = true;\n ctx.imageSmoothingQuality = \"high\";\n let animationFrameId = 0;\n let destroyed = false;\n const renderFrame = (nowMs) => {\n if (destroyed) {\n return;\n }\n if (!state.paused) {\n if (state.lastTimeMs == null) {\n state.lastTimeMs = nowMs;\n }\n const dt = Math.min(0.033, (nowMs - state.lastTimeMs) / 1000);\n state.lastTimeMs = nowMs;\n state.time += dt;\n state.frame += 1;\n updateSceneState(state, dt, shipModel, featureAdapters);\n updatePackageState(state, options, shipModel, dt);\n const syntheticFrame = 14.2 + state.sprays.length * 0.1 + (state.stress ? 6.4 : 0);\n state.lastDecision = recordTelemetry(state, syntheticFrame);\n }\n\n state.demoDescription = resolveSceneDescription(state, options, shipModel).description;\n resizeCanvasToDisplaySize(dom.canvas, state);\n renderScene(\n ctx,\n dom.canvas,\n state,\n shipModel,\n dom,\n featureAdapters.lighting,\n featureAdapters.fluid,\n featureAdapters.cloth\n );\n syncTextState(state, shipModel, featureAdapters);\n animationFrameId = requestAnimationFrame(renderFrame);\n };\n\n const handlePauseClick = () => {\n state.paused = !state.paused;\n dom.pauseButton.textContent = state.paused\n ? state.translate(gpuSharedTranslationKeys.resume)\n : state.translate(gpuSharedTranslationKeys.pause);\n };\n const handleStressChange = () => {\n state.stress = dom.stressToggle.checked;\n };\n const handleFocusChange = () => {\n state.focus = dom.focusMode.value;\n Object.assign(state.camera, {\n ...CAMERA_PRESETS[state.focus],\n target: vec3(...CAMERA_PRESETS[state.focus].target),\n });\n };\n\n dom.pauseButton.addEventListener(\"click\", handlePauseClick);\n dom.stressToggle.addEventListener(\"change\", handleStressChange);\n dom.focusMode.addEventListener(\"change\", handleFocusChange);\n\n animationFrameId = requestAnimationFrame(renderFrame);\n const destroy = () => {\n if (destroyed) {\n return;\n }\n destroyed = true;\n if (animationFrameId) {\n cancelAnimationFrame(animationFrameId);\n }\n dom.pauseButton.removeEventListener(\"click\", handlePauseClick);\n dom.stressToggle.removeEventListener(\"change\", handleStressChange);\n dom.focusMode.removeEventListener(\"change\", handleFocusChange);\n try {\n if (typeof options.destroyState === \"function\") {\n options.destroyState(state.packageState);\n }\n } finally {\n state.packageState = undefined;\n }\n root.classList?.remove?.(ROOT_CLASS);\n root.classList?.remove?.(CAPTURE_CLASS);\n root.innerHTML = previousMarkup;\n if (typeof previousRenderGameToText === \"function\") {\n window.render_game_to_text = previousRenderGameToText;\n } else {\n delete window.render_game_to_text;\n }\n if (typeof previousAdvanceTime === \"function\") {\n window.advanceTime = previousAdvanceTime;\n } else {\n delete window.advanceTime;\n }\n };\n return {\n state,\n shipModel,\n canvas: dom.canvas,\n destroy,\n };\n}\n\nfunction updatePhysicsSnapshot(state, shipModel, physicsFeatures) {\n const createPhysicsWorldSnapshot = assertRequiredFunction(\n physicsFeatures,\n \"physics\",\n \"createWorldSnapshot\"\n );\n const rigidBodyShapes = Object.fromEntries(\n state.ships.map((ship) => [\n ship.id,\n resolveShipModel(state, ship, shipModel)?.physics?.shape ?? \"box\",\n ])\n );\n\n state.physics.snapshot = createPhysicsWorldSnapshot({\n frameId: `showcase-${state.frame}`,\n tick: state.frame,\n simulationTimeMs: Number((state.time * 1000).toFixed(2)),\n profile: state.physics.profile,\n authoritativeTransformRevision: state.frame,\n secondarySimulationRevision: state.frame,\n animationInputRevision: state.frame,\n bodyCount: state.ships.length + 2,\n dynamicBodyCount: state.ships.length,\n contactCount: state.contactCount,\n metadata: {\n collisionCount: state.collisionCount,\n contactCount: state.contactCount,\n snapshotStageId: state.physics.plan.snapshotStageId,\n rigidBodyShape: shipModel.physics.shape ?? \"box\",\n rigidBodyShapes,\n },\n });\n}\n\nexport {\n advanceShowcaseClothSimulationState as __testOnlyAdvanceShowcaseClothSimulationState,\n buildWaterBands as __testOnlyBuildWaterBands,\n buildWaterMotionEffects as __testOnlyBuildWaterMotionEffects,\n collectSceneLightSources as __testOnlyCollectSceneLightSources,\n createShowcaseClothSimulationState as __testOnlyCreateShowcaseClothSimulationState,\n};\n","export { resolveShowcaseAssetUrl } from \"./asset-url.js\";\nexport {\n createGpuSharedTranslator,\n gpuSharedTranslationKeys,\n gpuSharedTranslations,\n translateGpuSharedText,\n} from \"./i18n.js\";\nexport { gpuSharedEnGbTranslations } from \"./translations/en-GB.js\";\nexport {\n GPU_SHOWCASE_PRODUCT_STUDIO_FEATURE,\n GPU_SHOWCASE_REALISTIC_MODELS_FEATURE,\n} from \"./feature-flags.js\";\nexport {\n createProductStudioMeshes,\n mountGpuProductStudio,\n} from \"./product-studio-runtime.js\";\n\nexport const showcaseFocusModes = Object.freeze([\n \"integrated\",\n \"lighting\",\n \"cloth\",\n \"fluid\",\n \"physics\",\n \"performance\",\n \"debug\",\n]);\nexport const showcaseDemoModes = Object.freeze([\"harbor\", \"product-studio\"]);\n\nexport async function loadGltfModel(url) {\n const module = await import(\"./gltf-loader.js\");\n return module.loadGltfModel(url);\n}\n\nexport async function mountGpuShowcase(options = {}) {\n const demoMode = options.demoMode ?? options.mode;\n if (\n demoMode === \"product-studio\" ||\n demoMode === \"product\" ||\n demoMode === \"studio\" ||\n demoMode === \"eames\"\n ) {\n const productRuntimeLoader =\n typeof options.__productRuntimeLoader === \"function\"\n ? options.__productRuntimeLoader\n : () => import(\"./product-studio-runtime.js\");\n const productModule = await productRuntimeLoader();\n if (typeof productModule.mountGpuProductStudio !== \"function\") {\n throw new Error(\"product runtime loader must provide mountGpuProductStudio.\");\n }\n\n const productOptions = { ...options, demoMode };\n delete productOptions.__runtimeLoader;\n delete productOptions.__productRuntimeLoader;\n delete productOptions.__featureFlags;\n return productModule.mountGpuProductStudio(productOptions, options.__featureFlags);\n }\n\n const runtimeLoader =\n typeof options.__runtimeLoader === \"function\"\n ? options.__runtimeLoader\n : () => import(\"./showcase-runtime.js\");\n const module = await runtimeLoader();\n if (typeof module.mountGpuShowcase !== \"function\") {\n throw new Error(\"showcase runtime loader must provide mountGpuShowcase.\");\n }\n\n const publicOptions = { ...options };\n delete publicOptions.__runtimeLoader;\n delete publicOptions.__productRuntimeLoader;\n delete publicOptions.__featureFlags;\n return module.mountGpuShowcase(publicOptions, options.__featureFlags);\n}\n"],"mappings":"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","names":["document","module","clamp","module","STYLE_ID","transformPoint","loadGltfModel","mountGpuShowcase","showcaseFocusModes","module"]}
|