@design.estate/dees-catalog 3.50.2 → 3.51.1

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.
@@ -47,6 +47,9 @@ let DeesChartArea = (() => {
47
47
  let _chart_decorators;
48
48
  let _chart_initializers = [];
49
49
  let _chart_extraInitializers = [];
50
+ let _seriesStats_decorators;
51
+ let _seriesStats_initializers = [];
52
+ let _seriesStats_extraInitializers = [];
50
53
  let _label_decorators;
51
54
  let _label_initializers = [];
52
55
  let _label_extraInitializers = [];
@@ -76,6 +79,7 @@ let DeesChartArea = (() => {
76
79
  static {
77
80
  const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
78
81
  _chart_decorators = [state()];
82
+ _seriesStats_decorators = [state()];
79
83
  _label_decorators = [property()];
80
84
  _series_decorators = [property({ type: Array })];
81
85
  _yAxisFormatter_decorators = [property({ attribute: false })];
@@ -85,6 +89,7 @@ let DeesChartArea = (() => {
85
89
  _yAxisMax_decorators = [property({ type: Number })];
86
90
  _autoScrollInterval_decorators = [property({ type: Number })];
87
91
  __esDecorate(this, null, _chart_decorators, { kind: "accessor", name: "chart", static: false, private: false, access: { has: obj => "chart" in obj, get: obj => obj.chart, set: (obj, value) => { obj.chart = value; } }, metadata: _metadata }, _chart_initializers, _chart_extraInitializers);
92
+ __esDecorate(this, null, _seriesStats_decorators, { kind: "accessor", name: "seriesStats", static: false, private: false, access: { has: obj => "seriesStats" in obj, get: obj => obj.seriesStats, set: (obj, value) => { obj.seriesStats = value; } }, metadata: _metadata }, _seriesStats_initializers, _seriesStats_extraInitializers);
88
93
  __esDecorate(this, null, _label_decorators, { kind: "accessor", name: "label", static: false, private: false, access: { has: obj => "label" in obj, get: obj => obj.label, set: (obj, value) => { obj.label = value; } }, metadata: _metadata }, _label_initializers, _label_extraInitializers);
89
94
  __esDecorate(this, null, _series_decorators, { kind: "accessor", name: "series", static: false, private: false, access: { has: obj => "series" in obj, get: obj => obj.series, set: (obj, value) => { obj.series = value; } }, metadata: _metadata }, _series_initializers, _series_extraInitializers);
90
95
  __esDecorate(this, null, _yAxisFormatter_decorators, { kind: "accessor", name: "yAxisFormatter", static: false, private: false, access: { has: obj => "yAxisFormatter" in obj, get: obj => obj.yAxisFormatter, set: (obj, value) => { obj.yAxisFormatter = value; } }, metadata: _metadata }, _yAxisFormatter_initializers, _yAxisFormatter_extraInitializers);
@@ -99,17 +104,18 @@ let DeesChartArea = (() => {
99
104
  }
100
105
  static demo = demoFunc;
101
106
  static demoGroups = ['Chart'];
102
- #chart_accessor_storage = __runInitializers(this, _chart_initializers, void 0);
103
- // instance
107
+ #chart_accessor_storage = __runInitializers(this, _chart_initializers, null);
104
108
  get chart() { return this.#chart_accessor_storage; }
105
109
  set chart(value) { this.#chart_accessor_storage = value; }
106
- #label_accessor_storage = (__runInitializers(this, _chart_extraInitializers), __runInitializers(this, _label_initializers, 'Untitled Chart'));
110
+ #seriesStats_accessor_storage = (__runInitializers(this, _chart_extraInitializers), __runInitializers(this, _seriesStats_initializers, []));
111
+ get seriesStats() { return this.#seriesStats_accessor_storage; }
112
+ set seriesStats(value) { this.#seriesStats_accessor_storage = value; }
113
+ #label_accessor_storage = (__runInitializers(this, _seriesStats_extraInitializers), __runInitializers(this, _label_initializers, 'Untitled Chart'));
107
114
  get label() { return this.#label_accessor_storage; }
108
115
  set label(value) { this.#label_accessor_storage = value; }
109
116
  #series_accessor_storage = (__runInitializers(this, _label_extraInitializers), __runInitializers(this, _series_initializers, []));
110
117
  get series() { return this.#series_accessor_storage; }
111
118
  set series(value) { this.#series_accessor_storage = value; }
112
- // Override getter to return internal chart data
113
119
  get chartSeries() {
114
120
  return this.internalChartData.length > 0 ? this.internalChartData : this.series;
115
121
  }
@@ -117,7 +123,7 @@ let DeesChartArea = (() => {
117
123
  get yAxisFormatter() { return this.#yAxisFormatter_accessor_storage; }
118
124
  set yAxisFormatter(value) { this.#yAxisFormatter_accessor_storage = value; }
119
125
  #rollingWindow_accessor_storage = (__runInitializers(this, _yAxisFormatter_extraInitializers), __runInitializers(this, _rollingWindow_initializers, 0));
120
- get rollingWindow() { return this.#rollingWindow_accessor_storage; } // 0 means no rolling window
126
+ get rollingWindow() { return this.#rollingWindow_accessor_storage; }
121
127
  set rollingWindow(value) { this.#rollingWindow_accessor_storage = value; }
122
128
  #realtimeMode_accessor_storage = (__runInitializers(this, _rollingWindow_extraInitializers), __runInitializers(this, _realtimeMode_initializers, false));
123
129
  get realtimeMode() { return this.#realtimeMode_accessor_storage; }
@@ -126,346 +132,351 @@ let DeesChartArea = (() => {
126
132
  get yAxisScaling() { return this.#yAxisScaling_accessor_storage; }
127
133
  set yAxisScaling(value) { this.#yAxisScaling_accessor_storage = value; }
128
134
  #yAxisMax_accessor_storage = (__runInitializers(this, _yAxisScaling_extraInitializers), __runInitializers(this, _yAxisMax_initializers, 100));
129
- get yAxisMax() { return this.#yAxisMax_accessor_storage; } // Used when yAxisScaling is 'fixed' or 'percentage'
135
+ get yAxisMax() { return this.#yAxisMax_accessor_storage; }
130
136
  set yAxisMax(value) { this.#yAxisMax_accessor_storage = value; }
131
137
  #autoScrollInterval_accessor_storage = (__runInitializers(this, _yAxisMax_extraInitializers), __runInitializers(this, _autoScrollInterval_initializers, 1000));
132
- get autoScrollInterval() { return this.#autoScrollInterval_accessor_storage; } // Auto-scroll interval in milliseconds (0 to disable)
138
+ get autoScrollInterval() { return this.#autoScrollInterval_accessor_storage; }
133
139
  set autoScrollInterval(value) { this.#autoScrollInterval_accessor_storage = value; }
134
- resizeObserver = __runInitializers(this, _autoScrollInterval_extraInitializers);
135
- resizeTimeout;
136
- internalChartData = [];
140
+ internalChartData = (__runInitializers(this, _autoScrollInterval_extraInitializers), []);
137
141
  autoScrollTimer = null;
138
- DEBUG_RESIZE = false; // Set to true to enable resize debugging
139
- // Chart color schemes
142
+ lcBundle = null;
143
+ seriesApis = new Map();
144
+ priceLines = new Map();
145
+ tooltipEl = null;
140
146
  CHART_COLORS = {
141
147
  dark: [
142
- 'hsl(217.2 91.2% 59.8%)', // Blue
143
- 'hsl(173.4 80.4% 40%)', // Teal
144
- 'hsl(280.3 87.4% 66.7%)', // Purple
145
- 'hsl(24.6 95% 53.1%)', // Orange
148
+ 'hsl(217.2 91.2% 59.8%)',
149
+ 'hsl(173.4 80.4% 40%)',
150
+ 'hsl(280.3 87.4% 66.7%)',
151
+ 'hsl(24.6 95% 53.1%)',
146
152
  ],
147
153
  light: [
148
- 'hsl(222.2 47.4% 51.2%)', // Blue (shadcn primary)
149
- 'hsl(142.1 76.2% 36.3%)', // Green (shadcn success)
150
- 'hsl(280.3 47.7% 50.2%)', // Purple (muted)
151
- 'hsl(20.5 90.2% 48.2%)', // Orange (shadcn destructive variant)
154
+ 'hsl(222.2 47.4% 51.2%)',
155
+ 'hsl(142.1 76.2% 36.3%)',
156
+ 'hsl(280.3 47.7% 50.2%)',
157
+ 'hsl(20.5 90.2% 48.2%)',
152
158
  ]
153
159
  };
154
160
  constructor() {
155
161
  super();
156
162
  domtools.elementBasic.setup();
157
- this.resizeObserver = new ResizeObserver((entries) => {
158
- // Debounce resize calls to prevent excessive updates
159
- if (this.resizeTimeout) {
160
- clearTimeout(this.resizeTimeout);
161
- }
162
- this.resizeTimeout = window.setTimeout(() => {
163
- // Simply resize if we have a chart, since we're only observing the mainbox
164
- if (this.chart) {
165
- // Log resize event for debugging
166
- if (this.DEBUG_RESIZE && entries.length > 0) {
167
- const entry = entries[0];
168
- console.log('DeesChartArea - Resize detected:', {
169
- width: entry.contentRect.width,
170
- height: entry.contentRect.height
171
- });
172
- }
173
- this.resizeChart();
174
- }
175
- }, 100); // 100ms debounce
176
- });
177
- // Note: ResizeObserver is now set up after chart initialization in firstUpdated()
178
- // to ensure proper timing and avoid race conditions
179
163
  this.registerGarbageFunction(async () => {
180
- if (this.resizeTimeout) {
181
- clearTimeout(this.resizeTimeout);
182
- }
183
- if (this.resizeObserver) {
184
- this.resizeObserver.disconnect();
185
- }
186
164
  this.stopAutoScroll();
187
- // Critical: Destroy chart instance to prevent memory leak
188
165
  if (this.chart) {
189
166
  try {
190
- this.chart.destroy();
167
+ this.chart.remove();
191
168
  this.chart = null;
169
+ this.seriesApis.clear();
170
+ this.priceLines.clear();
192
171
  }
193
- catch (error) {
194
- console.error('Error destroying chart:', error);
172
+ catch (e) {
173
+ console.error('Error destroying chart:', e);
195
174
  }
196
175
  }
197
176
  });
198
177
  }
199
- async connectedCallback() {
200
- super.connectedCallback();
201
- // Trigger resize when element is connected to DOM
202
- // This helps with dynamically added charts
203
- if (this.chart) {
204
- // Wait a frame for layout to settle
205
- await new Promise(resolve => requestAnimationFrame(resolve));
206
- await this.resizeChart();
207
- }
208
- }
209
178
  static styles = chartAreaStyles;
210
179
  render() {
211
180
  return renderChartArea(this);
212
181
  }
182
+ // --- Helpers ---
183
+ convertDataToLC(data) {
184
+ return data
185
+ .map(point => {
186
+ const ms = typeof point.x === 'number' ? point.x : new Date(point.x).getTime();
187
+ return { time: Math.floor(ms / 1000), value: point.y };
188
+ })
189
+ .sort((a, b) => a.time - b.time);
190
+ }
191
+ hslToRgba(hslColor, alpha) {
192
+ const match = hslColor.match(/hsl\(([^)]+)\)/);
193
+ if (!match)
194
+ return hslColor;
195
+ const parts = match[1].trim().split(/\s+/);
196
+ if (parts.length < 3)
197
+ return hslColor;
198
+ const h = parseFloat(parts[0]) / 360;
199
+ const s = parseFloat(parts[1]) / 100;
200
+ const l = parseFloat(parts[2]) / 100;
201
+ let r, g, b;
202
+ if (s === 0) {
203
+ r = g = b = l;
204
+ }
205
+ else {
206
+ const hue2rgb = (p, q, t) => {
207
+ if (t < 0)
208
+ t += 1;
209
+ if (t > 1)
210
+ t -= 1;
211
+ if (t < 1 / 6)
212
+ return p + (q - p) * 6 * t;
213
+ if (t < 1 / 2)
214
+ return q;
215
+ if (t < 2 / 3)
216
+ return p + (q - p) * (2 / 3 - t) * 6;
217
+ return p;
218
+ };
219
+ const q2 = l < 0.5 ? l * (1 + s) : l + s - l * s;
220
+ const p2 = 2 * l - q2;
221
+ r = hue2rgb(p2, q2, h + 1 / 3);
222
+ g = hue2rgb(p2, q2, h);
223
+ b = hue2rgb(p2, q2, h - 1 / 3);
224
+ }
225
+ return `rgba(${Math.round(r * 255)}, ${Math.round(g * 255)}, ${Math.round(b * 255)}, ${alpha})`;
226
+ }
227
+ getSeriesColors(isDark) {
228
+ return isDark ? this.CHART_COLORS.dark : this.CHART_COLORS.light;
229
+ }
230
+ applyTheme() {
231
+ if (!this.chart || !this.lcBundle)
232
+ return;
233
+ const isDark = !this.goBright;
234
+ const colors = this.getSeriesColors(isDark);
235
+ this.chart.applyOptions({
236
+ layout: {
237
+ background: { type: this.lcBundle.ColorType.Solid, color: 'transparent' },
238
+ textColor: isDark ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)',
239
+ attributionLogo: false,
240
+ },
241
+ grid: {
242
+ vertLines: { color: isDark ? 'hsl(0 0% 8.5%)' : 'hsl(0 0% 95.5%)' },
243
+ horzLines: { color: isDark ? 'hsl(0 0% 8.5%)' : 'hsl(0 0% 95.5%)' },
244
+ },
245
+ });
246
+ let idx = 0;
247
+ for (const [, api] of this.seriesApis) {
248
+ const color = colors[idx % colors.length];
249
+ api.applyOptions({
250
+ topColor: this.hslToRgba(color, isDark ? 0.4 : 0.5),
251
+ bottomColor: this.hslToRgba(color, 0),
252
+ lineColor: color,
253
+ });
254
+ idx++;
255
+ }
256
+ }
257
+ recreateSeries(chartSeries) {
258
+ if (!this.chart || !this.lcBundle)
259
+ return;
260
+ const isDark = !this.goBright;
261
+ const colors = this.getSeriesColors(isDark);
262
+ for (const [, api] of this.seriesApis) {
263
+ this.chart.removeSeries(api);
264
+ }
265
+ this.seriesApis.clear();
266
+ this.priceLines.clear();
267
+ chartSeries.forEach((s, index) => {
268
+ const color = colors[index % colors.length];
269
+ const api = this.chart.addSeries(this.lcBundle.AreaSeries, {
270
+ topColor: this.hslToRgba(color, isDark ? 0.4 : 0.5),
271
+ bottomColor: this.hslToRgba(color, 0),
272
+ lineColor: color,
273
+ lineWidth: 2,
274
+ lineType: this.lcBundle.LineType.Curved,
275
+ lastValueVisible: false,
276
+ priceLineVisible: false,
277
+ crosshairMarkerVisible: true,
278
+ crosshairMarkerRadius: 4,
279
+ });
280
+ api.setData(this.convertDataToLC(s.data));
281
+ this.updatePriceLines(s.name || `series-${index}`, api, s.data, color);
282
+ if (this.yAxisScaling !== 'dynamic') {
283
+ api.applyOptions({
284
+ autoscaleInfoProvider: () => ({
285
+ priceRange: { minValue: 0, maxValue: this.yAxisMax },
286
+ }),
287
+ });
288
+ }
289
+ this.seriesApis.set(s.name || `series-${index}`, api);
290
+ });
291
+ this.computeStats(chartSeries);
292
+ }
293
+ computeStats(chartSeries) {
294
+ const isDark = !this.goBright;
295
+ const colors = this.getSeriesColors(isDark);
296
+ this.seriesStats = chartSeries.map((s, index) => {
297
+ const values = s.data.map(d => d.y);
298
+ if (values.length === 0) {
299
+ return { name: s.name || `series-${index}`, latest: 0, min: 0, max: 0, avg: 0, color: colors[index % colors.length] };
300
+ }
301
+ const latest = values[values.length - 1];
302
+ const min = Math.min(...values);
303
+ const max = Math.max(...values);
304
+ const avg = Math.round((values.reduce((sum, v) => sum + v, 0) / values.length) * 100) / 100;
305
+ return { name: s.name || `series-${index}`, latest, min, max, avg, color: colors[index % colors.length] };
306
+ });
307
+ }
308
+ updatePriceLines(name, api, data, color) {
309
+ // Remove existing price lines for this series
310
+ const existing = this.priceLines.get(name);
311
+ if (existing) {
312
+ for (const line of existing) {
313
+ api.removePriceLine(line);
314
+ }
315
+ }
316
+ if (data.length === 0) {
317
+ this.priceLines.set(name, []);
318
+ return;
319
+ }
320
+ const values = data.map(d => d.y);
321
+ const avg = values.reduce((sum, v) => sum + v, 0) / values.length;
322
+ const max = Math.max(...values);
323
+ const lines = [];
324
+ lines.push(api.createPriceLine({
325
+ price: Math.round(avg * 100) / 100,
326
+ color: this.hslToRgba(color, 0.5),
327
+ lineWidth: 1,
328
+ lineStyle: 2, // Dashed
329
+ axisLabelVisible: true,
330
+ title: 'avg',
331
+ }));
332
+ // Only show max line if it's more than 10% above average
333
+ if (avg > 0 && (max - avg) / avg > 0.1) {
334
+ lines.push(api.createPriceLine({
335
+ price: max,
336
+ color: this.hslToRgba(color, 0.8),
337
+ lineWidth: 1,
338
+ lineStyle: 1, // Dotted
339
+ axisLabelVisible: true,
340
+ title: 'max',
341
+ }));
342
+ }
343
+ this.priceLines.set(name, lines);
344
+ }
345
+ setupTooltip() {
346
+ if (!this.chart)
347
+ return;
348
+ this.tooltipEl = document.createElement('div');
349
+ this.tooltipEl.className = 'lw-tooltip';
350
+ this.tooltipEl.style.display = 'none';
351
+ this.shadowRoot.querySelector('.chartContainer')?.appendChild(this.tooltipEl);
352
+ this.chart.subscribeCrosshairMove((param) => {
353
+ if (!this.tooltipEl)
354
+ return;
355
+ if (!param.point || !param.time || param.point.x < 0 || param.point.y < 0) {
356
+ this.tooltipEl.style.display = 'none';
357
+ return;
358
+ }
359
+ const isDark = !this.goBright;
360
+ const bgColor = isDark ? 'hsl(0 0% 9%)' : 'hsl(0 0% 100%)';
361
+ const textColor = isDark ? 'hsl(0 0% 95%)' : 'hsl(0 0% 9%)';
362
+ const borderColor = isDark ? 'hsl(0 0% 14.9%)' : 'hsl(0 0% 89.8%)';
363
+ const colors = this.getSeriesColors(isDark);
364
+ let html = '';
365
+ let idx = 0;
366
+ let hasData = false;
367
+ for (const [name, api] of this.seriesApis) {
368
+ const data = param.seriesData.get(api);
369
+ if (data && 'value' in data && data.value !== undefined) {
370
+ hasData = true;
371
+ const color = colors[idx % colors.length];
372
+ const formatted = this.yAxisFormatter(data.value);
373
+ html += `<div style="display:flex;align-items:center;gap:8px;margin:${idx > 0 ? '6px' : '0'} 0;">
374
+ <span style="display:inline-block;width:10px;height:10px;background:${color};border-radius:2px;"></span>
375
+ <span style="font-weight:500;">${name}:</span>
376
+ <span style="margin-left:auto;font-weight:600;">${formatted}</span>
377
+ </div>`;
378
+ }
379
+ idx++;
380
+ }
381
+ if (!hasData) {
382
+ this.tooltipEl.style.display = 'none';
383
+ return;
384
+ }
385
+ this.tooltipEl.innerHTML = html;
386
+ Object.assign(this.tooltipEl.style, {
387
+ display: 'block',
388
+ background: bgColor,
389
+ color: textColor,
390
+ borderColor: borderColor,
391
+ });
392
+ const containerWidth = this.shadowRoot.querySelector('.chartContainer').clientWidth;
393
+ let left = param.point.x + 16;
394
+ if (left + 200 > containerWidth)
395
+ left = param.point.x - 216;
396
+ this.tooltipEl.style.left = `${left}px`;
397
+ this.tooltipEl.style.top = `${param.point.y - 16}px`;
398
+ });
399
+ }
400
+ // --- Lifecycle ---
213
401
  async firstUpdated() {
214
402
  await this.domtoolsPromise;
215
- // Load ApexCharts from CDN
216
- const ApexChartsLib = await DeesServiceLibLoader.getInstance().loadApexCharts();
217
- // Wait for next animation frame to ensure layout is complete
403
+ this.lcBundle = await DeesServiceLibLoader.getInstance().loadLightweightCharts();
218
404
  await new Promise(resolve => requestAnimationFrame(resolve));
219
- // Get actual dimensions of the container
220
- const mainbox = this.shadowRoot.querySelector('.mainbox');
221
405
  const chartContainer = this.shadowRoot.querySelector('.chartContainer');
222
- if (!mainbox || !chartContainer) {
223
- console.error('Chart containers not found');
406
+ if (!chartContainer)
224
407
  return;
225
- }
226
- // Calculate initial dimensions
227
- const styleChartContainer = window.getComputedStyle(chartContainer);
228
- const paddingTop = parseInt(styleChartContainer.paddingTop, 10);
229
- const paddingBottom = parseInt(styleChartContainer.paddingBottom, 10);
230
- const paddingLeft = parseInt(styleChartContainer.paddingLeft, 10);
231
- const paddingRight = parseInt(styleChartContainer.paddingRight, 10);
232
- const initialWidth = mainbox.clientWidth - paddingLeft - paddingRight;
233
- const initialHeight = mainbox.offsetHeight - paddingTop - paddingBottom;
234
- // Use provided series data or default demo data
235
- const chartSeries = this.series.length > 0 ? this.series : [
236
- {
237
- name: 'cpu',
238
- data: [
239
- { x: '2025-01-15T03:00:00', y: 25 },
240
- { x: '2025-01-15T07:00:00', y: 30 },
241
- { x: '2025-01-15T11:00:00', y: 20 },
242
- { x: '2025-01-15T15:00:00', y: 35 },
243
- { x: '2025-01-15T19:00:00', y: 25 },
244
- ],
245
- },
246
- {
247
- name: 'memory',
248
- data: [
249
- { x: '2025-01-15T03:00:00', y: 10 },
250
- { x: '2025-01-15T07:00:00', y: 12 },
251
- { x: '2025-01-15T11:00:00', y: 10 },
252
- { x: '2025-01-15T15:00:00', y: 30 },
253
- { x: '2025-01-15T19:00:00', y: 40 },
254
- ],
255
- },
256
- ];
257
- // Store internal data
258
- this.internalChartData = chartSeries;
259
- // Get current theme
260
408
  const isDark = !this.goBright;
261
- const theme = isDark ? 'dark' : 'light';
262
- var options = {
263
- series: chartSeries,
264
- chart: {
265
- width: initialWidth || 100, // Use actual width or fallback
266
- height: initialHeight || 100, // Use actual height or fallback
267
- type: 'area',
268
- background: 'transparent', // Transparent background to inherit from container
269
- toolbar: {
270
- show: false, // This line disables the toolbar
271
- },
272
- animations: {
273
- enabled: !this.realtimeMode, // Disable animations in realtime mode
274
- speed: 400,
275
- animateGradually: {
276
- enabled: false, // Disable gradual animation for cleaner updates
277
- delay: 0
278
- },
279
- dynamicAnimation: {
280
- enabled: !this.realtimeMode,
281
- speed: 350
282
- }
283
- },
284
- zoom: {
285
- enabled: false, // Disable zoom for cleaner interaction
286
- },
287
- selection: {
288
- enabled: false, // Disable selection
289
- },
290
- },
291
- dataLabels: {
292
- enabled: false,
293
- },
294
- stroke: {
295
- width: 2,
296
- curve: 'smooth',
297
- },
298
- xaxis: {
299
- type: 'datetime', // Time-series data
300
- labels: {
301
- format: 'HH:mm:ss', // Time formatting with seconds
302
- datetimeUTC: false,
303
- style: {
304
- colors: [isDark ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)'], // Label color
305
- fontSize: '12px',
306
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
307
- fontWeight: '400',
308
- },
309
- },
310
- axisBorder: {
311
- show: false, // Hide x-axis border
409
+ try {
410
+ this.chart = this.lcBundle.createChart(chartContainer, {
411
+ autoSize: true,
412
+ layout: {
413
+ background: { type: this.lcBundle.ColorType.Solid, color: 'transparent' },
414
+ textColor: isDark ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)',
415
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
416
+ fontSize: 12,
417
+ attributionLogo: false,
312
418
  },
313
- axisTicks: {
314
- show: false, // Hide x-axis ticks
419
+ grid: {
420
+ vertLines: { color: isDark ? 'hsl(0 0% 8.5%)' : 'hsl(0 0% 95.5%)' },
421
+ horzLines: { color: isDark ? 'hsl(0 0% 8.5%)' : 'hsl(0 0% 95.5%)' },
315
422
  },
316
- },
317
- yaxis: {
318
- min: 0,
319
- max: this.yAxisScaling === 'dynamic' ? undefined : this.yAxisMax,
320
- labels: {
321
- formatter: this.yAxisFormatter,
322
- style: {
323
- colors: [isDark ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)'], // Label color
324
- fontSize: '12px',
325
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
326
- fontWeight: '400',
327
- },
423
+ rightPriceScale: {
424
+ borderVisible: false,
425
+ scaleMargins: { top: 0.1, bottom: 0.1 },
328
426
  },
329
- axisBorder: {
330
- show: false, // Hide y-axis border
427
+ timeScale: {
428
+ borderVisible: false,
429
+ timeVisible: true,
430
+ secondsVisible: true,
331
431
  },
332
- axisTicks: {
333
- show: false, // Hide y-axis ticks
334
- },
335
- },
336
- tooltip: {
337
- shared: true, // Enables the tooltip to display across series
338
- intersect: false, // Allows hovering anywhere on the chart
339
- followCursor: true, // Makes tooltip follow mouse even between points
340
- x: {
341
- format: 'dd/MM/yy HH:mm',
432
+ crosshair: {
433
+ mode: this.lcBundle.CrosshairMode.Magnet,
342
434
  },
343
- custom: ({ series, dataPointIndex, w }) => {
344
- // Iterate through each series and get its value
345
- // Note: We can't access component instance here, so we'll use w.config.theme.mode
346
- const currentTheme = w.config.theme.mode;
347
- const isDarkMode = currentTheme === 'dark';
348
- const bgColor = isDarkMode ? 'hsl(0 0% 9%)' : 'hsl(0 0% 100%)';
349
- const textColor = isDarkMode ? 'hsl(0 0% 95%)' : 'hsl(0 0% 9%)';
350
- const borderColor = isDarkMode ? 'hsl(0 0% 14.9%)' : 'hsl(0 0% 89.8%)';
351
- // Get formatter from chart config
352
- const formatter = w.config.yaxis[0]?.labels?.formatter || ((val) => val.toString());
353
- let tooltipContent = `<div style="padding: 12px; background: ${bgColor}; color: ${textColor}; border-radius: 6px; box-shadow: 0 2px 8px 0 hsl(0 0% 0% / ${isDarkMode ? '0.2' : '0.1'}); border: 1px solid ${borderColor};font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-size: 12px;">`;
354
- series.forEach((s, index) => {
355
- const label = w.globals.seriesNames[index]; // Get series label
356
- const value = s[dataPointIndex]; // Get value at data point
357
- const color = w.globals.colors[index];
358
- const formattedValue = formatter(value);
359
- tooltipContent += `<div style="display: flex; align-items: center; gap: 8px; margin: ${index > 0 ? '6px' : '0'} 0;">
360
- <span style="display: inline-block; width: 10px; height: 10px; background: ${color}; border-radius: 2px;"></span>
361
- <span style="font-weight: 500;">${label}:</span>
362
- <span style="margin-left: auto; font-weight: 600;">${formattedValue}</span>
363
- </div>`;
364
- });
365
- tooltipContent += `</div>`;
366
- return tooltipContent;
367
- },
368
- },
369
- grid: {
370
- xaxis: {
371
- lines: {
372
- show: false, // Hide vertical grid lines for cleaner look
373
- },
374
- },
375
- yaxis: {
376
- lines: {
377
- show: true,
378
- },
435
+ handleScroll: false,
436
+ handleScale: false,
437
+ });
438
+ const chartSeries = this.series.length > 0 ? this.series : [
439
+ {
440
+ name: 'cpu',
441
+ data: [
442
+ { x: '2025-01-15T03:00:00', y: 25 },
443
+ { x: '2025-01-15T07:00:00', y: 30 },
444
+ { x: '2025-01-15T11:00:00', y: 20 },
445
+ { x: '2025-01-15T15:00:00', y: 35 },
446
+ { x: '2025-01-15T19:00:00', y: 25 },
447
+ ],
379
448
  },
380
- borderColor: isDark ? 'hsl(0 0% 14.9%)' : 'hsl(0 0% 94%)', // Very subtle grid lines
381
- strokeDashArray: 0, // Solid line
382
- padding: {
383
- top: 10,
384
- right: 20,
385
- bottom: 10,
386
- left: 20,
449
+ {
450
+ name: 'memory',
451
+ data: [
452
+ { x: '2025-01-15T03:00:00', y: 10 },
453
+ { x: '2025-01-15T07:00:00', y: 12 },
454
+ { x: '2025-01-15T11:00:00', y: 10 },
455
+ { x: '2025-01-15T15:00:00', y: 30 },
456
+ { x: '2025-01-15T19:00:00', y: 40 },
457
+ ],
387
458
  },
388
- },
389
- fill: {
390
- type: 'gradient', // Gradient fill for the area
391
- gradient: {
392
- shade: isDark ? 'dark' : 'light',
393
- type: 'vertical',
394
- shadeIntensity: 0.1,
395
- opacityFrom: isDark ? 0.2 : 0.3,
396
- opacityTo: 0,
397
- stops: [0, 100],
398
- },
399
- },
400
- colors: isDark ? this.CHART_COLORS.dark : this.CHART_COLORS.light,
401
- theme: {
402
- mode: theme,
403
- },
404
- };
405
- try {
406
- this.chart = new ApexChartsLib(this.shadowRoot.querySelector('.chartContainer'), options);
407
- await this.chart.render();
408
- // Give the chart a moment to fully initialize before resizing
409
- await new Promise(resolve => setTimeout(resolve, 100));
410
- await this.resizeChart();
411
- // Ensure resize observer is watching the mainbox
412
- const mainbox = this.shadowRoot.querySelector('.mainbox');
413
- if (mainbox && this.resizeObserver) {
414
- // Disconnect any previous observations
415
- this.resizeObserver.disconnect();
416
- // Start observing the mainbox
417
- this.resizeObserver.observe(mainbox);
418
- if (this.DEBUG_RESIZE) {
419
- console.log('DeesChartArea - ResizeObserver attached to mainbox');
420
- }
421
- }
459
+ ];
460
+ this.internalChartData = chartSeries;
461
+ this.recreateSeries(chartSeries);
462
+ this.setupTooltip();
422
463
  }
423
464
  catch (error) {
424
465
  console.error('Failed to initialize chart:', error);
425
- // Optionally, you could set an error state here
426
- // this.chartState = 'error';
427
- // this.errorMessage = 'Failed to initialize chart';
428
466
  }
429
467
  }
430
468
  async updated(changedProperties) {
431
469
  super.updated(changedProperties);
432
- // Update chart theme when goBright changes
433
470
  if (changedProperties.has('goBright') && this.chart) {
434
- await this.updateChartTheme();
471
+ this.applyTheme();
435
472
  }
436
- // Update chart if series data changes
437
473
  if (changedProperties.has('series') && this.chart && this.series.length > 0) {
438
474
  await this.updateSeries(this.series);
439
475
  }
440
- // Update y-axis formatter if it changes
441
476
  if (changedProperties.has('yAxisFormatter') && this.chart) {
442
- await this.chart.updateOptions({
443
- yaxis: {
444
- labels: {
445
- formatter: this.yAxisFormatter,
446
- },
447
- },
448
- });
477
+ // yAxisFormatter is used by the tooltip; LC price scale uses default formatting
449
478
  }
450
- // Handle realtime mode changes
451
479
  if (changedProperties.has('realtimeMode') && this.chart) {
452
- await this.chart.updateOptions({
453
- chart: {
454
- animations: {
455
- enabled: !this.realtimeMode,
456
- speed: 400,
457
- animateGradually: {
458
- enabled: false,
459
- delay: 0
460
- },
461
- dynamicAnimation: {
462
- enabled: !this.realtimeMode,
463
- speed: 350
464
- }
465
- }
466
- }
467
- });
468
- // Start/stop auto-scroll based on realtime mode
469
480
  if (this.realtimeMode && this.rollingWindow > 0 && this.autoScrollInterval > 0) {
470
481
  this.startAutoScroll();
471
482
  }
@@ -473,181 +484,143 @@ let DeesChartArea = (() => {
473
484
  this.stopAutoScroll();
474
485
  }
475
486
  }
476
- // Handle auto-scroll interval changes
477
487
  if (changedProperties.has('autoScrollInterval') && this.chart) {
478
488
  this.stopAutoScroll();
479
489
  if (this.realtimeMode && this.rollingWindow > 0 && this.autoScrollInterval > 0) {
480
490
  this.startAutoScroll();
481
491
  }
482
492
  }
483
- // Handle y-axis scaling changes
484
493
  if ((changedProperties.has('yAxisScaling') || changedProperties.has('yAxisMax')) && this.chart) {
485
- await this.chart.updateOptions({
486
- yaxis: {
487
- min: 0,
488
- max: this.yAxisScaling === 'dynamic' ? undefined : this.yAxisMax
494
+ for (const [, api] of this.seriesApis) {
495
+ if (this.yAxisScaling === 'dynamic') {
496
+ api.applyOptions({ autoscaleInfoProvider: undefined });
489
497
  }
490
- });
498
+ else {
499
+ api.applyOptions({
500
+ autoscaleInfoProvider: () => ({ priceRange: { minValue: 0, maxValue: this.yAxisMax } }),
501
+ });
502
+ }
503
+ }
491
504
  }
492
505
  }
506
+ // --- Public API ---
493
507
  async updateSeries(newSeries, animate = true) {
494
- if (!this.chart) {
508
+ if (!this.chart)
495
509
  return;
496
- }
497
510
  try {
498
- // Store the new data first
499
511
  this.internalChartData = newSeries;
500
- // Handle rolling window if enabled
501
512
  if (this.rollingWindow > 0 && this.realtimeMode) {
502
513
  const now = Date.now();
503
514
  const cutoffTime = now - this.rollingWindow;
504
- // Filter data to only include points within the rolling window
505
- const filteredSeries = newSeries.map(series => ({
506
- name: series.name,
507
- data: series.data.filter(point => {
508
- if (typeof point === 'object' && point !== null && 'x' in point) {
509
- return new Date(point.x).getTime() > cutoffTime;
510
- }
511
- return false;
512
- })
513
- }));
514
- // Only update if we have data
515
- if (filteredSeries.some(s => s.data.length > 0)) {
516
- // Build a single options update with series, x-axis window, and y-axis
517
- const isDark = !this.goBright;
518
- const options = {
519
- series: filteredSeries,
520
- xaxis: {
521
- min: cutoffTime,
522
- max: now,
523
- labels: {
524
- format: 'HH:mm:ss',
525
- datetimeUTC: false,
526
- style: {
527
- colors: [isDark ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)'],
528
- fontSize: '12px',
529
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
530
- fontWeight: '400',
531
- },
532
- },
533
- tickAmount: 6,
534
- },
535
- };
536
- // Handle y-axis scaling
537
- if (this.yAxisScaling === 'dynamic') {
538
- const allValues = filteredSeries.flatMap(s => s.data.map(d => d.y));
539
- if (allValues.length > 0) {
540
- const maxValue = Math.max(...allValues);
541
- const dynamicMax = Math.ceil(maxValue * 1.1);
542
- options.yaxis = { min: 0, max: dynamicMax };
515
+ if (newSeries.length !== this.seriesApis.size) {
516
+ this.recreateSeries(newSeries);
517
+ }
518
+ else {
519
+ const colors = this.getSeriesColors(!this.goBright);
520
+ newSeries.forEach((s, index) => {
521
+ const name = s.name || `series-${index}`;
522
+ const api = this.seriesApis.get(name);
523
+ if (!api)
524
+ return;
525
+ const filtered = s.data.filter(point => {
526
+ const ms = typeof point.x === 'number' ? point.x : new Date(point.x).getTime();
527
+ return ms > cutoffTime;
528
+ });
529
+ api.setData(this.convertDataToLC(filtered));
530
+ this.updatePriceLines(name, api, filtered, colors[index % colors.length]);
531
+ });
532
+ this.computeStats(newSeries);
533
+ }
534
+ try {
535
+ this.chart.timeScale().setVisibleRange({
536
+ from: Math.floor(cutoffTime / 1000),
537
+ to: Math.floor(now / 1000),
538
+ });
539
+ }
540
+ catch (e) { /* range may be invalid */ }
541
+ if (this.yAxisScaling === 'dynamic') {
542
+ const allValues = newSeries.flatMap(s => s.data.filter(p => {
543
+ const ms = typeof p.x === 'number' ? p.x : new Date(p.x).getTime();
544
+ return ms > cutoffTime;
545
+ }).map(d => d.y));
546
+ if (allValues.length > 0) {
547
+ const dynamicMax = Math.ceil(Math.max(...allValues) * 1.1);
548
+ for (const [, api] of this.seriesApis) {
549
+ api.applyOptions({
550
+ autoscaleInfoProvider: () => ({ priceRange: { minValue: 0, maxValue: dynamicMax } }),
551
+ });
543
552
  }
544
553
  }
545
- await this.chart.updateOptions(options, false, false);
546
554
  }
547
555
  }
548
556
  else {
549
- await this.chart.updateSeries(newSeries, animate);
557
+ if (newSeries.length !== this.seriesApis.size) {
558
+ this.recreateSeries(newSeries);
559
+ }
560
+ else {
561
+ const colors = this.getSeriesColors(!this.goBright);
562
+ newSeries.forEach((s, index) => {
563
+ const name = s.name || `series-${index}`;
564
+ const api = this.seriesApis.get(name);
565
+ if (!api)
566
+ return;
567
+ api.setData(this.convertDataToLC(s.data));
568
+ this.updatePriceLines(name, api, s.data, colors[index % colors.length]);
569
+ });
570
+ this.computeStats(newSeries);
571
+ }
550
572
  }
551
573
  }
552
574
  catch (error) {
553
575
  console.error('Failed to update chart series:', error);
554
576
  }
555
577
  }
556
- // Update just the x-axis for smooth scrolling in realtime mode
557
- // Public for advanced usage in demos, but typically handled automatically
558
578
  async updateTimeWindow() {
559
- if (!this.chart || this.rollingWindow <= 0) {
579
+ if (!this.chart || this.rollingWindow <= 0)
560
580
  return;
561
- }
562
581
  const now = Date.now();
563
582
  const cutoffTime = now - this.rollingWindow;
564
- await this.chart.updateOptions({
565
- xaxis: {
566
- min: cutoffTime,
567
- max: now,
568
- labels: {
569
- format: 'HH:mm:ss',
570
- datetimeUTC: false,
571
- style: {
572
- colors: [!this.goBright ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)'],
573
- fontSize: '12px',
574
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
575
- fontWeight: '400',
576
- },
577
- },
578
- tickAmount: 6,
579
- }
580
- }, false, false);
583
+ try {
584
+ this.chart.timeScale().setVisibleRange({
585
+ from: Math.floor(cutoffTime / 1000),
586
+ to: Math.floor(now / 1000),
587
+ });
588
+ }
589
+ catch (e) { /* range may be invalid */ }
581
590
  }
582
591
  async appendData(newData) {
583
- if (!this.chart) {
592
+ if (!this.chart)
584
593
  return;
585
- }
586
- // Use ApexCharts' appendData method for smoother real-time updates
587
- this.chart.appendData(newData);
594
+ newData.forEach((s, index) => {
595
+ const name = s.name || `series-${index}`;
596
+ const api = this.seriesApis.get(name);
597
+ if (!api || s.data.length === 0)
598
+ return;
599
+ for (const point of s.data) {
600
+ const lcPoints = this.convertDataToLC([point]);
601
+ if (lcPoints.length > 0)
602
+ api.update(lcPoints[0]);
603
+ }
604
+ });
588
605
  }
589
- async updateOptions(options, redrawPaths, animate) {
590
- if (!this.chart) {
606
+ async updateOptions(options) {
607
+ if (!this.chart)
591
608
  return;
592
- }
593
- return this.chart.updateOptions(options, redrawPaths, animate);
609
+ this.chart.applyOptions(options);
594
610
  }
595
611
  async resizeChart() {
596
- if (!this.chart) {
597
- return;
598
- }
599
- if (this.DEBUG_RESIZE) {
600
- console.log('DeesChartArea - resizeChart called');
601
- }
602
- try {
603
- const mainbox = this.shadowRoot.querySelector('.mainbox');
604
- const chartContainer = this.shadowRoot.querySelector('.chartContainer');
605
- if (!mainbox || !chartContainer) {
606
- return;
607
- }
608
- // Force layout recalculation
609
- void mainbox.offsetHeight;
610
- // Get computed style of the element
611
- const styleChartContainer = window.getComputedStyle(chartContainer);
612
- // Extract padding values
613
- const paddingTop = parseInt(styleChartContainer.paddingTop, 10);
614
- const paddingBottom = parseInt(styleChartContainer.paddingBottom, 10);
615
- const paddingLeft = parseInt(styleChartContainer.paddingLeft, 10);
616
- const paddingRight = parseInt(styleChartContainer.paddingRight, 10);
617
- // Calculate the actual width and height to use, subtracting padding
618
- const actualWidth = mainbox.clientWidth - paddingLeft - paddingRight;
619
- const actualHeight = mainbox.offsetHeight - paddingTop - paddingBottom;
620
- // Validate dimensions
621
- if (actualWidth > 0 && actualHeight > 0) {
622
- if (this.DEBUG_RESIZE) {
623
- console.log('DeesChartArea - Updating chart dimensions:', {
624
- width: actualWidth,
625
- height: actualHeight
626
- });
627
- }
628
- await this.chart.updateOptions({
629
- chart: {
630
- width: actualWidth,
631
- height: actualHeight,
632
- },
633
- }, true, false); // Redraw paths but don't animate
634
- }
635
- }
636
- catch (error) {
637
- console.error('Failed to resize chart:', error);
612
+ // With autoSize: true, LC handles resizing automatically.
613
+ // This method is kept for API compatibility.
614
+ if (this.chart) {
615
+ this.chart.timeScale().fitContent();
638
616
  }
639
617
  }
640
- /**
641
- * Manually trigger a chart resize. Useful when automatic detection doesn't work.
642
- * This is a convenience method that can be called from outside the component.
643
- */
644
618
  async forceResize() {
645
619
  await this.resizeChart();
646
620
  }
647
621
  startAutoScroll() {
648
- if (this.autoScrollTimer) {
649
- return; // Already running
650
- }
622
+ if (this.autoScrollTimer)
623
+ return;
651
624
  this.autoScrollTimer = window.setInterval(() => {
652
625
  this.updateTimeWindow();
653
626
  }, this.autoScrollInterval);
@@ -658,42 +631,6 @@ let DeesChartArea = (() => {
658
631
  this.autoScrollTimer = null;
659
632
  }
660
633
  }
661
- async updateChartTheme() {
662
- if (!this.chart) {
663
- return;
664
- }
665
- const isDark = !this.goBright;
666
- const theme = isDark ? 'dark' : 'light';
667
- await this.chart.updateOptions({
668
- theme: {
669
- mode: theme,
670
- },
671
- colors: isDark ? this.CHART_COLORS.dark : this.CHART_COLORS.light,
672
- xaxis: {
673
- labels: {
674
- style: {
675
- colors: [isDark ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)'],
676
- },
677
- },
678
- },
679
- yaxis: {
680
- labels: {
681
- style: {
682
- colors: [isDark ? 'hsl(0 0% 63.9%)' : 'hsl(0 0% 20%)'],
683
- },
684
- },
685
- },
686
- grid: {
687
- borderColor: isDark ? 'hsl(0 0% 14.9%)' : 'hsl(0 0% 94%)',
688
- },
689
- fill: {
690
- gradient: {
691
- shade: isDark ? 'dark' : 'light',
692
- opacityFrom: isDark ? 0.2 : 0.3,
693
- },
694
- },
695
- });
696
- }
697
634
  static {
698
635
  __runInitializers(_classThis, _classExtraInitializers);
699
636
  }
@@ -701,4 +638,4 @@ let DeesChartArea = (() => {
701
638
  return DeesChartArea = _classThis;
702
639
  })();
703
640
  export { DeesChartArea };
704
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtY2hhcnQvZGVlcy1jaGFydC1hcmVhL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsUUFBUSxFQUNSLEtBQUssR0FFTixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sS0FBSyxRQUFRLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFhaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7SUFTckQsYUFBYTs0QkFEekIsYUFBYSxDQUFDLGlCQUFpQixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBQW5CLFNBQVEsV0FBVzs7OztpQ0FLM0MsS0FBSyxFQUFFO2lDQUdQLFFBQVEsRUFBRTtrQ0FHVixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7MENBUXpCLFFBQVEsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQzt5Q0FHOUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO3dDQUcxQixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7d0NBRzNCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztvQ0FHMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOzhDQUcxQixRQUFRLENB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
641
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtY2hhcnQvZGVlcy1jaGFydC1hcmVhL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsUUFBUSxFQUNSLEtBQUssR0FFTixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sS0FBSyxRQUFRLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFpQyxNQUFNLDRCQUE0QixDQUFDO0lBY3BGLGFBQWE7NEJBRHpCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQUFuQixTQUFRLFdBQVc7Ozs7aUNBSTNDLEtBQUssRUFBRTt1Q0FHUCxLQUFLLEVBQUU7aUNBR1AsUUFBUSxFQUFFO2tDQUdWLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzswQ0FPekIsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO3lDQUc5QixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7d0NBRzFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQzt3Q0FHM0IsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO29DQUcxQixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFF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