@tetacom/svg-charts 1.0.2 → 1.1.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.
Files changed (145) hide show
  1. package/dist/chart/base/series-base.component.d.ts +4 -1
  2. package/dist/chart/chart/chart.component.d.ts +12 -9
  3. package/dist/chart/chart-container/chart-container.component.d.ts +18 -23
  4. package/dist/chart/chart-container/gridlines/gridlines.component.d.ts +7 -16
  5. package/dist/chart/chart-container/plotband/{plotband.component.d.ts → plot-band.component.d.ts} +10 -10
  6. package/dist/chart/chart-container/plotline/plotline.component.d.ts +5 -5
  7. package/dist/chart/chart-container/series/line/line-series.component.d.ts +2 -2
  8. package/dist/chart/chart-container/series/scatter-series/scatter-series.component.d.ts +28 -0
  9. package/dist/chart/chart-container/series-host/series-host.component.d.ts +4 -1
  10. package/dist/chart/chart-container/tooltip/tooltip.component.d.ts +6 -3
  11. package/dist/chart/chart-container/x-axis/x-axis.component.d.ts +6 -10
  12. package/dist/chart/chart-container/y-axis/y-axis.component.d.ts +7 -11
  13. package/dist/chart/chart.module.d.ts +4 -3
  14. package/dist/chart/core/axis/axis.d.ts +8 -3
  15. package/dist/chart/default/default-axis-config.d.ts +2 -0
  16. package/dist/chart/default/default-chart-config.d.ts +2 -0
  17. package/dist/chart/default/default-series-config.d.ts +3 -0
  18. package/dist/chart/directives/brushable.directive.d.ts +2 -1
  19. package/dist/chart/directives/zoomable.directive.d.ts +1 -3
  20. package/dist/chart/legend/legend.component.d.ts +1 -3
  21. package/dist/chart/model/axis-options.d.ts +9 -7
  22. package/dist/chart/model/base-point.d.ts +1 -1
  23. package/dist/chart/model/enum/public-api.d.ts +1 -1
  24. package/dist/chart/model/enum/scale-type.d.ts +8 -0
  25. package/dist/chart/model/enum/series-type.d.ts +2 -1
  26. package/dist/chart/model/i-broadcast-message.d.ts +14 -2
  27. package/dist/chart/model/i-chart-config.d.ts +1 -0
  28. package/dist/chart/model/{plotband.d.ts → plot-band.d.ts} +7 -5
  29. package/dist/chart/model/{plotline.d.ts → plot-line.d.ts} +3 -1
  30. package/dist/chart/model/public-api.d.ts +2 -2
  31. package/dist/chart/service/brush.service.d.ts +2 -5
  32. package/dist/chart/service/chart.service.d.ts +16 -17
  33. package/dist/chart/service/scale.service.d.ts +13 -8
  34. package/dist/chart/service/zoom.service.d.ts +6 -14
  35. package/dist/esm2020/chart/base/series-base.component.mjs +7 -9
  36. package/dist/esm2020/chart/chart/chart.component.mjs +28 -30
  37. package/dist/esm2020/chart/chart-container/chart-container.component.mjs +97 -115
  38. package/dist/esm2020/chart/chart-container/gridlines/gridlines.component.mjs +19 -31
  39. package/dist/esm2020/chart/chart-container/plotband/plot-band.component.mjs +141 -0
  40. package/dist/esm2020/chart/chart-container/plotline/plotline.component.mjs +11 -14
  41. package/dist/esm2020/chart/chart-container/series/bar/bar-series.component.mjs +11 -11
  42. package/dist/esm2020/chart/chart-container/series/line/line-series.component.mjs +33 -29
  43. package/dist/esm2020/chart/chart-container/series/scatter-series/scatter-series.component.mjs +174 -0
  44. package/dist/esm2020/chart/chart-container/series-host/series-host.component.mjs +16 -5
  45. package/dist/esm2020/chart/chart-container/tooltip/tooltip.component.mjs +17 -19
  46. package/dist/esm2020/chart/chart-container/x-axis/x-axis.component.mjs +19 -22
  47. package/dist/esm2020/chart/chart-container/y-axis/y-axis.component.mjs +20 -25
  48. package/dist/esm2020/chart/chart.module.mjs +8 -5
  49. package/dist/esm2020/chart/core/axis/axis.mjs +25 -16
  50. package/dist/esm2020/chart/core/axis/builders/extremes-builder.mjs +2 -3
  51. package/dist/esm2020/chart/default/default-axis-config.mjs +9 -0
  52. package/dist/esm2020/chart/default/default-chart-config.mjs +23 -0
  53. package/dist/esm2020/chart/default/default-series-config.mjs +8 -0
  54. package/dist/esm2020/chart/directives/brushable.directive.mjs +5 -3
  55. package/dist/esm2020/chart/directives/zoomable.directive.mjs +7 -8
  56. package/dist/esm2020/chart/legend/legend.component.mjs +4 -7
  57. package/dist/esm2020/chart/model/axis-options.mjs +1 -1
  58. package/dist/esm2020/chart/model/base-point.mjs +1 -1
  59. package/dist/esm2020/chart/model/enum/public-api.mjs +2 -2
  60. package/dist/esm2020/chart/model/enum/scale-type.mjs +10 -0
  61. package/dist/esm2020/chart/model/enum/series-type.mjs +2 -1
  62. package/dist/esm2020/chart/model/i-broadcast-message.mjs +1 -1
  63. package/dist/esm2020/chart/model/i-chart-config.mjs +1 -1
  64. package/dist/esm2020/chart/model/plot-band.mjs +17 -0
  65. package/dist/esm2020/chart/model/plot-line.mjs +13 -0
  66. package/dist/esm2020/chart/model/public-api.mjs +3 -3
  67. package/dist/esm2020/chart/service/broadcast.service.mjs +3 -5
  68. package/dist/esm2020/chart/service/brush.service.mjs +26 -23
  69. package/dist/esm2020/chart/service/chart.service.mjs +61 -43
  70. package/dist/esm2020/chart/service/scale.service.mjs +138 -50
  71. package/dist/esm2020/chart/service/zoom.service.mjs +82 -85
  72. package/dist/esm2020/public-api.mjs +2 -1
  73. package/dist/fesm2015/tetacom-svg-charts.mjs +942 -659
  74. package/dist/fesm2015/tetacom-svg-charts.mjs.map +1 -1
  75. package/dist/fesm2020/tetacom-svg-charts.mjs +929 -657
  76. package/dist/fesm2020/tetacom-svg-charts.mjs.map +1 -1
  77. package/package.json +1 -1
  78. package/src/chart/Chart.stories.ts +88 -173
  79. package/src/chart/base/series-base.component.ts +4 -9
  80. package/src/chart/chart/chart.component.html +16 -5
  81. package/src/chart/chart/chart.component.scss +1 -0
  82. package/src/chart/chart/chart.component.ts +39 -33
  83. package/src/chart/chart-container/chart-container.component.html +102 -57
  84. package/src/chart/chart-container/chart-container.component.scss +0 -1
  85. package/src/chart/chart-container/chart-container.component.ts +136 -165
  86. package/src/chart/chart-container/gridlines/gridlines.component.html +9 -2
  87. package/src/chart/chart-container/gridlines/gridlines.component.ts +17 -35
  88. package/src/chart/chart-container/plotband/{plotband.component.html → plot-band.component.html} +15 -9
  89. package/src/chart/chart-container/plotband/plot-band.component.scss +13 -0
  90. package/src/chart/chart-container/plotband/{plotband.component.spec.ts → plot-band.component.spec.ts} +5 -5
  91. package/src/chart/chart-container/plotband/{plotband.component.ts → plot-band.component.ts} +51 -57
  92. package/src/chart/chart-container/plotline/plotline.component.html +3 -3
  93. package/src/chart/chart-container/plotline/plotline.component.ts +10 -22
  94. package/src/chart/chart-container/series/bar/bar-series.component.ts +10 -12
  95. package/src/chart/chart-container/series/line/line-series.component.html +29 -31
  96. package/src/chart/chart-container/series/line/line-series.component.ts +69 -50
  97. package/src/chart/chart-container/series/scatter-series/scatter-series.component.html +43 -0
  98. package/src/chart/chart-container/series/scatter-series/scatter-series.component.scss +9 -0
  99. package/src/chart/chart-container/series/scatter-series/scatter-series.component.spec.ts +25 -0
  100. package/src/chart/chart-container/series/scatter-series/scatter-series.component.ts +254 -0
  101. package/src/chart/chart-container/series-host/series-host.component.ts +25 -16
  102. package/src/chart/chart-container/tooltip/tooltip.component.html +1 -1
  103. package/src/chart/chart-container/tooltip/tooltip.component.scss +2 -1
  104. package/src/chart/chart-container/tooltip/tooltip.component.ts +25 -26
  105. package/src/chart/chart-container/x-axis/x-axis.component.ts +18 -20
  106. package/src/chart/chart-container/y-axis/y-axis.component.ts +18 -28
  107. package/src/chart/chart.module.ts +4 -2
  108. package/src/chart/core/axis/axis.ts +37 -21
  109. package/src/chart/core/axis/builders/extremes-builder.ts +7 -12
  110. package/src/chart/core/builder/domain-builder.ts +0 -0
  111. package/src/chart/default/default-axis-config.ts +10 -0
  112. package/src/chart/default/default-chart-config.ts +20 -8
  113. package/src/chart/default/default-series-config.ts +10 -0
  114. package/src/chart/directives/brushable.directive.ts +2 -1
  115. package/src/chart/directives/zoomable.directive.ts +6 -9
  116. package/src/chart/legend/legend.component.html +7 -5
  117. package/src/chart/legend/legend.component.ts +2 -6
  118. package/src/chart/model/axis-options.ts +9 -7
  119. package/src/chart/model/base-point.ts +1 -1
  120. package/src/chart/model/enum/public-api.ts +1 -1
  121. package/src/chart/model/enum/scale-type.ts +8 -0
  122. package/src/chart/model/enum/series-type.ts +1 -0
  123. package/src/chart/model/i-broadcast-message.ts +17 -2
  124. package/src/chart/model/i-chart-config.ts +1 -0
  125. package/src/chart/model/i-dom-rect.ts +6 -0
  126. package/src/chart/model/{plotband.ts → plot-band.ts} +8 -5
  127. package/src/chart/model/{plotline.ts → plot-line.ts} +5 -2
  128. package/src/chart/model/public-api.ts +2 -2
  129. package/src/chart/service/broadcast.service.ts +5 -4
  130. package/src/chart/service/brush.service.ts +34 -31
  131. package/src/chart/service/chart.service.ts +70 -54
  132. package/src/chart/service/scale.service.ts +218 -61
  133. package/src/chart/service/zoom.service.ts +144 -113
  134. package/src/public-api.ts +3 -0
  135. package/dist/chart/model/enum/axis-type.d.ts +0 -7
  136. package/dist/chart/service/axes.service.d.ts +0 -11
  137. package/dist/esm2020/chart/chart-container/plotband/plotband.component.mjs +0 -139
  138. package/dist/esm2020/chart/model/enum/axis-type.mjs +0 -9
  139. package/dist/esm2020/chart/model/plotband.mjs +0 -16
  140. package/dist/esm2020/chart/model/plotline.mjs +0 -12
  141. package/dist/esm2020/chart/service/axes.service.mjs +0 -29
  142. package/src/chart/chart-container/plotband/plotband.component.scss +0 -13
  143. package/src/chart/model/enum/axis-type.ts +0 -7
  144. package/src/chart/service/axes.service.spec.ts +0 -16
  145. package/src/chart/service/axes.service.ts +0 -27
