@ifc-lite/geometry 1.1.7 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Zero-Copy Mesh Collector - streams GPU-ready geometry with zero-copy access
3
+ *
4
+ * This collector uses the new GPU geometry API that:
5
+ * - Pre-interleaves vertex data (position + normal)
6
+ * - Pre-converts coordinates (Z-up to Y-up)
7
+ * - Exposes pointers for direct WASM memory access
8
+ *
9
+ * The collector provides TypedArray views into WASM memory. The caller
10
+ * is responsible for uploading to GPU (use @ifc-lite/renderer's ZeroCopyGpuUploader).
11
+ *
12
+ * IMPORTANT: Views become INVALID when WASM memory grows!
13
+ * Use the "immediate upload" pattern - create view, upload, discard.
14
+ */
15
+ import type { IfcAPI } from '@ifc-lite/wasm';
16
+ import { WasmMemoryManager } from './wasm-memory-manager.js';
17
+ export interface ZeroCopyStreamingProgress {
18
+ percent: number;
19
+ processed: number;
20
+ total?: number;
21
+ phase: 'simple' | 'simple_complete' | 'complex' | 'complete';
22
+ }
23
+ export interface ZeroCopyBatchResult {
24
+ /** Number of meshes in this batch */
25
+ meshCount: number;
26
+ /** Total vertices in this batch */
27
+ vertexCount: number;
28
+ /** Total triangles in this batch */
29
+ triangleCount: number;
30
+ }
31
+ export interface ZeroCopyCompleteStats {
32
+ totalMeshes: number;
33
+ totalVertices: number;
34
+ totalTriangles: number;
35
+ }
36
+ /**
37
+ * Mesh metadata for draw calls and selection
38
+ */
39
+ export interface ZeroCopyMeshMetadata {
40
+ expressId: number;
41
+ vertexOffset: number;
42
+ vertexCount: number;
43
+ indexOffset: number;
44
+ indexCount: number;
45
+ color: [number, number, number, number];
46
+ }
47
+ /**
48
+ * Batch of geometry data with zero-copy views
49
+ */
50
+ export interface ZeroCopyBatch {
51
+ /** View into WASM memory for vertex data (interleaved pos+normal) */
52
+ vertexView: Float32Array;
53
+ /** View into WASM memory for index data */
54
+ indexView: Uint32Array;
55
+ /** Byte length of vertex data (for GPU buffer creation) */
56
+ vertexByteLength: number;
57
+ /** Byte length of index data */
58
+ indexByteLength: number;
59
+ /** Mesh metadata for draw calls */
60
+ meshMetadata: ZeroCopyMeshMetadata[];
61
+ /** Batch statistics */
62
+ stats: ZeroCopyBatchResult;
63
+ /** Free WASM memory (call after uploading to GPU!) */
64
+ free: () => void;
65
+ }
66
+ /**
67
+ * Zero-copy mesh collector that streams GPU-ready geometry batches
68
+ *
69
+ * Usage:
70
+ * ```typescript
71
+ * const collector = new ZeroCopyMeshCollector(ifcApi, content);
72
+ *
73
+ * for await (const batch of collector.streamBatches()) {
74
+ * // Create GPU buffers
75
+ * const vertexBuffer = device.createBuffer({
76
+ * size: batch.vertexByteLength,
77
+ * usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
78
+ * });
79
+ *
80
+ * // Upload directly from WASM memory (single copy!)
81
+ * device.queue.writeBuffer(vertexBuffer, 0, batch.vertexView);
82
+ *
83
+ * // IMPORTANT: Free after upload!
84
+ * batch.free();
85
+ * }
86
+ * ```
87
+ */
88
+ export declare class ZeroCopyMeshCollector {
89
+ private ifcApi;
90
+ private content;
91
+ private memoryManager;
92
+ constructor(ifcApi: IfcAPI, content: string);
93
+ /**
94
+ * Stream geometry batches with zero-copy views into WASM memory
95
+ *
96
+ * @param batchSize Number of meshes per batch (default: 25)
97
+ * @yields Batches with views into WASM memory
98
+ */
99
+ streamBatches(batchSize?: number): AsyncGenerator<ZeroCopyBatch>;
100
+ /**
101
+ * Parse all geometry at once (for smaller files)
102
+ *
103
+ * @returns Batch with views into WASM memory
104
+ */
105
+ parseAll(): ZeroCopyBatch;
106
+ /**
107
+ * Get WASM memory manager for advanced use cases
108
+ */
109
+ getMemoryManager(): WasmMemoryManager;
110
+ }
111
+ /**
112
+ * Instanced geometry batch with zero-copy views
113
+ */
114
+ export interface ZeroCopyInstancedBatch {
115
+ geometryId: bigint;
116
+ /** View into WASM memory for vertex data */
117
+ vertexView: Float32Array;
118
+ /** View into WASM memory for index data */
119
+ indexView: Uint32Array;
120
+ /** View into WASM memory for instance data [transform(16) + color(4)] */
121
+ instanceView: Float32Array;
122
+ /** Express IDs for each instance */
123
+ expressIds: number[];
124
+ /** Byte lengths for GPU buffer creation */
125
+ vertexByteLength: number;
126
+ indexByteLength: number;
127
+ instanceByteLength: number;
128
+ /** Statistics */
129
+ indexCount: number;
130
+ instanceCount: number;
131
+ }
132
+ /**
133
+ * Zero-copy instanced geometry collector
134
+ */
135
+ export declare class ZeroCopyInstancedCollector {
136
+ private ifcApi;
137
+ private content;
138
+ private memoryManager;
139
+ constructor(ifcApi: IfcAPI, content: string);
140
+ /**
141
+ * Parse instanced geometry with zero-copy views
142
+ *
143
+ * @returns Array of instanced geometry batches
144
+ */
145
+ parseAll(): {
146
+ batches: ZeroCopyInstancedBatch[];
147
+ stats: {
148
+ geometryCount: number;
149
+ totalInstances: number;
150
+ };
151
+ free: () => void;
152
+ };
153
+ /**
154
+ * Get WASM memory manager for advanced use cases
155
+ */
156
+ getMemoryManager(): WasmMemoryManager;
157
+ }
158
+ //# sourceMappingURL=zero-copy-collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero-copy-collector.d.ts","sourceRoot":"","sources":["../src/zero-copy-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { WasmMemoryManager } from './wasm-memory-manager.js';
5
+ /**
6
+ * Zero-copy mesh collector that streams GPU-ready geometry batches
7
+ *
8
+ * Usage:
9
+ * ```typescript
10
+ * const collector = new ZeroCopyMeshCollector(ifcApi, content);
11
+ *
12
+ * for await (const batch of collector.streamBatches()) {
13
+ * // Create GPU buffers
14
+ * const vertexBuffer = device.createBuffer({
15
+ * size: batch.vertexByteLength,
16
+ * usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
17
+ * });
18
+ *
19
+ * // Upload directly from WASM memory (single copy!)
20
+ * device.queue.writeBuffer(vertexBuffer, 0, batch.vertexView);
21
+ *
22
+ * // IMPORTANT: Free after upload!
23
+ * batch.free();
24
+ * }
25
+ * ```
26
+ */
27
+ export class ZeroCopyMeshCollector {
28
+ ifcApi;
29
+ content;
30
+ memoryManager;
31
+ constructor(ifcApi, content) {
32
+ this.ifcApi = ifcApi;
33
+ this.content = content;
34
+ // Get WASM memory for zero-copy access
35
+ const wasmMemory = ifcApi.getMemory();
36
+ this.memoryManager = new WasmMemoryManager(wasmMemory);
37
+ }
38
+ /**
39
+ * Stream geometry batches with zero-copy views into WASM memory
40
+ *
41
+ * @param batchSize Number of meshes per batch (default: 25)
42
+ * @yields Batches with views into WASM memory
43
+ */
44
+ async *streamBatches(batchSize = 25) {
45
+ // Queue to hold batches from async callback
46
+ const batchQueue = [];
47
+ let resolveWaiting = null;
48
+ let isComplete = false;
49
+ // Start async processing
50
+ const processingPromise = this.ifcApi.parseToGpuGeometryAsync(this.content, {
51
+ batchSize,
52
+ onBatch: (gpuGeom, _progress) => {
53
+ batchQueue.push(gpuGeom);
54
+ if (resolveWaiting) {
55
+ resolveWaiting();
56
+ resolveWaiting = null;
57
+ }
58
+ },
59
+ onComplete: (_stats) => {
60
+ isComplete = true;
61
+ if (resolveWaiting) {
62
+ resolveWaiting();
63
+ resolveWaiting = null;
64
+ }
65
+ },
66
+ });
67
+ // Process batches as they arrive
68
+ while (true) {
69
+ while (batchQueue.length > 0) {
70
+ const gpuGeom = batchQueue.shift();
71
+ // Create zero-copy views into WASM memory
72
+ const vertexView = this.memoryManager.createFloat32View(gpuGeom.vertexDataPtr, gpuGeom.vertexDataLen);
73
+ const indexView = this.memoryManager.createUint32View(gpuGeom.indicesPtr, gpuGeom.indicesLen);
74
+ // Extract mesh metadata
75
+ const meshMetadata = [];
76
+ for (let i = 0; i < gpuGeom.meshCount; i++) {
77
+ const meta = gpuGeom.getMeshMetadata(i);
78
+ if (meta) {
79
+ meshMetadata.push({
80
+ expressId: meta.expressId,
81
+ vertexOffset: meta.vertexOffset,
82
+ vertexCount: meta.vertexCount,
83
+ indexOffset: meta.indexOffset,
84
+ indexCount: meta.indexCount,
85
+ color: meta.color,
86
+ });
87
+ }
88
+ }
89
+ yield {
90
+ vertexView,
91
+ indexView,
92
+ vertexByteLength: gpuGeom.vertexDataByteLength,
93
+ indexByteLength: gpuGeom.indicesByteLength,
94
+ meshMetadata,
95
+ stats: {
96
+ meshCount: gpuGeom.meshCount,
97
+ vertexCount: gpuGeom.totalVertexCount,
98
+ triangleCount: gpuGeom.totalTriangleCount,
99
+ },
100
+ free: () => gpuGeom.free(),
101
+ };
102
+ }
103
+ if (isComplete && batchQueue.length === 0)
104
+ break;
105
+ // Wait for more batches
106
+ await new Promise((resolve) => {
107
+ resolveWaiting = resolve;
108
+ });
109
+ }
110
+ await processingPromise;
111
+ }
112
+ /**
113
+ * Parse all geometry at once (for smaller files)
114
+ *
115
+ * @returns Batch with views into WASM memory
116
+ */
117
+ parseAll() {
118
+ // Get GPU-ready geometry from WASM
119
+ const gpuGeom = this.ifcApi.parseToGpuGeometry(this.content);
120
+ // Create zero-copy views
121
+ const vertexView = this.memoryManager.createFloat32View(gpuGeom.vertexDataPtr, gpuGeom.vertexDataLen);
122
+ const indexView = this.memoryManager.createUint32View(gpuGeom.indicesPtr, gpuGeom.indicesLen);
123
+ // Extract mesh metadata
124
+ const meshMetadata = [];
125
+ for (let i = 0; i < gpuGeom.meshCount; i++) {
126
+ const meta = gpuGeom.getMeshMetadata(i);
127
+ if (meta) {
128
+ meshMetadata.push({
129
+ expressId: meta.expressId,
130
+ vertexOffset: meta.vertexOffset,
131
+ vertexCount: meta.vertexCount,
132
+ indexOffset: meta.indexOffset,
133
+ indexCount: meta.indexCount,
134
+ color: meta.color,
135
+ });
136
+ }
137
+ }
138
+ return {
139
+ vertexView,
140
+ indexView,
141
+ vertexByteLength: gpuGeom.vertexDataByteLength,
142
+ indexByteLength: gpuGeom.indicesByteLength,
143
+ meshMetadata,
144
+ stats: {
145
+ meshCount: gpuGeom.meshCount,
146
+ vertexCount: gpuGeom.totalVertexCount,
147
+ triangleCount: gpuGeom.totalTriangleCount,
148
+ },
149
+ free: () => gpuGeom.free(),
150
+ };
151
+ }
152
+ /**
153
+ * Get WASM memory manager for advanced use cases
154
+ */
155
+ getMemoryManager() {
156
+ return this.memoryManager;
157
+ }
158
+ }
159
+ /**
160
+ * Zero-copy instanced geometry collector
161
+ */
162
+ export class ZeroCopyInstancedCollector {
163
+ ifcApi;
164
+ content;
165
+ memoryManager;
166
+ constructor(ifcApi, content) {
167
+ this.ifcApi = ifcApi;
168
+ this.content = content;
169
+ const wasmMemory = ifcApi.getMemory();
170
+ this.memoryManager = new WasmMemoryManager(wasmMemory);
171
+ }
172
+ /**
173
+ * Parse instanced geometry with zero-copy views
174
+ *
175
+ * @returns Array of instanced geometry batches
176
+ */
177
+ parseAll() {
178
+ const collection = this.ifcApi.parseToGpuInstancedGeometry(this.content);
179
+ const batches = [];
180
+ let totalInstances = 0;
181
+ for (let i = 0; i < collection.length; i++) {
182
+ const geomRef = collection.getRef(i);
183
+ if (!geomRef)
184
+ continue;
185
+ // Create zero-copy views
186
+ const vertexView = this.memoryManager.createFloat32View(geomRef.vertexDataPtr, geomRef.vertexDataLen);
187
+ const indexView = this.memoryManager.createUint32View(geomRef.indicesPtr, geomRef.indicesLen);
188
+ const instanceView = this.memoryManager.createFloat32View(geomRef.instanceDataPtr, geomRef.instanceDataLen);
189
+ const expressIdsView = this.memoryManager.createUint32View(geomRef.instanceExpressIdsPtr, geomRef.instanceCount);
190
+ batches.push({
191
+ geometryId: geomRef.geometryId,
192
+ vertexView,
193
+ indexView,
194
+ instanceView,
195
+ expressIds: Array.from(expressIdsView),
196
+ vertexByteLength: geomRef.vertexDataByteLength,
197
+ indexByteLength: geomRef.indicesByteLength,
198
+ instanceByteLength: geomRef.instanceDataByteLength,
199
+ indexCount: geomRef.indicesLen,
200
+ instanceCount: geomRef.instanceCount,
201
+ });
202
+ totalInstances += geomRef.instanceCount;
203
+ }
204
+ return {
205
+ batches,
206
+ stats: {
207
+ geometryCount: collection.length,
208
+ totalInstances,
209
+ },
210
+ free: () => {
211
+ if (typeof collection.free === 'function') {
212
+ collection.free();
213
+ }
214
+ },
215
+ };
216
+ }
217
+ /**
218
+ * Get WASM memory manager for advanced use cases
219
+ */
220
+ getMemoryManager() {
221
+ return this.memoryManager;
222
+ }
223
+ }
224
+ //# sourceMappingURL=zero-copy-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zero-copy-collector.js","sourceRoot":"","sources":["../src/zero-copy-collector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/geometry",
3
- "version": "1.1.7",
3
+ "version": "1.2.0",
4
4
  "description": "Geometry processing bridge for IFC-Lite - 1.9x faster than web-ifc",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,12 +11,8 @@
11
11
  "types": "./dist/index.d.ts"
12
12
  }
