@tetacom/svg-charts 1.2.29 → 1.3.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.
Files changed (36) hide show
  1. package/chart/chart/chart.component.d.ts +5 -2
  2. package/chart/chart-container/chart-container.component.d.ts +1 -1
  3. package/chart/chart-container/series/linear-series-base.d.ts +0 -3
  4. package/chart/core/axis/axis.d.ts +2 -2
  5. package/chart/directives/brushable.directive.d.ts +15 -5
  6. package/chart/directives/zoomable.directive.d.ts +6 -11
  7. package/chart/model/enum/clip-points-direction.d.ts +2 -1
  8. package/chart/model/i-broadcast-message.d.ts +18 -19
  9. package/chart/model/marker-options.d.ts +1 -1
  10. package/chart/service/broadcast.service.d.ts +1 -4
  11. package/chart/service/brush.service.d.ts +6 -13
  12. package/chart/service/chart.service.d.ts +0 -4
  13. package/chart/service/scale.service.d.ts +1 -1
  14. package/chart/service/zoom.service.d.ts +15 -15
  15. package/esm2020/chart/chart/chart.component.mjs +17 -17
  16. package/esm2020/chart/chart-container/chart-container.component.mjs +3 -3
  17. package/esm2020/chart/chart-container/crosshair/crosshair.component.mjs +1 -2
  18. package/esm2020/chart/chart-container/plotband/plot-band.component.mjs +4 -2
  19. package/esm2020/chart/chart-container/series/line/line-series.component.mjs +3 -3
  20. package/esm2020/chart/chart-container/series/linear-series-base.mjs +4 -72
  21. package/esm2020/chart/core/axis/axis.mjs +2 -2
  22. package/esm2020/chart/directives/brushable.directive.mjs +120 -10
  23. package/esm2020/chart/directives/zoomable.directive.mjs +90 -197
  24. package/esm2020/chart/model/enum/clip-points-direction.mjs +2 -1
  25. package/esm2020/chart/model/i-broadcast-message.mjs +4 -6
  26. package/esm2020/chart/model/marker-options.mjs +1 -1
  27. package/esm2020/chart/service/broadcast.service.mjs +4 -17
  28. package/esm2020/chart/service/brush.service.mjs +11 -147
  29. package/esm2020/chart/service/chart.service.mjs +17 -9
  30. package/esm2020/chart/service/scale.service.mjs +19 -21
  31. package/esm2020/chart/service/zoom.service.mjs +48 -53
  32. package/fesm2015/tetacom-svg-charts.mjs +372 -585
  33. package/fesm2015/tetacom-svg-charts.mjs.map +1 -1
  34. package/fesm2020/tetacom-svg-charts.mjs +355 -565
  35. package/fesm2020/tetacom-svg-charts.mjs.map +1 -1
  36. package/package.json +1 -1
@@ -4,6 +4,7 @@ import { IChartConfig } from '../model/i-chart-config';
4
4
  import { BasePoint } from '../model/base-point';
5
5
  import { ZoomService } from '../service/zoom.service';
6
6
  import { ScaleService } from '../service/scale.service';
7
+ import { BrushService } from '../service/brush.service';
7
8
  import { IChartEvent } from '../model/i-chart-event';
8
9
  import { PlotLine } from '../model/plot-line';
9
10
  import { PlotBand } from '../model/plot-band';
