axidio-styleguide-library1-v2 0.2.20 → 0.2.21

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.
@@ -28,344 +28,205 @@ export class GuageChartComponent extends ComponentUniqueId {
28
28
  svgHeight: 80,
29
29
  low_colorMap: ['#43CC00', '#FFEF0C', '#FF4E0C'],
30
30
  high_colorMap: ['#FF4E0C', '#FFEF0C', '#43CC00'],
31
- isHeaderVisible: undefined,
32
31
  pointerWidth: 10,
33
32
  pointerTailLength: 5,
34
33
  pointerHeadLengthPercent: 0.7,
35
34
  labelInset: 10,
36
35
  legendJustified: false,
37
36
  backgroundColor: '#FFFFFF',
38
- isDrilldownChart: undefined,
39
37
  ringScaleFactor: 0,
40
38
  textsAtCenterScaleFactor: 0,
41
39
  currentValueWidthScaleFactor: 60,
42
40
  currentValueHeightScaleFactor: 30,
43
41
  pointerColor: '#686868',
44
- isToggleVisible: undefined,
45
- selectedKpiTooltop: undefined,
46
- isValueLableAdjust: undefined,
47
- isTitleHidden: undefined,
48
42
  headerMenuOptions: HeaderConfigHelper.headerConfig.headerMenuOptions,
49
43
  };
50
44
  }
51
45
  get isAlertEnabled() {
52
- return this.chartConfiguration?.headerMenuOptions?.some(option => option.id === 'editAlert');
46
+ return (this.chartConfiguration?.headerMenuOptions?.some((option) => option.id === 'editAlert') ?? false);
53
47
  }