@@ -1,6 +1,7 @@
1
1
  import { SvgAttributes } from './svg-attributes';
2
- export declare class Plotband {
3
- id: number | string;
2
+ export declare class PlotBand {
3
+ id?: number | string;
4
+ name?: string;
4
5
  from: number;
5
6
  to: number;
6
7
  label?: string;
@@ -10,11 +11,12 @@ export declare class Plotband {
10
11
  min?: number;
11
12
  max?: number;
12
13
  style?: {
13
- plotband?: SvgAttributes;
14
+ plotBand?: SvgAttributes;
14
15
  grabbers?: SvgAttributes;
15
16
  };
16
17
  constructor(options?: {
17
- id: any;
18
+ id?: number | string;
19
+ name?: string;
18
20
  from: number;
19
21
  to: number;
20
22
  label?: string;
@@ -24,7 +26,7 @@ export declare class Plotband {
24
26
  min?: number;
25
27
  max?: number;
26
28
  style?: {
27
- plotband?: SvgAttributes;
29
+ plotBand?: SvgAttributes;
28
30
  grabbers?: SvgAttributes;
29
31
  };
30
32
  });
@@ -1,6 +1,7 @@
1
1
  import { SvgAttributes } from './svg-attributes';
2
2
  export declare class PlotLine {
3
3
  id?: number | string;
4
+ name?: string;
4
5
  value: number;
5
6
  label?: string;
6
7
  min?: number;
@@ -8,7 +9,8 @@ export declare class PlotLine {
8
9
  draggable?: boolean;
9
10
  style?: SvgAttributes;
10
11
  constructor(options?: {
11
- id?: number;
12
+ id?: number | string;
13
+ name?: string;
12
14
  value: number;
13
15
  label?: string;
14
16
  min?: number;
@@ -7,7 +7,7 @@ export * from './i-chart-config';
7
7
  export * from './i-chart-event';
8
8
  export * from './i-point-move';
9
9
  export * from './marker-options';
10
- export * from './plotband';
11
- export * from './plotline';
10
+ export * from './plot-band';
11
+ export * from './plot-line';
12
12
  export * from './series';
13
13
  export * from './svg-attributes';
@@ -2,16 +2,13 @@ import { ElementRef } from '@angular/core';
2
2
  import { Subscription } from 'rxjs';
3
3
  import { BroadcastService } from './broadcast.service';
4
4
  import { IChartConfig } from '../model/i-chart-config';
5
- import { ScaleService } from './scale.service';
6
5
  import * as i0 from "@angular/core";
7
6
  export declare class BrushService {
8
7
  private broadcastService;
9
- private scaleService;
10
8
  broadcastSubscribtion: Subscription;
11
9
  private brushMap;
12
- private scaleMap;
13
- constructor(broadcastService: BroadcastService, scaleService: ScaleService);
14
- applyBrush(svgElement: ElementRef, config: IChartConfig, size: DOMRect): void;
10
+ constructor(broadcastService: BroadcastService);
11
+ applyBrush(svgElement: ElementRef, config: IChartConfig, brushScale: any): void;
15
12
  static ɵfac: i0.ɵɵFactoryDeclaration<BrushService, never>;
16
13
  static ɵprov: i0.ɵɵInjectableDeclaration<BrushService>;
17
14
  }
@@ -1,38 +1,37 @@
1
1
  import { IChartConfig } from '../model/i-chart-config';
2
- import { AxesService } from './axes.service';
3
2
  import { Observable } from 'rxjs';
4
- import { ScaleService } from './scale.service';
5
3
  import { IChartEvent } from '../model/i-chart-event';
6
4
  import { IDisplayTooltip } from '../model/i-display-tooltip';
7
- import { Plotband } from '../model/plotband';
8
- import { PlotLine } from '../model/plotline';
5
+ import { PlotBand } from '../model/plot-band';
6
+ import { PlotLine } from '../model/plot-line';
9
7
  import { IPointMove } from '../model/i-point-move';
10
8
  import * as i0 from "@angular/core";
11
9
  export declare class ChartService {
12
- private axesService;
13
- private scaleService;
10
+ config: Observable<IChartConfig>;
14
11
  size: Observable<DOMRect>;
15
- pointerMove: Observable<any>;
12
+ pointerMove: Observable<PointerEvent>;
16
13
  tooltips: Observable<IDisplayTooltip>;
17
- plotbandMove: Observable<IChartEvent<Plotband>>;
18
- plotlineMove: Observable<IChartEvent<PlotLine>>;
14
+ plotBandEvent: Observable<IChartEvent<PlotBand>>;
15
+ plotLineMove: Observable<IChartEvent<PlotLine>>;
16
+ plotBandClick: Observable<IChartEvent<PlotBand>>;
19
17
  pointMove: Observable<IChartEvent<IPointMove>>;
18
+ private config$;
20
19
  private size$;
21
20
  private pointerMove$;
22
21
  private tooltips$;
23
- private plotbandMove$;
24
- private plotlineMove$;
22
+ private plotBandEvent$;
23
+ private plotLineMove$;
25
24
  private pointMove$;
26
- private _config;
27
- constructor(axesService: AxesService, scaleService: ScaleService);
28
- init(config: IChartConfig): void;
25
+ constructor();
26
+ setConfig(config: IChartConfig): void;
29
27
  setSize(size: DOMRect): void;
30
- setPointerMove(event: any): void;
28
+ setPointerMove(event: PointerEvent): void;
31
29
  setTooltip(tooltip: IDisplayTooltip): void;
32
- emitPlotband(event: IChartEvent<Plotband>): void;
30
+ emitPlotband(event: IChartEvent<PlotBand>): void;
33
31
  emitPlotline(event: IChartEvent<PlotLine>): void;
34
32
  emitPoint(event: IChartEvent<IPointMove>): void;
35
- get config(): IChartConfig;
33
+ private setDefaults;
34
+ private setpreparationData;
36
35
  static ɵfac: i0.ɵɵFactoryDeclaration<ChartService, never>;
37
36
  static ɵprov: i0.ɵɵInjectableDeclaration<ChartService>;
38
37
  }
@@ -1,14 +1,19 @@
1
- import { AxesService } from './axes.service';
2
- import { IChartConfig } from '../model/i-chart-config';
1
+ import { Axis } from '../core/axis/axis';
2
+ import { ChartService } from './chart.service';
3
+ import { Observable } from 'rxjs';
4
+ import { ZoomService } from './zoom.service';
3
5
  import * as i0 from "@angular/core";
4
6
  export declare class ScaleService {
5
- private axesService;
6
- yScales: Map<number | string, any>;
7
- xScales: Map<number | string, any>;
7
+ private chartService;
8
+ private zoomService;
9
+ yAxisMap: Observable<Map<number, Axis>>;
10
+ xAxisMap: Observable<Map<number, Axis>>;
11
+ yScaleMap: Observable<Map<number, any>>;
12
+ xScaleMap: Observable<Map<number, any>>;
13
+ private transformCacheX;
14
+ private transformCacheY;
8
15
  private scaleMapping;
9
- constructor(axesService: AxesService);
10
- createScales(size: DOMRect, config?: IChartConfig): void;
11
- private getScale;
16
+ constructor(chartService: ChartService, zoomService: ZoomService);
12
17
  static ɵfac: i0.ɵɵFactoryDeclaration<ScaleService, never>;
13
18
  static ɵprov: i0.ɵɵInjectableDeclaration<ScaleService>;
14
19
  }
@@ -1,25 +1,17 @@
1
1
  import { ElementRef } from '@angular/core';
2
- import { ScaleService } from './scale.service';
3
2
  import { Observable, Subscription } from 'rxjs';
4
3
  import { IChartConfig } from '../model/i-chart-config';
5
4
  import { BroadcastService } from './broadcast.service';
6
- import { ChartService } from './chart.service';
5
+ import { Axis } from '../core/axis/axis';
6
+ import { IChartEvent } from '../model/i-chart-event';
7
7
  import * as i0 from "@angular/core";
8
8
  export declare class ZoomService {
9
- private scaleService;
10
9
  private broadcastService;
11
- private chartService;
12
- zoomed: Observable<any>;
10
+ broadcastSubscription: Subscription[];
11
+ zoomed: Observable<IChartEvent<Axis>>;
13
12
  private zoomed$;
14
- broadcastSubscribtion: Subscription;
15
- private x;
16
- private y;
17
- private zoom;
18
- private svg;
19
- private initialZoom;
20
- constructor(scaleService: ScaleService, broadcastService: BroadcastService, chartService: ChartService);
21
- applyZoom(svgElement: ElementRef, config: IChartConfig, size: DOMRect): void;
22
- setZoom(transform: any): void;
13
+ constructor(broadcastService: BroadcastService);
14
+ applyZoom(svgElement: ElementRef, config: IChartConfig, size: DOMRect, axis?: Axis): void;
23
15
  static ɵfac: i0.ɵɵFactoryDeclaration<ZoomService, never>;
24
16
  static ɵprov: i0.ɵɵInjectableDeclaration<ZoomService>;
25
17
  }
@@ -1,5 +1,4 @@
1
1
  import { Component, Input, } from '@angular/core';
2
- import { tap } from 'rxjs';
3
2
  import * as i0 from "@angular/core";
4
3
  import * as i1 from "../service/chart.service";
5
4
  import * as i2 from "../service/scale.service";
@@ -11,24 +10,23 @@ export class SeriesBaseComponent {
11
10
  this.scaleService = scaleService;
12
11
  this.zoomService = zoomService;
13
12
  this.element = element;
14
- this.zoomService.zoomed
15
- .pipe(tap((_) => {
16
- this.cdr.detectChanges();
17
- }))
18
- .subscribe();
19
13
  }
20
14
  ngOnInit() { }
21
15
  }
22
16
  SeriesBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: SeriesBaseComponent, deps: [{ token: i1.ChartService }, { token: i0.ChangeDetectorRef }, { token: i2.ScaleService }, { token: i3.ZoomService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
23
- SeriesBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: SeriesBaseComponent, selector: "ng-component", inputs: { series: "series", size: "size" }, ngImport: i0, template: '', isInline: true });
17
+ SeriesBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: SeriesBaseComponent, selector: "ng-component", inputs: { config: "config", series: "series", size: "size", rect: "rect" }, ngImport: i0, template: '', isInline: true });
24
18
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: SeriesBaseComponent, decorators: [{
25
19
  type: Component,
26
20
  args: [{
27
21
  template: '',
28
22
  }]
29
- }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i0.ChangeDetectorRef }, { type: i2.ScaleService }, { type: i3.ZoomService }, { type: i0.ElementRef }]; }, propDecorators: { series: [{
23
+ }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i0.ChangeDetectorRef }, { type: i2.ScaleService }, { type: i3.ZoomService }, { type: i0.ElementRef }]; }, propDecorators: { config: [{
24
+ type: Input
25
+ }], series: [{
30
26
  type: Input
31
27
  }], size: [{
32
28
  type: Input
29
+ }], rect: [{
30
+ type: Input
33
31
  }] } });
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWVzLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2Jhc2Uvc2VyaWVzLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBTXZCLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBS3ZDLE1BQU0sT0FBTyxtQkFBbUI7SUFNOUIsWUFDWSxHQUFpQixFQUNqQixHQUFzQixFQUN0QixZQUEwQixFQUMxQixXQUF3QixFQUN4QixPQUFtQjtRQUpuQixRQUFHLEdBQUgsR0FBRyxDQUFjO1FBQ2pCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFFN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNO2FBQ3BCLElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQsUUFBUSxLQUFVLENBQUM7O2dIQXRCUixtQkFBbUI7b0dBQW5CLG1CQUFtQixnR0FGcEIsRUFBRTsyRkFFRCxtQkFBbUI7a0JBSC9CLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLEVBQUU7aUJBQ2I7aU5BRVUsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IFNlcmllcyB9IGZyb20gJy4uL21vZGVsL3Nlcmllcyc7XG5pbXBvcnQgeyBCYXNlUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9iYXNlLXBvaW50JztcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvc2NhbGUuc2VydmljZSc7XG5pbXBvcnQgeyBab29tU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvem9vbS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6ICcnLFxufSlcbmV4cG9ydCBjbGFzcyBTZXJpZXNCYXNlQ29tcG9uZW50PFQgZXh0ZW5kcyBCYXNlUG9pbnQ+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2VyaWVzOiBTZXJpZXM8VD47XG4gIEBJbnB1dCgpIHNpemU6IERPTVJlY3Q7XG5cbiAgem9vbTogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBzdmM6IENoYXJ0U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcm90ZWN0ZWQgc2NhbGVTZXJ2aWNlOiBTY2FsZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHpvb21TZXJ2aWNlOiBab29tU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZWxlbWVudDogRWxlbWVudFJlZlxuICApIHtcbiAgICB0aGlzLnpvb21TZXJ2aWNlLnpvb21lZFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoXykgPT4ge1xuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cbn1cbiJdfQ==
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWVzLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2Jhc2Uvc2VyaWVzLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDOzs7OztBQVl2QixNQUFNLE9BQU8sbUJBQW1CO0lBUTlCLFlBQ1ksR0FBaUIsRUFDakIsR0FBc0IsRUFDdEIsWUFBMEIsRUFDMUIsV0FBd0IsRUFDeEIsT0FBbUI7UUFKbkIsUUFBRyxHQUFILEdBQUcsQ0FBYztRQUNqQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixZQUFPLEdBQVAsT0FBTyxDQUFZO0lBQzVCLENBQUM7SUFFSixRQUFRLEtBQVUsQ0FBQzs7Z0hBaEJSLG1CQUFtQjtvR0FBbkIsbUJBQW1CLGdJQUZwQixFQUFFOzJGQUVELG1CQUFtQjtrQkFIL0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsRUFBRTtpQkFDYjtpTkFFVSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYXJ0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvY2hhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBTZXJpZXMgfSBmcm9tICcuLi9tb2RlbC9zZXJpZXMnO1xuaW1wb3J0IHsgQmFzZVBvaW50IH0gZnJvbSAnLi4vbW9kZWwvYmFzZS1wb2ludCc7XG5pbXBvcnQgeyBTY2FsZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3NjYWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL3pvb20uc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElDaGFydENvbmZpZyB9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtY29uZmlnJztcblxuQENvbXBvbmVudCh7XG4gIHRlbXBsYXRlOiAnJyxcbn0pXG5leHBvcnQgY2xhc3MgU2VyaWVzQmFzZUNvbXBvbmVudDxUIGV4dGVuZHMgQmFzZVBvaW50PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIGNvbmZpZzogSUNoYXJ0Q29uZmlnO1xuICBASW5wdXQoKSBzZXJpZXM6IFNlcmllczxUPjtcbiAgQElucHV0KCkgc2l6ZTogRE9NUmVjdDtcbiAgQElucHV0KCkgcmVjdDogYW55O1xuXG4gIHpvb206IE9ic2VydmFibGU8YW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3ZjOiBDaGFydFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHNjYWxlU2VydmljZTogU2NhbGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB6b29tU2VydmljZTogWm9vbVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGVsZW1lbnQ6IEVsZW1lbnRSZWZcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge31cbn1cbiJdfQ==
@@ -3,8 +3,7 @@ import { ChartService } from '../service/chart.service';
3
3
  import { ZoomService } from '../service/zoom.service';