13
13
  },
14
- "scripts": {
15
- "build": "tsc || true",
16
- "dev": "tsc --watch"
17
- },
18
14
  "dependencies": {
19
- "@ifc-lite/wasm": "workspace:*"
15
+ "@ifc-lite/wasm": "^1.2.0"
20
16
  },
21
17
  "devDependencies": {
22
18
  "typescript": "^5.3.0"
@@ -43,5 +39,9 @@
43
39
  "files": [
44
40
  "dist",
45
41
  "README.md"
46
- ]
47
- }
42
+ ],
43
+ "scripts": {
44
+ "build": "tsc || true",
45
+ "dev": "tsc --watch"
46
+ }
47
+ }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=geometry.worker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry.worker.d.ts","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":""}
@@ -1,116 +0,0 @@
1
- /* This Source Code Form is subject to the terms of the Mozilla Public
2
- * License, v. 2.0. If a copy of the MPL was not distributed with this
3
- * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
- /**
5
- * Geometry Worker - Handles mesh collection in a Web Worker
6
- * Uses IFC-Lite for native Rust geometry processing (1.9x faster than web-ifc)
7
- */
8
- import init, { IfcAPI } from '@ifc-lite/wasm';
9
- import { IfcLiteMeshCollector } from './ifc-lite-mesh-collector.js';
10
- // Global IFC-Lite API instance (initialized once per worker)
11
- let ifcApi = null;
12
- let ifcApiInitialized = false;
13
- /**
14
- * Initialize IFC-Lite API in worker context
15
- * The WASM binary is automatically resolved from the same location as the JS module
16
- */
17
- async function initIfcApi() {
18
- if (ifcApi && ifcApiInitialized) {
19
- return ifcApi;
20
- }
21
- const initStart = performance.now();
22
- console.log('[Worker] Initializing IFC-Lite...');
23
- // Initialize WASM module - wasm-bindgen automatically resolves the WASM URL
24
- await init();
25
- ifcApi = new IfcAPI();
26
- ifcApiInitialized = true;
27
- const initTime = performance.now() - initStart;
28
- console.log(`[Worker] IFC-Lite initialized in ${initTime.toFixed(2)}ms`);
29
- return ifcApi;
30
- }
31
- /**
32
- * Handle mesh collection task
33
- */
34
- async function handleMeshCollection(data) {
35
- const taskStart = performance.now();
36
- const { buffer } = data;
37
- // Initialize IFC-Lite if needed
38
- const apiInitStart = performance.now();
39
- const api = await initIfcApi();
40
- const apiInitTime = performance.now() - apiInitStart;
41
- if (apiInitTime > 10) {
42
- console.log(`[Worker] IFC-Lite init took ${apiInitTime.toFixed(2)}ms`);
43
- }
44
- // Convert buffer to string (IFC files are text)
45
- const decoder = new TextDecoder();
46
- const content = decoder.decode(new Uint8Array(buffer));
47
- // Collect meshes using IFC-Lite
48
- const collectStart = performance.now();
49
- const collector = new IfcLiteMeshCollector(api, content);
50
- const meshes = collector.collectMeshes();
51
- const collectTime = performance.now() - collectStart;
52
- const totalTime = performance.now() - taskStart;
53
- console.log(`[Worker] Mesh collection: ${collectTime.toFixed(2)}ms, total: ${totalTime.toFixed(2)}ms, meshes: ${meshes.length}`);
54
- return meshes;
55
- }
56
- /**
57
- * Process task and send result back to main thread
58
- */
59
- async function processTask(task) {
60
- try {
61
- let result;
62
- switch (task.type) {
63
- case 'mesh-collection':
64
- result = await handleMeshCollection(task.data);
65
- break;
66
- case 'generate-lod':
67
- case 'build-bvh':
68
- throw new Error(`Task type '${task.type}' not yet implemented`);
69
- default:
70
- throw new Error(`Unknown task type: ${task.type}`);
71
- }
72
- // Extract transferable buffers for zero-copy transfer
73
- const transferables = [];
74
- if (Array.isArray(result)) {
75
- // MeshData[] - extract all typed array buffers
76
- for (const mesh of result) {
77
- if (mesh.positions?.buffer) {
78
- transferables.push(mesh.positions.buffer);
79
- }
80
- if (mesh.normals?.buffer) {
81
- transferables.push(mesh.normals.buffer);
82
- }
83
- if (mesh.indices?.buffer) {
84
- transferables.push(mesh.indices.buffer);
85
- }
86
- }
87
- }
88
- // Send result with transferables
89
- const response = {
90
- id: task.id,
91
- type: 'task-result',
92
- result,
93
- };
94
- self.postMessage(response, { transfer: transferables });
95
- }
96
- catch (error) {
97
- // Send error back
98
- const response = {
99
- id: task.id,
100
- type: 'task-error',
101
- error: error instanceof Error ? error.message : String(error),
102
- };
103
- self.postMessage(response);
104
- }
105
- }
106
- // Signal that worker is ready (send immediately on load)
107
- const readyMessage = {
108
- id: '',
109
- type: 'ready',
110
- };
111
- self.postMessage(readyMessage);
112
- // Listen for messages from main thread
113
- self.onmessage = async (e) => {
114
- await processTask(e.data);
115
- };
116
- //# sourceMappingURL=geometry.worker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"geometry.worker.js","sourceRoot":"","sources":["../src/geometry.worker.ts"],"names":[],"mappings":"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"}
@@ -1,56 +0,0 @@
1
- /**
2
- * Worker Pool - Generic worker pool with task queue
3
- * Supports multiple task types and zero-copy transferable objects
4
- */
5
- export type TaskType = 'mesh-collection' | 'generate-lod' | 'build-bvh';
6
- export interface Task<T = any> {
7
- id: string;
8
- type: TaskType;
9
- data: any;
10
- resolve: (value: T) => void;
11
- reject: (error: Error) => void;
12
- }
13
- export interface WorkerMessage {
14
- id: string;
15
- type: 'task-result' | 'task-error' | 'ready';
16
- result?: any;
17
- error?: string;
18
- }
19
- /**
20
- * Worker Pool for geometry processing tasks
21
- */
22
- export declare class WorkerPool {
23
- private workers;
24
- private taskQueue;
25
- private activeTasks;
26
- private availableWorkers;
27
- private workerCount;
28
- private workerUrl;
29
- private initialized;
30
- constructor(workerUrl: URL | string, workerCount?: number);
31
- /**
32
- * Initialize worker pool
33
- */
34
- init(): Promise<void>;
35
- /**
36
- * Check if workers are available
37
- */
38
- isAvailable(): boolean;
39
- /**
40
- * Submit a task to the worker pool
41
- */
42
- submit<T>(type: TaskType, data: any): Promise<T>;
43
- /**
44
- * Process queued tasks
45
- */
46
- private processQueue;
47
- /**
48
- * Handle message from worker
49
- */
50
- private handleMessage;
51
- /**
52
- * Terminate all workers
53
- */
54
- terminate(): void;
55
- }
56
- //# sourceMappingURL=worker-pool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,iBAAiB,GAAG,cAAc,GAAG,WAAW,CAAC;AAExE,MAAM,WAAW,IAAI,CAAC,CAAC,GAAG,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,OAAO,CAAC;IAC7C,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAA0B;IAClD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,WAAW,CAAkB;gBAEzB,SAAS,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAKzD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoD3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBtD;;OAEG;IACH,OAAO,CAAC,YAAY;IAyBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAgCrB;;OAEG;IACH,SAAS,IAAI,IAAI;CAUlB"}