54
- ngOnChanges() {
55
- let self = this;
56
- d3.select('#' + self.uniqueId).remove();
57
- this.initializeLineChart();
48
+ ngOnInit() {
49
+ this.buildChart();
50
+ }
51
+ ngOnChanges(changes) {
52
+ if (changes['chartData'] || changes['customChartConfiguration']) {
53
+ this.rebuildChart();
54
+ }
58
55
  }
59
56
  onResized(event) {
60
- let self = this;
61
- d3.select('#' + self.uniqueId).remove();
62
- this.initializeLineChart();
57
+ this.rebuildChart();
63
58
  }
64
- ngOnInit() { }
65
- initializeLineChart() {
66
- var self = this;
67
- let data = [];
68
- let metaData = null;
69
- let colorMaps = [];
70
- let angleValue = [];
71
- let data_ready = [];
72
- let labelArray = [];
73
- let colorType = null;
74
- let isria = this.customChartConfiguration.isRia;
75
- for (var i in this.defaultConfiguration) {
76
- this.chartConfiguration[i] = ChartHelper.getValueByConfigurationType(i, this.defaultConfiguration, this.customChartConfiguration);
77
- }
78
- data = this.chartData.data;
79
- metaData = this.chartData.metaData;
80
- colorType = metaData.colorType;
81
- if (colorType == 'low') {
82
- colorMaps = this.chartConfiguration.low_colorMap;
83
- }
84
- else {
85
- colorMaps = this.chartConfiguration.high_colorMap;
86
- }
59
+ rebuildChart() {
60
+ d3.select(`#${this.uniqueId}`).remove();
61
+ this.buildChart();
62
+ }
63
+ buildChart() {
64
+ if (!this.chartData?.data || !this.chartData?.metaData)
65
+ return;
66
+ this.mergeConfigurations();
67
+ this.processDataAndRender();
68
+ }
69
+ mergeConfigurations() {
70
+ Object.keys(this.defaultConfiguration).forEach((key) => {
71
+ this.chartConfiguration[key] = ChartHelper.getValueByConfigurationType(key, this.defaultConfiguration, this.customChartConfiguration);
72
+ });
73
+ this.isHeaderVisible =
74
+ this.chartConfiguration.isHeaderVisible ?? this.isHeaderVisible;
75
+ }
76
+ processDataAndRender() {
77
+ const { data, metaData } = this.chartData;
78
+ const colorMap = metaData.colorType === 'low'
79
+ ? this.chartConfiguration.low_colorMap
80
+ : this.chartConfiguration.high_colorMap;
81
+ this.setDataType(metaData);
82
+ const diffs = data.slice(1).map((v, i) => v - data[i]);
83
+ const total = diffs.reduce((sum, val) => sum + val, 0);
84
+ const angles = this.computeAngles(diffs, total);
85
+ const container = d3.select(this.containerElt.nativeElement);
86
+ const width = parseInt(container.style('width')) -
87
+ this.chartConfiguration.margin.left -
88
+ this.chartConfiguration.margin.right;
89
+ const height = parseInt(d3.select(this.guagecontainerElt.nativeElement).style('height')) -
90
+ this.chartConfiguration.margin.top -
91
+ this.chartConfiguration.margin.bottom -
92
+ 56;
93
+ const radius = Math.min(width, height) / 2;
94
+ const svg = this.createSvg(container, width, height, radius);
95
+ this.drawArcs(svg, diffs, data, angles, colorMap, metaData, radius);
96
+ this.drawPointer(svg, data, metaData, radius);
97
+ this.drawLabels(svg, data, diffs, metaData, radius);
98
+ this.drawTextBlocks(svg, metaData, radius);
99
+ }
100
+ setDataType(metaData) {
87
101
  if (metaData.dataType) {
88
- this.dataType = metaData.dataType;
89
- if (this.dataType == 'USD') {
90
- this.datatype_status = true;
91
- this.dataType = '$ ';
92
- }
102
+ this.dataType = metaData.dataType === 'USD' ? '$ ' : metaData.dataType;
103
+ this.datatype_status = metaData.dataType === 'USD';
93
104
  }
94
- data.map(function (dataUnit, i) {
95
- if (i < data.length - 1) {
96
- let diff = data[i + 1] - data[i];
97
- data_ready.push(diff);
98
- }
99
- });
100
- var chartContainer = d3.select(this.containerElt.nativeElement);
101
- var guagecontainer = d3.select(this.guagecontainerElt.nativeElement);
102
- var margin = this.chartConfiguration.margin;
103
- var width = parseInt(chartContainer.style('width')) - margin.left - margin.right;
104
- var height = parseInt(guagecontainer.style('height')) -
105
- margin.top -
106
- margin.bottom -
107
- 56; //chart header height
108
- if (this.chartConfiguration.isHeaderVisible != undefined)
109
- this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
110
- var svg = chartContainer
105
+ }
106
+ computeAngles(values, total) {
107
+ return values.reduce((acc, unit, i) => {
108
+ const angle = (unit / total) * 180;
109
+ acc.push(i === 0 ? angle : acc[i - 1] + angle);
110
+ return acc;
111
+ }, []);
112
+ }
113
+ createSvg(container, width, height, radius) {
114
+ return container
111
115
  .append('svg')
112
- .attr('id', self.uniqueId)
113
- .attr('width', width + margin.left + margin.right)
114
- .attr('height', height + margin.top + margin.bottom)
116
+ .attr('id', this.uniqueId)
117
+ .attr('width', width + this.chartConfiguration.margin.left)
118
+ .attr('height', height + this.chartConfiguration.margin.top)
115
119
  .call(ChartHelper.responsivefy)
116
- .append('g');
117
- var radius = Math.min(width, height) / 2;
118
- if (this.chartConfiguration.isDrilldownChart) {
119
- this.chartConfiguration.currentValueWidthScaleFactor += 40;
120
- this.chartConfiguration.currentValueHeightScaleFactor += 20;
121
- }
122
- else {
123
- if (window.innerWidth > 1400) {
124
- this.chartConfiguration.currentValueHeightScaleFactor += 15;
125
- this.chartConfiguration.currentValueWidthScaleFactor *= 2;
126
- }
127
- }
128
- let topTextPosition = radius / 2 - 10;
129
- let midTextPosition = topTextPosition + this.chartConfiguration.currentValueHeightScaleFactor;
130
- let bottomTextPosition = midTextPosition + this.chartConfiguration.currentValueHeightScaleFactor;
131
- var data_length = data.length;
132
- function deg2rad(deg) {
133
- return (deg * Math.PI) / 180;
134
- }
135
- let tempArray = [];
136
- let total = 0;
137
- data_ready.map(function (unit) {
138
- total += unit;
139
- });
140
- data_ready.map(function (unit, i) {
141
- var angle = (unit / total) * 180;
142
- if (i === 0) {
143
- tempArray.push(angle);
144
- }
145
- else {
146
- let currentAngle = tempArray[i - 1] + angle;
147
- tempArray.push(currentAngle);
148
- }
149
- });
150
- angleValue = tempArray;
151
- var arc = d3
120
+ .append('g')
121
+ .attr('transform', `translate(${(parseInt(container.style('width')) / 2 - radius) +
122
+ this.chartConfiguration.margin.left},${this.chartConfiguration.margin.top})`);
123
+ }
124
+ drawArcs(svg, diffs, data, angles, colorMap, metaData, radius) {
125
+ const arc = d3
152
126
  .arc()
153
127
  .innerRadius(radius -
154
- self.chartConfiguration.ringWidth -
155
- self.chartConfiguration.ringInset)
128
+ this.chartConfiguration.ringWidth -
129
+ this.chartConfiguration.ringInset)
156
130
  .outerRadius(radius)
157
- .startAngle(function (d, i) {
158
- var ratio;
159
- if (i === 0) {
160
- ratio = self.chartConfiguration.minAngle;
161
- }
162
- else {
163
- ratio = self.chartConfiguration.minAngle + angleValue[i - 1];
164
- }
165
- return deg2rad(ratio);
166
- })
167
- .endAngle(function (d, i) {
168
- var ratio;
169
- if (i === data_ready.length - 1) {
170
- ratio = self.chartConfiguration.maxAngle;
171
- }
172
- else {
173
- ratio = self.chartConfiguration.minAngle + angleValue[i];
174
- }
175
- return deg2rad(ratio);
176
- });
177
- function centerTranslation() {
178
- return 'translate(' + radius + ',' + radius + ')';
179
- }
180
- var centerTx = centerTranslation();
181
- var tickData = d3
182
- .range(self.chartConfiguration.majorTicks)
183
- .map(function (i) {
184
- return 1 / self.chartConfiguration.majorTicks;
185
- });
186
- var arcs = svg.append('g').attr('class', 'arc').attr('transform', centerTx);
131
+ .startAngle((_, i) => this.deg2rad(i === 0
132
+ ? this.chartConfiguration.minAngle
133
+ : this.chartConfiguration.minAngle + angles[i - 1]))
134
+ .endAngle((_, i) => this.deg2rad(i === diffs.length - 1
135
+ ? this.chartConfiguration.maxAngle
136
+ : this.chartConfiguration.minAngle + angles[i]));
137
+ const arcs = svg
138
+ .append('g')
139
+ .attr('class', 'arc')
140
+ .attr('transform', `translate(${radius},${radius})`);
187
141
  arcs
188
142
  .selectAll('path')
189
- .data(data_ready)
143
+ .data(diffs)
190
144
  .enter()
191
145
  .append('path')
192
- .on('click', function (d) {
193
- if (!metaData.hasDrillDown || metaData.currentValue == 0) {
194
- return;
195
- }
196
- let range = getRange(d);
197
- self.handleClick(range);
198
- })
199
- .attr('fill', function (d, i) {
200
- return colorMaps[i];
201
- })
202
- .attr('id', function (d, i) {
203
- return colorMaps[i];
204
- })
205
146
  .attr('d', arc)
206
- // .style('cursor', 'pointer');
207
- .style('cursor', function (d) {
208
- if (metaData.currentValue > 0 && metaData.hasDrillDown && !isria)
209
- return 'pointer';
210
- else
211
- return 'default';
147
+ .attr('fill', (_, i) => colorMap[i])
148
+ .style('cursor', () => metaData.currentValue > 0 && metaData.hasDrillDown
149
+ ? 'pointer'
150
+ : 'default')
151
+ .on('click', (event, d) => {
152
+ if (metaData.hasDrillDown && metaData.currentValue > 0) {
153
+ this.handleClick(`${data[0]} - ${data[data.length - 1]}`);
154
+ }
212
155
  });
213
- let getRange = function (d) {
214
- let index = data_ready.indexOf(d);
215
- return data[0] + ' and ' + data[data.length - 1];
216
- };
217
- let pointerHeadLength = Math.round(radius * self.chartConfiguration.pointerHeadLengthPercent);
218
- var lineData = [
219
- [self.chartConfiguration.pointerWidth / 2, 0],
156
+ }
157
+ drawPointer(svg, data, metaData, radius) {
158
+ const pointerHeadLength = Math.round(radius * this.chartConfiguration.pointerHeadLengthPercent);
159
+ const pointerValue = metaData.currentValue - data[0];
160
+ const range = data[data.length - 1] - data[0];
161
+ const angle = this.chartConfiguration.minAngle + (pointerValue / range) * 180;
162
+ const lineData = [
163
+ [this.chartConfiguration.pointerWidth / 2, 0],
220
164
  [0, -pointerHeadLength],
221
- [-(self.chartConfiguration.pointerWidth / 2), 0],
222
- [0, self.chartConfiguration.pointerTailLength],
223
- [self.chartConfiguration.pointerWidth / 2, 0],
165
+ [-this.chartConfiguration.pointerWidth / 2, 0],
166
+ [0, this.chartConfiguration.pointerTailLength],
167
+ [this.chartConfiguration.pointerWidth / 2, 0],
224
168
  ];
225
- var pointerLine = d3.line();
226
- var pg = svg
169
+ const pointerLine = d3.line();
170
+ svg
227
171
  .append('g')
228
- .data([lineData])
229
172
  .attr('class', 'pointer')
230
- .attr('transform', centerTx);
231
- var pointerValue = metaData.currentValue - data[0];
232
- var range = data[data_length - 1] - data[0];
233
- var pointerAngle = self.chartConfiguration.minAngle + (pointerValue / range) * 180;
234
- pg.append('path')
235
- .attr('d', pointerLine)
236
- .attr('fill', self.chartConfiguration.pointerColor)
237
- .attr('transform', 'rotate(' +
238
- pointerAngle +
239
- ') translate(0,' +
240
- (-radius + self.chartConfiguration.ringWidth + pointerHeadLength) +
241
- ')');
242
- var lg = svg.append('g').attr('class', 'label').attr('transform', centerTx);
243
- let labelArrayTemp = [{ name: data[0], value: 0 }];
244
- let count = 0;
245
- data_ready.map(function (dataUnit, i) {
246
- count += dataUnit;
247
- let temp = { name: data[i + 1], value: count };
248
- labelArrayTemp.push(temp);
173
+ .attr('transform', `translate(${radius},${radius})`)
174
+ .append('path')
175
+ .attr('d', pointerLine(lineData))
176
+ .attr('fill', this.chartConfiguration.pointerColor)
177
+ .attr('transform', `rotate(${angle}) translate(0,${-radius + this.chartConfiguration.ringWidth + pointerHeadLength})`);
178
+ }
179
+ drawLabels(svg, data, diffs, metaData, radius) {
180
+ const range = data[data.length - 1] - data[0];
181
+ let cumulative = 0;
182
+ const labelArray = [{ name: data[0], value: 0 }];
183
+ diffs.forEach((diff, i) => {
184
+ cumulative += diff;
185
+ labelArray.push({ name: data[i + 1], value: cumulative });
249
186
  });
250
- labelArray = labelArrayTemp;
251
- lg.selectAll('.bubble')
187
+ const labels = svg
188
+ .append('g')
189
+ .attr('class', 'label')
190
+ .attr('transform', `translate(${radius},${radius})`);
191
+ labels
192
+ .selectAll('text')
252
193
  .data(labelArray)
253
194
  .enter()
254
- .append('g')
255
- .attr('transform', function (d) {
256
- var newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
257
- return ('rotate(' +
258
- newAngle +
259
- ') translate(0,' +
260
- (self.chartConfiguration.labelInset - radius - 20) +
261
- ')');
262
- })
263
- .append('g')
264
- .attr('transform', function (d, i) {
265
- var newAngle = self.chartConfiguration.minAngle + (d.value / range) * 180;
266
- if (i == 0 && self.chartConfiguration.isValueLableAdjust) {
267
- return 'rotate(' + (0 - newAngle) + ') translate(-27,0)';
268
- }
269
- if (i == labelArray.length - 1 &&
270
- self.chartConfiguration.isValueLableAdjust) {
271
- return 'rotate(' + (0 - newAngle) + ') translate(-15,0)';
272
- }
273
- return 'rotate(' + (0 - newAngle) + ') translate(-17,0)';
274
- })
275
195
  .append('text')
276
- .attr('style', function (d) {
277
- if (window.innerWidth < 1400)
278
- return 'font-size: ' + '12px' + '; font-weight:' + '600;';
279
- else
280
- return 'font-size: ' + '14px' + '; font-weight:' + '600;';
196
+ .attr('transform', (d) => {
197
+ const newAngle = this.chartConfiguration.minAngle + (d.value / range) * 180;
198
+ return `rotate(${newAngle}) translate(0,${this.chartConfiguration.labelInset - radius - 20}) rotate(${-newAngle})`;
281
199
  })
282
200
  .attr('fill', 'var(--chart-text-color)')
283
- .text(function (d) {
284
- if (metaData.dataType) {
285
- return d.name + metaData.dataType;
286
- }
287
- return d.name;
288
- });
289
- svg
290
- .append('foreignObject')
291
- .attr('transform', 'translate(' +
292
- (radius - this.chartConfiguration.currentValueWidthScaleFactor / 2) +
293
- ',' +
294
- topTextPosition +
295
- ')')
296
- .attr('width', this.chartConfiguration.currentValueWidthScaleFactor + 8)
297
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
298
- .append('xhtml:div')
299
- .attr('class', 'value-display')
300
- .style('height', this.chartConfiguration.currentValueHeightScaleFactor + 10 + 'px')
301
- .style('font-size', function () {
302
- if (window.innerWidth > 1500) {
303
- self.chartConfiguration.currentValueHeightScaleFactor - 25 + 'px';
304
- }
305
- else {
306
- self.chartConfiguration.currentValueHeightScaleFactor - 15 + 'px';
307
- }
308
- })
309
- .html(metaData.currentValue + metaData.dataType);
310
- if (metaData.status) {
311
- let widthTemp = metaData.status.length > 4 ? 210 : 120;
201
+ .style('font-size', window.innerWidth < 1400 ? '12px' : '14px')
202
+ .style('font-weight', 600)
203
+ .text((d) => `${d.name}${metaData.dataType ?? ''}`);
204
+ }
205
+ drawTextBlocks(svg, metaData, radius) {
206
+ const top = radius / 2 - 10;
207
+ const mid = top + this.chartConfiguration.currentValueHeightScaleFactor;
208
+ const bottom = mid + this.chartConfiguration.currentValueHeightScaleFactor;
209
+ const addText = (cls, text, y, width = 210) => {
312
210
  svg
313
211
  .append('foreignObject')
314
- .attr('transform', 'translate(' + (radius - widthTemp / 2) + ',' + midTextPosition + ')')
315
- .attr('width', widthTemp)
316
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor + 10)
212
+ .attr('transform', `translate(${radius - width / 2},${y})`)
213
+ .attr('width', width)
214
+ .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
317
215
  .append('xhtml:div')
318
- .attr('class', 'status-display')
319
- .style('font-size', this.chartConfiguration.currentValueHeightScaleFactor - 25 + 'px')
320
- .html(metaData.status);
321
- }
322
- svg
323
- .append('foreignObject')
324
- .attr('transform', 'translate(' + (radius - 105) + ',' + bottomTextPosition + ')')
325
- .attr('width', 210)
326
- .attr('height', this.chartConfiguration.currentValueHeightScaleFactor)
327
- .append('xhtml:div')
328
- .attr('class', 'daterange-display')
329
- .style('font-size', function () {
330
- if (self.chartConfiguration.isDrilldownChart) {
331
- {
332
- if (window.innerWidth < 1400)
333
- return '14px';
334
- else
335
- return '18px';
336
- }
337
- }
338
- else {
339
- if (window.innerWidth < 1400)
340
- return '14px';
341
- else
342
- return '18px';
343
- }
344
- })
345
- .html(function () {
346
- var desiredSize;
347
- if (window.innerWidth < 1400)
348
- desiredSize = '14px';
349
- else
350
- desiredSize = '18px';
351
- if (metaData.dateRange)
352
- return ('<span class="marginright-3"><i class="fa fa-calendar"></i></span><span> ' +
353
- metaData.dateRange +
354
- '</span>');
355
- else
356
- return '';
357
- });
358
- var containerMidWidth = parseInt(chartContainer.style('width')) / 2;
359
- var nodeHalfWidth = svg.node().getBoundingClientRect().width / 2;
360
- var updatedStartingPoint = containerMidWidth - nodeHalfWidth;
361
- svg.attr('transform', 'translate(' +
362
- (updatedStartingPoint + margin.left) +
363
- ',' +
364
- margin.top +
365
- ')');
216
+ .attr('class', cls)
217
+ .html(text);
218
+ };
219
+ addText('value-display', `${metaData.currentValue}${metaData.dataType ?? ''}`, top);
220
+ if (metaData.status)
221
+ addText('status-display', metaData.status, mid);
222
+ if (metaData.dateRange)
223
+ addText('daterange-display', `<i class="fa fa-calendar"></i> ${metaData.dateRange}`, bottom);
224
+ }
225
+ deg2rad(deg) {
226
+ return (deg * Math.PI) / 180;
366
227
  }
367
- handleClick(d) {
368
- this.clickEvent.emit(d);
228
+ handleClick(data) {
229
+ this.clickEvent.emit(data);
369
230
  }
370
231
  handleHeaderMenuClick(id) {
371
232
  this.headerMenuclickEvent.emit(id);
@@ -391,4 +252,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
391
252
  }], headerMenuclickEvent: [{
392
253
  type: Output
393
254
  }] } });
394
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsaUJBQWlCO0lBK0N4RDtRQUNFLEtBQUssRUFBRSxDQUFDO1FBdkNBLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekQsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBUSxFQUFFLENBQUM7UUFDbkIsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMsYUFBUSxHQUFRLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUVoQyx5QkFBb0IsR0FBUTtZQUMxQixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVB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WCxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJbEQsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHcEMsU0FBUztzQkFBakIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRVbmlxdWVJZCB9IGZyb20gJy4uL3VuaXF1ZS1pZCc7XHJcbmltcG9ydCBDaGFydEhlbHBlciBmcm9tICcuLi9jaGFydC1oZWxwZXInO1xyXG5pbXBvcnQgeyBSZXNpemVkRXZlbnQgfSBmcm9tICdhbmd1bGFyLXJlc2l6ZS1ldmVudCc7XHJcbmltcG9ydCBIZWFkZXJDb25maWdIZWxwZXIgZnJvbSAnLi4vaGVhZGVyLWNvbmZpZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1ndWFnZS1jaGFydCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2d1YWdlLWNoYXJ0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ndWFnZS1jaGFydC5jb21wb25lbnQubGVzcycsICcuLi9jb21tb24tc3R5bGVzLmxlc3MnXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3VhZ2VDaGFydENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlkIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAVmlld0NoaWxkKCdndWFnZWNoYXJ0Y29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBAVmlld0NoaWxkKCdndWFnZWNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgZ3VhZ2Vjb250YWluZXJFbHQhOiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBjaGFydERhdGE6IGFueTtcclxuICBASW5wdXQoKSBjdXN0b21DaGFydENvbmZpZ3VyYXRpb246IGFueTtcclxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBoZWFkZXJNZW51Y2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgZGF0YVR5cGU6IGFueSA9ICcnO1xyXG4gIGRhdGF0eXBlX3N0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHVuaXF1ZUlkOiBhbnkgPSB0aGlzLmdldFVuaXF1ZUlkKCk7XHJcbiAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgZGVmYXVsdENvbmZpZ3VyYXRpb246IGFueSA9IHtcclxuICAgIG1hcmdpbjogeyB0b3A6IDQwLCByaWdodDogMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDIwIH0sXHJcbiAgICBtaW5BbmdsZTogLTkwLFxyXG4gICAgbWF4QW5nbGU6IDkwLFxyXG4gICAgcmluZ0luc2V0OiAyMCxcclxuICAgIHJpbmdXaWR0aDogMjAsXHJcbiAgICBtYWpvclRpY2tzOiAzLFxyXG4gICAgc3ZnSGVpZ2h0OiA4MCxcclxuICAgIGxvd19jb2xvck1hcDogWycjNDNDQzAwJywgJyNGRkVGMEMnLCAnI0ZGNEUwQyddLFxyXG4gICAgaGlnaF9jb2xvck1hcDogWycjRkY0RTBDJywgJyNGRkVGMEMnLCAnIzQzQ0MwMCddLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBwb2ludGVyV2lkdGg6IDEwLFxyXG4gICAgcG9pbnRlclRhaWxMZW5ndGg6IDUsXHJcbiAgICBwb2ludGVySGVhZExlbmd0aFBlcmNlbnQ6IDAuNyxcclxuICAgIGxhYmVsSW5zZXQ6IDEwLFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiBmYWxzZSxcclxuICAgIGJhY2tncm91bmRDb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgaXNEcmlsbGRvd25DaGFydDogdW5kZWZpbmVkLFxyXG4gICAgcmluZ1NjYWxlRmFjdG9yOiAwLFxyXG4gICAgdGV4dHNBdENlbnRlclNjYWxlRmFjdG9yOiAwLFxyXG4gICAgY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvcjogNjAsXHJcbiAgICBjdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcjogMzAsXHJcbiAgICBwb2ludGVyQ29sb3I6ICcjNjg2ODY4JyxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgc2VsZWN0ZWRLcGlUb29sdG9wOiB1bmRlZmluZWQsXHJcbiAgICBpc1ZhbHVlTGFibGVBZGp1c3Q6IHVuZGVmaW5lZCxcclxuICAgIGlzVGl0bGVIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICByZXR1cm4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24/LmhlYWRlck1lbnVPcHRpb25zPy5zb21lKG9wdGlvbiA9PiBvcHRpb24uaWQgPT09ICdlZGl0QWxlcnQnKTtcclxufVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgIGQzLnNlbGVjdCgnIycgKyBzZWxmLnVuaXF1ZUlkKS5yZW1vdmUoKTtcclxuICAgIHRoaXMuaW5pdGlhbGl6ZUxpbmVDaGFydCgpO1xyXG4gIH1cclxuICBvblJlc2l6ZWQoZXZlbnQ6IFJlc2l6ZWRFdmVudCkge1xyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgZDMuc2VsZWN0KCcjJyArIHNlbGYudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0aWFsaXplTGluZUNoYXJ0KCk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge31cclxuXHJcbiAgaW5pdGlhbGl6ZUxpbmVDaGFydCgpIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuICAgIGxldCBkYXRhID0gW107XHJcbiAgICBsZXQgbWV0YURhdGE6IGFueSA9IG51bGw7XHJcbiAgICBsZXQgY29sb3JNYXBzID0gW107XHJcbiAgICBsZXQgYW5nbGVWYWx1ZSA9IFtdO1xyXG4gICAgbGV0IGRhdGFfcmVhZHk6IGFueSA9IFtdO1xyXG4gICAgbGV0IGxhYmVsQXJyYXk6IGFueSA9IFtdO1xyXG4gICAgbGV0IGNvbG9yVHlwZSA9IG51bGw7XHJcblxyXG4gICBsZXQgaXNyaWEgPSB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYVxyXG5cclxuICAgIGZvciAodmFyIGkgaW4gdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikge1xyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbltpXSA9IENoYXJ0SGVscGVyLmdldFZhbHVlQnlDb25maWd1cmF0aW9uVHlwZShcclxuICAgICAgICBpLFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuICAgIG1ldGFEYXRhID0gdGhpcy5jaGFydERhdGEubWV0YURhdGE7XHJcblxyXG4gICAgY29sb3JUeXBlID0gbWV0YURhdGEuY29sb3JUeXBlO1xyXG4gICAgaWYgKGNvbG9yVHlwZSA9PSAnbG93Jykge1xyXG4gICAgICBjb2xvck1hcHMgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sb3dfY29sb3JNYXA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb2xvck1hcHMgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5oaWdoX2NvbG9yTWFwO1xyXG4gICAgfVxyXG4gICAgaWYgKG1ldGFEYXRhLmRhdGFUeXBlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZTtcclxuICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT0gJ1VTRCcpIHtcclxuICAgICAgICB0aGlzLmRhdGF0eXBlX3N0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5kYXRhVHlwZSA9ICckICc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkYXRhLm1hcChmdW5jdGlvbiAoZGF0YVVuaXQsIGkpIHtcclxuICAgICAgaWYgKGkgPCBkYXRhLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICBsZXQgZGlmZiA9IGRhdGFbaSArIDFdIC0gZGF0YVtpXTtcclxuICAgICAgICBkYXRhX3JlYWR5LnB1c2goZGlmZik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHZhciBjaGFydENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIHZhciBndWFnZWNvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmd1YWdlY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdmFyIG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICAgIHZhciB3aWR0aCA9XHJcbiAgICAgIHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG5cclxuICAgIHZhciBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludChndWFnZWNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgbWFyZ2luLnRvcCAtXHJcbiAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICA1NjsgLy9jaGFydCBoZWFkZXIgaGVpZ2h0XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSAhPSB1bmRlZmluZWQpXHJcbiAgICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlO1xyXG5cclxuICAgIHZhciBzdmcgPSBjaGFydENvbnRhaW5lclxyXG4gICAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgICAuYXR0cignaWQnLCBzZWxmLnVuaXF1ZUlkKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCB3aWR0aCArIG1hcmdpbi5sZWZ0ICsgbWFyZ2luLnJpZ2h0KVxyXG4gICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pXHJcbiAgICAgIC5jYWxsKENoYXJ0SGVscGVyLnJlc3BvbnNpdmVmeSlcclxuICAgICAgLmFwcGVuZCgnZycpO1xyXG5cclxuICAgIHZhciByYWRpdXMgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XHJcblxyXG4gICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciArPSA0MDtcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgKz0gMjA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiAxNDAwKSB7XHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgKz0gMTU7XHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciAqPSAyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgdG9wVGV4dFBvc2l0aW9uID0gcmFkaXVzIC8gMiAtIDEwO1xyXG4gICAgbGV0IG1pZFRleHRQb3NpdGlvbiA9XHJcbiAgICAgIHRvcFRleHRQb3NpdGlvbiArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG4gICAgbGV0IGJvdHRvbVRleHRQb3NpdGlvbiA9XHJcbiAgICAgIG1pZFRleHRQb3NpdGlvbiArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG4gICAgdmFyIGRhdGFfbGVuZ3RoID0gZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgZnVuY3Rpb24gZGVnMnJhZChkZWcpIHtcclxuICAgICAgcmV0dXJuIChkZWcgKiBNYXRoLlBJKSAvIDE4MDtcclxuICAgIH1cclxuICAgIGxldCB0ZW1wQXJyYXk6IGFueSA9IFtdO1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIGRhdGFfcmVhZHkubWFwKGZ1bmN0aW9uICh1bml0KSB7XHJcbiAgICAgIHRvdGFsICs9IHVuaXQ7XHJcbiAgICB9KTtcclxuICAgIGRhdGFfcmVhZHkubWFwKGZ1bmN0aW9uICh1bml0LCBpKSB7XHJcbiAgICAgIHZhciBhbmdsZSA9ICh1bml0IC8gdG90YWwpICogMTgwO1xyXG4gICAgICBpZiAoaSA9PT0gMCkge1xyXG4gICAgICAgIHRlbXBBcnJheS5wdXNoKGFuZ2xlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgY3VycmVudEFuZ2xlID0gdGVtcEFycmF5W2kgLSAxXSArIGFuZ2xlO1xyXG4gICAgICAgIHRlbXBBcnJheS5wdXNoKGN1cnJlbnRBbmdsZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgYW5nbGVWYWx1ZSA9IHRlbXBBcnJheTtcclxuXHJcbiAgICB2YXIgYXJjID0gZDNcclxuICAgICAgLmFyYygpXHJcbiAgICAgIC5pbm5lclJhZGl1cyhcclxuICAgICAgICByYWRpdXMgLVxyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ucmluZ1dpZHRoIC1cclxuICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdJbnNldFxyXG4gICAgICApXHJcbiAgICAgIC5vdXRlclJhZGl1cyhyYWRpdXMpXHJcbiAgICAgIC5zdGFydEFuZ2xlKGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvO1xyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICByYXRpbyA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByYXRpbyA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgYW5nbGVWYWx1ZVtpIC0gMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkZWcycmFkKHJhdGlvKTtcclxuICAgICAgfSlcclxuICAgICAgLmVuZEFuZ2xlKGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgdmFyIHJhdGlvO1xyXG4gICAgICAgIGlmIChpID09PSBkYXRhX3JlYWR5Lmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIHJhdGlvID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWF4QW5nbGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJhdGlvID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyBhbmdsZVZhbHVlW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGVnMnJhZChyYXRpbyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIGNlbnRlclRyYW5zbGF0aW9uKCkge1xyXG4gICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgcmFkaXVzICsgJywnICsgcmFkaXVzICsgJyknO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBjZW50ZXJUeCA9IGNlbnRlclRyYW5zbGF0aW9uKCk7XHJcbiAgICB2YXIgdGlja0RhdGEgPSBkM1xyXG4gICAgICAucmFuZ2Uoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFqb3JUaWNrcylcclxuICAgICAgLm1hcChmdW5jdGlvbiAoaSkge1xyXG4gICAgICAgIHJldHVybiAxIC8gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFqb3JUaWNrcztcclxuICAgICAgfSk7XHJcblxyXG4gICAgdmFyIGFyY3MgPSBzdmcuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnYXJjJykuYXR0cigndHJhbnNmb3JtJywgY2VudGVyVHgpO1xyXG5cclxuICAgIGFyY3NcclxuICAgICAgLnNlbGVjdEFsbCgncGF0aCcpXHJcbiAgICAgIC5kYXRhKGRhdGFfcmVhZHkpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuICAgICAgICBpZiAoIW1ldGFEYXRhLmhhc0RyaWxsRG93biB8fCBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPT0gMCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgcmFuZ2UgPSBnZXRSYW5nZShkKTtcclxuICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKHJhbmdlKTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCwgaSkge1xyXG4gICAgICAgIHJldHVybiBjb2xvck1hcHNbaV07XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hdHRyKCdpZCcsIGZ1bmN0aW9uIChkLCBpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbG9yTWFwc1tpXTtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2QnLCBhcmMpXHJcbiAgICAgIC8vIC5zdHlsZSgnY3Vyc29yJywgJ3BvaW50ZXInKTtcclxuICAgICAgLnN0eWxlKCdjdXJzb3InLCBmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwICYmIG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNyaWEpXHJcbiAgICAgICAgICByZXR1cm4gJ3BvaW50ZXInO1xyXG4gICAgICAgIGVsc2UgcmV0dXJuICdkZWZhdWx0JztcclxuICAgICAgfSk7XHJcblxyXG4gICAgbGV0IGdldFJhbmdlID0gZnVuY3Rpb24gKGQpIHtcclxuICAgICAgbGV0IGluZGV4ID0gZGF0YV9yZWFkeS5pbmRleE9mKGQpO1xyXG4gICAgICByZXR1cm4gZGF0YVswXSArICcgYW5kICcgKyBkYXRhW2RhdGEubGVuZ3RoIC0gMV07XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBwb2ludGVySGVhZExlbmd0aCA9IE1hdGgucm91bmQoXHJcbiAgICAgIHJhZGl1cyAqIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJIZWFkTGVuZ3RoUGVyY2VudFxyXG4gICAgKTtcclxuXHJcbiAgICB2YXIgbGluZURhdGEgPSBbXHJcbiAgICAgIFtzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyV2lkdGggLyAyLCAwXSxcclxuICAgICAgWzAsIC1wb2ludGVySGVhZExlbmd0aF0sXHJcbiAgICAgIFstKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJXaWR0aCAvIDIpLCAwXSxcclxuICAgICAgWzAsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJUYWlsTGVuZ3RoXSxcclxuICAgICAgW3NlbGYuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJXaWR0aCAvIDIsIDBdLFxyXG4gICAgXTtcclxuXHJcbiAgICB2YXIgcG9pbnRlckxpbmUgPSBkMy5saW5lKCk7XHJcbiAgICB2YXIgcGcgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5kYXRhKFtsaW5lRGF0YV0pXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdwb2ludGVyJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGNlbnRlclR4KTtcclxuXHJcbiAgICB2YXIgcG9pbnRlclZhbHVlID0gbWV0YURhdGEuY3VycmVudFZhbHVlIC0gZGF0YVswXTtcclxuICAgIHZhciByYW5nZSA9IGRhdGFbZGF0YV9sZW5ndGggLSAxXSAtIGRhdGFbMF07XHJcbiAgICB2YXIgcG9pbnRlckFuZ2xlID1cclxuICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAocG9pbnRlclZhbHVlIC8gcmFuZ2UpICogMTgwO1xyXG4gICAgcGcuYXBwZW5kKCdwYXRoJylcclxuICAgICAgLmF0dHIoJ2QnLCBwb2ludGVyTGluZSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5wb2ludGVyQ29sb3IpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgICdyb3RhdGUoJyArXHJcbiAgICAgICAgICBwb2ludGVyQW5nbGUgK1xyXG4gICAgICAgICAgJykgdHJhbnNsYXRlKDAsJyArXHJcbiAgICAgICAgICAoLXJhZGl1cyArIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdXaWR0aCArIHBvaW50ZXJIZWFkTGVuZ3RoKSArXHJcbiAgICAgICAgICAnKSdcclxuICAgICAgKTtcclxuXHJcbiAgICB2YXIgbGcgPSBzdmcuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnbGFiZWwnKS5hdHRyKCd0cmFuc2Zvcm0nLCBjZW50ZXJUeCk7XHJcbiAgICBsZXQgbGFiZWxBcnJheVRlbXAgPSBbeyBuYW1lOiBkYXRhWzBdLCB2YWx1ZTogMCB9XTtcclxuICAgIGxldCBjb3VudCA9IDA7XHJcbiAgICBkYXRhX3JlYWR5Lm1hcChmdW5jdGlvbiAoZGF0YVVuaXQsIGkpIHtcclxuICAgICAgY291bnQgKz0gZGF0YVVuaXQ7XHJcbiAgICAgIGxldCB0ZW1wID0geyBuYW1lOiBkYXRhW2kgKyAxXSwgdmFsdWU6IGNvdW50IH07XHJcbiAgICAgIGxhYmVsQXJyYXlUZW1wLnB1c2godGVtcCk7XHJcbiAgICB9KTtcclxuICAgIGxhYmVsQXJyYXkgPSBsYWJlbEFycmF5VGVtcDtcclxuXHJcbiAgICBsZy5zZWxlY3RBbGwoJy5idWJibGUnKVxyXG4gICAgICAuZGF0YShsYWJlbEFycmF5KVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgdmFyIG5ld0FuZ2xlID1cclxuICAgICAgICAgIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgKGQudmFsdWUgLyByYW5nZSkgKiAxODA7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICdyb3RhdGUoJyArXHJcbiAgICAgICAgICBuZXdBbmdsZSArXHJcbiAgICAgICAgICAnKSB0cmFuc2xhdGUoMCwnICtcclxuICAgICAgICAgIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5sYWJlbEluc2V0IC0gcmFkaXVzIC0gMjApICtcclxuICAgICAgICAgICcpJ1xyXG4gICAgICAgICk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQsIGkpIHtcclxuICAgICAgICB2YXIgbmV3QW5nbGUgPVxyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAoZC52YWx1ZSAvIHJhbmdlKSAqIDE4MDtcclxuICAgICAgICBpZiAoaSA9PSAwICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzVmFsdWVMYWJsZUFkanVzdCkge1xyXG4gICAgICAgICAgcmV0dXJuICdyb3RhdGUoJyArICgwIC0gbmV3QW5nbGUpICsgJykgdHJhbnNsYXRlKC0yNywwKSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIGkgPT0gbGFiZWxBcnJheS5sZW5ndGggLSAxICYmXHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1ZhbHVlTGFibGVBZGp1c3RcclxuICAgICAgICApIHtcclxuICAgICAgICAgIHJldHVybiAncm90YXRlKCcgKyAoMCAtIG5ld0FuZ2xlKSArICcpIHRyYW5zbGF0ZSgtMTUsMCknO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJ3JvdGF0ZSgnICsgKDAgLSBuZXdBbmdsZSkgKyAnKSB0cmFuc2xhdGUoLTE3LDApJztcclxuICAgICAgfSlcclxuICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIGZ1bmN0aW9uIChkKSB7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMClcclxuICAgICAgICAgIHJldHVybiAnZm9udC1zaXplOiAnICsgJzEycHgnICsgJzsgZm9udC13ZWlnaHQ6JyArICc2MDA7JztcclxuICAgICAgICBlbHNlIHJldHVybiAnZm9udC1zaXplOiAnICsgJzE0cHgnICsgJzsgZm9udC13ZWlnaHQ6JyArICc2MDA7JztcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5kYXRhVHlwZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGQubmFtZSArIG1ldGFEYXRhLmRhdGFUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZC5uYW1lO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICBzdmdcclxuICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgICd0cmFuc2xhdGUoJyArXHJcbiAgICAgICAgICAocmFkaXVzIC0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciAvIDIpICtcclxuICAgICAgICAgICcsJyArXHJcbiAgICAgICAgICB0b3BUZXh0UG9zaXRpb24gK1xyXG4gICAgICAgICAgJyknXHJcbiAgICAgIClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlV2lkdGhTY2FsZUZhY3RvciArIDgpXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcilcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3ZhbHVlLWRpc3BsYXknKVxyXG4gICAgICAuc3R5bGUoXHJcbiAgICAgICAgJ2hlaWdodCcsXHJcbiAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgKyAxMCArICdweCdcclxuICAgICAgKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiAxNTAwKSB7XHJcbiAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvciAtIDI1ICsgJ3B4JztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgLSAxNSArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuaHRtbChtZXRhRGF0YS5jdXJyZW50VmFsdWUgKyBtZXRhRGF0YS5kYXRhVHlwZSk7XHJcbiAgICBpZiAobWV0YURhdGEuc3RhdHVzKSB7XHJcbiAgICAgIGxldCB3aWR0aFRlbXAgPSBtZXRhRGF0YS5zdGF0dXMubGVuZ3RoID4gNCA/IDIxMCA6IDEyMDtcclxuICAgICAgc3ZnXHJcbiAgICAgICAgLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAgICAgLmF0dHIoXHJcbiAgICAgICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgICAgICd0cmFuc2xhdGUoJyArIChyYWRpdXMgLSB3aWR0aFRlbXAgLyAyKSArICcsJyArIG1pZFRleHRQb3NpdGlvbiArICcpJ1xyXG4gICAgICAgIClcclxuICAgICAgICAuYXR0cignd2lkdGgnLCB3aWR0aFRlbXApXHJcbiAgICAgICAgLmF0dHIoXHJcbiAgICAgICAgICAnaGVpZ2h0JyxcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yICsgMTBcclxuICAgICAgICApXHJcbiAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgICAuYXR0cignY2xhc3MnLCAnc3RhdHVzLWRpc3BsYXknKVxyXG4gICAgICAgIC5zdHlsZShcclxuICAgICAgICAgICdmb250LXNpemUnLFxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3IgLSAyNSArICdweCdcclxuICAgICAgICApXHJcbiAgICAgICAgLmh0bWwobWV0YURhdGEuc3RhdHVzKTtcclxuICAgIH1cclxuICAgIHN2Z1xyXG4gICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgICAgLmF0dHIoXHJcbiAgICAgICAgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgJ3RyYW5zbGF0ZSgnICsgKHJhZGl1cyAtIDEwNSkgKyAnLCcgKyBib3R0b21UZXh0UG9zaXRpb24gKyAnKSdcclxuICAgICAgKVxyXG4gICAgICAuYXR0cignd2lkdGgnLCAyMTApXHJcbiAgICAgIC5hdHRyKCdoZWlnaHQnLCB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXJyZW50VmFsdWVIZWlnaHRTY2FsZUZhY3RvcilcclxuICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RhdGVyYW5nZS1kaXNwbGF5JylcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCkgcmV0dXJuICcxNHB4JztcclxuICAgICAgICAgICAgZWxzZSByZXR1cm4gJzE4cHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCAxNDAwKSByZXR1cm4gJzE0cHgnO1xyXG4gICAgICAgICAgZWxzZSByZXR1cm4gJzE4cHgnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgLmh0bWwoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBkZXNpcmVkU2l6ZTtcclxuICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCAxNDAwKSBkZXNpcmVkU2l6ZSA9ICcxNHB4JztcclxuICAgICAgICBlbHNlIGRlc2lyZWRTaXplID0gJzE4cHgnO1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5kYXRlUmFuZ2UpXHJcbiAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJtYXJnaW5yaWdodC0zXCI+PGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhclwiPjwvaT48L3NwYW4+PHNwYW4+ICcgK1xyXG4gICAgICAgICAgICBtZXRhRGF0YS5kYXRlUmFuZ2UgK1xyXG4gICAgICAgICAgICAnPC9zcGFuPidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgZWxzZSByZXR1cm4gJyc7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHZhciBjb250YWluZXJNaWRXaWR0aCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAvIDI7XHJcbiAgICB2YXIgbm9kZUhhbGZXaWR0aCA9IHN2Zy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAyO1xyXG4gICAgdmFyIHVwZGF0ZWRTdGFydGluZ1BvaW50ID0gY29udGFpbmVyTWlkV2lkdGggLSBub2RlSGFsZldpZHRoO1xyXG5cclxuICAgIHN2Zy5hdHRyKFxyXG4gICAgICAndHJhbnNmb3JtJyxcclxuICAgICAgJ3RyYW5zbGF0ZSgnICtcclxuICAgICAgICAodXBkYXRlZFN0YXJ0aW5nUG9pbnQgKyBtYXJnaW4ubGVmdCkgK1xyXG4gICAgICAgICcsJyArXHJcbiAgICAgICAgbWFyZ2luLnRvcCArXHJcbiAgICAgICAgJyknXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkKTtcclxuICB9XHJcbiAgaGFuZGxlSGVhZGVyTWVudUNsaWNrKGlkKSB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxufSIsIjxkaXYgI2d1YWdlY29udGFpbmVyIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmQtYmcpO1wiXHJcbiAgKHJlc2l6ZWQpPVwib25SZXNpemVkKCRldmVudClcIj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFsdFwiICpuZ0lmPVwiIWlzSGVhZGVyVmlzaWJsZVwiPlxyXG4gICAgPGxpYi1jaGFydC1oZWFkZXItdjIgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIiBbY2hhcnRDb25maWd1cmF0aW9uXT1cImNoYXJ0Q29uZmlndXJhdGlvblwiXHJcbiAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIj48L2xpYi1jaGFydC1oZWFkZXItdjI+XHJcbiAgPC9kaXY+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjEgW3RpdGxlXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS50aXRsZVwiIFtoYXNEcmlsbERvd25dPVwiY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93blwiXHJcbiAgICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiIFtpc3JpYV09XCJjdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcIiBbbWVudU9wdGlvbnNdPVwiY2hhcnRDb25maWd1cmF0aW9uLmhlYWRlck1lbnVPcHRpb25zXCJcclxuICAgIFtzZWxlY3RlZEtwaVRvb2x0b3BdPVwiY2hhcnRDb25maWd1cmF0aW9uLnNlbGVjdGVkS3BpVG9vbHRvcFwiIChtZW51T3B0aW9uQ2xpY2tFdmVudCk9XCJoYW5kbGVIZWFkZXJNZW51Q2xpY2soJGV2ZW50KVwiXHJcbiAgICBbaXNBbGVydEVuYWJsZWRdPVwiaXNBbGVydEVuYWJsZWRcIiAqbmdJZj1cImlzSGVhZGVyVmlzaWJsZVwiPjwvbGliLWNoYXJ0LWhlYWRlci12MT5cclxuICA8ZGl2IFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFwiIGlkPVwiZ3VhZ2VjaGFydGNvbnRhaW5lclwiICNndWFnZWNoYXJ0Y29udGFpbmVyXHJcbiAgICBjbGFzcz1cImxpYi1jaGFydC1zdmcgZ3VhZ2Vjb250YWluZXJcIj48L2Rpdj5cclxuPC9kaXY+Il19
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhZ2UtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXhpZGlvLXN0eWxlZ3VpZGUtbGlicmFyeS9zcmMvbGliL2d1YWdlLWNoYXJ0L2d1YWdlLWNoYXJ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ndWFnZS1jaGFydC9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2pELE9BQU8sV0FBVyxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sa0JBQWtCLE1BQU0sa0JBQWtCLENBQUM7Ozs7OztBQVFsRCxNQUFNLE9BQU8sbUJBQ1gsU0FBUSxpQkFBaUI7SUF5Q3pCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFsQ0EsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV6RCx1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFDN0IsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixhQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRWQseUJBQW9CLEdBQVE7WUFDbkMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFF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QUFJLFFBQVEsQ0FBQyxTQUFTO1lBQ3BCLE9BQU8sQ0FDTCxtQkFBbUIsRUFDbkIsa0NBQWtDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsRUFDdEQsTUFBTSxDQUNQLENBQUM7SUFDTixDQUFDO0lBRU8sT0FBTyxDQUFDLEdBQVc7UUFDekIsT0FBTyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQscUJBQXFCLENBQUMsRUFBVTtRQUM5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBMVVVLG1CQUFtQjttR0FBbkIsbUJBQW1CLHlnQkN4QmhDLHNnQ0FZTTs7NEZEWU8sbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixpQkFHWixpQkFBaUIsQ0FBQyxJQUFJO3dEQU1lLFlBQVk7c0JBQS9ELFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNILGlCQUFpQjtzQkFBL0QsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBDLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0IHsgUmVzaXplZEV2ZW50IH0gZnJvbSAnYW5ndWxhci1yZXNpemUtZXZlbnQnO1xyXG5pbXBvcnQgSGVhZGVyQ29uZmlnSGVscGVyIGZyb20gJy4uL2hlYWRlci1jb25maWcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItZ3VhZ2UtY2hhcnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ndWFnZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZ3VhZ2UtY2hhcnQuY29tcG9uZW50Lmxlc3MnLCAnLi4vY29tbW9uLXN0eWxlcy5sZXNzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEd1YWdlQ2hhcnRDb21wb25lbnRcclxuICBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlkXHJcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlc1xyXG57XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2VjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZ3VhZ2Vjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBndWFnZWNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgZGF0YVR5cGU6IHN0cmluZyA9ICcnO1xyXG4gIGRhdGF0eXBlX3N0YXR1cyA9IGZhbHNlO1xyXG4gIHVuaXF1ZUlkID0gdGhpcy5nZXRVbmlxdWVJZCgpO1xyXG4gIGlzSGVhZGVyVmlzaWJsZSA9IHRydWU7XHJcblxyXG4gIHJlYWRvbmx5IGRlZmF1bHRDb25maWd1cmF0aW9uOiBhbnkgPSB7XHJcbiAgICBtYXJnaW46IHsgdG9wOiA0MCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiAyMCB9LFxyXG4gICAgbWluQW5nbGU6IC05MCxcclxuICAgIG1heEFuZ2xlOiA5MCxcclxuICAgIHJpbmdJbnNldDogMjAsXHJcbiAgICByaW5nV2lkdGg6IDIwLFxyXG4gICAgbWFqb3JUaWNrczogMyxcclxuICAgIHN2Z0hlaWdodDogODAsXHJcbiAgICBsb3dfY29sb3JNYXA6IFsnIzQzQ0MwMCcsICcjRkZFRjBDJywgJyNGRjRFMEMnXSxcclxuICAgIGhpZ2hfY29sb3JNYXA6IFsnI0ZGNEUwQycsICcjRkZFRjBDJywgJyM0M0NDMDAnXSxcclxuICAgIHBvaW50ZXJXaWR0aDogMTAsXHJcbiAgICBwb2ludGVyVGFpbExlbmd0aDogNSxcclxuICAgIHBvaW50ZXJIZWFkTGVuZ3RoUGVyY2VudDogMC43LFxyXG4gICAgbGFiZWxJbnNldDogMTAsXHJcbiAgICBsZWdlbmRKdXN0aWZpZWQ6IGZhbHNlLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRkZGRicsXHJcbiAgICByaW5nU2NhbGVGYWN0b3I6IDAsXHJcbiAgICB0ZXh0c0F0Q2VudGVyU2NhbGVGYWN0b3I6IDAsXHJcbiAgICBjdXJyZW50VmFsdWVXaWR0aFNjYWxlRmFjdG9yOiA2MCxcclxuICAgIGN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yOiAzMCxcclxuICAgIHBvaW50ZXJDb2xvcjogJyM2ODY4NjgnLFxyXG4gICAgaGVhZGVyTWVudU9wdGlvbnM6IEhlYWRlckNvbmZpZ0hlbHBlci5oZWFkZXJDb25maWcuaGVhZGVyTWVudU9wdGlvbnMsXHJcbiAgfTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQWxlcnRFbmFibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24/LmhlYWRlck1lbnVPcHRpb25zPy5zb21lKFxyXG4gICAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCdcclxuICAgICAgKSA/PyBmYWxzZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5idWlsZENoYXJ0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlc1snY2hhcnREYXRhJ10gfHwgY2hhbmdlc1snY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uJ10pIHtcclxuICAgICAgdGhpcy5yZWJ1aWxkQ2hhcnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUmVzaXplZChldmVudDogUmVzaXplZEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYnVpbGRDaGFydCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWJ1aWxkQ2hhcnQoKTogdm9pZCB7XHJcbiAgICBkMy5zZWxlY3QoYCMke3RoaXMudW5pcXVlSWR9YCkucmVtb3ZlKCk7XHJcbiAgICB0aGlzLmJ1aWxkQ2hhcnQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRDaGFydCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5jaGFydERhdGE/LmRhdGEgfHwgIXRoaXMuY2hhcnREYXRhPy5tZXRhRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMubWVyZ2VDb25maWd1cmF0aW9ucygpO1xyXG4gICAgdGhpcy5wcm9jZXNzRGF0YUFuZFJlbmRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZ3VyYXRpb25zKCk6IHZvaWQge1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbikuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgICAga2V5LFxyXG4gICAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlID8/IHRoaXMuaXNIZWFkZXJWaXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcm9jZXNzRGF0YUFuZFJlbmRlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgZGF0YSwgbWV0YURhdGEgfSA9IHRoaXMuY2hhcnREYXRhO1xyXG4gICAgY29uc3QgY29sb3JNYXAgPVxyXG4gICAgICBtZXRhRGF0YS5jb2xvclR5cGUgPT09ICdsb3cnXHJcbiAgICAgICAgPyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sb3dfY29sb3JNYXBcclxuICAgICAgICA6IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmhpZ2hfY29sb3JNYXA7XHJcblxyXG4gICAgdGhpcy5zZXREYXRhVHlwZShtZXRhRGF0YSk7XHJcblxyXG4gICAgY29uc3QgZGlmZnMgPSBkYXRhLnNsaWNlKDEpLm1hcCgodiwgaSkgPT4gdiAtIGRhdGFbaV0pO1xyXG4gICAgY29uc3QgdG90YWwgPSBkaWZmcy5yZWR1Y2UoKHN1bSwgdmFsKSA9PiBzdW0gKyB2YWwsIDApO1xyXG4gICAgY29uc3QgYW5nbGVzID0gdGhpcy5jb21wdXRlQW5nbGVzKGRpZmZzLCB0b3RhbCk7XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgY29uc3Qgd2lkdGggPVxyXG4gICAgICBwYXJzZUludChjb250YWluZXIuc3R5bGUoJ3dpZHRoJykpIC1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLmxlZnQgLVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4ucmlnaHQ7XHJcbiAgICBjb25zdCBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludChkMy5zZWxlY3QodGhpcy5ndWFnZWNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KS5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLnRvcCAtXHJcbiAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi5ib3R0b20gLVxyXG4gICAgICA1NjtcclxuXHJcbiAgICBjb25zdCByYWRpdXMgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KSAvIDI7XHJcbiAgICBjb25zdCBzdmcgPSB0aGlzLmNyZWF0ZVN2Zyhjb250YWluZXIsIHdpZHRoLCBoZWlnaHQsIHJhZGl1cyk7XHJcblxyXG4gICAgdGhpcy5kcmF3QXJjcyhzdmcsIGRpZmZzLCBkYXRhLCBhbmdsZXMsIGNvbG9yTWFwLCBtZXRhRGF0YSwgcmFkaXVzKTtcclxuICAgIHRoaXMuZHJhd1BvaW50ZXIoc3ZnLCBkYXRhLCBtZXRhRGF0YSwgcmFkaXVzKTtcclxuICAgIHRoaXMuZHJhd0xhYmVscyhzdmcsIGRhdGEsIGRpZmZzLCBtZXRhRGF0YSwgcmFkaXVzKTtcclxuICAgIHRoaXMuZHJhd1RleHRCbG9ja3Moc3ZnLCBtZXRhRGF0YSwgcmFkaXVzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0RGF0YVR5cGUobWV0YURhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKG1ldGFEYXRhLmRhdGFUeXBlKSB7XHJcbiAgICAgIHRoaXMuZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZSA9PT0gJ1VTRCcgPyAnJCAnIDogbWV0YURhdGEuZGF0YVR5cGU7XHJcbiAgICAgIHRoaXMuZGF0YXR5cGVfc3RhdHVzID0gbWV0YURhdGEuZGF0YVR5cGUgPT09ICdVU0QnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wdXRlQW5nbGVzKHZhbHVlczogbnVtYmVyW10sIHRvdGFsOiBudW1iZXIpOiBudW1iZXJbXSB7XHJcbiAgICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYWNjOiBudW1iZXJbXSwgdW5pdCwgaSkgPT4ge1xyXG4gICAgICBjb25zdCBhbmdsZSA9ICh1bml0IC8gdG90YWwpICogMTgwO1xyXG4gICAgICBhY2MucHVzaChpID09PSAwID8gYW5nbGUgOiBhY2NbaSAtIDFdICsgYW5nbGUpO1xyXG4gICAgICByZXR1cm4gYWNjO1xyXG4gICAgfSwgW10pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVTdmcoXHJcbiAgICBjb250YWluZXI6IGQzLlNlbGVjdGlvbjxhbnksIGFueSwgYW55LCBhbnk+LFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG4gICAgcmFkaXVzOiBudW1iZXJcclxuICApIHtcclxuICAgIHJldHVybiBjb250YWluZXJcclxuICAgICAgLmFwcGVuZCgnc3ZnJylcclxuICAgICAgLmF0dHIoJ2lkJywgdGhpcy51bmlxdWVJZClcclxuICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGggKyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4ubGVmdClcclxuICAgICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi50b3ApXHJcbiAgICAgIC5jYWxsKENoYXJ0SGVscGVyLnJlc3BvbnNpdmVmeSlcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKFxyXG4gICAgICAgICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIGB0cmFuc2xhdGUoJHsocGFyc2VJbnQoY29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAvIDIgLSByYWRpdXMpICtcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi5sZWZ0fSwke3RoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbi50b3B9KWBcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHJhd0FyY3MoXHJcbiAgICBzdmc6IGFueSxcclxuICAgIGRpZmZzOiBudW1iZXJbXSxcclxuICAgIGRhdGE6IG51bWJlcltdLFxyXG4gICAgYW5nbGVzOiBudW1iZXJbXSxcclxuICAgIGNvbG9yTWFwOiBzdHJpbmdbXSxcclxuICAgIG1ldGFEYXRhOiBhbnksXHJcbiAgICByYWRpdXM6IG51bWJlclxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgYXJjID0gZDNcclxuICAgICAgLmFyYygpXHJcbiAgICAgIC5pbm5lclJhZGl1cyhcclxuICAgICAgICByYWRpdXMgLVxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucmluZ1dpZHRoIC1cclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnJpbmdJbnNldFxyXG4gICAgICApXHJcbiAgICAgIC5vdXRlclJhZGl1cyhyYWRpdXMpXHJcbiAgICAgIC5zdGFydEFuZ2xlKChfLCBpKSA9PlxyXG4gICAgICAgIHRoaXMuZGVnMnJhZChcclxuICAgICAgICAgIGkgPT09IDBcclxuICAgICAgICAgICAgPyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5taW5BbmdsZVxyXG4gICAgICAgICAgICA6IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1pbkFuZ2xlICsgYW5nbGVzW2kgLSAxXVxyXG4gICAgICAgIClcclxuICAgICAgKVxyXG4gICAgICAuZW5kQW5nbGUoKF8sIGkpID0+XHJcbiAgICAgICAgdGhpcy5kZWcycmFkKFxyXG4gICAgICAgICAgaSA9PT0gZGlmZnMubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICA/IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1heEFuZ2xlXHJcbiAgICAgICAgICAgIDogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyBhbmdsZXNbaV1cclxuICAgICAgICApXHJcbiAgICAgICk7XHJcblxyXG4gICAgY29uc3QgYXJjcyA9IHN2Z1xyXG4gICAgICAuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2FyYycpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzfSwke3JhZGl1c30pYCk7XHJcblxyXG4gICAgYXJjc1xyXG4gICAgICAuc2VsZWN0QWxsKCdwYXRoJylcclxuICAgICAgLmRhdGEoZGlmZnMpXHJcbiAgICAgIC5lbnRlcigpXHJcbiAgICAgIC5hcHBlbmQoJ3BhdGgnKVxyXG4gICAgICAuYXR0cignZCcsIGFyYylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAoXywgaSkgPT4gY29sb3JNYXBbaV0pXHJcbiAgICAgIC5zdHlsZSgnY3Vyc29yJywgKCkgPT5cclxuICAgICAgICBtZXRhRGF0YS5jdXJyZW50VmFsdWUgPiAwICYmIG1ldGFEYXRhLmhhc0RyaWxsRG93blxyXG4gICAgICAgICAgPyAncG9pbnRlcidcclxuICAgICAgICAgIDogJ2RlZmF1bHQnXHJcbiAgICAgIClcclxuICAgICAgLm9uKCdjbGljaycsIChldmVudCwgZCkgPT4ge1xyXG4gICAgICAgIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24gJiYgbWV0YURhdGEuY3VycmVudFZhbHVlID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVDbGljayhgJHtkYXRhWzBdfSAtICR7ZGF0YVtkYXRhLmxlbmd0aCAtIDFdfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRyYXdQb2ludGVyKHN2ZzogYW55LCBkYXRhOiBudW1iZXJbXSwgbWV0YURhdGE6IGFueSwgcmFkaXVzOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHBvaW50ZXJIZWFkTGVuZ3RoID0gTWF0aC5yb3VuZChcclxuICAgICAgcmFkaXVzICogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlckhlYWRMZW5ndGhQZXJjZW50XHJcbiAgICApO1xyXG4gICAgY29uc3QgcG9pbnRlclZhbHVlID0gbWV0YURhdGEuY3VycmVudFZhbHVlIC0gZGF0YVswXTtcclxuICAgIGNvbnN0IHJhbmdlID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdIC0gZGF0YVswXTtcclxuICAgIGNvbnN0IGFuZ2xlID1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAocG9pbnRlclZhbHVlIC8gcmFuZ2UpICogMTgwO1xyXG5cclxuICAgIGNvbnN0IGxpbmVEYXRhID0gW1xyXG4gICAgICBbdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlcldpZHRoIC8gMiwgMF0sXHJcbiAgICAgIFswLCAtcG9pbnRlckhlYWRMZW5ndGhdLFxyXG4gICAgICBbLXRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJXaWR0aCAvIDIsIDBdLFxyXG4gICAgICBbMCwgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlclRhaWxMZW5ndGhdLFxyXG4gICAgICBbdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ucG9pbnRlcldpZHRoIC8gMiwgMF0sXHJcbiAgICBdO1xyXG5cclxuICAgIGNvbnN0IHBvaW50ZXJMaW5lID0gZDMubGluZSgpO1xyXG4gICAgc3ZnXHJcbiAgICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAncG9pbnRlcicpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzfSwke3JhZGl1c30pYClcclxuICAgICAgLmFwcGVuZCgncGF0aCcpXHJcbiAgICAgIC5hdHRyKCdkJywgcG9pbnRlckxpbmUobGluZURhdGEpKVxyXG4gICAgICAuYXR0cignZmlsbCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnBvaW50ZXJDb2xvcilcclxuICAgICAgLmF0dHIoXHJcbiAgICAgICAgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgYHJvdGF0ZSgke2FuZ2xlfSkgdHJhbnNsYXRlKDAsJHtcclxuICAgICAgICAgIC1yYWRpdXMgKyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5yaW5nV2lkdGggKyBwb2ludGVySGVhZExlbmd0aFxyXG4gICAgICAgIH0pYFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3TGFiZWxzKFxyXG4gICAgc3ZnOiBhbnksXHJcbiAgICBkYXRhOiBudW1iZXJbXSxcclxuICAgIGRpZmZzOiBudW1iZXJbXSxcclxuICAgIG1ldGFEYXRhOiBhbnksXHJcbiAgICByYWRpdXM6IG51bWJlclxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgcmFuZ2UgPSBkYXRhW2RhdGEubGVuZ3RoIC0gMV0gLSBkYXRhWzBdO1xyXG4gICAgbGV0IGN1bXVsYXRpdmUgPSAwO1xyXG4gICAgY29uc3QgbGFiZWxBcnJheSA9IFt7IG5hbWU6IGRhdGFbMF0sIHZhbHVlOiAwIH1dO1xyXG5cclxuICAgIGRpZmZzLmZvckVhY2goKGRpZmYsIGkpID0+IHtcclxuICAgICAgY3VtdWxhdGl2ZSArPSBkaWZmO1xyXG4gICAgICBsYWJlbEFycmF5LnB1c2goeyBuYW1lOiBkYXRhW2kgKyAxXSwgdmFsdWU6IGN1bXVsYXRpdmUgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBsYWJlbHMgPSBzdmdcclxuICAgICAgLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsYWJlbCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzfSwke3JhZGl1c30pYCk7XHJcblxyXG4gICAgbGFiZWxzXHJcbiAgICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgICAuZGF0YShsYWJlbEFycmF5KVxyXG4gICAgICAuZW50ZXIoKVxyXG4gICAgICAuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmV3QW5nbGUgPVxyXG4gICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWluQW5nbGUgKyAoZC52YWx1ZSAvIHJhbmdlKSAqIDE4MDtcclxuICAgICAgICByZXR1cm4gYHJvdGF0ZSgke25ld0FuZ2xlfSkgdHJhbnNsYXRlKDAsJHtcclxuICAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxhYmVsSW5zZXQgLSByYWRpdXMgLSAyMFxyXG4gICAgICAgIH0pIHJvdGF0ZSgkey1uZXdBbmdsZX0pYDtcclxuICAgICAgfSlcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIHdpbmRvdy5pbm5lcldpZHRoIDwgMTQwMCA/ICcxMnB4JyA6ICcxNHB4JylcclxuICAgICAgLnN0eWxlKCdmb250LXdlaWdodCcsIDYwMClcclxuICAgICAgLnRleHQoKGQpID0+IGAke2QubmFtZX0ke21ldGFEYXRhLmRhdGFUeXBlID8/ICcnfWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkcmF3VGV4dEJsb2Nrcyhzdmc6IGFueSwgbWV0YURhdGE6IGFueSwgcmFkaXVzOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRvcCA9IHJhZGl1cyAvIDIgLSAxMDtcclxuICAgIGNvbnN0IG1pZCA9IHRvcCArIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yO1xyXG4gICAgY29uc3QgYm90dG9tID0gbWlkICsgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VycmVudFZhbHVlSGVpZ2h0U2NhbGVGYWN0b3I7XHJcblxyXG4gICAgY29uc3QgYWRkVGV4dCA9IChjbHM6IHN0cmluZywgdGV4dDogc3RyaW5nLCB5OiBudW1iZXIsIHdpZHRoID0gMjEwKSA9PiB7XHJcbiAgICAgIHN2Z1xyXG4gICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4gICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7cmFkaXVzIC0gd2lkdGggLyAyfSwke3l9KWApXHJcbiAgICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpXHJcbiAgICAgICAgLmF0dHIoJ2hlaWdodCcsIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1cnJlbnRWYWx1ZUhlaWdodFNjYWxlRmFjdG9yKVxyXG4gICAgICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgY2xzKVxyXG4gICAgICAgIC5odG1sKHRleHQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBhZGRUZXh0KFxyXG4gICAgICAndmFsdWUtZGlzcGxheScsXHJcbiAgICAgIGAke21ldGFEYXRhLmN1cnJlbnRWYWx1ZX0ke21ldGFEYXRhLmRhdGFUeXBlID8/ICcnfWAsXHJcbiAgICAgIHRvcFxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAobWV0YURhdGEuc3RhdHVzKSBhZGRUZXh0KCdzdGF0dXMtZGlzcGxheScsIG1ldGFEYXRhLnN0YXR1cywgbWlkKTtcclxuICAgIGlmIChtZXRhRGF0YS5kYXRlUmFuZ2UpXHJcbiAgICAgIGFkZFRleHQoXHJcbiAgICAgICAgJ2RhdGVyYW5nZS1kaXNwbGF5JyxcclxuICAgICAgICBgPGkgY2xhc3M9XCJmYSBmYS1jYWxlbmRhclwiPjwvaT4gJHttZXRhRGF0YS5kYXRlUmFuZ2V9YCxcclxuICAgICAgICBib3R0b21cclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVnMnJhZChkZWc6IG51bWJlcik6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGRlZyAqIE1hdGguUEkpIC8gMTgwO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZGF0YTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChkYXRhKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmhlYWRlck1lbnVjbGlja0V2ZW50LmVtaXQoaWQpO1xyXG4gIH1cclxufSIsIjxkaXYgI2d1YWdlY29udGFpbmVyIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHZhcigtLWNhcmQtYmcpO1wiXHJcbiAgKHJlc2l6ZWQpPVwib25SZXNpemVkKCRldmVudClcIj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFsdFwiICpuZ0lmPVwiIWlzSGVhZGVyVmlzaWJsZVwiPlxyXG4gICAgPGxpYi1jaGFydC1oZWFkZXItdjIgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIiBbY2hhcnRDb25maWd1cmF0aW9uXT1cImNoYXJ0Q29uZmlndXJhdGlvblwiXHJcbiAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIj48L2xpYi1jaGFydC1oZWFkZXItdjI+XHJcbiAgPC9kaXY+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjEgW3RpdGxlXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS50aXRsZVwiIFtoYXNEcmlsbERvd25dPVwiY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93blwiXHJcbiAgICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiIFtpc3JpYV09XCJjdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcIiBbbWVudU9wdGlvbnNdPVwiY2hhcnRDb25maWd1cmF0aW9uLmhlYWRlck1lbnVPcHRpb25zXCJcclxuICAgIFtzZWxlY3RlZEtwaVRvb2x0b3BdPVwiY2hhcnRDb25maWd1cmF0aW9uLnNlbGVjdGVkS3BpVG9vbHRvcFwiIChtZW51T3B0aW9uQ2xpY2tFdmVudCk9XCJoYW5kbGVIZWFkZXJNZW51Q2xpY2soJGV2ZW50KVwiXHJcbiAgICBbaXNBbGVydEVuYWJsZWRdPVwiaXNBbGVydEVuYWJsZWRcIiAqbmdJZj1cImlzSGVhZGVyVmlzaWJsZVwiPjwvbGliLWNoYXJ0LWhlYWRlci12MT5cclxuICA8ZGl2IFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodFwiIGlkPVwiZ3VhZ2VjaGFydGNvbnRhaW5lclwiICNndWFnZWNoYXJ0Y29udGFpbmVyXHJcbiAgICBjbGFzcz1cImxpYi1jaGFydC1zdmcgZ3VhZ2Vjb250YWluZXJcIj48L2Rpdj5cclxuPC9kaXY+Il19