@skenora/sdk 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +167 -0
  2. package/dist/editor.d.ts +14 -0
  3. package/dist/editor.d.ts.map +1 -0
  4. package/dist/editor.js +14 -0
  5. package/dist/editor.js.map +1 -0
  6. package/dist/index.d.ts +3 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +3 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lightbox.d.ts +3 -0
  11. package/dist/lightbox.d.ts.map +1 -0
  12. package/dist/lightbox.js +2 -0
  13. package/dist/lightbox.js.map +1 -0
  14. package/dist/playback-config.d.ts +27 -0
  15. package/dist/playback-config.d.ts.map +1 -0
  16. package/dist/playback-config.js +87 -0
  17. package/dist/playback-config.js.map +1 -0
  18. package/dist/renderer-diagnostics.d.ts +4 -0
  19. package/dist/renderer-diagnostics.d.ts.map +1 -0
  20. package/dist/renderer-diagnostics.js +85 -0
  21. package/dist/renderer-diagnostics.js.map +1 -0
  22. package/dist/renderer.d.ts +10 -0
  23. package/dist/renderer.d.ts.map +1 -0
  24. package/dist/renderer.js +8 -0
  25. package/dist/renderer.js.map +1 -0
  26. package/dist/scene-config.d.ts +58 -0
  27. package/dist/scene-config.d.ts.map +1 -0
  28. package/dist/scene-config.js +223 -0
  29. package/dist/scene-config.js.map +1 -0
  30. package/dist/scene-plan/apply-patch.d.ts +5 -0
  31. package/dist/scene-plan/apply-patch.d.ts.map +1 -0
  32. package/dist/scene-plan/apply-patch.js +174 -0
  33. package/dist/scene-plan/apply-patch.js.map +1 -0
  34. package/dist/scene-plan/executor.d.ts +26 -0
  35. package/dist/scene-plan/executor.d.ts.map +1 -0
  36. package/dist/scene-plan/executor.js +928 -0
  37. package/dist/scene-plan/executor.js.map +1 -0
  38. package/dist/scene-plan/gateway.d.ts +15 -0
  39. package/dist/scene-plan/gateway.d.ts.map +1 -0
  40. package/dist/scene-plan/gateway.js +104 -0
  41. package/dist/scene-plan/gateway.js.map +1 -0
  42. package/dist/scene-plan/index.d.ts +4 -0
  43. package/dist/scene-plan/index.d.ts.map +1 -0
  44. package/dist/scene-plan/index.js +4 -0
  45. package/dist/scene-plan/index.js.map +1 -0
  46. package/dist/scene-plan/types.d.ts +181 -0
  47. package/dist/scene-plan/types.d.ts.map +1 -0
  48. package/dist/scene-plan/types.js +2 -0
  49. package/dist/scene-plan/types.js.map +1 -0
  50. package/dist/skenora-renderer.d.ts +117 -0
  51. package/dist/skenora-renderer.d.ts.map +1 -0
  52. package/dist/skenora-renderer.js +464 -0
  53. package/dist/skenora-renderer.js.map +1 -0
  54. package/dist/skenora-scene.d.ts +263 -0
  55. package/dist/skenora-scene.d.ts.map +1 -0
  56. package/dist/skenora-scene.js +832 -0
  57. package/dist/skenora-scene.js.map +1 -0
  58. package/package.json +55 -0
