@esfaenza/es-charts 12.2.11 → 13.1.2

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 (102) hide show
  1. package/esfaenza-es-charts.d.ts +1 -6
  2. package/esm2020/esfaenza-es-charts.mjs +5 -0
  3. package/esm2020/lib/adapters/classes/BaseAdapter.mjs +50 -0
  4. package/{esm2015/lib/adapters/classes/IBaseAdapter.js → esm2020/lib/adapters/classes/IBaseAdapter.mjs} +0 -0
  5. package/{esm2015/lib/adapters/index.js → esm2020/lib/adapters/index.mjs} +0 -0
  6. package/esm2020/lib/components/base/base-chart.component.mjs +325 -0
  7. package/esm2020/lib/components/chart-pager/chart-pager.component.mjs +89 -0
  8. package/{esm2015/lib/components/index.js → esm2020/lib/components/index.mjs} +0 -0
  9. package/esm2020/lib/components/specializations/es-area-chart.component.mjs +78 -0
  10. package/esm2020/lib/components/specializations/es-chart.component.mjs +111 -0
  11. package/esm2020/lib/components/specializations/es-line-chart.component.mjs +110 -0
  12. package/esm2020/lib/components/specializations/es-pie-chart.component.mjs +99 -0
  13. package/esm2020/lib/components/specializations/es-vertical-2d-chart.component.mjs +96 -0
  14. package/esm2020/lib/components/specializations/es-vertical-chart.component.mjs +93 -0
  15. package/esm2020/lib/components/specializations/es-vertical-stacked-chart.component.mjs +93 -0
  16. package/esm2020/lib/es-charts.module.mjs +61 -0
  17. package/{esm2015/lib/models/EsChaartsModuleConfig.js → esm2020/lib/models/EsChaartsModuleConfig.mjs} +0 -0
  18. package/esm2020/lib/models/core/classes/ChartDispatcher.mjs +91 -0
  19. package/{esm2015/lib/models/core/classes/ChartLoader.js → esm2020/lib/models/core/classes/ChartLoader.mjs} +0 -0
  20. package/{esm2015/lib/models/core/classes/ChartThemes.js → esm2020/lib/models/core/classes/ChartThemes.mjs} +0 -0
  21. package/{esm2015/lib/models/core/index.js → esm2020/lib/models/core/index.mjs} +0 -0
  22. package/{esm2015/lib/models/data/classes/AreaChartData.js → esm2020/lib/models/data/classes/AreaChartData.mjs} +0 -0
  23. package/esm2020/lib/models/data/classes/LineChartData.mjs +16 -0
  24. package/{esm2015/lib/models/data/classes/PagedChartData.js → esm2020/lib/models/data/classes/PagedChartData.mjs} +0 -0
  25. package/{esm2015/lib/models/data/classes/PieChartData.js → esm2020/lib/models/data/classes/PieChartData.mjs} +0 -0
  26. package/{esm2015/lib/models/data/classes/Vertical2DChartData.js → esm2020/lib/models/data/classes/Vertical2DChartData.mjs} +0 -0
  27. package/{esm2015/lib/models/data/classes/VerticalChartData.js → esm2020/lib/models/data/classes/VerticalChartData.mjs} +0 -0
  28. package/{esm2015/lib/models/data/classes/VerticalStackedChartData.js → esm2020/lib/models/data/classes/VerticalStackedChartData.mjs} +0 -0
  29. package/{esm2015/lib/models/data/classes/base/DateValue.js → esm2020/lib/models/data/classes/base/DateValue.mjs} +0 -0
  30. package/{esm2015/lib/models/data/classes/base/KeyValue.js → esm2020/lib/models/data/classes/base/KeyValue.mjs} +0 -0
  31. package/{esm2015/lib/models/data/classes/base/KeyValueColor.js → esm2020/lib/models/data/classes/base/KeyValueColor.mjs} +0 -0
  32. package/esm2020/lib/models/data/classes/base/Limit.mjs +15 -0
  33. package/esm2020/lib/models/data/classes/base/LineSerie.mjs +24 -0
  34. package/{esm2015/lib/models/data/index.js → esm2020/lib/models/data/index.mjs} +2 -1
  35. package/{esm2015/lib/models/settings/classes/AreaChartSettings.js → esm2020/lib/models/settings/classes/AreaChartSettings.mjs} +0 -0
  36. package/{esm2015/lib/models/settings/classes/LineChartSettings.js → esm2020/lib/models/settings/classes/LineChartSettings.mjs} +0 -0
  37. package/{esm2015/lib/models/settings/classes/PieChartSettings.js → esm2020/lib/models/settings/classes/PieChartSettings.mjs} +0 -0
  38. package/{esm2015/lib/models/settings/classes/Vertical2DChartSettings.js → esm2020/lib/models/settings/classes/Vertical2DChartSettings.mjs} +0 -0
  39. package/{esm2015/lib/models/settings/classes/VerticalChartSettings.js → esm2020/lib/models/settings/classes/VerticalChartSettings.mjs} +0 -0
  40. package/{esm2015/lib/models/settings/classes/VerticalStackedChartSettings.js → esm2020/lib/models/settings/classes/VerticalStackedChartSettings.mjs} +0 -0
  41. package/{esm2015/lib/models/settings/classes/base/BaseInterval.js → esm2020/lib/models/settings/classes/base/BaseInterval.mjs} +0 -0
  42. package/{esm2015/lib/models/settings/classes/base/BaseSettings.js → esm2020/lib/models/settings/classes/base/BaseSettings.mjs} +0 -0
  43. package/{esm2015/lib/models/settings/classes/base/LegendPad.js → esm2020/lib/models/settings/classes/base/LegendPad.mjs} +0 -0
  44. package/{esm2015/lib/models/settings/index.js → esm2020/lib/models/settings/index.mjs} +0 -0
  45. package/esm2020/lib/services/classes/AreaChartService.mjs +134 -0
  46. package/esm2020/lib/services/classes/LineChartService.mjs +324 -0
  47. package/esm2020/lib/services/classes/PieChartService.mjs +111 -0
  48. package/esm2020/lib/services/classes/Vertical2DChartService.mjs +160 -0
  49. package/esm2020/lib/services/classes/VerticalChartService.mjs +103 -0
  50. package/esm2020/lib/services/classes/VerticalStackedChartService.mjs +124 -0
  51. package/{esm2015/lib/services/classes/base/IBaseService.js → esm2020/lib/services/classes/base/IBaseService.mjs} +0 -0
  52. package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
  53. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  54. package/esm2020/public-api.mjs +37 -0
  55. package/fesm2015/{esfaenza-es-charts.js → esfaenza-es-charts.mjs} +521 -372
  56. package/fesm2015/esfaenza-es-charts.mjs.map +1 -0
  57. package/fesm2020/esfaenza-es-charts.mjs +2701 -0
  58. package/fesm2020/esfaenza-es-charts.mjs.map +1 -0
  59. package/lib/adapters/classes/BaseAdapter.d.ts +3 -0
  60. package/lib/components/base/base-chart.component.d.ts +3 -0
  61. package/lib/components/chart-pager/chart-pager.component.d.ts +3 -0
  62. package/lib/components/specializations/es-area-chart.component.d.ts +3 -0
  63. package/lib/components/specializations/es-chart.component.d.ts +3 -0
  64. package/lib/components/specializations/es-line-chart.component.d.ts +3 -0
  65. package/lib/components/specializations/es-pie-chart.component.d.ts +3 -0
  66. package/lib/components/specializations/es-vertical-2d-chart.component.d.ts +3 -0
  67. package/lib/components/specializations/es-vertical-chart.component.d.ts +3 -0
  68. package/lib/components/specializations/es-vertical-stacked-chart.component.d.ts +3 -0
  69. package/lib/es-charts.module.d.ts +13 -0
  70. package/lib/models/core/classes/ChartDispatcher.d.ts +3 -0
  71. package/lib/models/data/classes/LineChartData.d.ts +4 -1
  72. package/lib/models/data/classes/base/Limit.d.ts +13 -0
  73. package/lib/models/data/classes/base/LineSerie.d.ts +4 -2
  74. package/lib/models/data/index.d.ts +1 -0
  75. package/package.json +23 -11
  76. package/public-api.d.ts +2 -0
  77. package/bundles/esfaenza-es-charts.umd.js +0 -3161
  78. package/bundles/esfaenza-es-charts.umd.js.map +0 -1
  79. package/esfaenza-es-charts.metadata.json +0 -1
  80. package/esm2015/esfaenza-es-charts.js +0 -11
  81. package/esm2015/lib/adapters/classes/BaseAdapter.js +0 -47
  82. package/esm2015/lib/components/base/base-chart.component.js +0 -311
  83. package/esm2015/lib/components/chart-pager/chart-pager.component.js +0 -84
  84. package/esm2015/lib/components/specializations/es-area-chart.component.js +0 -75
  85. package/esm2015/lib/components/specializations/es-chart.component.js +0 -108
  86. package/esm2015/lib/components/specializations/es-line-chart.component.js +0 -98
  87. package/esm2015/lib/components/specializations/es-pie-chart.component.js +0 -89
  88. package/esm2015/lib/components/specializations/es-vertical-2d-chart.component.js +0 -87
  89. package/esm2015/lib/components/specializations/es-vertical-chart.component.js +0 -85
  90. package/esm2015/lib/components/specializations/es-vertical-stacked-chart.component.js +0 -85
  91. package/esm2015/lib/es-charts.module.js +0 -42
  92. package/esm2015/lib/models/core/classes/ChartDispatcher.js +0 -88
  93. package/esm2015/lib/models/data/classes/LineChartData.js +0 -14
  94. package/esm2015/lib/models/data/classes/base/LineSerie.js +0 -22
  95. package/esm2015/lib/services/classes/AreaChartService.js +0 -135
  96. package/esm2015/lib/services/classes/LineChartService.js +0 -296
  97. package/esm2015/lib/services/classes/PieChartService.js +0 -112
  98. package/esm2015/lib/services/classes/Vertical2DChartService.js +0 -163
  99. package/esm2015/lib/services/classes/VerticalChartService.js +0 -105
  100. package/esm2015/lib/services/classes/VerticalStackedChartService.js +0 -127
  101. package/esm2015/public-api.js +0 -35
  102. package/fesm2015/esfaenza-es-charts.js.map +0 -1