@@ -14,6 +15,7 @@ import * as i0 from "@angular/core";
14
15
  export declare class ChartComponent implements OnInit, OnChanges, OnDestroy {
15
16
  chartService: ChartService;
16
17
  zoomService: ZoomService;
18
+ brushService: BrushService;
17
19
  scaleService: ScaleService;
18
20
  hasSeriesData: Observable<boolean>;
19
21
  svcConfig: Observable<IChartConfig>;
@@ -29,13 +31,14 @@ export declare class ChartComponent implements OnInit, OnChanges, OnDestroy {
29
31
  annotationClick: EventEmitter<IChartEvent<Annotation>>;
30
32
  annotationMove: EventEmitter<IChartEvent<Annotation>>;
31
33
  zoomServiceInstance: EventEmitter<ZoomService>;
34
+ brushServiceInstance: EventEmitter<BrushService>;
32
35
  set config(config: IChartConfig);
33
36
  private _alive;
34
- constructor(chartService: ChartService, zoomService: ZoomService, scaleService: ScaleService);
37
+ constructor(chartService: ChartService, zoomService: ZoomService, brushService: BrushService, scaleService: ScaleService);
35
38
  ngOnChanges(changes: SimpleChanges): void;
36
39
  ngOnInit(): void;
37
40
  ngAfterViewInit(): void;
38
41
  ngOnDestroy(): void;
39
42
  static ɵfac: i0.ɵɵFactoryDeclaration<ChartComponent, never>;
40
- static ɵcmp: i0.ɵɵComponentDeclaration<ChartComponent, "teta-svg-chart", never, { "config": "config"; }, { "pointerMove": "pointerMove"; "plotBandsMove": "plotBandsMove"; "plotBandClick": "plotBandClick"; "plotBandContextMenu": "plotBandContextMenu"; "plotLinesMove": "plotLinesMove"; "pointMove": "pointMove"; "chartClick": "chartClick"; "chartContextMenu": "chartContextMenu"; "annotationContextMenu": "annotationContextMenu"; "annotationClick": "annotationClick"; "annotationMove": "annotationMove"; "zoomServiceInstance": "zoomServiceInstance"; }, never, ["*"], false>;
43
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChartComponent, "teta-svg-chart", never, { "config": "config"; }, { "pointerMove": "pointerMove"; "plotBandsMove": "plotBandsMove"; "plotBandClick": "plotBandClick"; "plotBandContextMenu": "plotBandContextMenu"; "plotLinesMove": "plotLinesMove"; "pointMove": "pointMove"; "chartClick": "chartClick"; "chartContextMenu": "chartContextMenu"; "annotationContextMenu": "annotationContextMenu"; "annotationClick": "annotationClick"; "annotationMove": "annotationMove"; "zoomServiceInstance": "zoomServiceInstance"; "brushServiceInstance": "brushServiceInstance"; }, never, ["*"], false>;
41
44
  }
@@ -32,7 +32,7 @@ export declare class ChartContainerComponent implements OnInit, OnDestroy {
32
32
  private sumSize;
33
33
  getTranslate(axis?: Axis, size?: DOMRect): Observable<string>;
34
34
  identify(index: any, item: any): any;
35
- click(event: PointerEvent, xScales: Map<number, Axis>, yScales: Map<number, Axis>): void;
35
+ click(event: MouseEvent, xScales: Map<number, Axis>, yScales: Map<number, Axis>): void;
36
36
  contextMenu(event: MouseEvent, xScales: Map<number, Axis>, yScales: Map<number, Axis>): void;
37
37
  mouseMove(event: any): void;
38
38
  mouseLeave(event: any): void;
@@ -18,11 +18,9 @@ export declare class LinearSeriesBase<T extends BasePoint> extends SeriesBaseCom
18
18
  transform: Observable<Pick<BasePoint, 'x' | 'y'>>;
19
19
  display: Observable<number>;
20
20
  path: Observable<string>;
21
- svgElement: SVGGeometryElement;
22
21
  x: any;
23
22
  y: any;
24
23
  markers: BasePoint[];
25
- markerListeners: any;
26
24
  private __series;
27
25
  protected _update: BehaviorSubject<void>;
28
26
  set series(series: Series<T>);
@@ -31,7 +29,6 @@ export declare class LinearSeriesBase<T extends BasePoint> extends SeriesBaseCom
31
29
  ngOnInit(): void;
32
30
  ngOnDestroy(): void;
33
31
  ngAfterViewInit(): void;
34
- addDragEvents(): void;
35
32
  getTransform(event: any, scaleX: any, scaleY: any): Pick<BasePoint, 'x' | 'y'>;
36
33
  static ɵfac: i0.ɵɵFactoryDeclaration<LinearSeriesBase<any>, never>;
37
34
  static ɵcmp: i0.ɵɵComponentDeclaration<LinearSeriesBase<any>, "ng-component", never, { "series": "series"; }, {}, never, never, false>;
@@ -44,7 +44,7 @@ export declare class Axis {
44
44
  */
45
45
  linkedSeries(): Array<Series<BasePoint>>;
46
46
  setExtremes(): void;
47
- setOriginDomain(domain: Array<any>): void;
47
+ setOriginDomain(domain: [number, number]): void;
48
48
  setScale(scale: any): void;
49
49
  private setSelfSize;
50
50
  private setTicksValues;
@@ -56,7 +56,7 @@ export declare class Axis {
56
56
  get tickValues(): number[];
57
57
  get index(): number;
58
58
  get options(): AxisOptions;
59
- get originDomain(): Array<any>;
59
+ get originDomain(): [number, number];
60
60
  defaultFormatter(): any;
61
61
  defaultScale(): any;
62
62
  }
@@ -1,18 +1,28 @@
1
- import { AfterViewInit, ElementRef, OnInit, SimpleChanges } from '@angular/core';
1
+ import { AfterViewInit, ElementRef, NgZone, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
2
2
  import { IChartConfig } from '../model/i-chart-config';
3
3
  import { BrushService } from '../service/brush.service';
4
4
  import { ChartService } from '../service/chart.service';
5
+ import { Axis } from '../core/axis/axis';
5
6
  import * as i0 from "@angular/core";
6
- export declare class BrushableDirective implements OnInit, AfterViewInit {
7
+ export declare class BrushableDirective implements OnDestroy, OnInit, AfterViewInit, OnChanges {
7
8
  private brushService;
8
9
  private chartService;
9
10
  private element;
11
+ private zone;
10
12
  config: IChartConfig;
11
- brushScale: any;
12
- constructor(brushService: BrushService, chartService: ChartService, element: ElementRef);
13
+ axis: Axis;
14
+ private selection;
15
+ private brush;
16
+ private brushMap;
17
+ private _alive;
18
+ private _container;
19
+ constructor(brushService: BrushService, chartService: ChartService, element: ElementRef, zone: NgZone);
13
20
  ngOnInit(): void;
21
+ ngOnDestroy(): void;
14
22
  ngAfterViewInit(): void;
15
23
  ngOnChanges(changes: SimpleChanges): void;
24
+ applyBrush(config: IChartConfig, brushScale: any): void;
25
+ clearPreviousSelection(): void;
16
26
  static ɵfac: i0.ɵɵFactoryDeclaration<BrushableDirective, never>;
17
- static ɵdir: i0.ɵɵDirectiveDeclaration<BrushableDirective, "[tetaBrushable]", never, { "config": "config"; "brushScale": "brushScale"; }, {}, never, never, false>;
27
+ static ɵdir: i0.ɵɵDirectiveDeclaration<BrushableDirective, "[tetaBrushable]", never, { "config": "config"; "axis": "axis"; }, {}, never, never, false>;
18
28
  }
@@ -1,37 +1,32 @@
1
- import { AfterViewInit, ElementRef, NgZone, OnDestroy, SimpleChanges } from '@angular/core';
1
+ import { AfterViewInit, ElementRef, NgZone, OnDestroy } from '@angular/core';
2
2
  import { ZoomService } from '../service/zoom.service';
3
3
  import { IChartConfig } from '../model/i-chart-config';
4
4
  import { Axis } from '../core/axis/axis';
5
5
  import { D3ZoomEvent } from 'd3';
6
- import { BroadcastService } from '../service/broadcast.service';
7
6
  import { ChartService } from '../service/chart.service';
8
7
  import * as i0 from "@angular/core";
9
8
  export declare class ZoomableDirective implements OnDestroy, AfterViewInit {
10
9
  private elementRef;
11
10
  private zoomService;
12
- private broadcastService;
13
11
  private chartService;
14
12
  private zone;
15
13
  config: IChartConfig;
16
14
  axis: Axis;
17
15
  size: DOMRect;
18
- brushScale?: any;
19
- scale?: any;
20
16
  private zoomable;
21
17
  private crosshair;
22
18
  private _element;
23
19
  private zoom;
24
20
  private alive;
25
21
  private currentTransform;
26
- private currentSelection;
27
- private hash;
28
- constructor(elementRef: ElementRef, zoomService: ZoomService, broadcastService: BroadcastService, chartService: ChartService, zone: NgZone);
22
+ constructor(elementRef: ElementRef, zoomService: ZoomService, chartService: ChartService, zone: NgZone);
29
23
  ngOnInit(): void;
30
- ngOnChanges(changes: SimpleChanges): void;
31
24
  ngAfterViewInit(): void;
32
25
  ngOnDestroy(): void;
26
+ private initZoomSync;
27
+ private initZoomListeners;
33
28
  zoomed: (event: D3ZoomEvent<any, any>) => void;
34
- private runWheelZoom;
29
+ private runWheelTranslate;
35
30
  static ɵfac: i0.ɵɵFactoryDeclaration<ZoomableDirective, never>;
36
- static ɵdir: i0.ɵɵDirectiveDeclaration<ZoomableDirective, "[tetaZoomable]", never, { "config": "config"; "axis": "axis"; "size": "size"; "brushScale": "brushScale"; "scale": "scale"; }, {}, never, never, false>;
31
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ZoomableDirective, "[tetaZoomable]", never, { "config": "config"; "axis": "axis"; "size": "size"; }, {}, never, never, false>;
37
32
  }
@@ -1,4 +1,5 @@
1
1
  export declare enum ClipPointsDirection {
2
2
  x = 0,
3
- y = 1
3
+ y = 1,
4
+ none = 2
4
5
  }
@@ -1,35 +1,34 @@
1
- import { D3BrushEvent, D3ZoomEvent } from 'd3';
2
- import { Axis } from '../core/axis/axis';
3
- import { BrushType } from './enum/brush-type';
1
+ import { AxisOrientation } from './enum/axis-orientation';
2
+ import { ElementRef } from '@angular/core';
4
3
  export declare type TransformStyle = {
5
4
  transition?: boolean;
6
5
  };
6
+ export declare type TargetAxis = {
7
+ index: number;
8
+ orientation: AxisOrientation;
9
+ };
7
10
  export declare class ZoomMessage {
8
- event?: D3ZoomEvent<any, any> | any;
9
- axis?: Axis;
10
- domain?: number[];
11
+ eventType: 'start' | 'zoom' | 'end' | string;
12
+ element?: ElementRef;
13
+ axis: TargetAxis;
14
+ domain?: [number, number];
11
15
  chartId: string;
12
16
  style?: TransformStyle;
13
17
  constructor(options?: {
14
- event: D3ZoomEvent<any, any> | any;
15
- axis?: Axis;
16
- domain?: number[];
18
+ eventType: 'start' | 'zoom' | 'end' | string;
19
+ element?: ElementRef;
20
+ axis?: TargetAxis;
21
+ domain?: [number, number];
17
22
  chartId: string;
18
23
  style?: TransformStyle;
19
24
  });
20
25
  }
21
26
  export declare class BrushMessage {
22
- event: D3BrushEvent<any> | null;
23
- brushType: BrushType;
24
- selection: number[];
25
- brushScale?: any;
26
- style?: TransformStyle;
27
+ chartId: string;
28
+ selection: [number, number];
27
29
  constructor(options?: {
28
- event: D3BrushEvent<any> | null;
29
- brushType: BrushType;
30
- selection: number[];
31
- brushScale?: any;
32
- style?: TransformStyle;
30
+ chartId: string;
31
+ selection: [number, number];
33
32
  });
34
33
  }
35
34
  export interface IBroadcastMessage<T> {
@@ -2,7 +2,7 @@ import { DragPointType } from './enum/drag-point-type';
2
2
  import { SvgAttributes } from './svg-attributes';
3
3
  export interface DragObjectOptions {
4
4
  draggable?: boolean;
5
- dragType: DragPointType;
5
+ dragType?: DragPointType;
6
6
  minX?: number;
7
7
  minY?: number;
8
8
  maxX?: number;
@@ -1,14 +1,11 @@
1
- import { BrushMessage, IBroadcastMessage, ZoomMessage } from '../model/i-broadcast-message';
1
+ import { IBroadcastMessage, ZoomMessage } from '../model/i-broadcast-message';
2
2
  import { Observable } from 'rxjs';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class BroadcastService {
5
5
  private zoomEmitter;
6
- private brushEmitter;
7
6
  constructor();
8
7
  broadcastZoom(value: IBroadcastMessage<ZoomMessage>): void;
9
- broadcastBrush(value: IBroadcastMessage<BrushMessage>): void;
10
8
  subscribeToZoom(channel: string): Observable<IBroadcastMessage<ZoomMessage>>;
11
- subscribeToBrush(channel: string): Observable<IBroadcastMessage<BrushMessage>>;
12
9
  static ɵfac: i0.ɵɵFactoryDeclaration<BroadcastService, never>;
13
10
  static ɵprov: i0.ɵɵInjectableDeclaration<BroadcastService>;
14
11
  }
@@ -1,18 +1,11 @@
1
- import { ElementRef, NgZone } from '@angular/core';
2
- import { Subscription } from 'rxjs';
3
- import { BroadcastService } from './broadcast.service';
4
- import { IChartConfig } from '../model/i-chart-config';
1
+ import { Observable } from 'rxjs';
2
+ import { BrushMessage } from '../model/i-broadcast-message';
5
3
  import * as i0 from "@angular/core";
6
4
  export declare class BrushService {
7
- private broadcastService;
8
- private zone;
9
- broadcastSubscribtion: Subscription;
10
- private brush;
11
- private brushMap;
12
- private selection;
13
- constructor(broadcastService: BroadcastService, zone: NgZone);
14
- applyBrush(svgElement: ElementRef, config: IChartConfig, brushScale: any): void;
15
- clearPreviousSelection(): void;
5
+ brushDomain: Observable<BrushMessage>;
6
+ private _brushDomain;
7
+ constructor();
8
+ setBrush(brush: BrushMessage): void;
16
9
  static ɵfac: i0.ɵɵFactoryDeclaration<BrushService, never>;
17
10
  static ɵprov: i0.ɵɵInjectableDeclaration<BrushService>;
18
11
  }
@@ -8,7 +8,6 @@ import { IPointMove } from '../model/i-point-move';
8
8
  import { BasePoint } from '../model/base-point';
9
9
  import { Series } from '../model/series';
10
10
  import { Annotation } from '../model/annotation';
11
- import { ZoomService } from "./zoom.service";
12
11
  import * as i0 from "@angular/core";
13
12
  export declare class ChartService {
14
13
  id: Observable<string>;
@@ -26,7 +25,6 @@ export declare class ChartService {
26
25
  annotationContextMenu: Observable<IChartEvent<Annotation>>;
27
26
  chartClick: Observable<IChartEvent<BasePoint>>;
28
27
  chartContextMenu: Observable<IChartEvent<BasePoint>>;
29
- zoomInstance: Observable<ZoomService>;
30
28
  private config$;
31
29
  private size$;
32
30
  private pointerMove$;
@@ -38,7 +36,6 @@ export declare class ChartService {
38
36
  private chartContextMenu$;
39
37
  private annotationEvent$;
40
38
  private annotationMove$;
41
- private zoomInstance$;
42
39
  private static _hiddenSeriesPostfix;
43
40
  constructor();
44
41
  setConfig(config: IChartConfig): void;
@@ -54,7 +51,6 @@ export declare class ChartService {
54
51
  emitPoint(event: IChartEvent<IPointMove>): void;
55
52
  emitChartClick(event: IChartEvent<BasePoint>): void;
56
53
  emitChartContextMenu(event: IChartEvent<BasePoint>): void;
57
- emitZoomInstance(event: ZoomService): void;
58
54
  private saveCookie;
59
55
  private restoreLocalStorage;
60
56
  private setDefaults;
@@ -1,7 +1,7 @@
1
1
  import { ChartService } from './chart.service';
2
2
  import { Observable } from 'rxjs';
3
3
  import { ZoomService } from './zoom.service';
4
- import { IScalesMap } from "../model/i-scales-map";
4
+ import { IScalesMap } from '../model/i-scales-map';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class ScaleService {
7
7
  private chartService;
@@ -1,23 +1,23 @@
1
1
  import { Observable } from 'rxjs';
2
- import { Axis } from '../core/axis/axis';
3
- import { IChartEvent } from '../model/i-chart-event';
4
- import { ZoomBehavior } from "d3";
5
- import { AxisOrientation } from "../model/enum/axis-orientation";
2
+ import { AxisOrientation } from '../model/enum/axis-orientation';
3
+ import { OnDestroy } from '@angular/core';
4
+ import { ZoomMessage } from '../model/i-broadcast-message';
5
+ import { BroadcastService } from './broadcast.service';
6
+ import { ChartService } from './chart.service';
6
7
  import * as i0 from "@angular/core";
7
- export declare class ZoomService {
8
- broadcastSubscription: any[];
9
- zoomed: Observable<IChartEvent<Axis>>;
10
- axisHashMap: Map<string, Axis>;
11
- scaleHashMap: Map<string, any>;
12
- elementHashMap: Map<string, any>;
13
- zoomHashMap: Map<string, ZoomBehavior<any, any>>;
8
+ export declare class ZoomService implements OnDestroy {
9
+ private _broadcast;
10
+ private _chart;
11
+ zoomed: Observable<ZoomMessage>;
14
12
  private zoomed$;
15
13
  private broadcastChannel;
16
- constructor();
17
- fireZoom(zoom: IChartEvent<Axis>): void;
14
+ private broadcastSub;
15
+ constructor(_broadcast: BroadcastService, _chart: ChartService);
16
+ fireZoom(zoom: ZoomMessage): void;
17
+ broadcastZoom(zoom: ZoomMessage): void;
18
18
  setBroadcastChannel(channel: string): void;
19
- setZoom(from: number, to: number, axisIndex?: number, axisOrientation?: AxisOrientation): void;
20
- resetZoom(axisIndex?: number, axisOrientation?: AxisOrientation): void;
19
+ getD3Transform(targetDomain: [number, number], originalDomain: [number, number], scale: any, orientation: AxisOrientation, inverted: boolean): import("d3-zoom").ZoomTransform;
20
+ ngOnDestroy(): void;
21
21
  static ɵfac: i0.ɵɵFactoryDeclaration<ZoomService, never>;
22
22
  static ɵprov: i0.ɵɵInjectableDeclaration<ZoomService>;
23
23
  }
@@ -8,14 +8,16 @@ import { TooltipTracking } from '../model/enum/tooltip-tracking';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "../service/chart.service";
10
10
  import * as i2 from "../service/zoom.service";
11
- import * as i3 from "../service/scale.service";
12
- import * as i4 from "@angular/common";
13
- import * as i5 from "../chart-container/chart-container.component";
14
- import * as i6 from "../legend/legend.component";
11
+ import * as i3 from "../service/brush.service";
12
+ import * as i4 from "../service/scale.service";
13
+ import * as i5 from "@angular/common";
14
+ import * as i6 from "../chart-container/chart-container.component";
15
+ import * as i7 from "../legend/legend.component";
15
16
  export class ChartComponent {
16
- constructor(chartService, zoomService, scaleService) {
17
+ constructor(chartService, zoomService, brushService, scaleService) {
17
18
  this.chartService = chartService;
18
19
  this.zoomService = zoomService;
20
+ this.brushService = brushService;
19
21
  this.scaleService = scaleService;
20
22
  this.pointerMove = new EventEmitter();
21
23
  this.plotBandsMove = new EventEmitter();
@@ -29,16 +31,20 @@ export class ChartComponent {
29
31
  this.annotationClick = new EventEmitter();
30
32
  this.annotationMove = new EventEmitter();
31
33
  this.zoomServiceInstance = new EventEmitter();
34
+ this.brushServiceInstance = new EventEmitter();
32
35
  this._alive = true;
33
36
  this.svcConfig = this.chartService.config;
34
37
  this.hasSeriesData = this.svcConfig.pipe(map((_) => _.series?.length > 0 && _.series?.some((_) => _.data?.length > 0)));
35
38
  }
36
39
  set config(config) {
37
40
  this.chartService.setConfig(config);
41
+ this.zoomService.setBroadcastChannel(config?.zoom?.syncChannel);
38
42
  }
39
43
  ngOnChanges(changes) {
40
44
  }
41
45
  ngOnInit() {
46
+ this.zoomServiceInstance.emit(this.zoomService);
47
+ this.brushServiceInstance.emit(this.brushService);
42
48
  this.chartService.pointerMove
43
49
  .pipe(takeWhile(() => this._alive), withLatestFrom(this.scaleService.scales, this.chartService.config))
44
50
  .subscribe((data) => {
@@ -109,27 +115,19 @@ export class ChartComponent {
109
115
  .subscribe((_) => {
110
116
  this.annotationMove.emit(_);
111
117
  });
112
- this.chartService.zoomInstance
113
- .pipe(takeWhile(() => this._alive))
114
- .subscribe((_) => {
115
- this.zoomServiceInstance.emit(_);
116
- });
117
118
  }
118
119
  ngAfterViewInit() {
119
120
  }
120
121
  ngOnDestroy() {
121
122
  this._alive = false;
122
- this.zoomService.broadcastSubscription?.forEach((sub) => {
123
- sub.unsubscribe();
124
- });
125
123
  }
126
124
  }
127
- ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: ChartComponent, deps: [{ token: i1.ChartService }, { token: i2.ZoomService }, { token: i3.ScaleService }], target: i0.ɵɵFactoryTarget.Component });
128
- ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: ChartComponent, selector: "teta-svg-chart", inputs: { config: "config" }, outputs: { pointerMove: "pointerMove", plotBandsMove: "plotBandsMove", plotBandClick: "plotBandClick", plotBandContextMenu: "plotBandContextMenu", plotLinesMove: "plotLinesMove", pointMove: "pointMove", chartClick: "chartClick", chartContextMenu: "chartContextMenu", annotationContextMenu: "annotationContextMenu", annotationClick: "annotationClick", annotationMove: "annotationMove", zoomServiceInstance: "zoomServiceInstance" }, providers: [ChartService, ZoomService, ScaleService, BrushService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"{\n hasSeriesData: hasSeriesData | async,\n svcConfig: svcConfig | async\n} as data\">\n <ng-container *ngIf=\"data.hasSeriesData === true else noData\">\n <div class=\"column column_auto\">\n <teta-chart-container class=\"chart-container position-relative\"></teta-chart-container>\n </div>\n <teta-legend *ngIf=\"data.svcConfig.legend?.enable === true\" [series]=\"data.svcConfig.series\"></teta-legend>\n </ng-container>\n</ng-container>\n<ng-template #noData>\n <div class=\"column column_auto justify-content-center\">\n <span class=\"font-body-3 color-text-40 overflow-hidden text-overflow-ellipsis nowrap text-align-center\">\n <div #ref><ng-content></ng-content></div>\n <span *ngIf=\"!ref.hasChildNodes()\">\n No data\n </span>\n </span>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:flex;flex-direction:column;height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.ChartContainerComponent, selector: "teta-chart-container" }, { kind: "component", type: i6.LegendComponent, selector: "teta-legend", inputs: ["series"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
125
+ ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: ChartComponent, deps: [{ token: i1.ChartService }, { token: i2.ZoomService }, { token: i3.BrushService }, { token: i4.ScaleService }], target: i0.ɵɵFactoryTarget.Component });
126
+ ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: ChartComponent, selector: "teta-svg-chart", inputs: { config: "config" }, outputs: { pointerMove: "pointerMove", plotBandsMove: "plotBandsMove", plotBandClick: "plotBandClick", plotBandContextMenu: "plotBandContextMenu", plotLinesMove: "plotLinesMove", pointMove: "pointMove", chartClick: "chartClick", chartContextMenu: "chartContextMenu", annotationContextMenu: "annotationContextMenu", annotationClick: "annotationClick", annotationMove: "annotationMove", zoomServiceInstance: "zoomServiceInstance", brushServiceInstance: "brushServiceInstance" }, providers: [ChartService, ZoomService, ScaleService, BrushService], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"{\n hasSeriesData: hasSeriesData | async,\n svcConfig: svcConfig | async\n} as data\">\n <ng-container *ngIf=\"data.hasSeriesData === true else noData\">\n <div class=\"column column_auto\">\n <teta-chart-container class=\"chart-container position-relative\"></teta-chart-container>\n </div>\n <teta-legend *ngIf=\"data.svcConfig.legend?.enable === true\" [series]=\"data.svcConfig.series\"></teta-legend>\n </ng-container>\n</ng-container>\n<ng-template #noData>\n <div class=\"column column_auto justify-content-center\">\n <span class=\"font-body-3 color-text-40 overflow-hidden text-overflow-ellipsis nowrap text-align-center\">\n <div #ref><ng-content></ng-content></div>\n <span *ngIf=\"!ref.hasChildNodes()\">\n No data\n </span>\n </span>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:flex;flex-direction:column;height:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.ChartContainerComponent, selector: "teta-chart-container" }, { kind: "component", type: i7.LegendComponent, selector: "teta-legend", inputs: ["series"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
129
127
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: ChartComponent, decorators: [{
130
128
  type: Component,
131
129
  args: [{ selector: 'teta-svg-chart', providers: [ChartService, ZoomService, ScaleService, BrushService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"{\n hasSeriesData: hasSeriesData | async,\n svcConfig: svcConfig | async\n} as data\">\n <ng-container *ngIf=\"data.hasSeriesData === true else noData\">\n <div class=\"column column_auto\">\n <teta-chart-container class=\"chart-container position-relative\"></teta-chart-container>\n </div>\n <teta-legend *ngIf=\"data.svcConfig.legend?.enable === true\" [series]=\"data.svcConfig.series\"></teta-legend>\n </ng-container>\n</ng-container>\n<ng-template #noData>\n <div class=\"column column_auto justify-content-center\">\n <span class=\"font-body-3 color-text-40 overflow-hidden text-overflow-ellipsis nowrap text-align-center\">\n <div #ref><ng-content></ng-content></div>\n <span *ngIf=\"!ref.hasChildNodes()\">\n No data\n </span>\n </span>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:flex;flex-direction:column;height:100%;width:100%}\n"] }]
132
- }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i2.ZoomService }, { type: i3.ScaleService }]; }, propDecorators: { pointerMove: [{
130
+ }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i2.ZoomService }, { type: i3.BrushService }, { type: i4.ScaleService }]; }, propDecorators: { pointerMove: [{
133
131
  type: Output
134
132
  }], plotBandsMove: [{
135
133
  type: Output
@@ -153,7 +151,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
153
151
  type: Output
154
152
  }], zoomServiceInstance: [{
155
153
  type: Output
154
+ }], brushServiceInstance: [{
155
+ type: Output
156
156
  }], config: [{
157
157
  type: Input
158
158
  }] } });
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC9jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHdEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFLdEQsT0FBTyxFQUFDLEdBQUcsRUFBYyxTQUFTLEVBQUUsY0FBYyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7QUFVL0QsTUFBTSxPQUFPLGNBQWM7SUE4Q3pCLFlBQW1CLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFlBQTBCO1FBRjFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBNUM3QyxnQkFBVyxHQUFtRCxJQUFJLFlBQVksRUFBb0MsQ0FBQztRQUduSCxrQkFBYSxHQUF3QyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUcvRixrQkFBYSxHQUF3QyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUcvRix3QkFBbUIsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFHckcsa0JBQWEsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7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TUFBTTtnQkFJUCxtQkFBbUI7c0JBRGxCLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLFNBQVM7c0JBRFIsTUFBTTtnQkFJUCxVQUFVO3NCQURULE1BQU07Z0JBSVAsZ0JBQWdCO3NCQURmLE1BQU07Z0JBSVAscUJBQXFCO3NCQURwQixNQUFNO2dCQUlQLGVBQWU7c0JBRGQsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsbUJBQW1CO3NCQURsQixNQUFNO2dCQUlNLE1BQU07c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDaGFydFNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2UvY2hhcnQuc2VydmljZSc7XG5pbXBvcnQge0lDaGFydENvbmZpZ30gZnJvbSAnLi4vbW9kZWwvaS1jaGFydC1jb25maWcnO1xuaW1wb3J0IHtCYXNlUG9pbnR9IGZyb20gJy4uL21vZGVsL2Jhc2UtcG9pbnQnO1xuaW1wb3J0IHtab29tU2VydmljZX0gZnJvbSAnLi4vc2VydmljZS96b29tLnNlcnZpY2UnO1xuaW1wb3J0IHtTY2FsZVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2Uvc2NhbGUuc2VydmljZSc7XG5pbXBvcnQge0JydXNoU2VydmljZX0gZnJvbSAnLi4vc2VydmljZS9icnVzaC5zZXJ2aWNlJztcbmltcG9ydCB7SUNoYXJ0RXZlbnR9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtZXZlbnQnO1xuaW1wb3J0IHtQbG90TGluZX0gZnJvbSAnLi4vbW9kZWwvcGxvdC1saW5lJztcbmltcG9ydCB7UGxvdEJhbmR9IGZyb20gJy4uL21vZGVsL3Bsb3QtYmFuZCc7XG5pbXBvcnQge0lQb2ludE1vdmV9IGZyb20gJy4uL21vZGVsL2ktcG9pbnQtbW92ZSc7XG5pbXBvcnQge21hcCwgT2JzZXJ2YWJsZSwgdGFrZVdoaWxlLCB3aXRoTGF0ZXN0RnJvbX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0Fubm90YXRpb259IGZyb20gJy4uL21vZGVsL2Fubm90YXRpb24nO1xuaW1wb3J0IHtUb29sdGlwVHJhY2tpbmd9IGZyb20gJy4uL21vZGVsL2VudW0vdG9vbHRpcC10cmFja2luZyc7XG5pbXBvcnQge0lTY2FsZXNNYXB9IGZyb20gXCIuLi9tb2RlbC9pLXNjYWxlcy1tYXBcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGV0YS1zdmctY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtDaGFydFNlcnZpY2UsIFpvb21TZXJ2aWNlLCBTY2FsZVNlcnZpY2UsIEJydXNoU2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBoYXNTZXJpZXNEYXRhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzdmNDb25maWc6IE9ic2VydmFibGU8SUNoYXJ0Q29uZmlnPjtcbiAgQE91dHB1dCgpXG4gIHBvaW50ZXJNb3ZlOiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8TWFwPG51bWJlciwgbnVtYmVyPj4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxNYXA8bnVtYmVyLCBudW1iZXI+Pj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRzTW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRDbGljazogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRDb250ZXh0TWVudTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdExpbmVzTW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RMaW5lPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RMaW5lPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcG9pbnRNb3ZlOiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8SVBvaW50TW92ZT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxJUG9pbnRNb3ZlPj4oKTtcblxuICBAT3V0cHV0KClcbiAgY2hhcnRDbGljazogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEJhc2VQb2ludD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxCYXNlUG9pbnQ+PigpO1xuXG4gIEBPdXRwdXQoKVxuICBjaGFydENvbnRleHRNZW51OiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QmFzZVBvaW50Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEJhc2VQb2ludD4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFubm90YXRpb25Db250ZXh0TWVudTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEFubm90YXRpb24+PiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFubm90YXRpb25DbGljazogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEFubm90YXRpb24+PiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFubm90YXRpb25Nb3ZlOiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxBbm5vdGF0aW9uPj4oKTtcblxuICBAT3V0cHV0KClcbiAgem9vbVNlcnZpY2VJbnN0YW5jZTogRXZlbnRFbWl0dGVyPFpvb21TZXJ2aWNlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Wm9vbVNlcnZpY2U+KCk7XG5cblxuICBASW5wdXQoKSBzZXQgY29uZmlnKGNvbmZpZzogSUNoYXJ0Q29uZmlnKSB7XG4gICAgdGhpcy5jaGFydFNlcnZpY2Uuc2V0Q29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIF9hbGl2ZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNoYXJ0U2VydmljZTogQ2hhcnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgem9vbVNlcnZpY2U6IFpvb21TZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgc2NhbGVTZXJ2aWNlOiBTY2FsZVNlcnZpY2UpIHtcblxuICAgIHRoaXMuc3ZjQ29uZmlnID0gdGhpcy5jaGFydFNlcnZpY2UuY29uZmlnO1xuICAgIHRoaXMuaGFzU2VyaWVzRGF0YSA9IHRoaXMuc3ZjQ29uZmlnLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChfKSA9PiBfLnNlcmllcz8ubGVuZ3RoID4gMCAmJiBfLnNlcmllcz8uc29tZSgoXykgPT4gXy5kYXRhPy5sZW5ndGggPiAwKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0U2VydmljZS5wb2ludGVyTW92ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSksXG4gICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc2NhbGVTZXJ2aWNlLnNjYWxlcywgdGhpcy5jaGFydFNlcnZpY2UuY29uZmlnKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZGF0YTogW1BvaW50ZXJFdmVudCwgSVNjYWxlc01hcCwgSUNoYXJ0Q29uZmlnXSkgPT4ge1xuICAgICAgICBjb25zdCBbZXZlbnQsIHt4LCB5fSwgY29uZmlnXSA9IGRhdGE7XG4gICAgICAgIGNvbnN0IHRvb2x0aXBUcmFja2luZyA9IGNvbmZpZz8udG9vbHRpcD8udHJhY2tpbmc7XG4gICAgICAgIGlmICh0b29sdGlwVHJhY2tpbmcgPT09IFRvb2x0aXBUcmFja2luZy55KSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgICAgICAgICB5LmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCB2YWx1ZS5zY2FsZS5pbnZlcnQoZXZlbnQub2Zmc2V0WSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMucG9pbnRlck1vdmUuZW1pdCh7XG4gICAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgICB0YXJnZXQ6IHJlc3VsdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICAgICAgeC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdmFsdWUuc2NhbGUuaW52ZXJ0KGV2ZW50Lm9mZnNldFgpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnBvaW50ZXJNb3ZlLmVtaXQoe1xuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgdGFyZ2V0OiByZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5wbG90QmFuZEV2ZW50XG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKVxuICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLnBsb3RCYW5kc01vdmUuZW1pdChfKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jaGFydFNlcnZpY2UucGxvdExpbmVNb3ZlLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKSkuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICB0aGlzLnBsb3RMaW5lc01vdmUuZW1pdChfKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLnBvaW50TW92ZS5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgdGhpcy5wb2ludE1vdmUuZW1pdChfKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLmNoYXJ0Q2xpY2tcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpXG4gICAgICApLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgdGhpcy5jaGFydENsaWNrLmVtaXQoXyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5jaGFydENvbnRleHRNZW51XG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKVxuICAgICAgKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIHRoaXMuY2hhcnRDb250ZXh0TWVudS5lbWl0KF8pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFydFNlcnZpY2UucGxvdEJhbmRDbGlja1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpXG4gICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIHRoaXMucGxvdEJhbmRDbGljay5lbWl0KF8pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5wbG90QmFuZENvbnRleHRNZW51XG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKSlcbiAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgdGhpcy5wbG90QmFuZENvbnRleHRNZW51LmVtaXQoXyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLmFubm90YXRpb25Db250ZXh0TWVudVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpXG4gICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNvbnRleHRNZW51LmVtaXQoXyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLmFubm90YXRpb25DbGlja1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpXG4gICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkNsaWNrLmVtaXQoXyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLmFubm90YXRpb25Nb3ZlXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKSlcbiAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uTW92ZS5lbWl0KF8pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS56b29tSW5zdGFuY2VcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKVxuICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLnpvb21TZXJ2aWNlSW5zdGFuY2UuZW1pdChfKTtcbiAgICAgIH0pO1xuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9hbGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuem9vbVNlcnZpY2UuYnJvYWRjYXN0U3Vic2NyaXB0aW9uPy5mb3JFYWNoKChzdWIpID0+IHtcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwie1xuICBoYXNTZXJpZXNEYXRhOiBoYXNTZXJpZXNEYXRhIHwgYXN5bmMsXG4gIHN2Y0NvbmZpZzogc3ZjQ29uZmlnIHwgYXN5bmNcbn0gYXMgZGF0YVwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YS5oYXNTZXJpZXNEYXRhID09PSB0cnVlIGVsc2Ugbm9EYXRhXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBjb2x1bW5fYXV0b1wiPlxuICAgICAgPHRldGEtY2hhcnQtY29udGFpbmVyIGNsYXNzPVwiY2hhcnQtY29udGFpbmVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+PC90ZXRhLWNoYXJ0LWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8dGV0YS1sZWdlbmQgKm5nSWY9XCJkYXRhLnN2Y0NvbmZpZy5sZWdlbmQ/LmVuYWJsZSA9PT0gdHJ1ZVwiIFtzZXJpZXNdPVwiZGF0YS5zdmNDb25maWcuc2VyaWVzXCI+PC90ZXRhLWxlZ2VuZD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbjxuZy10ZW1wbGF0ZSAjbm9EYXRhPlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uIGNvbHVtbl9hdXRvIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9keS0zIGNvbG9yLXRleHQtNDAgb3ZlcmZsb3ctaGlkZGVuIHRleHQtb3ZlcmZsb3ctZWxsaXBzaXMgbm93cmFwIHRleHQtYWxpZ24tY2VudGVyXCI+XG4gICAgICA8ZGl2ICNyZWY+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvZGl2PlxuICAgICAgPHNwYW4gKm5nSWY9XCIhcmVmLmhhc0NoaWxkTm9kZXMoKVwiPlxuICAgICAgICBObyBkYXRhXG4gICAgICA8L3NwYW4+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC9jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHdEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFLdEQsT0FBTyxFQUFDLEdBQUcsRUFBYyxTQUFTLEVBQUUsY0FBYyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7O0FBVS9ELE1BQU0sT0FBTyxjQUFjO0lBaUR6QixZQUFtQixZQUEwQixFQUMxQixXQUF3QixFQUN4QixZQUEwQixFQUMxQixZQUEwQjtRQUgxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQWhEN0MsZ0JBQVcsR0FBbUQsSUFBSSxZQUFZLEVBQW9DLENBQUM7UUFHbkgsa0JBQWEsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFHL0Ysa0JBQWEsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFHL0Ysd0JBQW1CLEdBQXdDLElBQUksWUFBWSxFQUF5QixDQUFD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RFosTUFBTTtnQkFJUCxTQUFTO3NCQURSLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxNQUFNO2dCQUlQLGdCQUFnQjtzQkFEZixNQUFNO2dCQUlQLHFCQUFxQjtzQkFEcEIsTUFBTTtnQkFJUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQUlQLG1CQUFtQjtzQkFEbEIsTUFBTTtnQkFJUCxvQkFBb0I7c0JBRG5CLE1BQU07Z0JBR00sTUFBTTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NoYXJ0U2VydmljZX0gZnJvbSAnLi4vc2VydmljZS9jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7SUNoYXJ0Q29uZmlnfSBmcm9tICcuLi9tb2RlbC9pLWNoYXJ0LWNvbmZpZyc7XG5pbXBvcnQge0Jhc2VQb2ludH0gZnJvbSAnLi4vbW9kZWwvYmFzZS1wb2ludCc7XG5pbXBvcnQge1pvb21TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlL3pvb20uc2VydmljZSc7XG5pbXBvcnQge1NjYWxlU2VydmljZX0gZnJvbSAnLi4vc2VydmljZS9zY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7QnJ1c2hTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlL2JydXNoLnNlcnZpY2UnO1xuaW1wb3J0IHtJQ2hhcnRFdmVudH0gZnJvbSAnLi4vbW9kZWwvaS1jaGFydC1ldmVudCc7XG5pbXBvcnQge1Bsb3RMaW5lfSBmcm9tICcuLi9tb2RlbC9wbG90LWxpbmUnO1xuaW1wb3J0IHtQbG90QmFuZH0gZnJvbSAnLi4vbW9kZWwvcGxvdC1iYW5kJztcbmltcG9ydCB7SVBvaW50TW92ZX0gZnJvbSAnLi4vbW9kZWwvaS1wb2ludC1tb3ZlJztcbmltcG9ydCB7bWFwLCBPYnNlcnZhYmxlLCB0YWtlV2hpbGUsIHdpdGhMYXRlc3RGcm9tfSBmcm9tICdyeGpzJztcbmltcG9ydCB7QW5ub3RhdGlvbn0gZnJvbSAnLi4vbW9kZWwvYW5ub3RhdGlvbic7XG5pbXBvcnQge1Rvb2x0aXBUcmFja2luZ30gZnJvbSAnLi4vbW9kZWwvZW51bS90b29sdGlwLXRyYWNraW5nJztcbmltcG9ydCB7SVNjYWxlc01hcH0gZnJvbSAnLi4vbW9kZWwvaS1zY2FsZXMtbWFwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGV0YS1zdmctY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtDaGFydFNlcnZpY2UsIFpvb21TZXJ2aWNlLCBTY2FsZVNlcnZpY2UsIEJydXNoU2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBoYXNTZXJpZXNEYXRhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBzdmNDb25maWc6IE9ic2VydmFibGU8SUNoYXJ0Q29uZmlnPjtcbiAgQE91dHB1dCgpXG4gIHBvaW50ZXJNb3ZlOiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8TWFwPG51bWJlciwgbnVtYmVyPj4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxNYXA8bnVtYmVyLCBudW1iZXI+Pj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRzTW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRDbGljazogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRDb250ZXh0TWVudTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdExpbmVzTW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RMaW5lPj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RMaW5lPj4oKTtcblxuICBAT3V0cHV0KClcbiAgcG9pbnRNb3ZlOiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8SVBvaW50TW92ZT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxJUG9pbnRNb3ZlPj4oKTtcblxuICBAT3V0cHV0KClcbiAgY2hhcnRDbGljazogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEJhc2VQb2ludD4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxCYXNlUG9pbnQ+PigpO1xuXG4gIEBPdXRwdXQoKVxuICBjaGFydENvbnRleHRNZW51OiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QmFzZVBvaW50Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEJhc2VQb2ludD4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFubm90YXRpb25Db250ZXh0TWVudTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEFubm90YXRpb24+PiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFubm90YXRpb25DbGljazogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PEFubm90YXRpb24+PiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFubm90YXRpb25Nb3ZlOiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8QW5ub3RhdGlvbj4+ID0gbmV3IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxBbm5vdGF0aW9uPj4oKTtcblxuICBAT3V0cHV0KClcbiAgem9vbVNlcnZpY2VJbnN0YW5jZTogRXZlbnRFbWl0dGVyPFpvb21TZXJ2aWNlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Wm9vbVNlcnZpY2U+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGJydXNoU2VydmljZUluc3RhbmNlOiBFdmVudEVtaXR0ZXI8QnJ1c2hTZXJ2aWNlPiA9IG5ldyBFdmVudEVtaXR0ZXI8QnJ1c2hTZXJ2aWNlPigpO1xuXG4gIEBJbnB1dCgpIHNldCBjb25maWcoY29uZmlnOiBJQ2hhcnRDb25maWcpIHtcbiAgICB0aGlzLmNoYXJ0U2VydmljZS5zZXRDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLnpvb21TZXJ2aWNlLnNldEJyb2FkY2FzdENoYW5uZWwoY29uZmlnPy56b29tPy5zeW5jQ2hhbm5lbCk7XG4gIH1cblxuICBwcml2YXRlIF9hbGl2ZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGNoYXJ0U2VydmljZTogQ2hhcnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgem9vbVNlcnZpY2U6IFpvb21TZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgYnJ1c2hTZXJ2aWNlOiBCcnVzaFNlcnZpY2UsXG4gICAgICAgICAgICAgIHB1YmxpYyBzY2FsZVNlcnZpY2U6IFNjYWxlU2VydmljZSkge1xuICAgIHRoaXMuc3ZjQ29uZmlnID0gdGhpcy5jaGFydFNlcnZpY2UuY29uZmlnO1xuICAgIHRoaXMuaGFzU2VyaWVzRGF0YSA9IHRoaXMuc3ZjQ29uZmlnLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChfKSA9PiBfLnNlcmllcz8ubGVuZ3RoID4gMCAmJiBfLnNlcmllcz8uc29tZSgoXykgPT4gXy5kYXRhPy5sZW5ndGggPiAwKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnpvb21TZXJ2aWNlSW5zdGFuY2UuZW1pdCh0aGlzLnpvb21TZXJ2aWNlKTtcbiAgICB0aGlzLmJydXNoU2VydmljZUluc3RhbmNlLmVtaXQodGhpcy5icnVzaFNlcnZpY2UpO1xuXG4gICAgdGhpcy5jaGFydFNlcnZpY2UucG9pbnRlck1vdmVcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpLFxuICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLnNjYWxlU2VydmljZS5zY2FsZXMsIHRoaXMuY2hhcnRTZXJ2aWNlLmNvbmZpZylcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IFtQb2ludGVyRXZlbnQsIElTY2FsZXNNYXAsIElDaGFydENvbmZpZ10pID0+IHtcbiAgICAgICAgY29uc3QgW2V2ZW50LCB7eCwgeX0sIGNvbmZpZ10gPSBkYXRhO1xuICAgICAgICBjb25zdCB0b29sdGlwVHJhY2tpbmcgPSBjb25maWc/LnRvb2x0aXA/LnRyYWNraW5nO1xuICAgICAgICBpZiAodG9vbHRpcFRyYWNraW5nID09PSBUb29sdGlwVHJhY2tpbmcueSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gICAgICAgICAgeS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXN1bHQuc2V0KGtleSwgdmFsdWUuc2NhbGUuaW52ZXJ0KGV2ZW50Lm9mZnNldFkpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnBvaW50ZXJNb3ZlLmVtaXQoe1xuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgdGFyZ2V0OiByZXN1bHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgICAgIHguZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIHZhbHVlLnNjYWxlLmludmVydChldmVudC5vZmZzZXRYKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5wb2ludGVyTW92ZS5lbWl0KHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHRhcmdldDogcmVzdWx0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jaGFydFNlcnZpY2UucGxvdEJhbmRFdmVudFxuICAgICAgLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKSlcbiAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgdGhpcy5wbG90QmFuZHNNb3ZlLmVtaXQoXyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLnBsb3RMaW5lTW92ZS5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgdGhpcy5wbG90TGluZXNNb3ZlLmVtaXQoXyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5wb2ludE1vdmUucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIHRoaXMucG9pbnRNb3ZlLmVtaXQoXyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5jaGFydENsaWNrXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKVxuICAgICAgKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIHRoaXMuY2hhcnRDbGljay5lbWl0KF8pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFydFNlcnZpY2UuY2hhcnRDb250ZXh0TWVudVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSlcbiAgICAgICkuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICB0aGlzLmNoYXJ0Q29udGV4dE1lbnUuZW1pdChfKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY2hhcnRTZXJ2aWNlLnBsb3RCYW5kQ2xpY2tcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKVxuICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLnBsb3RCYW5kQ2xpY2suZW1pdChfKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jaGFydFNlcnZpY2UucGxvdEJhbmRDb250ZXh0TWVudVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpXG4gICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIHRoaXMucGxvdEJhbmRDb250ZXh0TWVudS5lbWl0KF8pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5hbm5vdGF0aW9uQ29udGV4dE1lbnVcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKVxuICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLmFubm90YXRpb25Db250ZXh0TWVudS5lbWl0KF8pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5hbm5vdGF0aW9uQ2xpY2tcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKVxuICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLmFubm90YXRpb25DbGljay5lbWl0KF8pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmNoYXJ0U2VydmljZS5hbm5vdGF0aW9uTW92ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpXG4gICAgICAuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbk1vdmUuZW1pdChfKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIntcbiAgaGFzU2VyaWVzRGF0YTogaGFzU2VyaWVzRGF0YSB8IGFzeW5jLFxuICBzdmNDb25maWc6IHN2Y0NvbmZpZyB8IGFzeW5jXG59IGFzIGRhdGFcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGEuaGFzU2VyaWVzRGF0YSA9PT0gdHJ1ZSBlbHNlIG5vRGF0YVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gY29sdW1uX2F1dG9cIj5cbiAgICAgIDx0ZXRhLWNoYXJ0LWNvbnRhaW5lciBjbGFzcz1cImNoYXJ0LWNvbnRhaW5lciBwb3NpdGlvbi1yZWxhdGl2ZVwiPjwvdGV0YS1jaGFydC1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPHRldGEtbGVnZW5kICpuZ0lmPVwiZGF0YS5zdmNDb25maWcubGVnZW5kPy5lbmFibGUgPT09IHRydWVcIiBbc2VyaWVzXT1cImRhdGEuc3ZjQ29uZmlnLnNlcmllc1wiPjwvdGV0YS1sZWdlbmQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG48bmctdGVtcGxhdGUgI25vRGF0YT5cbiAgPGRpdiBjbGFzcz1cImNvbHVtbiBjb2x1bW5fYXV0byBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJmb250LWJvZHktMyBjb2xvci10ZXh0LTQwIG92ZXJmbG93LWhpZGRlbiB0ZXh0LW92ZXJmbG93LWVsbGlwc2lzIG5vd3JhcCB0ZXh0LWFsaWduLWNlbnRlclwiPlxuICAgICAgPGRpdiAjcmVmPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiIXJlZi5oYXNDaGlsZE5vZGVzKClcIj5cbiAgICAgICAgTm8gZGF0YVxuICAgICAgPC9zcGFuPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19