@nice2dev/spatial-core 1.0.10

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 (82) hide show
  1. package/README.md +160 -0
  2. package/dist/bim/index.d.ts +366 -0
  3. package/dist/bim/index.d.ts.map +1 -0
  4. package/dist/bim/index.js +60 -0
  5. package/dist/bim/index.js.map +1 -0
  6. package/dist/cad/index.d.ts +329 -0
  7. package/dist/cad/index.d.ts.map +1 -0
  8. package/dist/cad/index.js +124 -0
  9. package/dist/cad/index.js.map +1 -0
  10. package/dist/ecad/index.d.ts +316 -0
  11. package/dist/ecad/index.d.ts.map +1 -0
  12. package/dist/ecad/index.js +11 -0
  13. package/dist/ecad/index.js.map +1 -0
  14. package/dist/export/index.d.ts +93 -0
  15. package/dist/export/index.d.ts.map +1 -0
  16. package/dist/export/index.js +522 -0
  17. package/dist/export/index.js.map +1 -0
  18. package/dist/floor-plan/index.d.ts +248 -0
  19. package/dist/floor-plan/index.d.ts.map +1 -0
  20. package/dist/floor-plan/index.js +228 -0
  21. package/dist/floor-plan/index.js.map +1 -0
  22. package/dist/grid/index.d.ts +160 -0
  23. package/dist/grid/index.d.ts.map +1 -0
  24. package/dist/grid/index.js +319 -0
  25. package/dist/grid/index.js.map +1 -0
  26. package/dist/import/import.worker.d.ts +28 -0
  27. package/dist/import/import.worker.d.ts.map +1 -0
  28. package/dist/import/import.worker.js +52 -0
  29. package/dist/import/import.worker.js.map +1 -0
  30. package/dist/import/index.d.ts +111 -0
  31. package/dist/import/index.d.ts.map +1 -0
  32. package/dist/import/index.js +1092 -0
  33. package/dist/import/index.js.map +1 -0
  34. package/dist/import/workerImport.d.ts +56 -0
  35. package/dist/import/workerImport.d.ts.map +1 -0
  36. package/dist/import/workerImport.js +207 -0
  37. package/dist/import/workerImport.js.map +1 -0
  38. package/dist/index.d.ts +29 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +86 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/interior/index.d.ts +241 -0
  43. package/dist/interior/index.d.ts.map +1 -0
  44. package/dist/interior/index.js +101 -0
  45. package/dist/interior/index.js.map +1 -0
  46. package/dist/measurement/index.d.ts +186 -0
  47. package/dist/measurement/index.d.ts.map +1 -0
  48. package/dist/measurement/index.js +400 -0
  49. package/dist/measurement/index.js.map +1 -0
  50. package/dist/objects/index.d.ts +288 -0
  51. package/dist/objects/index.d.ts.map +1 -0
  52. package/dist/objects/index.js +463 -0
  53. package/dist/objects/index.js.map +1 -0
  54. package/dist/serialization/index.d.ts +421 -0
  55. package/dist/serialization/index.d.ts.map +1 -0
  56. package/dist/serialization/index.js +412 -0
  57. package/dist/serialization/index.js.map +1 -0
  58. package/dist/topology/index.d.ts +252 -0
  59. package/dist/topology/index.d.ts.map +1 -0
  60. package/dist/topology/index.js +525 -0
  61. package/dist/topology/index.js.map +1 -0
  62. package/dist/transitions/index.d.ts +141 -0
  63. package/dist/transitions/index.d.ts.map +1 -0
  64. package/dist/transitions/index.js +160 -0
  65. package/dist/transitions/index.js.map +1 -0
  66. package/dist/unified/index.d.ts +225 -0
  67. package/dist/unified/index.d.ts.map +1 -0
  68. package/dist/unified/index.js +474 -0
  69. package/dist/unified/index.js.map +1 -0
  70. package/dist/virtualization/QuadTree.d.ts +68 -0
  71. package/dist/virtualization/QuadTree.d.ts.map +1 -0
  72. package/dist/virtualization/QuadTree.js +228 -0
  73. package/dist/virtualization/QuadTree.js.map +1 -0
  74. package/dist/virtualization/ViewportCulling.d.ts +92 -0
  75. package/dist/virtualization/ViewportCulling.d.ts.map +1 -0
  76. package/dist/virtualization/ViewportCulling.js +123 -0
  77. package/dist/virtualization/ViewportCulling.js.map +1 -0
  78. package/dist/virtualization/index.d.ts +9 -0
  79. package/dist/virtualization/index.d.ts.map +1 -0
  80. package/dist/virtualization/index.js +9 -0
  81. package/dist/virtualization/index.js.map +1 -0
  82. package/package.json +64 -0
