@kteneyck/cesium-timeline-angular 0.3.0 → 0.5.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.
package/README.md CHANGED
@@ -123,7 +123,7 @@ Angular components use standalone imports — no NgModule required. Selectors: `
123
123
  - **Auto-scroll during playback** — visible window pans automatically when the needle reaches 10% from either edge.
124
124
  - **Infinite scrolling window** — timeline is not clamped to `startTime`/`endTime`; the window can pan anywhere.
125
125
  - **Adaptive tick labels** — label granularity adapts to zoom level: milliseconds → seconds → HH:MM:SS → HH:MM → Month Day → Month Year → Year. Tick dates are shown only when the visible window spans more than 24 hours.
126
- - **Local time labels** — ticks and dates reflect the user's local timezone, not UTC.
126
+ - **Configurable timezone** — tick labels and the datetime display can show any IANA timezone (e.g. `"UTC"`, `"America/New_York"`) or the browser's local time. A short abbreviation (e.g. `UTC`, `EST`, `PDT`) is displayed to the right of the date line whenever a non-local timezone is active.
127
127
  - **Netflix/Hulu-style controls** — transport buttons (⏮ ◀◀ ▶/⏸ ▶▶ ⏭) always stay centered; speed badge and LIVE button in the left column never cause layout shift.
128
128
  - **Conditional start/end buttons** — ⏮ and ⏭ are only rendered when `startTime` and `endTime` props are explicitly provided.
129
129
  - **Speed cycling** — FF cycles through `ffSpeeds` (default `2×→4×→8×→16×→32×→1×`); RW cycles through `rwSpeeds` (default `−1×→−2×→−4×→−8×→−16×→−32×`). Both arrays are fully configurable.
@@ -159,6 +159,7 @@ Angular components use standalone imports — no NgModule required. Selectors: `
159
159
  | `ffSpeeds` | `number[]` | `[2,4,8,16,32,1]` | Speed steps cycled by the ▶▶ button. Last entry wraps back to first. |
160
160
  | `rwSpeeds` | `number[]` | `[1,2,4,8,16,32]` | Absolute-value speed steps cycled by the ◀◀ button (negated internally). |
161
161
  | `dateTimeFormat` | `string` | `'MMM DD YYYY HH:mm:ss'` | Token-based format string for the controls datetime display |
162
+ | `timezone` | `string` | browser local | IANA timezone name (e.g. `'UTC'`, `'America/New_York'`) or `'local'` for the browser's timezone. Controls both tick labels and the datetime display. When set, a short abbreviation (e.g. `UTC`, `EST`) appears to the right of the date. |
162
163
  | `onDateTimeClick` | `() => void` | — | Called when the user clicks the datetime display. Use to open your own date picker. |
163
164
  | `jumpToTime` | `JulianDate \| Date` | — | Set to programmatically jump the timeline to a moment (pans canvas + sets time). |
164
165
  | `theme` | `Partial<TimelineTheme>` | `defaultTheme` | Theme overrides (merged with defaults) |
