@kuraykaraaslan/kui-viewer 0.1.0 → 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 (85) hide show
  1. package/README.md +9 -1
  2. package/dist/index.js +5276 -4787
  3. package/dist/index.js.map +1 -1
  4. package/dist/libs/three-helpers/selection-highlight.d.ts +7 -1
  5. package/dist/libs/three-helpers/selection-highlight.d.ts.map +1 -1
  6. package/dist/modules/clipping/clipping.service.d.ts +33 -1
  7. package/dist/modules/clipping/clipping.service.d.ts.map +1 -1
  8. package/dist/modules/clipping/clipping.store.d.ts +1 -0
  9. package/dist/modules/clipping/clipping.store.d.ts.map +1 -1
  10. package/dist/modules/clipping/clipping.types.d.ts +1 -0
  11. package/dist/modules/clipping/clipping.types.d.ts.map +1 -1
  12. package/dist/modules/domains/bim/extensions/BimClippingExtension.d.ts +4 -0
  13. package/dist/modules/domains/bim/extensions/BimClippingExtension.d.ts.map +1 -1
  14. package/dist/modules/domains/bim/extensions/BimMeasurementExtension.d.ts.map +1 -1
  15. package/dist/modules/domains/bim/extensions/BimVisibilityExtension.d.ts.map +1 -1
  16. package/dist/modules/domains/bim/ui/BcfDialog.constants.d.ts +3 -3
  17. package/dist/modules/domains/bim/ui/BcfDialog.constants.d.ts.map +1 -1
  18. package/dist/modules/domains/bim/ui/ClippingPanel.d.ts.map +1 -1
  19. package/dist/modules/domains/bim/ui/MeasurementToolbar.d.ts +5 -1
  20. package/dist/modules/domains/bim/ui/MeasurementToolbar.d.ts.map +1 -1
  21. package/dist/modules/domains/bim/ui/VisibilityToolbar.d.ts.map +1 -1
  22. package/dist/modules/extensions/ContextMenu/ContextMenuExtension.d.ts +11 -0
  23. package/dist/modules/extensions/ContextMenu/ContextMenuExtension.d.ts.map +1 -0
  24. package/dist/modules/extensions/Horizon/HorizonExtension.d.ts.map +1 -1
  25. package/dist/modules/extensions/IotSensors/IotSensorsExtension.d.ts.map +1 -1
  26. package/dist/modules/extensions/MapTile/MapTileExtension.mesh.d.ts.map +1 -1
  27. package/dist/modules/extensions/Picking/PickingExtension.d.ts +13 -0
  28. package/dist/modules/extensions/Picking/PickingExtension.d.ts.map +1 -0
  29. package/dist/modules/extensions/Snap/SnapExtension.d.ts +7 -0
  30. package/dist/modules/extensions/Snap/SnapExtension.d.ts.map +1 -0
  31. package/dist/modules/index.viewer-core.d.ts +1 -0
  32. package/dist/modules/index.viewer-core.d.ts.map +1 -1
  33. package/dist/modules/measurement/measurement.service.d.ts +8 -1
  34. package/dist/modules/measurement/measurement.service.d.ts.map +1 -1
  35. package/dist/modules/measurement/measurement.store.d.ts +6 -0
  36. package/dist/modules/measurement/measurement.store.d.ts.map +1 -1
  37. package/dist/modules/measurement/renderer.d.ts +3 -1
  38. package/dist/modules/measurement/renderer.d.ts.map +1 -1
  39. package/dist/modules/measurement/snap.d.ts +1 -4
  40. package/dist/modules/measurement/snap.d.ts.map +1 -1
  41. package/dist/modules/ui/Button.d.ts +11 -0
  42. package/dist/modules/ui/Button.d.ts.map +1 -0
  43. package/dist/modules/ui/index.d.ts +1 -0
  44. package/dist/modules/ui/index.d.ts.map +1 -1
  45. package/dist/modules/viewer-core/context-menu/context-menu.d.ts +20 -0
  46. package/dist/modules/viewer-core/context-menu/context-menu.d.ts.map +1 -0
  47. package/dist/modules/viewer-core/helpers/helpers.d.ts.map +1 -1
  48. package/dist/modules/viewer-core/input/input-handlers.d.ts +16 -2
  49. package/dist/modules/viewer-core/input/input-handlers.d.ts.map +1 -1
  50. package/dist/modules/viewer-core/input/input-manager.d.ts +11 -0
  51. package/dist/modules/viewer-core/input/input-manager.d.ts.map +1 -1
  52. package/dist/modules/viewer-core/input/input.store.d.ts +8 -0
  53. package/dist/modules/viewer-core/input/input.store.d.ts.map +1 -1
  54. package/dist/modules/viewer-core/input/layers/snap-layer.d.ts +11 -3
  55. package/dist/modules/viewer-core/input/layers/snap-layer.d.ts.map +1 -1
  56. package/dist/modules/viewer-core/input/mouse-manager.d.ts +5 -0
  57. package/dist/modules/viewer-core/input/mouse-manager.d.ts.map +1 -1
  58. package/dist/modules/viewer-core/input/snap-glyph-renderer.d.ts +7 -0
  59. package/dist/modules/viewer-core/input/snap-glyph-renderer.d.ts.map +1 -0
  60. package/dist/modules/viewer-core/modal/drag-controller.d.ts.map +1 -1
  61. package/dist/modules/viewer-core/modal/index.d.ts +1 -0
  62. package/dist/modules/viewer-core/modal/index.d.ts.map +1 -1
  63. package/dist/modules/viewer-core/modal/modal-window.chrome.d.ts.map +1 -1
  64. package/dist/modules/viewer-core/modal/modal-window.d.ts +1 -0
  65. package/dist/modules/viewer-core/modal/modal-window.d.ts.map +1 -1
  66. package/dist/modules/viewer-core/modal/open-or-focus-modal.d.ts +3 -0
  67. package/dist/modules/viewer-core/modal/open-or-focus-modal.d.ts.map +1 -0
  68. package/dist/modules/viewer-core/modal/styles.d.ts +1 -0
  69. package/dist/modules/viewer-core/modal/styles.d.ts.map +1 -1
  70. package/dist/modules/viewer-core/picking/picking.service.d.ts +13 -0
  71. package/dist/modules/viewer-core/picking/picking.service.d.ts.map +1 -1
  72. package/dist/modules/viewer-core/viewer/viewer.d.ts +18 -0
  73. package/dist/modules/viewer-core/viewer/viewer.d.ts.map +1 -1
  74. package/dist/modules/viewer-core/viewer/viewer.render-loop.d.ts +5 -0
  75. package/dist/modules/viewer-core/viewer/viewer.render-loop.d.ts.map +1 -1
  76. package/dist/modules/viewer-core/visibility/visibility.d.ts +14 -1
  77. package/dist/modules/viewer-core/visibility/visibility.d.ts.map +1 -1
  78. package/dist/modules/viewer-core/visibility/visibility.service.d.ts +1 -1
  79. package/dist/modules/viewer-core/visibility/visibility.service.d.ts.map +1 -1
  80. package/dist/react/index.js +2348 -2155
  81. package/dist/react/index.js.map +1 -1
  82. package/dist/styles.css +127 -15
  83. package/package.json +4 -1
  84. package/dist/libs/three-helpers/clipping-gizmo.d.ts +0 -5
  85. package/dist/libs/three-helpers/clipping-gizmo.d.ts.map +0 -1