4
4
  import { ScaleService } from '../service/scale.service';
5
5
  import { BrushService } from '../service/brush.service';
6
- import { AxesService } from '../service/axes.service';
7
- import { ChartBounds } from '../model/chart-bounds';
6
+ import { map, takeWhile } from 'rxjs';
8
7
  import * as i0 from "@angular/core";
9
8
  import * as i1 from "../service/chart.service";
10
9
  import * as i2 from "../service/zoom.service";
@@ -12,57 +11,56 @@ import * as i3 from "../chart-container/chart-container.component";
12
11
  import * as i4 from "../legend/legend.component";
13
12
  import * as i5 from "@angular/common";
14
13
  export class ChartComponent {
15
- constructor(svc, zoomService) {
16
- this.svc = svc;
17
- this.zoomService = zoomService;
14
+ constructor(_svc, _zoomService) {
15
+ this._svc = _svc;
16
+ this._zoomService = _zoomService;
18
17
  this.plotBandsMove = new EventEmitter();
18
+ this.plotBandsClick = new EventEmitter();
19
19
  this.plotLinesMove = new EventEmitter();
20
20
  this.pointMove = new EventEmitter();
21
+ this._alive = true;
22
+ this.svcConfig = this._svc.config;
23
+ this.hasSeriesData = this.svcConfig.pipe(map((_) => _.series?.length > 0 && _.series?.some((_) => _.data?.length > 0)));
21
24
  }
22
25
  set config(config) {
23
- this._config = Object.assign({
24
- bounds: new ChartBounds(),
25
- }, config);
26
- }
27
- get config() {
28
- return this._config;
26
+ this._svc.setConfig(config);
29
27
  }
30
28
  ngOnChanges(changes) { }
31
29
  ngOnInit() {
32
- this.svc.plotbandMove.subscribe((_) => {
30
+ this._svc.plotBandEvent
31
+ .pipe(takeWhile(() => this._alive))
32
+ .subscribe((_) => {
33
33
  this.plotBandsMove.emit(_);
34
34
  });
35
- this.svc.plotlineMove.subscribe((_) => {
35
+ this._svc.plotLineMove.pipe(takeWhile(() => this._alive)).subscribe((_) => {
36
36
  this.plotLinesMove.emit(_);
37
37
  });
38
- this.svc.pointMove.subscribe((_) => {
38
+ this._svc.pointMove.pipe(takeWhile(() => this._alive)).subscribe((_) => {
39
39
  this.pointMove.emit(_);
40
40
  });
41
+ this._svc.plotBandClick
42
+ .pipe(takeWhile(() => this._alive))
43
+ .subscribe((_) => {
44
+ this.plotBandsClick.emit(_);
45
+ });
41
46
  }
42
47
  ngAfterViewInit() { }
43
48
  ngOnDestroy() {
44
- this.zoomService.broadcastSubscribtion?.unsubscribe();
49
+ this._alive = false;
50
+ this._zoomService.broadcastSubscription?.forEach((sub) => {
51
+ sub.unsubscribe();
52
+ });
45
53
  }
46
54
  }
47
55
  ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartComponent, deps: [{ token: i1.ChartService }, { token: i2.ZoomService }], target: i0.ɵɵFactoryTarget.Component });
48
- ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: ChartComponent, selector: "teta-svg-chart", inputs: { config: "config" }, outputs: { plotBandsMove: "plotBandsMove", plotLinesMove: "plotLinesMove", pointMove: "pointMove" }, providers: [
49
- ChartService,
50
- ZoomService,
51
- ScaleService,
52
- AxesService,
53
- BrushService,
54
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"column column_auto\">\n <teta-chart-container class=\"chart-container\" [config]=\"config\"></teta-chart-container>\n</div>\n\n<teta-legend *ngIf=\"config.legend?.enable === true\" [series]=\"config.series\"></teta-legend>\n", styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"], components: [{ type: i3.ChartContainerComponent, selector: "teta-chart-container", inputs: ["config"] }, { type: i4.LegendComponent, selector: "teta-legend", inputs: ["series"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
+ ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.1", type: ChartComponent, selector: "teta-svg-chart", inputs: { config: "config" }, outputs: { plotBandsMove: "plotBandsMove", plotBandsClick: "plotBandsClick", plotLinesMove: "plotLinesMove", pointMove: "pointMove" }, 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\"></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 align-center justify-content-center\">\n <span class=\"font-body-3 color-text-40\">\u0414\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442</span>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:flex;flex-direction:column;height:100%;width:100%}\n"], components: [{ type: i3.ChartContainerComponent, selector: "teta-chart-container" }, { type: i4.LegendComponent, selector: "teta-legend", inputs: ["series"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i5.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
55
57
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImport: i0, type: ChartComponent, decorators: [{
56
58
  type: Component,
57
- args: [{ selector: 'teta-svg-chart', providers: [
58
- ChartService,
59
- ZoomService,
60
- ScaleService,
61
- AxesService,
62
- BrushService,
63
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"column column_auto\">\n <teta-chart-container class=\"chart-container\" [config]=\"config\"></teta-chart-container>\n</div>\n\n<teta-legend *ngIf=\"config.legend?.enable === true\" [series]=\"config.series\"></teta-legend>\n", styles: [":host{display:flex;flex-direction:column;height:100%;width:100%}\n"] }]
59
+ 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\"></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 align-center justify-content-center\">\n <span class=\"font-body-3 color-text-40\">\u0414\u0430\u043D\u043D\u044B\u0435 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044E\u0442</span>\n </div>\n</ng-template>\n", styles: [":host{position:relative;display:flex;flex-direction:column;height:100%;width:100%}\n"] }]
64
60
  }], ctorParameters: function () { return [{ type: i1.ChartService }, { type: i2.ZoomService }]; }, propDecorators: { plotBandsMove: [{
65
61
  type: Output
62
+ }], plotBandsClick: [{
63
+ type: Output
66
64
  }], plotLinesMove: [{
67
65
  type: Output
68
66
  }], pointMove: [{
@@ -70,4 +68,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.1", ngImpor
70
68
  }], config: [{
71
69
  type: Input
72
70
  }] } });
73
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC9jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7OztBQW9CcEQsTUFBTSxPQUFPLGNBQWM7SUFpQ3pCLFlBQW9CLEdBQWlCLEVBQVUsV0FBd0I7UUFBbkQsUUFBRyxHQUFILEdBQUcsQ0FBYztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBN0J2RSxrQkFBYSxHQUF3QyxJQUFJLFlBQVksRUFFbEUsQ0FBQztRQUdKLGtCQUFhLEdBQXdDLElBQUksWUFBWSxFQUVsRSxDQUFDO1FBR0osY0FBUyxHQUEwQyxJQUFJLFlBQVksRUFFaEUsQ0FBQztJQWlCc0UsQ0FBQztJQWYzRSxJQUFhLE1BQU0sQ0FBQyxNQUFvQjtRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzFCO1lBQ0UsTUFBTSxFQUFFLElBQUksV0FBVyxFQUFFO1NBQzFCLEVBQ0QsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFNRCxXQUFXLENBQUMsT0FBc0IsSUFBRyxDQUFDO0lBRXRDLFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxLQUFJLENBQUM7SUFFcEIsV0FBVztRQUNULElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDeEQsQ0FBQzs7MkdBdkRVLGNBQWM7K0ZBQWQsY0FBYyw0S0FUZDtRQUNULFlBQVk7UUFDWixXQUFXO1FBQ1gsWUFBWTtRQUNaLFdBQVc7UUFDWCxZQUFZO0tBQ2IsK0NDckNILGdQQUtBOzJGRG1DYSxjQUFjO2tCQWIxQixTQUFTOytCQUNFLGdCQUFnQixhQUdmO3dCQUNULFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsWUFBWTtxQkFDYixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs2SEFNL0MsYUFBYTtzQkFEWixNQUFNO2dCQU1QLGFBQWE7c0JBRFosTUFBTTtnQkFNUCxTQUFTO3NCQURSLE1BQU07Z0JBS00sTUFBTTtzQkFBbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFydFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNoYXJ0Q29uZmlnIH0gZnJvbSAnLi4vbW9kZWwvaS1jaGFydC1jb25maWcnO1xuXG5pbXBvcnQgeyBCYXNlUG9pbnQgfSBmcm9tICcuLi9tb2RlbC9iYXNlLXBvaW50JztcbmltcG9ydCB7IFNlcmllcyB9IGZyb20gJy4uL21vZGVsL3Nlcmllcyc7XG5pbXBvcnQgeyBab29tU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvem9vbS5zZXJ2aWNlJztcbmltcG9ydCB7IFNjYWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2Uvc2NhbGUuc2VydmljZSc7XG5pbXBvcnQgeyBCcnVzaFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2JydXNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXhlc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2F4ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFydEJvdW5kcyB9IGZyb20gJy4uL21vZGVsL2NoYXJ0LWJvdW5kcyc7XG5cbmltcG9ydCB7IElDaGFydEV2ZW50IH0gZnJvbSAnLi4vbW9kZWwvaS1jaGFydC1ldmVudCc7XG5pbXBvcnQgeyBQbG90TGluZSB9IGZyb20gJy4uL21vZGVsL3Bsb3RsaW5lJztcbmltcG9ydCB7IFBsb3RiYW5kIH0gZnJvbSAnLi4vbW9kZWwvcGxvdGJhbmQnO1xuaW1wb3J0IHsgSVBvaW50TW92ZSB9IGZyb20gJy4uL21vZGVsL2ktcG9pbnQtbW92ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RldGEtc3ZnLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgQ2hhcnRTZXJ2aWNlLFxuICAgIFpvb21TZXJ2aWNlLFxuICAgIFNjYWxlU2VydmljZSxcbiAgICBBeGVzU2VydmljZSxcbiAgICBCcnVzaFNlcnZpY2UsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBsZWdlbmRTZXJpZXM6IEFycmF5PFNlcmllczxCYXNlUG9pbnQ+PjtcblxuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRzTW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RiYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPFxuICAgIElDaGFydEV2ZW50PFBsb3RiYW5kPlxuICA+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHBsb3RMaW5lc01vdmU6IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxQbG90TGluZT4+ID0gbmV3IEV2ZW50RW1pdHRlcjxcbiAgICBJQ2hhcnRFdmVudDxQbG90TGluZT5cbiAgPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwb2ludE1vdmU6IEV2ZW50RW1pdHRlcjxJQ2hhcnRFdmVudDxJUG9pbnRNb3ZlPj4gPSBuZXcgRXZlbnRFbWl0dGVyPFxuICAgIElDaGFydEV2ZW50PElQb2ludE1vdmU+XG4gID4oKTtcblxuICBASW5wdXQoKSBzZXQgY29uZmlnKGNvbmZpZzogSUNoYXJ0Q29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgYm91bmRzOiBuZXcgQ2hhcnRCb3VuZHMoKSxcbiAgICAgIH0sXG4gICAgICBjb25maWdcbiAgICApO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3ZjOiBDaGFydFNlcnZpY2UsIHByaXZhdGUgem9vbVNlcnZpY2U6IFpvb21TZXJ2aWNlKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdmMucGxvdGJhbmRNb3ZlLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgdGhpcy5wbG90QmFuZHNNb3ZlLmVtaXQoXyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN2Yy5wbG90bGluZU1vdmUuc3Vic2NyaWJlKChfKSA9PiB7XG4gICAgICB0aGlzLnBsb3RMaW5lc01vdmUuZW1pdChfKTtcbiAgICB9KTtcblxuICAgIHRoaXMuc3ZjLnBvaW50TW92ZS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIHRoaXMucG9pbnRNb3ZlLmVtaXQoXyk7XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7fVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuem9vbVNlcnZpY2UuYnJvYWRjYXN0U3Vic2NyaWJ0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29sdW1uIGNvbHVtbl9hdXRvXCI+XG4gIDx0ZXRhLWNoYXJ0LWNvbnRhaW5lciBjbGFzcz1cImNoYXJ0LWNvbnRhaW5lclwiIFtjb25maWddPVwiY29uZmlnXCI+PC90ZXRhLWNoYXJ0LWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48dGV0YS1sZWdlbmQgKm5nSWY9XCJjb25maWcubGVnZW5kPy5lbmFibGUgPT09IHRydWVcIiBbc2VyaWVzXT1cImNvbmZpZy5zZXJpZXNcIj48L3RldGEtbGVnZW5kPlxuIl19
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NoYXJ0L2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jaGFydC9jaGFydC9jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLeEQsT0FBTyxFQUFFLEdBQUcsRUFBYyxTQUFTLEVBQU8sTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFTdkQsTUFBTSxPQUFPLGNBQWM7SUE4QnpCLFlBQW9CLElBQWtCLEVBQVUsWUFBeUI7UUFBckQsU0FBSSxHQUFKLElBQUksQ0FBYztRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBekJ6RSxrQkFBYSxHQUF3QyxJQUFJLFlBQVksRUFFbEUsQ0FBQztRQUdKLG1CQUFjLEdBQXdDLElBQUksWUFBWSxFQUVuRSxDQUFDO1FBR0osa0JBQWEsR0FBd0MsSUFBSSxZQUFZLEVBRWxFLENBQUM7UUFHSixjQUFTLEdBQTBDLElBQUksWUFBWSxFQUVoRSxDQUFDO1FBTUksV0FBTSxHQUFHLElBQUksQ0FBQztRQUdwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3RDLEdBQUcsQ0FDRCxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FDekUsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQWJELElBQWEsTUFBTSxDQUFDLE1BQW9CO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFhRCxXQUFXLENBQUMsT0FBc0IsSUFBRyxDQUFDO0lBRXRDLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7YUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDeEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3JFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO2FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2xDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZUFBZSxLQUFJLENBQUM7SUFFcEIsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDdkQsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7MkdBdEVVLGNBQWM7K0ZBQWQsY0FBYyw4TUFIZCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQywrQ0M1QnBFLDJ1QkFnQkE7MkZEZWEsY0FBYztrQkFQMUIsU0FBUzsrQkFDRSxnQkFBZ0IsYUFHZixDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxtQkFDakQsdUJBQXVCLENBQUMsTUFBTTs2SEFPL0MsYUFBYTtzQkFEWixNQUFNO2dCQU1QLGNBQWM7c0JBRGIsTUFBTTtnQkFNUCxhQUFhO3NCQURaLE1BQU07Z0JBTVAsU0FBUztzQkFEUixNQUFNO2dCQUtNLE1BQU07c0JBQWxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IElDaGFydENvbmZpZyB9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtY29uZmlnJztcbmltcG9ydCB7IEJhc2VQb2ludCB9IGZyb20gJy4uL21vZGVsL2Jhc2UtcG9pbnQnO1xuaW1wb3J0IHsgU2VyaWVzIH0gZnJvbSAnLi4vbW9kZWwvc2VyaWVzJztcbmltcG9ydCB7IFpvb21TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS96b29tLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NhbGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9zY2FsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEJydXNoU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvYnJ1c2guc2VydmljZSc7XG5pbXBvcnQgeyBJQ2hhcnRFdmVudCB9IGZyb20gJy4uL21vZGVsL2ktY2hhcnQtZXZlbnQnO1xuaW1wb3J0IHsgUGxvdExpbmUgfSBmcm9tICcuLi9tb2RlbC9wbG90LWxpbmUnO1xuaW1wb3J0IHsgUGxvdEJhbmQgfSBmcm9tICcuLi9tb2RlbC9wbG90LWJhbmQnO1xuaW1wb3J0IHsgSVBvaW50TW92ZSB9IGZyb20gJy4uL21vZGVsL2ktcG9pbnQtbW92ZSc7XG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUsIHRha2VXaGlsZSwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RldGEtc3ZnLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbQ2hhcnRTZXJ2aWNlLCBab29tU2VydmljZSwgU2NhbGVTZXJ2aWNlLCBCcnVzaFNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgbGVnZW5kU2VyaWVzOiBBcnJheTxTZXJpZXM8QmFzZVBvaW50Pj47XG4gIGhhc1Nlcmllc0RhdGE6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHN2Y0NvbmZpZzogT2JzZXJ2YWJsZTxJQ2hhcnRDb25maWc+O1xuICBAT3V0cHV0KClcbiAgcGxvdEJhbmRzTW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RCYW5kPj4gPSBuZXcgRXZlbnRFbWl0dGVyPFxuICAgIElDaGFydEV2ZW50PFBsb3RCYW5kPlxuICA+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHBsb3RCYW5kc0NsaWNrOiBFdmVudEVtaXR0ZXI8SUNoYXJ0RXZlbnQ8UGxvdEJhbmQ+PiA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgSUNoYXJ0RXZlbnQ8UGxvdEJhbmQ+XG4gID4oKTtcblxuICBAT3V0cHV0KClcbiAgcGxvdExpbmVzTW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PFBsb3RMaW5lPj4gPSBuZXcgRXZlbnRFbWl0dGVyPFxuICAgIElDaGFydEV2ZW50PFBsb3RMaW5lPlxuICA+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHBvaW50TW92ZTogRXZlbnRFbWl0dGVyPElDaGFydEV2ZW50PElQb2ludE1vdmU+PiA9IG5ldyBFdmVudEVtaXR0ZXI8XG4gICAgSUNoYXJ0RXZlbnQ8SVBvaW50TW92ZT5cbiAgPigpO1xuXG4gIEBJbnB1dCgpIHNldCBjb25maWcoY29uZmlnOiBJQ2hhcnRDb25maWcpIHtcbiAgICB0aGlzLl9zdmMuc2V0Q29uZmlnKGNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIF9hbGl2ZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3ZjOiBDaGFydFNlcnZpY2UsIHByaXZhdGUgX3pvb21TZXJ2aWNlOiBab29tU2VydmljZSkge1xuICAgIHRoaXMuc3ZjQ29uZmlnID0gdGhpcy5fc3ZjLmNvbmZpZztcbiAgICB0aGlzLmhhc1Nlcmllc0RhdGEgPSB0aGlzLnN2Y0NvbmZpZy5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoXykgPT4gXy5zZXJpZXM/Lmxlbmd0aCA+IDAgJiYgXy5zZXJpZXM/LnNvbWUoKF8pID0+IF8uZGF0YT8ubGVuZ3RoID4gMClcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdmMucGxvdEJhbmRFdmVudFxuICAgICAgLnBpcGUodGFrZVdoaWxlKCgpID0+IHRoaXMuX2FsaXZlKSlcbiAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgdGhpcy5wbG90QmFuZHNNb3ZlLmVtaXQoXyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX3N2Yy5wbG90TGluZU1vdmUucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgIHRoaXMucGxvdExpbmVzTW92ZS5lbWl0KF8pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc3ZjLnBvaW50TW92ZS5waXBlKHRha2VXaGlsZSgoKSA9PiB0aGlzLl9hbGl2ZSkpLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgdGhpcy5wb2ludE1vdmUuZW1pdChfKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3N2Yy5wbG90QmFuZENsaWNrXG4gICAgICAucGlwZSh0YWtlV2hpbGUoKCkgPT4gdGhpcy5fYWxpdmUpKVxuICAgICAgLnN1YnNjcmliZSgoXykgPT4ge1xuICAgICAgICB0aGlzLnBsb3RCYW5kc0NsaWNrLmVtaXQoXyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fYWxpdmUgPSBmYWxzZTtcbiAgICB0aGlzLl96b29tU2VydmljZS5icm9hZGNhc3RTdWJzY3JpcHRpb24/LmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ7XG4gIGhhc1Nlcmllc0RhdGE6IGhhc1Nlcmllc0RhdGEgfCBhc3luYyxcbiAgc3ZjQ29uZmlnOiBzdmNDb25maWcgfCBhc3luY1xufSBhcyBkYXRhXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhLmhhc1Nlcmllc0RhdGEgPT09IHRydWUgZWxzZSBub0RhdGFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGNvbHVtbl9hdXRvXCI+XG4gICAgICA8dGV0YS1jaGFydC1jb250YWluZXIgY2xhc3M9XCJjaGFydC1jb250YWluZXJcIj48L3RldGEtY2hhcnQtY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDx0ZXRhLWxlZ2VuZCAqbmdJZj1cImRhdGEuc3ZjQ29uZmlnLmxlZ2VuZD8uZW5hYmxlID09PSB0cnVlXCIgW3Nlcmllc109XCJkYXRhLnN2Y0NvbmZpZy5zZXJpZXNcIj48L3RldGEtbGVnZW5kPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuPG5nLXRlbXBsYXRlICNub0RhdGE+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW4gY29sdW1uX2F1dG8gYWxpZ24tY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9keS0zIGNvbG9yLXRleHQtNDBcIj7QlNCw0L3QvdGL0LUg0L7RgtGB0YPRgtGB0YLQstGD0Y7Rgjwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19