@@ -229,6 +230,60 @@ const theme = useMemo(() => {
229
230
 
230
231
  ---
231
232
 
233
+ ## Timezone
234
+
235
+ By default the timeline displays all times in the **browser's local timezone**. Pass the `timezone` prop to use UTC or any [IANA timezone](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) instead.
236
+
237
+ ```tsx
238
+ // UTC
239
+ <Timeline clock={viewer.clock} timezone="UTC" ... />
240
+
241
+ // A named IANA zone
242
+ <Timeline clock={viewer.clock} timezone="America/New_York" ... />
243
+
244
+ // Back to local (or simply omit the prop)
245
+ <Timeline clock={viewer.clock} timezone="local" ... />
246
+ ```
247
+
248
+ Both the **canvas tick labels** and the **control bar datetime display** update to reflect the chosen timezone. When a non-local timezone is active a short abbreviation (e.g. `UTC`, `EST`, `PDT`) is shown to the right of the date line. The abbreviation is DST-aware — it automatically switches between `EST` and `EDT`, `PST` and `PDT`, etc.
249
+
250
+ ### `Timezones` constants
251
+
252
+ ```tsx
253
+ import { Timezones } from '@kteneyck/cesium-timeline-react';
254
+
255
+ <Timeline timezone={Timezones.UTC} ... /> // "UTC"
256
+ <Timeline timezone={Timezones.LOCAL} ... /> // "local" (default behavior)
257
+ ```
258
+
259
+ ### `getTimezoneAbbr` utility
260
+
261
+ Returns the short abbreviation for a given date and timezone, or `null` for local.
262
+
263
+ ```tsx
264
+ import { getTimezoneAbbr } from '@kteneyck/cesium-timeline-react';
265
+
266
+ getTimezoneAbbr(new Date(), 'UTC'); // → "UTC"
267
+ getTimezoneAbbr(new Date(), 'America/Chicago'); // → "CDT" or "CST"
268
+ getTimezoneAbbr(new Date()); // → null (local)
269
+ ```
270
+
271
+ ### `formatDateTime` with timezone
272
+
273
+ The `formatDateTime` utility accepts an optional third argument:
274
+
275
+ ```tsx
276
+ import { formatDateTime, DateTimeFormats } from '@kteneyck/cesium-timeline-react';
277
+
278
+ formatDateTime(new Date(), DateTimeFormats.ISO, 'UTC');
279
+ // → "2026-02-24 14:04:07" (always in UTC regardless of local browser timezone)
280
+
281
+ formatDateTime(new Date(), DateTimeFormats.DEFAULT, 'America/Los_Angeles');
282
+ // → "Feb 24 2026 06:04:07"
283
+ ```
284
+
285
+ ---
286
+
232
287
  ## DateTime Format
233
288
 
234
289
  The `dateTimeFormat` prop controls the two-line datetime display in the control bar. It accepts a token-based format string.
@@ -385,7 +440,9 @@ import {
385
440
  ```tsx
386
441
  import {
387
442
  DateTimeFormats, // Format string presets
388
- formatDateTime, // Token-based date formatter
443
+ Timezones, // { LOCAL: 'local', UTC: 'UTC' } convenience constants
444
+ formatDateTime, // Token-based date formatter (date, format, timezone?)
445
+ getTimezoneAbbr, // Short timezone abbreviation for a date (date, timezone?)
389
446
  splitForDisplay, // Split format string into time/date parts
390
447
  toJulianDate, // Convert Date | JulianDate → JulianDate
391
448
  toDate, // Convert Date | JulianDate → Date
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { EventEmitter, ViewChild, Output, Input, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import * as Cesium from 'cesium';
4
- import { splitForDisplay, formatDateTime, MIN_SPAN_MS, MAX_SPAN_MS, drawTimeline, hitTestSwimLane, hitTestLaneLabel, isInSwimLaneRegion, zoomRange, DEFAULT_LANE_HEIGHT, LANE_GAP, totalSwimLaneHeight, TICK_AREA_HEIGHT, SWIM_LANE_SCROLL_SPEED, defaultTheme, toJulianDate } from '@kteneyck/cesium-timeline-core';
4
+ import { splitForDisplay, formatDateTime, getTimezoneAbbr, MIN_SPAN_MS, MAX_SPAN_MS, drawTimeline, hitTestSwimLane, hitTestLaneLabel, isInSwimLaneRegion, zoomRange, DEFAULT_LANE_HEIGHT, LANE_GAP, totalSwimLaneHeight, TICK_AREA_HEIGHT, SWIM_LANE_SCROLL_SPEED, defaultTheme, toJulianDate } from '@kteneyck/cesium-timeline-core';
5
5
  export * from '@kteneyck/cesium-timeline-core';
6
6
  export { TICK_AREA_HEIGHT } from '@kteneyck/cesium-timeline-core';
7
7
 
@@ -10,6 +10,7 @@ class TimelineControlsComponent {
10
10
  isPlaying = false;
11
11
  multiplier = 1;
12
12
  dateTimeFormat;
13
+ timezone;
13
14
  isLive = false;
14
15
  hasStartTime = false;
15
16
  hasEndTime = false;
@@ -36,8 +37,9 @@ class TimelineControlsComponent {
36
37
  get hasSwimLaneToggle() { return this.swimLanesVisible != null; }
37
38
  get timeFormat() { return splitForDisplay(this.dateTimeFormat).timeFormat; }
38
39
  get dateFormat() { return splitForDisplay(this.dateTimeFormat).dateFormat; }
39
- get formattedTime() { return formatDateTime(this.currentTime, this.timeFormat); }
40
- get formattedDate() { return formatDateTime(this.currentTime, this.dateFormat); }
40
+ get formattedTime() { return formatDateTime(this.currentTime, this.timeFormat, this.timezone); }
41
+ get formattedDate() { return formatDateTime(this.currentTime, this.dateFormat, this.timezone); }
42
+ get timezoneAbbr() { return getTimezoneAbbr(this.currentTime, this.timezone); }
41
43
  ngAfterViewInit() {
42
44
  const el = this.containerRef?.nativeElement;
43
45
  if (!el)
@@ -51,7 +53,7 @@ class TimelineControlsComponent {
51
53
  this.ro?.disconnect();
52
54
  }
53
55
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineControlsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
54
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineControlsComponent, isStandalone: true, selector: "ct-timeline-controls", inputs: { currentTime: "currentTime", isPlaying: "isPlaying", multiplier: "multiplier", dateTimeFormat: "dateTimeFormat", isLive: "isLive", hasStartTime: "hasStartTime", hasEndTime: "hasEndTime", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", theme: "theme", swimLanesVisible: "swimLanesVisible" }, outputs: { dateTimeClick: "dateTimeClick", playPause: "playPause", jumpToStart: "jumpToStart", rewind: "rewind", fastForward: "fastForward", jumpToEnd: "jumpToEnd", jumpToLive: "jumpToLive", resetSpeed: "resetSpeed", toggleSwimLanes: "toggleSwimLanes" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
56
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineControlsComponent, isStandalone: true, selector: "ct-timeline-controls", inputs: { currentTime: "currentTime", isPlaying: "isPlaying", multiplier: "multiplier", dateTimeFormat: "dateTimeFormat", timezone: "timezone", isLive: "isLive", hasStartTime: "hasStartTime", hasEndTime: "hasEndTime", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", theme: "theme", swimLanesVisible: "swimLanesVisible" }, outputs: { dateTimeClick: "dateTimeClick", playPause: "playPause", jumpToStart: "jumpToStart", rewind: "rewind", fastForward: "fastForward", jumpToEnd: "jumpToEnd", jumpToLive: "jumpToLive", resetSpeed: "resetSpeed", toggleSwimLanes: "toggleSwimLanes" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: `
55
57
  <div
56
58
  #container
57
59
  [style.display]="isNarrow ? 'flex' : 'grid'"
@@ -77,8 +79,16 @@ class TimelineControlsComponent {
77
79
  </div>
78
80
  }
79
81
  @if (dateFormat) {
80
- <div [style.color]="theme.buttonActiveColor" style="font-size:1.15em;letter-spacing:0.03em">
81
- {{ formattedDate }}
82
+ <div style="display:flex;align-items:center;gap:6px">
83
+ <span [style.color]="theme.buttonActiveColor" style="font-size:1.15em;letter-spacing:0.03em">
84
+ {{ formattedDate }}
85
+ </span>
86
+ @if (timezoneAbbr) {
87
+ <span
88
+ [style.color]="theme.labelColor"
89
+ style="font-size:1.04em;font-weight:bold;letter-spacing:0.04em;opacity:0.7"
90
+ >{{ timezoneAbbr }}</span>
91
+ }
82
92
  </div>
83
93
  }
84
94
  </div>
@@ -263,8 +273,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
263
273
  </div>
264
274
  }
265
275
  @if (dateFormat) {
266
- <div [style.color]="theme.buttonActiveColor" style="font-size:1.15em;letter-spacing:0.03em">
267
- {{ formattedDate }}
276
+ <div style="display:flex;align-items:center;gap:6px">
277
+ <span [style.color]="theme.buttonActiveColor" style="font-size:1.15em;letter-spacing:0.03em">
278
+ {{ formattedDate }}
279
+ </span>
280
+ @if (timezoneAbbr) {
281
+ <span
282
+ [style.color]="theme.labelColor"
283
+ style="font-size:1.04em;font-weight:bold;letter-spacing:0.04em;opacity:0.7"
284
+ >{{ timezoneAbbr }}</span>
285
+ }
268
286
  </div>
269
287
  }
270
288
  </div>
@@ -428,6 +446,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
428
446
  type: Input
429
447
  }], dateTimeFormat: [{
430
448
  type: Input
449
+ }], timezone: [{
450
+ type: Input
431
451
  }], isLive: [{
432
452
  type: Input
433
453
  }], hasStartTime: [{
@@ -479,6 +499,7 @@ class TimelineCanvasComponent {
479
499
  defaultEndMs;
480
500
  theme;
481
501
  maxTicks;
502
+ timezone;
482
503
  swimLanes;
483
504
  showSwimLanes;
484
505
  timeChange = new EventEmitter();
@@ -554,7 +575,7 @@ class TimelineCanvasComponent {
554
575
  this.draw();
555
576
  }
556
577
  }
557
- if (changes['theme'] || changes['maxTicks']) {
578
+ if (changes['theme'] || changes['maxTicks'] || changes['timezone']) {
558
579
  this.draw();
559
580
  }
560
581
  if (changes['swimLanes']) {
@@ -680,6 +701,7 @@ class TimelineCanvasComponent {
680
701
  currentMs: this.curMs,
681
702
  theme: this.theme,
682
703
  maxTicks: this.maxTicks,
704
+ timezone: this.timezone,
683
705
  swimLanes: this.swimLanesState,
684
706
  showSwimLanes: this.showSwimLanesState,
685
707
  scrollTop: this.scrollTop,
@@ -1087,7 +1109,7 @@ class TimelineCanvasComponent {
1087
1109
  }
1088
1110
  }
1089
1111
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineCanvasComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
1090
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.10", type: TimelineCanvasComponent, isStandalone: true, selector: "ct-timeline-canvas", inputs: { currentTime: "currentTime", defaultStartMs: "defaultStartMs", defaultEndMs: "defaultEndMs", theme: "theme", maxTicks: "maxTicks", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes" }, outputs: { timeChange: "timeChange", dragStart: "dragStart", dragEnd: "dragEnd", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `<canvas #canvas
1112
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.10", type: TimelineCanvasComponent, isStandalone: true, selector: "ct-timeline-canvas", inputs: { currentTime: "currentTime", defaultStartMs: "defaultStartMs", defaultEndMs: "defaultEndMs", theme: "theme", maxTicks: "maxTicks", timezone: "timezone", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes" }, outputs: { timeChange: "timeChange", dragStart: "dragStart", dragEnd: "dragEnd", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `<canvas #canvas
1091
1113
  style="width:100%;flex:1;min-height:0;display:block;cursor:default"
1092
1114
  (mousedown)="onCanvasMouseDown($event)"
1093
1115
  (mousemove)="onCanvasMouseMove($event)"
@@ -1118,6 +1140,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
1118
1140
  type: Input
1119
1141
  }], maxTicks: [{
1120
1142
  type: Input
1143
+ }], timezone: [{
1144
+ type: Input
1121
1145
  }], swimLanes: [{
1122
1146
  type: Input
1123
1147
  }], showSwimLanes: [{
@@ -1165,6 +1189,7 @@ class TimelineComponent {
1165
1189
  rwSpeeds = DEFAULT_RW_SPEEDS;
1166
1190
  theme;
1167
1191
  cssClass;
1192
+ timezone;
1168
1193
  swimLanes;
1169
1194
  showSwimLanes;
1170
1195
  swimLaneTransition = 'animated';
@@ -1404,7 +1429,7 @@ class TimelineComponent {
1404
1429
  this.cdr.markForCheck();
1405
1430
  }
1406
1431
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
1407
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineComponent, isStandalone: true, selector: "ct-timeline", inputs: { startTime: "startTime", endTime: "endTime", currentTime: "currentTime", clock: "clock", height: "height", showControls: "showControls", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", enableDrag: "enableDrag", dateTimeFormat: "dateTimeFormat", jumpToTime: "jumpToTime", maxTicks: "maxTicks", ffSpeeds: "ffSpeeds", rwSpeeds: "rwSpeeds", theme: "theme", cssClass: "cssClass", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes", swimLaneTransition: "swimLaneTransition" }, outputs: { timeChange: "timeChange", playPause: "playPause", multiplierChange: "multiplierChange", dateTimeClick: "dateTimeClick", showSwimLanesChange: "showSwimLanesChange", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasComp", first: true, predicate: TimelineCanvasComponent, descendants: true }, { propertyName: "controlsRef", first: true, predicate: ["controlsEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
1432
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: TimelineComponent, isStandalone: true, selector: "ct-timeline", inputs: { startTime: "startTime", endTime: "endTime", currentTime: "currentTime", clock: "clock", height: "height", showControls: "showControls", showJumpToStart: "showJumpToStart", showJumpToEnd: "showJumpToEnd", enableDrag: "enableDrag", dateTimeFormat: "dateTimeFormat", jumpToTime: "jumpToTime", maxTicks: "maxTicks", ffSpeeds: "ffSpeeds", rwSpeeds: "rwSpeeds", theme: "theme", cssClass: "cssClass", timezone: "timezone", swimLanes: "swimLanes", showSwimLanes: "showSwimLanes", swimLaneTransition: "swimLaneTransition" }, outputs: { timeChange: "timeChange", playPause: "playPause", multiplierChange: "multiplierChange", dateTimeClick: "dateTimeClick", showSwimLanesChange: "showSwimLanesChange", swimLaneItemClick: "swimLaneItemClick", swimLaneItemHover: "swimLaneItemHover", swimLaneItemDoubleClick: "swimLaneItemDoubleClick", swimLaneItemContextMenu: "swimLaneItemContextMenu", swimLaneReorder: "swimLaneReorder" }, viewQueries: [{ propertyName: "canvasComp", first: true, predicate: TimelineCanvasComponent, descendants: true }, { propertyName: "controlsRef", first: true, predicate: ["controlsEl"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
1408
1433
  <div
1409
1434
  [class]="cssClass"
1410
1435
  [style.width]="'100%'"
@@ -1427,6 +1452,7 @@ class TimelineComponent {
1427
1452
  [showJumpToStart]="showJumpToStart"
1428
1453
  [showJumpToEnd]="showJumpToEnd"
1429
1454
  [dateTimeFormat]="dateTimeFormat"
1455
+ [timezone]="timezone"
1430
1456
  [theme]="finalTheme"
1431
1457
  [swimLanesVisible]="hasSwimLanes ? swimLanesExpanded : undefined"
1432
1458
  (playPause)="handlePlayPause($event)"
@@ -1449,6 +1475,7 @@ class TimelineComponent {
1449
1475
  [defaultEndMs]="defaultEndMs"
1450
1476
  [theme]="finalTheme"
1451
1477
  [maxTicks]="maxTicks"
1478
+ [timezone]="timezone"
1452
1479
  [swimLanes]="swimLanes"
1453
1480
  [showSwimLanes]="swimLanesExpanded"
1454
1481
  (timeChange)="handleTimeChange($event)"
@@ -1462,7 +1489,7 @@ class TimelineComponent {
1462
1489
  />
1463
1490
  }
1464
1491
  </div>
1465
- `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: TimelineControlsComponent, selector: "ct-timeline-controls", inputs: ["currentTime", "isPlaying", "multiplier", "dateTimeFormat", "isLive", "hasStartTime", "hasEndTime", "showJumpToStart", "showJumpToEnd", "theme", "swimLanesVisible"], outputs: ["dateTimeClick", "playPause", "jumpToStart", "rewind", "fastForward", "jumpToEnd", "jumpToLive", "resetSpeed", "toggleSwimLanes"] }, { kind: "component", type: TimelineCanvasComponent, selector: "ct-timeline-canvas", inputs: ["currentTime", "defaultStartMs", "defaultEndMs", "theme", "maxTicks", "swimLanes", "showSwimLanes"], outputs: ["timeChange", "dragStart", "dragEnd", "swimLaneItemClick", "swimLaneItemHover", "swimLaneItemDoubleClick", "swimLaneItemContextMenu", "swimLaneReorder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1492
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: TimelineControlsComponent, selector: "ct-timeline-controls", inputs: ["currentTime", "isPlaying", "multiplier", "dateTimeFormat", "timezone", "isLive", "hasStartTime", "hasEndTime", "showJumpToStart", "showJumpToEnd", "theme", "swimLanesVisible"], outputs: ["dateTimeClick", "playPause", "jumpToStart", "rewind", "fastForward", "jumpToEnd", "jumpToLive", "resetSpeed", "toggleSwimLanes"] }, { kind: "component", type: TimelineCanvasComponent, selector: "ct-timeline-canvas", inputs: ["currentTime", "defaultStartMs", "defaultEndMs", "theme", "maxTicks", "timezone", "swimLanes", "showSwimLanes"], outputs: ["timeChange", "dragStart", "dragEnd", "swimLaneItemClick", "swimLaneItemHover", "swimLaneItemDoubleClick", "swimLaneItemContextMenu", "swimLaneReorder"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1466
1493
  }
1467
1494
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TimelineComponent, decorators: [{
1468
1495
  type: Component,
@@ -1489,6 +1516,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
1489
1516
  [showJumpToStart]="showJumpToStart"
1490
1517
  [showJumpToEnd]="showJumpToEnd"
1491
1518
  [dateTimeFormat]="dateTimeFormat"
1519
+ [timezone]="timezone"
1492
1520
  [theme]="finalTheme"
1493
1521
  [swimLanesVisible]="hasSwimLanes ? swimLanesExpanded : undefined"
1494
1522
  (playPause)="handlePlayPause($event)"
@@ -1511,6 +1539,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
1511
1539
  [defaultEndMs]="defaultEndMs"
1512
1540
  [theme]="finalTheme"
1513
1541
  [maxTicks]="maxTicks"
1542
+ [timezone]="timezone"
1514
1543
  [swimLanes]="swimLanes"
1515
1544
  [showSwimLanes]="swimLanesExpanded"
1516
1545
  (timeChange)="handleTimeChange($event)"
@@ -1557,6 +1586,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImpo
1557
1586
  type: Input
1558
1587
  }], cssClass: [{
1559
1588
  type: Input
1589
+ }], timezone: [{
1590
+ type: Input
1560
1591
  }], swimLanes: [{
1561
1592
  type: Input
1562
1593
  }], showSwimLanes: [{
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kteneyck-cesium-timeline-angular.mjs","sources":["../../src/lib/timeline-controls.component.ts","../../src/lib/timeline-canvas.component.ts","../../src/lib/timeline.component.ts","../../src/public-api.ts","../../src/kteneyck-cesium-timeline-angular.ts"],"sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n} from '@angular/core';\nimport * as Cesium from 'cesium';\nimport {\n type TimelineTheme,\n formatDateTime,\n getTimezoneAbbr,\n splitForDisplay,\n} from '@kteneyck/cesium-timeline-core';\n\n@Component({\n selector: 'ct-timeline-controls',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n #container\n [style.display]=\"isNarrow ? 'flex' : 'grid'\"\n [style.grid-template-columns]=\"isNarrow ? undefined : '1fr auto 1fr'\"\n [style.align-items]=\"'center'\"\n [style.padding]=\"'6px 16px'\"\n [style.background-color]=\"theme.controlBarBackground\"\n [style.border-bottom]=\"'1px solid ' + theme.controlBarBorder\"\n [style.font-family]=\"'system-ui, -apple-system, sans-serif'\"\n >\n <!-- Left: Datetime + LIVE + speed badge -->\n <div style=\"display:flex;align-items:center;gap:8px;flex-shrink:0\">\n <div\n (click)=\"dateTimeClick.emit()\"\n [title]=\"dateTimeClick.observed ? 'Click to jump to a date/time' : ''\"\n [style.color]=\"theme.labelColor\"\n style=\"font-family:monospace;line-height:1.15;border-radius:4px;padding:2px 4px;transition:background 0.15s\"\n [style.cursor]=\"dateTimeClick.observed ? 'pointer' : 'default'\"\n >\n @if (timeFormat) {\n <div style=\"font-size:2em;font-weight:bold;letter-spacing:0.02em\">\n {{ formattedTime }}\n </div>\n }\n @if (dateFormat) {\n <div style=\"display:flex;align-items:center;gap:6px\">\n <span [style.color]=\"theme.buttonActiveColor\" style=\"font-size:1.15em;letter-spacing:0.03em\">\n {{ formattedDate }}\n </span>\n @if (timezoneAbbr) {\n <span\n [style.color]=\"theme.labelColor\"\n style=\"font-size:1.04em;font-weight:bold;letter-spacing:0.04em;opacity:0.7\"\n >{{ timezoneAbbr }}</span>\n }\n </div>\n }\n </div>\n\n <div style=\"display:flex;flex-direction:column;gap:2px;justify-content:center\">\n <!-- LIVE button -->\n <button\n (click)=\"jumpToLive.emit()\"\n [style.color]=\"isLive ? theme.controlBarBackground : theme.buttonActiveColor\"\n [style.background-color]=\"isLive ? theme.buttonActiveColor : 'transparent'\"\n [style.border-color]=\"theme.buttonActiveColor\"\n [style.opacity]=\"isLive ? 1 : 0.55\"\n style=\"background:none;border:1px solid;cursor:pointer;font-size:11px;font-weight:bold;letter-spacing:0.05em;width:52px;min-width:52px;height:20px;border-radius:3px;display:flex;align-items:center;justify-content:center;padding:0;font-family:system-ui,-apple-system,sans-serif;transition:opacity 0.15s\"\n [title]=\"isLive ? 'Currently live' : 'Jump to live (now)'\"\n >\n {{ isLive ? '● LIVE' : 'LIVE' }}\n </button>\n\n <!-- Speed badge -->\n <div style=\"height:20px;display:flex;align-items:center\">\n @if (!isNormalSpeed) {\n <button\n (click)=\"resetSpeed.emit()\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '44'\"\n style=\"background:none;border:1px solid;cursor:pointer;font-size:11px;width:52px;min-width:52px;height:20px;border-radius:4px;display:flex;align-items:center;justify-content:center;padding:0;font-family:system-ui,-apple-system,sans-serif;transition:background-color 0.15s\"\n title=\"Reset to 1× speed\"\n >\n {{ isRewinding ? '◀ ' + absMultiplier + '×' : absMultiplier + '× ▶' }}\n </button>\n }\n </div>\n </div>\n </div>\n\n <!-- Center: Transport buttons -->\n <div\n style=\"display:flex;align-items:center;gap:2px\"\n [style.flex]=\"isNarrow ? '1' : undefined\"\n [style.justify-content]=\"isNarrow ? 'center' : undefined\"\n >\n @if (showJumpToStart !== false) {\n <button\n (click)=\"hasStartTime && jumpToStart.emit()\"\n [disabled]=\"!hasStartTime\"\n [style.color]=\"theme.buttonColor\"\n [style.opacity]=\"hasStartTime ? 1 : 0.3\"\n [style.cursor]=\"hasStartTime ? 'pointer' : 'default'\"\n class=\"ct-btn\"\n [title]=\"hasStartTime ? 'Jump to start' : 'No start time set'\"\n >⏮</button>\n }\n\n <button\n (click)=\"rewind.emit()\"\n [style.color]=\"isRewinding ? theme.buttonActiveColor : theme.buttonColor\"\n [style.border-color]=\"isRewinding ? theme.buttonActiveColor + '33' : 'transparent'\"\n class=\"ct-btn ct-btn-wide\"\n [title]=\"isRewinding ? 'Reverse ' + absMultiplier + '× — click to speed up' : 'Rewind'\"\n >\n @if (isRewinding) {\n <span style=\"font-size:11px;font-weight:bold\">{{ absMultiplier }}×</span>◀◀\n } @else {\n ◀◀\n }\n </button>\n\n <button\n (click)=\"playPause.emit(!isPlaying)\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '55'\"\n [style.padding-left]=\"isPlaying ? '0' : '2px'\"\n class=\"ct-btn ct-btn-play\"\n [title]=\"isPlaying ? 'Pause' : (isRewinding ? 'Play (reset to 1×)' : 'Play')\"\n >\n @if (isPlaying) {\n <svg width=\"14\" height=\"16\" viewBox=\"0 0 14 16\" fill=\"currentColor\">\n <rect x=\"1\" y=\"0\" width=\"4\" height=\"16\" rx=\"1\"/>\n <rect x=\"9\" y=\"0\" width=\"4\" height=\"16\" rx=\"1\"/>\n </svg>\n } @else {\n ▶\n }\n </button>\n\n <button\n (click)=\"fastForward.emit()\"\n [style.color]=\"isFastForward ? theme.buttonActiveColor : theme.buttonColor\"\n [style.border-color]=\"isFastForward ? theme.buttonActiveColor + '33' : 'transparent'\"\n class=\"ct-btn ct-btn-wide\"\n [title]=\"isFastForward ? absMultiplier + '× speed — click to increase' : 'Fast forward'\"\n >\n @if (isFastForward) {\n ▶▶<span style=\"font-size:11px;font-weight:bold\">{{ absMultiplier }}×</span>\n } @else {\n ▶▶\n }\n </button>\n\n @if (showJumpToEnd !== false) {\n <button\n (click)=\"hasEndTime && jumpToEnd.emit()\"\n [disabled]=\"!hasEndTime\"\n [style.color]=\"theme.buttonColor\"\n [style.opacity]=\"hasEndTime ? 1 : 0.3\"\n [style.cursor]=\"hasEndTime ? 'pointer' : 'default'\"\n class=\"ct-btn\"\n [title]=\"hasEndTime ? 'Jump to end' : 'No end time set'\"\n >⏭</button>\n }\n </div>\n\n <!-- Right: swim-lane toggle -->\n @if (!isNarrow) {\n <div style=\"display:flex;justify-content:flex-end;align-items:center\">\n @if (hasSwimLaneToggle) {\n <button\n (click)=\"toggleSwimLanes.emit()\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '33'\"\n class=\"ct-btn\"\n [title]=\"swimLanesVisible ? 'Collapse swim lanes' : 'Expand swim lanes'\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n @if (swimLanesVisible) {\n <polyline points=\"3,5 7,9 11,5\"/>\n } @else {\n <polyline points=\"3,9 7,5 11,9\"/>\n }\n </svg>\n </button>\n }\n </div>\n }\n\n @if (isNarrow && hasSwimLaneToggle) {\n <button\n (click)=\"toggleSwimLanes.emit()\"\n [style.color]=\"theme.buttonActiveColor\"\n [style.border-color]=\"theme.buttonActiveColor + '33'\"\n class=\"ct-btn\"\n style=\"margin-left:4px\"\n [title]=\"swimLanesVisible ? 'Collapse swim lanes' : 'Expand swim lanes'\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n @if (swimLanesVisible) {\n <polyline points=\"3,5 7,9 11,5\"/>\n } @else {\n <polyline points=\"3,9 7,5 11,9\"/>\n }\n </svg>\n </button>\n }\n </div>\n `,\n styles: [`\n :host { display: block; }\n .ct-btn {\n background: none;\n border: 1px solid transparent;\n cursor: pointer;\n font-size: 16px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n width: 32px;\n height: 32px;\n border-radius: 4px;\n transition: background-color 0.15s, color 0.15s;\n font-family: system-ui, -apple-system, sans-serif;\n flex-shrink: 0;\n line-height: 1;\n }\n .ct-btn:hover { background-color: rgba(255,255,255,0.1); }\n .ct-btn-wide { width: 64px; min-width: 64px; gap: 3px; }\n .ct-btn-play {\n font-size: 18px;\n width: 40px;\n min-width: 40px;\n height: 40px;\n border-radius: 50%;\n }\n `],\n})\nexport class TimelineControlsComponent implements AfterViewInit, OnDestroy {\n @Input() currentTime!: Cesium.JulianDate;\n @Input() isPlaying = false;\n @Input() multiplier = 1;\n @Input() dateTimeFormat?: string;\n @Input() timezone?: string;\n @Input() isLive = false;\n @Input() hasStartTime = false;\n @Input() hasEndTime = false;\n @Input() showJumpToStart?: boolean;\n @Input() showJumpToEnd?: boolean;\n @Input() theme!: TimelineTheme;\n @Input() swimLanesVisible?: boolean;\n\n @Output() dateTimeClick = new EventEmitter<void>();\n @Output() playPause = new EventEmitter<boolean>();\n @Output() jumpToStart = new EventEmitter<void>();\n @Output() rewind = new EventEmitter<void>();\n @Output() fastForward = new EventEmitter<void>();\n @Output() jumpToEnd = new EventEmitter<void>();\n @Output() jumpToLive = new EventEmitter<void>();\n @Output() resetSpeed = new EventEmitter<void>();\n @Output() toggleSwimLanes = new EventEmitter<void>();\n\n @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n\n isNarrow = false;\n private ro?: ResizeObserver;\n\n get isRewinding(): boolean { return this.multiplier < 0; }\n get isFastForward(): boolean { return this.multiplier > 1; }\n get isNormalSpeed(): boolean { return this.multiplier === 1; }\n get absMultiplier(): number { return Math.abs(this.multiplier); }\n get hasSwimLaneToggle(): boolean { return this.swimLanesVisible != null; }\n\n get timeFormat(): string { return splitForDisplay(this.dateTimeFormat).timeFormat; }\n get dateFormat(): string { return splitForDisplay(this.dateTimeFormat).dateFormat; }\n get formattedTime(): string { return formatDateTime(this.currentTime, this.timeFormat, this.timezone); }\n get formattedDate(): string { return formatDateTime(this.currentTime, this.dateFormat, this.timezone); }\n get timezoneAbbr(): string | null { return getTimezoneAbbr(this.currentTime, this.timezone); }\n\n ngAfterViewInit(): void {\n const el = this.containerRef?.nativeElement;\n if (!el) return;\n this.ro = new ResizeObserver(([entry]) => {\n this.isNarrow = entry.contentRect.width < 520;\n });\n this.ro.observe(el);\n }\n\n ngOnDestroy(): void {\n this.ro?.disconnect();\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n NgZone,\n} from '@angular/core';\nimport * as Cesium from 'cesium';\nimport {\n type TimelineTheme,\n type SwimLane,\n type SwimLaneItem,\n type SwimLaneEventInfo,\n type ReorderState,\n DEFAULT_LANE_HEIGHT,\n TICK_AREA_HEIGHT,\n LANE_GAP,\n SWIM_LANE_SCROLL_SPEED,\n MIN_SPAN_MS,\n MAX_SPAN_MS,\n drawTimeline,\n hitTestSwimLane as coreHitTestSwimLane,\n hitTestLaneLabel as coreHitTestLaneLabel,\n isInSwimLaneRegion as coreIsInSwimLaneRegion,\n zoomRange,\n totalSwimLaneHeight,\n} from '@kteneyck/cesium-timeline-core';\n\nexport { TICK_AREA_HEIGHT };\n\n/**\n * TimelineCanvasComponent – Angular wrapper around the core canvas rendering engine.\n *\n * All mutable state lives as class properties (equivalent to React refs) — no\n * change detection cycles are triggered from drawing or mouse handlers.\n * The core drawTimeline() function handles all rendering.\n */\n@Component({\n selector: 'ct-timeline-canvas',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<canvas #canvas\n style=\"width:100%;flex:1;min-height:0;display:block;cursor:default\"\n (mousedown)=\"onCanvasMouseDown($event)\"\n (mousemove)=\"onCanvasMouseMove($event)\"\n (click)=\"onCanvasClick($event)\"\n (dblclick)=\"onCanvasDblClick($event)\"\n (contextmenu)=\"onCanvasContextMenu($event)\"\n (mouseleave)=\"onCanvasMouseLeave()\"\n ></canvas>`,\n styles: [`:host { display: flex; flex: 1; min-height: 0; }`],\n})\nexport class TimelineCanvasComponent implements AfterViewInit, OnChanges, OnDestroy {\n @Input() currentTime!: Cesium.JulianDate;\n @Input() defaultStartMs!: number;\n @Input() defaultEndMs!: number;\n @Input() theme!: TimelineTheme;\n @Input() maxTicks?: number;\n @Input() timezone?: string;\n @Input() swimLanes?: SwimLane[];\n @Input() showSwimLanes?: boolean;\n\n @Output() timeChange = new EventEmitter<Cesium.JulianDate>();\n @Output() dragStart = new EventEmitter<void>();\n @Output() dragEnd = new EventEmitter<void>();\n @Output() swimLaneItemClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemHover = new EventEmitter<SwimLaneEventInfo | null>();\n @Output() swimLaneItemDoubleClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemContextMenu = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneReorder = new EventEmitter<string[]>();\n\n @ViewChild('canvas') canvasRef!: ElementRef<HTMLCanvasElement>;\n\n // ── Mutable render state (equivalent to React refs) ────────────────────\n private startMs = 0;\n private endMs = 0;\n private curMs = 0;\n private scrollTop = 0;\n private swimLanesState: SwimLane[] = [];\n private showSwimLanesState = false;\n private hoveredItem: { lane: SwimLane; item: SwimLaneItem } | null = null;\n private reorderState: ReorderState | null = null;\n\n // Mouse state\n private mouseMode: 'none' | 'scrub' | 'slide' | 'zoom' = 'none';\n private mouseX = 0;\n private scrubClientX = 0;\n private swimLaneDownTime = 0;\n\n // Touch state\n private touchMode: 'none' | 'scrub' | 'slide' | 'pinch' = 'none';\n private touchX = 0;\n private pinchDist = 0;\n\n // Edge-scroll animation\n private edgeRAF: number | null = null;\n\n // Follow-scroll (playback auto-scroll)\n private followRAF: number | null = null;\n private following = false;\n private followRate = 0;\n\n private ro?: ResizeObserver;\n\n // Bound handlers for cleanup\n private boundMouseMove = this.onDocMouseMove.bind(this);\n private boundMouseUp = this.onDocMouseUp.bind(this);\n private boundTouchStart = this.onTouchStart.bind(this);\n private boundTouchMove = this.onTouchMove.bind(this);\n private boundTouchEnd = this.onTouchEnd.bind(this);\n private boundWheel = this.onWheel.bind(this);\n\n constructor(private ngZone: NgZone) {}\n\n // ── Lifecycle ──────────────────────────────────────────────────────────\n\n ngAfterViewInit(): void {\n this.startMs = this.defaultStartMs;\n this.endMs = this.defaultEndMs;\n this.curMs = Cesium.JulianDate.toDate(this.currentTime).getTime();\n this.swimLanesState = this.swimLanes ?? [];\n this.showSwimLanesState = this.showSwimLanes ?? (this.swimLanesState.length > 0);\n\n // Run outside Angular zone for performance — no change detection on draw/mouse\n this.ngZone.runOutsideAngular(() => {\n this.draw();\n\n const canvas = this.canvasRef.nativeElement;\n this.ro = new ResizeObserver(() => this.draw());\n this.ro.observe(canvas);\n\n document.addEventListener('mousemove', this.boundMouseMove);\n document.addEventListener('mouseup', this.boundMouseUp);\n canvas.addEventListener('wheel', this.boundWheel, { passive: false });\n canvas.addEventListener('touchstart', this.boundTouchStart, { passive: false });\n canvas.addEventListener('touchmove', this.boundTouchMove, { passive: false });\n canvas.addEventListener('touchend', this.boundTouchEnd, { passive: false });\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['currentTime'] && !this.following) {\n const newMs = Cesium.JulianDate.toDate(this.currentTime).getTime();\n if (this.curMs !== newMs) {\n this.curMs = newMs;\n this.draw();\n }\n }\n if (changes['theme'] || changes['maxTicks'] || changes['timezone']) {\n this.draw();\n }\n if (changes['swimLanes']) {\n this.swimLanesState = this.swimLanes ?? [];\n this.draw();\n }\n if (changes['showSwimLanes']) {\n this.showSwimLanesState = this.showSwimLanes ?? (this.swimLanesState.length > 0);\n this.draw();\n }\n }\n\n ngOnDestroy(): void {\n this.ro?.disconnect();\n document.removeEventListener('mousemove', this.boundMouseMove);\n document.removeEventListener('mouseup', this.boundMouseUp);\n\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) {\n canvas.removeEventListener('wheel', this.boundWheel);\n canvas.removeEventListener('touchstart', this.boundTouchStart);\n canvas.removeEventListener('touchmove', this.boundTouchMove);\n canvas.removeEventListener('touchend', this.boundTouchEnd);\n }\n\n if (this.edgeRAF !== null) cancelAnimationFrame(this.edgeRAF);\n if (this.followRAF !== null) cancelAnimationFrame(this.followRAF);\n }\n\n // ── Public API (called by parent via ViewChild) ────────────────────────\n\n zoomTo(startMs: number, endMs: number, currentMs?: number): void {\n const span = Math.max(MIN_SPAN_MS, Math.min(MAX_SPAN_MS, endMs - startMs));\n const center = (startMs + endMs) / 2;\n this.startMs = center - span / 2;\n this.endMs = center + span / 2;\n if (currentMs !== undefined) this.curMs = currentMs;\n this.draw();\n }\n\n getVisibleRange(): { startMs: number; endMs: number } {\n return { startMs: this.startMs, endMs: this.endMs };\n }\n\n startFollow(rate: number): void {\n this.followRate = rate;\n if (this.followRAF !== null) return;\n this.following = true;\n let lastTime = performance.now();\n\n const scroll = () => {\n const now = performance.now();\n const dt = now - lastTime;\n lastTime = now;\n const shift = dt * this.followRate;\n this.startMs += shift;\n this.endMs += shift;\n this.curMs += shift;\n this.draw();\n this.followRAF = requestAnimationFrame(scroll);\n };\n this.followRAF = requestAnimationFrame(scroll);\n }\n\n stopFollow(): void {\n this.following = false;\n if (this.followRAF !== null) {\n cancelAnimationFrame(this.followRAF);\n this.followRAF = null;\n }\n }\n\n correctFollow(currentMs: number): void {\n if (!this.following) return;\n const drift = currentMs - this.curMs;\n this.curMs = currentMs;\n this.startMs += drift;\n this.endMs += drift;\n }\n\n appendSwimLane(lane: SwimLane): void {\n this.swimLanesState = [...this.swimLanesState, lane];\n this.draw();\n }\n\n updateSwimLane(id: string, updates: Partial<SwimLane>): void {\n this.swimLanesState = this.swimLanesState.map(l =>\n l.id === id ? { ...l, ...updates, id: l.id } : l\n );\n this.draw();\n }\n\n removeSwimLane(id: string): void {\n this.swimLanesState = this.swimLanesState.filter(l => l.id !== id);\n this.draw();\n }\n\n reorderSwimLanes(orderedIds: string[]): void {\n const byId = new Map(this.swimLanesState.map(l => [l.id, l]));\n const reordered: SwimLane[] = [];\n for (const id of orderedIds) {\n const lane = byId.get(id);\n if (lane) reordered.push(lane);\n }\n this.swimLanesState = reordered;\n this.draw();\n }\n\n // ── Core draw ──────────────────────────────────────────────────────────\n\n private draw(): void {\n const canvas = this.canvasRef?.nativeElement;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const rect = canvas.getBoundingClientRect();\n const w = rect.width;\n const h = rect.height;\n if (w === 0 || h === 0) return;\n\n const dpr = window.devicePixelRatio || 1;\n const physW = Math.round(w * dpr);\n const physH = Math.round(h * dpr);\n if (canvas.width !== physW || canvas.height !== physH) {\n canvas.width = physW;\n canvas.height = physH;\n }\n\n ctx.save();\n ctx.scale(dpr, dpr);\n\n const clampedScrollTop = drawTimeline(ctx, w, h, {\n startMs: this.startMs,\n endMs: this.endMs,\n currentMs: this.curMs,\n theme: this.theme,\n maxTicks: this.maxTicks,\n timezone: this.timezone,\n swimLanes: this.swimLanesState,\n showSwimLanes: this.showSwimLanesState,\n scrollTop: this.scrollTop,\n reorderState: this.reorderState,\n });\n\n if (clampedScrollTop !== this.scrollTop) {\n this.scrollTop = clampedScrollTop;\n }\n\n ctx.restore();\n }\n\n // ── Hit testing (delegates to core) ────────────────────────────────────\n\n private hitTestSwimLane(x: number, y: number, w: number, h: number) {\n return coreHitTestSwimLane(x, y, w, h, {\n startMs: this.startMs, endMs: this.endMs,\n theme: this.theme,\n swimLanes: this.swimLanesState, showSwimLanes: this.showSwimLanesState,\n scrollTop: this.scrollTop,\n });\n }\n\n private hitTestLaneLabel(x: number, y: number, h: number) {\n return coreHitTestLaneLabel(x, y, h, {\n swimLanes: this.swimLanesState, showSwimLanes: this.showSwimLanesState,\n scrollTop: this.scrollTop,\n });\n }\n\n private isInSwimLaneRegion(y: number, h: number): boolean {\n return coreIsInSwimLaneRegion(y, h, {\n swimLanes: this.swimLanesState, showSwimLanes: this.showSwimLanesState,\n });\n }\n\n // ── Zoom helper ────────────────────────────────────────────────────────\n\n private zoomFrom(amount: number): void {\n const result = zoomRange(this.startMs, this.endMs, amount);\n this.startMs = result.startMs;\n this.endMs = result.endMs;\n this.draw();\n }\n\n // ── Edge scroll ────────────────────────────────────────────────────────\n\n private startEdgeScroll(direction: -1 | 1): void {\n if (this.edgeRAF !== null) return;\n const scroll = () => {\n const canvas = this.canvasRef?.nativeElement;\n const span = this.endMs - this.startMs;\n const shift = direction * span * 0.01;\n this.startMs += shift;\n this.endMs += shift;\n\n if (canvas) {\n const rect = canvas.getBoundingClientRect();\n const cx = Math.max(0, Math.min(rect.width, this.scrubClientX - rect.left));\n const ms = this.startMs + (cx / rect.width) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n }\n\n this.draw();\n this.edgeRAF = requestAnimationFrame(scroll);\n };\n this.edgeRAF = requestAnimationFrame(scroll);\n }\n\n private stopEdgeScroll(): void {\n if (this.edgeRAF !== null) {\n cancelAnimationFrame(this.edgeRAF);\n this.edgeRAF = null;\n }\n }\n\n private getTouchDist(a: Touch, b: Touch): number {\n return Math.hypot(b.clientX - a.clientX, b.clientY - a.clientY);\n }\n\n // ── Mouse handlers (template-bound) ────────────────────────────────────\n\n onCanvasMouseDown(e: MouseEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n // Reorder drag on lane label\n if (e.button === 0 && this.swimLaneReorder.observed) {\n const labelLane = this.hitTestLaneLabel(x, y, rect.height);\n if (labelLane) {\n const lanes = this.swimLanesState;\n const dragIdx = lanes.findIndex(l => l.id === labelLane.id);\n this.reorderState = {\n dragging: true,\n dragLaneId: labelLane.id,\n dragStartY: e.clientY,\n currentY: e.clientY,\n insertIndex: dragIdx,\n };\n canvas.style.cursor = 'grabbing';\n return;\n }\n }\n\n // Swim lane item click detection\n if (e.button === 0 && this.isInSwimLaneRegion(y, rect.height)) {\n const needleX = ((this.curMs - this.startMs) / (this.endMs - this.startMs)) * rect.width;\n const nearNeedle = Math.abs(x - needleX) <= 10;\n if (!nearNeedle) {\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit) {\n this.swimLaneDownTime = performance.now();\n return;\n }\n }\n }\n\n if (e.button === 0) {\n this.mouseMode = 'scrub';\n this.scrubClientX = e.clientX;\n canvas.style.cursor = 'grabbing';\n this.ngZone.run(() => this.dragStart.emit());\n const ms = this.startMs + (x / rect.width) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n } else if (e.button === 1) {\n this.mouseMode = 'slide';\n this.mouseX = e.clientX;\n } else if (e.button === 2) {\n if (this.swimLaneItemContextMenu.observed && this.isInSwimLaneRegion(y, rect.height)) return;\n this.mouseMode = 'zoom';\n this.mouseX = e.clientX;\n }\n }\n\n private onDocMouseMove(e: MouseEvent): void {\n // Reorder drag\n const rs = this.reorderState;\n if (rs && rs.dragging) {\n rs.currentY = e.clientY;\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) {\n const rect = canvas.getBoundingClientRect();\n const canvasY = e.clientY - rect.top;\n let y = -this.scrollTop;\n const lanes = this.swimLanesState;\n let idx = lanes.length;\n for (let i = 0; i < lanes.length; i++) {\n const laneH = lanes[i].height ?? DEFAULT_LANE_HEIGHT;\n const mid = y + laneH / 2;\n if (canvasY < mid) { idx = i; break; }\n y += laneH + LANE_GAP;\n }\n rs.insertIndex = idx;\n }\n this.draw();\n return;\n }\n\n if (this.mouseMode === 'none') return;\n const canvas = this.canvasRef?.nativeElement;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const w = rect.width;\n\n if (this.mouseMode === 'scrub') {\n this.scrubClientX = e.clientX;\n const x = e.clientX - rect.left;\n const edge = w * 0.08;\n if (x < edge) this.startEdgeScroll(-1);\n else if (x > w - edge) this.startEdgeScroll(1);\n else this.stopEdgeScroll();\n const cx = Math.max(0, Math.min(w, x));\n const ms = this.startMs + (cx / w) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n } else if (this.mouseMode === 'slide') {\n const dx = this.mouseX - e.clientX;\n this.mouseX = e.clientX;\n if (dx !== 0) {\n const shift = (dx / w) * (this.endMs - this.startMs);\n this.startMs += shift;\n this.endMs += shift;\n this.draw();\n }\n } else if (this.mouseMode === 'zoom') {\n const dx = this.mouseX - e.clientX;\n this.mouseX = e.clientX;\n if (dx !== 0) this.zoomFrom(Math.pow(1.01, dx));\n }\n }\n\n private onDocMouseUp(): void {\n // Finish reorder drag\n const rs = this.reorderState;\n if (rs && rs.dragging) {\n const dragDistance = Math.abs(rs.currentY - rs.dragStartY);\n const lanes = this.swimLanesState;\n const dragIdx = lanes.findIndex(l => l.id === rs.dragLaneId);\n if (dragDistance > 5 && dragIdx >= 0 && rs.insertIndex !== dragIdx && rs.insertIndex !== dragIdx + 1) {\n const newLanes = [...lanes];\n const [removed] = newLanes.splice(dragIdx, 1);\n const insertAt = rs.insertIndex > dragIdx ? rs.insertIndex - 1 : rs.insertIndex;\n newLanes.splice(insertAt, 0, removed);\n this.swimLanesState = newLanes;\n this.ngZone.run(() => this.swimLaneReorder.emit(newLanes.map(l => l.id)));\n }\n this.reorderState = null;\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) canvas.style.cursor = 'default';\n this.draw();\n return;\n }\n\n this.stopEdgeScroll();\n this.mouseMode = 'none';\n const canvas = this.canvasRef?.nativeElement;\n if (canvas) canvas.style.cursor = 'default';\n this.ngZone.run(() => this.dragEnd.emit());\n }\n\n onCanvasMouseMove(e: MouseEvent): void {\n if (this.mouseMode !== 'none') return;\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const needleX = ((this.curMs - this.startMs) / (this.endMs - this.startMs)) * rect.width;\n const nearNeedle = Math.abs(x - needleX) <= 10;\n\n if (this.isInSwimLaneRegion(y, rect.height)) {\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n const prev = this.hoveredItem;\n if (hit) {\n canvas.style.cursor = nearNeedle ? 'grab' : 'pointer';\n if (!prev || prev.item.id !== hit.item.id || prev.lane.id !== hit.lane.id) {\n this.hoveredItem = hit;\n this.ngZone.run(() =>\n this.swimLaneItemHover.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n this.draw();\n }\n } else {\n if (prev) {\n this.hoveredItem = null;\n this.ngZone.run(() => this.swimLaneItemHover.emit(null));\n this.draw();\n }\n if (nearNeedle) {\n canvas.style.cursor = 'grab';\n } else {\n const labelLane = this.hitTestLaneLabel(x, y, rect.height);\n canvas.style.cursor = labelLane && this.swimLaneReorder.observed ? 'grab' : 'default';\n }\n }\n return;\n }\n\n if (this.hoveredItem) {\n this.hoveredItem = null;\n this.ngZone.run(() => this.swimLaneItemHover.emit(null));\n this.draw();\n }\n\n canvas.style.cursor = nearNeedle ? 'grab' : 'default';\n }\n\n onCanvasClick(e: MouseEvent): void {\n const elapsed = performance.now() - this.swimLaneDownTime;\n if (elapsed > 300) return;\n\n const rect = (e.target as HTMLCanvasElement).getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit) {\n this.ngZone.run(() =>\n this.swimLaneItemClick.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n }\n }\n\n onCanvasDblClick(e: MouseEvent): void {\n const rect = (e.target as HTMLCanvasElement).getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit) {\n this.ngZone.run(() =>\n this.swimLaneItemDoubleClick.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n }\n }\n\n onCanvasContextMenu(e: MouseEvent): void {\n const rect = (e.target as HTMLCanvasElement).getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const hit = this.hitTestSwimLane(x, y, rect.width, rect.height);\n if (hit && this.swimLaneItemContextMenu.observed) {\n e.preventDefault();\n this.ngZone.run(() =>\n this.swimLaneItemContextMenu.emit({ laneId: hit.lane.id, item: hit.item, originalEvent: e })\n );\n } else {\n e.preventDefault();\n }\n }\n\n onCanvasMouseLeave(): void {\n if (this.hoveredItem) {\n this.hoveredItem = null;\n this.ngZone.run(() => this.swimLaneItemHover.emit(null));\n this.draw();\n }\n const canvas = this.canvasRef?.nativeElement;\n if (this.mouseMode === 'none' && canvas) canvas.style.cursor = 'default';\n }\n\n // ── Wheel handler ──────────────────────────────────────────────────────\n\n private onWheel(e: WheelEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef?.nativeElement;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const y = e.clientY - rect.top;\n\n if (this.isInSwimLaneRegion(y, rect.height)) {\n const lanes = this.swimLanesState;\n const totalH = totalSwimLaneHeight(lanes);\n const laneRegionH = Math.max(0, rect.height - TICK_AREA_HEIGHT);\n const maxScroll = Math.max(0, totalH - laneRegionH);\n if (maxScroll > 0) {\n this.scrollTop = Math.max(0, Math.min(maxScroll, this.scrollTop + e.deltaY * SWIM_LANE_SCROLL_SPEED));\n this.draw();\n return;\n }\n }\n\n this.zoomFrom(Math.pow(1.05, e.deltaY > 0 ? -1 : 1));\n }\n\n // ── Touch handlers ─────────────────────────────────────────────────────\n\n private onTouchStart(e: TouchEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n\n if (e.touches.length === 1) {\n const x = e.touches[0].clientX - rect.left;\n const cx = Math.max(0, Math.min(rect.width, x));\n const ms = this.startMs + (cx / rect.width) * (this.endMs - this.startMs);\n this.touchMode = 'scrub';\n this.touchX = e.touches[0].clientX;\n this.scrubClientX = e.touches[0].clientX;\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => {\n this.dragStart.emit();\n this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms)));\n });\n } else if (e.touches.length >= 2) {\n this.touchMode = 'pinch';\n this.pinchDist = this.getTouchDist(e.touches[0], e.touches[1]);\n }\n }\n\n private onTouchMove(e: TouchEvent): void {\n e.preventDefault();\n const canvas = this.canvasRef.nativeElement;\n const rect = canvas.getBoundingClientRect();\n\n if (this.touchMode === 'scrub' && e.touches.length >= 1) {\n const x = e.touches[0].clientX - rect.left;\n const edge = rect.width * 0.08;\n this.scrubClientX = e.touches[0].clientX;\n\n if (x < edge) {\n this.startEdgeScroll(-1);\n } else if (x > rect.width - edge) {\n this.startEdgeScroll(1);\n } else {\n this.stopEdgeScroll();\n const cx = Math.max(0, Math.min(rect.width, x));\n const ms = this.startMs + (cx / rect.width) * (this.endMs - this.startMs);\n this.curMs = ms;\n this.draw();\n this.ngZone.run(() => this.timeChange.emit(Cesium.JulianDate.fromDate(new Date(ms))));\n }\n } else if (this.touchMode === 'slide' && e.touches.length >= 1) {\n const dx = this.touchX - e.touches[0].clientX;\n this.touchX = e.touches[0].clientX;\n if (dx !== 0) {\n const shift = (dx / rect.width) * (this.endMs - this.startMs);\n this.startMs += shift;\n this.endMs += shift;\n this.draw();\n }\n } else if (this.touchMode === 'pinch' && e.touches.length >= 2) {\n const newDist = this.getTouchDist(e.touches[0], e.touches[1]);\n if (newDist > 0 && this.pinchDist > 0) {\n this.zoomFrom(this.pinchDist / newDist);\n }\n this.pinchDist = newDist;\n }\n }\n\n private onTouchEnd(e: TouchEvent): void {\n this.stopEdgeScroll();\n if (this.touchMode === 'scrub') {\n this.ngZone.run(() => this.dragEnd.emit());\n }\n\n if (e.touches.length === 0) {\n this.touchMode = 'none';\n } else if (e.touches.length === 1) {\n this.touchMode = 'slide';\n this.touchX = e.touches[0].clientX;\n }\n }\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnInit,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n NgZone,\n} from '@angular/core';\nimport * as Cesium from 'cesium';\nimport {\n type TimelineTheme,\n type SwimLane,\n type SwimLaneEventInfo,\n defaultTheme,\n toJulianDate,\n TICK_AREA_HEIGHT,\n} from '@kteneyck/cesium-timeline-core';\nimport { TimelineControlsComponent } from './timeline-controls.component';\nimport { TimelineCanvasComponent } from './timeline-canvas.component';\n\nconst DEFAULT_FF_SPEEDS = [2, 4, 8, 16, 32, 100, 1];\nconst DEFAULT_RW_SPEEDS = [1, 2, 4, 8, 16, 32, 100];\n\n@Component({\n selector: 'ct-timeline',\n standalone: true,\n imports: [TimelineControlsComponent, TimelineCanvasComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n [class]=\"cssClass\"\n [style.width]=\"'100%'\"\n [style.height]=\"heightStyle\"\n [style.overflow]=\"'hidden'\"\n [style.display]=\"'flex'\"\n [style.flex-direction]=\"'column'\"\n [style.font-family]=\"'system-ui, -apple-system, sans-serif'\"\n [style.transition]=\"swimLaneTransition === 'animated' ? 'height 0.2s ease' : undefined\"\n >\n @if (showControls) {\n <div #controlsEl>\n <ct-timeline-controls\n [currentTime]=\"currentTimeState\"\n [isPlaying]=\"isPlayingState\"\n [multiplier]=\"multiplierState\"\n [isLive]=\"isLive\"\n [hasStartTime]=\"startTime != null\"\n [hasEndTime]=\"endTime != null\"\n [showJumpToStart]=\"showJumpToStart\"\n [showJumpToEnd]=\"showJumpToEnd\"\n [dateTimeFormat]=\"dateTimeFormat\"\n [timezone]=\"timezone\"\n [theme]=\"finalTheme\"\n [swimLanesVisible]=\"hasSwimLanes ? swimLanesExpanded : undefined\"\n (playPause)=\"handlePlayPause($event)\"\n (jumpToStart)=\"handleJumpToStart()\"\n (rewind)=\"handleRewindSpeed()\"\n (fastForward)=\"handleFastForward()\"\n (jumpToEnd)=\"handleJumpToEnd()\"\n (jumpToLive)=\"handleJumpToLive()\"\n (resetSpeed)=\"applyMultiplier(1)\"\n (dateTimeClick)=\"dateTimeClick.emit()\"\n (toggleSwimLanes)=\"handleToggleSwimLanes()\"\n />\n </div>\n }\n\n @if (enableDrag !== false) {\n <ct-timeline-canvas\n [currentTime]=\"currentTimeState\"\n [defaultStartMs]=\"defaultStartMs\"\n [defaultEndMs]=\"defaultEndMs\"\n [theme]=\"finalTheme\"\n [maxTicks]=\"maxTicks\"\n [timezone]=\"timezone\"\n [swimLanes]=\"swimLanes\"\n [showSwimLanes]=\"swimLanesExpanded\"\n (timeChange)=\"handleTimeChange($event)\"\n (dragStart)=\"isDragging = true\"\n (dragEnd)=\"isDragging = false\"\n (swimLaneItemClick)=\"swimLaneItemClick.emit($event)\"\n (swimLaneItemHover)=\"swimLaneItemHover.emit($event)\"\n (swimLaneItemDoubleClick)=\"swimLaneItemDoubleClick.emit($event)\"\n (swimLaneItemContextMenu)=\"swimLaneItemContextMenu.emit($event)\"\n (swimLaneReorder)=\"swimLaneReorder.emit($event)\"\n />\n }\n </div>\n `,\n styles: [`:host { display: block; }`],\n})\nexport class TimelineComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n // ── Inputs ─────────────────────────────────────────────────────────────\n @Input() startTime?: Cesium.JulianDate | Date;\n @Input() endTime?: Cesium.JulianDate | Date;\n @Input() currentTime?: Cesium.JulianDate | Date;\n @Input() clock?: Cesium.Clock;\n @Input() height?: number;\n @Input() showControls = true;\n @Input() showJumpToStart?: boolean;\n @Input() showJumpToEnd?: boolean;\n @Input() enableDrag = true;\n @Input() dateTimeFormat?: string;\n @Input() jumpToTime?: Cesium.JulianDate | Date;\n @Input() maxTicks?: number;\n @Input() ffSpeeds: number[] = DEFAULT_FF_SPEEDS;\n @Input() rwSpeeds: number[] = DEFAULT_RW_SPEEDS;\n @Input() theme?: Partial<TimelineTheme>;\n @Input() cssClass?: string;\n @Input() timezone?: string;\n @Input() swimLanes?: SwimLane[];\n @Input() showSwimLanes?: boolean;\n @Input() swimLaneTransition: 'animated' | 'instant' = 'animated';\n\n // ── Outputs ────────────────────────────────────────────────────────────\n @Output() timeChange = new EventEmitter<Cesium.JulianDate>();\n @Output() playPause = new EventEmitter<boolean>();\n @Output() multiplierChange = new EventEmitter<number>();\n @Output() dateTimeClick = new EventEmitter<void>();\n @Output() showSwimLanesChange = new EventEmitter<boolean>();\n @Output() swimLaneItemClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemHover = new EventEmitter<SwimLaneEventInfo | null>();\n @Output() swimLaneItemDoubleClick = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneItemContextMenu = new EventEmitter<SwimLaneEventInfo>();\n @Output() swimLaneReorder = new EventEmitter<string[]>();\n\n // ── ViewChild refs ─────────────────────────────────────────────────────\n @ViewChild(TimelineCanvasComponent) canvasComp?: TimelineCanvasComponent;\n @ViewChild('controlsEl') controlsRef?: ElementRef<HTMLDivElement>;\n\n // ── Internal state ─────────────────────────────────────────────────────\n currentTimeState!: Cesium.JulianDate;\n isPlayingState = false;\n multiplierState = 1;\n swimLanesExpanded = true;\n controlsHeight = 0;\n isDragging = false;\n defaultStartMs = 0;\n defaultEndMs = 0;\n finalTheme: TimelineTheme = { ...defaultTheme };\n\n private ro?: ResizeObserver;\n private clockCleanup?: () => void;\n private fallbackInterval?: ReturnType<typeof setInterval>;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private ngZone: NgZone,\n ) {}\n\n get hasSwimLanes(): boolean {\n return this.swimLanes != null && this.swimLanes.length > 0;\n }\n\n get isLive(): boolean {\n return Math.abs(Cesium.JulianDate.toDate(this.currentTimeState).getTime() - Date.now()) < 10_000;\n }\n\n get isCollapsed(): boolean {\n return this.hasSwimLanes && !this.swimLanesExpanded;\n }\n\n get heightStyle(): string {\n if (this.isCollapsed) return `${this.controlsHeight + TICK_AREA_HEIGHT}px`;\n if (this.height != null) return `${this.height}px`;\n return '100%';\n }\n\n // ── Lifecycle ──────────────────────────────────────────────────────────\n\n ngOnInit(): void {\n const now = Date.now();\n this.defaultStartMs = this.startTime\n ? Cesium.JulianDate.toDate(toJulianDate(this.startTime)).getTime()\n : now - 12 * 3600 * 1000;\n this.defaultEndMs = this.endTime\n ? Cesium.JulianDate.toDate(toJulianDate(this.endTime)).getTime()\n : now + 12 * 3600 * 1000;\n\n this.currentTimeState = toJulianDate(\n this.currentTime ?? (this.startTime ?? Cesium.JulianDate.fromDate(new Date()))\n );\n this.isPlayingState = this.clock?.shouldAnimate ?? false;\n this.multiplierState = this.clock?.multiplier ?? 1;\n this.swimLanesExpanded = this.showSwimLanes ?? true;\n this.finalTheme = { ...defaultTheme, ...this.theme };\n }\n\n ngAfterViewInit(): void {\n const el = this.controlsRef?.nativeElement;\n if (el) {\n this.ro = new ResizeObserver(([entry]) => {\n this.controlsHeight = entry.borderBoxSize[0].blockSize;\n this.cdr.markForCheck();\n });\n this.ro.observe(el);\n }\n\n // Clock sync\n this.setupClockSync();\n\n this.cdr.detectChanges();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['theme']) {\n this.finalTheme = { ...defaultTheme, ...this.theme };\n }\n if (changes['showSwimLanes'] && this.showSwimLanes != null) {\n this.swimLanesExpanded = this.showSwimLanes;\n }\n if (changes['clock'] && !changes['clock'].firstChange) {\n this.cleanupClockSync();\n this.setupClockSync();\n }\n if (changes['jumpToTime'] && this.jumpToTime) {\n const t = toJulianDate(this.jumpToTime);\n this.handleTimeChange(t);\n if (this.canvasComp) {\n const { startMs, endMs } = this.canvasComp.getVisibleRange();\n const span = endMs - startMs;\n const newMs = Cesium.JulianDate.toDate(t).getTime();\n this.canvasComp.zoomTo(newMs - span / 2, newMs + span / 2);\n }\n }\n }\n\n ngOnDestroy(): void {\n this.cleanupClockSync();\n this.ro?.disconnect();\n if (this.fallbackInterval) clearInterval(this.fallbackInterval);\n }\n\n // ── Clock sync ─────────────────────────────────────────────────────────\n\n private setupClockSync(): void {\n if (this.clock) {\n const onTick = () => {\n if (this.isDragging) return;\n const ct = Cesium.JulianDate.clone(this.clock!.currentTime);\n this.currentTimeState = ct;\n this.isPlayingState = this.clock!.shouldAnimate;\n this.multiplierState = this.clock!.multiplier;\n\n if (this.canvasComp) {\n const { startMs, endMs } = this.canvasComp.getVisibleRange();\n const span = endMs - startMs;\n const ctMs = Cesium.JulianDate.toDate(ct).getTime();\n const pos = ctMs - startMs;\n if (pos <= span * 0.1) {\n this.canvasComp.zoomTo(ctMs - span * 0.1, ctMs + span * 0.9, ctMs);\n } else if (pos >= span * 0.9) {\n this.canvasComp.zoomTo(ctMs - span * 0.9, ctMs + span * 0.1, ctMs);\n }\n }\n this.cdr.markForCheck();\n };\n this.clock.onTick.addEventListener(onTick);\n this.clockCleanup = () => this.clock!.onTick.removeEventListener(onTick);\n } else {\n this.ngZone.runOutsideAngular(() => {\n this.fallbackInterval = setInterval(() => {\n if (this.isDragging) return;\n const ct = Cesium.JulianDate.fromDate(new Date());\n this.currentTimeState = ct;\n if (this.canvasComp) {\n const { startMs, endMs } = this.canvasComp.getVisibleRange();\n const span = endMs - startMs;\n const ctMs = Cesium.JulianDate.toDate(ct).getTime();\n const pos = ctMs - startMs;\n if (pos <= span * 0.1) this.canvasComp.zoomTo(ctMs - span * 0.1, ctMs + span * 0.9, ctMs);\n else if (pos >= span * 0.9) this.canvasComp.zoomTo(ctMs - span * 0.9, ctMs + span * 0.1, ctMs);\n }\n this.ngZone.run(() => this.cdr.markForCheck());\n }, 1000);\n });\n }\n }\n\n private cleanupClockSync(): void {\n this.clockCleanup?.();\n this.clockCleanup = undefined;\n if (this.fallbackInterval) {\n clearInterval(this.fallbackInterval);\n this.fallbackInterval = undefined;\n }\n }\n\n // ── Handlers ───────────────────────────────────────────────────────────\n\n handleTimeChange(t: Cesium.JulianDate): void {\n this.currentTimeState = t;\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.timeChange.emit(t);\n this.cdr.markForCheck();\n }\n\n handlePlayPause(playing: boolean): void {\n if (playing && this.multiplierState < 0) {\n this.applyMultiplier(1, false);\n }\n if (this.clock) this.clock.shouldAnimate = playing;\n this.isPlayingState = playing;\n this.playPause.emit(playing);\n this.cdr.markForCheck();\n }\n\n handleFastForward(): void {\n const speeds = this.ffSpeeds.length > 0 ? this.ffSpeeds : DEFAULT_FF_SPEEDS;\n const cur = this.multiplierState > 1 ? this.multiplierState : 1;\n const idx = speeds.indexOf(cur);\n const next = speeds[idx < 0 || idx === speeds.length - 1 ? 0 : idx + 1];\n this.applyMultiplier(next);\n }\n\n handleRewindSpeed(): void {\n const speeds = this.rwSpeeds.length > 0 ? this.rwSpeeds : DEFAULT_RW_SPEEDS;\n const curAbs = this.multiplierState < 0 ? Math.abs(this.multiplierState) : 0;\n const idx = speeds.indexOf(curAbs);\n const next = -(speeds[idx < 0 || idx === speeds.length - 1 ? 0 : idx + 1]);\n this.applyMultiplier(next);\n }\n\n handleJumpToStart(): void {\n const t = toJulianDate(this.startTime ?? Cesium.JulianDate.fromDate(new Date(this.defaultStartMs)));\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.currentTimeState = t;\n this.canvasComp?.zoomTo(this.defaultStartMs, this.defaultEndMs);\n this.cdr.markForCheck();\n }\n\n handleJumpToEnd(): void {\n const t = toJulianDate(this.endTime ?? Cesium.JulianDate.fromDate(new Date(this.defaultEndMs)));\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.currentTimeState = t;\n this.canvasComp?.zoomTo(this.defaultStartMs, this.defaultEndMs);\n this.cdr.markForCheck();\n }\n\n handleJumpToLive(): void {\n const t = Cesium.JulianDate.fromDate(new Date());\n if (this.clock) this.clock.currentTime = Cesium.JulianDate.clone(t);\n this.currentTimeState = t;\n this.applyMultiplier(1);\n const nowMs = Date.now();\n this.canvasComp?.zoomTo(nowMs - 12 * 3600 * 1000, nowMs + 12 * 3600 * 1000);\n this.cdr.markForCheck();\n }\n\n handleToggleSwimLanes(): void {\n this.swimLanesExpanded = !this.swimLanesExpanded;\n this.showSwimLanesChange.emit(this.swimLanesExpanded);\n this.cdr.markForCheck();\n }\n\n applyMultiplier(m: number, play = true): void {\n if (this.clock) { this.clock.multiplier = m; if (play) this.clock.shouldAnimate = true; }\n this.multiplierState = m;\n if (play) this.isPlayingState = true;\n this.multiplierChange.emit(m);\n this.cdr.markForCheck();\n }\n}\n","// Components\nexport { TimelineComponent } from './lib/timeline.component';\nexport { TimelineCanvasComponent, TICK_AREA_HEIGHT } from './lib/timeline-canvas.component';\nexport { TimelineControlsComponent } from './lib/timeline-controls.component';\n\n// Re-export core types and utilities\nexport * from '@kteneyck/cesium-timeline-core';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["coreHitTestSwimLane","coreHitTestLaneLabel","coreIsInSwimLaneRegion"],"mappings":";;;;;;;MAqPa,yBAAyB,CAAA;AAC3B,IAAA,WAAW;IACX,SAAS,GAAG,KAAK;IACjB,UAAU,GAAG,CAAC;AACd,IAAA,cAAc;AACd,IAAA,QAAQ;IACR,MAAM,GAAG,KAAK;IACd,YAAY,GAAG,KAAK;IACpB,UAAU,GAAG,KAAK;AAClB,IAAA,eAAe;AACf,IAAA,aAAa;AACb,IAAA,KAAK;AACL,IAAA,gBAAgB;AAEf,IAAA,aAAa,GAAG,IAAI,YAAY,EAAQ;AACxC,IAAA,SAAS,GAAG,IAAI,YAAY,EAAW;AACvC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;AACtC,IAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AACjC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;AACtC,IAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;AACpC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,eAAe,GAAG,IAAI,YAAY,EAAQ;AAE5B,IAAA,YAAY;IAEpC,QAAQ,GAAG,KAAK;AACR,IAAA,EAAE;IAEV,IAAI,WAAW,GAAA,EAAc,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACzD,IAAI,aAAa,GAAA,EAAc,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC3D,IAAI,aAAa,GAAA,EAAc,OAAO,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC;AAC7D,IAAA,IAAI,aAAa,GAAA,EAAa,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAChE,IAAI,iBAAiB,GAAA,EAAc,OAAO,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC;AAEzE,IAAA,IAAI,UAAU,GAAA,EAAa,OAAO,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC;AACnF,IAAA,IAAI,UAAU,GAAA,EAAa,OAAO,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC;AACnF,IAAA,IAAI,aAAa,GAAA,EAAa,OAAO,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvG,IAAA,IAAI,aAAa,GAAA,EAAa,OAAO,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvG,IAAA,IAAI,YAAY,GAAA,EAAoB,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE7F,eAAe,GAAA;AACb,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa;AAC3C,QAAA,IAAI,CAAC,EAAE;YAAE;QACT,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,KAAI;YACvC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,GAAG;AAC/C,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACrB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE;IACvB;wGApDW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA9N1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8LT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,ugBAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAgCU,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAlOrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,cACpB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8LT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,ugBAAA,CAAA,EAAA;;sBAiCA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA,SAAS;uBAAC,WAAW;;;ACxOxB;;;;;;AAMG;MAgBU,uBAAuB,CAAA;AA4Dd,IAAA,MAAA;AA3DX,IAAA,WAAW;AACX,IAAA,cAAc;AACd,IAAA,YAAY;AACZ,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,aAAa;AAEZ,IAAA,UAAU,GAAG,IAAI,YAAY,EAAqB;AAClD,IAAA,SAAS,GAAG,IAAI,YAAY,EAAQ;AACpC,IAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;AAClC,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAAqB;AACzD,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAA4B;AAChE,IAAA,uBAAuB,GAAG,IAAI,YAAY,EAAqB;AAC/D,IAAA,uBAAuB,GAAG,IAAI,YAAY,EAAqB;AAC/D,IAAA,eAAe,GAAG,IAAI,YAAY,EAAY;AAEnC,IAAA,SAAS;;IAGtB,OAAO,GAAG,CAAC;IACX,KAAK,GAAG,CAAC;IACT,KAAK,GAAG,CAAC;IACT,SAAS,GAAG,CAAC;IACb,cAAc,GAAe,EAAE;IAC/B,kBAAkB,GAAG,KAAK;IAC1B,WAAW,GAAkD,IAAI;IACjE,YAAY,GAAwB,IAAI;;IAGxC,SAAS,GAAwC,MAAM;IACvD,MAAM,GAAG,CAAC;IACV,YAAY,GAAG,CAAC;IAChB,gBAAgB,GAAG,CAAC;;IAGpB,SAAS,GAAyC,MAAM;IACxD,MAAM,GAAG,CAAC;IACV,SAAS,GAAG,CAAC;;IAGb,OAAO,GAAkB,IAAI;;IAG7B,SAAS,GAAkB,IAAI;IAC/B,SAAS,GAAG,KAAK;IACjB,UAAU,GAAG,CAAC;AAEd,IAAA,EAAE;;IAGF,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/C,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3C,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5C,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1C,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAE5C,IAAA,WAAA,CAAoB,MAAc,EAAA;QAAd,IAAA,CAAA,MAAM,GAAN,MAAM;IAAW;;IAIrC,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc;AAClC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY;AAC9B,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;QACjE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE;AAC1C,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;;AAGhF,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;YACjC,IAAI,CAAC,IAAI,EAAE;AAEX,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa;AAC3C,YAAA,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAC/C,YAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;YAEvB,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;YAC3D,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;AACvD,YAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACrE,YAAA,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC/E,YAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC7E,YAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC7E,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AAC7C,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;AAClE,YAAA,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;AACxB,gBAAA,IAAI,CAAC,KAAK,GAAG,KAAK;gBAClB,IAAI,CAAC,IAAI,EAAE;YACb;QACF;AACA,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE;YAClE,IAAI,CAAC,IAAI,EAAE;QACb;AACA,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE;YAC1C,IAAI,CAAC,IAAI,EAAE;QACb;AACA,QAAA,IAAI,OAAO,CAAC,eAAe,CAAC,EAAE;AAC5B,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YAChF,IAAI,CAAC,IAAI,EAAE;QACb;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE;QACrB,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;QAC9D,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;AAE1D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;QAC5C,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC;YACpD,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC;YAC9D,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;YAC5D,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;QAC5D;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;AAC7D,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;AAAE,YAAA,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;IACnE;;AAIA,IAAA,MAAM,CAAC,OAAe,EAAE,KAAa,EAAE,SAAkB,EAAA;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,CAAC,OAAO,GAAG,KAAK,IAAI,CAAC;QACpC,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,CAAC;QAC9B,IAAI,SAAS,KAAK,SAAS;AAAE,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS;QACnD,IAAI,CAAC,IAAI,EAAE;IACb;IAEA,eAAe,GAAA;AACb,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;IACrD;AAEA,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;YAAE;AAC7B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAEhC,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAC7B,YAAA,MAAM,EAAE,GAAG,GAAG,GAAG,QAAQ;YACzB,QAAQ,GAAG,GAAG;AACd,YAAA,MAAM,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU;AAClC,YAAA,IAAI,CAAC,OAAO,IAAI,KAAK;AACrB,YAAA,IAAI,CAAC,KAAK,IAAI,KAAK;AACnB,YAAA,IAAI,CAAC,KAAK,IAAI,KAAK;YACnB,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC;AAChD,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAChD;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE;AAC3B,YAAA,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;AACpC,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACvB;IACF;AAEA,IAAA,aAAa,CAAC,SAAiB,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AACrB,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK;AACpC,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS;AACtB,QAAA,IAAI,CAAC,OAAO,IAAI,KAAK;AACrB,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK;IACrB;AAEA,IAAA,cAAc,CAAC,IAAc,EAAA;QAC3B,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE;IACb;IAEA,cAAc,CAAC,EAAU,EAAE,OAA0B,EAAA;AACnD,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAC7C,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CACjD;QACD,IAAI,CAAC,IAAI,EAAE;IACb;AAEA,IAAA,cAAc,CAAC,EAAU,EAAA;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAClE,IAAI,CAAC,IAAI,EAAE;IACb;AAEA,IAAA,gBAAgB,CAAC,UAAoB,EAAA;QACnC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAe,EAAE;AAChC,QAAA,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACzB,YAAA,IAAI,IAAI;AAAE,gBAAA,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC;AACA,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;QAC/B,IAAI,CAAC,IAAI,EAAE;IACb;;IAIQ,IAAI,GAAA;AACV,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,GAAG;YAAE;AAEV,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;AACpB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE;AAExB,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;AACjC,QAAA,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE;AACrD,YAAA,MAAM,CAAC,KAAK,GAAG,KAAK;AACpB,YAAA,MAAM,CAAC,MAAM,GAAG,KAAK;QACvB;QAEA,GAAG,CAAC,IAAI,EAAE;AACV,QAAA,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;QAEnB,MAAM,gBAAgB,GAAG,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE;YAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,KAAK;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,cAAc;YAC9B,aAAa,EAAE,IAAI,CAAC,kBAAkB;YACtC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;AAChC,SAAA,CAAC;AAEF,QAAA,IAAI,gBAAgB,KAAK,IAAI,CAAC,SAAS,EAAE;AACvC,YAAA,IAAI,CAAC,SAAS,GAAG,gBAAgB;QACnC;QAEA,GAAG,CAAC,OAAO,EAAE;IACf;;AAIQ,IAAA,eAAe,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;QAChE,OAAOA,eAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YACrC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;YACxC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,kBAAkB;YACtE,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,SAAA,CAAC;IACJ;AAEQ,IAAA,gBAAgB,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAA;AACtD,QAAA,OAAOC,gBAAoB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YACnC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,kBAAkB;YACtE,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,SAAA,CAAC;IACJ;IAEQ,kBAAkB,CAAC,CAAS,EAAE,CAAS,EAAA;AAC7C,QAAA,OAAOC,kBAAsB,CAAC,CAAC,EAAE,CAAC,EAAE;YAClC,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,EAAE,IAAI,CAAC,kBAAkB;AACvE,SAAA,CAAC;IACJ;;AAIQ,IAAA,QAAQ,CAAC,MAAc,EAAA;AAC7B,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;AAC1D,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;AAC7B,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;QACzB,IAAI,CAAC,IAAI,EAAE;IACb;;AAIQ,IAAA,eAAe,CAAC,SAAiB,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI;YAAE;QAC3B,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;YAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO;AACtC,YAAA,MAAM,KAAK,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI;AACrC,YAAA,IAAI,CAAC,OAAO,IAAI,KAAK;AACrB,YAAA,IAAI,CAAC,KAAK,IAAI,KAAK;YAEnB,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;gBAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3E,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;AACzE,gBAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvF;YAEA,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC;AAC9C,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,OAAO,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAC9C;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE;AACzB,YAAA,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC;AAClC,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;IACF;IAEQ,YAAY,CAAC,CAAQ,EAAE,CAAQ,EAAA;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IACjE;;AAIA,IAAA,iBAAiB,CAAC,CAAa,EAAA;QAC7B,CAAC,CAAC,cAAc,EAAE;AAClB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa;AAC3C,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;;AAG9B,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE;AACnD,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;YAC1D,IAAI,SAAS,EAAE;AACb,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;AACjC,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;gBAC3D,IAAI,CAAC,YAAY,GAAG;AAClB,oBAAA,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE,SAAS,CAAC,EAAE;oBACxB,UAAU,EAAE,CAAC,CAAC,OAAO;oBACrB,QAAQ,EAAE,CAAC,CAAC,OAAO;AACnB,oBAAA,WAAW,EAAE,OAAO;iBACrB;AACD,gBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU;gBAChC;YACF;QACF;;AAGA,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;YAC7D,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK;AACxF,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE;YAC9C,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;gBAC/D,IAAI,GAAG,EAAE;AACP,oBAAA,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;oBACzC;gBACF;YACF;QACF;AAEA,QAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,OAAO;AAC7B,YAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU;AAChC,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;AACxE,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;YACf,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvF;AAAO,aAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;AACxB,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;QACzB;AAAO,aAAA,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;gBAAE;AACtF,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM;AACvB,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;QACzB;IACF;AAEQ,IAAA,cAAc,CAAC,CAAa,EAAA;;AAElC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY;AAC5B,QAAA,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE;AACrB,YAAA,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO;AACvB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;YAC5C,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;gBAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AACpC,gBAAA,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS;AACvB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;AACjC,gBAAA,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM;AACtB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACrC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,mBAAmB;AACpD,oBAAA,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;AACzB,oBAAA,IAAI,OAAO,GAAG,GAAG,EAAE;wBAAE,GAAG,GAAG,CAAC;wBAAE;oBAAO;AACrC,oBAAA,CAAC,IAAI,KAAK,GAAG,QAAQ;gBACvB;AACA,gBAAA,EAAE,CAAC,WAAW,GAAG,GAAG;YACtB;YACA,IAAI,CAAC,IAAI,EAAE;YACX;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM;YAAE;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC3C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;AAEpB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE;AAC9B,YAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,OAAO;YAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;AAC/B,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI;YACrB,IAAI,CAAC,GAAG,IAAI;AAAE,gBAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AACjC,iBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AAAE,gBAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;;gBACzC,IAAI,CAAC,cAAc,EAAE;AAC1B,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;AAChE,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;YACf,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvF;AAAO,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;AAClC,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;AACvB,YAAA,IAAI,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;AACpD,gBAAA,IAAI,CAAC,OAAO,IAAI,KAAK;AACrB,gBAAA,IAAI,CAAC,KAAK,IAAI,KAAK;gBACnB,IAAI,CAAC,IAAI,EAAE;YACb;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;AAClC,YAAA,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO;YACvB,IAAI,EAAE,KAAK,CAAC;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjD;IACF;IAEQ,YAAY,GAAA;;AAElB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY;AAC5B,QAAA,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE;AACrB,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC;AAC1D,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;AACjC,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC;YAC5D,IAAI,YAAY,GAAG,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,KAAK,OAAO,IAAI,EAAE,CAAC,WAAW,KAAK,OAAO,GAAG,CAAC,EAAE;AACpG,gBAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC;AAC3B,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,GAAG,OAAO,GAAG,EAAE,CAAC,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW;gBAC/E,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,CAAC;AACrC,gBAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;AAC9B,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3E;AACA,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;AAC5C,YAAA,IAAI,MAAM;AAAE,gBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;YAC3C,IAAI,CAAC,IAAI,EAAE;YACX;QACF;QAEA,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM;AACvB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;AAC5C,QAAA,IAAI,MAAM;AAAE,YAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC5C;AAEA,IAAA,iBAAiB,CAAC,CAAa,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM;YAAE;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa;AAC3C,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;QAE9B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK;AACxF,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE;QAE9C,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;AAC3C,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAC/D,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW;YAC7B,IAAI,GAAG,EAAE;AACP,gBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS;gBACrD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE;AACzE,oBAAA,IAAI,CAAC,WAAW,GAAG,GAAG;AACtB,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CACvF;oBACD,IAAI,CAAC,IAAI,EAAE;gBACb;YACF;iBAAO;gBACL,IAAI,IAAI,EAAE;AACR,oBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxD,IAAI,CAAC,IAAI,EAAE;gBACb;gBACA,IAAI,UAAU,EAAE;AACd,oBAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;gBAC9B;qBAAO;AACL,oBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC;oBAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,GAAG,MAAM,GAAG,SAAS;gBACvF;YACF;YACA;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE;QACb;AAEA,QAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS;IACvD;AAEA,IAAA,aAAa,CAAC,CAAa,EAAA;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB;QACzD,IAAI,OAAO,GAAG,GAAG;YAAE;QAEnB,MAAM,IAAI,GAAI,CAAC,CAAC,MAA4B,CAAC,qBAAqB,EAAE;QACpE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QAC/D,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CACvF;QACH;IACF;AAEA,IAAA,gBAAgB,CAAC,CAAa,EAAA;QAC5B,MAAM,IAAI,GAAI,CAAC,CAAC,MAA4B,CAAC,qBAAqB,EAAE;QACpE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QAC/D,IAAI,GAAG,EAAE;AACP,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAC7F;QACH;IACF;AAEA,IAAA,mBAAmB,CAAC,CAAa,EAAA;QAC/B,MAAM,IAAI,GAAI,CAAC,CAAC,MAA4B,CAAC,qBAAqB,EAAE;QACpE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QAC/D,IAAI,GAAG,IAAI,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE;YAChD,CAAC,CAAC,cAAc,EAAE;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MACd,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAC7F;QACH;aAAO;YACL,CAAC,CAAC,cAAc,EAAE;QACpB;IACF;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE;QACb;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;AAC5C,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,MAAM;AAAE,YAAA,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;IAC1E;;AAIQ,IAAA,OAAO,CAAC,CAAa,EAAA;QAC3B,CAAC,CAAC,cAAc,EAAE;AAClB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa;AAC5C,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG;QAE9B,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;AAC3C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc;AACjC,YAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC;AACzC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC;AAC/D,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;AACnD,YAAA,IAAI,SAAS,GAAG,CAAC,EAAE;gBACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,MAAM,GAAG,sBAAsB,CAAC,CAAC;gBACrG,IAAI,CAAC,IAAI,EAAE;gBACX;YACF;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD;;AAIQ,IAAA,YAAY,CAAC,CAAa,EAAA;QAChC,CAAC,CAAC,cAAc,EAAE;AAClB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa;AAC3C,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;QAE3C,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;AAC1C,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;AACzE,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;YACxB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;YAClC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AACxC,YAAA,IAAI,CAAC,KAAK,GAAG,EAAE;YACf,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;AACnB,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAChE,YAAA,CAAC,CAAC;QACJ;aAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;YACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChE;IACF;AAEQ,IAAA,WAAW,CAAC,CAAa,EAAA;QAC/B,CAAC,CAAC,cAAc,EAAE;AAClB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa;AAC3C,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAE3C,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AACvD,YAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;AAC1C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI;YAC9B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AAExC,YAAA,IAAI,CAAC,GAAG,IAAI,EAAE;AACZ,gBAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1B;iBAAO,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE;AAChC,gBAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACzB;iBAAO;gBACL,IAAI,CAAC,cAAc,EAAE;AACrB,gBAAA,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;AACzE,gBAAA,IAAI,CAAC,KAAK,GAAG,EAAE;gBACf,IAAI,CAAC,IAAI,EAAE;AACX,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvF;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AAC9D,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;YAC7C,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AAClC,YAAA,IAAI,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,MAAM,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;AAC7D,gBAAA,IAAI,CAAC,OAAO,IAAI,KAAK;AACrB,gBAAA,IAAI,CAAC,KAAK,IAAI,KAAK;gBACnB,IAAI,CAAC,IAAI,EAAE;YACb;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;YAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;gBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC;YACzC;AACA,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;QAC1B;IACF;AAEQ,IAAA,UAAU,CAAC,CAAa,EAAA;QAC9B,IAAI,CAAC,cAAc,EAAE;AACrB,QAAA,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE;AAC9B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5C;QAEA,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,GAAG,MAAM;QACzB;aAAO,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,SAAS,GAAG,OAAO;YACxB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;QACpC;IACF;wGAzpBW,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAXxB,CAAA;;;;;;;;AAQC,YAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,2CAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGA,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAfnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,CAAA;;;;;;;;AAQC,YAAA,CAAA,EAAA,MAAA,EAAA,CAAA,2CAAA,CAAA,EAAA;;sBAIV;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA,SAAS;uBAAC,QAAQ;;;AClDrB,MAAM,iBAAiB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AACnD,MAAM,iBAAiB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;MAsEtC,iBAAiB,CAAA;AAuDlB,IAAA,GAAA;AACA,IAAA,MAAA;;AAtDD,IAAA,SAAS;AACT,IAAA,OAAO;AACP,IAAA,WAAW;AACX,IAAA,KAAK;AACL,IAAA,MAAM;IACN,YAAY,GAAG,IAAI;AACnB,IAAA,eAAe;AACf,IAAA,aAAa;IACb,UAAU,GAAG,IAAI;AACjB,IAAA,cAAc;AACd,IAAA,UAAU;AACV,IAAA,QAAQ;IACR,QAAQ,GAAa,iBAAiB;IACtC,QAAQ,GAAa,iBAAiB;AACtC,IAAA,KAAK;AACL,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,aAAa;IACb,kBAAkB,GAA2B,UAAU;;AAGtD,IAAA,UAAU,GAAG,IAAI,YAAY,EAAqB;AAClD,IAAA,SAAS,GAAG,IAAI,YAAY,EAAW;AACvC,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU;AAC7C,IAAA,aAAa,GAAG,IAAI,YAAY,EAAQ;AACxC,IAAA,mBAAmB,GAAG,IAAI,YAAY,EAAW;AACjD,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAAqB;AACzD,IAAA,iBAAiB,GAAG,IAAI,YAAY,EAA4B;AAChE,IAAA,uBAAuB,GAAG,IAAI,YAAY,EAAqB;AAC/D,IAAA,uBAAuB,GAAG,IAAI,YAAY,EAAqB;AAC/D,IAAA,eAAe,GAAG,IAAI,YAAY,EAAY;;AAGpB,IAAA,UAAU;AACrB,IAAA,WAAW;;AAGpC,IAAA,gBAAgB;IAChB,cAAc,GAAG,KAAK;IACtB,eAAe,GAAG,CAAC;IACnB,iBAAiB,GAAG,IAAI;IACxB,cAAc,GAAG,CAAC;IAClB,UAAU,GAAG,KAAK;IAClB,cAAc,GAAG,CAAC;IAClB,YAAY,GAAG,CAAC;AAChB,IAAA,UAAU,GAAkB,EAAE,GAAG,YAAY,EAAE;AAEvC,IAAA,EAAE;AACF,IAAA,YAAY;AACZ,IAAA,gBAAgB;IAExB,WAAA,CACU,GAAsB,EACtB,MAAc,EAAA;QADd,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;AAEH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;IAC5D;AAEA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM;IAClG;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,iBAAiB;IACrD;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,IAAI,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,GAAG,IAAI,CAAC,cAAc,GAAG,gBAAgB,IAAI;AAC1E,QAAA,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;AAAE,YAAA,OAAO,CAAA,EAAG,IAAI,CAAC,MAAM,IAAI;AAClD,QAAA,OAAO,MAAM;IACf;;IAIA,QAAQ,GAAA;AACN,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;AACzB,cAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;cAC9D,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACvB,cAAE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;cAC5D,GAAG,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;QAE1B,IAAI,CAAC,gBAAgB,GAAG,YAAY,CAClC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAC/E;QACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,KAAK;QACxD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC;QAClD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI;AACnD,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;IACtD;IAEA,eAAe,GAAA;AACb,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa;QAC1C,IAAI,EAAE,EAAE;YACN,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,KAAI;gBACvC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;AACtD,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACrB;;QAGA,IAAI,CAAC,cAAc,EAAE;AAErB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;AACpB,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;QACtD;QACA,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;AAC1D,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,aAAa;QAC7C;AACA,QAAA,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;YACrD,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,cAAc,EAAE;QACvB;QACA,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;YAC5C,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AACvC,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACxB,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AAC5D,gBAAA,MAAM,IAAI,GAAG,KAAK,GAAG,OAAO;AAC5B,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;AACnD,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;YAC5D;QACF;IACF;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE;QACrB,IAAI,IAAI,CAAC,gBAAgB;AAAE,YAAA,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACjE;;IAIQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,MAAM,MAAM,GAAG,MAAK;gBAClB,IAAI,IAAI,CAAC,UAAU;oBAAE;AACrB,gBAAA,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAM,CAAC,WAAW,CAAC;AAC3D,gBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;gBAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAM,CAAC,aAAa;gBAC/C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAM,CAAC,UAAU;AAE7C,gBAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,oBAAA,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AAC5D,oBAAA,MAAM,IAAI,GAAG,KAAK,GAAG,OAAO;AAC5B,oBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;AACnD,oBAAA,MAAM,GAAG,GAAG,IAAI,GAAG,OAAO;AAC1B,oBAAA,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE;AACrB,wBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;oBACpE;AAAO,yBAAA,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,EAAE;AAC5B,wBAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;oBACpE;gBACF;AACA,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAC1C,YAAA,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAC1E;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAK;AACjC,gBAAA,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,MAAK;oBACvC,IAAI,IAAI,CAAC,UAAU;wBAAE;AACrB,oBAAA,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AACjD,oBAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;AAC1B,oBAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,wBAAA,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AAC5D,wBAAA,MAAM,IAAI,GAAG,KAAK,GAAG,OAAO;AAC5B,wBAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;AACnD,wBAAA,MAAM,GAAG,GAAG,IAAI,GAAG,OAAO;AAC1B,wBAAA,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG;AAAE,4BAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;AACpF,6BAAA,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG;AAAE,4BAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;oBAChG;AACA,oBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAChD,CAAC,EAAE,IAAI,CAAC;AACV,YAAA,CAAC,CAAC;QACJ;IACF;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,IAAI;AACrB,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;AACzB,YAAA,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACpC,YAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;QACnC;IACF;;AAIA,IAAA,gBAAgB,CAAC,CAAoB,EAAA;AACnC,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,eAAe,CAAC,OAAgB,EAAA;QAC9B,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE;AACvC,YAAA,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,KAAK,CAAC;QAChC;QACA,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,OAAO;AAClD,QAAA,IAAI,CAAC,cAAc,GAAG,OAAO;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,iBAAiB;AAC3E,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC;QAC/D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AACvE,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IAC5B;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,iBAAiB;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;QAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;AAClC,QAAA,MAAM,IAAI,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IAC5B;IAEA,iBAAiB,GAAA;QACf,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACnG,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;AAC/D,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,eAAe,GAAA;QACb,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAC/F,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;AAC/D,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,gBAAgB,GAAA;AACd,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC;AACzB,QAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;QACxB,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC3E,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,qBAAqB,GAAA;AACnB,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,iBAAiB;QAChD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACrD,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,eAAe,CAAC,CAAS,EAAE,IAAI,GAAG,IAAI,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC;AAAE,YAAA,IAAI,IAAI;AAAE,gBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI;QAAE;AACxF,QAAA,IAAI,CAAC,eAAe,GAAG,CAAC;AACxB,QAAA,IAAI,IAAI;AAAE,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7B,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;wGA9QW,iBAAiB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,YAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAoCjB,uBAAuB,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnGxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA9DS,yBAAyB,yYAAE,uBAAuB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAiEjD,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBApE7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAAA,UAAA,EACX,IAAI,EAAA,OAAA,EACP,CAAC,yBAAyB,EAAE,uBAAuB,CAAC,EAAA,eAAA,EAC5C,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,CAAA,EAAA;;sBAKA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAGA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAGA,SAAS;uBAAC,uBAAuB;;sBACjC,SAAS;uBAAC,YAAY;;;ACxIzB;;ACAA;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kteneyck/cesium-timeline-angular",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Angular timeline component for Cesium with clock integration",
5
5
  "license": "MIT",
6
6
  "author": "kteneyck",
@@ -24,35 +24,29 @@
24
24
  },
25
25
  "publishConfig": {
26
26
  "access": "public",
27
- "registry": "https://registry.npmjs.org"
27
+ "registry": "https://registry.npmjs.org",
28
+ "directory": "dist"
28
29
  },
29
30
  "peerDependencies": {
30
31
  "@angular/common": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
31
32
  "@angular/core": "^17.0.0 || ^18.0.0 || ^19.0.0 || ^21.0.0",
32
- "@kteneyck/cesium-timeline-core": "0.3.0",
33
33
  "cesium": "^1.100.0"
34
34
  },
35
35
  "dependencies": {
36
+ "@kteneyck/cesium-timeline-core": "0.5.0",
36
37
  "tslib": "^2.6.0"
37
38
  },
38
- "devDependencies": {
39
- "@angular/common": "^21.0.0",
40
- "@angular/compiler": "^21.0.0",
41
- "@angular/compiler-cli": "^21.0.0",
42
- "@angular/core": "^21.0.0",
43
- "@angular/platform-browser": "^21.0.0",
44
- "cesium": "^1.100.0",
45
- "ng-packagr": "^21.0.0",
46
- "rxjs": "^7.8.0",
47
- "tslib": "^2.6.0",
48
- "typescript": "~5.9.0",
49
- "zone.js": "^0.15.0"
39
+ "sideEffects": false,
40
+ "module": "fesm2022/kteneyck-cesium-timeline-angular.mjs",
41
+ "typings": "types/kteneyck-cesium-timeline-angular.d.ts",
42
+ "exports": {
43
+ "./package.json": {
44
+ "default": "./package.json"
45
+ },
46
+ ".": {
47
+ "types": "./types/kteneyck-cesium-timeline-angular.d.ts",
48
+ "default": "./fesm2022/kteneyck-cesium-timeline-angular.mjs"
49
+ }
50
50
  },
51
- "scripts": {
52
- "build": "ng-packagr -p ng-package.json"
53
- },
54
- "files": [
55
- "dist"
56
- ],
57
- "sideEffects": false
58
- }
51
+ "type": "module"
52
+ }