package/dist/styles.css CHANGED
@@ -30,9 +30,6 @@
30
30
  .kuiviewer\:bottom-4 {
31
31
  bottom: calc(var(--kuiviewer-spacing) * 4);
32
32
  }
33
- .kuiviewer\:left-4 {
34
- left: calc(var(--kuiviewer-spacing) * 4);
35
- }
36
33
  .kuiviewer\:z-50 {
37
34
  z-index: 50;
38
35
  }
@@ -45,12 +42,27 @@
45
42
  .kuiviewer\:mt-3 {
46
43
  margin-top: calc(var(--kuiviewer-spacing) * 3);
47
44
  }
45
+ .kuiviewer\:mt-auto {
46
+ margin-top: auto;
47
+ }
48
+ .kuiviewer\:mb-1 {
49
+ margin-bottom: calc(var(--kuiviewer-spacing) * 1);
50
+ }
48
51
  .kuiviewer\:mb-2 {
49
52
  margin-bottom: calc(var(--kuiviewer-spacing) * 2);
50
53
  }
51
54
  .kuiviewer\:mb-3 {
52
55
  margin-bottom: calc(var(--kuiviewer-spacing) * 3);
53
56
  }
57
+ .kuiviewer\:mb-4 {
58
+ margin-bottom: calc(var(--kuiviewer-spacing) * 4);
59
+ }
60
+ .kuiviewer\:ml-2 {
61
+ margin-left: calc(var(--kuiviewer-spacing) * 2);
62
+ }
63
+ .kuiviewer\:block {
64
+ display: block;
65
+ }
54
66
  .kuiviewer\:flex {
55
67
  display: flex;
56
68
  }