@@ -0,0 +1,223 @@
1
+ import { assertSceneDocument, createEmptySceneDocument, normalizeSceneDocument, parseSceneDocument, serializeSceneDocument, } from "@skenora/contracts";
2
+ export const SCENE_CONFIG_SECTION_FILES = Object.freeze({
3
+ assets: "assets.json",
4
+ entities: "entities.json",
5
+ materials: "materials.json",
6
+ environment: "environment.json",
7
+ lighting: "lighting.json",
8
+ camera: "camera.json",
9
+ effects: "effects.json",
10
+ flows: "flows.json",
11
+ extensions: "extensions.json",
12
+ });
13
+ export function getSceneConfig(document, section) {
14
+ const config = sectionConfig(document, section);
15
+ return structuredClone(config);
16
+ }
17
+ export function applySceneConfig(document, section, config) {
18
+ const next = structuredClone(document);
19
+ switch (section) {
20
+ case "assets":
21
+ next.assets = structuredClone(config.assets);
22
+ break;
23
+ case "entities": {
24
+ const value = config;
25
+ next.entities = structuredClone(value.entities);
26
+ next.rootEntityIds = structuredClone(value.rootEntityIds);
27
+ break;
28
+ }
29
+ case "materials": {
30
+ const value = config;
31
+ next.materials = structuredClone(value.materials);
32
+ next.materialBindings = structuredClone(value.materialBindings);
33
+ next.textureAnimations = structuredClone(value.textureAnimations);
34
+ break;
35
+ }
36
+ case "environment": {
37
+ const value = config;
38
+ next.environment = structuredClone(value.environment);
39
+ next.ground = structuredClone(value.ground);
40
+ next.fog = structuredClone(value.fog);
41
+ next.weather = structuredClone(value.weather);
42
+ break;
43
+ }
44
+ case "lighting":
45
+ next.lights = structuredClone(config.lights);
46
+ break;
47
+ case "camera": {
48
+ const value = config;
49
+ next.camera = structuredClone(value.camera);
50
+ next.cameraPaths = structuredClone(value.cameraPaths);
51
+ break;
52
+ }
53
+ case "effects":
54
+ next.postProcess = structuredClone(config.postProcess);
55
+ break;
56
+ case "flows": {
57
+ const value = config;
58
+ next.flows = structuredClone(value.flows);
59
+ next.variables = structuredClone(value.variables);
60
+ break;
61
+ }
62
+ case "extensions":
63
+ next.extensions = structuredClone(config.extensions);
64
+ break;
65
+ }
66
+ const normalized = normalizeSceneDocument(next);
67
+ assertSceneDocument(normalized);
68
+ return normalized;
69
+ }
70
+ export function serializeSceneConfig(document, section, options = {}) {
71
+ const value = {
72
+ schema: "skenora.scene.section",
73
+ version: 1,
74
+ section,
75
+ data: getSceneConfig(document, section),
76
+ };
77
+ return serializeJson(value, options.space);
78
+ }
79
+ export function parseSceneConfig(json, expectedSection) {
80
+ const value = JSON.parse(json);
81
+ if (!isRecord(value) ||
82
+ value.schema !== "skenora.scene.section" ||
83
+ value.version !== 1 ||
84
+ value.section !== expectedSection ||
85
+ !isRecord(value.data)) {
86
+ throw new Error(`Invalid Skenora scene section: ${expectedSection}`);
87
+ }
88
+ return structuredClone(value.data);
89
+ }
90
+ export function exportSceneJsonBundle(document, options = {}) {
91
+ assertSceneDocument(document);
92
+ const files = Object.fromEntries(Object.entries(SCENE_CONFIG_SECTION_FILES).map(([section, path]) => [
93
+ path,
94
+ serializeSceneConfig(document, section, options),
95
+ ]));
96
+ const manifest = {
97
+ schema: "skenora.scene.bundle",
98
+ version: 1,
99
+ scene: {
100
+ schema: document.schema,
101
+ version: document.version,
102
+ id: document.id,
103
+ name: document.name,
104
+ },
105
+ files: { ...SCENE_CONFIG_SECTION_FILES },
106
+ };
107
+ return {
108
+ manifest: serializeJson(manifest, options.space),
109
+ files: Object.freeze(files),
110
+ };
111
+ }
112
+ export function parseSceneJsonBundle(bundle) {
113
+ const manifestValue = JSON.parse(bundle.manifest);
114
+ const manifest = assertManifest(manifestValue);
115
+ const base = createEmptySceneDocument(manifest.scene.id, manifest.scene.name);
116
+ const configs = {};
117
+ for (const section of Object.keys(SCENE_CONFIG_SECTION_FILES)) {
118
+ const path = manifest.files[section];
119
+ const json = bundle.files[path];
120
+ if (json === undefined) {
121
+ throw new Error(`Scene bundle file is missing: ${path}`);
122
+ }
123
+ configs[section] = parseSceneConfig(json, section);
124
+ }
125
+ const document = {
126
+ ...base,
127
+ ...configs.assets,
128
+ ...configs.entities,
129
+ ...configs.materials,
130
+ ...configs.environment,
131
+ ...configs.lighting,
132
+ ...configs.camera,
133
+ ...configs.effects,
134
+ ...configs.flows,
135
+ ...configs.extensions,
136
+ };
137
+ const normalized = normalizeSceneDocument(document);
138
+ assertSceneDocument(normalized);
139
+ return normalized;
140
+ }
141
+ export function parseSceneJson(input) {
142
+ return typeof input === "string"
143
+ ? parseSceneDocument(input)
144
+ : parseSceneJsonBundle(input);
145
+ }
146
+ export function serializeSceneJson(document, options = {}) {
147
+ return serializeSceneDocument(document, options.space);
148
+ }
149
+ function sectionConfig(document, section) {
150
+ const sections = {
151
+ assets: { assets: document.assets },
152
+ entities: {
153
+ entities: document.entities,
154
+ rootEntityIds: document.rootEntityIds,
155
+ },
156
+ materials: {
157
+ materials: document.materials,
158
+ materialBindings: document.materialBindings,
159
+ textureAnimations: document.textureAnimations,
160
+ },
161
+ environment: {
162
+ environment: document.environment,
163
+ ground: document.ground,
164
+ fog: document.fog,
165
+ weather: document.weather,
166
+ },
167
+ lighting: { lights: document.lights },
168
+ camera: {
169
+ camera: document.camera,
170
+ cameraPaths: document.cameraPaths,
171
+ },
172
+ effects: { postProcess: document.postProcess },
173
+ flows: {
174
+ flows: document.flows,
175
+ variables: document.variables,
176
+ },
177
+ extensions: { extensions: document.extensions },
178
+ };
179
+ return sections[section];
180
+ }
181
+ function assertManifest(value) {
182
+ if (!isRecord(value) ||
183
+ value.schema !== "skenora.scene.bundle" ||
184
+ value.version !== 1 ||
185
+ !isRecord(value.scene) ||
186
+ value.scene.schema !== "skenora.scene" ||
187
+ value.scene.version !== 1 ||
188
+ typeof value.scene.id !== "string" ||
189
+ !value.scene.id.trim() ||
190
+ typeof value.scene.name !== "string" ||
191
+ !value.scene.name.trim() ||
192
+ !isRecord(value.files)) {
193
+ throw new Error("Invalid Skenora scene bundle manifest");
194
+ }
195
+ for (const section of Object.keys(SCENE_CONFIG_SECTION_FILES)) {
196
+ if (typeof value.files[section] !== "string" ||
197
+ !value.files[section].trim()) {
198
+ throw new Error(`Scene bundle manifest is missing section: ${section}`);
199
+ }
200
+ }
201
+ return structuredClone(value);
202
+ }
203
+ function serializeJson(value, requestedSpace = 2) {
204
+ if (!Number.isInteger(requestedSpace) ||
205
+ requestedSpace < 0 ||
206
+ requestedSpace > 10) {
207
+ throw new Error("Scene serialization space must be an integer from 0 to 10");
208
+ }
209
+ return `${JSON.stringify(sortJsonValue(value), null, requestedSpace)}\n`;
210
+ }
211
+ function sortJsonValue(value) {
212
+ if (Array.isArray(value))
213
+ return value.map(sortJsonValue);
214
+ if (!isRecord(value))
215
+ return value;
216
+ return Object.fromEntries(Object.entries(value)
217
+ .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
218
+ .map(([key, item]) => [key, sortJsonValue(item)]));
219
+ }
220
+ function isRecord(value) {
221
+ return value !== null && typeof value === "object" && !Array.isArray(value);
222
+ }
223
+ //# sourceMappingURL=scene-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene-config.js","sourceRoot":"","sources":["../src/scene-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type SceneDocumentData } from "@skenora/contracts";
2
+ import type { ScenePatchCandidate } from "@skenora/scene-plan";
3
+ import type { ResourceBindingTable } from "@skenora/resources";
4
+ export declare function materializeScenePatch(document: Readonly<SceneDocumentData>, candidate: ScenePatchCandidate, bindings?: ResourceBindingTable): SceneDocumentData;
5
+ //# sourceMappingURL=apply-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../src/scene-plan/apply-patch.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,mBAAmB,EAGpB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAsB/D,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,SAAS,EAAE,mBAAmB,EAC9B,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,iBAAiB,CAQnB"}
@@ -0,0 +1,174 @@
1
+ import { assertSceneDocument, normalizeSceneDocument, } from "@skenora/contracts";
2
+ import { isJsonObject, } from "@skenora/scene-plan";
3
+ const RECORD_ROOTS = {
4
+ resource: "assets",
5
+ entity: "entities",
6
+ material: "materials",
7
+ materialBinding: "materialBindings",
8
+ textureAnimation: "textureAnimations",
9
+ cameraPath: "cameraPaths",
10
+ flow: "flows",
11
+ };
12
+ const SETTING_ROOTS = new Set([
13
+ "camera",
14
+ "environment",
15
+ "ground",
16
+ "fog",
17
+ "weather",
18
+ "postProcess",
19
+ "variables",
20
+ ]);
21
+ export function materializeScenePatch(document, candidate, bindings) {
22
+ const next = structuredClone(document);
23
+ for (const operation of candidate.operations) {
24
+ applyOperation(next, operation, bindings);
25
+ }
26
+ const normalized = normalizeSceneDocument(next);
27
+ assertSceneDocument(normalized);
28
+ return normalized;
29
+ }
30
+ function applyOperation(document, operation, bindings) {
31
+ if (operation.op === "create") {
32
+ const value = operation.target.kind === "resource"
33
+ ? resourceBindingValue(operation.target.id, bindings)
34
+ : withTargetId(operation.target, operation.value);
35
+ setTargetValue(document, operation.target, value);
36
+ if (operation.target.kind === "entity") {
37
+ const entity = document.entities[operation.target.id];
38
+ if (entity?.parentId === null &&
39
+ !document.rootEntityIds.includes(entity.id)) {
40
+ document.rootEntityIds.push(entity.id);
41
+ }
42
+ }
43
+ return;
44
+ }
45
+ if (operation.op === "remove") {
46
+ if (operation.target.kind === "setting") {
47
+ throw new Error("ScenePatch cannot remove a document setting: " + operation.target.id);
48
+ }
49
+ removeTargetValue(document, operation.target);
50
+ if (operation.target.kind === "entity") {
51
+ document.rootEntityIds = document.rootEntityIds.filter((id) => id !== operation.target.id);
52
+ }
53
+ return;
54
+ }
55
+ const current = getTargetValue(document, operation.target);
56
+ if (!isJsonObject(current)) {
57
+ throw new Error("Patch update target is not a JSON object: " +
58
+ operation.target.kind +
59
+ ":" +
60
+ operation.target.id);
61
+ }
62
+ const updated = structuredClone(current);
63
+ for (const change of operation.changes) {
64
+ if (operation.target.kind === "resource" &&
65
+ ["source", "uri", "integrity", "kind"].includes(change.path[0] ?? "")) {
66
+ throw new Error("ScenePatch cannot mutate authorized resource fields: " +
67
+ change.path.join("."));
68
+ }
69
+ setRelativeValue(updated, change.path, change.value);
70
+ }
71
+ setTargetValue(document, operation.target, updated);
72
+ }
73
+ function resourceBindingValue(assetRef, bindings) {
74
+ if (!bindings) {
75
+ throw new Error("ScenePatch resource creation requires an authorized binding: " +
76
+ assetRef);
77
+ }
78
+ return structuredClone(bindings.require(assetRef).asset);
79
+ }
80
+ function getTargetValue(document, target) {
81
+ if (target.kind === "setting") {
82
+ if (!SETTING_ROOTS.has(target.id)) {
83
+ throw new Error("Unsupported ScenePatch setting: " + target.id);
84
+ }
85
+ return structuredClone(document[target.id]);
86
+ }
87
+ if (target.kind === "light") {
88
+ const light = document.lights.find((item) => item.id === target.id);
89
+ return light === undefined
90
+ ? undefined
91
+ : structuredClone(light);
92
+ }
93
+ const root = RECORD_ROOTS[target.kind];
94
+ if (!root)
95
+ throw new Error("Unsupported ScenePatch target kind: " + target.kind);
96
+ return structuredClone(document[root]?.[target.id]);
97
+ }
98
+ function setTargetValue(document, target, value) {
99
+ if (target.kind === "setting") {
100
+ if (!SETTING_ROOTS.has(target.id)) {
101
+ throw new Error("Unsupported ScenePatch setting: " + target.id);
102
+ }
103
+ document[target.id] =
104
+ structuredClone(value);
105
+ return;
106
+ }
107
+ if (target.kind === "light") {
108
+ const index = document.lights.findIndex((item) => item.id === target.id);
109
+ const light = structuredClone(value);
110
+ if (index === -1) {
111
+ document.lights.push(light);
112
+ }
113
+ else {
114
+ document.lights[index] =
115
+ light;
116
+ }
117
+ return;
118
+ }
119
+ const root = RECORD_ROOTS[target.kind];
120
+ if (!root)
121
+ throw new Error("Unsupported ScenePatch target kind: " + target.kind);
122
+ const record = document[root];
123
+ if (!record)
124
+ throw new Error("SceneDocument root is unavailable: " + root);
125
+ record[target.id] = structuredClone(value);
126
+ }
127
+ function removeTargetValue(document, target) {
128
+ if (target.kind === "setting") {
129
+ throw new Error("ScenePatch cannot remove a document setting: " + target.id);
130
+ }
131
+ if (target.kind === "light") {
132
+ const index = document.lights.findIndex((item) => item.id === target.id);
133
+ if (index >= 0)
134
+ document.lights.splice(index, 1);
135
+ return;
136
+ }
137
+ const root = RECORD_ROOTS[target.kind];
138
+ if (!root)
139
+ throw new Error("Unsupported ScenePatch target kind: " + target.kind);
140
+ delete document[root][target.id];
141
+ }
142
+ function withTargetId(target, value) {
143
+ if (target.kind === "setting")
144
+ return structuredClone(value);
145
+ const existing = value.id;
146
+ if (existing !== undefined && existing !== target.id) {
147
+ throw new Error("Patch create value id does not match target: " +
148
+ String(existing) +
149
+ " != " +
150
+ target.id);
151
+ }
152
+ return {
153
+ ...structuredClone(value),
154
+ id: target.id,
155
+ };
156
+ }
157
+ function setRelativeValue(target, path, value) {
158
+ if (path.length === 0) {
159
+ throw new Error("Patch update path must not be empty");
160
+ }
161
+ let current = target;
162
+ for (const segment of path.slice(0, -1)) {
163
+ const next = current[segment];
164
+ if (next === undefined) {
165
+ current[segment] = {};
166
+ }
167
+ else if (!isJsonObject(next)) {
168
+ throw new Error("Patch update path crosses a non-object field: " + segment);
169
+ }
170
+ current = current[segment];
171
+ }
172
+ current[path[path.length - 1]] = structuredClone(value);
173
+ }
174
+ //# sourceMappingURL=apply-patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-patch.js","sourceRoot":"","sources":["../../src/scene-plan/apply-patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type EditorSession } from "@skenora/editor";
2
+ import { type ScenePlanContext } from "@skenora/scene-plan";
3
+ import { type ResourceResolver } from "@skenora/resources";
4
+ import type { ScenePlanApplyOptions, ScenePlanApplyResult, ScenePlanExecutorOptions, ScenePlanInspectOptions, ScenePlanInspectResult, ScenePlanValidationOptions, ScenePlanValidationResult, ScenePlanWaitOptions, SceneRevisionToken } from "./types.js";
5
+ import type { EditorRuntimeBridge } from "@skenora/babylon-editor";
6
+ export declare class ScenePlanExecutor {
7
+ #private;
8
+ readonly editor: EditorSession;
9
+ readonly bridge: EditorRuntimeBridge;
10
+ readonly resources: ResourceResolver;
11
+ readonly sessionEpoch: string;
12
+ readonly capabilities: readonly import("@skenora/scene-plan").SceneCapabilityDescriptor[];
13
+ readonly context: Omit<ScenePlanContext, "resourceBindings">;
14
+ constructor(options: ScenePlanExecutorOptions);
15
+ get revisionToken(): SceneRevisionToken;
16
+ inspectScene(options?: ScenePlanInspectOptions): ScenePlanInspectResult;
17
+ validateBlueprint(input: unknown, options?: ScenePlanValidationOptions): ScenePlanValidationResult;
18
+ validatePatch(input: unknown, options?: ScenePlanValidationOptions): ScenePlanValidationResult;
19
+ validatePlan(input: unknown, options?: ScenePlanValidationOptions): ScenePlanValidationResult;
20
+ applyPlan(input: unknown, options?: ScenePlanApplyOptions): Promise<ScenePlanApplyResult>;
21
+ applyBlueprint(input: unknown, options?: ScenePlanApplyOptions): Promise<ScenePlanApplyResult>;
22
+ applyPatch(input: unknown, options?: ScenePlanApplyOptions): Promise<ScenePlanApplyResult>;
23
+ waitOperation(operationId: string, options?: ScenePlanWaitOptions): Promise<ScenePlanApplyResult> | null;
24
+ dispose(): void;
25
+ }
26
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/scene-plan/executor.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAML,KAAK,gBAAgB,EAItB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EACV,qBAAqB,EACrB,oBAAoB,EAEpB,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EAKtB,0BAA0B,EAC1B,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAOnE,qBAAa,iBAAiB;;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,SAAS,OAAO,qBAAqB,EAAE,yBAAyB,EAAE,CAAC;IAC1F,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;gBAajD,OAAO,EAAE,wBAAwB;IAuC7C,IAAI,aAAa,IAAI,kBAAkB,CAGtC;IAED,YAAY,CAAC,OAAO,GAAE,uBAA4B,GAAG,sBAAsB;IA2B3E,iBAAiB,CACf,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,0BAA+B,GACvC,yBAAyB;IAqB5B,aAAa,CACX,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,0BAA+B,GACvC,yBAAyB;IA2B5B,YAAY,CACV,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,0BAA+B,GACvC,yBAAyB;IAM5B,SAAS,CACP,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC;IAgBhC,cAAc,CACZ,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC;IAgBhC,UAAU,CACR,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC;IAgBhC,aAAa,CACX,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;IAQvC,OAAO,IAAI,IAAI;CA8iBhB"}