@rfprodz/client-d3-charts 1.2.24 → 1.3.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 (47) hide show
  1. package/esm2022/lib/components/bar-chart/bar-chart.component.mjs +88 -0
  2. package/esm2022/lib/components/chart-examples/chart-examples.component.mjs +228 -0
  3. package/esm2022/lib/components/force-directed-chart/force-directed-chart.component.mjs +93 -0
  4. package/esm2022/lib/components/line-chart/line-chart.component.mjs +93 -0
  5. package/esm2022/lib/components/pie-chart/pie-chart.component.mjs +91 -0
  6. package/esm2022/lib/components/radar-chart/radar-chart.component.mjs +103 -0
  7. package/esm2022/lib/d3-charts.module.mjs +48 -0
  8. package/esm2022/lib/util/bar-chart.util.mjs +257 -0
  9. package/esm2022/lib/util/line-chart.util.mjs +306 -0
  10. package/esm2022/lib/util/radar-chart.util.mjs +297 -0
  11. package/{fesm2020 → fesm2022}/rfprodz-client-d3-charts.mjs +197 -124
  12. package/fesm2022/rfprodz-client-d3-charts.mjs.map +1 -0
  13. package/lib/components/bar-chart/bar-chart.component.d.ts +1 -1
  14. package/lib/components/chart-examples/chart-examples.component.d.ts +25 -4
  15. package/lib/components/force-directed-chart/force-directed-chart.component.d.ts +1 -1
  16. package/lib/components/line-chart/line-chart.component.d.ts +2 -2
  17. package/lib/components/pie-chart/pie-chart.component.d.ts +1 -1
  18. package/lib/components/radar-chart/radar-chart.component.d.ts +1 -1
  19. package/lib/util/line-chart.util.d.ts +1 -1
  20. package/package.json +7 -13
  21. package/esm2020/lib/components/bar-chart/bar-chart.component.mjs +0 -87
  22. package/esm2020/lib/components/chart-examples/chart-examples.component.mjs +0 -181
  23. package/esm2020/lib/components/force-directed-chart/force-directed-chart.component.mjs +0 -92
  24. package/esm2020/lib/components/line-chart/line-chart.component.mjs +0 -91
  25. package/esm2020/lib/components/pie-chart/pie-chart.component.mjs +0 -90
  26. package/esm2020/lib/components/radar-chart/radar-chart.component.mjs +0 -102
  27. package/esm2020/lib/d3-charts.module.mjs +0 -47
  28. package/esm2020/lib/util/bar-chart.util.mjs +0 -255
  29. package/esm2020/lib/util/line-chart.util.mjs +0 -284
  30. package/esm2020/lib/util/radar-chart.util.mjs +0 -295
  31. package/fesm2015/rfprodz-client-d3-charts.mjs +0 -1901
  32. package/fesm2015/rfprodz-client-d3-charts.mjs.map +0 -1
  33. package/fesm2020/rfprodz-client-d3-charts.mjs.map +0 -1
  34. /package/{esm2020 → esm2022}/index.mjs +0 -0
  35. /package/{esm2020 → esm2022}/lib/components/index.mjs +0 -0
  36. /package/{esm2020 → esm2022}/lib/interfaces/bar-chart.interface.mjs +0 -0
  37. /package/{esm2020 → esm2022}/lib/interfaces/force-directed-chart.interface.mjs +0 -0
  38. /package/{esm2020 → esm2022}/lib/interfaces/index.mjs +0 -0
  39. /package/{esm2020 → esm2022}/lib/interfaces/line-chart.interface.mjs +0 -0
  40. /package/{esm2020 → esm2022}/lib/interfaces/pie-chart.interface.mjs +0 -0
  41. /package/{esm2020 → esm2022}/lib/interfaces/radar-chart.interface.mjs +0 -0
  42. /package/{esm2020 → esm2022}/lib/providers/d3-chart-factory.provider.mjs +0 -0
  43. /package/{esm2020 → esm2022}/lib/util/configuration.util.mjs +0 -0
  44. /package/{esm2020 → esm2022}/lib/util/force-directed-chart.util.mjs +0 -0
  45. /package/{esm2020 → esm2022}/lib/util/index.mjs +0 -0
  46. /package/{esm2020 → esm2022}/lib/util/pie-chart.util.mjs +0 -0
  47. /package/{esm2020 → esm2022}/rfprodz-client-d3-charts.mjs +0 -0