@@ -63,6 +75,9 @@
63
75
  .kuiviewer\:inline-flex {
64
76
  display: inline-flex;
65
77
  }
78
+ .kuiviewer\:h-1\.5 {
79
+ height: calc(var(--kuiviewer-spacing) * 1.5);
80
+ }
66
81
  .kuiviewer\:h-2 {
67
82
  height: calc(var(--kuiviewer-spacing) * 2);
68
83
  }
@@ -96,6 +111,9 @@
96
111
  .kuiviewer\:w-4 {
97
112
  width: calc(var(--kuiviewer-spacing) * 4);
98
113
  }
114
+ .kuiviewer\:w-9 {
115
+ width: calc(var(--kuiviewer-spacing) * 9);
116
+ }
99
117
  .kuiviewer\:w-10 {
100
118
  width: calc(var(--kuiviewer-spacing) * 10);
101
119
  }
@@ -105,9 +123,6 @@
105
123
  .kuiviewer\:w-20 {
106
124
  width: calc(var(--kuiviewer-spacing) * 20);
107
125
  }
108
- .kuiviewer\:w-64 {
109
- width: calc(var(--kuiviewer-spacing) * 64);
110
- }
111
126
  .kuiviewer\:w-72 {
112
127
  width: calc(var(--kuiviewer-spacing) * 72);
113
128
  }
@@ -123,6 +138,9 @@
123
138
  .kuiviewer\:max-w-\[90vw\] {
124
139
  max-width: 90vw;
125
140
  }
141
+ .kuiviewer\:min-w-\[1\.25rem\] {
142
+ min-width: 1.25rem;
143
+ }
126
144
  .kuiviewer\:flex-1 {
127
145
  flex: 1;
128
146
  }
@@ -132,9 +150,6 @@
132
150
  .kuiviewer\:animate-pulse {
133
151
  animation: var(--kuiviewer-animate-pulse);
134
152
  }
135
- .kuiviewer\:cursor-not-allowed {
136
- cursor: not-allowed;
137
- }
138
153
  .kuiviewer\:cursor-pointer {
139
154
  cursor: pointer;
140
155
  }
@@ -159,12 +174,18 @@
159
174
  .kuiviewer\:justify-between {
160
175
  justify-content: space-between;
161
176
  }
177
+ .kuiviewer\:justify-center {
178
+ justify-content: center;
179
+ }
162
180
  .kuiviewer\:justify-end {
163
181
  justify-content: flex-end;
164
182
  }
165
183
  .kuiviewer\:gap-1 {
166
184
  gap: calc(var(--kuiviewer-spacing) * 1);
167
185
  }
186
+ .kuiviewer\:gap-1\.5 {
187
+ gap: calc(var(--kuiviewer-spacing) * 1.5);
188
+ }
168
189
  .kuiviewer\:gap-2 {
169
190
  gap: calc(var(--kuiviewer-spacing) * 2);
170
191
  }
@@ -203,16 +224,39 @@
203
224
  .kuiviewer\:rounded-md {
204
225
  border-radius: var(--kuiviewer-radius-md);
205
226
  }
227
+ .kuiviewer\:rounded-none {
228
+ border-radius: 0;
229
+ }
206
230
  .kuiviewer\:border {
207
231
  border-style: var(--tw-border-style);
208
232
  border-width: 1px;
209
233
  }
234
+ .kuiviewer\:border-0 {
235
+ border-style: var(--tw-border-style);
236
+ border-width: 0px;
237
+ }
238
+ .kuiviewer\:border-t {
239
+ border-top-style: var(--tw-border-style);
240
+ border-top-width: 1px;
241
+ }
210
242
  .kuiviewer\:border-border {
211
243
  border-color: var(--kuiviewer-color-border);
212
244
  }
245
+ .kuiviewer\:border-border\/60 {
246
+ border-color: var(--kuiviewer-color-border);
247
+ @supports (color: color-mix(in lab, red, red)) {
248
+ border-color: color-mix(in oklab, var(--kuiviewer-color-border) 60%, transparent);
249
+ }
250
+ }
213
251
  .kuiviewer\:border-destructive {
214
252
  border-color: var(--kuiviewer-color-destructive);
215
253
  }