@@ -0,0 +1,474 @@
1
+ /**
2
+ * Shared 3D Object Model — bridges Spatial 2D and CAD 3D.
3
+ *
4
+ * PRO-2.1 tasks:
5
+ * - SpatialObject3D — shared type for both editors
6
+ * - 2D↔3D extrusion / projection utilities
7
+ * - Reference System — CAD objects as spatial references
8
+ * - Property Sync — bi-directional property binding
9
+ * - Material Library — shared materials/textures
10
+ * - Smart Snapping — snap to edges, vertices, centers
11
+ * - Grid Systems — ortho, isometric, hex
12
+ * - Layer Management — shared layers
13
+ * - Object Constraints — parent-child, alignment, distribution
14
+ *
15
+ * @module @nice2dev/spatial-core/unified
16
+ */
17
+ /** Extrude a 2D outline (polygon) into a 3D shape description. */
18
+ export function extrudeTo3D(outline, options) {
19
+ const { height, taper = 0, cap = true } = options;
20
+ const vertices = [];
21
+ const faces = [];
22
+ // Bottom vertices
23
+ for (const p of outline) {
24
+ vertices.push({ x: p.x, y: p.y, z: 0 });
25
+ }
26
+ // Top vertices (with optional taper)
27
+ const cx = outline.reduce((s, p) => s + p.x, 0) / outline.length;
28
+ const cy = outline.reduce((s, p) => s + p.y, 0) / outline.length;
29
+ for (const p of outline) {
30
+ const tx = p.x + (cx - p.x) * taper;
31
+ const ty = p.y + (cy - p.y) * taper;
32
+ vertices.push({ x: tx, y: ty, z: height });
33
+ }
34
+ const n = outline.length;
35
+ // Side faces
36
+ for (let i = 0; i < n; i++) {
37
+ const j = (i + 1) % n;
38
+ faces.push([i, j, j + n, i + n]);
39
+ }
40
+ // Cap faces
41
+ if (cap) {
42
+ const bottom = Array.from({ length: n }, (_, i) => i);
43
+ const top = Array.from({ length: n }, (_, i) => i + n);
44
+ faces.push(bottom);
45
+ faces.push(top.reverse());
46
+ }
47
+ return { vertices, faces, height };
48
+ }
49
+ /** Project a 3D point cloud onto a 2D plane. */
50
+ export function projectTo2D(points, options) {
51
+ const { axis, scale = 1 } = options;
52
+ return points.map((p) => {
53
+ switch (axis) {
54
+ case 'x':
55
+ return { x: p.y * scale, y: p.z * scale };
56
+ case 'y':
57
+ return { x: p.x * scale, y: p.z * scale };
58
+ case 'z':
59
+ return { x: p.x * scale, y: p.y * scale };
60
+ }
61
+ });
62
+ }
63
+ /** Reference registry for managing cross-editor links */
64
+ export class ReferenceRegistry {
65
+ refs = new Map();
66
+ add(ref) {
67
+ this.refs.set(ref.id, ref);
68
+ }
69
+ remove(id) {
70
+ this.refs.delete(id);
71
+ }
72
+ getBySource(sourceId) {
73
+ return Array.from(this.refs.values()).filter((r) => r.sourceId === sourceId);
74
+ }
75
+ getByTarget(targetId) {
76
+ return Array.from(this.refs.values()).filter((r) => r.targetId === targetId);
77
+ }
78
+ getLinked(objectId) {
79
+ return Array.from(this.refs.values()).filter((r) => r.sourceId === objectId || r.targetId === objectId);
80
+ }
81
+ getAll() {
82
+ return Array.from(this.refs.values());
83
+ }
84
+ }
85
+ /** Sync engine that keeps linked objects in sync */
86
+ export class PropertySyncEngine {
87
+ registry;
88
+ listeners = [];
89
+ constructor(registry) {
90
+ this.registry = registry;
91
+ }
92
+ /** Register a listener for propagated changes */
93
+ onSync(callback) {
94
+ this.listeners.push(callback);
95
+ return () => {
96
+ this.listeners = this.listeners.filter((l) => l !== callback);
97
+ };
98
+ }
99
+ /** Propagate a property change to linked objects */
100
+ propagate(change) {
101
+ const refs = this.registry.getLinked(change.objectId);
102
+ for (const ref of refs) {
103
+ if (!ref.syncProperties.includes(change.property)) {
104
+ continue;
105
+ }
106
+ let targetId = null;
107
+ if (ref.sourceId === change.objectId &&
108
+ (ref.syncMode === 'source-to-target' || ref.syncMode === 'bidirectional')) {
109
+ targetId = ref.targetId;
110
+ }
111
+ else if (ref.targetId === change.objectId &&
112
+ (ref.syncMode === 'target-to-source' || ref.syncMode === 'bidirectional')) {
113
+ targetId = ref.sourceId;
114
+ }
115
+ if (targetId) {
116
+ for (const listener of this.listeners) {
117
+ listener(change, targetId);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ }
123
+ /** Built-in material presets */
124
+ export const MATERIAL_PRESETS = [
125
+ {
126
+ id: 'mat-white-wall',
127
+ name: 'White Wall',
128
+ category: 'paint',
129
+ color: '#f5f5f5',
130
+ opacity: 1,
131
+ roughness: 0.9,
132
+ },
133
+ {
134
+ id: 'mat-oak-wood',
135
+ name: 'Oak Wood',
136
+ category: 'wood',
137
+ color: '#c19a6b',
138
+ opacity: 1,
139
+ roughness: 0.6,
140
+ },
141
+ {
142
+ id: 'mat-walnut-wood',
143
+ name: 'Walnut Wood',
144
+ category: 'wood',
145
+ color: '#5c4033',
146
+ opacity: 1,
147
+ roughness: 0.5,
148
+ },
149
+ {
150
+ id: 'mat-pine-wood',
151
+ name: 'Pine Wood',
152
+ category: 'wood',
153
+ color: '#deb887',
154
+ opacity: 1,
155
+ roughness: 0.7,
156
+ },
157
+ {
158
+ id: 'mat-brushed-steel',
159
+ name: 'Brushed Steel',
160
+ category: 'metal',
161
+ color: '#c0c0c0',
162
+ opacity: 1,
163
+ roughness: 0.3,
164
+ metalness: 0.9,
165
+ },
166
+ {
167
+ id: 'mat-chrome',
168
+ name: 'Chrome',
169
+ category: 'metal',
170
+ color: '#e8e8e8',
171
+ opacity: 1,
172
+ roughness: 0.1,
173
+ metalness: 1.0,
174
+ },
175
+ {
176
+ id: 'mat-copper',
177
+ name: 'Copper',
178
+ category: 'metal',
179
+ color: '#b87333',
180
+ opacity: 1,
181
+ roughness: 0.3,
182
+ metalness: 0.8,
183
+ },
184
+ {
185
+ id: 'mat-clear-glass',
186
+ name: 'Clear Glass',
187
+ category: 'glass',
188
+ color: '#e0f0ff',
189
+ opacity: 0.3,
190
+ roughness: 0.05,
191
+ },
192
+ {
193
+ id: 'mat-frosted-glass',
194
+ name: 'Frosted Glass',
195
+ category: 'glass',
196
+ color: '#f0f0f0',
197
+ opacity: 0.5,
198
+ roughness: 0.6,
199
+ },
200
+ {
201
+ id: 'mat-concrete',
202
+ name: 'Concrete',
203
+ category: 'concrete',
204
+ color: '#999999',
205
+ opacity: 1,
206
+ roughness: 0.95,
207
+ },
208
+ {
209
+ id: 'mat-marble-white',
210
+ name: 'White Marble',
211
+ category: 'stone',
212
+ color: '#f0ece2',
213
+ opacity: 1,
214
+ roughness: 0.2,
215
+ },
216
+ {
217
+ id: 'mat-granite-dark',
218
+ name: 'Dark Granite',
219
+ category: 'stone',
220
+ color: '#333333',
221
+ opacity: 1,
222
+ roughness: 0.4,
223
+ },
224
+ {
225
+ id: 'mat-brick-red',
226
+ name: 'Red Brick',
227
+ category: 'stone',
228
+ color: '#8b4513',
229
+ opacity: 1,
230
+ roughness: 0.85,
231
+ },
232
+ {
233
+ id: 'mat-carpet-grey',
234
+ name: 'Grey Carpet',
235
+ category: 'carpet',
236
+ color: '#808080',
237
+ opacity: 1,
238
+ roughness: 0.95,
239
+ },
240
+ {
241
+ id: 'mat-tile-white',
242
+ name: 'White Tile',
243
+ category: 'ceramic',
244
+ color: '#ffffff',
245
+ opacity: 1,
246
+ roughness: 0.3,
247
+ },
248
+ {
249
+ id: 'mat-fabric-linen',
250
+ name: 'Linen',
251
+ category: 'fabric',
252
+ color: '#faf0e6',
253
+ opacity: 1,
254
+ roughness: 0.8,
255
+ },
256
+ ];
257
+ /** Material library — searchable collection of materials */
258
+ export class MaterialLibrary {
259
+ materials = new Map();
260
+ constructor(presets = MATERIAL_PRESETS) {
261
+ for (const m of presets) {
262
+ this.materials.set(m.id, m);
263
+ }
264
+ }
265
+ add(material) {
266
+ this.materials.set(material.id, material);
267
+ }
268
+ get(id) {
269
+ return this.materials.get(id);
270
+ }
271
+ remove(id) {
272
+ this.materials.delete(id);
273
+ }
274
+ getAll() {
275
+ return Array.from(this.materials.values());
276
+ }
277
+ getByCategory(category) {
278
+ return this.getAll().filter((m) => m.category === category);
279
+ }
280
+ search(query) {
281
+ const q = query.toLowerCase();
282
+ return this.getAll().filter((m) => m.name.toLowerCase().includes(q) ||
283
+ m.category.includes(q) ||
284
+ m.tags?.some((t) => t.includes(q)));
285
+ }
286
+ }
287
+ export const DEFAULT_SNAP_CONFIG = {
288
+ enabled: true,
289
+ snapToVertices: true,
290
+ snapToEdgeMidpoints: true,
291
+ snapToCenters: true,
292
+ snapToGrid: true,
293
+ snapToIntersections: true,
294
+ snapToPerpendicular: false,
295
+ snapRadius: 10,
296
+ };
297
+ /** Find the nearest snap target within radius */
298
+ export function findNearestSnap(cursor, targets, radius) {
299
+ let best = null;
300
+ let bestDist = radius * radius;
301
+ for (const t of targets) {
302
+ const dx = cursor.x - t.point.x;
303
+ const dy = cursor.y - t.point.y;
304
+ const d2 = dx * dx + dy * dy;
305
+ if (d2 < bestDist) {
306
+ bestDist = d2;
307
+ best = t;
308
+ }
309
+ }
310
+ return best;
311
+ }
312
+ export const DEFAULT_GRID_CONFIGS = {
313
+ orthogonal: {
314
+ type: 'orthogonal',
315
+ cellSize: 50,
316
+ subdivisions: 5,
317
+ visible: true,
318
+ snapToGrid: true,
319
+ color: '#cccccc',
320
+ subColor: '#eeeeee',
321
+ },
322
+ isometric: {
323
+ type: 'isometric',
324
+ cellSize: 50,
325
+ subdivisions: 2,
326
+ visible: true,
327
+ snapToGrid: true,
328
+ color: '#cccccc',
329
+ subColor: '#eeeeee',
330
+ },
331
+ 'hex-flat': {
332
+ type: 'hex-flat',
333
+ cellSize: 40,
334
+ subdivisions: 1,
335
+ visible: true,
336
+ snapToGrid: true,
337
+ color: '#cccccc',
338
+ subColor: '#eeeeee',
339
+ },
340
+ 'hex-pointy': {
341
+ type: 'hex-pointy',
342
+ cellSize: 40,
343
+ subdivisions: 1,
344
+ visible: true,
345
+ snapToGrid: true,
346
+ color: '#cccccc',
347
+ subColor: '#eeeeee',
348
+ },
349
+ };
350
+ /** Snap a point to the nearest grid position */
351
+ export function snapToGridSystem(point, config) {
352
+ const size = config.cellSize / config.subdivisions;
353
+ switch (config.type) {
354
+ case 'orthogonal':
355
+ return {
356
+ x: Math.round(point.x / size) * size,
357
+ y: Math.round(point.y / size) * size,
358
+ };
359
+ case 'isometric': {
360
+ // Iso grid: 30° angle. Transform, snap, transform back.
361
+ const cos30 = Math.cos(Math.PI / 6);
362
+ const sin30 = 0.5;
363
+ const ix = point.x / (size * cos30);
364
+ const iy = point.y / size - ix * sin30;
365
+ const rx = Math.round(ix);
366
+ const ry = Math.round(iy);
367
+ return {
368
+ x: rx * size * cos30,
369
+ y: (ry + rx * sin30) * size,
370
+ };
371
+ }
372
+ case 'hex-flat':
373
+ case 'hex-pointy': {
374
+ // Hex grid snap — cube-coordinate rounding
375
+ const s = config.cellSize;
376
+ const isFlat = config.type === 'hex-flat';
377
+ const q = isFlat
378
+ ? ((2 / 3) * point.x) / s
379
+ : ((Math.sqrt(3) / 3) * point.x - (1 / 3) * point.y) / s;
380
+ const r = isFlat
381
+ ? ((-1 / 3) * point.x + (Math.sqrt(3) / 3) * point.y) / s
382
+ : ((2 / 3) * point.y) / s;
383
+ // Cube-coord round
384
+ const sn = -q - r;
385
+ let rq = Math.round(q);
386
+ let rr = Math.round(r);
387
+ const rs = Math.round(sn);
388
+ const dq = Math.abs(rq - q);
389
+ const dr = Math.abs(rr - r);
390
+ const ds = Math.abs(rs - sn);
391
+ if (dq > dr && dq > ds) {
392
+ rq = -rr - rs;
393
+ }
394
+ else if (dr > ds) {
395
+ rr = -rq - rs;
396
+ }
397
+ // Back to pixel
398
+ if (isFlat) {
399
+ return { x: s * (3 / 2) * rq, y: s * ((Math.sqrt(3) / 2) * rq + Math.sqrt(3) * rr) };
400
+ }
401
+ return { x: s * (Math.sqrt(3) * rq + (Math.sqrt(3) / 2) * rr), y: s * (3 / 2) * rr };
402
+ }
403
+ }
404
+ }
405
+ /** Layer manager — shared between 2D and 3D editors */
406
+ export class LayerManager {
407
+ layers = new Map();
408
+ constructor(defaults) {
409
+ for (const l of defaults ?? []) {
410
+ this.layers.set(l.id, l);
411
+ }
412
+ }
413
+ add(layer) {
414
+ this.layers.set(layer.id, layer);
415
+ }
416
+ get(id) {
417
+ return this.layers.get(id);
418
+ }
419
+ remove(id) {
420
+ this.layers.delete(id);
421
+ }
422
+ getAll() {
423
+ return Array.from(this.layers.values()).sort((a, b) => a.zIndex - b.zIndex);
424
+ }
425
+ getVisibleFor(scope) {
426
+ return this.getAll().filter((l) => l.visible && (l.scope === scope || l.scope === 'both'));
427
+ }
428
+ setVisibility(id, visible) {
429
+ const l = this.layers.get(id);
430
+ if (l) {
431
+ l.visible = visible;
432
+ }
433
+ }
434
+ setLocked(id, locked) {
435
+ const l = this.layers.get(id);
436
+ if (l) {
437
+ l.locked = locked;
438
+ }
439
+ }
440
+ reorder(id, newZIndex) {
441
+ const l = this.layers.get(id);
442
+ if (l) {
443
+ l.zIndex = newZIndex;
444
+ }
445
+ }
446
+ }
447
+ /** Evaluate alignment constraints for a set of objects */
448
+ export function evaluateConstraint(constraint, getPosition) {
449
+ const positions = constraint.objectIds.map(getPosition).filter(Boolean);
450
+ if (positions.length < 2) {
451
+ return { satisfied: true };
452
+ }
453
+ switch (constraint.type) {
454
+ case 'align-horizontal':
455
+ const ySpread = Math.max(...positions.map((p) => p.y)) - Math.min(...positions.map((p) => p.y));
456
+ return { satisfied: ySpread < 0.5, error: ySpread };
457
+ case 'align-vertical':
458
+ const xSpread = Math.max(...positions.map((p) => p.x)) - Math.min(...positions.map((p) => p.x));
459
+ return { satisfied: xSpread < 0.5, error: xSpread };
460
+ case 'distance': {
461
+ if (positions.length < 2 || constraint.value == null) {
462
+ return { satisfied: true };
463
+ }
464
+ const dx = positions[1].x - positions[0].x;
465
+ const dy = positions[1].y - positions[0].y;
466
+ const dist = Math.sqrt(dx * dx + dy * dy);
467
+ const err = Math.abs(dist - constraint.value);
468
+ return { satisfied: err < 0.5, error: err };
469
+ }
470
+ default:
471
+ return { satisfied: true };
472
+ }
473
+ }
474
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/unified/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAwDH,kEAAkE;AAClE,MAAM,UAAU,WAAW,CACzB,OAAkB,EAClB,OAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,kBAAkB;IAClB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,qCAAqC;IACrC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACjE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACpC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAEzB,aAAa;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,YAAY;IACZ,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,WAAW,CAAC,MAAiB,EAAE,OAA0B;IACvE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IACpC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACtB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,GAAG;gBACN,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;YAC5C,KAAK,GAAG;gBACN,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;YAC5C,KAAK,GAAG;gBACN,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AA2BD,yDAAyD;AACzD,MAAM,OAAO,iBAAiB;IACpB,IAAI,GAAG,IAAI,GAAG,EAA2B,CAAC;IAElD,GAAG,CAAC,GAAoB;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC/E,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC1D,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;CACF;AAeD,oDAAoD;AACpD,MAAM,OAAO,kBAAkB;IACrB,QAAQ,CAAoB;IAC5B,SAAS,GAA8D,EAAE,CAAC;IAElF,YAAY,QAA2B;QACrC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,iDAAiD;IACjD,MAAM,CAAC,QAA4D;QACjE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,SAAS,CAAC,MAAsB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClD,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,GAAkB,IAAI,CAAC;YAEnC,IACE,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;gBAChC,CAAC,GAAG,CAAC,QAAQ,KAAK,kBAAkB,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,CAAC,EACzE,CAAC;gBACD,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC1B,CAAC;iBAAM,IACL,GAAG,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;gBAChC,CAAC,GAAG,CAAC,QAAQ,KAAK,kBAAkB,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,CAAC,EACzE,CAAC;gBACD,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC1B,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACtC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA6CD,gCAAgC;AAChC,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD;QACE,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,MAAM;QAChB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,GAAG;QACZ,SAAS,EAAE,IAAI;KAChB;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,IAAI,EAAE,eAAe;QACrB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,GAAG;QACZ,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI;KAChB;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI;KAChB;IACD;QACE,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,IAAI;KAChB;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,GAAG;KACf;CACF,CAAC;AAEF,4DAA4D;AAC5D,MAAM,OAAO,eAAe;IAClB,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEvD,YAAY,UAA6B,gBAAgB;QACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,QAAyB;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,aAAa,CAAC,QAA0B;QACtC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CACzB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACrC,CAAC;IACJ,CAAC;CACF;AA0BD,MAAM,CAAC,MAAM,mBAAmB,GAAoB;IAClD,OAAO,EAAE,IAAI;IACb,cAAc,EAAE,IAAI;IACpB,mBAAmB,EAAE,IAAI;IACzB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,IAAI;IAChB,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,KAAK;IAC1B,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAC7B,MAAe,EACf,OAAuB,EACvB,MAAc;IAEd,IAAI,IAAI,GAAwB,IAAI,CAAC;IACrC,IAAI,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAE/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC7B,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;YAClB,QAAQ,GAAG,EAAE,CAAC;YACd,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAoBD,MAAM,CAAC,MAAM,oBAAoB,GAAuC;IACtE,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;KACpB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;KACpB;IACD,UAAU,EAAE;QACV,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;KACpB;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,EAAE;QACZ,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;KACpB;CACF,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,MAAwB;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC;IAEnD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY;YACf,OAAO;gBACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI;gBACpC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI;aACrC,CAAC;QACJ,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,wDAAwD;YACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC;YAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;YACpC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC;YACvC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,OAAO;gBACL,CAAC,EAAE,EAAE,GAAG,IAAI,GAAG,KAAK;gBACpB,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI;aAC5B,CAAC;QACJ,CAAC;QACD,KAAK,UAAU,CAAC;QAChB,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,2CAA2C;YAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC;YAC1C,MAAM,CAAC,GAAG,MAAM;gBACd,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBACzB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,MAAM;gBACd,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;gBACzD,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC5B,mBAAmB;YACnB,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7B,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;gBACvB,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YAChB,CAAC;iBAAM,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;gBACnB,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;YAChB,CAAC;YACD,gBAAgB;YAChB,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YACvF,CAAC;YACD,OAAO,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACvF,CAAC;IACH,CAAC;AACH,CAAC;AAmBD,uDAAuD;AACvD,MAAM,OAAO,YAAY;IACf,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEhD,YAAY,QAAwB;QAClC,KAAK,MAAM,CAAC,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAkB;QACpB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,aAAa,CAAC,KAAkB;QAC9B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,aAAa,CAAC,EAAU,EAAE,OAAgB;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC;YACN,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;QACtB,CAAC;IACH,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,MAAe;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC;YACN,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,SAAiB;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC;YACN,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAiCD,0DAA0D;AAC1D,MAAM,UAAU,kBAAkB,CAChC,UAA4B,EAC5B,WAAgD;IAEhD,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,OAAO,CAAc,CAAC;IACrF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,KAAK,kBAAkB;YACrB,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAEtD,KAAK,gBAAgB;YACnB,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,OAAO,EAAE,SAAS,EAAE,OAAO,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAEtD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;gBACrD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC7B,CAAC;YACD,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC9C,CAAC;QAED;YACE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * QuadTree — Spatial indexing for efficient 2D queries
3
+ *
4
+ * Used for viewport culling with large numbers of objects (1000+).
5
+ * Provides O(log n) queries for objects within a rectangular region.
6
+ */
7
+ /** Axis-aligned bounding box */
8
+ export interface Bounds {
9
+ x: number;
10
+ y: number;
11
+ width: number;
12
+ height: number;
13
+ }
14
+ /** Item stored in quadtree with bounds */
15
+ export interface QuadTreeItem<T = unknown> {
16
+ id: string;
17
+ bounds: Bounds;
18
+ data: T;
19
+ }
20
+ /**
21
+ * QuadTree for spatial indexing
22
+ */
23
+ export declare class QuadTree<T = unknown> {
24
+ private root;
25
+ private maxItems;
26
+ private itemMap;
27
+ constructor(bounds: Bounds, maxItemsPerNode?: number);
28
+ /** Insert an item into the quadtree */
29
+ insert(item: QuadTreeItem<T>): void;
30
+ /** Remove an item by ID */
31
+ remove(id: string): boolean;
32
+ /** Update an item's bounds */
33
+ update(id: string, newBounds: Bounds): boolean;
34
+ /** Query all items intersecting with the given bounds */
35
+ query(bounds: Bounds): QuadTreeItem<T>[];
36
+ /** Get all items */
37
+ getAll(): QuadTreeItem<T>[];
38
+ /** Get item by ID */
39
+ get(id: string): QuadTreeItem<T> | undefined;
40
+ /** Get total item count */
41
+ get size(): number;
42
+ /** Clear all items */
43
+ clear(): void;
44
+ /** Rebuild the quadtree (useful after many removes) */
45
+ rebuild(): void;
46
+ private insertIntoNode;
47
+ private removeFromNode;
48
+ private queryNode;
49
+ private split;
50
+ private getChildIndex;
51
+ private boundsIntersect;
52
+ }
53
+ /**
54
+ * Create a QuadTree for a floor plan with automatic bounds detection.
55
+ */
56
+ export declare function createFloorPlanQuadTree<T>(items: Array<{
57
+ id: string;
58
+ position: {
59
+ x: number;
60
+ y: number;
61
+ };
62
+ size?: {
63
+ width: number;
64
+ height: number;
65
+ };
66
+ data: T;
67
+ }>, padding?: number): QuadTree<T>;
68
+ //# sourceMappingURL=QuadTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuadTree.d.ts","sourceRoot":"","sources":["../../src/virtualization/QuadTree.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gCAAgC;AAChC,MAAM,WAAW,MAAM;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,0CAA0C;AAC1C,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;CACT;AAeD;;GAEG;AACH,qBAAa,QAAQ,CAAC,CAAC,GAAG,OAAO;IAC/B,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAsC;gBAEzC,MAAM,EAAE,MAAM,EAAE,eAAe,SAAoB;IAS/D,uCAAuC;IACvC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAKnC,2BAA2B;IAC3B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS3B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAW9C,yDAAyD;IACzD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE;IAMxC,oBAAoB;IACpB,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE;IAI3B,qBAAqB;IACrB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS;IAI5C,2BAA2B;IAC3B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,sBAAsB;IACtB,KAAK,IAAI,IAAI;IAMb,uDAAuD;IACvD,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,SAAS;IAkBjB,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,eAAe;CAKxB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,KAAK,EAAE,KAAK,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC;CACT,CAAC,EACF,OAAO,SAAM,GACZ,QAAQ,CAAC,CAAC,CAAC,CA+Cb"}