@@ -1,296 +0,0 @@
1
- import * as am4core from "@amcharts/amcharts4/core";
2
- import * as am4charts from "@amcharts/amcharts4/charts";
3
- /**
4
- * Classe il cui unico scopo è gestire il setup e rendering di un LineChart
5
- */
6
- export class LineChartService {
7
- /** @ignore */
8
- constructor(Adapter, dateExts) {
9
- this.Adapter = Adapter;
10
- this.dateExts = dateExts;
11
- /** @ignore */
12
- this.DataGroupBucketSize = 1500;
13
- /** @ignore */
14
- this.OpacityOnSelected = 0.3;
15
- //******************** Funzione di throttling per non spammare richieste in caso di animazioni attivate
16
- //TODO: spostarla in un metodo di utilità (esfaenza/extensions)
17
- /** @ignore */
18
- this.executionTimers = {};
19
- }
20
- /**
21
- * Metodo che data una coppia Dati - Impostazioni li utilizza per creare e visualizzare un LineChart
22
- */
23
- graphicate(data, settings) {
24
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
25
- let dataConverted = this.Adapter ? this.Adapter.adaptDataForLineChart(data) : data;
26
- let threshold = (_a = settings.DataGroupingThreshold) !== null && _a !== void 0 ? _a : 3000;
27
- let singleDataSet = (_b = settings.MergeDatasets) !== null && _b !== void 0 ? _b : false;
28
- let showTicks = settings.ShowTicks == null ? true : settings === null || settings === void 0 ? void 0 : settings.ShowTicks;
29
- let dataShouldBeGrouped = Math.max(...dataConverted.series.map(t => t.values.length)) > threshold;
30
- let showTimeline = settings.Timeline || dataShouldBeGrouped;
31
- let seriesWithInterval = dataConverted.series.some(t => t.interval);
32
- let interval = seriesWithInterval ? dataConverted.series.find(t => t.interval).interval : null;
33
- let gapsAllowed = (settings === null || settings === void 0 ? void 0 : settings.AllowGaps) == null ? seriesWithInterval : settings === null || settings === void 0 ? void 0 : settings.AllowGaps;
34
- let finalInstant = (_c = settings === null || settings === void 0 ? void 0 : settings.FinalInstants) !== null && _c !== void 0 ? _c : true;
35
- let fill = (_d = settings === null || settings === void 0 ? void 0 : settings.Fill) !== null && _d !== void 0 ? _d : false;
36
- //Per evitare di dimenticarmeli e gestire comunque bene gli ngif ecc...
37
- am4core.options.autoDispose = true;
38
- this.ChartInstance = am4core.create(settings.Name, am4charts.XYChart);
39
- let ChartInstanceCasted = this.ChartInstance;
40
- let yAxis = ChartInstanceCasted.yAxes.push(new am4charts.ValueAxis());
41
- if (settings.YAxisTitle) {
42
- yAxis.title.text = settings.YAxisTitle;
43
- yAxis.title.fontWeight = "bold";
44
- }
45
- if (settings.Min)
46
- yAxis.min = settings.Min;
47
- if (settings.Max)
48
- yAxis.max = settings.Max;
49
- let dateAxis = ChartInstanceCasted.xAxes.push(new am4charts.DateAxis());
50
- if (settings.XAxisTitle) {
51
- dateAxis.title.text = settings.XAxisTitle;
52
- dateAxis.title.fontWeight = "bold";
53
- }
54
- if (showTicks) {
55
- dateAxis.renderer.ticks.template.disabled = false;
56
- dateAxis.renderer.ticks.template.strokeOpacity = 1;
57
- dateAxis.renderer.ticks.template.stroke = am4core.color("#495C43");
58
- dateAxis.renderer.ticks.template.strokeWidth = 2;
59
- dateAxis.renderer.ticks.template.length = 10;
60
- dateAxis.renderer.ticks.template.location = 0;
61
- }
62
- dateAxis.renderer.minGridDistance = (_e = settings === null || settings === void 0 ? void 0 : settings.MinGridDistance) !== null && _e !== void 0 ? _e : 50;
63
- dateAxis.renderer.grid.template.location = 0;
64
- dateAxis.minZoomCount = 5;
65
- dateAxis.groupData = dataShouldBeGrouped;
66
- dateAxis.groupCount = (_f = settings.DataGroupBucketSize) !== null && _f !== void 0 ? _f : this.DataGroupBucketSize;
67
- //Se ho almeno una serie ad intervallo e i settings non mi impediscono esplicitamente di usare i gaps, visualizzo i dati col gap
68
- if (gapsAllowed) {
69
- if (!seriesWithInterval) {
70
- console.error("Per utilizzare la funzionalità dei gap è obbligatorio definire un intervallo nelle serie del grafico");
71
- return null;
72
- }
73
- dateAxis.baseInterval = { count: interval.count, timeUnit: interval.timeunit };
74
- }
75
- if (showTimeline)
76
- ChartInstanceCasted.scrollbarX = new am4charts.XYChartScrollbar();
77
- let seriesToPush = [];
78
- let seriesColors = [];
79
- let defaultIndex = 0;
80
- //-- Generazione di un unico dataset invece che N, per poter gestire un unico tooltip
81
- if (singleDataSet) {
82
- let dto = {};
83
- dataConverted.series.forEach((vs, index) => {
84
- for (let i = 0; i < vs.values.length; i++) {
85
- var dataitem = vs.values[i];
86
- var indexer = new Date(dataitem.d).valueOf();
87
- if (!dto[indexer])
88
- dto[indexer] = {};
89
- dto[indexer]['v' + index] = dataitem.v;
90
- }
91
- });
92
- var dates = Object.keys(dto);
93
- let singleDS = [];
94
- for (let i = 0; i < dates.length; i++) {
95
- let values = dto[dates[i]];
96
- let item = { d: new Date(parseInt(dates[i])) };
97
- var vals = Object.keys(values);
98
- for (let ii = 0; ii < vals.length; ii++) {
99
- let series = vals[ii];
100
- let singleVal = values[series];
101
- item[series] = singleVal;
102
- }
103
- singleDS.push(item);
104
- }
105
- this.ChartInstance.data = singleDS;
106
- dateAxis.cursorTooltipEnabled = false;
107
- }
108
- //-- Fine generazione
109
- dataConverted.series.forEach((s, index) => {
110
- var _a, _b;
111
- if (s.values[0] && !(s.values[0].d instanceof Date)) {
112
- for (let v = 0; v < s.values.length; v++)
113
- s.values[v].d = new Date(s.values[v].d);
114
- }
115
- var correctOrder = true;
116
- var prevDate = null;
117
- for (let v = 0; v < s.values.length; v++) {
118
- if (!prevDate)
119
- prevDate = s.values[v].d;
120
- else if (s.values[v].d < prevDate) {
121
- correctOrder = false;
122
- break;
123
- }
124
- }
125
- if (!correctOrder)
126
- s.values.sort((d1, d2) => d1.d.getTime() - d2.d.getTime());
127
- let series = (settings === null || settings === void 0 ? void 0 : settings.Step) ? new am4charts.StepLineSeries() : new am4charts.LineSeries();
128
- series.dataFields.valueY = "v" + (singleDataSet ? index : "");
129
- series.dataFields.dateX = "d";
130
- series.dataFields.measureUnit = s.uom;
131
- series.name = s.name;
132
- series.strokeWidth = (_a = settings === null || settings === void 0 ? void 0 : settings.StrokeSize) !== null && _a !== void 0 ? _a : 1;
133
- series.connect = !gapsAllowed;
134
- series.minBulletDistance = 10;
135
- series.tooltipText = singleDataSet ? "" : "{name}: [bold]{valueY}[/]";
136
- series.tooltip.pointerOrientation = "vertical";
137
- series.tooltip.background.fillOpacity = 0.5;
138
- series.tooltip.label.padding(12, 12, 12, 12);
139
- series.fillOpacity = fill ? 1 : 0.0001;
140
- series.stacked = fill;
141
- //Dataset singolo, i dati sono registrati a livello di chart, creo il tooltip che permette di vederli tutti insieme
142
- //altrimenti assegno i dati della serie direttamente alla serie
143
- if (singleDataSet) {
144
- series.tooltip.getFillFromObject = false;
145
- series.tooltip.background.fill = am4core.color("#eee");
146
- series.tooltip.label.fill = am4core.color("#00");
147
- series.tooltip.defaultState.transitionDuration = 0;
148
- series.tooltip.hiddenState.transitionDuration = 0;
149
- //Utilizzo il mio dateService per la formattazione della data in modo che non debba mai gestire n formati fra n librerie... bellissimo
150
- series.dateFormatter.format = (source) => {
151
- if (interval && finalInstant) {
152
- let timepart = null;
153
- switch (interval.timeunit) {
154
- case "hour":
155
- timepart = 'day';
156
- break;
157
- case "minute":
158
- timepart = 'hour';
159
- break;
160
- case "second":
161
- timepart = 'minute';
162
- break;
163
- }
164
- if (timepart)
165
- return this.dateExts.adjustDateToFinalInstant(source, timepart, interval ? interval.timeunit == "second" : false);
166
- }
167
- else
168
- return this.dateExts.getFormatted(source, false, interval ? interval.timeunit == "second" : false);
169
- };
170
- series.adapter.add("tooltipText", () => {
171
- var text = "[bold]{dateX.formatDate()}[/]\n";
172
- this.ChartInstance.series.each((item) => {
173
- let uom = " [font-style: italic]" + series.dataFields.measureUnit || "" + "[/]";
174
- text += "[" + item.stroke.hex + "]●[/] " + item.name + ": [bold]{" + item.dataFields.valueY + "}[/]" + uom + "\n";
175
- });
176
- return text;
177
- });
178
- }
179
- else
180
- series.data = s.values;
181
- let segment = series.segments.template;
182
- let hoverState = segment.states.create("hover");
183
- hoverState.properties.strokeWidth = ((_b = settings === null || settings === void 0 ? void 0 : settings.StrokeSize) !== null && _b !== void 0 ? _b : 1) + 1;
184
- let dimmed = segment.states.create("dimmed");
185
- dimmed.properties.stroke = am4core.color("#dadada");
186
- //Se la serie ha un colore, uso quello, altrimenti pesco dai colori di default andando in ordine
187
- if (s.color)
188
- seriesColors.push(am4core.color(s.color));
189
- else {
190
- seriesColors.push(ChartInstanceCasted.colors.list[defaultIndex % ChartInstanceCasted.colors.list.length]);
191
- defaultIndex++;
192
- }
193
- seriesToPush.push(series);
194
- });
195
- ChartInstanceCasted.colors.list = seriesColors;
196
- //Scrivo le serie nel grafico
197
- seriesToPush.forEach(s => {
198
- ChartInstanceCasted.series.push(s);
199
- if (showTimeline)
200
- ChartInstanceCasted.scrollbarX.series.push(s);
201
- });
202
- if (settings.Legend) {
203
- this.ChartInstance.legend = new am4charts.Legend();
204
- this.ChartInstance.legend.position = (_g = settings === null || settings === void 0 ? void 0 : settings.LegendPosition) !== null && _g !== void 0 ? _g : 'right';
205
- this.ChartInstance.legend.scrollable = true;
206
- this.ChartInstance.legend.itemContainers.template.tooltipText = "{name}";
207
- this.ChartInstance.legend.itemContainers.template.events.on("over", (event) => { this.processOver(event.target.dataItem.dataContext, fill); });
208
- this.ChartInstance.legend.itemContainers.template.events.on("out", (event) => { this.processOut(fill); });
209
- if (settings.LegendPadding) {
210
- let template = this.ChartInstance.legend.itemContainers.template;
211
- template.paddingTop = (_h = settings.LegendPadding.top) !== null && _h !== void 0 ? _h : 0;
212
- template.paddingBottom = (_j = settings.LegendPadding.bottom) !== null && _j !== void 0 ? _j : 0;
213
- template.paddingLeft = (_k = settings.LegendPadding.left) !== null && _k !== void 0 ? _k : 0;
214
- template.paddingRight = (_l = settings.LegendPadding.right) !== null && _l !== void 0 ? _l : 0;
215
- }
216
- }
217
- this.ChartInstance.cursor = new am4charts.XYCursor();
218
- //Prove******************************************************************************************************************************
219
- // this.ChartInstance.cursor.events.on("cursorpositionchanged", (ev) => {
220
- // //var value = dateAxis.positionToDate(dateAxis.toAxisPosition(ev.target.xPosition));
221
- // var dt = dateAxis.series.values.find(t => t.dataItem.values.dateX);
222
- // if (dt && dt.dataItem) {
223
- // console.log(dt.dataItem.values);
224
- // // this.ChartInstance.tooltipText = dt;
225
- // }
226
- // else {
227
- // this.ChartInstance.tooltipText = "";
228
- // }
229
- // });
230
- //******************************************************************************************************************************
231
- this.ChartInstance.cursor.xAxis = dateAxis;
232
- this.ChartInstance.cursor.yAxis = yAxis;
233
- if (singleDataSet)
234
- this.ChartInstance.cursor.maxTooltipDistance = -1;
235
- //TODO: Cercare di capire perché è figlio di puttana......
236
- dateAxis.events.on("startchanged", t => this.emitSelectionChanged(t, settings));
237
- dateAxis.events.on("endchanged", t => this.emitSelectionChanged(t, settings));
238
- return this;
239
- }
240
- /** @ignore */
241
- refreshData(data) {
242
- //TODO:IMPL
243
- }
244
- /** @ignore */
245
- emitSelectionChanged(ev, settings) {
246
- if (settings.OnSelectionChangedCallback) {
247
- this.throttla("selchange", () => {
248
- var axis = ev.target;
249
- var start = new Date(axis.minZoomed);
250
- var end = new Date(axis.maxZoomed);
251
- var initial = axis.min == axis.minZoomed && axis.max == axis.maxZoomed;
252
- settings.OnSelectionChangedCallback({ from: start, to: end, initial: initial });
253
- }, 150);
254
- }
255
- }
256
- /** @ignore */
257
- processOver(hoveredSeries, fill) {
258
- hoveredSeries.toFront();
259
- hoveredSeries.segments.each((segment) => {
260
- segment.setState("hover");
261
- if (!fill)
262
- segment.fillSprite.fillOpacity = this.OpacityOnSelected;
263
- });
264
- if (!fill)
265
- hoveredSeries.legendDataItem.marker.children.getIndex(1).fillOpacity = this.OpacityOnSelected;
266
- this.ChartInstance.series.each((series) => {
267
- if (series != hoveredSeries)
268
- series.segments.each((segment) => {
269
- segment.setState("dimmed");
270
- if (!fill)
271
- segment.fillSprite.fillOpacity = 0;
272
- });
273
- });
274
- }
275
- /** @ignore */
276
- processOut(fill) {
277
- this.ChartInstance.series.each((series) => {
278
- series.segments.each((segment) => {
279
- segment.setState("default");
280
- if (!fill)
281
- segment.fillSprite.fillOpacity = 0;
282
- });
283
- if (!fill)
284
- series.legendDataItem.marker.children.getIndex(1).fillOpacity = 0;
285
- });
286
- }
287
- /** @ignore */
288
- throttla(id, func, throttleTime) {
289
- //Se ho la funzione che vuole eseguire ripulisco quel timeout
290
- if (this.executionTimers[id])
291
- clearTimeout(this.executionTimers[id]);
292
- //Ricreo il timeout per eseguire quella funzione dopo throttleTime millisecondi
293
- this.executionTimers[id] = setTimeout(() => { func(); this.executionTimers[id] = null; }, throttleTime);
294
- }
295
- }
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluZUNoYXJ0U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLWNoYXJ0cy9zcmMvbGliL3NlcnZpY2VzL2NsYXNzZXMvTGluZUNoYXJ0U2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEtBQUssT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sNEJBQTRCLENBQUM7QUFFeEQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBUXpCLGNBQWM7SUFDZCxZQUFtQixPQUFvQixFQUFVLFFBQXFCO1FBQW5ELFlBQU8sR0FBUCxPQUFPLENBQWE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBTnRFLGNBQWM7UUFDTix3QkFBbUIsR0FBVyxJQUFJLENBQUM7UUFDM0MsY0FBYztRQUNOLHNCQUFpQixHQUFXLEdBQUcsQ0FBQztRQXNUeEMsdUdBQXVHO1FBQ3ZHLCtEQUErRDtRQUMvRCxjQUFjO1FBQ04sb0JBQWUsR0FBNkIsRUFBRSxDQUFDO0lBdFRtQixDQUFDO0lBRTNFOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQXlCLEVBQUUsUUFBMkI7O1FBQ3BFLElBQUksYUFBYSxHQUFrQixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEcsSUFBSSxTQUFTLEdBQUcsTUFBQSxRQUFRLENBQUMscUJBQXFCLG1DQUFJLElBQUksQ0FBQztRQUN2RCxJQUFJLGFBQWEsR0FBRyxNQUFBLFFBQVEsQ0FBQyxhQUFhLG1DQUFJLEtBQUssQ0FBQztRQUNwRCxJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLGFBQVIs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Q0wsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUk7Z0JBQ0wsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQU1ELGNBQWM7SUFDTixRQUFRLENBQUMsRUFBVSxFQUFFLElBQWMsRUFBRSxZQUFvQjtRQUM3RCw2REFBNkQ7UUFDN0QsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUN4QixZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNDLCtFQUErRTtRQUMvRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzVHLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcbmltcG9ydCB7IElCYXNlU2VydmljZSB9IGZyb20gJy4vYmFzZS9JQmFzZVNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlQWRhcHRlciB9IGZyb20gJy4uLy4uL2FkYXB0ZXJzJztcclxuaW1wb3J0IHsgTGluZUNoYXJ0RGF0YSB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRhJztcclxuaW1wb3J0IHsgTGluZUNoYXJ0U2V0dGluZ3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvc2V0dGluZ3MnO1xyXG5cclxuaW1wb3J0ICogYXMgYW00Y29yZSBmcm9tIFwiQGFtY2hhcnRzL2FtY2hhcnRzNC9jb3JlXCI7XHJcbmltcG9ydCAqIGFzIGFtNGNoYXJ0cyBmcm9tIFwiQGFtY2hhcnRzL2FtY2hhcnRzNC9jaGFydHNcIjtcclxuXHJcbi8qKlxyXG4gKiBDbGFzc2UgaWwgY3VpIHVuaWNvIHNjb3BvIMOoIGdlc3RpcmUgaWwgc2V0dXAgZSByZW5kZXJpbmcgZGkgdW4gTGluZUNoYXJ0XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTGluZUNoYXJ0U2VydmljZSBpbXBsZW1lbnRzIElCYXNlU2VydmljZTxhbTRjaGFydHMuWFlDaGFydD57XHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIENoYXJ0SW5zdGFuY2U6IGFtNGNoYXJ0cy5YWUNoYXJ0O1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgRGF0YUdyb3VwQnVja2V0U2l6ZTogbnVtYmVyID0gMTUwMDtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIE9wYWNpdHlPblNlbGVjdGVkOiBudW1iZXIgPSAwLjM7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBBZGFwdGVyOiBCYXNlQWRhcHRlciwgcHJpdmF0ZSBkYXRlRXh0czogRGF0ZVNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBkYXRhIHVuYSBjb3BwaWEgRGF0aSAtIEltcG9zdGF6aW9uaSBsaSB1dGlsaXp6YSBwZXIgY3JlYXJlIGUgdmlzdWFsaXp6YXJlIHVuIExpbmVDaGFydFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JhcGhpY2F0ZShkYXRhOiBMaW5lQ2hhcnREYXRhIHwgYW55LCBzZXR0aW5nczogTGluZUNoYXJ0U2V0dGluZ3MpOiBJQmFzZVNlcnZpY2U8YW00Y2hhcnRzLlhZQ2hhcnQ+IHtcclxuICAgICAgICBsZXQgZGF0YUNvbnZlcnRlZDogTGluZUNoYXJ0RGF0YSA9IHRoaXMuQWRhcHRlciA/IHRoaXMuQWRhcHRlci5hZGFwdERhdGFGb3JMaW5lQ2hhcnQoZGF0YSkgOiBkYXRhO1xyXG4gICAgICAgIGxldCB0aHJlc2hvbGQgPSBzZXR0aW5ncy5EYXRhR3JvdXBpbmdUaHJlc2hvbGQgPz8gMzAwMDtcclxuICAgICAgICBsZXQgc2luZ2xlRGF0YVNldCA9IHNldHRpbmdzLk1lcmdlRGF0YXNldHMgPz8gZmFsc2U7XHJcbiAgICAgICAgbGV0IHNob3dUaWNrcyA9IHNldHRpbmdzLlNob3dUaWNrcyA9PSBudWxsID8gdHJ1ZSA6IHNldHRpbmdzPy5TaG93VGlja3M7XHJcbiAgICAgICAgbGV0IGRhdGFTaG91bGRCZUdyb3VwZWQgPSBNYXRoLm1heCguLi5kYXRhQ29udmVydGVkLnNlcmllcy5tYXAodCA9PiB0LnZhbHVlcy5sZW5ndGgpKSA+IHRocmVzaG9sZDtcclxuICAgICAgICBsZXQgc2hvd1RpbWVsaW5lID0gc2V0dGluZ3MuVGltZWxpbmUgfHwgZGF0YVNob3VsZEJlR3JvdXBlZDtcclxuICAgICAgICBsZXQgc2VyaWVzV2l0aEludGVydmFsID0gZGF0YUNvbnZlcnRlZC5zZXJpZXMuc29tZSh0ID0+IHQuaW50ZXJ2YWwpO1xyXG4gICAgICAgIGxldCBpbnRlcnZhbCA9IHNlcmllc1dpdGhJbnRlcnZhbCA/IGRhdGFDb252ZXJ0ZWQuc2VyaWVzLmZpbmQodCA9PiB0LmludGVydmFsKS5pbnRlcnZhbCA6IG51bGw7XHJcbiAgICAgICAgbGV0IGdhcHNBbGxvd2VkID0gc2V0dGluZ3M/LkFsbG93R2FwcyA9PSBudWxsID8gc2VyaWVzV2l0aEludGVydmFsIDogc2V0dGluZ3M/LkFsbG93R2FwcztcclxuICAgICAgICBsZXQgZmluYWxJbnN0YW50ID0gc2V0dGluZ3M/LkZpbmFsSW5zdGFudHMgPz8gdHJ1ZTtcclxuICAgICAgICBsZXQgZmlsbCA9IHNldHRpbmdzPy5GaWxsID8/IGZhbHNlO1xyXG5cclxuICAgICAgICAvL1BlciBldml0YXJlIGRpIGRpbWVudGljYXJtZWxpIGUgZ2VzdGlyZSBjb211bnF1ZSBiZW5lIGdsaSBuZ2lmIGVjYy4uLlxyXG4gICAgICAgIGFtNGNvcmUub3B0aW9ucy5hdXRvRGlzcG9zZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZSA9IGFtNGNvcmUuY3JlYXRlKHNldHRpbmdzLk5hbWUsIGFtNGNoYXJ0cy5YWUNoYXJ0KTtcclxuICAgICAgICBsZXQgQ2hhcnRJbnN0YW5jZUNhc3RlZCA9IDxhbTRjaGFydHMuWFlDaGFydD50aGlzLkNoYXJ0SW5zdGFuY2U7XHJcblxyXG4gICAgICAgIGxldCB5QXhpcyA9IENoYXJ0SW5zdGFuY2VDYXN0ZWQueUF4ZXMucHVzaChuZXcgYW00Y2hhcnRzLlZhbHVlQXhpcygpKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuWUF4aXNUaXRsZSkge1xyXG4gICAgICAgICAgICB5QXhpcy50aXRsZS50ZXh0ID0gc2V0dGluZ3MuWUF4aXNUaXRsZVxyXG4gICAgICAgICAgICB5QXhpcy50aXRsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuTWluKVxyXG4gICAgICAgICAgICB5QXhpcy5taW4gPSBzZXR0aW5ncy5NaW47XHJcbiAgICAgICAgaWYgKHNldHRpbmdzLk1heClcclxuICAgICAgICAgICAgeUF4aXMubWF4ID0gc2V0dGluZ3MuTWF4O1xyXG5cclxuICAgICAgICBsZXQgZGF0ZUF4aXMgPSBDaGFydEluc3RhbmNlQ2FzdGVkLnhBeGVzLnB1c2gobmV3IGFtNGNoYXJ0cy5EYXRlQXhpcygpKTtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLlhBeGlzVGl0bGUpIHtcclxuICAgICAgICAgICAgZGF0ZUF4aXMudGl0bGUudGV4dCA9IHNldHRpbmdzLlhBeGlzVGl0bGVcclxuICAgICAgICAgICAgZGF0ZUF4aXMudGl0bGUuZm9udFdlaWdodCA9IFwiYm9sZFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNob3dUaWNrcykge1xyXG4gICAgICAgICAgICBkYXRlQXhpcy5yZW5kZXJlci50aWNrcy50ZW1wbGF0ZS5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkYXRlQXhpcy5yZW5kZXJlci50aWNrcy50ZW1wbGF0ZS5zdHJva2VPcGFjaXR5ID0gMTtcclxuICAgICAgICAgICAgZGF0ZUF4aXMucmVuZGVyZXIudGlja3MudGVtcGxhdGUuc3Ryb2tlID0gYW00Y29yZS5jb2xvcihcIiM0OTVDNDNcIik7XHJcbiAgICAgICAgICAgIGRhdGVBeGlzLnJlbmRlcmVyLnRpY2tzLnRlbXBsYXRlLnN0cm9rZVdpZHRoID0gMjtcclxuICAgICAgICAgICAgZGF0ZUF4aXMucmVuZGVyZXIudGlja3MudGVtcGxhdGUubGVuZ3RoID0gMTA7XHJcbiAgICAgICAgICAgIGRhdGVBeGlzLnJlbmRlcmVyLnRpY2tzLnRlbXBsYXRlLmxvY2F0aW9uID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGVBeGlzLnJlbmRlcmVyLm1pbkdyaWREaXN0YW5jZSA9IHNldHRpbmdzPy5NaW5HcmlkRGlzdGFuY2UgPz8gNTA7XHJcbiAgICAgICAgZGF0ZUF4aXMucmVuZGVyZXIuZ3JpZC50ZW1wbGF0ZS5sb2NhdGlvbiA9IDA7XHJcbiAgICAgICAgZGF0ZUF4aXMubWluWm9vbUNvdW50ID0gNTtcclxuICAgICAgICBkYXRlQXhpcy5ncm91cERhdGEgPSBkYXRhU2hvdWxkQmVHcm91cGVkO1xyXG4gICAgICAgIGRhdGVBeGlzLmdyb3VwQ291bnQgPSBzZXR0aW5ncy5EYXRhR3JvdXBCdWNrZXRTaXplID8/IHRoaXMuRGF0YUdyb3VwQnVja2V0U2l6ZTtcclxuXHJcbiAgICAgICAgLy9TZSBobyBhbG1lbm8gdW5hIHNlcmllIGFkIGludGVydmFsbG8gZSBpIHNldHRpbmdzIG5vbiBtaSBpbXBlZGlzY29ubyBlc3BsaWNpdGFtZW50ZSBkaSB1c2FyZSBpIGdhcHMsIHZpc3VhbGl6em8gaSBkYXRpIGNvbCBnYXBcclxuXHJcbiAgICAgICAgaWYgKGdhcHNBbGxvd2VkKSB7XHJcbiAgICAgICAgICAgIGlmICghc2VyaWVzV2l0aEludGVydmFsKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUGVyIHV0aWxpenphcmUgbGEgZnVuemlvbmFsaXTDoCBkZWkgZ2FwIMOoIG9iYmxpZ2F0b3JpbyBkZWZpbmlyZSB1biBpbnRlcnZhbGxvIG5lbGxlIHNlcmllIGRlbCBncmFmaWNvXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGRhdGVBeGlzLmJhc2VJbnRlcnZhbCA9IHsgY291bnQ6IGludGVydmFsLmNvdW50LCB0aW1lVW5pdDogaW50ZXJ2YWwudGltZXVuaXQgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNob3dUaW1lbGluZSlcclxuICAgICAgICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5zY3JvbGxiYXJYID0gbmV3IGFtNGNoYXJ0cy5YWUNoYXJ0U2Nyb2xsYmFyKCk7XHJcblxyXG4gICAgICAgIGxldCBzZXJpZXNUb1B1c2ggPSBbXTtcclxuICAgICAgICBsZXQgc2VyaWVzQ29sb3JzOiBhbTRjb3JlLkNvbG9yW10gPSBbXTtcclxuICAgICAgICBsZXQgZGVmYXVsdEluZGV4ID0gMDtcclxuXHJcbiAgICAgICAgLy8tLSBHZW5lcmF6aW9uZSBkaSB1biB1bmljbyBkYXRhc2V0IGludmVjZSBjaGUgTiwgcGVyIHBvdGVyIGdlc3RpcmUgdW4gdW5pY28gdG9vbHRpcFxyXG4gICAgICAgIGlmIChzaW5nbGVEYXRhU2V0KSB7XHJcbiAgICAgICAgICAgIGxldCBkdG86IHsgW2luZGV4OiBudW1iZXJdOiB7IFtzaW5kZXg6IHN0cmluZ106IG51bWJlciB9IH0gPSB7fTtcclxuICAgICAgICAgICAgZGF0YUNvbnZlcnRlZC5zZXJpZXMuZm9yRWFjaCgodnMsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkYXRhaXRlbSA9IHZzLnZhbHVlc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXhlciA9IG5ldyBEYXRlKGRhdGFpdGVtLmQpLnZhbHVlT2YoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkdG9baW5kZXhlcl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGR0b1tpbmRleGVyXSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBkdG9baW5kZXhlcl1bJ3YnICsgaW5kZXhdID0gZGF0YWl0ZW0udjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXIgZGF0ZXMgPSBPYmplY3Qua2V5cyhkdG8pO1xyXG4gICAgICAgICAgICBsZXQgc2luZ2xlRFMgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlczogeyBbc2luZGV4OiBzdHJpbmddOiBudW1iZXIgfSA9IGR0b1tkYXRlc1tpXV07XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHsgZDogbmV3IERhdGUocGFyc2VJbnQoZGF0ZXNbaV0pKSB9XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHMgPSBPYmplY3Qua2V5cyh2YWx1ZXMpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IHZhbHMubGVuZ3RoOyBpaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlcmllcyA9IHZhbHNbaWldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaW5nbGVWYWwgPSB2YWx1ZXNbc2VyaWVzXTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtW3Nlcmllc10gPSBzaW5nbGVWYWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzaW5nbGVEUy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5kYXRhID0gc2luZ2xlRFM7XHJcbiAgICAgICAgICAgIGRhdGVBeGlzLmN1cnNvclRvb2x0aXBFbmFibGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vLS0gRmluZSBnZW5lcmF6aW9uZVxyXG5cclxuICAgICAgICBkYXRhQ29udmVydGVkLnNlcmllcy5mb3JFYWNoKChzLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocy52YWx1ZXNbMF0gJiYgIShzLnZhbHVlc1swXS5kIGluc3RhbmNlb2YgRGF0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IHYgPSAwOyB2IDwgcy52YWx1ZXMubGVuZ3RoOyB2KyspXHJcbiAgICAgICAgICAgICAgICAgICAgcy52YWx1ZXNbdl0uZCA9IG5ldyBEYXRlKHMudmFsdWVzW3ZdLmQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgY29ycmVjdE9yZGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgdmFyIHByZXZEYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCBzLnZhbHVlcy5sZW5ndGg7IHYrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2RGF0ZSlcclxuICAgICAgICAgICAgICAgICAgICBwcmV2RGF0ZSA9IHMudmFsdWVzW3ZdLmQ7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHMudmFsdWVzW3ZdLmQgPCBwcmV2RGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0T3JkZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWNvcnJlY3RPcmRlcilcclxuICAgICAgICAgICAgICAgIHMudmFsdWVzLnNvcnQoKGQxLCBkMikgPT4gZDEuZC5nZXRUaW1lKCkgLSBkMi5kLmdldFRpbWUoKSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2VyaWVzOiBhbTRjaGFydHMuU3RlcExpbmVTZXJpZXMgfCBhbTRjaGFydHMuTGluZVNlcmllcyA9IHNldHRpbmdzPy5TdGVwID8gbmV3IGFtNGNoYXJ0cy5TdGVwTGluZVNlcmllcygpIDogbmV3IGFtNGNoYXJ0cy5MaW5lU2VyaWVzKCk7XHJcbiAgICAgICAgICAgIHNlcmllcy5kYXRhRmllbGRzLnZhbHVlWSA9IFwidlwiICsgKHNpbmdsZURhdGFTZXQgPyBpbmRleCA6IFwiXCIpO1xyXG4gICAgICAgICAgICBzZXJpZXMuZGF0YUZpZWxkcy5kYXRlWCA9IFwiZFwiO1xyXG4gICAgICAgICAgICAoPGFueT5zZXJpZXMuZGF0YUZpZWxkcykubWVhc3VyZVVuaXQgPSBzLnVvbTtcclxuICAgICAgICAgICAgc2VyaWVzLm5hbWUgPSBzLm5hbWU7XHJcbiAgICAgICAgICAgIHNlcmllcy5zdHJva2VXaWR0aCA9IHNldHRpbmdzPy5TdHJva2VTaXplID8/IDE7XHJcbiAgICAgICAgICAgIHNlcmllcy5jb25uZWN0ID0gIWdhcHNBbGxvd2VkO1xyXG4gICAgICAgICAgICBzZXJpZXMubWluQnVsbGV0RGlzdGFuY2UgPSAxMDtcclxuICAgICAgICAgICAgc2VyaWVzLnRvb2x0aXBUZXh0ID0gc2luZ2xlRGF0YVNldCA/IFwiXCIgOiBcIntuYW1lfTogW2JvbGRde3ZhbHVlWX1bL11cIjtcclxuICAgICAgICAgICAgc2VyaWVzLnRvb2x0aXAucG9pbnRlck9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiO1xyXG4gICAgICAgICAgICBzZXJpZXMudG9vbHRpcC5iYWNrZ3JvdW5kLmZpbGxPcGFjaXR5ID0gMC41O1xyXG4gICAgICAgICAgICBzZXJpZXMudG9vbHRpcC5sYWJlbC5wYWRkaW5nKDEyLCAxMiwgMTIsIDEyKTtcclxuICAgICAgICAgICAgc2VyaWVzLmZpbGxPcGFjaXR5ID0gZmlsbCA/IDEgOiAwLjAwMDE7XHJcbiAgICAgICAgICAgIHNlcmllcy5zdGFja2VkID0gZmlsbDtcclxuXHJcbiAgICAgICAgICAgIC8vRGF0YXNldCBzaW5nb2xvLCBpIGRhdGkgc29ubyByZWdpc3RyYXRpIGEgbGl2ZWxsbyBkaSBjaGFydCwgY3JlbyBpbCB0b29sdGlwIGNoZSBwZXJtZXR0ZSBkaSB2ZWRlcmxpIHR1dHRpIGluc2llbWVcclxuICAgICAgICAgICAgLy9hbHRyaW1lbnRpIGFzc2Vnbm8gaSBkYXRpIGRlbGxhIHNlcmllIGRpcmV0dGFtZW50ZSBhbGxhIHNlcmllXHJcbiAgICAgICAgICAgIGlmIChzaW5nbGVEYXRhU2V0KSB7XHJcbiAgICAgICAgICAgICAgICBzZXJpZXMudG9vbHRpcC5nZXRGaWxsRnJvbU9iamVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzLnRvb2x0aXAuYmFja2dyb3VuZC5maWxsID0gYW00Y29yZS5jb2xvcihcIiNlZWVcIik7XHJcbiAgICAgICAgICAgICAgICBzZXJpZXMudG9vbHRpcC5sYWJlbC5maWxsID0gYW00Y29yZS5jb2xvcihcIiMwMFwiKTtcclxuICAgICAgICAgICAgICAgIHNlcmllcy50b29sdGlwLmRlZmF1bHRTdGF0ZS50cmFuc2l0aW9uRHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzLnRvb2x0aXAuaGlkZGVuU3RhdGUudHJhbnNpdGlvbkR1cmF0aW9uID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICAvL1V0aWxpenpvIGlsIG1pbyBkYXRlU2VydmljZSBwZXIgbGEgZm9ybWF0dGF6aW9uZSBkZWxsYSBkYXRhIGluIG1vZG8gY2hlIG5vbiBkZWJiYSBtYWkgZ2VzdGlyZSBuIGZvcm1hdGkgZnJhIG4gbGlicmVyaWUuLi4gYmVsbGlzc2ltb1xyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmRhdGVGb3JtYXR0ZXIuZm9ybWF0ID0gKHNvdXJjZTogRGF0ZSk6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsICYmIGZpbmFsSW5zdGFudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZXBhcnQ6IFwibWludXRlXCIgfCBcImhvdXJcIiB8IFwiZGF5XCIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGludGVydmFsLnRpbWV1bml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaG91clwiOiB0aW1lcGFydCA9ICdkYXknOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtaW51dGVcIjogdGltZXBhcnQgPSAnaG91cic7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNlY29uZFwiOiB0aW1lcGFydCA9ICdtaW51dGUnOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZXBhcnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRXh0cy5hZGp1c3REYXRlVG9GaW5hbEluc3RhbnQoc291cmNlLCB0aW1lcGFydCwgaW50ZXJ2YWwgPyBpbnRlcnZhbC50aW1ldW5pdCA9PSBcInNlY29uZFwiIDogZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVFeHRzLmdldEZvcm1hdHRlZChzb3VyY2UsIGZhbHNlLCBpbnRlcnZhbCA/IGludGVydmFsLnRpbWV1bml0ID09IFwic2Vjb25kXCIgOiBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgKDxhbnk+c2VyaWVzLmFkYXB0ZXIpLmFkZChcInRvb2x0aXBUZXh0XCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IFwiW2JvbGRde2RhdGVYLmZvcm1hdERhdGUoKX1bL11cXG5cIjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2Uuc2VyaWVzLmVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVvbSA9IFwiIFtmb250LXN0eWxlOiBpdGFsaWNdXCIgKyAoPGFueT5zZXJpZXMuZGF0YUZpZWxkcykubWVhc3VyZVVuaXQgfHwgXCJcIiArIFwiWy9dXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCJbXCIgKyAoPGFueT5pdGVtLnN0cm9rZSkuaGV4ICsgXCJd4pePWy9dIFwiICsgaXRlbS5uYW1lICsgXCI6IFtib2xkXXtcIiArIGl0ZW0uZGF0YUZpZWxkcy52YWx1ZVkgKyBcIn1bL11cIiArIHVvbSArIFwiXFxuXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBzZXJpZXMuZGF0YSA9IHMudmFsdWVzO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSBzZXJpZXMuc2VnbWVudHMudGVtcGxhdGU7XHJcblxyXG4gICAgICAgICAgICBsZXQgaG92ZXJTdGF0ZSA9IHNlZ21lbnQuc3RhdGVzLmNyZWF0ZShcImhvdmVyXCIpO1xyXG4gICAgICAgICAgICBob3ZlclN0YXRlLnByb3BlcnRpZXMuc3Ryb2tlV2lkdGggPSAoc2V0dGluZ3M/LlN0cm9rZVNpemUgPz8gMSkgKyAxO1xyXG5cclxuICAgICAgICAgICAgbGV0IGRpbW1lZCA9IHNlZ21lbnQuc3RhdGVzLmNyZWF0ZShcImRpbW1lZFwiKTtcclxuICAgICAgICAgICAgZGltbWVkLnByb3BlcnRpZXMuc3Ryb2tlID0gYW00Y29yZS5jb2xvcihcIiNkYWRhZGFcIik7XHJcblxyXG4gICAgICAgICAgICAvL1NlIGxhIHNlcmllIGhhIHVuIGNvbG9yZSwgdXNvIHF1ZWxsbywgYWx0cmltZW50aSBwZXNjbyBkYWkgY29sb3JpIGRpIGRlZmF1bHQgYW5kYW5kbyBpbiBvcmRpbmVcclxuICAgICAgICAgICAgaWYgKHMuY29sb3IpXHJcbiAgICAgICAgICAgICAgICBzZXJpZXNDb2xvcnMucHVzaChhbTRjb3JlLmNvbG9yKHMuY29sb3IpKTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZXJpZXNDb2xvcnMucHVzaChDaGFydEluc3RhbmNlQ2FzdGVkLmNvbG9ycy5saXN0W2RlZmF1bHRJbmRleCAlIENoYXJ0SW5zdGFuY2VDYXN0ZWQuY29sb3JzLmxpc3QubGVuZ3RoXSlcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRJbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzZXJpZXNUb1B1c2gucHVzaChzZXJpZXMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgQ2hhcnRJbnN0YW5jZUNhc3RlZC5jb2xvcnMubGlzdCA9IHNlcmllc0NvbG9ycztcclxuICAgICAgICAvL1Njcml2byBsZSBzZXJpZSBuZWwgZ3JhZmljb1xyXG4gICAgICAgIHNlcmllc1RvUHVzaC5mb3JFYWNoKHMgPT4ge1xyXG4gICAgICAgICAgICBDaGFydEluc3RhbmNlQ2FzdGVkLnNlcmllcy5wdXNoKHMpO1xyXG4gICAgICAgICAgICBpZiAoc2hvd1RpbWVsaW5lKVxyXG4gICAgICAgICAgICAgICAgKDxhbTRjaGFydHMuWFlDaGFydFNjcm9sbGJhcj5DaGFydEluc3RhbmNlQ2FzdGVkLnNjcm9sbGJhclgpLnNlcmllcy5wdXNoKHMpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuTGVnZW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQgPSBuZXcgYW00Y2hhcnRzLkxlZ2VuZCgpO1xyXG4gICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kLnBvc2l0aW9uID0gc2V0dGluZ3M/LkxlZ2VuZFBvc2l0aW9uID8/ICdyaWdodCc7XHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5sZWdlbmQuc2Nyb2xsYWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UubGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlLnRvb2x0aXBUZXh0ID0gXCJ7bmFtZX1cIjtcclxuICAgICAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLmxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS5ldmVudHMub24oXCJvdmVyXCIsIChldmVudCkgPT4geyB0aGlzLnByb2Nlc3NPdmVyKDxhbTRjaGFydHMuTGluZVNlcmllcz5ldmVudC50YXJnZXQuZGF0YUl0ZW0uZGF0YUNvbnRleHQsIGZpbGwpOyB9KTtcclxuICAgICAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLmxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS5ldmVudHMub24oXCJvdXRcIiwgKGV2ZW50KSA9PiB7IHRoaXMucHJvY2Vzc091dChmaWxsKTsgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuTGVnZW5kUGFkZGluZykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5DaGFydEluc3RhbmNlLmxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdUb3AgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLnRvcCA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ0JvdHRvbSA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcuYm90dG9tID8/IDA7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nTGVmdCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcubGVmdCA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ1JpZ2h0ID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5yaWdodCA/PyAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UuY3Vyc29yID0gbmV3IGFtNGNoYXJ0cy5YWUN1cnNvcigpO1xyXG5cclxuICAgICAgICAvL1Byb3ZlKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgICAgLy8gdGhpcy5DaGFydEluc3RhbmNlLmN1cnNvci5ldmVudHMub24oXCJjdXJzb3Jwb3NpdGlvbmNoYW5nZWRcIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgLy8gICAgIC8vdmFyIHZhbHVlID0gZGF0ZUF4aXMucG9zaXRpb25Ub0RhdGUoZGF0ZUF4aXMudG9BeGlzUG9zaXRpb24oZXYudGFyZ2V0LnhQb3NpdGlvbikpO1xyXG4gICAgICAgIC8vICAgICB2YXIgZHQgPSBkYXRlQXhpcy5zZXJpZXMudmFsdWVzLmZpbmQodCA9PiB0LmRhdGFJdGVtLnZhbHVlcy5kYXRlWCk7XHJcbiAgICAgICAgLy8gICAgIGlmIChkdCAmJiBkdC5kYXRhSXRlbSkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2coZHQuZGF0YUl0ZW0udmFsdWVzKTtcclxuICAgICAgICAvLyAgICAgICAgIC8vIHRoaXMuQ2hhcnRJbnN0YW5jZS50b29sdGlwVGV4dCA9IGR0O1xyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGVsc2Uge1xyXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLnRvb2x0aXBUZXh0ID0gXCJcIjtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblxyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5jdXJzb3IueEF4aXMgPSBkYXRlQXhpcztcclxuICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UuY3Vyc29yLnlBeGlzID0geUF4aXM7XHJcbiAgICAgICAgaWYgKHNpbmdsZURhdGFTZXQpXHJcbiAgICAgICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5jdXJzb3IubWF4VG9vbHRpcERpc3RhbmNlID0gLTE7XHJcblxyXG4gICAgICAgIC8vVE9ETzogQ2VyY2FyZSBkaSBjYXBpcmUgcGVyY2jDqSDDqCBmaWdsaW8gZGkgcHV0dGFuYS4uLi4uLlxyXG4gICAgICAgIGRhdGVBeGlzLmV2ZW50cy5vbihcInN0YXJ0Y2hhbmdlZFwiLCB0ID0+IHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZWQodCwgc2V0dGluZ3MpKTtcclxuICAgICAgICBkYXRlQXhpcy5ldmVudHMub24oXCJlbmRjaGFuZ2VkXCIsIHQgPT4gdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlZCh0LCBzZXR0aW5ncykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwdWJsaWMgcmVmcmVzaERhdGEoZGF0YTogTGluZUNoYXJ0RGF0YSB8IGFueSkge1xyXG4gICAgICAgIC8vVE9ETzpJTVBMXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgZW1pdFNlbGVjdGlvbkNoYW5nZWQoZXYsIHNldHRpbmdzKSB7XHJcbiAgICAgICAgaWYgKCg8YW55PnNldHRpbmdzKS5PblNlbGVjdGlvbkNoYW5nZWRDYWxsYmFjaykge1xyXG4gICAgICAgICAgICB0aGlzLnRocm90dGxhKFwic2VsY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHZhciBheGlzID0gPGFtNGNoYXJ0cy5EYXRlQXhpcz5ldi50YXJnZXRcclxuICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKGF4aXMubWluWm9vbWVkKTtcclxuICAgICAgICAgICAgICAgIHZhciBlbmQgPSBuZXcgRGF0ZShheGlzLm1heFpvb21lZCk7XHJcbiAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbCA9IGF4aXMubWluID09IGF4aXMubWluWm9vbWVkICYmIGF4aXMubWF4ID09IGF4aXMubWF4Wm9vbWVkO1xyXG4gICAgICAgICAgICAgICAgKDxhbnk+c2V0dGluZ3MpLk9uU2VsZWN0aW9uQ2hhbmdlZENhbGxiYWNrKHsgZnJvbTogc3RhcnQsIHRvOiBlbmQsIGluaXRpYWw6IGluaXRpYWwgfSk7XHJcbiAgICAgICAgICAgIH0sIDE1MClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc092ZXIoaG92ZXJlZFNlcmllczogYW00Y2hhcnRzLkxpbmVTZXJpZXMsIGZpbGw6IGJvb2xlYW4pIHtcclxuICAgICAgICBob3ZlcmVkU2VyaWVzLnRvRnJvbnQoKTtcclxuXHJcbiAgICAgICAgaG92ZXJlZFNlcmllcy5zZWdtZW50cy5lYWNoKChzZWdtZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHNlZ21lbnQuc2V0U3RhdGUoXCJob3ZlclwiKTtcclxuICAgICAgICAgICAgaWYgKCFmaWxsKVxyXG4gICAgICAgICAgICAgICAgc2VnbWVudC5maWxsU3ByaXRlLmZpbGxPcGFjaXR5ID0gdGhpcy5PcGFjaXR5T25TZWxlY3RlZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoIWZpbGwpXHJcbiAgICAgICAgICAgIGhvdmVyZWRTZXJpZXMubGVnZW5kRGF0YUl0ZW0ubWFya2VyLmNoaWxkcmVuLmdldEluZGV4KDEpLmZpbGxPcGFjaXR5ID0gdGhpcy5PcGFjaXR5T25TZWxlY3RlZDtcclxuXHJcbiAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLnNlcmllcy5lYWNoKChzZXJpZXMpID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlcmllcyAhPSBob3ZlcmVkU2VyaWVzKVxyXG4gICAgICAgICAgICAgICAgKDxhbTRjaGFydHMuTGluZVNlcmllcz5zZXJpZXMpLnNlZ21lbnRzLmVhY2goKHNlZ21lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZWdtZW50LnNldFN0YXRlKFwiZGltbWVkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsbClcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5maWxsU3ByaXRlLmZpbGxPcGFjaXR5ID0gMDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NPdXQoZmlsbDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZS5zZXJpZXMuZWFjaCgoc2VyaWVzKSA9PiB7XHJcbiAgICAgICAgICAgICg8YW00Y2hhcnRzLkxpbmVTZXJpZXM+c2VyaWVzKS5zZWdtZW50cy5lYWNoKChzZWdtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZWdtZW50LnNldFN0YXRlKFwiZGVmYXVsdFwiKTtcclxuICAgICAgICAgICAgICAgIGlmICghZmlsbClcclxuICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmZpbGxTcHJpdGUuZmlsbE9wYWNpdHkgPSAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCFmaWxsKVxyXG4gICAgICAgICAgICAgICAgc2VyaWVzLmxlZ2VuZERhdGFJdGVtLm1hcmtlci5jaGlsZHJlbi5nZXRJbmRleCgxKS5maWxsT3BhY2l0eSA9IDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8qKioqKioqKioqKioqKioqKioqKiBGdW56aW9uZSBkaSB0aHJvdHRsaW5nIHBlciBub24gc3BhbW1hcmUgcmljaGllc3RlIGluIGNhc28gZGkgYW5pbWF6aW9uaSBhdHRpdmF0ZVxyXG4gICAgLy9UT0RPOiBzcG9zdGFybGEgaW4gdW4gbWV0b2RvIGRpIHV0aWxpdMOgIChlc2ZhZW56YS9leHRlbnNpb25zKVxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgZXhlY3V0aW9uVGltZXJzOiB7IFtpbmRleDogc3RyaW5nXTogYW55IH0gPSB7fTtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIHRocm90dGxhKGlkOiBzdHJpbmcsIGZ1bmM6IEZ1bmN0aW9uLCB0aHJvdHRsZVRpbWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIC8vU2UgaG8gbGEgZnVuemlvbmUgY2hlIHZ1b2xlIGVzZWd1aXJlIHJpcHVsaXNjbyBxdWVsIHRpbWVvdXRcclxuICAgICAgICBpZiAodGhpcy5leGVjdXRpb25UaW1lcnNbaWRdKVxyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5leGVjdXRpb25UaW1lcnNbaWRdKTtcclxuXHJcbiAgICAgICAgLy9SaWNyZW8gaWwgdGltZW91dCBwZXIgZXNlZ3VpcmUgcXVlbGxhIGZ1bnppb25lIGRvcG8gdGhyb3R0bGVUaW1lIG1pbGxpc2Vjb25kaVxyXG4gICAgICAgIHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSA9IHNldFRpbWVvdXQoKCkgPT4geyBmdW5jKCk7IHRoaXMuZXhlY3V0aW9uVGltZXJzW2lkXSA9IG51bGw7IH0sIHRocm90dGxlVGltZSk7XHJcbiAgICB9XHJcbiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKipcclxufSJdfQ==
@@ -1,112 +0,0 @@
1
- import * as am4core from "@amcharts/amcharts4/core";
2
- import * as am4charts from "@amcharts/amcharts4/charts";
3
- /**
4
- * Classe il cui unico scopo è gestire il setup e rendering di un PieChart
5
- */
6
- export class PieChartService {
7
- /** @ignore */
8
- constructor(Adapter) {
9
- this.Adapter = Adapter;
10
- /** @ignore */
11
- this.ViewAbsoluteValues = true;
12
- }
13
- /**
14
- * Metodo che data una coppia Dati - Impostazioni li utilizza per creare e visualizzare un PieChart
15
- */
16
- graphicate(data, settings) {
17
- var _a, _b, _c, _d;
18
- if (settings.Timeline) {
19
- console.error("Timeline not supported for pie chart");
20
- return null;
21
- }
22
- //Per evitare di dimenticarmeli e gestire comunque bene gli ngif ecc...
23
- am4core.options.autoDispose = true;
24
- this.ChartInstance = am4core.create(settings.Name, settings.Mode3D ? am4charts.PieChart3D : am4charts.PieChart);
25
- this.ChartInstance.innerRadius = ((settings.DonutRadiusPercentage || 15) / 100) * settings.ContainerHeight;
26
- let series = this.ChartInstance.series.push(settings.Mode3D ? new am4charts.PieSeries3D() : new am4charts.PieSeries());
27
- series.dataFields.value = "v";
28
- series.dataFields.category = "k";
29
- //Il default sono valori percentuali
30
- if (this.ViewAbsoluteValues) {
31
- series.legendSettings.valueText = "{value}";
32
- series.labels.template.text = "{category}: [bold]{value}[/]";
33
- }
34
- series.slices.template.stroke = am4core.color("#fff");
35
- series.slices.template.strokeOpacity = 1;
36
- series.slices.template.togglable = false;
37
- series.hiddenState.properties.opacity = 1;
38
- series.hiddenState.properties.endAngle = -90;
39
- series.hiddenState.properties.startAngle = -90;
40
- if (settings.HideZeroes == null ? true : settings.HideZeroes) {
41
- series.ticks.template.events.on("ready", this.hideZeroes);
42
- series.ticks.template.events.on("visibilitychanged", this.hideZeroes);
43
- series.labels.template.events.on("ready", this.hideZeroes);
44
- series.labels.template.events.on("visibilitychanged", this.hideZeroes);
45
- }
46
- series.slices.template.events.on("hit", (ev) => {
47
- if (settings.OnSeriesClickCallback) {
48
- let clickedSeries = ev.target.dataItem.dataContext.k;
49
- settings.OnSeriesClickCallback(clickedSeries);
50
- }
51
- });
52
- let dataConverted = this.Adapter ? this.Adapter.adaptDataForPieChart(data) : data;
53
- let defaultIndex = 0;
54
- for (let i = 0; i < dataConverted.values.length; i++) {
55
- if (!dataConverted.values[i].c) {
56
- dataConverted.values[i].c = this.ChartInstance.colors.list[defaultIndex % this.ChartInstance.colors.list.length];
57
- defaultIndex++;
58
- }
59
- else
60
- dataConverted.values[i].c = am4core.color(dataConverted.values[i].c);
61
- }
62
- series.slices.template.propertyFields.fill = "c";
63
- this.ChartInstance.data = dataConverted.values;
64
- if (!settings.LabelsVisible) {
65
- series.labels.template.disabled = true;
66
- series.ticks.template.disabled = true;
67
- }
68
- else if (settings.LabelsWrap || settings.LabelsTruncate) {
69
- series.labels.template.maxWidth = settings.LabelsWidth || 100;
70
- if (settings.LabelsWrap)
71
- series.labels.template.wrap = true;
72
- else if (settings.LabelsTruncate)
73
- series.labels.template.truncate = true;
74
- }
75
- if (settings.Legend) {
76
- let legend = new am4charts.Legend();
77
- this.ChartInstance.legend = legend;
78
- legend.position = (settings === null || settings === void 0 ? void 0 : settings.LegendPosition) || "bottom";
79
- legend.itemContainers.template.togglable = settings.HideSeriesOnLabelClick === true;
80
- legend.itemContainers.template.tooltipText = "{category}";
81
- //Se la legenda non fa il toggle della serie la considero come se fosse un click sulla serie in se
82
- if (!settings.HideSeriesOnLabelClick) {
83
- legend.itemContainers.template.events.on("hit", (ev) => {
84
- if (settings.OnSeriesClickCallback) {
85
- let clickedSeries = ev.target.dataItem.dataContext.legendDataItem.name;
86
- settings.OnSeriesClickCallback(clickedSeries);
87
- }
88
- });
89
- }
90
- if (settings.LegendPadding) {
91
- let template = this.ChartInstance.legend.itemContainers.template;
92
- template.paddingTop = (_a = settings.LegendPadding.top) !== null && _a !== void 0 ? _a : 0;
93
- template.paddingBottom = (_b = settings.LegendPadding.bottom) !== null && _b !== void 0 ? _b : 0;
94
- template.paddingLeft = (_c = settings.LegendPadding.left) !== null && _c !== void 0 ? _c : 0;
95
- template.paddingRight = (_d = settings.LegendPadding.right) !== null && _d !== void 0 ? _d : 0;
96
- }
97
- }
98
- return this;
99
- }
100
- /** @ignore */
101
- refreshData(data) {
102
- //TODO:IMPL
103
- }
104
- /** @ignore */
105
- hideZeroes(ev) {
106
- if (ev.target.dataItem && (ev.target.dataItem.values.value.percent == 0))
107
- ev.target.hide();
108
- else
109
- ev.target.show();
110
- }
111
- }
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGllQ2hhcnRTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvc2VydmljZXMvY2xhc3Nlcy9QaWVDaGFydFNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxLQUFLLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEtBQUssU0FBUyxNQUFNLDRCQUE0QixDQUFDO0FBRXhEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFNeEIsY0FBYztJQUNkLFlBQW1CLE9BQW9CO1FBQXBCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFKdkMsY0FBYztRQUNOLHVCQUFrQixHQUFZLElBQUksQ0FBQztJQUdBLENBQUM7SUFFNUM7O09BRUc7SUFDSSxVQUFVLENBQUMsSUFBd0IsRUFBRSxRQUEwQjs7UUFDbEUsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsdUVBQXVFO1FBQ3ZFLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEgsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBUyxRQUFTLENBQUMsZUFBZSxDQUFDO1FBRWxILElBQUksTUFBTSxHQUFnRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1B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QUFHLE1BQUEsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLG1DQUFJLENBQUMsQ0FBQztnQkFDeEQsUUFBUSxDQUFDLFlBQVksR0FBRyxNQUFBLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxtQ0FBSSxDQUFDLENBQUM7YUFDN0Q7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxjQUFjO0lBQ1AsV0FBVyxDQUFDLElBQXdCO1FBQ3ZDLFdBQVc7SUFDZixDQUFDO0lBRUQsY0FBYztJQUNOLFVBQVUsQ0FBQyxFQUFFO1FBQ2pCLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7WUFDcEUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7WUFFakIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQmFzZVNlcnZpY2UgfSBmcm9tICcuL2Jhc2UvSUJhc2VTZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9hZGFwdGVycyc7XHJcbmltcG9ydCB7IFBpZUNoYXJ0RGF0YSwgS2V5VmFsdWVDb2xvciB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRhJztcclxuaW1wb3J0IHsgUGllQ2hhcnRTZXR0aW5ncyB9IGZyb20gJy4uLy4uL21vZGVscy9zZXR0aW5ncyc7XHJcblxyXG5pbXBvcnQgKiBhcyBhbTRjb3JlIGZyb20gXCJAYW1jaGFydHMvYW1jaGFydHM0L2NvcmVcIjtcclxuaW1wb3J0ICogYXMgYW00Y2hhcnRzIGZyb20gXCJAYW1jaGFydHMvYW1jaGFydHM0L2NoYXJ0c1wiO1xyXG5cclxuLyoqXHJcbiAqIENsYXNzZSBpbCBjdWkgdW5pY28gc2NvcG8gw6ggZ2VzdGlyZSBpbCBzZXR1cCBlIHJlbmRlcmluZyBkaSB1biBQaWVDaGFydFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFBpZUNoYXJ0U2VydmljZSBpbXBsZW1lbnRzIElCYXNlU2VydmljZTxhbTRjaGFydHMuUGllQ2hhcnQ+e1xyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHB1YmxpYyBDaGFydEluc3RhbmNlOiBhbTRjaGFydHMuUGllQ2hhcnQzRCB8IGFtNGNoYXJ0cy5QaWVDaGFydDtcclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIFZpZXdBYnNvbHV0ZVZhbHVlczogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBBZGFwdGVyOiBCYXNlQWRhcHRlcikgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIGRhdGEgdW5hIGNvcHBpYSBEYXRpIC0gSW1wb3N0YXppb25pIGxpIHV0aWxpenphIHBlciBjcmVhcmUgZSB2aXN1YWxpenphcmUgdW4gUGllQ2hhcnRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdyYXBoaWNhdGUoZGF0YTogUGllQ2hhcnREYXRhIHwgYW55LCBzZXR0aW5nczogUGllQ2hhcnRTZXR0aW5ncyk6IElCYXNlU2VydmljZTxhbTRjaGFydHMuUGllQ2hhcnQ+IHtcclxuICAgICAgICBpZiAoc2V0dGluZ3MuVGltZWxpbmUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRpbWVsaW5lIG5vdCBzdXBwb3J0ZWQgZm9yIHBpZSBjaGFydFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL1BlciBldml0YXJlIGRpIGRpbWVudGljYXJtZWxpIGUgZ2VzdGlyZSBjb211bnF1ZSBiZW5lIGdsaSBuZ2lmIGVjYy4uLlxyXG4gICAgICAgIGFtNGNvcmUub3B0aW9ucy5hdXRvRGlzcG9zZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuQ2hhcnRJbnN0YW5jZSA9IGFtNGNvcmUuY3JlYXRlKHNldHRpbmdzLk5hbWUsIHNldHRpbmdzLk1vZGUzRCA/IGFtNGNoYXJ0cy5QaWVDaGFydDNEIDogYW00Y2hhcnRzLlBpZUNoYXJ0KTtcclxuICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UuaW5uZXJSYWRpdXMgPSAoKHNldHRpbmdzLkRvbnV0UmFkaXVzUGVyY2VudGFnZSB8fCAxNSkgLyAxMDApICogKDxhbnk+c2V0dGluZ3MpLkNvbnRhaW5lckhlaWdodDtcclxuXHJcbiAgICAgICAgbGV0IHNlcmllczogYW00Y2hhcnRzLlBpZVNlcmllczNEIHwgYW00Y2hhcnRzLlBpZVNlcmllcyA9IHRoaXMuQ2hhcnRJbnN0YW5jZS5zZXJpZXMucHVzaChzZXR0aW5ncy5Nb2RlM0QgPyBuZXcgYW00Y2hhcnRzLlBpZVNlcmllczNEKCkgOiBuZXcgYW00Y2hhcnRzLlBpZVNlcmllcygpKTtcclxuICAgICAgICBzZXJpZXMuZGF0YUZpZWxkcy52YWx1ZSA9IFwidlwiO1xyXG4gICAgICAgIHNlcmllcy5kYXRhRmllbGRzLmNhdGVnb3J5ID0gXCJrXCI7XHJcbiAgICAgICAgLy9JbCBkZWZhdWx0IHNvbm8gdmFsb3JpIHBlcmNlbnR1YWxpXHJcbiAgICAgICAgaWYgKHRoaXMuVmlld0Fic29sdXRlVmFsdWVzKSB7XHJcbiAgICAgICAgICAgIHNlcmllcy5sZWdlbmRTZXR0aW5ncy52YWx1ZVRleHQgPSBcInt2YWx1ZX1cIjtcclxuICAgICAgICAgICAgc2VyaWVzLmxhYmVscy50ZW1wbGF0ZS50ZXh0ID0gXCJ7Y2F0ZWdvcnl9OiBbYm9sZF17dmFsdWV9Wy9dXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VyaWVzLnNsaWNlcy50ZW1wbGF0ZS5zdHJva2UgPSBhbTRjb3JlLmNvbG9yKFwiI2ZmZlwiKTtcclxuICAgICAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnN0cm9rZU9wYWNpdHkgPSAxO1xyXG4gICAgICAgIHNlcmllcy5zbGljZXMudGVtcGxhdGUudG9nZ2xhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgc2VyaWVzLmhpZGRlblN0YXRlLnByb3BlcnRpZXMub3BhY2l0eSA9IDE7XHJcbiAgICAgICAgc2VyaWVzLmhpZGRlblN0YXRlLnByb3BlcnRpZXMuZW5kQW5nbGUgPSAtOTA7XHJcbiAgICAgICAgc2VyaWVzLmhpZGRlblN0YXRlLnByb3BlcnRpZXMuc3RhcnRBbmdsZSA9IC05MDtcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLkhpZGVaZXJvZXMgPT0gbnVsbCA/IHRydWUgOiBzZXR0aW5ncy5IaWRlWmVyb2VzKSB7XHJcbiAgICAgICAgICAgIHNlcmllcy50aWNrcy50ZW1wbGF0ZS5ldmVudHMub24oXCJyZWFkeVwiLCB0aGlzLmhpZGVaZXJvZXMpO1xyXG4gICAgICAgICAgICBzZXJpZXMudGlja3MudGVtcGxhdGUuZXZlbnRzLm9uKFwidmlzaWJpbGl0eWNoYW5nZWRcIiwgdGhpcy5oaWRlWmVyb2VzKTtcclxuICAgICAgICAgICAgc2VyaWVzLmxhYmVscy50ZW1wbGF0ZS5ldmVudHMub24oXCJyZWFkeVwiLCB0aGlzLmhpZGVaZXJvZXMpO1xyXG4gICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLmV2ZW50cy5vbihcInZpc2liaWxpdHljaGFuZ2VkXCIsIHRoaXMuaGlkZVplcm9lcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLmV2ZW50cy5vbihcImhpdFwiLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgaWYgKCg8YW55PnNldHRpbmdzKS5PblNlcmllc0NsaWNrQ2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgIGxldCBjbGlja2VkU2VyaWVzID0gKDxLZXlWYWx1ZUNvbG9yPmV2LnRhcmdldC5kYXRhSXRlbS5kYXRhQ29udGV4dCkuaztcclxuICAgICAgICAgICAgICAgICg8YW55PnNldHRpbmdzKS5PblNlcmllc0NsaWNrQ2FsbGJhY2soY2xpY2tlZFNlcmllcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGFDb252ZXJ0ZWQ6IFBpZUNoYXJ0RGF0YSA9IHRoaXMuQWRhcHRlciA/IHRoaXMuQWRhcHRlci5hZGFwdERhdGFGb3JQaWVDaGFydChkYXRhKSA6IGRhdGE7XHJcblxyXG4gICAgICAgIGxldCBkZWZhdWx0SW5kZXggPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUNvbnZlcnRlZC52YWx1ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKCFkYXRhQ29udmVydGVkLnZhbHVlc1tpXS5jKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhQ29udmVydGVkLnZhbHVlc1tpXS5jID0gPGFueT50aGlzLkNoYXJ0SW5zdGFuY2UuY29sb3JzLmxpc3RbZGVmYXVsdEluZGV4ICUgdGhpcy5DaGFydEluc3RhbmNlLmNvbG9ycy5saXN0Lmxlbmd0aF07XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0SW5kZXgrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBkYXRhQ29udmVydGVkLnZhbHVlc1tpXS5jID0gPGFueT5hbTRjb3JlLmNvbG9yKGRhdGFDb252ZXJ0ZWQudmFsdWVzW2ldLmMpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXJpZXMuc2xpY2VzLnRlbXBsYXRlLnByb3BlcnR5RmllbGRzLmZpbGwgPSBcImNcIjtcclxuICAgICAgICB0aGlzLkNoYXJ0SW5zdGFuY2UuZGF0YSA9IGRhdGFDb252ZXJ0ZWQudmFsdWVzO1xyXG5cclxuICAgICAgICBpZiAoIXNldHRpbmdzLkxhYmVsc1Zpc2libGUpIHtcclxuICAgICAgICAgICAgc2VyaWVzLmxhYmVscy50ZW1wbGF0ZS5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlcmllcy50aWNrcy50ZW1wbGF0ZS5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNldHRpbmdzLkxhYmVsc1dyYXAgfHwgc2V0dGluZ3MuTGFiZWxzVHJ1bmNhdGUpIHtcclxuICAgICAgICAgICAgc2VyaWVzLmxhYmVscy50ZW1wbGF0ZS5tYXhXaWR0aCA9IHNldHRpbmdzLkxhYmVsc1dpZHRoIHx8IDEwMDtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLkxhYmVsc1dyYXApXHJcbiAgICAgICAgICAgICAgICBzZXJpZXMubGFiZWxzLnRlbXBsYXRlLndyYXAgPSB0cnVlO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChzZXR0aW5ncy5MYWJlbHNUcnVuY2F0ZSlcclxuICAgICAgICAgICAgICAgIHNlcmllcy5sYWJlbHMudGVtcGxhdGUudHJ1bmNhdGUgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLkxlZ2VuZCkge1xyXG4gICAgICAgICAgICBsZXQgbGVnZW5kID0gbmV3IGFtNGNoYXJ0cy5MZWdlbmQoKTtcclxuICAgICAgICAgICAgdGhpcy5DaGFydEluc3RhbmNlLmxlZ2VuZCA9IGxlZ2VuZFxyXG4gICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBzZXR0aW5ncz8uTGVnZW5kUG9zaXRpb24gfHwgXCJib3R0b21cIjtcclxuICAgICAgICAgICAgbGVnZW5kLml0ZW1Db250YWluZXJzLnRlbXBsYXRlLnRvZ2dsYWJsZSA9IHNldHRpbmdzLkhpZGVTZXJpZXNPbkxhYmVsQ2xpY2sgPT09IHRydWU7XHJcbiAgICAgICAgICAgIGxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZS50b29sdGlwVGV4dCA9IFwie2NhdGVnb3J5fVwiO1xyXG5cclxuICAgICAgICAgICAgLy9TZSBsYSBsZWdlbmRhIG5vbiBmYSBpbCB0b2dnbGUgZGVsbGEgc2VyaWUgbGEgY29uc2lkZXJvIGNvbWUgc2UgZm9zc2UgdW4gY2xpY2sgc3VsbGEgc2VyaWUgaW4gc2VcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5IaWRlU2VyaWVzT25MYWJlbENsaWNrKSB7XHJcbiAgICAgICAgICAgICAgICBsZWdlbmQuaXRlbUNvbnRhaW5lcnMudGVtcGxhdGUuZXZlbnRzLm9uKFwiaGl0XCIsIChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgoPGFueT5zZXR0aW5ncykuT25TZXJpZXNDbGlja0NhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGlja2VkU2VyaWVzID0gKDxhbnk+ZXYudGFyZ2V0LmRhdGFJdGVtLmRhdGFDb250ZXh0KS5sZWdlbmREYXRhSXRlbS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoPGFueT5zZXR0aW5ncykuT25TZXJpZXNDbGlja0NhbGxiYWNrKGNsaWNrZWRTZXJpZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3MuTGVnZW5kUGFkZGluZykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5DaGFydEluc3RhbmNlLmxlZ2VuZC5pdGVtQ29udGFpbmVycy50ZW1wbGF0ZTtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlLnBhZGRpbmdUb3AgPSBzZXR0aW5ncy5MZWdlbmRQYWRkaW5nLnRvcCA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ0JvdHRvbSA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcuYm90dG9tID8/IDA7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5wYWRkaW5nTGVmdCA9IHNldHRpbmdzLkxlZ2VuZFBhZGRpbmcubGVmdCA/PyAwO1xyXG4gICAgICAgICAgICAgICAgdGVtcGxhdGUucGFkZGluZ1JpZ2h0ID0gc2V0dGluZ3MuTGVnZW5kUGFkZGluZy5yaWdodCA/PyAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIHJlZnJlc2hEYXRhKGRhdGE6IFBpZUNoYXJ0RGF0YSB8IGFueSl7XHJcbiAgICAgICAgLy9UT0RPOklNUExcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGlnbm9yZSAqL1xyXG4gICAgcHJpdmF0ZSBoaWRlWmVyb2VzKGV2KSB7XHJcbiAgICAgICAgaWYgKGV2LnRhcmdldC5kYXRhSXRlbSAmJiAoZXYudGFyZ2V0LmRhdGFJdGVtLnZhbHVlcy52YWx1ZS5wZXJjZW50ID09IDApKVxyXG4gICAgICAgICAgICBldi50YXJnZXQuaGlkZSgpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgZXYudGFyZ2V0LnNob3coKTtcclxuICAgIH1cclxufSJdfQ==