254
+ .kuiviewer\:border-destructive\/30 {
255
+ border-color: var(--kuiviewer-color-destructive);
256
+ @supports (color: color-mix(in lab, red, red)) {
257
+ border-color: color-mix(in oklab, var(--kuiviewer-color-destructive) 30%, transparent);
258
+ }
259
+ }
216
260
  .kuiviewer\:border-destructive\/40 {
217
261
  border-color: var(--kuiviewer-color-destructive);
218
262
  @supports (color: color-mix(in lab, red, red)) {
@@ -237,6 +281,9 @@
237
281
  border-color: color-mix(in oklab, var(--kuiviewer-color-status-warn) 40%, transparent);
238
282
  }
239
283
  }
284
+ .kuiviewer\:border-transparent {
285
+ border-color: transparent;
286
+ }
240
287
  .kuiviewer\:bg-background {
241
288
  background-color: var(--kuiviewer-color-background);
242
289
  }
@@ -255,6 +302,12 @@
255
302
  .kuiviewer\:bg-card {
256
303
  background-color: var(--kuiviewer-color-card);
257
304
  }
305
+ .kuiviewer\:bg-card\/40 {
306
+ background-color: var(--kuiviewer-color-card);
307
+ @supports (color: color-mix(in lab, red, red)) {
308
+ background-color: color-mix(in oklab, var(--kuiviewer-color-card) 40%, transparent);
309
+ }
310
+ }
258
311
  .kuiviewer\:bg-destructive {
259
312
  background-color: var(--kuiviewer-color-destructive);
260
313
  }
@@ -288,6 +341,9 @@
288
341
  background-color: color-mix(in oklab, var(--kuiviewer-color-status-warn) 15%, transparent);
289
342
  }
290
343
  }
344
+ .kuiviewer\:bg-transparent {
345
+ background-color: transparent;
346
+ }
291
347
  .kuiviewer\:p-2 {
292
348
  padding: calc(var(--kuiviewer-spacing) * 2);
293
349
  }
@@ -297,6 +353,9 @@
297
353
  .kuiviewer\:p-4 {
298
354
  padding: calc(var(--kuiviewer-spacing) * 4);
299
355
  }
356
+ .kuiviewer\:p-6 {
357
+ padding: calc(var(--kuiviewer-spacing) * 6);
358
+ }
300
359
  .kuiviewer\:px-1 {
301
360
  padding-inline: calc(var(--kuiviewer-spacing) * 1);
302
361
  }
@@ -327,6 +386,9 @@
327
386
  .kuiviewer\:pt-1 {
328
387
  padding-top: calc(var(--kuiviewer-spacing) * 1);
329
388
  }
389
+ .kuiviewer\:pt-3 {
390
+ padding-top: calc(var(--kuiviewer-spacing) * 3);
391
+ }
330
392
  .kuiviewer\:pb-3 {
331
393
  padding-bottom: calc(var(--kuiviewer-spacing) * 3);
332
394
  }
@@ -351,6 +413,10 @@
351
413
  .kuiviewer\:text-\[10px\] {
352
414
  font-size: 10px;
353
415
  }
416
+ .kuiviewer\:leading-relaxed {
417
+ --tw-leading: var(--kuiviewer-leading-relaxed);
418
+ line-height: var(--kuiviewer-leading-relaxed);
419
+ }
354
420
  .kuiviewer\:leading-tight {
355
421
  --tw-leading: var(--kuiviewer-leading-tight);
356
422
  line-height: var(--kuiviewer-leading-tight);
@@ -384,6 +450,9 @@
384
450
  .kuiviewer\:text-status-warn {
385
451
  color: var(--kuiviewer-color-status-warn);
386
452
  }
453
+ .kuiviewer\:text-white {
454
+ color: var(--kuiviewer-color-white);
455
+ }
387
456
  .kuiviewer\:tabular-nums {
388
457
  --tw-numeric-spacing: tabular-nums;
389
458
  font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
@@ -391,9 +460,6 @@
391
460
  .kuiviewer\:accent-primary {
392
461
  accent-color: var(--kuiviewer-color-primary);
393
462
  }
394
- .kuiviewer\:opacity-50 {
395
- opacity: 50%;
396
- }
397
463
  .kuiviewer\:shadow {
398
464
  --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
399
465
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -406,6 +472,10 @@
406
472
  --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
407
473
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
408
474
  }
475
+ .kuiviewer\:shadow-sm {
476
+ --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
477
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
478
+ }
409
479
  .kuiviewer\:shadow-xl {
410
480
  --tw-shadow: 0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
411
481
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -430,6 +500,11 @@
430
500
  transition-timing-function: var(--tw-ease, var(--kuiviewer-default-transition-timing-function));
431
501
  transition-duration: var(--tw-duration, var(--kuiviewer-default-transition-duration));
432
502
  }
503
+ .kuiviewer\:transition-colors {
504
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
505
+ transition-timing-function: var(--tw-ease, var(--kuiviewer-default-transition-timing-function));
506
+ transition-duration: var(--tw-duration, var(--kuiviewer-default-transition-duration));
507
+ }
433
508
  .kuiviewer\:duration-150 {
434
509
  --tw-duration: 150ms;
435
510
  transition-duration: 150ms;
@@ -457,12 +532,39 @@
457
532
  }
458
533
  }
459
534
  }
