chartgpu-angular 0.0.0-stage → 18.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Naren
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,124 @@
1
- # Temporary Holding Version
1
+ # chartgpu-angular
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ An Angular wrapper for ChartGPU, a chart rendering runtime for building responsive, interactive charts in Angular templates.
4
+
5
+ This is an unofficial wrapper library. It is not affiliated with, endorsed by, or sponsored by ChartGPU or any other upstream vendor unless explicitly stated otherwise.
6
+
7
+ [![npm version](https://img.shields.io/npm/v/chartgpu-angular.svg)](https://www.npmjs.com/package/chartgpu-angular)
8
+ [![npm downloads](https://img.shields.io/npm/dy/chartgpu-angular.svg)](https://www.npmjs.com/package/chartgpu-angular)
9
+ [![GitHub stars](https://img.shields.io/github/stars/kai1992cool/chartgpu-angular.svg)](https://github.com/kai1992cool/chartgpu-angular)
10
+ [![license](https://img.shields.io/npm/l/chartgpu-angular.svg)](https://github.com/kai1992cool/chartgpu-angular/blob/master/LICENSE)
11
+
12
+ ## Features
13
+
14
+ - Uses ChartGPU rendering through Angular components and directives.
15
+ - Configure charts with standard options and theme updates.
16
+ - Define chart content with Angular templates.
17
+ - Bind chart events as Angular outputs.
18
+ - Use shared GPU context handling for dashboards and multiple charts.
19
+
20
+ ## Installation
21
+
22
+ ### 1. Install the package
23
+
24
+ ```bash
25
+ npm install chartgpu-angular
26
+ ```
27
+
28
+ ## Key Implementation Notes:
29
+
30
+ * **This project is an unofficial wrapper library.**
31
+ * **WebGPU is required for rendering.**
32
+ * **The shared GPU context service is intended for dashboard-style reuse.**
33
+
34
+ ## Angular version examples & Documentation
35
+
36
+ StackBlitz examples will be added as each Angular version's rollout is published.
37
+
38
+ > If you click the link for Standalone and NgModule examples are stuck in clone step, please refresh the screen, the stackblitz will initialize
39
+
40
+ | Angular version | Standalone example | NgModule example | Documentation |
41
+ | --------------- | ------------------ | ---------------- | ------------- |
42
+ | Angular 14 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/14/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/14/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=14) |
43
+ | Angular 15 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/15/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/15/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=15) |
44
+ | Angular 16 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/16/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/16/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=16) |
45
+ | Angular 17 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/17/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/17/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=17) |
46
+ | Angular 18 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/18/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/18/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=18) |
47
+ | Angular 19 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/19/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/19/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=19) |
48
+ | Angular 20 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/20/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/20/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=20) |
49
+ | Angular 21 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/21/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/21/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=21) |
50
+ | Angular 22 | [Modular Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/22/modular) | [Standalone Demo](https://stackblitz.com/github/kai1992cool/chartgpu-angular/tree/main/demos/22/standalone) | [Storybook](https://kai1992cool.github.io/chartgpu-angular/demos?version=22) |
51
+
52
+ Example usage:
53
+
54
+ ```ts
55
+ import { Component } from '@angular/core';
56
+ import { ChartGPUComponent, provideChartGpuContext } from 'chartgpu-angular';
57
+
58
+ @Component({
59
+ standalone: true,
60
+ imports: [ChartGPUComponent],
61
+ providers: [provideChartGpuContext()],
62
+ template: `<lib-chartgpu-angular />`,
63
+ })
64
+ export class ExampleComponent {}
65
+ ```
66
+
67
+ ## Configuring Styling
68
+
69
+ ### 1. Simplest way
70
+
71
+ The default setup should include the required chart styles for the component, so no separate CSS setup is usually needed.
72
+
73
+ ### 2. Configure chart CSS (when needed)
74
+ If you need additional styles for chart modules or custom visual effects, serve the CSS files as assets in your application configuration.
75
+
76
+ Then pass the asset URL in the appropriate style injection option used by the component.
77
+
78
+ ## Setup
79
+
80
+ Choose the setup that matches your Angular application.
81
+
82
+ ### Standalone application
83
+
84
+ Import `ChartGPUComponent` from `chartgpu-angular` and add it to the `imports` array of each standalone component that uses it. Add `provideChartGpuContext()` to the component or application providers when you want a shared GPU context service:
85
+
86
+ ```ts
87
+ import { Component } from '@angular/core';
88
+ import { ChartGPUComponent, provideChartGpuContext } from 'chartgpu-angular';
89
+
90
+ @Component({
91
+ standalone: true,
92
+ imports: [ChartGPUComponent],
93
+ providers: [provideChartGpuContext()],
94
+ template: `<lib-chartgpu-angular />`,
95
+ })
96
+ export class ExampleComponent {}
97
+ ```
98
+
99
+ ### NgModule application
100
+
101
+ Import `ChartGPUComponent` in the `imports` array of the module that declares the component using it. If you need the shared GPU context service, provide it from the module providers with `provideChartGpuContext()`:
102
+
103
+ ```ts
104
+ import { NgModule } from '@angular/core';
105
+ import { BrowserModule } from '@angular/platform-browser';
106
+ import { AppComponent } from './app.component';
107
+ import { ChartGPUComponent, provideChartGpuContext } from 'chartgpu-angular';
108
+
109
+ @NgModule({
110
+ declarations: [AppComponent],
111
+ imports: [BrowserModule, ChartGPUComponent],
112
+ providers: [provideChartGpuContext()],
113
+ bootstrap: [AppComponent],
114
+ })
115
+ export class AppModule {}
116
+ ```
117
+
118
+ ## Documentation and demos
119
+
120
+ - [ChartGPU documentation](https://chartgpu.io/docs/)
121
+
122
+ ## License
123
+
124
+ MIT
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnRncHUtYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NoYXJ0Z3B1LWFuZ3VsYXIvc3JjL2NoYXJ0Z3B1LWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,288 @@
1
+ import { NgStyle } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, afterNextRender, effect, input, output, signal, untracked, viewChild, } from '@angular/core';
3
+ import { ChartGPU, } from 'chartgpu';
4
+ import * as i0 from "@angular/core";
5
+ export class ChartGpuAngularComponent {
6
+ destroyRef;
7
+ options = input.required();
8
+ gpuContext = input(null);
9
+ theme = input(undefined);
10
+ className = input();
11
+ style = input();
12
+ ready = output();
13
+ chartReady = output();
14
+ chartDispose = output();
15
+ resize = output();
16
+ click = output();
17
+ chartClick = output();
18
+ mouseOver = output();
19
+ mouseOut = output();
20
+ crosshairMove = output();
21
+ dataAppend = output();
22
+ zoomChange = output();
23
+ zoomRangeChange = output();
24
+ deviceLost = output();
25
+ chartError = output();
26
+ host = viewChild('host');
27
+ canvasHost = viewChild('canvasHost');
28
+ chartInstance = signal(null);
29
+ initializationError = signal(null);
30
+ chartContainer;
31
+ createdWithOptions;
32
+ resizeTimeout;
33
+ resizeObserver;
34
+ removeChartListeners;
35
+ destroying = false;
36
+ constructor(destroyRef) {
37
+ this.destroyRef = destroyRef;
38
+ this.destroyRef.onDestroy(() => {
39
+ this.resizeObserver?.disconnect();
40
+ if (this.resizeTimeout !== undefined) {
41
+ clearTimeout(this.resizeTimeout);
42
+ }
43
+ this.disposeChart();
44
+ });
45
+ afterNextRender(() => {
46
+ const container = this.host()?.nativeElement;
47
+ if (container) {
48
+ this.observeResize(container);
49
+ }
50
+ });
51
+ effect(onCleanup => {
52
+ const container = this.canvasHost()?.nativeElement;
53
+ const options = this.options();
54
+ const gpuContext = this.gpuContext();
55
+ const theme = this.theme();
56
+ this.initializationError.set(null);
57
+ if (!container) {
58
+ this.disposeChart();
59
+ return;
60
+ }
61
+ if (typeof navigator === 'undefined' || !('gpu' in navigator)) {
62
+ this.reportError(new Error('WebGPU not supported in this browser'));
63
+ return;
64
+ }
65
+ if (untracked(() => this.chartInstance()) && this.chartContainer === container) {
66
+ return;
67
+ }
68
+ let cancelled = false;
69
+ let createdInstance;
70
+ const initialOptions = this.getEffectiveOptions(options, theme);
71
+ void (gpuContext
72
+ ? ChartGPU.create(container, initialOptions, gpuContext)
73
+ : ChartGPU.create(container, initialOptions)).then(instance => {
74
+ createdInstance = instance;
75
+ if (cancelled) {
76
+ instance.dispose();
77
+ return;
78
+ }
79
+ try {
80
+ const latest = untracked(() => ({
81
+ options: this.options(),
82
+ theme: this.theme(),
83
+ }));
84
+ if (latest.options !== options || latest.theme !== theme) {
85
+ instance.setOption(this.getEffectiveOptions(latest.options, latest.theme));
86
+ }
87
+ this.createdWithOptions = latest;
88
+ this.chartContainer = container;
89
+ this.chartInstance.set(instance);
90
+ this.removeChartListeners = this.listenToChart(instance);
91
+ this.ready.emit({ container });
92
+ this.chartReady.emit(instance);
93
+ const range = instance.getZoomRange();
94
+ if (range) {
95
+ this.emitZoomRange(range);
96
+ }
97
+ }
98
+ catch (cause) {
99
+ instance.dispose();
100
+ throw cause;
101
+ }
102
+ }).catch((cause) => {
103
+ if (cancelled) {
104
+ return;
105
+ }
106
+ if (createdInstance && this.chartInstance() !== createdInstance && !createdInstance.disposed) {
107
+ createdInstance.dispose();
108
+ }
109
+ this.reportError(cause);
110
+ });
111
+ onCleanup(() => {
112
+ cancelled = true;
113
+ if (this.chartContainer === container) {
114
+ this.disposeChart();
115
+ }
116
+ });
117
+ }, { allowSignalWrites: true });
118
+ effect(() => {
119
+ const options = this.options();
120
+ const theme = this.theme();
121
+ const instance = this.chartInstance();
122
+ if (!instance || instance.disposed) {
123
+ return;
124
+ }
125
+ if (this.createdWithOptions?.options === options && this.createdWithOptions.theme === theme) {
126
+ this.createdWithOptions = undefined;
127
+ return;
128
+ }
129
+ try {
130
+ instance.setOption(this.getEffectiveOptions(options, theme));
131
+ }
132
+ catch (cause) {
133
+ this.reportError(cause);
134
+ }
135
+ }, { allowSignalWrites: true });
136
+ }
137
+ emitClick(event) {
138
+ this.click.emit({ x: event.offsetX, y: event.offsetY });
139
+ }
140
+ ngOnDestroy() {
141
+ this.destroying = true;
142
+ }
143
+ getChart() {
144
+ const instance = this.chartInstance();
145
+ return instance && !instance.disposed ? instance : null;
146
+ }
147
+ getContainer() {
148
+ return this.canvasHost()?.nativeElement ?? null;
149
+ }
150
+ appendData(seriesIndex, newPoints, options) {
151
+ this.getChart()?.appendData(seriesIndex, newPoints, options);
152
+ }
153
+ renderFrame() {
154
+ return this.getChart()?.renderFrame() ?? false;
155
+ }
156
+ needsRender() {
157
+ return this.getChart()?.needsRender() ?? false;
158
+ }
159
+ getRenderMode() {
160
+ return this.getChart()?.getRenderMode() ?? 'auto';
161
+ }
162
+ setRenderMode(mode) {
163
+ this.getChart()?.setRenderMode(mode);
164
+ }
165
+ setOption(options) {
166
+ this.getChart()?.setOption(options);
167
+ }
168
+ setZoomRange(start, end, source) {
169
+ this.getChart()?.setZoomRange(start, end, source);
170
+ }
171
+ setInteractionX(x, source) {
172
+ this.getChart()?.setInteractionX(x, source);
173
+ }
174
+ getInteractionX() {
175
+ return this.getChart()?.getInteractionX() ?? null;
176
+ }
177
+ hitTest(event) {
178
+ return this.getChart()?.hitTest(event) ?? null;
179
+ }
180
+ getEffectiveOptions(options, theme) {
181
+ return theme !== undefined ? { ...options, theme } : options;
182
+ }
183
+ listenToChart(instance) {
184
+ const click = (payload) => this.chartClick.emit(payload);
185
+ const mouseOver = (payload) => this.mouseOver.emit(payload);
186
+ const mouseOut = (payload) => this.mouseOut.emit(payload);
187
+ const crosshairMove = (payload) => this.crosshairMove.emit(payload);
188
+ const dataAppend = (payload) => this.dataAppend.emit(payload);
189
+ const zoomChange = (payload) => this.emitZoomRange(payload);
190
+ const deviceLost = (payload) => this.deviceLost.emit(payload);
191
+ instance.on('click', click);
192
+ instance.on('mouseover', mouseOver);
193
+ instance.on('mouseout', mouseOut);
194
+ instance.on('crosshairMove', crosshairMove);
195
+ instance.on('dataAppend', dataAppend);
196
+ instance.on('zoomRangeChange', zoomChange);
197
+ instance.on('deviceLost', deviceLost);
198
+ return () => {
199
+ if (instance.disposed) {
200
+ return;
201
+ }
202
+ instance.off('click', click);
203
+ instance.off('mouseover', mouseOver);
204
+ instance.off('mouseout', mouseOut);
205
+ instance.off('crosshairMove', crosshairMove);
206
+ instance.off('dataAppend', dataAppend);
207
+ instance.off('zoomRangeChange', zoomChange);
208
+ instance.off('deviceLost', deviceLost);
209
+ };
210
+ }
211
+ emitZoomRange(range) {
212
+ this.zoomChange.emit({ range: { start: range.start, end: range.end } });
213
+ this.zoomRangeChange.emit({ start: range.start, end: range.end });
214
+ }
215
+ observeResize(container) {
216
+ if (typeof ResizeObserver === 'undefined') {
217
+ return;
218
+ }
219
+ this.resizeObserver = new ResizeObserver(entries => {
220
+ const entry = entries[0];
221
+ if (!entry) {
222
+ return;
223
+ }
224
+ const { width, height } = entry.contentRect;
225
+ this.resize.emit({ width, height, container });
226
+ if (this.resizeTimeout !== undefined) {
227
+ clearTimeout(this.resizeTimeout);
228
+ }
229
+ this.resizeTimeout = setTimeout(() => {
230
+ this.chartInstance()?.resize();
231
+ this.resizeTimeout = undefined;
232
+ }, 100);
233
+ });
234
+ this.resizeObserver.observe(container);
235
+ }
236
+ reportError(cause) {
237
+ const error = cause instanceof Error ? cause : new Error(String(cause));
238
+ this.initializationError.set(error);
239
+ this.chartError.emit(error);
240
+ }
241
+ disposeChart() {
242
+ const instance = this.chartInstance();
243
+ this.removeChartListeners?.();
244
+ this.removeChartListeners = undefined;
245
+ if (instance && !instance.disposed) {
246
+ instance.dispose();
247
+ if (!this.destroying) {
248
+ this.chartDispose.emit();
249
+ }
250
+ }
251
+ this.chartInstance.set(null);
252
+ this.chartContainer = undefined;
253
+ this.createdWithOptions = undefined;
254
+ }
255
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartGpuAngularComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
256
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChartGpuAngularComponent, isStandalone: true, selector: "lib-chartgpu-angular", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, gpuContext: { classPropertyName: "gpuContext", publicName: "gpuContext", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { ready: "ready", chartReady: "chartReady", chartDispose: "chartDispose", resize: "resize", click: "click", chartClick: "chartClick", mouseOver: "mouseOver", mouseOut: "mouseOut", crosshairMove: "crosshairMove", dataAppend: "dataAppend", zoomChange: "zoomChange", zoomRangeChange: "zoomRangeChange", deviceLost: "deviceLost", chartError: "chartError" }, host: { classAttribute: "chartgpu-angular" }, viewQueries: [{ propertyName: "host", first: true, predicate: ["host"], descendants: true, isSignal: true }, { propertyName: "canvasHost", first: true, predicate: ["canvasHost"], descendants: true, isSignal: true }], ngImport: i0, template: `
257
+ <div
258
+ #host
259
+ class="chartgpu-host"
260
+ [class]="className() ?? ''"
261
+ [ngStyle]="style()"
262
+ (click)="emitClick($event)"
263
+ >
264
+ <div #canvasHost class="chartgpu-canvas-host"></div>
265
+ @if (initializationError(); as error) {
266
+ <div class="chartgpu-error" role="alert">{{ error.message }}</div>
267
+ }
268
+ </div>
269
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.chartgpu-host{position:relative;width:100%;height:100%}.chartgpu-canvas-host{position:absolute;inset:0}.chartgpu-error{position:absolute;inset:0;display:grid;place-items:center;padding:1rem;text-align:center}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
270
+ }
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartGpuAngularComponent, decorators: [{
272
+ type: Component,
273
+ args: [{ selector: 'lib-chartgpu-angular', standalone: true, imports: [NgStyle], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'chartgpu-angular' }, template: `
274
+ <div
275
+ #host
276
+ class="chartgpu-host"
277
+ [class]="className() ?? ''"
278
+ [ngStyle]="style()"
279
+ (click)="emitClick($event)"
280
+ >
281
+ <div #canvasHost class="chartgpu-canvas-host"></div>
282
+ @if (initializationError(); as error) {
283
+ <div class="chartgpu-error" role="alert">{{ error.message }}</div>
284
+ }
285
+ </div>
286
+ `, styles: [":host{display:block;width:100%;height:100%}.chartgpu-host{position:relative;width:100%;height:100%}.chartgpu-canvas-host{position:absolute;inset:0}.chartgpu-error{position:absolute;inset:0;display:grid;place-items:center;padding:1rem;text-align:center}\n"] }]
287
+ }], ctorParameters: () => [{ type: i0.DestroyRef }] });
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnRncHUtYW5ndWxhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGFydGdwdS1hbmd1bGFyL3NyYy9saWIvY2hhcnRncHUtYW5ndWxhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUlULGVBQWUsRUFDZixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsUUFBUSxHQU9ULE1BQU0sVUFBVSxDQUFDOztBQWdFbEIsTUFBTSxPQUFPLHdCQUF3QjtJQXFDTjtJQXBDcEIsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW1CLENBQUM7SUFDNUMsVUFBVSxHQUFHLEtBQUssQ0FBNEIsSUFBSSxDQUFDLENBQUM7SUFDcEQsS0FBSyxHQUFHLEtBQUssQ0FBdUMsU0FBUyxDQUFDLENBQUM7SUFDL0QsU0FBUyxHQUFHLEtBQUssRUFBc0IsQ0FBQztJQUN4QyxLQUFLLEdBQUcsS0FBSyxFQUE2QixDQUFDO0lBRTNDLEtBQUssR0FBRyxNQUFNLEVBQXNCLENBQUM7SUFDckMsVUFBVSxHQUFHLE1BQU0sRUFBb0IsQ0FBQztJQUN4QyxZQUFZLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFDOUIsTUFBTSxHQUFHLE1BQU0sRUFBdUIsQ0FBQztJQUN2QyxLQUFLLEdBQUcsTUFBTSxFQUFzQixDQUFDO0lBQ3JDLFVBQVUsR0FBRyxNQUFNLEVBQXdCLENBQUM7SUFDNUMsU0FBUyxHQUFHLE1BQU0sRUFBd0IsQ0FBQztJQUMzQyxRQUFRLEdBQUcsTUFBTSxFQUF3QixDQUFDO0lBQzFDLGFBQWEsR0FBRyxNQUFNLEVBQWdDLENBQUM7SUFD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Q0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLFlBQVk7UUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7SUFDdEMsQ0FBQzt3R0F4U1Usd0JBQXdCOzRGQUF4Qix3QkFBd0IsczBDQTFDekI7Ozs7Ozs7Ozs7Ozs7R0FhVCx3VUFoQlMsT0FBTzs7NEZBNkNOLHdCQUF3QjtrQkFoRHBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLE9BQU8sQ0FBQyxtQkFDRCx1QkFBdUIsQ0FBQyxNQUFNLFFBQ3pDLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLFlBQ3pCOzs7Ozs7Ozs7Ozs7O0dBYVQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBlZmZlY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbiAgdW50cmFja2VkLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHUFUsXG4gIHR5cGUgQ2hhcnRHUFVDcm9zc2hhaXJNb3ZlUGF5bG9hZCxcbiAgdHlwZSBDaGFydEdQVURldmljZUxvc3RQYXlsb2FkLFxuICB0eXBlIENoYXJ0R1BVRXZlbnRQYXlsb2FkLFxuICB0eXBlIENoYXJ0R1BVSW5zdGFuY2UsXG4gIHR5cGUgQ2hhcnRHUFVab29tUmFuZ2VDaGFuZ2VQYXlsb2FkLFxuICB0eXBlIE9ITENEYXRhUG9pbnQsXG59IGZyb20gJ2NoYXJ0Z3B1JztcbmltcG9ydCB0eXBlIHtcbiAgQ2hhcnRncHVBcHBlbmREYXRhT3B0aW9ucyxcbiAgQ2hhcnRncHVDYXJ0ZXNpYW5TZXJpZXNEYXRhLFxuICBDaGFydGdwdUNoYXJ0SGFuZGxlLFxuICBDaGFydGdwdUNsaWNrRXZlbnQsXG4gIENoYXJ0Z3B1RGF0YUFwcGVuZEV2ZW50LFxuICBDaGFydGdwdUdQVUNvbnRleHQsXG4gIENoYXJ0Z3B1T3B0aW9ucyxcbiAgQ2hhcnRncHVSZWFkeUV2ZW50LFxuICBDaGFydGdwdVJlc2l6ZUV2ZW50LFxuICBDaGFydGdwdVN0eWxlLFxuICBDaGFydGdwdVpvb21DaGFuZ2VFdmVudCxcbiAgQ2hhcnRncHVab29tUmFuZ2VDaGFuZ2VFdmVudCxcbn0gZnJvbSAnLi9jaGFydGdwdS1hbmd1bGFyLnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNoYXJ0Z3B1LWFuZ3VsYXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdTdHlsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBob3N0OiB7IGNsYXNzOiAnY2hhcnRncHUtYW5ndWxhcicgfSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAjaG9zdFxuICAgICAgY2xhc3M9XCJjaGFydGdwdS1ob3N0XCJcbiAgICAgIFtjbGFzc109XCJjbGFzc05hbWUoKSA/PyAnJ1wiXG4gICAgICBbbmdTdHlsZV09XCJzdHlsZSgpXCJcbiAgICAgIChjbGljayk9XCJlbWl0Q2xpY2soJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGRpdiAjY2FudmFzSG9zdCBjbGFzcz1cImNoYXJ0Z3B1LWNhbnZhcy1ob3N0XCI+PC9kaXY+XG4gICAgICBAaWYgKGluaXRpYWxpemF0aW9uRXJyb3IoKTsgYXMgZXJyb3IpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0Z3B1LWVycm9yXCIgcm9sZT1cImFsZXJ0XCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG5cbiAgICAuY2hhcnRncHUtaG9zdCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG5cbiAgICAuY2hhcnRncHUtY2FudmFzLWhvc3Qge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgaW5zZXQ6IDA7XG4gICAgfVxuXG4gICAgLmNoYXJ0Z3B1LWVycm9yIHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGluc2V0OiAwO1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIHBsYWNlLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAxcmVtO1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIENoYXJ0R3B1QW5ndWxhckNvbXBvbmVudCBpbXBsZW1lbnRzIENoYXJ0Z3B1Q2hhcnRIYW5kbGUsIE9uRGVzdHJveSB7XG4gIHJlYWRvbmx5IG9wdGlvbnMgPSBpbnB1dC5yZXF1aXJlZDxDaGFydGdwdU9wdGlvbnM+KCk7XG4gIHJlYWRvbmx5IGdwdUNvbnRleHQgPSBpbnB1dDxDaGFydGdwdUdQVUNvbnRleHQgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgdGhlbWUgPSBpbnB1dDxDaGFydGdwdU9wdGlvbnNbJ3RoZW1lJ10gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGNsYXNzTmFtZSA9IGlucHV0PHN0cmluZyB8IHVuZGVmaW5lZD4oKTtcbiAgcmVhZG9ubHkgc3R5bGUgPSBpbnB1dDxDaGFydGdwdVN0eWxlIHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IHJlYWR5ID0gb3V0cHV0PENoYXJ0Z3B1UmVhZHlFdmVudD4oKTtcbiAgcmVhZG9ubHkgY2hhcnRSZWFkeSA9IG91dHB1dDxDaGFydEdQVUluc3RhbmNlPigpO1xuICByZWFkb25seSBjaGFydERpc3Bvc2UgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgcmVzaXplID0gb3V0cHV0PENoYXJ0Z3B1UmVzaXplRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IGNsaWNrID0gb3V0cHV0PENoYXJ0Z3B1Q2xpY2tFdmVudD4oKTtcbiAgcmVhZG9ubHkgY2hhcnRDbGljayA9IG91dHB1dDxDaGFydEdQVUV2ZW50UGF5bG9hZD4oKTtcbiAgcmVhZG9ubHkgbW91c2VPdmVyID0gb3V0cHV0PENoYXJ0R1BVRXZlbnRQYXlsb2FkPigpO1xuICByZWFkb25seSBtb3VzZU91dCA9IG91dHB1dDxDaGFydEdQVUV2ZW50UGF5bG9hZD4oKTtcbiAgcmVhZG9ubHkgY3Jvc3NoYWlyTW92ZSA9IG91dHB1dDxDaGFydEdQVUNyb3NzaGFpck1vdmVQYXlsb2FkPigpO1xuICByZWFkb25seSBkYXRhQXBwZW5kID0gb3V0cHV0PENoYXJ0Z3B1RGF0YUFwcGVuZEV2ZW50PigpO1xuICByZWFkb25seSB6b29tQ2hhbmdlID0gb3V0cHV0PENoYXJ0Z3B1Wm9vbUNoYW5nZUV2ZW50PigpO1xuICByZWFkb25seSB6b29tUmFuZ2VDaGFuZ2UgPSBvdXRwdXQ8Q2hhcnRncHVab29tUmFuZ2VDaGFuZ2VFdmVudD4oKTtcbiAgcmVhZG9ubHkgZGV2aWNlTG9zdCA9IG91dHB1dDxDaGFydEdQVURldmljZUxvc3RQYXlsb2FkPigpO1xuICByZWFkb25seSBjaGFydEVycm9yID0gb3V0cHV0PEVycm9yPigpO1xuXG4gIHJlYWRvbmx5IGhvc3QgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdob3N0Jyk7XG4gIHJlYWRvbmx5IGNhbnZhc0hvc3QgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjYW52YXNIb3N0Jyk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydEluc3RhbmNlID0gc2lnbmFsPENoYXJ0R1BVSW5zdGFuY2UgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgaW5pdGlhbGl6YXRpb25FcnJvciA9IHNpZ25hbDxFcnJvciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIGNoYXJ0Q29udGFpbmVyPzogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgY3JlYXRlZFdpdGhPcHRpb25zPzoge1xuICAgIG9wdGlvbnM6IENoYXJ0Z3B1T3B0aW9ucztcbiAgICB0aGVtZTogQ2hhcnRncHVPcHRpb25zWyd0aGVtZSddIHwgdW5kZWZpbmVkO1xuICB9O1xuICBwcml2YXRlIHJlc2l6ZVRpbWVvdXQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHJlbW92ZUNoYXJ0TGlzdGVuZXJzPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBkZXN0cm95aW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmKSB7XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICBpZiAodGhpcy5yZXNpemVUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRpc3Bvc2VDaGFydCgpO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuaG9zdCgpPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICB0aGlzLm9ic2VydmVSZXNpemUoY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdChvbkNsZWFudXAgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jYW52YXNIb3N0KCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG4gICAgICBjb25zdCBncHVDb250ZXh0ID0gdGhpcy5ncHVDb250ZXh0KCk7XG4gICAgICBjb25zdCB0aGVtZSA9IHRoaXMudGhlbWUoKTtcblxuICAgICAgdGhpcy5pbml0aWFsaXphdGlvbkVycm9yLnNldChudWxsKTtcbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZUNoYXJ0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhKCdncHUnIGluIG5hdmlnYXRvcikpIHtcbiAgICAgICAgdGhpcy5yZXBvcnRFcnJvcihuZXcgRXJyb3IoJ1dlYkdQVSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlcicpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodW50cmFja2VkKCgpID0+IHRoaXMuY2hhcnRJbnN0YW5jZSgpKSAmJiB0aGlzLmNoYXJ0Q29udGFpbmVyID09PSBjb250YWluZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgICBsZXQgY3JlYXRlZEluc3RhbmNlOiBDaGFydEdQVUluc3RhbmNlIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5pdGlhbE9wdGlvbnMgPSB0aGlzLmdldEVmZmVjdGl2ZU9wdGlvbnMob3B0aW9ucywgdGhlbWUpO1xuXG4gICAgICB2b2lkIChncHVDb250ZXh0XG4gICAgICAgID8gQ2hhcnRHUFUuY3JlYXRlKGNvbnRhaW5lciwgaW5pdGlhbE9wdGlvbnMsIGdwdUNvbnRleHQpXG4gICAgICAgIDogQ2hhcnRHUFUuY3JlYXRlKGNvbnRhaW5lciwgaW5pdGlhbE9wdGlvbnMpXG4gICAgICApLnRoZW4oaW5zdGFuY2UgPT4ge1xuICAgICAgICBjcmVhdGVkSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgICAgIGluc3RhbmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGxhdGVzdCA9IHVudHJhY2tlZCgoKSA9PiAoe1xuICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zKCksXG4gICAgICAgICAgICB0aGVtZTogdGhpcy50aGVtZSgpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICBpZiAobGF0ZXN0Lm9wdGlvbnMgIT09IG9wdGlvbnMgfHwgbGF0ZXN0LnRoZW1lICE9PSB0aGVtZSkge1xuICAgICAgICAgICAgaW5zdGFuY2Uuc2V0T3B0aW9uKHRoaXMuZ2V0RWZmZWN0aXZlT3B0aW9ucyhsYXRlc3Qub3B0aW9ucywgbGF0ZXN0LnRoZW1lKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jcmVhdGVkV2l0aE9wdGlvbnMgPSBsYXRlc3Q7XG4gICAgICAgICAgdGhpcy5jaGFydENvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgICB0aGlzLmNoYXJ0SW5zdGFuY2Uuc2V0KGluc3RhbmNlKTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNoYXJ0TGlzdGVuZXJzID0gdGhpcy5saXN0ZW5Ub0NoYXJ0KGluc3RhbmNlKTtcbiAgICAgICAgICB0aGlzLnJlYWR5LmVtaXQoeyBjb250YWluZXIgfSk7XG4gICAgICAgICAgdGhpcy5jaGFydFJlYWR5LmVtaXQoaW5zdGFuY2UpO1xuXG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSBpbnN0YW5jZS5nZXRab29tUmFuZ2UoKTtcbiAgICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdFpvb21SYW5nZShyYW5nZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChjYXVzZTogdW5rbm93bikge1xuICAgICAgICAgIGluc3RhbmNlLmRpc3Bvc2UoKTtcbiAgICAgICAgICB0aHJvdyBjYXVzZTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goKGNhdXNlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNyZWF0ZWRJbnN0YW5jZSAmJiB0aGlzLmNoYXJ0SW5zdGFuY2UoKSAhPT0gY3JlYXRlZEluc3RhbmNlICYmICFjcmVhdGVkSW5zdGFuY2UuZGlzcG9zZWQpIHtcbiAgICAgICAgICBjcmVhdGVkSW5zdGFuY2UuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVwb3J0RXJyb3IoY2F1c2UpO1xuICAgICAgfSk7XG5cbiAgICAgIG9uQ2xlYW51cCgoKSA9PiB7XG4gICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmNoYXJ0Q29udGFpbmVyID09PSBjb250YWluZXIpIHtcbiAgICAgICAgICB0aGlzLmRpc3Bvc2VDaGFydCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgIGNvbnN0IHRoZW1lID0gdGhpcy50aGVtZSgpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNoYXJ0SW5zdGFuY2UoKTtcbiAgICAgIGlmICghaW5zdGFuY2UgfHwgaW5zdGFuY2UuZGlzcG9zZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jcmVhdGVkV2l0aE9wdGlvbnM/Lm9wdGlvbnMgPT09IG9wdGlvbnMgJiYgdGhpcy5jcmVhdGVkV2l0aE9wdGlvbnMudGhlbWUgPT09IHRoZW1lKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlZFdpdGhPcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGluc3RhbmNlLnNldE9wdGlvbih0aGlzLmdldEVmZmVjdGl2ZU9wdGlvbnMob3B0aW9ucywgdGhlbWUpKTtcbiAgICAgIH0gY2F0Y2ggKGNhdXNlOiB1bmtub3duKSB7XG4gICAgICAgIHRoaXMucmVwb3J0RXJyb3IoY2F1c2UpO1xuICAgICAgfVxuICAgIH0sIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGljay5lbWl0KHsgeDogZXZlbnQub2Zmc2V0WCwgeTogZXZlbnQub2Zmc2V0WSB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWluZyA9IHRydWU7XG4gIH1cblxuICBnZXRDaGFydCgpOiBDaGFydEdQVUluc3RhbmNlIHwgbnVsbCB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNoYXJ0SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gaW5zdGFuY2UgJiYgIWluc3RhbmNlLmRpc3Bvc2VkID8gaW5zdGFuY2UgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q29udGFpbmVyKCk6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2FudmFzSG9zdCgpPy5uYXRpdmVFbGVtZW50ID8/IG51bGw7XG4gIH1cblxuICBhcHBlbmREYXRhKFxuICAgIHNlcmllc0luZGV4OiBudW1iZXIsXG4gICAgbmV3UG9pbnRzOiBDaGFydGdwdUNhcnRlc2lhblNlcmllc0RhdGEgfCBPSExDRGF0YVBvaW50W10sXG4gICAgb3B0aW9ucz86IENoYXJ0Z3B1QXBwZW5kRGF0YU9wdGlvbnMsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZ2V0Q2hhcnQoKT8uYXBwZW5kRGF0YShzZXJpZXNJbmRleCwgbmV3UG9pbnRzLCBvcHRpb25zKTtcbiAgfVxuXG4gIHJlbmRlckZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENoYXJ0KCk/LnJlbmRlckZyYW1lKCkgPz8gZmFsc2U7XG4gIH1cblxuICBuZWVkc1JlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaGFydCgpPy5uZWVkc1JlbmRlcigpID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0UmVuZGVyTW9kZSgpOiAnYXV0bycgfCAnZXh0ZXJuYWwnIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaGFydCgpPy5nZXRSZW5kZXJNb2RlKCkgPz8gJ2F1dG8nO1xuICB9XG5cbiAgc2V0UmVuZGVyTW9kZShtb2RlOiAnYXV0bycgfCAnZXh0ZXJuYWwnKTogdm9pZCB7XG4gICAgdGhpcy5nZXRDaGFydCgpPy5zZXRSZW5kZXJNb2RlKG1vZGUpO1xuICB9XG5cbiAgc2V0T3B0aW9uKG9wdGlvbnM6IENoYXJ0Z3B1T3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuZ2V0Q2hhcnQoKT8uc2V0T3B0aW9uKG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0Wm9vbVJhbmdlKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBzb3VyY2U/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5nZXRDaGFydCgpPy5zZXRab29tUmFuZ2Uoc3RhcnQsIGVuZCwgc291cmNlKTtcbiAgfVxuXG4gIHNldEludGVyYWN0aW9uWCh4OiBudW1iZXIgfCBudWxsLCBzb3VyY2U/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5nZXRDaGFydCgpPy5zZXRJbnRlcmFjdGlvblgoeCwgc291cmNlKTtcbiAgfVxuXG4gIGdldEludGVyYWN0aW9uWCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDaGFydCgpPy5nZXRJbnRlcmFjdGlvblgoKSA/PyBudWxsO1xuICB9XG5cbiAgaGl0VGVzdChldmVudDogUG9pbnRlckV2ZW50IHwgTW91c2VFdmVudCkge1xuICAgIHJldHVybiB0aGlzLmdldENoYXJ0KCk/LmhpdFRlc3QoZXZlbnQpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldEVmZmVjdGl2ZU9wdGlvbnMoXG4gICAgb3B0aW9uczogQ2hhcnRncHVPcHRpb25zLFxuICAgIHRoZW1lOiBDaGFydGdwdU9wdGlvbnNbJ3RoZW1lJ10gfCB1bmRlZmluZWQsXG4gICk6IENoYXJ0Z3B1T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoZW1lICE9PSB1bmRlZmluZWQgPyB7IC4uLm9wdGlvbnMsIHRoZW1lIH0gOiBvcHRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Ub0NoYXJ0KGluc3RhbmNlOiBDaGFydEdQVUluc3RhbmNlKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgY2xpY2sgPSAocGF5bG9hZDogQ2hhcnRHUFVFdmVudFBheWxvYWQpID0+IHRoaXMuY2hhcnRDbGljay5lbWl0KHBheWxvYWQpO1xuICAgIGNvbnN0IG1vdXNlT3ZlciA9IChwYXlsb2FkOiBDaGFydEdQVUV2ZW50UGF5bG9hZCkgPT4gdGhpcy5tb3VzZU92ZXIuZW1pdChwYXlsb2FkKTtcbiAgICBjb25zdCBtb3VzZU91dCA9IChwYXlsb2FkOiBDaGFydEdQVUV2ZW50UGF5bG9hZCkgPT4gdGhpcy5tb3VzZU91dC5lbWl0KHBheWxvYWQpO1xuICAgIGNvbnN0IGNyb3NzaGFpck1vdmUgPSAocGF5bG9hZDogQ2hhcnRHUFVDcm9zc2hhaXJNb3ZlUGF5bG9hZCkgPT4gdGhpcy5jcm9zc2hhaXJNb3ZlLmVtaXQocGF5bG9hZCk7XG4gICAgY29uc3QgZGF0YUFwcGVuZCA9IChwYXlsb2FkOiBDaGFydGdwdURhdGFBcHBlbmRFdmVudCkgPT4gdGhpcy5kYXRhQXBwZW5kLmVtaXQocGF5bG9hZCk7XG4gICAgY29uc3Qgem9vbUNoYW5nZSA9IChwYXlsb2FkOiBDaGFydEdQVVpvb21SYW5nZUNoYW5nZVBheWxvYWQpID0+IHRoaXMuZW1pdFpvb21SYW5nZShwYXlsb2FkKTtcbiAgICBjb25zdCBkZXZpY2VMb3N0ID0gKHBheWxvYWQ6IENoYXJ0R1BVRGV2aWNlTG9zdFBheWxvYWQpID0+IHRoaXMuZGV2aWNlTG9zdC5lbWl0KHBheWxvYWQpO1xuXG4gICAgaW5zdGFuY2Uub24oJ2NsaWNrJywgY2xpY2spO1xuICAgIGluc3RhbmNlLm9uKCdtb3VzZW92ZXInLCBtb3VzZU92ZXIpO1xuICAgIGluc3RhbmNlLm9uKCdtb3VzZW91dCcsIG1vdXNlT3V0KTtcbiAgICBpbnN0YW5jZS5vbignY3Jvc3NoYWlyTW92ZScsIGNyb3NzaGFpck1vdmUpO1xuICAgIGluc3RhbmNlLm9uKCdkYXRhQXBwZW5kJywgZGF0YUFwcGVuZCk7XG4gICAgaW5zdGFuY2Uub24oJ3pvb21SYW5nZUNoYW5nZScsIHpvb21DaGFuZ2UpO1xuICAgIGluc3RhbmNlLm9uKCdkZXZpY2VMb3N0JywgZGV2aWNlTG9zdCk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKGluc3RhbmNlLmRpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlLm9mZignY2xpY2snLCBjbGljayk7XG4gICAgICBpbnN0YW5jZS5vZmYoJ21vdXNlb3ZlcicsIG1vdXNlT3Zlcik7XG4gICAgICBpbnN0YW5jZS5vZmYoJ21vdXNlb3V0JywgbW91c2VPdXQpO1xuICAgICAgaW5zdGFuY2Uub2ZmKCdjcm9zc2hhaXJNb3ZlJywgY3Jvc3NoYWlyTW92ZSk7XG4gICAgICBpbnN0YW5jZS5vZmYoJ2RhdGFBcHBlbmQnLCBkYXRhQXBwZW5kKTtcbiAgICAgIGluc3RhbmNlLm9mZignem9vbVJhbmdlQ2hhbmdlJywgem9vbUNoYW5nZSk7XG4gICAgICBpbnN0YW5jZS5vZmYoJ2RldmljZUxvc3QnLCBkZXZpY2VMb3N0KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0Wm9vbVJhbmdlKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICB0aGlzLnpvb21DaGFuZ2UuZW1pdCh7IHJhbmdlOiB7IHN0YXJ0OiByYW5nZS5zdGFydCwgZW5kOiByYW5nZS5lbmQgfSB9KTtcbiAgICB0aGlzLnpvb21SYW5nZUNoYW5nZS5lbWl0KHsgc3RhcnQ6IHJhbmdlLnN0YXJ0LCBlbmQ6IHJhbmdlLmVuZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZVJlc2l6ZShjb250YWluZXI6IEhUTUxEaXZFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGVudHJ5LmNvbnRlbnRSZWN0O1xuICAgICAgdGhpcy5yZXNpemUuZW1pdCh7IHdpZHRoLCBoZWlnaHQsIGNvbnRhaW5lciB9KTtcbiAgICAgIGlmICh0aGlzLnJlc2l6ZVRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lb3V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVzaXplVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNoYXJ0SW5zdGFuY2UoKT8ucmVzaXplKCk7XG4gICAgICAgIHRoaXMucmVzaXplVGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcik7XG4gIH1cblxuICBwcml2YXRlIHJlcG9ydEVycm9yKGNhdXNlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgZXJyb3IgPSBjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UgOiBuZXcgRXJyb3IoU3RyaW5nKGNhdXNlKSk7XG4gICAgdGhpcy5pbml0aWFsaXphdGlvbkVycm9yLnNldChlcnJvcik7XG4gICAgdGhpcy5jaGFydEVycm9yLmVtaXQoZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlQ2hhcnQoKTogdm9pZCB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmNoYXJ0SW5zdGFuY2UoKTtcbiAgICB0aGlzLnJlbW92ZUNoYXJ0TGlzdGVuZXJzPy4oKTtcbiAgICB0aGlzLnJlbW92ZUNoYXJ0TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICAgIGlmIChpbnN0YW5jZSAmJiAhaW5zdGFuY2UuZGlzcG9zZWQpIHtcbiAgICAgIGluc3RhbmNlLmRpc3Bvc2UoKTtcbiAgICAgIGlmICghdGhpcy5kZXN0cm95aW5nKSB7XG4gICAgICAgIHRoaXMuY2hhcnREaXNwb3NlLmVtaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jaGFydEluc3RhbmNlLnNldChudWxsKTtcbiAgICB0aGlzLmNoYXJ0Q29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3JlYXRlZFdpdGhPcHRpb25zID0gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnRncHUtYW5ndWxhci50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXJ0Z3B1LWFuZ3VsYXIvc3JjL2xpYi9jaGFydGdwdS1hbmd1bGFyLnR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENoYXJ0R1BVT3B0aW9ucyB9IGZyb20gJ2NoYXJ0Z3B1JztcbmltcG9ydCB0eXBlIHtcbiAgQW5pbWF0aW9uQ29uZmlnLFxuICBBbm5vdGF0aW9uQ29uZmlnLFxuICBBeGlzQ29uZmlnLFxuICBDaGFydEdQVUNyZWF0ZUNvbnRleHQsXG4gIENoYXJ0R1BVQ3Jvc3NoYWlyTW92ZVBheWxvYWQsXG4gIENoYXJ0R1BVRXZlbnRQYXlsb2FkLFxuICBDaGFydEdQVUhpdFRlc3RSZXN1bHQsXG4gIENoYXJ0R1BVSW5zdGFuY2UsXG4gIENoYXJ0R1BVRGV2aWNlTG9zdFBheWxvYWQsXG4gIENoYXJ0U3luY09wdGlvbnMsXG4gIERhdGFab29tQ29uZmlnLFxuICBEYXRhUG9pbnQsXG4gIE9ITENEYXRhUG9pbnQsXG4gIFBpcGVsaW5lQ2FjaGUsXG4gIFJlbmRlck1vZGUsXG4gIFNlcmllc0NvbmZpZyxcbiAgU2VyaWVzVHlwZSxcbiAgVGhlbWVDb25maWcsXG4gIFRvb2x0aXBDb25maWcsXG59IGZyb20gJ2NoYXJ0Z3B1JztcblxuZXhwb3J0IHR5cGUgQ2hhcnRncHVPcHRpb25zID0gQ2hhcnRHUFVPcHRpb25zO1xuZXhwb3J0IHR5cGUgQ2hhcnRncHVTZXJpZXNUeXBlID0gU2VyaWVzVHlwZTtcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1U2VyaWVzRGF0YSA9IEV4dHJhY3Q8U2VyaWVzQ29uZmlnLCB7IHR5cGU6ICdsaW5lJyB9PlsnZGF0YSddO1xuZXhwb3J0IHR5cGUgQ2hhcnRncHVTZXJpZXNPcHRpb25zID0gU2VyaWVzQ29uZmlnO1xuZXhwb3J0IHR5cGUgQ2hhcnRncHVBeGlzT3B0aW9ucyA9IEF4aXNDb25maWc7XG5leHBvcnQgdHlwZSBDaGFydGdwdVpvb21PcHRpb25zID0gRGF0YVpvb21Db25maWc7XG5leHBvcnQgdHlwZSBDaGFydGdwdVRvb2x0aXBPcHRpb25zID0gVG9vbHRpcENvbmZpZztcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1QW5pbWF0aW9uT3B0aW9ucyA9IEFuaW1hdGlvbkNvbmZpZyB8IGJvb2xlYW47XG5leHBvcnQgdHlwZSBDaGFydGdwdVRoZW1lT3B0aW9ucyA9IFRoZW1lQ29uZmlnIHwgJ2xpZ2h0JyB8ICdkYXJrJztcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1QW5ub3RhdGlvbk9wdGlvbnMgPSBBbm5vdGF0aW9uQ29uZmlnO1xuZXhwb3J0IHR5cGUgQ2hhcnRncHVUaHJlZURPcHRpb25zID0gUGljazxDaGFydEdQVU9wdGlvbnMsICdjb29yZGluYXRlU3lzdGVtJyB8ICdjYW1lcmEnIHwgJ2ludGVyYWN0aW9uM2QnIHwgJ2F4ZXMzZCc+O1xuZXhwb3J0IHR5cGUgQ2hhcnRncHVTdHJlYW1pbmdPcHRpb25zID0gUGljazxDaGFydEdQVU9wdGlvbnMsICdhdXRvU2Nyb2xsJz47XG5leHBvcnQgdHlwZSBDaGFydGdwdUludGVyYWN0aW9uT3B0aW9ucyA9IFBpY2s8Q2hhcnRHUFVPcHRpb25zLCAnZGF0YVpvb20nIHwgJ3Rvb2x0aXAnPjtcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1Q2hhcnRJbnN0YW5jZSA9IENoYXJ0R1BVSW5zdGFuY2U7XG5leHBvcnQgdHlwZSBDaGFydGdwdUdQVUNvbnRleHQgPSBDaGFydEdQVUNyZWF0ZUNvbnRleHQ7XG5leHBvcnQgdHlwZSBDaGFydGdwdVN0eWxlID0gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZD47XG5leHBvcnQgdHlwZSBDaGFydGdwdVpvb21SYW5nZSA9IE5vbk51bGxhYmxlPFJldHVyblR5cGU8Q2hhcnRHUFVJbnN0YW5jZVsnZ2V0Wm9vbVJhbmdlJ10+PjtcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1Q2xpY2tQYXJhbXMgPSBDaGFydEdQVUV2ZW50UGF5bG9hZDtcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1TW91c2VPdmVyUGFyYW1zID0gQ2hhcnRHUFVFdmVudFBheWxvYWQ7XG5leHBvcnQgdHlwZSBDaGFydGdwdUNyb3NzaGFpck1vdmVQYXJhbXMgPSBDaGFydEdQVUNyb3NzaGFpck1vdmVQYXlsb2FkO1xuZXhwb3J0IHR5cGUgQ2hhcnRncHVIaXRUZXN0UmVzdWx0ID0gQ2hhcnRHUFVIaXRUZXN0UmVzdWx0O1xuZXhwb3J0IHR5cGUgQ2hhcnRncHVSZW5kZXJNb2RlID0gUmVuZGVyTW9kZTtcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1U3luY09wdGlvbnMgPSBDaGFydFN5bmNPcHRpb25zO1xuXG5leHBvcnQgdHlwZSBDaGFydGdwdVhZQXJyYXlzRGF0YSA9IFJlYWRvbmx5PHtcbiAgeDogQXJyYXlMaWtlPG51bWJlcj47XG4gIHk6IEFycmF5TGlrZTxudW1iZXI+O1xuICBzaXplPzogQXJyYXlMaWtlPG51bWJlcj47XG59PjtcbmV4cG9ydCB0eXBlIENoYXJ0Z3B1SW50ZXJsZWF2ZWRYWURhdGEgPSBBcnJheUJ1ZmZlclZpZXc7XG5leHBvcnQgdHlwZSBDaGFydGdwdUNhcnRlc2lhblNlcmllc0RhdGEgPVxuICB8IFJlYWRvbmx5QXJyYXk8RGF0YVBvaW50IHwgbnVsbD5cbiAgfCBDaGFydGdwdVhZQXJyYXlzRGF0YVxuICB8IENoYXJ0Z3B1SW50ZXJsZWF2ZWRYWURhdGE7XG5leHBvcnQgdHlwZSBDaGFydGdwdUFwcGVuZERhdGFPcHRpb25zID0gUmVhZG9ubHk8eyBtYXhQb2ludHM/OiBudW1iZXIgfT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcnRncHVEYXRhQXBwZW5kRXZlbnQge1xuICBzZXJpZXNJbmRleDogbnVtYmVyO1xuICBjb3VudDogbnVtYmVyO1xuICB4RXh0ZW50OiB7IG1pbjogbnVtYmVyOyBtYXg6IG51bWJlciB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0Z3B1UmVhZHlFdmVudCB7XG4gIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcnRncHVSZXNpemVFdmVudCB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0Z3B1Q2xpY2tFdmVudCB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0Z3B1Wm9vbUNoYW5nZUV2ZW50IHtcbiAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFydGdwdVpvb21SYW5nZUNoYW5nZUV2ZW50IHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcnRncHVHUFVDb250ZXh0U3RhdGUge1xuICBhZGFwdGVyOiBDaGFydEdQVUNyZWF0ZUNvbnRleHRbJ2FkYXB0ZXInXSB8IG51bGw7XG4gIGRldmljZTogQ2hhcnRHUFVDcmVhdGVDb250ZXh0WydkZXZpY2UnXSB8IG51bGw7XG4gIHBpcGVsaW5lQ2FjaGU6IFBpcGVsaW5lQ2FjaGUgfCBudWxsO1xuICBlcnJvcjogRXJyb3IgfCBudWxsO1xuICBpc1JlYWR5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0Z3B1Q2hhcnRIYW5kbGUge1xuICBnZXRDaGFydCgpOiBDaGFydEdQVUluc3RhbmNlIHwgbnVsbDtcbiAgZ2V0Q29udGFpbmVyKCk6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgYXBwZW5kRGF0YShcbiAgICBzZXJpZXNJbmRleDogbnVtYmVyLFxuICAgIG5ld1BvaW50czogQ2hhcnRncHVDYXJ0ZXNpYW5TZXJpZXNEYXRhIHwgT0hMQ0RhdGFQb2ludFtdLFxuICAgIG9wdGlvbnM/OiBDaGFydGdwdUFwcGVuZERhdGFPcHRpb25zLFxuICApOiB2b2lkO1xuICByZW5kZXJGcmFtZSgpOiBib29sZWFuO1xuICBuZWVkc1JlbmRlcigpOiBib29sZWFuO1xuICBnZXRSZW5kZXJNb2RlKCk6IFJlbmRlck1vZGU7XG4gIHNldFJlbmRlck1vZGUobW9kZTogUmVuZGVyTW9kZSk6IHZvaWQ7XG4gIHNldE9wdGlvbihvcHRpb25zOiBDaGFydGdwdU9wdGlvbnMpOiB2b2lkO1xuICBzZXRab29tUmFuZ2Uoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHNvdXJjZT86IHVua25vd24pOiB2b2lkO1xuICBzZXRJbnRlcmFjdGlvblgoeDogbnVtYmVyIHwgbnVsbCwgc291cmNlPzogdW5rbm93bik6IHZvaWQ7XG4gIGdldEludGVyYWN0aW9uWCgpOiBudW1iZXIgfCBudWxsO1xuICBoaXRUZXN0KGV2ZW50OiBQb2ludGVyRXZlbnQgfCBNb3VzZUV2ZW50KTogQ2hhcnRHUFVIaXRUZXN0UmVzdWx0IHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUge1xuICBDaGFydEdQVUNyZWF0ZUNvbnRleHQsXG4gIENoYXJ0R1BVQ3Jvc3NoYWlyTW92ZVBheWxvYWQsXG4gIENoYXJ0R1BVRGV2aWNlTG9zdFBheWxvYWQsXG4gIENoYXJ0R1BVRXZlbnRQYXlsb2FkLFxuICBDaGFydEdQVUhpdFRlc3RSZXN1bHQsXG4gIENoYXJ0R1BVSW5zdGFuY2UsXG4gIENoYXJ0U3luY09wdGlvbnMsXG4gIERhdGFQb2ludCxcbiAgT0hMQ0RhdGFQb2ludCxcbiAgUGlwZWxpbmVDYWNoZSxcbiAgUmVuZGVyTW9kZSxcbn07XG4iXX0=
@@ -0,0 +1,64 @@
1
+ import { Directive, effect, input, output } from '@angular/core';
2
+ import { connectCharts } from 'chartgpu';
3
+ import * as i0 from "@angular/core";
4
+ export class ChartgpuConnectChartsDirective {
5
+ charts = input([], {
6
+ alias: 'libChartgpuConnectCharts',
7
+ });
8
+ syncOptions = input();
9
+ connectionError = output();
10
+ ids = new WeakMap();
11
+ nextId = 1;
12
+ signature;
13
+ constructor() {
14
+ effect(onCleanup => {
15
+ const charts = this.charts();
16
+ const options = this.syncOptions();
17
+ const optionsSignature = options
18
+ ? `crosshair=${options.syncCrosshair ?? ''},zoom=${options.syncZoom ?? ''}`
19
+ : '';
20
+ const signature = `${charts.map(chart => {
21
+ if (!chart) {
22
+ return 'null';
23
+ }
24
+ let id = this.ids.get(chart);
25
+ if (id === undefined) {
26
+ id = this.nextId++;
27
+ this.ids.set(chart, id);
28
+ }
29
+ return `${id}:${chart.disposed ? 1 : 0}`;
30
+ }).join('|')}|${optionsSignature}`;
31
+ if (signature === this.signature) {
32
+ return;
33
+ }
34
+ this.signature = signature;
35
+ if (charts.length === 0 || charts.some(chart => !chart || chart.disposed)) {
36
+ return;
37
+ }
38
+ const resolved = [];
39
+ for (const chart of charts) {
40
+ if (!chart || chart.disposed) {
41
+ return;
42
+ }
43
+ resolved.push(chart);
44
+ }
45
+ try {
46
+ const disconnect = connectCharts(resolved, options);
47
+ onCleanup(disconnect);
48
+ }
49
+ catch (cause) {
50
+ this.connectionError.emit(cause instanceof Error ? cause : new Error(String(cause)));
51
+ }
52
+ });
53
+ }
54
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuConnectChartsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
55
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: ChartgpuConnectChartsDirective, isStandalone: true, selector: "[libChartgpuConnectCharts]", inputs: { charts: { classPropertyName: "charts", publicName: "libChartgpuConnectCharts", isSignal: true, isRequired: false, transformFunction: null }, syncOptions: { classPropertyName: "syncOptions", publicName: "syncOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { connectionError: "connectionError" }, ngImport: i0 });
56
+ }
57
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuConnectChartsDirective, decorators: [{
58
+ type: Directive,
59
+ args: [{
60
+ selector: '[libChartgpuConnectCharts]',
61
+ standalone: true,
62
+ }]
63
+ }], ctorParameters: () => [] });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdC1jaGFydHMuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhcnRncHUtYW5ndWxhci9zcmMvbGliL2Nvbm5lY3QtY2hhcnRzLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBT3pDLE1BQU0sT0FBTyw4QkFBOEI7SUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBcUQsRUFBRSxFQUFFO1FBQzlFLEtBQUssRUFBRSwwQkFBMEI7S0FDbEMsQ0FBQyxDQUFDO0lBQ00sV0FBVyxHQUFHLEtBQUssRUFBZ0MsQ0FBQztJQUNwRCxlQUFlLEdBQUcsTUFBTSxFQUFTLENBQUM7SUFFMUIsR0FBRyxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFDO0lBQzdDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDWCxTQUFTLENBQXFCO0lBRXRDO1FBQ0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPO2dCQUM5QixDQUFDLENBQUMsYUFBYSxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsU0FBUyxPQUFPLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFBRTtnQkFDM0UsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLE1BQU0sU0FBUyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNYLE9BQU8sTUFBTSxDQUFDO2dCQUNoQixDQUFDO2dCQUVELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDckIsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQixDQUFDO2dCQUNELE9BQU8sR0FBRyxFQUFFLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUVuQyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFFM0IsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQXVCLEVBQUUsQ0FBQztZQUN4QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDN0IsT0FBTztnQkFDVCxDQUFDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRCxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEIsQ0FBQztZQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQXZEVSw4QkFBOEI7NEZBQTlCLDhCQUE4Qjs7NEZBQTlCLDhCQUE4QjtrQkFKMUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsNEJBQTRCO29CQUN0QyxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIGVmZmVjdCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29ubmVjdENoYXJ0cyB9IGZyb20gJ2NoYXJ0Z3B1JztcbmltcG9ydCB0eXBlIHsgQ2hhcnRHUFVJbnN0YW5jZSwgQ2hhcnRTeW5jT3B0aW9ucyB9IGZyb20gJ2NoYXJ0Z3B1JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2xpYkNoYXJ0Z3B1Q29ubmVjdENoYXJ0c10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydGdwdUNvbm5lY3RDaGFydHNEaXJlY3RpdmUge1xuICByZWFkb25seSBjaGFydHMgPSBpbnB1dDxSZWFkb25seUFycmF5PENoYXJ0R1BVSW5zdGFuY2UgfCBudWxsIHwgdW5kZWZpbmVkPj4oW10sIHtcbiAgICBhbGlhczogJ2xpYkNoYXJ0Z3B1Q29ubmVjdENoYXJ0cycsXG4gIH0pO1xuICByZWFkb25seSBzeW5jT3B0aW9ucyA9IGlucHV0PENoYXJ0U3luY09wdGlvbnMgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25FcnJvciA9IG91dHB1dDxFcnJvcj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlkcyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgbnVtYmVyPigpO1xuICBwcml2YXRlIG5leHRJZCA9IDE7XG4gIHByaXZhdGUgc2lnbmF0dXJlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KG9uQ2xlYW51cCA9PiB7XG4gICAgICBjb25zdCBjaGFydHMgPSB0aGlzLmNoYXJ0cygpO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuc3luY09wdGlvbnMoKTtcbiAgICAgIGNvbnN0IG9wdGlvbnNTaWduYXR1cmUgPSBvcHRpb25zXG4gICAgICAgID8gYGNyb3NzaGFpcj0ke29wdGlvbnMuc3luY0Nyb3NzaGFpciA/PyAnJ30sem9vbT0ke29wdGlvbnMuc3luY1pvb20gPz8gJyd9YFxuICAgICAgICA6ICcnO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gYCR7Y2hhcnRzLm1hcChjaGFydCA9PiB7XG4gICAgICAgIGlmICghY2hhcnQpIHtcbiAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlkID0gdGhpcy5pZHMuZ2V0KGNoYXJ0KTtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZCA9IHRoaXMubmV4dElkKys7XG4gICAgICAgICAgdGhpcy5pZHMuc2V0KGNoYXJ0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2lkfToke2NoYXJ0LmRpc3Bvc2VkID8gMSA6IDB9YDtcbiAgICAgIH0pLmpvaW4oJ3wnKX18JHtvcHRpb25zU2lnbmF0dXJlfWA7XG5cbiAgICAgIGlmIChzaWduYXR1cmUgPT09IHRoaXMuc2lnbmF0dXJlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXG4gICAgICBpZiAoY2hhcnRzLmxlbmd0aCA9PT0gMCB8fCBjaGFydHMuc29tZShjaGFydCA9PiAhY2hhcnQgfHwgY2hhcnQuZGlzcG9zZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzb2x2ZWQ6IENoYXJ0R1BVSW5zdGFuY2VbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjaGFydCBvZiBjaGFydHMpIHtcbiAgICAgICAgaWYgKCFjaGFydCB8fCBjaGFydC5kaXNwb3NlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlZC5wdXNoKGNoYXJ0KTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlzY29ubmVjdCA9IGNvbm5lY3RDaGFydHMocmVzb2x2ZWQsIG9wdGlvbnMpO1xuICAgICAgICBvbkNsZWFudXAoZGlzY29ubmVjdCk7XG4gICAgICB9IGNhdGNoIChjYXVzZTogdW5rbm93bikge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25FcnJvci5lbWl0KGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZSA6IG5ldyBFcnJvcihTdHJpbmcoY2F1c2UpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ import { makeEnvironmentProviders } from '@angular/core';
2
+ import { ChartgpuGPUContextService } from './gpu-context.service';
3
+ export function provideChartGpuContext() {
4
+ return makeEnvironmentProviders([ChartgpuGPUContextService]);
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3B1LWNvbnRleHQucHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGFydGdwdS1hbmd1bGFyL3NyYy9saWIvZ3B1LWNvbnRleHQucHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxFLE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyx3QkFBd0IsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFydGdwdUdQVUNvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi9ncHUtY29udGV4dC5zZXJ2aWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVDaGFydEdwdUNvbnRleHQoKSB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW0NoYXJ0Z3B1R1BVQ29udGV4dFNlcnZpY2VdKTtcbn0iXX0=