@@ -0,0 +1,88 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, ViewChild, } from '@angular/core';
3
+ import { D3_CHART_FACTORY } from '../../providers/d3-chart-factory.provider';
4
+ import { defaultBarChartConfig } from '../../util';
5
+ import * as i0 from "@angular/core";
6
+ class AppBarChartComponent {
7
+ constructor(doc, d3Factory) {
8
+ this.doc = doc;
9
+ this.d3Factory = d3Factory;
10
+ /**
11
+ * The chart id.
12
+ */
13
+ this.chartId = 'bar-0';
14
+ /**
15
+ * The chart data.
16
+ */
17
+ this.data = [];
18
+ /**
19
+ * The chart options.
20
+ */
21
+ this.options = {};
22
+ }
23
+ /**
24
+ * The chart options constructor.
25
+ * @returns chart options
26
+ */
27
+ chartOptions() {
28
+ const bodyWidthAdjustment = 10;
29
+ const width = Math.min(this.options.width ?? defaultBarChartConfig.width, this.doc.body.clientWidth - defaultBarChartConfig.margin.left - defaultBarChartConfig.margin.right - bodyWidthAdjustment);
30
+ const height = Math.min(this.options.height ?? width, this.doc.body.clientWidth - defaultBarChartConfig.margin.top - defaultBarChartConfig.margin.bottom - bodyWidthAdjustment);
31
+ const yAxisTicks = Math.max(...this.data.map(item => item.value));
32
+ const options = {
33
+ width,
34
+ height,
35
+ yAxisTicks,
36
+ ...this.options,
37
+ };
38
+ return options;
39
+ }
40
+ /**
41
+ * Draws the chart.
42
+ */
43
+ drawChart() {
44
+ if (typeof this.container !== 'undefined') {
45
+ const options = this.chartOptions();
46
+ this.d3Factory.drawBarChart(this.container, this.data, options);
47
+ }
48
+ }
49
+ /**
50
+ * Actually draws the chart after the component view is initialized.
51
+ */
52
+ ngAfterViewInit() {
53
+ this.drawChart();
54
+ }
55
+ /**
56
+ * Redraws the chart on changes.
57
+ */
58
+ ngOnChanges(changes) {
59
+ const data = changes.data?.currentValue;
60
+ const options = changes.options?.currentValue;
61
+ if ((typeof data !== 'undefined' && data !== null) || (typeof options !== 'undefined' && options !== null)) {
62
+ this.drawChart();
63
+ }
64
+ }
65
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppBarChartComponent, deps: [{ token: DOCUMENT }, { token: D3_CHART_FACTORY }], target: i0.ɵɵFactoryTarget.Component }); }
66
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: AppBarChartComponent, selector: "app-bar-chart", inputs: { chartId: "chartId", data: "data", options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\" id=\"{{ chartId }}\" #container></div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center}:host .container{flex:0 1 auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
67
+ }
68
+ export { AppBarChartComponent };
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppBarChartComponent, decorators: [{
70
+ type: Component,
71
+ args: [{ selector: 'app-bar-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container\" id=\"{{ chartId }}\" #container></div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center}:host .container{flex:0 1 auto}\n"] }]
72
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
73
+ type: Inject,
74
+ args: [DOCUMENT]
75
+ }] }, { type: undefined, decorators: [{
76
+ type: Inject,
77
+ args: [D3_CHART_FACTORY]
78
+ }] }]; }, propDecorators: { chartId: [{
79
+ type: Input
80
+ }], data: [{
81
+ type: Input
82
+ }], options: [{
83
+ type: Input
84
+ }], container: [{
85
+ type: ViewChild,
86
+ args: ['container']
87
+ }] } });
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2xpZW50LWQzLWNoYXJ0cy9zcmMvbGliL2NvbXBvbmVudHMvYmFyLWNoYXJ0L2Jhci1jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NsaWVudC1kMy1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2Jhci1jaGFydC9iYXItY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUdMLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0sMkNBQTJDLENBQUM7QUFDOUYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sWUFBWSxDQUFDOztBQU9uRCxNQU1hLG9CQUFvQjtJQXFCL0IsWUFBK0MsR0FBYSxFQUE2QyxTQUEwQjtRQUFwRixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQTZDLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBcEJuSTs7V0FFRztRQUNhLFlBQU8sR0FBRyxPQUFPLENBQUM7UUFFbEM7O1dBRUc7UUFDYSxTQUFJLEdBQWtCLEVBQUUsQ0FBQztRQUV6Qzs7V0FFRztRQUNhLFlBQU8sR0FBOEIsRUFBRSxDQUFDO0lBTzhFLENBQUM7SUFFdkk7OztPQUdHO0lBQ0ssWUFBWTtRQUNsQixNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsbUJBQW1CLENBQ3pILENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQ3pILENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNsRSxNQUFNLE9BQU8sR0FBOEI7WUFDekMsS0FBSztZQUNMLE1BQU07WUFDTixVQUFVO1lBQ1YsR0FBRyxJQUFJLENBQUMsT0FBTztTQUNoQixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRTtZQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLE9BQXNCO1FBQ3ZDLE1BQU0sSUFBSSxHQUEwQixPQUFPLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztRQUMvRCxNQUFNLE9BQU8sR0FBOEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7UUFDekUsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQzFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjtJQUNILENBQUM7aUlBekVVLG9CQUFvQixrQkFxQlgsUUFBUSxhQUEwQyxnQkFBZ0I7cUhBckIzRSxvQkFBb0Isb1BDNUJqQyxtRUFDQTs7U0QyQmEsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0UsZUFBZSxtQkFHUix1QkFBdUIsQ0FBQyxNQUFNOzswQkF1QmxDLE1BQU07MkJBQUMsUUFBUTs7MEJBQW1DLE1BQU07MkJBQUMsZ0JBQWdCOzRDQWpCdEUsT0FBTztzQkFBdEIsS0FBSztnQkFLVSxJQUFJO3NCQUFuQixLQUFLO2dCQUtVLE9BQU87c0JBQXRCLEtBQUs7Z0JBS21DLFNBQVM7c0JBQWpELFNBQVM7dUJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJQmFyQ2hhcnREYXRhTm9kZSwgSUJhckNoYXJ0T3B0aW9ucywgVEJhckNoYXJ0RGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvYmFyLWNoYXJ0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBEM19DSEFSVF9GQUNUT1JZLCBJRDNDaGFydEZhY3RvcnkgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvZDMtY2hhcnQtZmFjdG9yeS5wcm92aWRlcic7XG5pbXBvcnQgeyBkZWZhdWx0QmFyQ2hhcnRDb25maWcgfSBmcm9tICcuLi8uLi91dGlsJztcblxuaW50ZXJmYWNlIElJbnB1dENoYW5nZXMge1xuICBkYXRhPzogU2ltcGxlQ2hhbmdlIHwgbnVsbDtcbiAgb3B0aW9ucz86IFNpbXBsZUNoYW5nZSB8IG51bGw7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1iYXItY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFyLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBCYXJDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hhcnQgaWQuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgY2hhcnRJZCA9ICdiYXItMCc7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFydCBkYXRhLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGRhdGE6IFRCYXJDaGFydERhdGEgPSBbXTtcblxuICAvKipcbiAgICogVGhlIGNoYXJ0IG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogUGFydGlhbDxJQmFyQ2hhcnRPcHRpb25zPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBEMyBjaGFydCB2aWV3IGNoaWxkIHJlZmVyZW5jZS5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2M6IERvY3VtZW50LCBASW5qZWN0KEQzX0NIQVJUX0ZBQ1RPUlkpIHByaXZhdGUgcmVhZG9ubHkgZDNGYWN0b3J5OiBJRDNDaGFydEZhY3RvcnkpIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFydCBvcHRpb25zIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJucyBjaGFydCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGNoYXJ0T3B0aW9ucygpIHtcbiAgICBjb25zdCBib2R5V2lkdGhBZGp1c3RtZW50ID0gMTA7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihcbiAgICAgIHRoaXMub3B0aW9ucy53aWR0aCA/PyBkZWZhdWx0QmFyQ2hhcnRDb25maWcud2lkdGgsXG4gICAgICB0aGlzLmRvYy5ib2R5LmNsaWVudFdpZHRoIC0gZGVmYXVsdEJhckNoYXJ0Q29uZmlnLm1hcmdpbi5sZWZ0IC0gZGVmYXVsdEJhckNoYXJ0Q29uZmlnLm1hcmdpbi5yaWdodCAtIGJvZHlXaWR0aEFkanVzdG1lbnQsXG4gICAgKTtcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbihcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlnaHQgPz8gd2lkdGgsXG4gICAgICB0aGlzLmRvYy5ib2R5LmNsaWVudFdpZHRoIC0gZGVmYXVsdEJhckNoYXJ0Q29uZmlnLm1hcmdpbi50b3AgLSBkZWZhdWx0QmFyQ2hhcnRDb25maWcubWFyZ2luLmJvdHRvbSAtIGJvZHlXaWR0aEFkanVzdG1lbnQsXG4gICAgKTtcbiAgICBjb25zdCB5QXhpc1RpY2tzID0gTWF0aC5tYXgoLi4udGhpcy5kYXRhLm1hcChpdGVtID0+IGl0ZW0udmFsdWUpKTtcbiAgICBjb25zdCBvcHRpb25zOiBQYXJ0aWFsPElCYXJDaGFydE9wdGlvbnM+ID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB5QXhpc1RpY2tzLFxuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgIH07XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgdGhlIGNoYXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3Q2hhcnQoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbnRhaW5lciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmNoYXJ0T3B0aW9ucygpO1xuICAgICAgdGhpcy5kM0ZhY3RvcnkuZHJhd0JhckNoYXJ0KHRoaXMuY29udGFpbmVyLCB0aGlzLmRhdGEsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3R1YWxseSBkcmF3cyB0aGUgY2hhcnQgYWZ0ZXIgdGhlIGNvbXBvbmVudCB2aWV3IGlzIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdDaGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZHJhd3MgdGhlIGNoYXJ0IG9uIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogSUlucHV0Q2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGE6IElCYXJDaGFydERhdGFOb2RlW11bXSA9IGNoYW5nZXMuZGF0YT8uY3VycmVudFZhbHVlO1xuICAgIGNvbnN0IG9wdGlvbnM6IFBhcnRpYWw8SUJhckNoYXJ0T3B0aW9ucz4gPSBjaGFuZ2VzLm9wdGlvbnM/LmN1cnJlbnRWYWx1ZTtcbiAgICBpZiAoKHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJyAmJiBkYXRhICE9PSBudWxsKSB8fCAodHlwZW9mIG9wdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIG9wdGlvbnMgIT09IG51bGwpKSB7XG4gICAgICB0aGlzLmRyYXdDaGFydCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiIGlkPVwie3sgY2hhcnRJZCB9fVwiICNjb250YWluZXI+PC9kaXY+XG4iXX0=
@@ -0,0 +1,228 @@
1
+ import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
2
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { first, map, switchMap, timer } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/cdk/layout";
6
+ import * as i2 from "@angular/common";
7
+ import * as i3 from "../pie-chart/pie-chart.component";
8
+ import * as i4 from "../radar-chart/radar-chart.component";
9
+ import * as i5 from "../force-directed-chart/force-directed-chart.component";
10
+ import * as i6 from "../bar-chart/bar-chart.component";
11
+ import * as i7 from "../line-chart/line-chart.component";
12
+ class AppChartExamplesComponent {
13
+ /**
14
+ * Sample bar chart data.
15
+ */
16
+ get barChartData() {
17
+ return [
18
+ { title: 'one', value: 1 },
19
+ { title: 'two', value: 2 },
20
+ { title: 'three', value: 3 },
21
+ { title: 'four', value: 4 },
22
+ { title: 'five', value: 5 },
23
+ ];
24
+ }
25
+ /**
26
+ * Sample line chart data.
27
+ */
28
+ get lineChartData() {
29
+ return [
30
+ [
31
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
32
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
33
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
34
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
35
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
36
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
37
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
38
+ ].sort((a, b) => a.timestamp - b.timestamp),
39
+ [
40
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
41
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
42
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
43
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
44
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
45
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
46
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
47
+ ].sort((a, b) => a.timestamp - b.timestamp),
48
+ [
49
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
50
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
51
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
52
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
53
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
54
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
55
+ { timestamp: this.randomTimestamp(), value: this.randomValue() },
56
+ ].sort((a, b) => a.timestamp - b.timestamp),
57
+ ];
58
+ }
59
+ /**
60
+ * Sample radar chart data.
61
+ */
62
+ get radarChartData() {
63
+ return [
64
+ [
65
+ { axis: 'one', value: 1, unit: 'x' },
66
+ { axis: 'two', value: 2, unit: 'x' },
67
+ { axis: 'three', value: 3, unit: 'x' },
68
+ { axis: 'four', value: 4, unit: 'x' },
69
+ { axis: 'five', value: 5, unit: 'x' },
70
+ { axis: 'six', value: 6, unit: 'x' },
71
+ { axis: 'seven', value: 7, unit: 'x' },
72
+ { axis: 'eight', value: 8, unit: 'x' },
73
+ { axis: 'nine (long labels are wrapped)', value: 9, unit: 'x' },
74
+ ],
75
+ [
76
+ { axis: 'one', value: 9, unit: 'y' },
77
+ { axis: 'two', value: 8, unit: 'y' },
78
+ { axis: 'three', value: 7, unit: 'y' },
79
+ { axis: 'four', value: 6, unit: 'y' },
80
+ { axis: 'five', value: 5, unit: 'y' },
81
+ { axis: 'six', value: 4, unit: 'y' },
82
+ { axis: 'seven', value: 3, unit: 'y' },
83
+ { axis: 'eight', value: 2, unit: 'y' },
84
+ { axis: 'nine (long labels are wrapped)', value: 1, unit: 'y' },
85
+ ],
86
+ ];
87
+ }
88
+ /**
89
+ * Sample pie chart data.
90
+ */
91
+ get pieChartData() {
92
+ return [
93
+ { key: 'one', y: 1 },
94
+ { key: 'two', y: 2 },
95
+ { key: 'three', y: 3 },
96
+ { key: 'four', y: 4 },
97
+ { key: 'five', y: 5 },
98
+ { key: 'six', y: 6 },
99
+ ];
100
+ }
101
+ /**
102
+ * Sample force directed chart data.
103
+ */
104
+ get forceDirectedChartData() {
105
+ const input = {
106
+ domains: ['first', 'second', 'third'],
107
+ entities: [
108
+ { name: 'one', domains: ['first'], img: '' },
109
+ { name: 'two', domains: ['second'], img: '' },
110
+ { name: 'three', domains: ['third'], img: '' },
111
+ { name: 'four', domains: ['first', 'second'], img: '' },
112
+ { name: 'five', domains: ['second'], img: '' },
113
+ { name: 'six', domains: ['third', 'second'], img: '' },
114
+ { name: 'seven', domains: ['second'], img: '' },
115
+ { name: 'eight', domains: ['third'], img: '' },
116
+ ],
117
+ };
118
+ const domains = input.domains.map((name, index) => ({ index, name, value: 1 }));
119
+ const entities = input.entities.map((app, index) => ({
120
+ index: index,
121
+ name: app.name,
122
+ domains: [...app.domains],
123
+ img: app.img,
124
+ linksCount: 0,
125
+ }));
126
+ const nodes = [...entities];
127
+ const links = entities
128
+ .map(entity => {
129
+ return entity.domains.map(domain => {
130
+ const source = domains.find(value => domain === value.name)?.index ?? -1;
131
+ const target = entity.index;
132
+ return { source, target };
133
+ });
134
+ })
135
+ .reduce((accumulator, item) => (Array.isArray(item) ? [...accumulator, ...item] : [...accumulator, item]), [])
136
+ .filter(link => link.source !== -1 && link.target !== -1 && typeof link.target !== 'undefined');
137
+ const chartData = {
138
+ domains,
139
+ entities: entities.map(item => ({
140
+ ...item,
141
+ linksCount: links.reduce((acc, link) => (link.target === item.index ? acc + 1 : acc), 0),
142
+ })),
143
+ links,
144
+ nodes,
145
+ };
146
+ return chartData;
147
+ }
148
+ constructor(breakpointObserver) {
149
+ this.breakpointObserver = breakpointObserver;
150
+ this.breakpoint$ = this.breakpointObserver
151
+ .observe([Breakpoints.XSmall, Breakpoints.Small, Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])
152
+ .pipe(map(result => Object.keys(result.breakpoints).find(item => result.breakpoints[item]) ?? 'unknown'));
153
+ this.barChartConfig$ = this.breakpoint$.pipe(switchMap(() => timer(this.timeout).pipe(first(), map(() => ({ data: this.barChartData, options: this.barChartOptions() })))));
154
+ this.lineChartConfig$ = this.breakpoint$.pipe(switchMap(() => timer(this.timeout).pipe(first(), map(() => ({
155
+ data: this.lineChartData,
156
+ options: this.lineChartOptions(),
157
+ optionsDateDdMmYy: this.lineChartOptions('dd/mm/yy'),
158
+ optionsDateDdMmYyyy: this.lineChartOptions('dd/mm/yyyy'),
159
+ optionsDateMmYyyy: this.lineChartOptions('mm/yyyy'),
160
+ })))));
161
+ this.radarChartConfig$ = this.breakpoint$.pipe(switchMap(() => timer(this.timeout).pipe(first(), map(() => ({ data: this.radarChartData, options: this.radarChartOptions() })))));
162
+ this.pieChartConfig$ = this.breakpoint$.pipe(switchMap(() => timer(this.timeout).pipe(first(), map(() => ({ data: this.pieChartData, options: this.pieChartOptions() })))));
163
+ this.forceDirectedChartConfig$ = this.breakpoint$.pipe(switchMap(() => timer(this.timeout).pipe(first(), map(() => ({ data: this.forceDirectedChartData, options: this.forceDirectedChartOptions() })))));
164
+ this.timeout = 100;
165
+ }
166
+ randomValue(range) {
167
+ const defaultRange = 100;
168
+ return Math.floor(Math.random() * (range ?? defaultRange) + 1);
169
+ }
170
+ randomTimestamp(range) {
171
+ const defaultRange = 100000000;
172
+ return Math.floor(Math.random() * (range ?? defaultRange) + new Date().getTime());
173
+ }
174
+ /**
175
+ * Example bar chart options.
176
+ */
177
+ barChartOptions() {
178
+ return {
179
+ chartTitle: 'Example bar chart',
180
+ xAxisTitle: 'long x axis title',
181
+ yAxisTitle: 'long y axis title',
182
+ };
183
+ }
184
+ /**
185
+ * Example line chart options.
186
+ * @param dateFormat date format
187
+ */
188
+ lineChartOptions(dateFormat = 'default') {
189
+ return {
190
+ chartTitle: `Example line chart, date format ${dateFormat}`,
191
+ xAxisTitle: 'Date range',
192
+ yAxisTitle: 'Value range',
193
+ dateFormat,
194
+ };
195
+ }
196
+ /**
197
+ * Example radar chart options.
198
+ */
199
+ radarChartOptions() {
200
+ return {
201
+ chartTitle: 'Example radar chart',
202
+ };
203
+ }
204
+ /**
205
+ * Example pie chart options.
206
+ */
207
+ pieChartOptions() {
208
+ return {
209
+ chartTitle: 'Example pie chart',
210
+ };
211
+ }
212
+ /**
213
+ * Example force directed chart options.
214
+ */
215
+ forceDirectedChartOptions() {
216
+ return {
217
+ chartTitle: 'Example force directed chart',
218
+ };
219
+ }
220
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppChartExamplesComponent, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
221
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: AppChartExamplesComponent, selector: "app-chart-examples", ngImport: i0, template: "<div class=\"container\" *ngIf=\"barChartConfig$ | async as config\">\n <app-bar-chart [chartId]=\"'bar-example-1'\" [data]=\"config.data\" [options]=\"config.options\"></app-bar-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"lineChartConfig$ | async as config\">\n <app-line-chart [chartId]=\"'line-example-1'\" [data]=\"[config.data[0]]\" [options]=\"config.options\"></app-line-chart>\n\n <app-line-chart [chartId]=\"'line-example-2'\" [data]=\"[config.data[1]]\" [options]=\"config.optionsDateDdMmYy\"></app-line-chart>\n\n <app-line-chart\n [chartId]=\"'line-example-3'\"\n [data]=\"[config.data[1], config.data[2]]\"\n [options]=\"config.optionsDateDdMmYyyy\"\n ></app-line-chart>\n\n <app-line-chart [chartId]=\"'line-example-4'\" [data]=\"config.data\" [options]=\"config.optionsDateMmYyyy\"></app-line-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"radarChartConfig$ | async as config\">\n <app-radar-chart [chartId]=\"'radar-example-1'\" [data]=\"config.data\" [options]=\"config.options\"></app-radar-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"pieChartConfig$ | async as config\">\n <app-pie-chart [chartId]=\"'pie-example-1'\" [data]=\"config.data\" [options]=\"config.options\"></app-pie-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"forceDirectedChartConfig$ | async as config\">\n <app-force-directed-chart\n [chartId]=\"'force-directed-example-1'\"\n [data]=\"config.data\"\n [options]=\"config.options\"\n ></app-force-directed-chart>\n</div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center}:host .container{display:flex;flex:1 1 auto;width:100%}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.AppPieChartComponent, selector: "app-pie-chart", inputs: ["chartId", "data", "options"] }, { kind: "component", type: i4.AppRadarChartComponent, selector: "app-radar-chart", inputs: ["chartId", "data", "options"] }, { kind: "component", type: i5.AppForceDirectedChartComponent, selector: "app-force-directed-chart", inputs: ["chartId", "data", "options"] }, { kind: "component", type: i6.AppBarChartComponent, selector: "app-bar-chart", inputs: ["chartId", "data", "options"] }, { kind: "component", type: i7.AppLineChartComponent, selector: "app-line-chart", inputs: ["chartId", "data", "options"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
222
+ }
223
+ export { AppChartExamplesComponent };
224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppChartExamplesComponent, decorators: [{
225
+ type: Component,
226
+ args: [{ selector: 'app-chart-examples', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container\" *ngIf=\"barChartConfig$ | async as config\">\n <app-bar-chart [chartId]=\"'bar-example-1'\" [data]=\"config.data\" [options]=\"config.options\"></app-bar-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"lineChartConfig$ | async as config\">\n <app-line-chart [chartId]=\"'line-example-1'\" [data]=\"[config.data[0]]\" [options]=\"config.options\"></app-line-chart>\n\n <app-line-chart [chartId]=\"'line-example-2'\" [data]=\"[config.data[1]]\" [options]=\"config.optionsDateDdMmYy\"></app-line-chart>\n\n <app-line-chart\n [chartId]=\"'line-example-3'\"\n [data]=\"[config.data[1], config.data[2]]\"\n [options]=\"config.optionsDateDdMmYyyy\"\n ></app-line-chart>\n\n <app-line-chart [chartId]=\"'line-example-4'\" [data]=\"config.data\" [options]=\"config.optionsDateMmYyyy\"></app-line-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"radarChartConfig$ | async as config\">\n <app-radar-chart [chartId]=\"'radar-example-1'\" [data]=\"config.data\" [options]=\"config.options\"></app-radar-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"pieChartConfig$ | async as config\">\n <app-pie-chart [chartId]=\"'pie-example-1'\" [data]=\"config.data\" [options]=\"config.options\"></app-pie-chart>\n</div>\n\n<hr [ngStyle]=\"{ width: '100%' }\" />\n\n<div class=\"container\" *ngIf=\"forceDirectedChartConfig$ | async as config\">\n <app-force-directed-chart\n [chartId]=\"'force-directed-example-1'\"\n [data]=\"config.data\"\n [options]=\"config.options\"\n ></app-force-directed-chart>\n</div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:center}:host .container{display:flex;flex:1 1 auto;width:100%}\n"] }]
227
+ }], ctorParameters: function () { return [{ type: i1.BreakpointObserver }]; } });
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtZXhhbXBsZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jbGllbnQtZDMtY2hhcnRzL3NyYy9saWIvY29tcG9uZW50cy9jaGFydC1leGFtcGxlcy9jaGFydC1leGFtcGxlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NsaWVudC1kMy1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0LWV4YW1wbGVzL2NoYXJ0LWV4YW1wbGVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQVlwRCxNQU1hLHlCQUF5QjtJQUNwQzs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNyQixPQUFzQjtZQUNwQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMxQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMxQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUM1QixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtZQUMzQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3RCLE9BQXlCO1lBQ3ZCO2dCQUNFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNoRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDaEUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2hFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNoRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDaEUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2hFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2FBQ2pFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzNDO2dCQUNFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNoRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDaEUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2hFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNoRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDaEUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2hFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2FBQ2pFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzNDO2dCQUNFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNoRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDaEUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2hFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2dCQUNoRSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDaEUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2hFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO2FBQ2pFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDO1NBQzVDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGNBQWM7UUFDdkIsT0FBZ0M7WUFDOUI7Z0JBQ0UsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDdEMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDckMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDckMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDdEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDdEMsRUFBRSxJQUFJLEVBQUUsZ0NBQWdDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO2FBQ2hFO1lBQ0Q7Z0JBQ0UsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDdEMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDckMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDckMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDcEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDdEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtnQkFDdEMsRUFBRSxJQUFJLEVBQUUsZ0NBQWdDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO2FBQ2hFO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNyQixPQUE0QjtZQUMxQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNwQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNwQixFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN0QixFQUFF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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnJlYWtwb2ludE9ic2VydmVyLCBCcmVha3BvaW50cyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlyc3QsIG1hcCwgc3dpdGNoTWFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJQmFyQ2hhcnRPcHRpb25zLCBUQmFyQ2hhcnREYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9iYXItY2hhcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIElGb3JjZURpcmVjdGVkQ2hhcnREYXRhLFxuICBJRm9yY2VEaXJlY3RlZENoYXJ0T3B0aW9ucyxcbiAgSUZvcmNlRGlyZWN0ZWRHcmFwaEVudGl0eSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9mb3JjZS1kaXJlY3RlZC1jaGFydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUxpbmVDaGFydE9wdGlvbnMsIFREYXRlRm9ybWF0LCBUTGluZUNoYXJ0RGF0YSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvbGluZS1jaGFydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVBpZUNoYXJ0RGF0YU5vZGUsIElQaWVDaGFydE9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BpZS1jaGFydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVJhZGFyQ2hhcnREYXRhTm9kZSwgSVJhZGFyQ2hhcnRPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yYWRhci1jaGFydC5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY2hhcnQtZXhhbXBsZXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQtZXhhbXBsZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFydC1leGFtcGxlcy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwQ2hhcnRFeGFtcGxlc0NvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBTYW1wbGUgYmFyIGNoYXJ0IGRhdGEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGJhckNoYXJ0RGF0YSgpIHtcbiAgICByZXR1cm4gPFRCYXJDaGFydERhdGE+W1xuICAgICAgeyB0aXRsZTogJ29uZScsIHZhbHVlOiAxIH0sXG4gICAgICB7IHRpdGxlOiAndHdvJywgdmFsdWU6IDIgfSxcbiAgICAgIHsgdGl0bGU6ICd0aHJlZScsIHZhbHVlOiAzIH0sXG4gICAgICB7IHRpdGxlOiAnZm91cicsIHZhbHVlOiA0IH0sXG4gICAgICB7IHRpdGxlOiAnZml2ZScsIHZhbHVlOiA1IH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGUgbGluZSBjaGFydCBkYXRhLlxuICAgKi9cbiAgcHVibGljIGdldCBsaW5lQ2hhcnREYXRhKCkge1xuICAgIHJldHVybiA8VExpbmVDaGFydERhdGFbXT5bXG4gICAgICBbXG4gICAgICAgIHsgdGltZXN0YW1wOiB0aGlzLnJhbmRvbVRpbWVzdGFtcCgpLCB2YWx1ZTogdGhpcy5yYW5kb21WYWx1ZSgpIH0sXG4gICAgICAgIHsgdGltZXN0YW1wOiB0aGlzLnJhbmRvbVRpbWVzdGFtcCgpLCB2YWx1ZTogdGhpcy5yYW5kb21WYWx1ZSgpIH0sXG4gICAgICAgIHsgdGltZXN0YW1wOiB0aGlzLnJhbmRvbVRpbWVzdGFtcCgpLCB2YWx1ZTogdGhpcy5yYW5kb21WYWx1ZSgpIH0sXG4gICAgICAgIHsgdGltZXN0YW1wOiB0aGlzLnJhbmRvbVRpbWVzdGFtcCgpLCB2YWx1ZTogdGhpcy5yYW5kb21WYWx1ZSgpIH0sXG4gICAgICAgIHsgdGltZXN0YW1wOiB0aGlzLnJhbmRvbVRpbWVzdGFtcCgpLCB2YWx1ZTogdGhpcy5yYW5kb21WYWx1ZSgpIH0sXG4gICAgICAgIHsgdGltZXN0YW1wOiB0aGlzLnJhbmRvbVRpbWVzdGFtcCgpLCB2YWx1ZTogdGhpcy5yYW5kb21WYWx1ZSgpIH0sXG4gICAgICAgIHsgdGltZXN0YW1wOiB0aGlzLnJhbmRvbVRpbWVzdGFtcCgpLCB2YWx1ZTogdGhpcy5yYW5kb21WYWx1ZSgpIH0sXG4gICAgICBdLnNvcnQoKGEsIGIpID0+IGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXApLFxuICAgICAgW1xuICAgICAgICB7IHRpbWVzdGFtcDogdGhpcy5yYW5kb21UaW1lc3RhbXAoKSwgdmFsdWU6IHRoaXMucmFuZG9tVmFsdWUoKSB9LFxuICAgICAgICB7IHRpbWVzdGFtcDogdGhpcy5yYW5kb21UaW1lc3RhbXAoKSwgdmFsdWU6IHRoaXMucmFuZG9tVmFsdWUoKSB9LFxuICAgICAgICB7IHRpbWVzdGFtcDogdGhpcy5yYW5kb21UaW1lc3RhbXAoKSwgdmFsdWU6IHRoaXMucmFuZG9tVmFsdWUoKSB9LFxuICAgICAgICB7IHRpbWVzdGFtcDogdGhpcy5yYW5kb21UaW1lc3RhbXAoKSwgdmFsdWU6IHRoaXMucmFuZG9tVmFsdWUoKSB9LFxuICAgICAgICB7IHRpbWVzdGFtcDogdGhpcy5yYW5kb21UaW1lc3RhbXAoKSwgdmFsdWU6IHRoaXMucmFuZG9tVmFsdWUoKSB9LFxuICAgICAgICB7IHRpbWVzdGFtcDogdGhpcy5yYW5kb21UaW1lc3RhbXAoKSwgdmFsdWU6IHRoaXMucmFuZG9tVmFsdWUoKSB9LFxuICAgICAgICB7IHRpbWVzdGFtcDogdGhpcy5yYW5kb21UaW1lc3RhbXAoKSwgdmFsdWU6IHRoaXMucmFuZG9tVmFsdWUoKSB9LFxuICAgICAgXS5zb3J0KChhLCBiKSA9PiBhLnRpbWVzdGFtcCAtIGIudGltZXN0YW1wKSxcbiAgICAgIFtcbiAgICAgICAgeyB0aW1lc3RhbXA6IHRoaXMucmFuZG9tVGltZXN0YW1wKCksIHZhbHVlOiB0aGlzLnJhbmRvbVZhbHVlKCkgfSxcbiAgICAgICAgeyB0aW1lc3RhbXA6IHRoaXMucmFuZG9tVGltZXN0YW1wKCksIHZhbHVlOiB0aGlzLnJhbmRvbVZhbHVlKCkgfSxcbiAgICAgICAgeyB0aW1lc3RhbXA6IHRoaXMucmFuZG9tVGltZXN0YW1wKCksIHZhbHVlOiB0aGlzLnJhbmRvbVZhbHVlKCkgfSxcbiAgICAgICAgeyB0aW1lc3RhbXA6IHRoaXMucmFuZG9tVGltZXN0YW1wKCksIHZhbHVlOiB0aGlzLnJhbmRvbVZhbHVlKCkgfSxcbiAgICAgICAgeyB0aW1lc3RhbXA6IHRoaXMucmFuZG9tVGltZXN0YW1wKCksIHZhbHVlOiB0aGlzLnJhbmRvbVZhbHVlKCkgfSxcbiAgICAgICAgeyB0aW1lc3RhbXA6IHRoaXMucmFuZG9tVGltZXN0YW1wKCksIHZhbHVlOiB0aGlzLnJhbmRvbVZhbHVlKCkgfSxcbiAgICAgICAgeyB0aW1lc3RhbXA6IHRoaXMucmFuZG9tVGltZXN0YW1wKCksIHZhbHVlOiB0aGlzLnJhbmRvbVZhbHVlKCkgfSxcbiAgICAgIF0uc29ydCgoYSwgYikgPT4gYS50aW1lc3RhbXAgLSBiLnRpbWVzdGFtcCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGUgcmFkYXIgY2hhcnQgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBnZXQgcmFkYXJDaGFydERhdGEoKSB7XG4gICAgcmV0dXJuIDxJUmFkYXJDaGFydERhdGFOb2RlW11bXT5bXG4gICAgICBbXG4gICAgICAgIHsgYXhpczogJ29uZScsIHZhbHVlOiAxLCB1bml0OiAneCcgfSxcbiAgICAgICAgeyBheGlzOiAndHdvJywgdmFsdWU6IDIsIHVuaXQ6ICd4JyB9LFxuICAgICAgICB7IGF4aXM6ICd0aHJlZScsIHZhbHVlOiAzLCB1bml0OiAneCcgfSxcbiAgICAgICAgeyBheGlzOiAnZm91cicsIHZhbHVlOiA0LCB1bml0OiAneCcgfSxcbiAgICAgICAgeyBheGlzOiAnZml2ZScsIHZhbHVlOiA1LCB1bml0OiAneCcgfSxcbiAgICAgICAgeyBheGlzOiAnc2l4JywgdmFsdWU6IDYsIHVuaXQ6ICd4JyB9LFxuICAgICAgICB7IGF4aXM6ICdzZXZlbicsIHZhbHVlOiA3LCB1bml0OiAneCcgfSxcbiAgICAgICAgeyBheGlzOiAnZWlnaHQnLCB2YWx1ZTogOCwgdW5pdDogJ3gnIH0sXG4gICAgICAgIHsgYXhpczogJ25pbmUgKGxvbmcgbGFiZWxzIGFyZSB3cmFwcGVkKScsIHZhbHVlOiA5LCB1bml0OiAneCcgfSxcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIHsgYXhpczogJ29uZScsIHZhbHVlOiA5LCB1bml0OiAneScgfSxcbiAgICAgICAgeyBheGlzOiAndHdvJywgdmFsdWU6IDgsIHVuaXQ6ICd5JyB9LFxuICAgICAgICB7IGF4aXM6ICd0aHJlZScsIHZhbHVlOiA3LCB1bml0OiAneScgfSxcbiAgICAgICAgeyBheGlzOiAnZm91cicsIHZhbHVlOiA2LCB1bml0OiAneScgfSxcbiAgICAgICAgeyBheGlzOiAnZml2ZScsIHZhbHVlOiA1LCB1bml0OiAneScgfSxcbiAgICAgICAgeyBheGlzOiAnc2l4JywgdmFsdWU6IDQsIHVuaXQ6ICd5JyB9LFxuICAgICAgICB7IGF4aXM6ICdzZXZlbicsIHZhbHVlOiAzLCB1bml0OiAneScgfSxcbiAgICAgICAgeyBheGlzOiAnZWlnaHQnLCB2YWx1ZTogMiwgdW5pdDogJ3knIH0sXG4gICAgICAgIHsgYXhpczogJ25pbmUgKGxvbmcgbGFiZWxzIGFyZSB3cmFwcGVkKScsIHZhbHVlOiAxLCB1bml0OiAneScgfSxcbiAgICAgIF0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGUgcGllIGNoYXJ0IGRhdGEuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBpZUNoYXJ0RGF0YSgpIHtcbiAgICByZXR1cm4gPElQaWVDaGFydERhdGFOb2RlW10+W1xuICAgICAgeyBrZXk6ICdvbmUnLCB5OiAxIH0sXG4gICAgICB7IGtleTogJ3R3bycsIHk6IDIgfSxcbiAgICAgIHsga2V5OiAndGhyZWUnLCB5OiAzIH0sXG4gICAgICB7IGtleTogJ2ZvdXInLCB5OiA0IH0sXG4gICAgICB7IGtleTogJ2ZpdmUnLCB5OiA1IH0sXG4gICAgICB7IGtleTogJ3NpeCcsIHk6IDYgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbXBsZSBmb3JjZSBkaXJlY3RlZCBjaGFydCBkYXRhLlxuICAgKi9cbiAgcHVibGljIGdldCBmb3JjZURpcmVjdGVkQ2hhcnREYXRhKCkge1xuICAgIGNvbnN0IGlucHV0ID0ge1xuICAgICAgZG9tYWluczogWydmaXJzdCcsICdzZWNvbmQnLCAndGhpcmQnXSxcbiAgICAgIGVudGl0aWVzOiBbXG4gICAgICAgIHsgbmFtZTogJ29uZScsIGRvbWFpbnM6IFsnZmlyc3QnXSwgaW1nOiAnJyB9LFxuICAgICAgICB7IG5hbWU6ICd0d28nLCBkb21haW5zOiBbJ3NlY29uZCddLCBpbWc6ICcnIH0sXG4gICAgICAgIHsgbmFtZTogJ3RocmVlJywgZG9tYWluczogWyd0aGlyZCddLCBpbWc6ICcnIH0sXG4gICAgICAgIHsgbmFtZTogJ2ZvdXInLCBkb21haW5zOiBbJ2ZpcnN0JywgJ3NlY29uZCddLCBpbWc6ICcnIH0sXG4gICAgICAgIHsgbmFtZTogJ2ZpdmUnLCBkb21haW5zOiBbJ3NlY29uZCddLCBpbWc6ICcnIH0sXG4gICAgICAgIHsgbmFtZTogJ3NpeCcsIGRvbWFpbnM6IFsndGhpcmQnLCAnc2Vjb25kJ10sIGltZzogJycgfSxcbiAgICAgICAgeyBuYW1lOiAnc2V2ZW4nLCBkb21haW5zOiBbJ3NlY29uZCddLCBpbWc6ICcnIH0sXG4gICAgICAgIHsgbmFtZTogJ2VpZ2h0JywgZG9tYWluczogWyd0aGlyZCddLCBpbWc6ICcnIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgY29uc3QgZG9tYWluczogSUZvcmNlRGlyZWN0ZWRDaGFydERhdGFbJ2RvbWFpbnMnXSA9IGlucHV0LmRvbWFpbnMubWFwKChuYW1lLCBpbmRleCkgPT4gKHsgaW5kZXgsIG5hbWUsIHZhbHVlOiAxIH0pKTtcbiAgICBjb25zdCBlbnRpdGllczogSUZvcmNlRGlyZWN0ZWRDaGFydERhdGFbJ2VudGl0aWVzJ10gPSBpbnB1dC5lbnRpdGllcy5tYXAoKGFwcCwgaW5kZXgpID0+ICh7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBuYW1lOiBhcHAubmFtZSxcbiAgICAgIGRvbWFpbnM6IFsuLi5hcHAuZG9tYWluc10sXG4gICAgICBpbWc6IGFwcC5pbWcsXG4gICAgICBsaW5rc0NvdW50OiAwLFxuICAgIH0pKTtcbiAgICBjb25zdCBub2RlczogSUZvcmNlRGlyZWN0ZWRHcmFwaEVudGl0eVtdID0gWy4uLmVudGl0aWVzXTtcbiAgICBjb25zdCBsaW5rczogSUZvcmNlRGlyZWN0ZWRDaGFydERhdGFbJ2xpbmtzJ10gPSBlbnRpdGllc1xuICAgICAgLm1hcChlbnRpdHkgPT4ge1xuICAgICAgICByZXR1cm4gZW50aXR5LmRvbWFpbnMubWFwKGRvbWFpbiA9PiB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gZG9tYWlucy5maW5kKHZhbHVlID0+IGRvbWFpbiA9PT0gdmFsdWUubmFtZSk/LmluZGV4ID8/IC0xO1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGVudGl0eS5pbmRleDtcbiAgICAgICAgICByZXR1cm4geyBzb3VyY2UsIHRhcmdldCB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKChhY2N1bXVsYXRvciwgaXRlbSkgPT4gKEFycmF5LmlzQXJyYXkoaXRlbSkgPyBbLi4uYWNjdW11bGF0b3IsIC4uLml0ZW1dIDogWy4uLmFjY3VtdWxhdG9yLCBpdGVtXSksIFtdKVxuICAgICAgLmZpbHRlcihsaW5rID0+IGxpbmsuc291cmNlICE9PSAtMSAmJiBsaW5rLnRhcmdldCAhPT0gLTEgJiYgdHlwZW9mIGxpbmsudGFyZ2V0ICE9PSAndW5kZWZpbmVkJyk7XG4gICAgY29uc3QgY2hhcnREYXRhOiBJRm9yY2VEaXJlY3RlZENoYXJ0RGF0YSA9IHtcbiAgICAgIGRvbWFpbnMsXG4gICAgICBlbnRpdGllczogZW50aXRpZXMubWFwKGl0ZW0gPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgbGlua3NDb3VudDogbGlua3MucmVkdWNlKChhY2MsIGxpbmspID0+IChsaW5rLnRhcmdldCA9PT0gaXRlbS5pbmRleCA/IGFjYyArIDEgOiBhY2MpLCAwKSxcbiAgICAgIH0pKSxcbiAgICAgIGxpbmtzLFxuICAgICAgbm9kZXMsXG4gICAgfTtcbiAgICByZXR1cm4gY2hhcnREYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBicmVha3BvaW50JCA9IHRoaXMuYnJlYWtwb2ludE9ic2VydmVyXG4gICAgLm9ic2VydmUoW0JyZWFrcG9pbnRzLlhTbWFsbCwgQnJlYWtwb2ludHMuU21hbGwsIEJyZWFrcG9pbnRzLk1lZGl1bSwgQnJlYWtwb2ludHMuTGFyZ2UsIEJyZWFrcG9pbnRzLlhMYXJnZV0pXG4gICAgLnBpcGUobWFwKHJlc3VsdCA9PiBPYmplY3Qua2V5cyhyZXN1bHQuYnJlYWtwb2ludHMpLmZpbmQoaXRlbSA9PiByZXN1bHQuYnJlYWtwb2ludHNbaXRlbV0pID8/ICd1bmtub3duJykpO1xuXG4gIHB1YmxpYyByZWFkb25seSBiYXJDaGFydENvbmZpZyQgPSB0aGlzLmJyZWFrcG9pbnQkLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICB0aW1lcih0aGlzLnRpbWVvdXQpLnBpcGUoXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIG1hcCgoKSA9PiAoeyBkYXRhOiB0aGlzLmJhckNoYXJ0RGF0YSwgb3B0aW9uczogdGhpcy5iYXJDaGFydE9wdGlvbnMoKSB9KSksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGxpbmVDaGFydENvbmZpZyQgPSB0aGlzLmJyZWFrcG9pbnQkLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICB0aW1lcih0aGlzLnRpbWVvdXQpLnBpcGUoXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIG1hcCgoKSA9PiAoe1xuICAgICAgICAgIGRhdGE6IHRoaXMubGluZUNoYXJ0RGF0YSxcbiAgICAgICAgICBvcHRpb25zOiB0aGlzLmxpbmVDaGFydE9wdGlvbnMoKSxcbiAgICAgICAgICBvcHRpb25zRGF0ZURkTW1ZeTogdGhpcy5saW5lQ2hhcnRPcHRpb25zKCdkZC9tbS95eScpLFxuICAgICAgICAgIG9wdGlvbnNEYXRlRGRNbVl5eXk6IHRoaXMubGluZUNoYXJ0T3B0aW9ucygnZGQvbW0veXl5eScpLFxuICAgICAgICAgIG9wdGlvbnNEYXRlTW1ZeXl5OiB0aGlzLmxpbmVDaGFydE9wdGlvbnMoJ21tL3l5eXknKSxcbiAgICAgICAgfSkpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSByYWRhckNoYXJ0Q29uZmlnJCA9IHRoaXMuYnJlYWtwb2ludCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgIHRpbWVyKHRoaXMudGltZW91dCkucGlwZShcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgbWFwKCgpID0+ICh7IGRhdGE6IHRoaXMucmFkYXJDaGFydERhdGEsIG9wdGlvbnM6IHRoaXMucmFkYXJDaGFydE9wdGlvbnMoKSB9KSksXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHBpZUNoYXJ0Q29uZmlnJCA9IHRoaXMuYnJlYWtwb2ludCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgIHRpbWVyKHRoaXMudGltZW91dCkucGlwZShcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgbWFwKCgpID0+ICh7IGRhdGE6IHRoaXMucGllQ2hhcnREYXRhLCBvcHRpb25zOiB0aGlzLnBpZUNoYXJ0T3B0aW9ucygpIH0pKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZm9yY2VEaXJlY3RlZENoYXJ0Q29uZmlnJCA9IHRoaXMuYnJlYWtwb2ludCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgIHRpbWVyKHRoaXMudGltZW91dCkucGlwZShcbiAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgbWFwKCgpID0+ICh7IGRhdGE6IHRoaXMuZm9yY2VEaXJlY3RlZENoYXJ0RGF0YSwgb3B0aW9uczogdGhpcy5mb3JjZURpcmVjdGVkQ2hhcnRPcHRpb25zKCkgfSkpLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYnJlYWtwb2ludE9ic2VydmVyOiBCcmVha3BvaW50T2JzZXJ2ZXIpIHt9XG5cbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lb3V0ID0gMTAwO1xuXG4gIHB1YmxpYyByYW5kb21WYWx1ZShyYW5nZT86IG51bWJlcikge1xuICAgIGNvbnN0IGRlZmF1bHRSYW5nZSA9IDEwMDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKHJhbmdlID8/IGRlZmF1bHRSYW5nZSkgKyAxKTtcbiAgfVxuXG4gIHB1YmxpYyByYW5kb21UaW1lc3RhbXAocmFuZ2U/OiBudW1iZXIpIHtcbiAgICBjb25zdCBkZWZhdWx0UmFuZ2UgPSAxMDAwMDAwMDA7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChyYW5nZSA/PyBkZWZhdWx0UmFuZ2UpICsgbmV3IERhdGUoKS5nZXRUaW1lKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgYmFyIGNoYXJ0IG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgYmFyQ2hhcnRPcHRpb25zKCkge1xuICAgIHJldHVybiA8UGFydGlhbDxJQmFyQ2hhcnRPcHRpb25zPj57XG4gICAgICBjaGFydFRpdGxlOiAnRXhhbXBsZSBiYXIgY2hhcnQnLFxuICAgICAgeEF4aXNUaXRsZTogJ2xvbmcgeCBheGlzIHRpdGxlJyxcbiAgICAgIHlBeGlzVGl0bGU6ICdsb25nIHkgYXhpcyB0aXRsZScsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGFtcGxlIGxpbmUgY2hhcnQgb3B0aW9ucy5cbiAgICogQHBhcmFtIGRhdGVGb3JtYXQgZGF0ZSBmb3JtYXRcbiAgICovXG4gIHB1YmxpYyBsaW5lQ2hhcnRPcHRpb25zKGRhdGVGb3JtYXQ6IFREYXRlRm9ybWF0ID0gJ2RlZmF1bHQnKSB7XG4gICAgcmV0dXJuIDxQYXJ0aWFsPElMaW5lQ2hhcnRPcHRpb25zPj57XG4gICAgICBjaGFydFRpdGxlOiBgRXhhbXBsZSBsaW5lIGNoYXJ0LCBkYXRlIGZvcm1hdCAke2RhdGVGb3JtYXR9YCxcbiAgICAgIHhBeGlzVGl0bGU6ICdEYXRlIHJhbmdlJyxcbiAgICAgIHlBeGlzVGl0bGU6ICdWYWx1ZSByYW5nZScsXG4gICAgICBkYXRlRm9ybWF0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhhbXBsZSByYWRhciBjaGFydCBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIHJhZGFyQ2hhcnRPcHRpb25zKCkge1xuICAgIHJldHVybiA8UGFydGlhbDxJUmFkYXJDaGFydE9wdGlvbnM+PntcbiAgICAgIGNoYXJ0VGl0bGU6ICdFeGFtcGxlIHJhZGFyIGNoYXJ0JyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgcGllIGNoYXJ0IG9wdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgcGllQ2hhcnRPcHRpb25zKCkge1xuICAgIHJldHVybiA8UGFydGlhbDxJUGllQ2hhcnRPcHRpb25zPj57XG4gICAgICBjaGFydFRpdGxlOiAnRXhhbXBsZSBwaWUgY2hhcnQnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhhbXBsZSBmb3JjZSBkaXJlY3RlZCBjaGFydCBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGZvcmNlRGlyZWN0ZWRDaGFydE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIDxQYXJ0aWFsPElGb3JjZURpcmVjdGVkQ2hhcnRPcHRpb25zPj57XG4gICAgICBjaGFydFRpdGxlOiAnRXhhbXBsZSBmb3JjZSBkaXJlY3RlZCBjaGFydCcsXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiICpuZ0lmPVwiYmFyQ2hhcnRDb25maWckIHwgYXN5bmMgYXMgY29uZmlnXCI+XG4gIDxhcHAtYmFyLWNoYXJ0IFtjaGFydElkXT1cIidiYXItZXhhbXBsZS0xJ1wiIFtkYXRhXT1cImNvbmZpZy5kYXRhXCIgW29wdGlvbnNdPVwiY29uZmlnLm9wdGlvbnNcIj48L2FwcC1iYXItY2hhcnQ+XG48L2Rpdj5cblxuPGhyIFtuZ1N0eWxlXT1cInsgd2lkdGg6ICcxMDAlJyB9XCIgLz5cblxuPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiICpuZ0lmPVwibGluZUNoYXJ0Q29uZmlnJCB8IGFzeW5jIGFzIGNvbmZpZ1wiPlxuICA8YXBwLWxpbmUtY2hhcnQgW2NoYXJ0SWRdPVwiJ2xpbmUtZXhhbXBsZS0xJ1wiIFtkYXRhXT1cIltjb25maWcuZGF0YVswXV1cIiBbb3B0aW9uc109XCJjb25maWcub3B0aW9uc1wiPjwvYXBwLWxpbmUtY2hhcnQ+XG5cbiAgPGFwcC1saW5lLWNoYXJ0IFtjaGFydElkXT1cIidsaW5lLWV4YW1wbGUtMidcIiBbZGF0YV09XCJbY29uZmlnLmRhdGFbMV1dXCIgW29wdGlvbnNdPVwiY29uZmlnLm9wdGlvbnNEYXRlRGRNbVl5XCI+PC9hcHAtbGluZS1jaGFydD5cblxuICA8YXBwLWxpbmUtY2hhcnRcbiAgICBbY2hhcnRJZF09XCInbGluZS1leGFtcGxlLTMnXCJcbiAgICBbZGF0YV09XCJbY29uZmlnLmRhdGFbMV0sIGNvbmZpZy5kYXRhWzJdXVwiXG4gICAgW29wdGlvbnNdPVwiY29uZmlnLm9wdGlvbnNEYXRlRGRNbVl5eXlcIlxuICA+PC9hcHAtbGluZS1jaGFydD5cblxuICA8YXBwLWxpbmUtY2hhcnQgW2NoYXJ0SWRdPVwiJ2xpbmUtZXhhbXBsZS00J1wiIFtkYXRhXT1cImNvbmZpZy5kYXRhXCIgW29wdGlvbnNdPVwiY29uZmlnLm9wdGlvbnNEYXRlTW1ZeXl5XCI+PC9hcHAtbGluZS1jaGFydD5cbjwvZGl2PlxuXG48aHIgW25nU3R5bGVdPVwieyB3aWR0aDogJzEwMCUnIH1cIiAvPlxuXG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCIgKm5nSWY9XCJyYWRhckNoYXJ0Q29uZmlnJCB8IGFzeW5jIGFzIGNvbmZpZ1wiPlxuICA8YXBwLXJhZGFyLWNoYXJ0IFtjaGFydElkXT1cIidyYWRhci1leGFtcGxlLTEnXCIgW2RhdGFdPVwiY29uZmlnLmRhdGFcIiBbb3B0aW9uc109XCJjb25maWcub3B0aW9uc1wiPjwvYXBwLXJhZGFyLWNoYXJ0PlxuPC9kaXY+XG5cbjxociBbbmdTdHlsZV09XCJ7IHdpZHRoOiAnMTAwJScgfVwiIC8+XG5cbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIiAqbmdJZj1cInBpZUNoYXJ0Q29uZmlnJCB8IGFzeW5jIGFzIGNvbmZpZ1wiPlxuICA8YXBwLXBpZS1jaGFydCBbY2hhcnRJZF09XCIncGllLWV4YW1wbGUtMSdcIiBbZGF0YV09XCJjb25maWcuZGF0YVwiIFtvcHRpb25zXT1cImNvbmZpZy5vcHRpb25zXCI+PC9hcHAtcGllLWNoYXJ0PlxuPC9kaXY+XG5cbjxociBbbmdTdHlsZV09XCJ7IHdpZHRoOiAnMTAwJScgfVwiIC8+XG5cbjxkaXYgY2xhc3M9XCJjb250YWluZXJcIiAqbmdJZj1cImZvcmNlRGlyZWN0ZWRDaGFydENvbmZpZyQgfCBhc3luYyBhcyBjb25maWdcIj5cbiAgPGFwcC1mb3JjZS1kaXJlY3RlZC1jaGFydFxuICAgIFtjaGFydElkXT1cIidmb3JjZS1kaXJlY3RlZC1leGFtcGxlLTEnXCJcbiAgICBbZGF0YV09XCJjb25maWcuZGF0YVwiXG4gICAgW29wdGlvbnNdPVwiY29uZmlnLm9wdGlvbnNcIlxuICA+PC9hcHAtZm9yY2UtZGlyZWN0ZWQtY2hhcnQ+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,93 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, ViewChild, } from '@angular/core';
3
+ import { D3_CHART_FACTORY } from '../../providers/d3-chart-factory.provider';
4
+ import * as i0 from "@angular/core";
5
+ class AppForceDirectedChartComponent {
6
+ constructor(doc, d3Factory) {
7
+ this.doc = doc;
8
+ this.d3Factory = d3Factory;
9
+ /**
10
+ * The chart identifier.
11
+ */
12
+ this.chartId = 'force-0';
13
+ /**
14
+ * The chart data.
15
+ */
16
+ this.data = {
17
+ domains: [],
18
+ entities: [],
19
+ links: [],
20
+ nodes: [],
21
+ };
22
+ /**
23
+ * The chart options.
24
+ */
25
+ this.options = {};
26
+ }
27
+ /**
28
+ * The chart options constructor.
29
+ * @returns chart options
30
+ */
31
+ chartOptions() {
32
+ const margin = { top: 50, right: 50, bottom: 50, left: 50 };
33
+ const minWidth = 350;
34
+ const modifiers = {
35
+ width: 10,
36
+ height: 20,
37
+ };
38
+ const width = Math.min(minWidth, this.doc.body.clientWidth - modifiers.width) - margin.left - margin.right;
39
+ const height = Math.min(width, this.doc.body.clientHeight - margin.top - margin.bottom - modifiers.height);
40
+ const options = { width, height, margin, ...this.options };
41
+ return options;
42
+ }
43
+ /**
44
+ * Draws the chart.
45
+ */
46
+ drawChart() {
47
+ if (typeof this.container !== 'undefined') {
48
+ const options = this.chartOptions();
49
+ this.d3Factory.drawForceDirectedChart(this.container, this.data, options);
50
+ }
51
+ }
52
+ /**
53
+ * Actually draws the chart after the component view is initialized.
54
+ */
55
+ ngAfterViewInit() {
56
+ this.drawChart();
57
+ }
58
+ /**
59
+ * Redraws the chart on changes.
60
+ */
61
+ ngOnChanges(changes) {
62
+ const prevData = changes.data?.previousValue;
63
+ const nextData = changes.data?.currentValue;
64
+ const options = changes.options?.currentValue;
65
+ if ((Boolean(changes.data?.currentValue) && (prevData?.nodes ?? []).length !== (nextData?.nodes ?? []).length) ||
66
+ (typeof options !== 'undefined' && options !== null)) {
67
+ this.drawChart();
68
+ }
69
+ }
70
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppForceDirectedChartComponent, deps: [{ token: DOCUMENT }, { token: D3_CHART_FACTORY }], target: i0.ɵɵFactoryTarget.Component }); }
71
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: AppForceDirectedChartComponent, selector: "app-force-directed-chart", inputs: { chartId: "chartId", data: "data", options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\">\n <div id=\"{{ chartId }}\" #container></div>\n\n <small class=\"container--chart-title\">{{ options.chartTitle }}</small>\n</div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center}:host .container{flex:0 1 auto}:host .container--chart-title{display:block;text-align:center}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
72
+ }
73
+ export { AppForceDirectedChartComponent };
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppForceDirectedChartComponent, decorators: [{
75
+ type: Component,
76
+ args: [{ selector: 'app-force-directed-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container\">\n <div id=\"{{ chartId }}\" #container></div>\n\n <small class=\"container--chart-title\">{{ options.chartTitle }}</small>\n</div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center}:host .container{flex:0 1 auto}:host .container--chart-title{display:block;text-align:center}\n"] }]
77
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
78
+ type: Inject,
79
+ args: [DOCUMENT]
80
+ }] }, { type: undefined, decorators: [{
81
+ type: Inject,
82
+ args: [D3_CHART_FACTORY]
83
+ }] }]; }, propDecorators: { chartId: [{
84
+ type: Input
85
+ }], data: [{
86
+ type: Input
87
+ }], options: [{
88
+ type: Input
89
+ }], container: [{
90
+ type: ViewChild,
91
+ args: ['container']
92
+ }] } });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yY2UtZGlyZWN0ZWQtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jbGllbnQtZDMtY2hhcnRzL3NyYy9saWIvY29tcG9uZW50cy9mb3JjZS1kaXJlY3RlZC1jaGFydC9mb3JjZS1kaXJlY3RlZC1jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NsaWVudC1kMy1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2ZvcmNlLWRpcmVjdGVkLWNoYXJ0L2ZvcmNlLWRpcmVjdGVkLWNoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFtQixNQUFNLDJDQUEyQyxDQUFDOztBQU85RixNQU1hLDhCQUE4QjtJQTBCekMsWUFBK0MsR0FBYSxFQUE2QyxTQUEwQjtRQUFwRixRQUFHLEdBQUgsR0FBRyxDQUFVO1FBQTZDLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBekJuSTs7V0FFRztRQUNhLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFFcEM7O1dBRUc7UUFDYSxTQUFJLEdBQTRCO1lBQzlDLE9BQU8sRUFBRSxFQUFFO1lBQ1gsUUFBUSxFQUFFLEVBQUU7WUFDWixLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQztRQUVGOztXQUVHO1FBQ2EsWUFBTyxHQUF3QyxFQUFFLENBQUM7SUFPb0UsQ0FBQztJQUV2STs7O09BR0c7SUFDSyxZQUFZO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNyQixNQUFNLFNBQVMsR0FBRztZQUNoQixLQUFLLEVBQUUsRUFBRTtZQUNULE1BQU0sRUFBRSxFQUFFO1NBQ1gsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzNHLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNHLE1BQU0sT0FBTyxHQUF3QyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hHLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNLLFNBQVM7UUFDZixJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUU7WUFDekMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzNFO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLE9BQXNCO1FBQ3ZDLE1BQU0sUUFBUSxHQUF3QyxPQUFPLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQztRQUNsRixNQUFNLFFBQVEsR0FBd0MsT0FBTyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUM7UUFDakYsTUFBTSxPQUFPLEdBQXdDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDO1FBQ25GLElBQ0UsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDMUcsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxFQUNwRDtZQUNBLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjtJQUNILENBQUM7aUlBM0VVLDhCQUE4QixrQkEwQnJCLFFBQVEsYUFBMEMsZ0JBQWdCO3FIQTFCM0UsOEJBQThCLCtQQzNCM0Msa0tBS0E7O1NEc0JhLDhCQUE4QjsyRkFBOUIsOEJBQThCO2tCQU4xQyxTQUFTOytCQUNFLDBCQUEwQixtQkFHbkIsdUJBQXVCLENBQUMsTUFBTTs7MEJBNEJsQyxNQUFNOzJCQUFDLFFBQVE7OzBCQUFtQyxNQUFNOzJCQUFDLGdCQUFnQjs0Q0F0QnRFLE9BQU87c0JBQXRCLEtBQUs7Z0JBS1UsSUFBSTtzQkFBbkIsS0FBSztnQkFVVSxPQUFPO3NCQUF0QixLQUFLO2dCQUttQyxTQUFTO3NCQUFqRCxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZSxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSUZvcmNlRGlyZWN0ZWRDaGFydERhdGEsIElGb3JjZURpcmVjdGVkQ2hhcnRPcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9mb3JjZS1kaXJlY3RlZC1jaGFydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRDNfQ0hBUlRfRkFDVE9SWSwgSUQzQ2hhcnRGYWN0b3J5IH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzL2QzLWNoYXJ0LWZhY3RvcnkucHJvdmlkZXInO1xuXG5pbnRlcmZhY2UgSUlucHV0Q2hhbmdlcyB7XG4gIGRhdGE/OiBTaW1wbGVDaGFuZ2UgfCBudWxsO1xuICBvcHRpb25zPzogU2ltcGxlQ2hhbmdlIHwgbnVsbDtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZvcmNlLWRpcmVjdGVkLWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZvcmNlLWRpcmVjdGVkLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9yY2UtZGlyZWN0ZWQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwcEZvcmNlRGlyZWN0ZWRDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hhcnQgaWRlbnRpZmllci5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjaGFydElkID0gJ2ZvcmNlLTAnO1xuXG4gIC8qKlxuICAgKiBUaGUgY2hhcnQgZGF0YS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBkYXRhOiBJRm9yY2VEaXJlY3RlZENoYXJ0RGF0YSA9IHtcbiAgICBkb21haW5zOiBbXSxcbiAgICBlbnRpdGllczogW10sXG4gICAgbGlua3M6IFtdLFxuICAgIG5vZGVzOiBbXSxcbiAgfTtcblxuICAvKipcbiAgICogVGhlIGNoYXJ0IG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogUGFydGlhbDxJRm9yY2VEaXJlY3RlZENoYXJ0T3B0aW9ucz4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIGNoYXJ0IGNvbnRhaW5lciB2aWV3IGNoaWxkIHJlZmVyZW5jZS5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBkb2M6IERvY3VtZW50LCBASW5qZWN0KEQzX0NIQVJUX0ZBQ1RPUlkpIHByaXZhdGUgcmVhZG9ubHkgZDNGYWN0b3J5OiBJRDNDaGFydEZhY3RvcnkpIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFydCBvcHRpb25zIGNvbnN0cnVjdG9yLlxuICAgKiBAcmV0dXJucyBjaGFydCBvcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGNoYXJ0T3B0aW9ucygpIHtcbiAgICBjb25zdCBtYXJnaW4gPSB7IHRvcDogNTAsIHJpZ2h0OiA1MCwgYm90dG9tOiA1MCwgbGVmdDogNTAgfTtcbiAgICBjb25zdCBtaW5XaWR0aCA9IDM1MDtcbiAgICBjb25zdCBtb2RpZmllcnMgPSB7XG4gICAgICB3aWR0aDogMTAsXG4gICAgICBoZWlnaHQ6IDIwLFxuICAgIH07XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1pbihtaW5XaWR0aCwgdGhpcy5kb2MuYm9keS5jbGllbnRXaWR0aCAtIG1vZGlmaWVycy53aWR0aCkgLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodDtcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1pbih3aWR0aCwgdGhpcy5kb2MuYm9keS5jbGllbnRIZWlnaHQgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbSAtIG1vZGlmaWVycy5oZWlnaHQpO1xuICAgIGNvbnN0IG9wdGlvbnM6IFBhcnRpYWw8SUZvcmNlRGlyZWN0ZWRDaGFydE9wdGlvbnM+ID0geyB3aWR0aCwgaGVpZ2h0LCBtYXJnaW4sIC4uLnRoaXMub3B0aW9ucyB9O1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXdzIHRoZSBjaGFydC5cbiAgICovXG4gIHByaXZhdGUgZHJhd0NoYXJ0KCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5jb250YWluZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jaGFydE9wdGlvbnMoKTtcbiAgICAgIHRoaXMuZDNGYWN0b3J5LmRyYXdGb3JjZURpcmVjdGVkQ2hhcnQodGhpcy5jb250YWluZXIsIHRoaXMuZGF0YSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGx5IGRyYXdzIHRoZSBjaGFydCBhZnRlciB0aGUgY29tcG9uZW50IHZpZXcgaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd0NoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVkcmF3cyB0aGUgY2hhcnQgb24gY2hhbmdlcy5cbiAgICovXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBJSW5wdXRDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgcHJldkRhdGE6IElGb3JjZURpcmVjdGVkQ2hhcnREYXRhIHwgdW5kZWZpbmVkID0gY2hhbmdlcy5kYXRhPy5wcmV2aW91c1ZhbHVlO1xuICAgIGNvbnN0IG5leHREYXRhOiBJRm9yY2VEaXJlY3RlZENoYXJ0RGF0YSB8IHVuZGVmaW5lZCA9IGNoYW5nZXMuZGF0YT8uY3VycmVudFZhbHVlO1xuICAgIGNvbnN0IG9wdGlvbnM6IFBhcnRpYWw8SUZvcmNlRGlyZWN0ZWRDaGFydE9wdGlvbnM+ID0gY2hhbmdlcy5vcHRpb25zPy5jdXJyZW50VmFsdWU7XG4gICAgaWYgKFxuICAgICAgKEJvb2xlYW4oY2hhbmdlcy5kYXRhPy5jdXJyZW50VmFsdWUpICYmIChwcmV2RGF0YT8ubm9kZXMgPz8gW10pLmxlbmd0aCAhPT0gKG5leHREYXRhPy5ub2RlcyA/PyBbXSkubGVuZ3RoKSB8fFxuICAgICAgKHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJyAmJiBvcHRpb25zICE9PSBudWxsKVxuICAgICkge1xuICAgICAgdGhpcy5kcmF3Q2hhcnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPGRpdiBpZD1cInt7IGNoYXJ0SWQgfX1cIiAjY29udGFpbmVyPjwvZGl2PlxuXG4gIDxzbWFsbCBjbGFzcz1cImNvbnRhaW5lci0tY2hhcnQtdGl0bGVcIj57eyBvcHRpb25zLmNoYXJ0VGl0bGUgfX08L3NtYWxsPlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,93 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, ViewChild, } from '@angular/core';
3
+ import { D3_CHART_FACTORY } from '../../providers/d3-chart-factory.provider';
4
+ import { defaultLineChartConfig } from '../../util';
5
+ import * as i0 from "@angular/core";
6
+ class AppLineChartComponent {
7
+ constructor(doc, d3Factory) {
8
+ this.doc = doc;
9
+ this.d3Factory = d3Factory;
10
+ /**
11
+ * The chart id.
12
+ */
13
+ this.chartId = 'line-0';
14
+ /**
15
+ * The chart data.
16
+ */
17
+ this.data = [];
18
+ /**
19
+ * The chart options.
20
+ */
21
+ this.options = {};
22
+ }
23
+ /**
24
+ * The chart options constructor.
25
+ * @returns chart options
26
+ */
27
+ chartOptions() {
28
+ const bodyWidthAdjustment = 10;
29
+ const width = Math.min(this.options.width ?? defaultLineChartConfig.width, this.doc.body.clientWidth - defaultLineChartConfig.margin.left - defaultLineChartConfig.margin.right - bodyWidthAdjustment);
30
+ const height = Math.min(this.options.height ?? width, this.doc.body.clientWidth - defaultLineChartConfig.margin.top - defaultLineChartConfig.margin.bottom - bodyWidthAdjustment);
31
+ const xTicksScale = 75;
32
+ const yTicksScale = 25;
33
+ const ticks = {
34
+ x: this.options.ticks?.x ?? width / xTicksScale,
35
+ y: this.options.ticks?.y ?? height / yTicksScale,
36
+ };
37
+ const options = {
38
+ ...this.options,
39
+ width,
40
+ height,
41
+ ticks,
42
+ };
43
+ return options;
44
+ }
45
+ /**
46
+ * Draws the chart.
47
+ */
48
+ drawChart() {
49
+ if (typeof this.container !== 'undefined') {
50
+ const options = this.chartOptions();
51
+ this.d3Factory.drawLineChart(this.container, [...this.data], options);
52
+ }
53
+ }
54
+ /**
55
+ * Actually draws the chart after the component view is initialized.
56
+ */
57
+ ngAfterViewInit() {
58
+ this.drawChart();
59
+ }
60
+ /**
61
+ * Redraws the chart on changes.
62
+ */
63
+ ngOnChanges(changes) {
64
+ const data = changes.data?.currentValue;
65
+ const options = changes.options?.currentValue;
66
+ if ((typeof data !== 'undefined' && data !== null) || (typeof options !== 'undefined' && options !== null)) {
67
+ this.drawChart();
68
+ }
69
+ }
70
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppLineChartComponent, deps: [{ token: DOCUMENT }, { token: D3_CHART_FACTORY }], target: i0.ɵɵFactoryTarget.Component }); }
71
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: AppLineChartComponent, selector: "app-line-chart", inputs: { chartId: "chartId", data: "data", options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"container\" id=\"{{ chartId }}\" #container></div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center}:host .container{flex:0 1 auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
72
+ }
73
+ export { AppLineChartComponent };
74
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: AppLineChartComponent, decorators: [{
75
+ type: Component,
76
+ args: [{ selector: 'app-line-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"container\" id=\"{{ chartId }}\" #container></div>\n", styles: [":host{display:flex;flex-direction:row;flex-wrap:nowrap;justify-content:center}:host .container{flex:0 1 auto}\n"] }]
77
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
78
+ type: Inject,
79
+ args: [DOCUMENT]
80
+ }] }, { type: undefined, decorators: [{
81
+ type: Inject,
82
+ args: [D3_CHART_FACTORY]
83
+ }] }]; }, propDecorators: { chartId: [{
84
+ type: Input
85
+ }], data: [{
86
+ type: Input
87
+ }], options: [{
88
+ type: Input
89
+ }], container: [{
90
+ type: ViewChild,
91
+ args: ['container']
92
+ }] } });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jaGFydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NsaWVudC1kMy1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2xpbmUtY2hhcnQvbGluZS1jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NsaWVudC1kMy1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2xpbmUtY2hhcnQvbGluZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBbUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBT3BELE1BTWEscUJBQXFCO0lBcUJoQyxZQUErQyxHQUFhLEVBQTZDLFNBQTBCO1FBQXBGLFFBQUcsR0FBSCxHQUFHLENBQVU7UUFBNkMsY0FBUyxHQUFULFNBQVMsQ0FBaUI7UUFwQm5JOztXQUVHO1FBQ2EsWUFBTyxHQUFHLFFBQVEsQ0FBQztRQUVuQzs7V0FFRztRQUNhLFNBQUksR0FBcUIsRUFBRSxDQUFDO1FBRTVDOztXQUVHO1FBQ2EsWUFBTyxHQUErQixFQUFFLENBQUM7SUFPNkUsQ0FBQztJQUV2STs7O09BR0c7SUFDSyxZQUFZO1FBQ2xCLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLHNCQUFzQixDQUFDLEtBQUssRUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FDM0gsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEtBQUssRUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FDM0gsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN2QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxLQUFLLEdBQStCO1lBQ3hDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksS0FBSyxHQUFHLFdBQVc7WUFDL0MsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxNQUFNLEdBQUcsV0FBVztTQUNqRCxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQStCO1lBQzFDLEdBQUcsSUFBSSxDQUFDLE9BQU87WUFDZixLQUFLO1lBQ0wsTUFBTTtZQUNOLEtBQUs7U0FDTixDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRTtZQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNwQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLE9BQXNCO1FBQ3ZDLE1BQU0sSUFBSSxHQUEyQixPQUFPLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBK0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUM7UUFDMUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQzFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjtJQUNILENBQUM7aUlBOUVVLHFCQUFxQixrQkFxQlosUUFBUSxhQUEwQyxnQkFBZ0I7cUhBckIzRSxxQkFBcUIscVBDNUJsQyxtRUFDQTs7U0QyQmEscUJBQXFCOzJGQUFyQixxQkFBcUI7a0JBTmpDLFNBQVM7K0JBQ0UsZ0JBQWdCLG1CQUdULHVCQUF1QixDQUFDLE1BQU07OzBCQXVCbEMsTUFBTTsyQkFBQyxRQUFROzswQkFBbUMsTUFBTTsyQkFBQyxnQkFBZ0I7NENBakJ0RSxPQUFPO3NCQUF0QixLQUFLO2dCQUtVLElBQUk7c0JBQW5CLEtBQUs7Z0JBS1UsT0FBTztzQkFBdEIsS0FBSztnQkFLbUMsU0FBUztzQkFBakQsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IElMaW5lQ2hhcnREYXRhTm9kZSwgSUxpbmVDaGFydE9wdGlvbnMsIFRMaW5lQ2hhcnREYXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9saW5lLWNoYXJ0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBEM19DSEFSVF9GQUNUT1JZLCBJRDNDaGFydEZhY3RvcnkgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvZDMtY2hhcnQtZmFjdG9yeS5wcm92aWRlcic7XG5pbXBvcnQgeyBkZWZhdWx0TGluZUNoYXJ0Q29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmludGVyZmFjZSBJSW5wdXRDaGFuZ2VzIHtcbiAgZGF0YT86IFNpbXBsZUNoYW5nZSB8IG51bGw7XG4gIG9wdGlvbnM/OiBTaW1wbGVDaGFuZ2UgfCBudWxsO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbGluZS1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saW5lLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGluZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQXBwTGluZUNoYXJ0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIFRoZSBjaGFydCBpZC5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjaGFydElkID0gJ2xpbmUtMCc7XG5cbiAgLyoqXG4gICAqIFRoZSBjaGFydCBkYXRhLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGRhdGE6IFRMaW5lQ2hhcnREYXRhW10gPSBbXTtcblxuICAvKipcbiAgICogVGhlIGNoYXJ0IG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogUGFydGlhbDxJTGluZUNoYXJ0T3B0aW9ucz4gPSB7fTtcblxuICAvKipcbiAgICogRDMgY2hhcnQgdmlldyBjaGlsZCByZWZlcmVuY2UuXG4gICAqL1xuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgZG9jOiBEb2N1bWVudCwgQEluamVjdChEM19DSEFSVF9GQUNUT1JZKSBwcml2YXRlIHJlYWRvbmx5IGQzRmFjdG9yeTogSUQzQ2hhcnRGYWN0b3J5KSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgY2hhcnQgb3B0aW9ucyBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybnMgY2hhcnQgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBjaGFydE9wdGlvbnMoKSB7XG4gICAgY29uc3QgYm9keVdpZHRoQWRqdXN0bWVudCA9IDEwO1xuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5taW4oXG4gICAgICB0aGlzLm9wdGlvbnMud2lkdGggPz8gZGVmYXVsdExpbmVDaGFydENvbmZpZy53aWR0aCxcbiAgICAgIHRoaXMuZG9jLmJvZHkuY2xpZW50V2lkdGggLSBkZWZhdWx0TGluZUNoYXJ0Q29uZmlnLm1hcmdpbi5sZWZ0IC0gZGVmYXVsdExpbmVDaGFydENvbmZpZy5tYXJnaW4ucmlnaHQgLSBib2R5V2lkdGhBZGp1c3RtZW50LFxuICAgICk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID8/IHdpZHRoLFxuICAgICAgdGhpcy5kb2MuYm9keS5jbGllbnRXaWR0aCAtIGRlZmF1bHRMaW5lQ2hhcnRDb25maWcubWFyZ2luLnRvcCAtIGRlZmF1bHRMaW5lQ2hhcnRDb25maWcubWFyZ2luLmJvdHRvbSAtIGJvZHlXaWR0aEFkanVzdG1lbnQsXG4gICAgKTtcbiAgICBjb25zdCB4VGlja3NTY2FsZSA9IDc1O1xuICAgIGNvbnN0IHlUaWNrc1NjYWxlID0gMjU7XG4gICAgY29uc3QgdGlja3M6IElMaW5lQ2hhcnRPcHRpb25zWyd0aWNrcyddID0ge1xuICAgICAgeDogdGhpcy5vcHRpb25zLnRpY2tzPy54ID8/IHdpZHRoIC8geFRpY2tzU2NhbGUsXG4gICAgICB5OiB0aGlzLm9wdGlvbnMudGlja3M/LnkgPz8gaGVpZ2h0IC8geVRpY2tzU2NhbGUsXG4gICAgfTtcbiAgICBjb25zdCBvcHRpb25zOiBQYXJ0aWFsPElMaW5lQ2hhcnRPcHRpb25zPiA9IHtcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGlja3MsXG4gICAgfTtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyB0aGUgY2hhcnQuXG4gICAqL1xuICBwcml2YXRlIGRyYXdDaGFydCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuY29udGFpbmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY2hhcnRPcHRpb25zKCk7XG4gICAgICB0aGlzLmQzRmFjdG9yeS5kcmF3TGluZUNoYXJ0KHRoaXMuY29udGFpbmVyLCBbLi4udGhpcy5kYXRhXSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGx5IGRyYXdzIHRoZSBjaGFydCBhZnRlciB0aGUgY29tcG9uZW50IHZpZXcgaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd0NoYXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVkcmF3cyB0aGUgY2hhcnQgb24gY2hhbmdlcy5cbiAgICovXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBJSW5wdXRDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YTogSUxpbmVDaGFydERhdGFOb2RlW11bXSA9IGNoYW5nZXMuZGF0YT8uY3VycmVudFZhbHVlO1xuICAgIGNvbnN0IG9wdGlvbnM6IFBhcnRpYWw8SUxpbmVDaGFydE9wdGlvbnM+ID0gY2hhbmdlcy5vcHRpb25zPy5jdXJyZW50VmFsdWU7XG4gICAgaWYgKCh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgZGF0YSAhPT0gbnVsbCkgfHwgKHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJyAmJiBvcHRpb25zICE9PSBudWxsKSkge1xuICAgICAgdGhpcy5kcmF3Q2hhcnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXJcIiBpZD1cInt7IGNoYXJ0SWQgfX1cIiAjY29udGFpbmVyPjwvZGl2PlxuIl19