460
- .kuiviewer\:hover\:bg-muted-foreground\/10 {
535
+ .kuiviewer\:hover\:bg-destructive\/10 {
536
+ &:hover {
537
+ @media (hover: hover) {
538
+ background-color: var(--kuiviewer-color-destructive);
539
+ @supports (color: color-mix(in lab, red, red)) {
540
+ background-color: color-mix(in oklab, var(--kuiviewer-color-destructive) 10%, transparent);
541
+ }
542
+ }
543
+ }
544
+ }
545
+ .kuiviewer\:hover\:bg-muted {
461
546
  &:hover {
462
547
  @media (hover: hover) {
463
- background-color: var(--kuiviewer-color-muted-foreground);
548
+ background-color: var(--kuiviewer-color-muted);
549
+ }
550
+ }
551
+ }
552
+ .kuiviewer\:hover\:bg-muted\/40 {
553
+ &:hover {
554
+ @media (hover: hover) {
555
+ background-color: var(--kuiviewer-color-muted);
556
+ @supports (color: color-mix(in lab, red, red)) {
557
+ background-color: color-mix(in oklab, var(--kuiviewer-color-muted) 40%, transparent);
558
+ }
559
+ }
560
+ }
561
+ }
562
+ .kuiviewer\:hover\:bg-muted\/60 {
563
+ &:hover {
564
+ @media (hover: hover) {
565
+ background-color: var(--kuiviewer-color-muted);
464
566
  @supports (color: color-mix(in lab, red, red)) {
465
- background-color: color-mix(in oklab, var(--kuiviewer-color-muted-foreground) 10%, transparent);
567
+ background-color: color-mix(in oklab, var(--kuiviewer-color-muted) 60%, transparent);
466
568
  }
467
569
  }
468
570
  }
@@ -484,6 +586,16 @@
484
586
  outline-style: none;
485
587
  }
486
588
  }
589
+ .kuiviewer\:disabled\:cursor-not-allowed {
590
+ &:disabled {
591
+ cursor: not-allowed;
592
+ }
593
+ }
594
+ .kuiviewer\:disabled\:opacity-40 {
595
+ &:disabled {
596
+ opacity: 40%;
597
+ }
598
+ }
487
599
  }
488
600
  [data-theme="dark"] {
489
601
  --color-background: #0f172a;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kuraykaraaslan/kui-viewer",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Browser-based IFC/BIM 3D viewer built on Three.js, web-ifc and @thatopen/fragments. Ships a vanilla TypeScript API plus an optional React subpath.",
5
5
  "keywords": [
6
6
  "ifc",
@@ -75,6 +75,8 @@
75
75
  "test:core": "vitest run -c vitest.config.ts",
76
76
  "test:react": "vitest run -c vitest.config.react.ts",
77
77
  "test": "pnpm test:core && pnpm test:react",
78
+ "test:visual": "playwright test",
79
+ "test:visual:update": "playwright test --update-snapshots",
78
80
  "events:catalog": "node scripts/print-event-catalog.mjs",
79
81
  "events:catalog:check": "node scripts/print-event-catalog.mjs --check"
80
82
  },
@@ -93,6 +95,7 @@
93
95
  "zustand": "^5.0.0"
94
96
  },
95
97
  "devDependencies": {
98
+ "@playwright/test": "^1.61.1",
96
99
  "@tailwindcss/postcss": "^4.0.0",
97
100
  "@testing-library/jest-dom": "latest",
98
101
  "@testing-library/react": "^16.0.0",
@@ -1,5 +0,0 @@
1
- import type { Camera, WebGLRenderer } from "three";
2
- import { TransformControls } from "three/examples/jsm/controls/TransformControls.js";
3
- import type { Axis } from "../../modules/clipping/clipping.types";
4
- export declare function createClippingGizmo(axis: Axis, camera: Camera, renderer: WebGLRenderer): TransformControls;
5
- //# sourceMappingURL=clipping-gizmo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clipping-gizmo.d.ts","sourceRoot":"","sources":["../../../libs/three-helpers/clipping-gizmo.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAElE,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,GACtB,iBAAiB,CAUnB"}