axidio-styleguide-library1-v2 0.2.97 → 0.2.99

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.
@@ -101,1242 +101,6 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
101
101
  get isAlertEnabled() {
102
102
  return this.chartConfiguration?.headerMenuOptions?.some((option) => option.id === 'editAlert');
103
103
  }
104
- // initializegroupChart() {
105
- // var self = this;
106
- // let data = [];
107
- // let metaData: any = null;
108
- // let keyList = null;
109
- // let lineData = null;
110
- // let colorMap = {};
111
- // var formatFromBackend;
112
- // var formatForHugeNumbers;
113
- // const isMobile = window.innerWidth < 576;
114
- // const isTablet = window.innerWidth >= 576 && window.innerWidth < 992;
115
- // const isDesktop = window.innerWidth >= 992;
116
- // let isria = this.customChartConfiguration.isRia
117
- // var x: any;
118
- // var alternate_text = false;
119
- // var short_tick_length = 4;
120
- // var long_tick_length = 16;
121
- // /**
122
- // * longer tick length needed for weekly charts
123
- // */
124
- // var short_tick_length_bg = 5;
125
- // var long_tick_length_bg = 30;
126
- // var leftAndRightSpaces = 50;
127
- // var rightSvgWidth = 60;
128
- // var tempScale;
129
- // for (var i in this.defaultConfiguration) {
130
- // this.chartConfiguration[i] = ChartHelper.getValueByConfigurationType(
131
- // i,
132
- // this.defaultConfiguration,
133
- // this.customChartConfiguration
134
- // );
135
- // }
136
- // data = this.chartData.data;
137
- // metaData = this.chartData.metaData;
138
- // lineData = this.chartData.lineData;
139
- // // if (lineData || this.chartData.targetLineData) {
140
- // // rightSvgWidth = 60;
141
- // // }
142
- // if (!metaData.colorAboveTarget) {
143
- // metaData['colorAboveTarget'] = metaData.colors;
144
- // }
145
- // colorMap = metaData.colors;
146
- // keyList = metaData.keyList;
147
- // var chartContainer = d3.select(this.containerElt.nativeElement);
148
- // var verticalstackedcontainer = d3.select(
149
- // this.groupcontainerElt.nativeElement
150
- // );
151
- // var margin = this.chartConfiguration.margin;
152
- // const { width, height } = this.calculateChartDimensions(
153
- // chartContainer,
154
- // verticalstackedcontainer,
155
- // margin,
156
- // self
157
- // );
158
- // /**
159
- // * for hiding header
160
- // * used by weekly charts
161
- // */
162
- // if (this.chartConfiguration.isHeaderVisible != undefined)
163
- // this.isHeaderVisible = this.chartConfiguration.isHeaderVisible;
164
- // /**
165
- // * for hiding legends
166
- // * used by weekly charts
167
- // */
168
- // if (this.chartConfiguration.legendVisible != undefined) {
169
- // this.legendVisible = this.chartConfiguration.legendVisible;
170
- // }
171
- // /**
172
- // * for removing background color so that it can take parents color
173
- // *
174
- // */
175
- // if (this.chartConfiguration.isTransparentBackground != undefined) {
176
- // this.isTransparentBackground =
177
- // this.chartConfiguration.isTransparentBackground;
178
- // }
179
- // /**
180
- // * format data values based on configuration received
181
- // */
182
- // if (this.chartConfiguration.textFormatter != undefined) {
183
- // formatFromBackend = ChartHelper.dataValueFormatter(
184
- // this.chartConfiguration.textFormatter
185
- // );
186
- // formatForHugeNumbers = ChartHelper.dataValueFormatter('.2s');
187
- // }
188
- // const {
189
- // outerContainer,
190
- // svgYAxisLeft,
191
- // svgYAxisRight,
192
- // innerContainer,
193
- // svg
194
- // } = this.createChartContainers(chartContainer, margin, height, rightSvgWidth, self, width);
195
- // var subgroups: any = keyList;
196
- // var groups = d3
197
- // .map(data, function (d) {
198
- // return d.name;
199
- // })
200
- // .keys();
201
- // /**
202
- // * x axis range made similar to line chart or vertical stack so that all the charts will get aligned with each other.
203
- // */
204
- // if (this.chartConfiguration.isMultiChartGridLine != undefined) {
205
- // x = d3
206
- // .scaleBand()
207
- // .rangeRound([width, 0])
208
- // .align(0.5)
209
- // .padding([0.5])
210
- // .domain(
211
- // data.map(function (d: any) {
212
- // return d.name.toLowerCase();
213
- // })
214
- // );
215
- // } else {
216
- // x = d3
217
- // .scaleBand()
218
- // .domain(groups)
219
- // .range([leftAndRightSpaces, width - rightSvgWidth - leftAndRightSpaces])
220
- // .padding([0.3]);
221
- // }
222
- // // x.bandwidth(96);
223
- // var xScaleFromOrigin = d3
224
- // .scaleBand()
225
- // .domain(groups)
226
- // .range([0, width - rightSvgWidth]);
227
- // // .padding([0.2]);
228
- // if (this.chartConfiguration.isMultiChartGridLine == undefined) {
229
- // /**
230
- // * normal ticks for all dashboard charts
231
- // */
232
- // svg
233
- // .append('g')
234
- // .attr('class', 'x1 axis1')
235
- // .attr('transform', 'translate(0,' + height + ')')
236
- // .call(d3.axisBottom(x))
237
- // .call((g) => g.select('.domain').remove());
238
- // svg.selectAll('g.x1.axis1 g.tick line').remove();
239
- // // Only move x-axis labels further down for grouped charts if there is no xLabel
240
- // if (subgroups.length > 1 && !metaData.xLabel) {
241
- // svg
242
- // .selectAll('g.x1.axis1 g.tick text')
243
- // .attr('class', 'lib-xaxis-labels-texts-drilldown')
244
- // .style('fill', 'var(--chart-text-color)')
245
- // .attr('y', 32); // Increase distance from bars (default is ~9)
246
- // } else {
247
- // svg
248
- // .selectAll('g.x1.axis1 g.tick text')
249
- // .attr('class', 'lib-xaxis-labels-texts-drilldown')
250
- // .style('fill', 'var(--chart-text-color)');
251
- // }
252
- // }
253
- // else {
254
- // /**
255
- // * bigger ticks for weekly charts and more space from x axis to labels
256
- // */
257
- // /**
258
- // * draw x axis
259
- // */
260
- // svg
261
- // .append('g')
262
- // .attr('class', 'x1 axis1')
263
- // .attr('transform', 'translate(0,' + height + ')')
264
- // .call(d3.axisBottom(x).tickSize(0))
265
- // .call((g) => g.select('.domain').attr('fill', 'none'));
266
- // /**
267
- // * tick line size in alternate fashion
268
- // */
269
- // svg.selectAll('g.x1.axis1 g.tick line').attr('y2', function () {
270
- // if (
271
- // alternate_text &&
272
- // self.chartConfiguration.isNoAlternateXaxisText == undefined
273
- // ) {
274
- // alternate_text = false;
275
- // return long_tick_length_bg - 7;
276
- // } else {
277
- // alternate_text = true;
278
- // return short_tick_length_bg - 4;
279
- // }
280
- // });
281
- // /**
282
- // * reset the flag so that values can be shown in same alternate fashion
283
- // */
284
- // alternate_text = false;
285
- // /**
286
- // * print x-axis label texts
287
- // * used by weekly charts
288
- // */
289
- // svg
290
- // .selectAll('g.x1.axis1 g.tick text')
291
- // .attr('class', 'lib-xaxis-labels-texts-weeklycharts')
292
- // .attr('y', function () {
293
- // // Minimize gap in maximized (fullscreen) view for weekly charts
294
- // if (self.chartConfiguration.isFullScreen) {
295
- // return short_tick_length_bg;
296
- // }
297
- // if (alternate_text) {
298
- // alternate_text = false;
299
- // return long_tick_length_bg;
300
- // } else {
301
- // alternate_text = true;
302
- // return short_tick_length_bg;
303
- // }
304
- // });
305
- // }
306
- // if (self.chartConfiguration.xLabelsOnSameLine) {
307
- // const xAxisLabels = svg
308
- // .selectAll('g.x1.axis1 g.tick text')
309
- // .attr('class', 'lib-xaxis-labels-texts-drilldown')
310
- // .style('font-size', this.isHeaderVisible ? '18px' : '14px')
311
- // .attr('text-anchor', 'middle')
312
- // .attr('y', function(d) {
313
- // // For grouped bar charts with many bars and xLabel present, only add 5 if the label is a date
314
- // if (subgroups.length > 1 && data.length > 8 && metaData.xLabel) {
315
- // const isDateLabel = /\d{2,4}[-\/]/.test(d);
316
- // if (self.chartConfiguration.isFullScreen) {
317
- // return isDateLabel ? short_tick_length_bg + 14 : short_tick_length_bg;
318
- // }
319
- // return isDateLabel ? short_tick_length_bg + 14 : short_tick_length_bg;
320
- // }
321
- // // For grouped bar charts with many bars and NO xLabel, add space as before, but reduce in fullscreen
322
- // if (subgroups.length > 1 && data.length > 8 && !metaData.xLabel) {
323
- // const chartHasExtraBottom = (self.chartConfiguration.margin && self.chartConfiguration.margin.bottom >= 40);
324
- // if (self.chartConfiguration.isFullScreen) {
325
- // // Reduce extra gap in maximized view
326
- // return short_tick_length_bg + 2;
327
- // }
328
- // return chartHasExtraBottom ? short_tick_length_bg : short_tick_length_bg + 10;
329
- // }
330
- // // Default/fallback logic for other cases
331
- // let baseY = self.isHeaderVisible ? short_tick_length_bg + 25 : short_tick_length_bg;
332
- // if (
333
- // subgroups.length > 1 &&
334
- // !metaData.xLabel &&
335
- // (/\d{2,4}[-\/]\d{2}[-\/]\d{2,4}/.test(d) || /\d{2,4}[-\/]\d{2,4}/.test(d))
336
- // ) {
337
- // baseY = self.isHeaderVisible ? short_tick_length_bg + 15 : short_tick_length_bg + 25;
338
- // }
339
- // if (/\d{2,4}[-\/]\d{2,4}/.test(d) && d.indexOf(' ') > -1) {
340
- // baseY += 4;
341
- // }
342
- // // In maximized view, reduce baseY slightly for grouped bars
343
- // if (self.chartConfiguration.isFullScreen && subgroups.length > 1) {
344
- // baseY = Math.max(short_tick_length_bg, baseY - 10);
345
- // }
346
- // return baseY;
347
- // })
348
- // .attr('x', function (d) {
349
- // if (self.chartData.data.length > 8 && !self.isZoomedOut) {
350
- // return 1; // Move first line text slightly to the left in zoom-in view for better alignment
351
- // }
352
- // return 0; // Default position
353
- // })
354
- // .text(function (d) {
355
- // var isValueToBeIgnored = false;
356
- // if (isMobile && !self.isHeaderVisible) {
357
- // let firstPart = d.split(/[\s\-]+/)[0];
358
- // return firstPart.substring(0, 3).toLowerCase();
359
- // }
360
- // (data as any[]).map((indiv: any) => {
361
- // if (
362
- // indiv.name &&
363
- // indiv.name.toLowerCase() == d.trim().toLowerCase() &&
364
- // indiv[metaData.keyList[0]] == -1
365
- // ) {
366
- // isValueToBeIgnored = true;
367
- // }
368
- // });
369
- // if (isValueToBeIgnored) {
370
- // return '';
371
- // }
372
- // // Always add space before and after hyphen for date range labels, even when header is visible and label is single line
373
- // // Apply for grouped bar charts and single bar charts, header visible, single line
374
- // const dateRangeRegex = /(\d{2,4}[-\/]\d{2}[-\/]\d{2,4})\s*-\s*(\d{2,4}[-\/]\d{2}[-\/]\d{2,4})/;
375
- // if (dateRangeRegex.test(d.trim())) {
376
- // return d.trim().replace(dateRangeRegex, (m, d1, d2) => `${d1} - ${d2}`);
377
- // }
378
- // // Split date and week labels into two lines in grouped bar zoom-in view (and minimized view)
379
- // const isDateLabel = /\d{2,4}[-\/]/.test(d);
380
- // const isWeekLabel = /week|wk|w\d+/i.test(d);
381
- // if (
382
- // subgroups.length > 1 && !self.isZoomedOut && data.length > 8 && d.indexOf(' ') > -1 && (isDateLabel || isWeekLabel)
383
- // ) {
384
- // var first = d.substring(0, d.indexOf(' '));
385
- // var second = d.substring(d.indexOf(' ') + 1).trim();
386
- // return first + '\n' + second;
387
- // }
388
- // // Also keep previous logic for minimized view
389
- // if (isDateLabel) {
390
- // if (!self.isHeaderVisible && data.length > 8 && d.indexOf(' ') > -1) {
391
- // var first = d.substring(0, d.indexOf(' '));
392
- // var second = d.substring(d.indexOf(' ') + 1).trim();
393
- // return first + '\n' + second;
394
- // } else {
395
- // return d;
396
- // }
397
- // }
398
- // if (d.trim().indexOf(' ') > -1) {
399
- // return d.trim().substring(0, d.indexOf(' ')).toLowerCase();
400
- // }
401
- // return d.toLowerCase();
402
- // // If label looks like a date (contains digits and - or /)
403
- // const isDateLabel2 = /\d{2,4}[-\/]/.test(d);
404
- // // Only split date/week labels if there are many grouped bars and header is not visible
405
- // if (isDateLabel) {
406
- // if (!self.isHeaderVisible && data.length > 8 && d.indexOf(' ') > -1) {
407
- // var first = d.substring(0, d.indexOf(' '));
408
- // var second = d.substring(d.indexOf(' ') + 1).trim();
409
- // return first + '\n' + second;
410
- // } else {
411
- // return d;
412
- // }
413
- // }
414
- // if (d.trim().indexOf(' ') > -1) {
415
- // return d.trim().substring(0, d.indexOf(' ')).toLowerCase();
416
- // }
417
- // return d.toLowerCase();
418
- // });
419
- // // Now apply writing-mode: sideways-lr for grouped charts with date labels in zoomed-out view and many bars
420
- // xAxisLabels.each(function(this: SVGTextElement, d: any) {
421
- // // Only apply writing-mode for exact date labels, not those containing 'week' or similar
422
- // const isDateLabel = /^(\d{2,4}[-\/])?\d{2,4}[-\/]\d{2,4}$/.test(d.trim());
423
- // const isWeekLabel = /week|wk|w\d+/i.test(d);
424
- // if (subgroups.length > 1 && self.isZoomedOut && data.length > 8 && isDateLabel && !isWeekLabel) {
425
- // d3.select(this).style('writing-mode', 'sideways-lr');
426
- // }
427
- // });
428
- // if (!isMobile) {
429
- // svg
430
- // .selectAll('g.x1.axis1 g.tick')
431
- // .filter(function (d) {
432
- // return !/\d{2,4}[-\/]/.test(d); // Only process non-date labels
433
- // })
434
- // .append('text')
435
- // .attr('class', 'lib-xaxis-labels-texts-drilldown')
436
- // .attr('y', long_tick_length_bg)
437
- // .attr('fill', 'var(--chart-text-color)')
438
- // .attr('x', function (d) {
439
- // if (self.chartData.data.length > 8 && !self.isZoomedOut) {
440
- // return 1; // Move text slightly to the left
441
- // }
442
- // return 0; // Default position
443
- // })
444
- // .text(function (d) {
445
- // if (d.trim().indexOf(' ') > -1) {
446
- // return d.trim().substring(d.indexOf(' '), d.length).toLowerCase();
447
- // }
448
- // return '';
449
- // });
450
- // }
451
- // }
452
- // if (isria && self.chartData.data.length > 8) {
453
- // svg
454
- // .selectAll('g.x1.axis1 g.tick text')
455
- // .classed('mobile-xaxis-override', true)
456
- // .text(function (d: string) {
457
- // return d.substring(0, 3);
458
- // })
459
- // .style('font-size', '12px')
460
- // .attr('y', 5)
461
- // .attr('x', 5)
462
- // .style('text-anchor', 'middle');
463
- // }
464
- // if (isMobile && !this.isHeaderVisible) {
465
- // svg
466
- // .selectAll('g.x1.axis1 g.tick text')
467
- // .classed('mobile-xaxis-override', true);
468
- // }
469
- // /**y scale for left y axis */
470
- // var y = d3.scaleLinear().rangeRound([height, 0]);
471
- // var maxValue = d3.max(data, (d) => d3.max(keyList, (key) => +d[key]));
472
- // if (maxValue == 0) {
473
- // if (this.chartData.targetLineData) {
474
- // maxValue = this.chartData.targetLineData.target + 20;
475
- // } else {
476
- // maxValue = 100;
477
- // }
478
- // }
479
- // if (this.chartConfiguration.customYscale) {
480
- // /**
481
- // * increase y-scale so that values wont cross or exceed out of range
482
- // * used in weekly charts
483
- // */
484
- // maxValue = maxValue * this.chartConfiguration.customYscale;
485
- // }
486
- // if (
487
- // this.chartData.targetLineData &&
488
- // maxValue < this.chartData.targetLineData.target
489
- // ) {
490
- // maxValue =
491
- // maxValue < 10 && this.chartData.targetLineData.target < 10
492
- // ? this.chartData.targetLineData.target + 3
493
- // : this.chartData.targetLineData.target + 20;
494
- // }
495
- // y.domain([0, maxValue]).nice();
496
- // let lineYscale;
497
- // if (lineData != null) {
498
- // let maxLineValue = d3.max(lineData, function (d) {
499
- // return +d.value;
500
- // });
501
- // maxLineValue = maxLineValue * this.chartConfiguration.customYscale;
502
- // let minLineValue = d3.min(lineData, function (d) {
503
- // return +d.value;
504
- // });
505
- // if (maxLineValue > 0) minLineValue = minLineValue - 3;
506
- // if (minLineValue > 0) {
507
- // minLineValue = 0;
508
- // }
509
- // lineYscale = d3
510
- // .scaleLinear()
511
- // .domain([minLineValue, maxLineValue])
512
- // .range([height, minLineValue]);
513
- // }
514
- // let yLineAxis;
515
- // if (lineYscale != null) {
516
- // yLineAxis = d3
517
- // .axisRight(lineYscale)
518
- // .ticks(self.chartConfiguration.numberOfYTicks)
519
- // .tickSize(0)
520
- // .tickFormat(self.chartConfiguration.yLineAxisLabelFomatter);
521
- // }
522
- // /**
523
- // * show x-axis grid between labels
524
- // * used by weekly charts
525
- // */
526
- // if (self.chartConfiguration.isXgridBetweenLabels) {
527
- // svg
528
- // .append('g')
529
- // .attr('class', 'grid')
530
- // .attr(
531
- // 'transform',
532
- // 'translate(' + x.bandwidth() / 2 + ',' + height + ')'
533
- // )
534
- // .call(d3.axisBottom(x).tickSize(-height).tickFormat(''))
535
- // .style('stroke-dasharray', '5 5')
536
- // .style('color', 'var(--chart-grid-color, #999999)') // Use CSS variable
537
- // .call((g) => g.select('.domain').remove());
538
- // }
539
- // if (this.chartConfiguration.yAxisGrid) {
540
- // svg
541
- // .append('g')
542
- // .call(
543
- // d3
544
- // .axisLeft(y)
545
- // .ticks(self.chartConfiguration.numberOfYTicks)
546
- // .tickSize(-width)
547
- // )
548
- // .style('color', 'var(--chart-axis-color, #B9B9B9)')
549
- // .style('opacity', '0.5')
550
- // .call((g) => {
551
- // g.select('.domain')
552
- // .remove()
553
- // .style('stroke', 'var(--chart-domain-color, #000000)'); // Add CSS variable for domain
554
- // });
555
- // } else {
556
- // svg
557
- // .append('g')
558
- // .call(d3.axisLeft(y).ticks(self.chartConfiguration.numberOfYTicks))
559
- // .style('color', 'var(--chart-axis-color, #B9B9B9)')
560
- // .style('opacity', '0.5')
561
- // .call((g) => {
562
- // g.select('.domain')
563
- // .style('stroke', 'var(--chart-domain-color, #000000)') // Add CSS variable for domain
564
- // .style('stroke-width', '1px'); // Ensure visibility
565
- // });
566
- // }
567
- // var xSubgroup = d3.scaleBand().domain(subgroups);
568
- // if (subgroups.length > 1 && !this.isZoomedOut) {
569
- // // For grouped bar charts in zoom-in view, use full x.bandwidth() for subgroups
570
- // xSubgroup.range([0, x.bandwidth()]);
571
- // } else if (subgroups.length === 1 && !this.isZoomedOut) {
572
- // // For single-bar (non-grouped) charts in zoom-in view, set bar width to 100 (increased from 80)
573
- // xSubgroup.range([0, 100]);
574
- // } else if (this.chartConfiguration.isMultiChartGridLine == undefined) {
575
- // xSubgroup.range([0, x.bandwidth()]);
576
- // } else {
577
- // // used to make grouped bars with lesser width as we are not using padding for width
578
- // xSubgroup.range([0, x.bandwidth()]);
579
- // }
580
- // // if (this.chartConfiguration.isDrilldownChart) {
581
- // // }
582
- // var color = d3
583
- // .scaleOrdinal()
584
- // .domain(subgroups)
585
- // .range(Object.values(metaData.colors));
586
- // // var colorAboveTarget = d3
587
- // // .scaleOrdinal()
588
- // // .domain(subgroups)
589
- // // .range(Object.values(metaData.colorAboveTarget));
590
- // var state = svg
591
- // .append('g')
592
- // .selectAll('.state')
593
- // .data(data)
594
- // .enter()
595
- // .append('g')
596
- // .attr('transform', function (d) {
597
- // return 'translate(' + x(d.name) + ',0)';
598
- // });
599
- // state
600
- // .selectAll('rect')
601
- // .data(function (d) {
602
- // let newList: any = [];
603
- // subgroups.map(function (key) {
604
- // // if (key !== "group") {
605
- // let obj: any = { key: key, value: d[key], name: d.name };
606
- // newList.push(obj);
607
- // // }
608
- // });
609
- // return newList;
610
- // })
611
- // .enter()
612
- // .append('rect')
613
- // .attr('class', 'bars')
614
- // .on('click', function (d) {
615
- // if (d.key != 'Target') {
616
- // if (
617
- // !metaData.barWithoutClick ||
618
- // !metaData.barWithoutClick.length ||
619
- // (!metaData.barWithoutClick.includes(d?.name) &&
620
- // !metaData.barWithoutClick.includes(d?.key))
621
- // )
622
- // // self.handleClick(d.data.name);
623
- // self.handleClick(d);
624
- // }
625
- // })
626
- // .attr('x', function (d) {
627
- // if (self.chartConfiguration.isDrilldownChart) {
628
- // data.map((indiv: any) => {
629
- // if (indiv.name == d.name) {
630
- // let keys = Object.keys(indiv).filter((temp, i) => i != 0);
631
- // tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
632
- // if (x.bandwidth() > 100) {
633
- // // Increase bar width a bit in zoom-in view
634
- // let reducedBarWidth = 60;
635
- // if (!self.isZoomedOut) {
636
- // reducedBarWidth = 30;
637
- // }
638
- // if (self.chartData.data.length == 1) {
639
- // if (Object.keys(self.chartData.data[0]).length == 2) {
640
- // tempScale.range([
641
- // 0 + (x.bandwidth() - reducedBarWidth) / 2,
642
- // x.bandwidth() - (x.bandwidth() - reducedBarWidth) / 2,
643
- // ]);
644
- // } else
645
- // tempScale.range([
646
- // 0 + (x.bandwidth() - reducedBarWidth) / 2,
647
- // x.bandwidth() - (x.bandwidth() - reducedBarWidth) / 2,
648
- // ]);
649
- // } else
650
- // tempScale.range([
651
- // 0 + (x.bandwidth() - reducedBarWidth) / 2,
652
- // x.bandwidth() - (x.bandwidth() - reducedBarWidth) / 2,
653
- // ]);
654
- // }
655
- // }
656
- // });
657
- // return tempScale(d.key);
658
- // }
659
- // return xSubgroup(d.key);
660
- // })
661
- // .attr('y', function (d) {
662
- // if (d.value == -1) {
663
- // return y(0);
664
- // }
665
- // if (d.value >= 0) {
666
- // const barHeight = height - y(d.value);
667
- // const minHeight = self.chartConfiguration.defaultBarHeight || 2;
668
- // return barHeight < minHeight ? y(0) - minHeight : y(d.value);
669
- // }
670
- // return y(0);
671
- // })
672
- // .attr('width', function (d) {
673
- // // For grouped bar charts in zoom-in view, set bar width to 50 for maximum thickness
674
- // if (subgroups.length > 1 && !self.isZoomedOut) {
675
- // return 50;
676
- // }
677
- // // For single-bar (non-grouped) charts in zoom-in view, set bar width to 80
678
- // if (subgroups.length === 1 && !self.isZoomedOut) {
679
- // return 80;
680
- // }
681
- // let tempScale = d3.scaleBand().domain([]).range([0, 0]);
682
- // // Default logic for other chart types
683
- // if (self.chartConfiguration.isDrilldownChart) {
684
- // data.map((indiv: any) => {
685
- // if (indiv.name == d.name) {
686
- // let keys = Object.keys(indiv).filter((temp, i) => i != 0);
687
- // tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
688
- // if (x.bandwidth() > 100) {
689
- // // Increase bar width a bit in zoom-in view
690
- // let reducedBarWidth = 60;
691
- // if (!self.isZoomedOut) {
692
- // reducedBarWidth = 100;
693
- // }
694
- // if (self.chartData.data.length == 1) {
695
- // if (Object.keys(self.chartData.data[0]).length == 2) {
696
- // tempScale.range([
697
- // 0 + (x.bandwidth() - reducedBarWidth) / 2,
698
- // x.bandwidth() - (x.bandwidth() - reducedBarWidth) / 2,
699
- // ]);
700
- // } else
701
- // tempScale.range([
702
- // 0 + (x.bandwidth() - reducedBarWidth) / 2,
703
- // x.bandwidth() - (x.bandwidth() - reducedBarWidth) / 2,
704
- // ]);
705
- // } else
706
- // tempScale.range([
707
- // 0 + (x.bandwidth() - reducedBarWidth) / 2,
708
- // x.bandwidth() - (x.bandwidth() - reducedBarWidth) / 2,
709
- // ]);
710
- // }
711
- // }
712
- // });
713
- // return self.isZoomedOut
714
- // ? tempScale.bandwidth()
715
- // : self.chartData.data.length && self.chartData.data.length > 8
716
- // ? tempScale.bandwidth()
717
- // : tempScale.bandwidth();
718
- // }
719
- // return self.isZoomedOut
720
- // ? tempScale.bandwidth()
721
- // : self.chartData.data.length && self.chartData.data.length > 8
722
- // ? tempScale.bandwidth()
723
- // : tempScale.bandwidth();
724
- // })
725
- // .attr('height', function (d) {
726
- // if (d.value == -1) {
727
- // return height - y(0);
728
- // }
729
- // if (d.value >= 0) {
730
- // const barHeight = height - y(d.value);
731
- // const minHeight = self.chartConfiguration.defaultBarHeight || 2;
732
- // return Math.max(barHeight, minHeight);
733
- // }
734
- // return height - y(0);
735
- // })
736
- // .style('cursor', function (d) {
737
- // if (metaData.hasDrillDown && !isria) return 'pointer';
738
- // else return 'default';
739
- // })
740
- // .attr('fill', function (d) {
741
- // if (
742
- // d.value &&
743
- // self.chartData.targetLineData &&
744
- // d.value >= parseFloat(self.chartData.targetLineData.target) &&
745
- // self.chartData.metaData.colorAboveTarget
746
- // ) {
747
- // const key = d.key.toLowerCase();
748
- // const colorAboveTarget = Object.keys(self.chartData.metaData.colorAboveTarget).find(
749
- // k => k.toLowerCase() === key
750
- // );
751
- // if (colorAboveTarget) {
752
- // return self.chartData.metaData.colorAboveTarget[colorAboveTarget];
753
- // }
754
- // }
755
- // return self.chartData.metaData.colors[d.key];
756
- // });
757
- // /**
758
- // * display angled texts on the bars
759
- // */
760
- // if (this.chartConfiguration.textsOnBar != undefined && !this.isZoomedOut) {
761
- // state
762
- // .selectAll('text')
763
- // .data(function (d) {
764
- // let newList: any = [];
765
- // subgroups.map(function (key) {
766
- // let obj: any = { key: key, value: d[key], name: d.name };
767
- // newList.push(obj);
768
- // });
769
- // return newList;
770
- // })
771
- // .enter()
772
- // .append('text')
773
- // .attr('fill', 'var(--chart-text-color)')
774
- // .attr('x', function (d) {
775
- // return 0;
776
- // })
777
- // .attr('y', function (d) {
778
- // return 0;
779
- // })
780
- // .attr('class', 'lib-data-labels-weeklycharts')
781
- // .text(function (d) {
782
- // return d.key && d.value
783
- // ? d.key.length > 20
784
- // ? d.key.substring(0, 17) + '...'
785
- // : d.key
786
- // : '';
787
- // })
788
- // .style('fill', function (d) {
789
- // return '#000';
790
- // })
791
- // .style('font-weight', 'bold')
792
- // .style('font-size', function (d) {
793
- // if (self.isZoomedOut) {
794
- // return '9px'; // 👈 Zoomed out mode
795
- // }
796
- // if (self.chartConfiguration.isDrilldownChart) {
797
- // if (window.innerWidth > 1900) {
798
- // return '18px';
799
- // } else if (window.innerWidth < 1400) {
800
- // return '10px';
801
- // } else {
802
- // return '14px';
803
- // }
804
- // } else {
805
- // return '14px';
806
- // }
807
- // })
808
- // .attr('transform', function (d) {
809
- // data.map((indiv: any) => {
810
- // if (indiv.name == d.name) {
811
- // let keys = Object.keys(indiv).filter((temp, i) => i != 0);
812
- // var temp;
813
- // tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
814
- // if (x.bandwidth() > 100) {
815
- // if (self.chartData.data.length == 1) {
816
- // if (Object.keys(self.chartData.data[0]).length == 2) {
817
- // tempScale.range([
818
- // 0 + (x.bandwidth() - 200) / 2,
819
- // x.bandwidth() - (x.bandwidth() - 200) / 2,
820
- // ]);
821
- // // .padding(0.05);
822
- // } else
823
- // tempScale.range([
824
- // 0 + (x.bandwidth() - 300) / 2,
825
- // x.bandwidth() - (x.bandwidth() - 300) / 2,
826
- // ]);
827
- // // .padding(0.05);
828
- // } else
829
- // tempScale.range([
830
- // 0 + (x.bandwidth() - 125) / 2,
831
- // x.bandwidth() - (x.bandwidth() - 125) / 2,
832
- // ]);
833
- // }
834
- // }
835
- // });
836
- // /**
837
- // * if set, then all texts ll be horizontal
838
- // */
839
- // if (self.chartConfiguration.textAlwaysHorizontal) {
840
- // return (
841
- // 'translate(' + xSubgroup(d.key) + ',' + (y(d.value) - 3) + ')'
842
- // );
843
- // }
844
- // /**
845
- // * rotate texts having more than one digits
846
- // */
847
- // // if (d.value > 9)
848
- // if (!isNaN(tempScale(d.key)))
849
- // return (
850
- // 'translate(' +
851
- // (tempScale(d.key) + tempScale.bandwidth() * 0.55) +
852
- // ',' +
853
- // (y(0) - 10) +
854
- // ') rotate(270)'
855
- // );
856
- // return 'translate(0,0)';
857
- // // else
858
- // // return (
859
- // // 'translate(' +
860
- // // (tempScale(d.key) + tempScale.bandwidth() / 2) +
861
- // // ',' +
862
- // // y(0) +
863
- // // ')'
864
- // // );
865
- // })
866
- // .on('click', function (d) {
867
- // if (
868
- // !metaData.barWithoutClick ||
869
- // !metaData.barWithoutClick.length ||
870
- // (!metaData.barWithoutClick.includes(d?.name) &&
871
- // !metaData.barWithoutClick.includes(d?.key))
872
- // )
873
- // self.handleClick(d);
874
- // });
875
- // if (!isria) {
876
- // state
877
- // .selectAll('.lib-data-labels-weeklycharts')
878
- // .on('mouseout', handleMouseOut)
879
- // .on('mouseover', handleMouseOver);
880
- // }
881
- // }
882
- // if (this.chartConfiguration.displayTitleOnTop || (
883
- // this.chartConfiguration.textsOnBar == undefined &&
884
- // this.chartConfiguration.displayTitleOnTop == undefined
885
- // )) {
886
- // if (!isria) {
887
- // state
888
- // .selectAll('rect')
889
- // .on('mouseout', handleMouseOut)
890
- // .on('mouseover', handleMouseOver);
891
- // }
892
- // }
893
- // function handleMouseOver(d, i) {
894
- // svg.selectAll('.lib-verticalstack-title-ontop').remove();
895
- // svg
896
- // .append('foreignObject')
897
- // .attr('x', function () {
898
- // // ...existing code for tempScale calculation...
899
- // var elementsCounter;
900
- // data.map((indiv: any) => {
901
- // if (indiv.name == d.name) {
902
- // let keys = Object.keys(indiv).filter((temp, i) => i != 0);
903
- // elementsCounter = keys.length;
904
- // tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
905
- // if (x.bandwidth() > 100) {
906
- // if (self.chartData.data.length == 1) {
907
- // if (Object.keys(self.chartData.data[0]).length == 2) {
908
- // tempScale.range([
909
- // 0 + (x.bandwidth() - 200) / 2,
910
- // x.bandwidth() - (x.bandwidth() - 200) / 2,
911
- // ]);
912
- // } else
913
- // tempScale.range([
914
- // 0 + (x.bandwidth() - 300) / 2,
915
- // x.bandwidth() - (x.bandwidth() - 300) / 2,
916
- // ]);
917
- // } else
918
- // tempScale.range([
919
- // 0 + (x.bandwidth() - 125) / 2,
920
- // x.bandwidth() - (x.bandwidth() - 125) / 2,
921
- // ]);
922
- // }
923
- // }
924
- // });
925
- // if (metaData.hasDrillDown) {
926
- // if (tempScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
927
- // return (
928
- // x(d.name) + tempScale(d.key) + tempScale.bandwidth() / 2 - 90
929
- // );
930
- // }
931
- // return (
932
- // x(d.name) +
933
- // tempScale(d.key) -
934
- // (tempScale.bandwidth() + leftAndRightSpaces * 2) / 2 +
935
- // tempScale.bandwidth() / 2
936
- // );
937
- // } else return x(d.name) + tempScale(d.key) - (tempScale.bandwidth() + leftAndRightSpaces * 2) / 2 + tempScale.bandwidth() / 2;
938
- // })
939
- // .attr('class', 'lib-verticalstack-title-ontop')
940
- // .attr('y', function () {
941
- // return y(d.value) - 3 - 40 - 10;
942
- // })
943
- // .attr('dy', function () {
944
- // return d.class;
945
- // })
946
- // .attr('width', function () {
947
- // data.map((indiv: any) => {
948
- // if (indiv.name == d.name) {
949
- // let keys = Object.keys(indiv).filter((temp, i) => i != 0);
950
- // tempScale = d3.scaleBand().domain(keys).range([0, x.bandwidth()]);
951
- // if (x.bandwidth() > 100) {
952
- // if (self.chartData.data.length == 1) {
953
- // if (Object.keys(self.chartData.data[0]).length == 2) {
954
- // tempScale.range([
955
- // 0 + (x.bandwidth() - 200) / 2,
956
- // x.bandwidth() - (x.bandwidth() - 200) / 2,
957
- // ]);
958
- // } else
959
- // tempScale.range([
960
- // 0 + (x.bandwidth() - 300) / 2,
961
- // x.bandwidth() - (x.bandwidth() - 300) / 2,
962
- // ]);
963
- // } else
964
- // tempScale.range([
965
- // 0 + (x.bandwidth() - 125) / 2,
966
- // x.bandwidth() - (x.bandwidth() - 125) / 2,
967
- // ]);
968
- // }
969
- // }
970
- // });
971
- // if (metaData.hasDrillDown) {
972
- // if (tempScale.bandwidth() + leftAndRightSpaces * 2 > 180) {
973
- // return '180px';
974
- // }
975
- // return tempScale.bandwidth() + leftAndRightSpaces * 2;
976
- // } else return tempScale.bandwidth() + leftAndRightSpaces * 2;
977
- // })
978
- // .attr('height', 50)
979
- // .append('xhtml:div')
980
- // .attr('class', 'title')
981
- // .style('z-index', 99)
982
- // .html(function () {
983
- // let barLabel = d.key;
984
- // let dataType = metaData.dataType ? metaData.dataType : '';
985
- // let value = d.value;
986
- // let desiredText =
987
- // '<span class="title-bar-name">' + barLabel + '</span>';
988
- // desiredText +=
989
- // '<span class="title-bar-value"><span>' +
990
- // value +
991
- // '</span>' +
992
- // dataType +
993
- // '</span>';
994
- // return desiredText;
995
- // });
996
- // }
997
- // function handleMouseOut(d, i) {
998
- // svg.selectAll('.lib-verticalstack-title-ontop').remove();
999
- // }
1000
- // svg
1001
- // .append('g')
1002
- // .attr('class', 'x2 axis2')
1003
- // .attr('transform', 'translate(0,' + height + ')')
1004
- // .style('color', 'var(--chart-axis-color, #000)') // Use CSS variable instead of hardcoded #000
1005
- // .call(d3.axisBottom(xScaleFromOrigin).tickSize(0))
1006
- // .call((g) => g.select('.domain').attr('fill', 'none'));
1007
- // svg.selectAll('g.x2.axis2 g.tick text').style('display', 'none');
1008
- // svg
1009
- // .append('g')
1010
- // .attr('class', 'lib-stacked-y-axis-text yaxis-dashed')
1011
- // .attr('style', self.chartConfiguration.yAxisCustomTextStyles)
1012
- // .attr('transform', 'translate(0,0)')
1013
- // .call(y)
1014
- // .style('display', 'none');
1015
- // svgYAxisLeft
1016
- // .append('g')
1017
- // .append('g')
1018
- // .attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
1019
- // .attr('style', self.chartConfiguration.yAxisCustomTextStyles)
1020
- // .attr('transform', 'translate(0,0)')
1021
- // .call(
1022
- // d3
1023
- // .axisLeft(y)
1024
- // .tickSize(0)
1025
- // .ticks(self.chartConfiguration.numberOfYTicks)
1026
- // .tickFormat(function (d) {
1027
- // const formatted = self.chartConfiguration.yAxisLabelFomatter
1028
- // ? self.chartConfiguration.yAxisLabelFomatter(d)
1029
- // : d;
1030
- // return formatted >= 1000 ? formatted / 1000 + 'k' : formatted;
1031
- // })
1032
- // )
1033
- // .call((g) => {
1034
- // // Style the domain line for theme support
1035
- // g.select('.domain')
1036
- // .style('stroke', 'var(--chart-domain-color, #000000)')
1037
- // .style('stroke-width', '1px');
1038
- // })
1039
- // .selectAll('text')
1040
- // .style('fill', 'var(--chart-text-color)');
1041
- // svgYAxisRight
1042
- // .append('g')
1043
- // .attr('class', 'lib-yaxis-labels-texts-drilldown yaxis-dashed')
1044
- // .attr('style', self.chartConfiguration.yAxisCustomTextStyles)
1045
- // .attr('transform', 'translate(0,0)')
1046
- // .call(y)
1047
- // .style('display', 'none');
1048
- // /**
1049
- // * hide x axis labels
1050
- // * config is there for future use
1051
- // * used by weekly charts
1052
- // */
1053
- // if (
1054
- // this.chartConfiguration.isXaxisLabelHidden != undefined &&
1055
- // this.chartConfiguration.isXaxisLabelHidden
1056
- // ) {
1057
- // d3.selectAll('g.lib-line-x-axis-text > g > text').attr(
1058
- // 'class',
1059
- // 'lib-display-hidden'
1060
- // );
1061
- // }
1062
- // /**
1063
- // * hide y axis labels
1064
- // * used by weekly charts
1065
- // */
1066
- // if (
1067
- // this.chartConfiguration.isYaxisLabelHidden != undefined &&
1068
- // this.chartConfiguration.isYaxisLabelHidden
1069
- // ) {
1070
- // d3.selectAll('.yaxis-dashed > g > text').attr(
1071
- // 'class',
1072
- // 'lib-display-hidden'
1073
- // );
1074
- // }
1075
- // /**
1076
- // * hide y axis labels
1077
- // * config is there for future use
1078
- // */
1079
- // if (
1080
- // this.chartConfiguration.isYaxisHidden != undefined &&
1081
- // this.chartConfiguration.isYaxisHidden
1082
- // ) {
1083
- // d3.selectAll('.yaxis-dashed').attr('class', 'lib-display-hidden');
1084
- // }
1085
- // /**
1086
- // * dashed y axis
1087
- // * used by weekly charts
1088
- // */
1089
- // if (
1090
- // this.chartConfiguration.isYaxisDashed != undefined &&
1091
- // this.chartConfiguration.isYaxisDashed
1092
- // ) {
1093
- // d3.selectAll('.yaxis-dashed')
1094
- // .style('stroke-dasharray', '5 5')
1095
- // .style('color', 'var(--chart-axis-color, #999999)'); // Use CSS variable
1096
- // }
1097
- // if (lineData != null) {
1098
- // if (lineData && self.chartConfiguration.showLineChartAxis) {
1099
- // svgYAxisRight
1100
- // .append('g')
1101
- // .attr('class', 'lib-stacked-y-axis-text1')
1102
- // .attr('style', self.chartConfiguration.yAxisCustomTextStyles)
1103
- // .attr('transform', 'translate(' + 0 + ',0)')
1104
- // .call(yLineAxis);
1105
- // }
1106
- // }
1107
- // /**
1108
- // * used to display y label
1109
- // */
1110
- // // if (this.isZoomedOut) {
1111
- // // svg
1112
- // // .selectAll('.lib-xaxis-labels-texts-drilldown')
1113
- // // .attr('class', 'lib-display-hidden');
1114
- // // }
1115
- // if (this.isZoomedOut) {
1116
- // svg
1117
- // .selectAll('.lib-xaxis-labels-texts-drilldown')
1118
- // .each((d, i, nodes) => {
1119
- // const text = d3.select(nodes[i]);
1120
- // const label = text.text();
1121
- // if (label.indexOf('\n') > -1) {
1122
- // const lines = label.split('\n');
1123
- // text.text(null);
1124
- // lines.forEach((line, idx) => {
1125
- // text.append('tspan')
1126
- // .text(line)
1127
- // .attr('x', 0)
1128
- // .attr('dy', idx === 0 ? '1em' : '1.1em');
1129
- // });
1130
- // } else {
1131
- // const words = label.split(' ');
1132
- // text.text(null);
1133
- // words.forEach((word, index) => {
1134
- // text.append('tspan').text(word);
1135
- // });
1136
- // }
1137
- // })
1138
- // .style('fill', 'var(--chart-text-color)')
1139
- // .attr('transform', null);
1140
- // svg
1141
- // .select('.x-axis')
1142
- // .attr('transform', `translate(0, ${height - margin.bottom + 10})`);
1143
- // }
1144
- // /**
1145
- // * used to write y labels based on configuration
1146
- // */
1147
- // if (metaData.yLabel) {
1148
- // const yPosition = isria ? 0 - margin.left / 2 - 30 : 0 - margin.left / 2 - 40;
1149
- // svgYAxisLeft
1150
- // .append('text')
1151
- // .attr('class', 'lib-axis-group-label font-size-1')
1152
- // .attr('style', self.chartConfiguration.yAxisCustomlabelStyles)
1153
- // .attr('transform', 'rotate(-90)')
1154
- // .attr('y', yPosition)
1155
- // .attr('x', 0 - height / 2)
1156
- // .attr('dy', '1em')
1157
- // .style('text-anchor', 'middle')
1158
- // .attr('fill', 'var(--chart-text-color)');
1159
- // if (this.chartConfiguration.isMultiChartGridLine === undefined) {
1160
- // svgYAxisLeft
1161
- // .selectAll('.lib-axis-group-label')
1162
- // .style('font-size', 'smaller')
1163
- // .text(metaData.yLabel);
1164
- // } else {
1165
- // svg
1166
- // .selectAll('.lib-axis-group-label')
1167
- // .attr('class', 'lib-ylabel-weeklyCharts')
1168
- // .text(metaData.yLabel.toLowerCase());
1169
- // }
1170
- // }
1171
- // if (this.chartData.targetLineData) {
1172
- // const yZero = y(this.chartData.targetLineData.target);
1173
- // svg
1174
- // .append('line')
1175
- // .attr('x1', 0)
1176
- // .attr('x2', width)
1177
- // .attr('y1', yZero)
1178
- // .attr('y2', yZero)
1179
- // .style('stroke-dasharray', '5 5')
1180
- // .style('stroke', this.chartData.targetLineData.color);
1181
- // // svgYAxisRight
1182
- // // .append('line')
1183
- // // .attr('x1', 0)
1184
- // // .attr('x2', rightSvgWidth)
1185
- // // .attr('y1', yZero)
1186
- // // .attr('y2', yZero)
1187
- // // .style('stroke', this.chartData.targetLineData.color);
1188
- // svgYAxisRight
1189
- // .append('foreignObject')
1190
- // .attr('transform', 'translate(' + 0 + ',' + (yZero - 30) + ')')
1191
- // .attr('width', rightSvgWidth)
1192
- // .attr('height', 50)
1193
- // .append('xhtml:div')
1194
- // .attr('class', 'target-display')
1195
- // .style('color', 'var(--chart-text-color)')
1196
- // .html(function () {
1197
- // let dataTypeTemp = '';
1198
- // let targetLineName = 'target';
1199
- // if (metaData.dataType) {
1200
- // dataTypeTemp = metaData.dataType;
1201
- // }
1202
- // if (
1203
- // self.chartData.targetLineData &&
1204
- // self.chartData.targetLineData.targetName
1205
- // ) {
1206
- // targetLineName = self.chartData.targetLineData.targetName;
1207
- // }
1208
- // return (
1209
- // `<div>${targetLineName}</div>` +
1210
- // '<div>' +
1211
- // self.chartData.targetLineData.target +
1212
- // '' +
1213
- // dataTypeTemp +
1214
- // '</div>'
1215
- // );
1216
- // });
1217
- // }
1218
- // if (this.chartConfiguration.isDrilldownChart) {
1219
- // /**
1220
- // * used by drilldown charts
1221
- // */
1222
- // // svg
1223
- // // .selectAll('.lib-axis-group-label')
1224
- // // .attr('class', 'lib-ylabel-drilldowncharts')
1225
- // // .text(metaData.yLabel.toLowerCase());
1226
- // svg.selectAll('g.x1.axis1 g.tick line').style('display', 'none');
1227
- // }
1228
- // if (metaData.xLabel) {
1229
- // function isAcronym(label) {
1230
- // return (
1231
- // (label.length <= 4 && /^[A-Z]+$/.test(label)) ||
1232
- // (label === label.toUpperCase() && /[A-Z]/.test(label))
1233
- // );
1234
- // }
1235
- // const xLabelText = metaData.xLabel;
1236
- // const isAcr = isAcronym(xLabelText.replace(/[^A-Za-z]/g, ''));
1237
- // const xPosition = isria ? (height + margin.top + margin.bottom) : (height + margin.top + margin.bottom + 40);
1238
- // svg
1239
- // .append('text')
1240
- // .attr('class', function () {
1241
- // let baseClass = 'lib-axis-group-label font-size-1';
1242
- // if (self.chartConfiguration.isDrilldownChart)
1243
- // return baseClass + ' lib-xlabel-drilldowncharts';
1244
- // if (self.chartConfiguration.isMultiChartGridLine != undefined)
1245
- // return baseClass + ' lib-xlabel-weeklyCharts';
1246
- // return baseClass + ' lib-axis-waterfall-label';
1247
- // })
1248
- // .attr('style', self.chartConfiguration.xAxisCustomlabelStyles)
1249
- // .attr(
1250
- // 'transform',
1251
- // 'translate(' + width / 2 + ' ,' + xPosition + ')'
1252
- // )
1253
- // .style('text-anchor', 'middle')
1254
- // .style('fill', 'var(--chart-text-color)')
1255
- // .text(isAcr ? xLabelText.toUpperCase() : xLabelText.toLowerCase())
1256
- // .style('text-transform', isAcr ? 'none' : 'capitalize');
1257
- // }
1258
- // if (metaData.lineyLabel) {
1259
- // svgYAxisRight
1260
- // .append('text')
1261
- // .attr('class', 'lib-axis-group-label lib-line-axis')
1262
- // .attr('fill', 'var(--chart-text-color)')
1263
- // .attr('style', self.chartConfiguration.yAxisCustomlabelStyles)
1264
- // .attr('transform', 'translate(0,0) rotate(90)')
1265
- // .attr('y', 0 - 100)
1266
- // .attr('x', 0 + 100)
1267
- // .attr('dy', '5em')
1268
- // .style('text-anchor', 'middle')
1269
- // .style('font-size', 'smaller')
1270
- // .text(metaData.lineyLabel);
1271
- // }
1272
- // if (lineData) {
1273
- // svg
1274
- // .append('path')
1275
- // .datum(lineData)
1276
- // .attr('fill', 'none')
1277
- // .attr('stroke', self.chartConfiguration.lineGraphColor)
1278
- // .attr('stroke-width', 1.5)
1279
- // .attr(
1280
- // 'd',
1281
- // d3
1282
- // .line()
1283
- // .x(function (d) {
1284
- // return x(d.name) + x.bandwidth() / 2;
1285
- // })
1286
- // .y(function (d) {
1287
- // return lineYscale(d.value);
1288
- // })
1289
- // );
1290
- // var dot = svg
1291
- // .selectAll('myCircles')
1292
- // .data(lineData)
1293
- // .enter()
1294
- // .append('g')
1295
- // .on('click', function (d) {
1296
- // if (
1297
- // !metaData.barWithoutClick ||
1298
- // !metaData.barWithoutClick.length ||
1299
- // (!metaData.barWithoutClick.includes(d?.name) &&
1300
- // !metaData.barWithoutClick.includes(d?.key))
1301
- // )
1302
- // self.handleClick(d);
1303
- // });
1304
- // dot
1305
- // .append('circle')
1306
- // .attr('fill', function (d) {
1307
- // return self.chartConfiguration.lineGraphColor;
1308
- // })
1309
- // .attr('stroke', 'none')
1310
- // .attr('cx', function (d) {
1311
- // return x(d.name) + x.bandwidth() / 2;
1312
- // })
1313
- // .attr('cy', function (d) {
1314
- // return lineYscale(d.value);
1315
- // })
1316
- // .style('cursor', () =>
1317
- // self.chartData.metaData.hasDrillDown ? 'pointer' : 'default'
1318
- // )
1319
- // .attr('r', 3);
1320
- // if (self.chartConfiguration.lineGraphColor) {
1321
- // dot
1322
- // .append('text')
1323
- // .attr('class', 'dot')
1324
- // .attr('fill', 'var(--chart-text-color)')
1325
- // .attr('color', self.chartConfiguration.lineGraphColor)
1326
- // .attr('style', 'font-size: ' + '.85em')
1327
- // .attr('x', function (d, i) {
1328
- // return x(d.name) + x.bandwidth() / 2;
1329
- // })
1330
- // .attr('y', function (d) {
1331
- // return lineYscale(d.value);
1332
- // })
1333
- // .attr('dy', '-1em')
1334
- // .text(function (d) {
1335
- // return self.chartConfiguration.labelFormatter(d.value);
1336
- // });
1337
- // }
1338
- // }
1339
- // }
1340
104
  initializegroupChart() {
1341
105
  // ==================== VARIABLE DECLARATIONS ====================
1342
106
  const self = this;
@@ -1447,7 +211,7 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
1447
211
  .domain(groups)
1448
212
  .range([0, width - RIGHT_SVG_WIDTH]);
1449
213
  // ==================== X-AXIS RENDERING ====================
1450
- this.renderXAxis(svg, x, height, metaData, subgroups, data, SHORT_TICK_LENGTH_BG, LONG_TICK_LENGTH_BG, self, isria, isMobile);
214
+ this.renderXAxis(svg, x, height, metaData, subgroups, data, SHORT_TICK_LENGTH_BG, LONG_TICK_LENGTH_BG, self, isria, isMobile, isTablet);
1451
215
  // ==================== Y-AXIS SETUP ====================
1452
216
  const y = d3.scaleLinear().rangeRound([height, 0]);
1453
217
  let maxValue = this.calculateMaxValue(data, keyList);
@@ -1498,13 +262,18 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
1498
262
  }
1499
263
  }
1500
264
  // ==================== HELPER METHODS ====================
1501
- renderXAxis(svg, x, height, metaData, subgroups, data, shortTickLengthBg, longTickLengthBg, self, isria, isMobile) {
265
+ renderXAxis(svg, x, height, metaData, subgroups, data, shortTickLengthBg, longTickLengthBg, self, isria, isMobile, isTablet) {
1502
266
  let alternate_text = false;
1503
267
  if (this.chartConfiguration.isMultiChartGridLine === undefined) {
1504
268
  // Normal ticks for dashboard charts
269
+ // Dynamically adjust Y translation for mobile
270
+ let translateY = height;
271
+ if (isMobile) {
272
+ translateY = height + 24; // Add extra space at the top for mobile
273
+ }
1505
274
  svg.append('g')
1506
275
  .attr('class', 'x1 axis1')
1507
- .attr('transform', `translate(0,${height})`)
276
+ .attr('transform', `translate(0,${translateY})`)
1508
277
  .call(d3.axisBottom(x))
1509
278
  .call((g) => g.select('.domain').remove());
1510
279
  svg.selectAll('g.x1.axis1 g.tick line').remove();
@@ -1564,7 +333,7 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
1564
333
  .attr('x', 5)
1565
334
  .style('text-anchor', 'middle');
1566
335
  }
1567
- // Mobile override - check for single-group date charts first
336
+ // Mobile/tablet override - check for single-group date charts first
1568
337
  if (isMobile) {
1569
338
  const textNodes = svg.selectAll('g.x1.axis1 g.tick text');
1570
339
  const groupsCount = data.length || 0;
@@ -1593,15 +362,6 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
1593
362
  // Default mobile behavior for non-date or multi-group
1594
363
  textNodes.classed('mobile-xaxis-override', true);
1595
364
  }
1596
- // If there are many groups on mobile, rotate labels to sideways to
1597
- // avoid overlapping and make them readable. Use a lower threshold
1598
- // (3) so even small mobile screens get rotated labels when needed.
1599
- if (groupsCount > 3) {
1600
- svg.selectAll('g.x1.axis1 g.tick text')
1601
- .style('writing-mode', 'sideways-lr')
1602
- .style('text-anchor', 'middle')
1603
- .attr('y', 0);
1604
- }
1605
365
  }
1606
366
  }
1607
367
  applyXLabelsOnSameLine(svg, subgroups, data, metaData, self, shortTickLengthBg, isMobile, isria) {
@@ -1666,17 +426,26 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
1666
426
  return baseY;
1667
427
  }
1668
428
  formatXLabelText(d, data, metaData, subgroups, self, isMobile) {
429
+ // Check if we're on mobile or tablet
430
+ const isSmallScreen = window.innerWidth < 992; // Less than 992px (mobile or tablet)
431
+ // Check if label contains both date and week information
432
+ const hasDateAndTime = (text) => {
433
+ const dateMatch = /\d{2,4}[-\/]\d{1,2}[-\/]\d{1,4}/.test(text) || !isNaN(Date.parse(text));
434
+ const weekMatch = /week|wk|w\d+/i.test(text);
435
+ return { isDate: dateMatch, isWeek: weekMatch };
436
+ };
437
+ const labelInfo = hasDateAndTime(d);
438
+ // When label contains both date and week, show it as-is (no trimming)
439
+ if (isSmallScreen && labelInfo.isDate && labelInfo.isWeek) {
440
+ return d;
441
+ }
1669
442
  // Mobile handling: keep date labels intact for single-series charts (do not trim)
1670
443
  if (isMobile) {
1671
- const isDateLabel = /\d{2,4}[-\/]\d{1,2}[-\/]\d{1,4}/.test(d) || !isNaN(Date.parse(d));
1672
- if (isDateLabel && subgroups && subgroups.length < 3) {
1673
- // For single-series charts on mobile, show full date labels (no trimming)
1674
- return d;
1675
- }
1676
444
  // If header is hidden (compact mobile), trim non-date labels as before
1677
445
  if (!self.isHeaderVisible) {
1678
- const firstPart = d.split(/[\s\-]+/)[0];
1679
- return firstPart.substring(0, 3).toLowerCase();
446
+ // const firstPart = d.split(/[\s\-]+/)[0];
447
+ // return firstPart.substring(0, 3).toLowerCase();
448
+ return d;
1680
449
  }
1681
450
  }
1682
451
  // Check if value should be ignored
@@ -1690,17 +459,15 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
1690
459
  if (dateRangeRegex.test(d.trim())) {
1691
460
  return d.trim().replace(dateRangeRegex, (m, d1, d2) => `${d1} - ${d2}`);
1692
461
  }
1693
- // Split date and week labels into two lines
1694
- const isDateLabel = /\d{2,4}[-\/]/.test(d);
1695
- const isWeekLabel = /week|wk|w\d+/i.test(d);
462
+ // Handle splitting of multi-part labels
1696
463
  if (subgroups.length > 1 && !self.isZoomedOut && data.length > 8 &&
1697
- d.indexOf(' ') > -1 && (isDateLabel || isWeekLabel)) {
464
+ d.indexOf(' ') > -1 && (labelInfo.isDate || labelInfo.isWeek)) {
1698
465
  const first = d.substring(0, d.indexOf(' '));
1699
466
  const second = d.substring(d.indexOf(' ') + 1).trim();
1700
467
  return `${first}\n${second}`;
1701
468
  }
1702
469
  // Handle date labels in minimized view
1703
- if (isDateLabel) {
470
+ if (labelInfo.isDate) {
1704
471
  if (!self.isHeaderVisible && data.length > 8 && d.indexOf(' ') > -1) {
1705
472
  const first = d.substring(0, d.indexOf(' '));
1706
473
  const second = d.substring(d.indexOf(' ') + 1).trim();
@@ -2299,7 +1066,7 @@ export class HorizontalGroupedBarWithScrollZoomComponent extends ComponentUnique
2299
1066
  // Minimum width per bar group based on device and number of subgroups
2300
1067
  const minWidthPerGroup = (() => {
2301
1068
  if (subgroupsCount > 2) {
2302
- return isMobile ? 80 : isTablet ? 100 : 120; // Wider for multiple subgroups
1069
+ return isMobile ? 100 : isTablet ? 100 : 120; // Wider for multiple subgroups
2303
1070
  }
2304
1071
  return isMobile ? 40 : isTablet ? 60 : 80; // Normal width for 1-2 subgroups
2305
1072
  })();
@@ -2438,4 +1205,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2438
1205
  }], headerMenuclickEvent: [{
2439
1206
  type: Output
2440
1207
  }] } });
2441
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxrQkFBa0IsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7OztBQVdsRCxNQUFNLE9BQU8sMkNBQ1gsU0FBUSxpQkFBaUI7SUF5RXpCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUEvREEsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6RCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUM5Qiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFD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bkZVLDJDQUEyQzttR0FBM0MsMkNBQTJDLGdoQkN6QnhELGs3SEF3SEE7OzRGRC9GYSwyQ0FBMkM7a0JBVHZELFNBQVM7K0JBQ0UsNkNBQTZDLGlCQU14QyxpQkFBaUIsQ0FBQyxJQUFJO3dEQU9yQyxZQUFZO3NCQURYLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUlsRCxpQkFBaUI7c0JBRGhCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdwQyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLHdCQUF3QjtzQkFBaEMsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRVbmlxdWVJZCB9IGZyb20gJy4uL3VuaXF1ZS1pZCc7XHJcbmltcG9ydCBDaGFydEhlbHBlciBmcm9tICcuLi9jaGFydC1oZWxwZXInO1xyXG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XHJcbmltcG9ydCB7IFJlc2l6ZWRFdmVudCB9IGZyb20gJ2FuZ3VsYXItcmVzaXplLWV2ZW50JztcclxuaW1wb3J0IEhlYWRlckNvbmZpZ0hlbHBlciBmcm9tICcuLi9oZWFkZXItY29uZmlnJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLWhvcml6b250YWwtZ3JvdXBlZC1iYXItd2l0aC1zY3JvbGwtem9vbScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2hvcml6b250YWwtZ3JvdXBlZC1iYXItd2l0aC1zY3JvbGwtem9vbS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbXHJcbiAgICAnLi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50Lmxlc3MnLFxyXG4gICAgJy4uL2NvbW1vbi1zdHlsZXMubGVzcycsXHJcbiAgXSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSG9yaXpvbnRhbEdyb3VwZWRCYXJXaXRoU2Nyb2xsWm9vbUNvbXBvbmVudFxyXG4gIGV4dGVuZHMgQ29tcG9uZW50VW5pcXVlSWRcclxuICBpbXBsZW1lbnRzIE9uSW5pdFxyXG57XHJcbiAgQFZpZXdDaGlsZCgnZ3JvdXBjaGFydGNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgY29udGFpbmVyRWx0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZ3JvdXBjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGdyb3VwY29udGFpbmVyRWx0ITogRWxlbWVudFJlZjtcclxuXHJcbiAgQElucHV0KCkgY2hhcnREYXRhOiBhbnk7XHJcbiAgQElucHV0KCkgY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uOiBhbnk7XHJcbiAgQE91dHB1dCgpIGNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgaGVhZGVyTWVudWNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBpc0hlYWRlclZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGxlZ2VuZFZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY2hhcnRDb25maWd1cmF0aW9uOiBhbnkgPSB7fTtcclxuICBvYmplY3RLZXlzID0gT2JqZWN0LmtleXM7XHJcblxyXG4gIGRlZmF1bHRDb25maWd1cmF0aW9uOiBhbnkgPSB7XHJcbiAgICBtYXJnaW46IHsgdG9wOiAyMCwgcmlnaHQ6IDIwLCBib3R0b206IDIwLCBsZWZ0OiA0MCB9LFxyXG4gICAgbGFiZWxGb3JtYXR0ZXI6IENoYXJ0SGVscGVyLmRlZmF1bHRGb3JtYXR0ZXIsXHJcbiAgICBzdmdIZWlnaHQ6IDcwLFxyXG4gICAgbnVtYmVyT2ZZVGlja3M6IDUsXHJcbiAgICBsZWdlbmRKdXN0aWZpZWQ6IHRydWUsXHJcbiAgICB5TGluZUF4aXNMYWJlbEZvbWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgeUF4aXNMYWJlbEZvbWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgbGluZUdyYXBoQ29sb3I6ICcjRjZEMjgzJyxcclxuICAgIHNob3dMaW5lQ2hhcnRBeGlzOiB0cnVlLFxyXG4gICAgc2hvd1ZhbHVlczogdHJ1ZSxcclxuICAgIGhlYWRlck1lbnVPcHRpb25zOiBIZWFkZXJDb25maWdIZWxwZXIuaGVhZGVyQ29uZmlnLmhlYWRlck1lbnVPcHRpb25zLFxyXG4gICAgeEF4aXNHcmlkOiB1bmRlZmluZWQsXHJcbiAgICB5QXhpc0dyaWQ6IGZhbHNlLFxyXG4gICAgbGVnZW5kVmlzaWJsZTogZmFsc2UsXHJcbiAgICBpc0hlYWRlclZpc2libGU6IHVuZGVmaW5lZCxcclxuICAgIGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kOiB1bmRlZmluZWQsXHJcbiAgICBpc011bHRpQ2hhcnRHcmlkTGluZTogdW5kZWZpbmVkLFxyXG4gICAgaXNGdWxsU2NyZWVuOiB1bmRlZmluZWQsXHJcbiAgICBjdXN0b21Zc2NhbGU6IHVuZGVmaW5lZCxcclxuICAgIHRleHRzT25CYXI6IHVuZGVmaW5lZCxcclxuICAgIGlzWGF4aXNMYWJlbEhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNZYXhpc0xhYmVsSGlkZGVuOiBmYWxzZSxcclxuICAgIGlzWWF4aXNIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGlzWWF4aXNEYXNoZWQ6IHVuZGVmaW5lZCxcclxuICAgIHRleHRGb3JtYXR0ZXI6IHVuZGVmaW5lZCxcclxuICAgIGlzTm9BbHRlcm5hdGVYYXhpc1RleHQ6IHVuZGVmaW5lZCxcclxuICAgIGlzWGdyaWRCZXR3ZWVuTGFiZWxzOiB1bmRlZmluZWQsXHJcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjRkZGRkZGJyxcclxuICAgIGhpZGVMZWdlbmRPblRvcDogdHJ1ZSxcclxuICAgIGlzWGF4aXNDb2xvcjogJyM5OTk5OTknLFxyXG4gICAgbGFiZWxPdmVybGFwTWlub3JGaXg6IHRydWUsXHJcbiAgICBub0hvdmVyRWZmZWN0OiB0cnVlLFxyXG4gICAgbm9Ib3ZlckRpc3BsYXlEYXRhOiB0cnVlLFxyXG4gICAgc2hvd1hheGlzVG9wOiB0cnVlLFxyXG4gICAgZGlzcGxheVlheGlzTGFiZWxzOiB1bmRlZmluZWQsXHJcbiAgICB4TGFiZWxzT25TYW1lTGluZTogdW5kZWZpbmVkLFxyXG4gICAgdGV4dEFsd2F5c0hvcml6b250YWw6IHVuZGVmaW5lZCxcclxuICAgIGxlZ2VuZEF0VG9wUmlnaHQ6IHVuZGVmaW5lZCxcclxuICAgIGlzRHJpbGxkb3duQ2hhcnQ6IHRydWUsXHJcbiAgICBkaXNwbGF5VGl0bGVPblRvcDogdW5kZWZpbmVkLFxyXG4gICAgaXNUb2dnbGVWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBpc1RpdGxlSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc0Rpc3BsYXlCYXJEZXRhaWxzQXRCb3R0b206IHVuZGVmaW5lZCxcclxuICAgIGhvd21hbnlCYXJEZXRhaWxzVG9EaXNwbGF5OiAwLFxyXG4gICAgYmFyVmF1bGVDb2xvcjogdW5kZWZpbmVkLFxyXG4gICAgZGVmYXVsdEJhckhlaWdodDogMixcclxuICB9O1xyXG5cclxuICB1bmlxdWVJZDogYW55ID0gdGhpcy5nZXRVbmlxdWVJZCgpO1xyXG4gIGlzWm9vbWVkT3V0OiBib29sZWFuID0gdHJ1ZTtcclxuICBpc0REMU9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0REMk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgb25SZXNpemVkKGV2ZW50OiBSZXNpemVkRXZlbnQpIHtcclxuICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgIHNldFRpbWVvdXQoXHJcbiAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBkMy5zZWxlY3QoJyMnICsgc2VsZi51bmlxdWVJZCkucmVtb3ZlKCk7XHJcbiAgICAgICAgc2VsZi5pbml0aWFsaXplZ3JvdXBDaGFydCgpO1xyXG4gICAgICB9LmJpbmQoc2VsZiksXHJcbiAgICAgIDEwXHJcbiAgICApO1xyXG4gIH1cclxuICBpc1pvb21PdXRTZWxlY3RlZChpc1pvb21PdXQsIGV2ZW50KSB7XHJcbiAgICB0aGlzLmlzWm9vbWVkT3V0ID0gaXNab29tT3V0O1xyXG4gICAgdGhpcy5vblJlc2l6ZWQoZXZlbnQpO1xyXG4gIH1cclxuICBoYW5kbGVab29taW5ab29tb3V0Q2xpY2soeyBpc1pvb21PdXQsIGV2ZW50IH0pIHtcclxuICAgIHRoaXMuaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0LCBldmVudCk7XHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge31cclxuICBpc0xlZ2VuZFZpc2libGUoKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhICYmXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycyAmJlxyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMpLmxlbmd0aCA+IDFcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAga2VlcE9yZGVyID0gKGEsIGIpID0+IHtcclxuICAgIHJldHVybiBhO1xyXG4gIH07XHJcblxyXG4gIGdldCBpc0FsZXJ0RW5hYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbj8uaGVhZGVyTWVudU9wdGlvbnM/LnNvbWUoXHJcbiAgICAgIChvcHRpb24pID0+IG9wdGlvbi5pZCA9PT0gJ2VkaXRBbGVydCdcclxuICAgICk7XHJcbiAgfSAgXHJcbi8vICAgaW5pdGlhbGl6ZWdyb3VwQ2hhcnQoKSB7XHJcbi8vICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbi8vICAgICBsZXQgZGF0YSA9IFtdO1xyXG4vLyAgICAgbGV0IG1ldGFEYXRhOiBhbnkgPSBudWxsO1xyXG4vLyAgICAgbGV0IGtleUxpc3QgPSBudWxsO1xyXG4vLyAgICAgbGV0IGxpbmVEYXRhID0gbnVsbDtcclxuLy8gICAgIGxldCBjb2xvck1hcCA9IHt9O1xyXG4vLyAgICAgdmFyIGZvcm1hdEZyb21CYWNrZW5kO1xyXG4vLyAgICAgdmFyIGZvcm1hdEZvckh1Z2VOdW1iZXJzO1xyXG4vLyAgICAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDU3NjtcclxuLy8gICAgIGNvbnN0IGlzVGFibGV0ID0gd2luZG93LmlubmVyV2lkdGggPj0gNTc2ICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgOTkyO1xyXG4vLyAgICAgY29uc3QgaXNEZXNrdG9wID0gd2luZG93LmlubmVyV2lkdGggPj0gOTkyO1xyXG5cclxuLy8gICAgbGV0IGlzcmlhID0gdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcclxuXHJcbi8vICAgICB2YXIgeDogYW55O1xyXG5cclxuLy8gICAgIHZhciBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG4vLyAgICAgdmFyIHNob3J0X3RpY2tfbGVuZ3RoID0gNDtcclxuLy8gICAgIHZhciBsb25nX3RpY2tfbGVuZ3RoID0gMTY7XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGxvbmdlciB0aWNrIGxlbmd0aCBuZWVkZWQgZm9yIHdlZWtseSBjaGFydHNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgdmFyIHNob3J0X3RpY2tfbGVuZ3RoX2JnID0gNTtcclxuLy8gICAgIHZhciBsb25nX3RpY2tfbGVuZ3RoX2JnID0gMzA7XHJcbi8vICAgICB2YXIgbGVmdEFuZFJpZ2h0U3BhY2VzID0gNTA7XHJcbi8vICAgICB2YXIgcmlnaHRTdmdXaWR0aCA9IDYwO1xyXG4vLyAgICAgdmFyIHRlbXBTY2FsZTtcclxuXHJcbi8vICAgICBmb3IgKHZhciBpIGluIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb25baV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbi8vICAgICAgICAgaSxcclxuLy8gICAgICAgICB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uLFxyXG4vLyAgICAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uXHJcbi8vICAgICAgICk7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgZGF0YSA9IHRoaXMuY2hhcnREYXRhLmRhdGE7XHJcbi8vICAgICBtZXRhRGF0YSA9IHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhO1xyXG4vLyAgICAgbGluZURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5saW5lRGF0YTtcclxuXHJcbi8vICAgICAvLyBpZiAobGluZURhdGEgfHwgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHtcclxuLy8gICAgIC8vICAgcmlnaHRTdmdXaWR0aCA9IDYwO1xyXG4vLyAgICAgLy8gfVxyXG4vLyAgICAgaWYgKCFtZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSB7XHJcbi8vICAgICAgIG1ldGFEYXRhWydjb2xvckFib3ZlVGFyZ2V0J10gPSBtZXRhRGF0YS5jb2xvcnM7XHJcbi8vICAgICB9XHJcbi8vICAgICBjb2xvck1hcCA9IG1ldGFEYXRhLmNvbG9ycztcclxuLy8gICAgIGtleUxpc3QgPSBtZXRhRGF0YS5rZXlMaXN0O1xyXG5cclxuLy8gICAgIHZhciBjaGFydENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmNvbnRhaW5lckVsdC5uYXRpdmVFbGVtZW50KTtcclxuLy8gICAgIHZhciB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIgPSBkMy5zZWxlY3QoXHJcbi8vICAgICAgIHRoaXMuZ3JvdXBjb250YWluZXJFbHQubmF0aXZlRWxlbWVudFxyXG4vLyAgICAgKTtcclxuLy8gICAgIHZhciBtYXJnaW4gPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW47XHJcbi8vICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuY2FsY3VsYXRlQ2hhcnREaW1lbnNpb25zKFxyXG4vLyAgICAgY2hhcnRDb250YWluZXIsXHJcbi8vICAgICB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIsXHJcbi8vICAgICBtYXJnaW4sXHJcbi8vICAgICBzZWxmXHJcbi8vICAgKTtcclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogZm9yIGhpZGluZyBoZWFkZXJcclxuLy8gICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlICE9IHVuZGVmaW5lZClcclxuLy8gICAgICAgdGhpcy5pc0hlYWRlclZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGU7XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGZvciBoaWRpbmcgbGVnZW5kc1xyXG4vLyAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRWaXNpYmxlICE9IHVuZGVmaW5lZCkge1xyXG4vLyAgICAgICB0aGlzLmxlZ2VuZFZpc2libGUgPSB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRWaXNpYmxlO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogZm9yIHJlbW92aW5nIGJhY2tncm91bmQgY29sb3Igc28gdGhhdCBpdCBjYW4gdGFrZSBwYXJlbnRzIGNvbG9yXHJcbi8vICAgICAgKlxyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQgIT0gdW5kZWZpbmVkKSB7XHJcbi8vICAgICAgIHRoaXMuaXNUcmFuc3BhcmVudEJhY2tncm91bmQgPVxyXG4vLyAgICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBmb3JtYXQgZGF0YSB2YWx1ZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiByZWNlaXZlZFxyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlciAhPSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgZm9ybWF0RnJvbUJhY2tlbmQgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIoXHJcbi8vICAgICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlclxyXG4vLyAgICAgICApO1xyXG4vLyAgICAgICBmb3JtYXRGb3JIdWdlTnVtYmVycyA9IENoYXJ0SGVscGVyLmRhdGFWYWx1ZUZvcm1hdHRlcignLjJzJyk7XHJcbi8vICAgICB9XHJcbi8vICAgICBjb25zdCB7XHJcbi8vICAgICBvdXRlckNvbnRhaW5lcixcclxuLy8gICAgIHN2Z1lBeGlzTGVmdCxcclxuLy8gICAgIHN2Z1lBeGlzUmlnaHQsXHJcbi8vICAgICBpbm5lckNvbnRhaW5lcixcclxuLy8gICAgIHN2Z1xyXG4vLyAgIH0gPSB0aGlzLmNyZWF0ZUNoYXJ0Q29udGFpbmVycyhjaGFydENvbnRhaW5lciwgbWFyZ2luLCBoZWlnaHQsIHJpZ2h0U3ZnV2lkdGgsIHNlbGYsIHdpZHRoKTtcclxuLy8gICAgIHZhciBzdWJncm91cHM6IGFueSA9IGtleUxpc3Q7XHJcblxyXG4vLyAgICAgdmFyIGdyb3VwcyA9IGQzXHJcbi8vICAgICAgIC5tYXAoZGF0YSwgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICByZXR1cm4gZC5uYW1lO1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAua2V5cygpO1xyXG5cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogeCBheGlzIHJhbmdlIG1hZGUgc2ltaWxhciB0byBsaW5lIGNoYXJ0IG9yIHZlcnRpY2FsIHN0YWNrIHNvIHRoYXQgYWxsIHRoZSBjaGFydHMgd2lsbCBnZXQgYWxpZ25lZCB3aXRoIGVhY2ggb3RoZXIuXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgeCA9IGQzXHJcbi8vICAgICAgICAgLnNjYWxlQmFuZCgpXHJcbi8vICAgICAgICAgLnJhbmdlUm91bmQoW3dpZHRoLCAwXSlcclxuLy8gICAgICAgICAuYWxpZ24oMC41KVxyXG4vLyAgICAgICAgIC5wYWRkaW5nKFswLjVdKVxyXG4vLyAgICAgICAgIC5kb21haW4oXHJcbi8vICAgICAgICAgICBkYXRhLm1hcChmdW5jdGlvbiAoZDogYW55KSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBkLm5hbWUudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICAgIH0pXHJcbi8vICAgICAgICAgKTtcclxuLy8gICAgIH0gZWxzZSB7XHJcbi8vICAgICAgIHggPSBkM1xyXG4vLyAgICAgICAgIC5zY2FsZUJhbmQoKVxyXG4vLyAgICAgICAgIC5kb21haW4oZ3JvdXBzKVxyXG4vLyAgICAgICAgIC5yYW5nZShbbGVmdEFuZFJpZ2h0U3BhY2VzLCB3aWR0aCAtIHJpZ2h0U3ZnV2lkdGggLSBsZWZ0QW5kUmlnaHRTcGFjZXNdKVxyXG4vLyAgICAgICAgIC5wYWRkaW5nKFswLjNdKTtcclxuLy8gICAgIH1cclxuLy8gICAgIC8vIHguYmFuZHdpZHRoKDk2KTtcclxuLy8gICAgIHZhciB4U2NhbGVGcm9tT3JpZ2luID0gZDNcclxuLy8gICAgICAgLnNjYWxlQmFuZCgpXHJcbi8vICAgICAgIC5kb21haW4oZ3JvdXBzKVxyXG4vLyAgICAgICAucmFuZ2UoWzAsIHdpZHRoIC0gcmlnaHRTdmdXaWR0aF0pO1xyXG4vLyAgICAgLy8gLnBhZGRpbmcoWzAuMl0pO1xyXG5cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIG5vcm1hbCB0aWNrcyBmb3IgYWxsIGRhc2hib2FyZCBjaGFydHNcclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwnICsgaGVpZ2h0ICsgJyknKVxyXG4vLyAgICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeCkpXHJcbi8vICAgICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykucmVtb3ZlKCkpO1xyXG5cclxuLy8gICAgICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLnJlbW92ZSgpO1xyXG5cclxuLy8gICAgICAgLy8gT25seSBtb3ZlIHgtYXhpcyBsYWJlbHMgZnVydGhlciBkb3duIGZvciBncm91cGVkIGNoYXJ0cyBpZiB0aGVyZSBpcyBubyB4TGFiZWxcclxuLy8gICAgICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFtZXRhRGF0YS54TGFiZWwpIHtcclxuLy8gICAgICAgICBzdmdcclxuLy8gICAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuLy8gICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgICAuYXR0cigneScsIDMyKTsgLy8gSW5jcmVhc2UgZGlzdGFuY2UgZnJvbSBiYXJzIChkZWZhdWx0IGlzIH45KVxyXG4vLyAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgIHN2Z1xyXG4vLyAgICAgICAgICAgLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbi8vICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4vLyAgICAgICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH0gXHJcbi8vICAgICBlbHNlIHtcclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIGJpZ2dlciB0aWNrcyBmb3Igd2Vla2x5IGNoYXJ0cyBhbmQgbW9yZSBzcGFjZSBmcm9tIHggYXhpcyB0byBsYWJlbHNcclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiBkcmF3IHggYXhpc1xyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gxIGF4aXMxJylcclxuLy8gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLCcgKyBoZWlnaHQgKyAnKScpXHJcbi8vICAgICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgwKSlcclxuLy8gICAgICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5hdHRyKCdmaWxsJywgJ25vbmUnKSk7XHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiB0aWNrIGxpbmUgc2l6ZSBpbiBhbHRlcm5hdGUgZmFzaGlvblxyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLmF0dHIoJ3kyJywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ICYmXHJcbi8vICAgICAgICAgICBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc05vQWx0ZXJuYXRlWGF4aXNUZXh0ID09IHVuZGVmaW5lZFxyXG4vLyAgICAgICAgICkge1xyXG4vLyAgICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuLy8gICAgICAgICAgIHJldHVybiBsb25nX3RpY2tfbGVuZ3RoX2JnIC0gNztcclxuLy8gICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoX2JnIC0gNDtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH0pO1xyXG4vLyAgICAgICAvKipcclxuLy8gICAgICAgICogcmVzZXQgdGhlIGZsYWcgc28gdGhhdCB2YWx1ZXMgY2FuIGJlIHNob3duIGluIHNhbWUgYWx0ZXJuYXRlIGZhc2hpb25cclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiBwcmludCB4LWF4aXMgbGFiZWwgdGV4dHNcclxuLy8gICAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgICAqL1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy13ZWVrbHljaGFydHMnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgLy8gTWluaW1pemUgZ2FwIGluIG1heGltaXplZCAoZnVsbHNjcmVlbikgdmlldyBmb3Igd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gc2hvcnRfdGlja19sZW5ndGhfYmc7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICBpZiAoYWx0ZXJuYXRlX3RleHQpIHtcclxuLy8gICAgICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGxvbmdfdGlja19sZW5ndGhfYmc7XHJcbi8vICAgICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IHRydWU7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBzaG9ydF90aWNrX2xlbmd0aF9iZztcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgIH1cclxuLy8gICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi54TGFiZWxzT25TYW1lTGluZSkge1xyXG4vLyAgICAgICBjb25zdCB4QXhpc0xhYmVscyA9IHN2Z1xyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbi8vICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCB0aGlzLmlzSGVhZGVyVmlzaWJsZSA/ICcxOHB4JyA6ICcxNHB4JylcclxuLy8gICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuLy8gICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uKGQpIHtcclxuLy8gICAgICAgICAgIC8vIEZvciBncm91cGVkIGJhciBjaGFydHMgd2l0aCBtYW55IGJhcnMgYW5kIHhMYWJlbCBwcmVzZW50LCBvbmx5IGFkZCA1IGlmIHRoZSBsYWJlbCBpcyBhIGRhdGVcclxuLy8gICAgICAgICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiBkYXRhLmxlbmd0aCA+IDggJiYgbWV0YURhdGEueExhYmVsKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IGlzRGF0ZUxhYmVsID0gL1xcZHsyLDR9Wy1cXC9dLy50ZXN0KGQpO1xyXG4vLyAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGlzRGF0ZUxhYmVsID8gc2hvcnRfdGlja19sZW5ndGhfYmcgKyAxNCA6IHNob3J0X3RpY2tfbGVuZ3RoX2JnO1xyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIHJldHVybiBpc0RhdGVMYWJlbCA/IHNob3J0X3RpY2tfbGVuZ3RoX2JnICsgMTQgOiBzaG9ydF90aWNrX2xlbmd0aF9iZztcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8vIEZvciBncm91cGVkIGJhciBjaGFydHMgd2l0aCBtYW55IGJhcnMgYW5kIE5PIHhMYWJlbCwgYWRkIHNwYWNlIGFzIGJlZm9yZSwgYnV0IHJlZHVjZSBpbiBmdWxsc2NyZWVuXHJcbi8vICAgICAgICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmICFtZXRhRGF0YS54TGFiZWwpIHtcclxuLy8gICAgICAgICAgICAgY29uc3QgY2hhcnRIYXNFeHRyYUJvdHRvbSA9IChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4gJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLmJvdHRvbSA+PSA0MCk7XHJcbi8vICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuLy8gICAgICAgICAgICAgICAvLyBSZWR1Y2UgZXh0cmEgZ2FwIGluIG1heGltaXplZCB2aWV3XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0X3RpY2tfbGVuZ3RoX2JnICsgMjtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gY2hhcnRIYXNFeHRyYUJvdHRvbSA/IHNob3J0X3RpY2tfbGVuZ3RoX2JnIDogc2hvcnRfdGlja19sZW5ndGhfYmcgKyAxMDtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8vIERlZmF1bHQvZmFsbGJhY2sgbG9naWMgZm9yIG90aGVyIGNhc2VzXHJcbi8vICAgICAgICAgICBsZXQgYmFzZVkgPSBzZWxmLmlzSGVhZGVyVmlzaWJsZSA/IHNob3J0X3RpY2tfbGVuZ3RoX2JnICsgMjUgOiBzaG9ydF90aWNrX2xlbmd0aF9iZztcclxuLy8gICAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgICAgc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiZcclxuLy8gICAgICAgICAgICAgIW1ldGFEYXRhLnhMYWJlbCAmJlxyXG4vLyAgICAgICAgICAgICAoL1xcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgfHwgL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkpXHJcbi8vICAgICAgICAgICApIHtcclxuLy8gICAgICAgICAgICAgYmFzZVkgPSBzZWxmLmlzSGVhZGVyVmlzaWJsZSA/IHNob3J0X3RpY2tfbGVuZ3RoX2JnICsgMTUgOiBzaG9ydF90aWNrX2xlbmd0aF9iZyArIDI1O1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgaWYgKC9cXGR7Miw0fVstXFwvXVxcZHsyLDR9Ly50ZXN0KGQpICYmIGQuaW5kZXhPZignICcpID4gLTEpIHtcclxuLy8gICAgICAgICAgICAgYmFzZVkgKz0gNDtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8vIEluIG1heGltaXplZCB2aWV3LCByZWR1Y2UgYmFzZVkgc2xpZ2h0bHkgZm9yIGdyb3VwZWQgYmFyc1xyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbiAmJiBzdWJncm91cHMubGVuZ3RoID4gMSkge1xyXG4vLyAgICAgICAgICAgICBiYXNlWSA9IE1hdGgubWF4KHNob3J0X3RpY2tfbGVuZ3RoX2JnLCBiYXNlWSAtIDEwKTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIHJldHVybiBiYXNlWTtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIDE7IC8vIE1vdmUgZmlyc3QgbGluZSB0ZXh0IHNsaWdodGx5IHRvIHRoZSBsZWZ0IGluIHpvb20taW4gdmlldyBmb3IgYmV0dGVyIGFsaWdubWVudFxyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgcmV0dXJuIDA7IC8vIERlZmF1bHQgcG9zaXRpb25cclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICB2YXIgaXNWYWx1ZVRvQmVJZ25vcmVkID0gZmFsc2U7XHJcbi8vICAgICAgICAgICBpZiAoaXNNb2JpbGUgJiYgIXNlbGYuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbi8vICAgICAgICAgICAgIGxldCBmaXJzdFBhcnQgPSBkLnNwbGl0KC9bXFxzXFwtXSsvKVswXTtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGZpcnN0UGFydC5zdWJzdHJpbmcoMCwgMykudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIChkYXRhIGFzIGFueVtdKS5tYXAoKGluZGl2OiBhbnkpID0+IHtcclxuLy8gICAgICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgICAgIGluZGl2Lm5hbWUgJiZcclxuLy8gICAgICAgICAgICAgICBpbmRpdi5uYW1lLnRvTG93ZXJDYXNlKCkgPT0gZC50cmltKCkudG9Mb3dlckNhc2UoKSAmJlxyXG4vLyAgICAgICAgICAgICAgIGluZGl2W21ldGFEYXRhLmtleUxpc3RbMF1dID09IC0xXHJcbi8vICAgICAgICAgICAgICkge1xyXG4vLyAgICAgICAgICAgICAgIGlzVmFsdWVUb0JlSWdub3JlZCA9IHRydWU7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgaWYgKGlzVmFsdWVUb0JlSWdub3JlZCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gJyc7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAvLyBBbHdheXMgYWRkIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgaHlwaGVuIGZvciBkYXRlIHJhbmdlIGxhYmVscywgZXZlbiB3aGVuIGhlYWRlciBpcyB2aXNpYmxlIGFuZCBsYWJlbCBpcyBzaW5nbGUgbGluZVxyXG4vLyAgICAgICAgICAgLy8gQXBwbHkgZm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyBhbmQgc2luZ2xlIGJhciBjaGFydHMsIGhlYWRlciB2aXNpYmxlLCBzaW5nbGUgbGluZVxyXG4vLyAgICAgICAgICAgY29uc3QgZGF0ZVJhbmdlUmVnZXggPSAvKFxcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0pXFxzKi1cXHMqKFxcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0pLztcclxuLy8gICAgICAgICAgIGlmIChkYXRlUmFuZ2VSZWdleC50ZXN0KGQudHJpbSgpKSkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gZC50cmltKCkucmVwbGFjZShkYXRlUmFuZ2VSZWdleCwgKG0sIGQxLCBkMikgPT4gYCR7ZDF9IC0gJHtkMn1gKTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8vIFNwbGl0IGRhdGUgYW5kIHdlZWsgbGFiZWxzIGludG8gdHdvIGxpbmVzIGluIGdyb3VwZWQgYmFyIHpvb20taW4gdmlldyAoYW5kIG1pbmltaXplZCB2aWV3KVxyXG4vLyAgICAgICAgICAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbi8vICAgICAgICAgICBjb25zdCBpc1dlZWtMYWJlbCA9IC93ZWVrfHdrfHdcXGQrL2kudGVzdChkKTtcclxuLy8gICAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgICAgc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgIXNlbGYuaXNab29tZWRPdXQgJiYgZGF0YS5sZW5ndGggPiA4ICYmIGQuaW5kZXhPZignICcpID4gLTEgJiYgKGlzRGF0ZUxhYmVsIHx8IGlzV2Vla0xhYmVsKVxyXG4vLyAgICAgICAgICAgKSB7XHJcbi8vICAgICAgICAgICAgIHZhciBmaXJzdCA9IGQuc3Vic3RyaW5nKDAsIGQuaW5kZXhPZignICcpKTtcclxuLy8gICAgICAgICAgICAgdmFyIHNlY29uZCA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpICsgMSkudHJpbSgpO1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gZmlyc3QgKyAnXFxuJyArIHNlY29uZDtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8vIEFsc28ga2VlcCBwcmV2aW91cyBsb2dpYyBmb3IgbWluaW1pemVkIHZpZXdcclxuLy8gICAgICAgICAgIGlmIChpc0RhdGVMYWJlbCkge1xyXG4vLyAgICAgICAgICAgICBpZiAoIXNlbGYuaXNIZWFkZXJWaXNpYmxlICYmIGRhdGEubGVuZ3RoID4gOCAmJiBkLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbi8vICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gZC5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpO1xyXG4vLyAgICAgICAgICAgICAgIHZhciBzZWNvbmQgPSBkLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSArIDEpLnRyaW0oKTtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gZmlyc3QgKyAnXFxuJyArIHNlY29uZDtcclxuLy8gICAgICAgICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gZDtcclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpLnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICByZXR1cm4gZC50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgICAgLy8gSWYgbGFiZWwgbG9va3MgbGlrZSBhIGRhdGUgKGNvbnRhaW5zIGRpZ2l0cyBhbmQgLSBvciAvKVxyXG4vLyAgICAgICAgICAgY29uc3QgaXNEYXRlTGFiZWwyID0gL1xcZHsyLDR9Wy1cXC9dLy50ZXN0KGQpO1xyXG4vLyAgICAgICAgICAgLy8gT25seSBzcGxpdCBkYXRlL3dlZWsgbGFiZWxzIGlmIHRoZXJlIGFyZSBtYW55IGdyb3VwZWQgYmFycyBhbmQgaGVhZGVyIGlzIG5vdCB2aXNpYmxlXHJcbi8vICAgICAgICAgICBpZiAoaXNEYXRlTGFiZWwpIHtcclxuLy8gICAgICAgICAgICAgaWYgKCFzZWxmLmlzSGVhZGVyVmlzaWJsZSAmJiBkYXRhLmxlbmd0aCA+IDggJiYgZC5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4vLyAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IGQuc3Vic3RyaW5nKDAsIGQuaW5kZXhPZignICcpKTtcclxuLy8gICAgICAgICAgICAgICB2YXIgc2Vjb25kID0gZC5zdWJzdHJpbmcoZC5pbmRleE9mKCcgJykgKyAxKS50cmltKCk7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ICsgJ1xcbicgKyBzZWNvbmQ7XHJcbi8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGQ7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIGlmIChkLnRyaW0oKS5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gZC50cmltKCkuc3Vic3RyaW5nKDAsIGQuaW5kZXhPZignICcpKS50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgcmV0dXJuIGQudG9Mb3dlckNhc2UoKTtcclxuLy8gICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgIC8vIE5vdyBhcHBseSB3cml0aW5nLW1vZGU6IHNpZGV3YXlzLWxyIGZvciBncm91cGVkIGNoYXJ0cyB3aXRoIGRhdGUgbGFiZWxzIGluIHpvb21lZC1vdXQgdmlldyBhbmQgbWFueSBiYXJzXHJcbi8vICAgICAgIHhBeGlzTGFiZWxzLmVhY2goZnVuY3Rpb24odGhpczogU1ZHVGV4dEVsZW1lbnQsIGQ6IGFueSkge1xyXG4vLyAgICAgICAgIC8vIE9ubHkgYXBwbHkgd3JpdGluZy1tb2RlIGZvciBleGFjdCBkYXRlIGxhYmVscywgbm90IHRob3NlIGNvbnRhaW5pbmcgJ3dlZWsnIG9yIHNpbWlsYXJcclxuLy8gICAgICAgICBjb25zdCBpc0RhdGVMYWJlbCA9IC9eKFxcZHsyLDR9Wy1cXC9dKT9cXGR7Miw0fVstXFwvXVxcZHsyLDR9JC8udGVzdChkLnRyaW0oKSk7XHJcbi8vICAgICAgICAgY29uc3QgaXNXZWVrTGFiZWwgPSAvd2Vla3x3a3x3XFxkKy9pLnRlc3QoZCk7XHJcbi8vICAgICAgICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmIHNlbGYuaXNab29tZWRPdXQgJiYgZGF0YS5sZW5ndGggPiA4ICYmIGlzRGF0ZUxhYmVsICYmICFpc1dlZWtMYWJlbCkge1xyXG4vLyAgICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCd3cml0aW5nLW1vZGUnLCAnc2lkZXdheXMtbHInKTtcclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgIH0pO1xyXG4vLyAgICAgICBpZiAoIWlzTW9iaWxlKSB7XHJcbi8vICAgICAgICAgc3ZnXHJcbi8vICAgICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbi8vICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiAhL1xcZHsyLDR9Wy1cXC9dLy50ZXN0KGQpOyAvLyBPbmx5IHByb2Nlc3Mgbm9uLWRhdGUgbGFiZWxzXHJcbi8vICAgICAgICAgICB9KVxyXG4vLyAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbi8vICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3knLCBsb25nX3RpY2tfbGVuZ3RoX2JnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4ICYmICFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIE1vdmUgdGV4dCBzbGlnaHRseSB0byB0aGUgbGVmdFxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIHJldHVybiAwOyAvLyBEZWZhdWx0IHBvc2l0aW9uXHJcbi8vICAgICAgICAgICB9KVxyXG4vLyAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuIGQudHJpbSgpLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSwgZC5sZW5ndGgpLnRvTG93ZXJDYXNlKCk7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgICAgICBpZiAoaXNyaWEgJiYgc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPiA4KSB7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4vLyAgICAgICAgIC5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCB0cnVlKVxyXG4vLyAgICAgICAgIC50ZXh0KGZ1bmN0aW9uIChkOiBzdHJpbmcpIHtcclxuLy8gICAgICAgICAgIHJldHVybiBkLnN1YnN0cmluZygwLCAzKTtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzEycHgnKSBcclxuLy8gICAgICAgICAuYXR0cigneScsIDUpICAgICAgICAgICAgICAgXHJcbi8vICAgICAgICAgLmF0dHIoJ3gnLCA1KSAgICAgICAgICAgICAgICBcclxuLy8gICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgaWYgKGlzTW9iaWxlICYmICF0aGlzLmlzSGVhZGVyVmlzaWJsZSkge1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuLy8gICAgICAgICAuY2xhc3NlZCgnbW9iaWxlLXhheGlzLW92ZXJyaWRlJywgdHJ1ZSk7XHJcbi8vICAgICB9XHJcbi8vICAgICAvKip5IHNjYWxlIGZvciBsZWZ0IHkgYXhpcyAqL1xyXG4vLyAgICAgdmFyIHkgPSBkMy5zY2FsZUxpbmVhcigpLnJhbmdlUm91bmQoW2hlaWdodCwgMF0pO1xyXG4vLyAgICAgdmFyIG1heFZhbHVlID0gZDMubWF4KGRhdGEsIChkKSA9PiBkMy5tYXgoa2V5TGlzdCwgKGtleSkgPT4gK2Rba2V5XSkpO1xyXG4vLyAgICAgaWYgKG1heFZhbHVlID09IDApIHtcclxuLy8gICAgICAgaWYgKHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhKSB7XHJcbi8vICAgICAgICAgbWF4VmFsdWUgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICBtYXhWYWx1ZSA9IDEwMDtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUpIHtcclxuLy8gICAgICAgLyoqXHJcbi8vICAgICAgICAqIGluY3JlYXNlIHktc2NhbGUgc28gdGhhdCB2YWx1ZXMgd29udCBjcm9zcyBvciBleGNlZWQgb3V0IG9mIHJhbmdlXHJcbi8vICAgICAgICAqIHVzZWQgaW4gd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICAgKi9cclxuLy8gICAgICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSAqIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZTtcclxuLy8gICAgIH1cclxuLy8gICAgIGlmIChcclxuLy8gICAgICAgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiZcclxuLy8gICAgICAgbWF4VmFsdWUgPCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXRcclxuLy8gICAgICkge1xyXG4vLyAgICAgICBtYXhWYWx1ZSA9XHJcbi8vICAgICAgICAgbWF4VmFsdWUgPCAxMCAmJiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgPCAxMFxyXG4vLyAgICAgICAgICAgPyB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAzXHJcbi8vICAgICAgICAgICA6IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgeS5kb21haW4oWzAsIG1heFZhbHVlXSkubmljZSgpO1xyXG4vLyAgICAgbGV0IGxpbmVZc2NhbGU7XHJcblxyXG4vLyAgICAgaWYgKGxpbmVEYXRhICE9IG51bGwpIHtcclxuLy8gICAgICAgbGV0IG1heExpbmVWYWx1ZSA9IGQzLm1heChsaW5lRGF0YSwgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICByZXR1cm4gK2QudmFsdWU7XHJcbi8vICAgICAgIH0pO1xyXG5cclxuLy8gICAgICAgbWF4TGluZVZhbHVlID0gbWF4TGluZVZhbHVlICogdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uY3VzdG9tWXNjYWxlO1xyXG5cclxuLy8gICAgICAgbGV0IG1pbkxpbmVWYWx1ZSA9IGQzLm1pbihsaW5lRGF0YSwgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICByZXR1cm4gK2QudmFsdWU7XHJcbi8vICAgICAgIH0pO1xyXG4vLyAgICAgICBpZiAobWF4TGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlID0gbWluTGluZVZhbHVlIC0gMztcclxuLy8gICAgICAgaWYgKG1pbkxpbmVWYWx1ZSA+IDApIHtcclxuLy8gICAgICAgICBtaW5MaW5lVmFsdWUgPSAwO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGxpbmVZc2NhbGUgPSBkM1xyXG4vLyAgICAgICAgIC5zY2FsZUxpbmVhcigpXHJcbi8vICAgICAgICAgLmRvbWFpbihbbWluTGluZVZhbHVlLCBtYXhMaW5lVmFsdWVdKVxyXG4vLyAgICAgICAgIC5yYW5nZShbaGVpZ2h0LCBtaW5MaW5lVmFsdWVdKTtcclxuLy8gICAgIH1cclxuLy8gICAgIGxldCB5TGluZUF4aXM7XHJcbi8vICAgICBpZiAobGluZVlzY2FsZSAhPSBudWxsKSB7XHJcbi8vICAgICAgIHlMaW5lQXhpcyA9IGQzXHJcbi8vICAgICAgICAgLmF4aXNSaWdodChsaW5lWXNjYWxlKVxyXG4vLyAgICAgICAgIC50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcylcclxuLy8gICAgICAgICAudGlja1NpemUoMClcclxuLy8gICAgICAgICAudGlja0Zvcm1hdChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55TGluZUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogc2hvdyB4LWF4aXMgZ3JpZCBiZXR3ZWVuIGxhYmVsc1xyXG4vLyAgICAgICogdXNlZCBieSB3ZWVrbHkgY2hhcnRzXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hncmlkQmV0d2VlbkxhYmVscykge1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCcpXHJcbi8vICAgICAgICAgLmF0dHIoXHJcbi8vICAgICAgICAgICAndHJhbnNmb3JtJyxcclxuLy8gICAgICAgICAgICd0cmFuc2xhdGUoJyArIHguYmFuZHdpZHRoKCkgLyAyICsgJywnICsgaGVpZ2h0ICsgJyknXHJcbi8vICAgICAgICAgKVxyXG4vLyAgICAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeCkudGlja1NpemUoLWhlaWdodCkudGlja0Zvcm1hdCgnJykpXHJcbi8vICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yLCAjOTk5OTk5KScpIC8vIFVzZSBDU1MgdmFyaWFibGVcclxuLy8gICAgICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzR3JpZCkge1xyXG4vLyAgICAgICBzdmdcclxuLy8gICAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgICAuY2FsbChcclxuLy8gICAgICAgICAgIGQzXHJcbi8vICAgICAgICAgICAgIC5heGlzTGVmdCh5KVxyXG4vLyAgICAgICAgICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbi8vICAgICAgICAgICAgIC50aWNrU2l6ZSgtd2lkdGgpXHJcbi8vICAgICAgICAgKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgI0I5QjlCOSknKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4vLyAgICAgICAgIC5jYWxsKChnKSA9PiB7XHJcbi8vICAgICAgICAgICBnLnNlbGVjdCgnLmRvbWFpbicpXHJcbi8vICAgICAgICAgICAgIC5yZW1vdmUoKVxyXG4vLyAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jaGFydC1kb21haW4tY29sb3IsICMwMDAwMDApJyk7IC8vIEFkZCBDU1MgdmFyaWFibGUgZm9yIGRvbWFpblxyXG4vLyAgICAgICAgIH0pO1xyXG4vLyAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgICAgLmNhbGwoZDMuYXhpc0xlZnQoeSkudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgI0I5QjlCOSknKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4vLyAgICAgICAgIC5jYWxsKChnKSA9PiB7XHJcbi8vICAgICAgICAgICBnLnNlbGVjdCgnLmRvbWFpbicpXHJcbi8vICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKSAvLyBBZGQgQ1NTIHZhcmlhYmxlIGZvciBkb21haW5cclxuLy8gICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4Jyk7IC8vIEVuc3VyZSB2aXNpYmlsaXR5XHJcbi8vICAgICAgICAgfSk7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgdmFyIHhTdWJncm91cCA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihzdWJncm91cHMpO1xyXG4vLyAgICAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyBpbiB6b29tLWluIHZpZXcsIHVzZSBmdWxsIHguYmFuZHdpZHRoKCkgZm9yIHN1Ymdyb3Vwc1xyXG4vLyAgIHhTdWJncm91cC5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgfSBlbHNlIGlmIChzdWJncm91cHMubGVuZ3RoID09PSAxICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgIC8vIEZvciBzaW5nbGUtYmFyIChub24tZ3JvdXBlZCkgY2hhcnRzIGluIHpvb20taW4gdmlldywgc2V0IGJhciB3aWR0aCB0byAxMDAgKGluY3JlYXNlZCBmcm9tIDgwKVxyXG4vLyAgICAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIDEwMF0pO1xyXG4vLyAgICAgfSBlbHNlIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PSB1bmRlZmluZWQpIHtcclxuLy8gICAgICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAvLyB1c2VkIHRvIG1ha2UgZ3JvdXBlZCBiYXJzIHdpdGggbGVzc2VyIHdpZHRoIGFzIHdlIGFyZSBub3QgdXNpbmcgcGFkZGluZyBmb3Igd2lkdGhcclxuLy8gICAgICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICB9XHJcbi8vICAgICAvLyBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG5cclxuLy8gICAgIC8vIH1cclxuLy8gICAgIHZhciBjb2xvciA9IGQzXHJcbi8vICAgICAgIC5zY2FsZU9yZGluYWwoKVxyXG4vLyAgICAgICAuZG9tYWluKHN1Ymdyb3VwcylcclxuLy8gICAgICAgLnJhbmdlKE9iamVjdC52YWx1ZXMobWV0YURhdGEuY29sb3JzKSk7XHJcbi8vICAgICAvLyB2YXIgY29sb3JBYm92ZVRhcmdldCA9IGQzXHJcbi8vICAgICAvLyAgIC5zY2FsZU9yZGluYWwoKVxyXG4vLyAgICAgLy8gICAuZG9tYWluKHN1Ymdyb3VwcylcclxuLy8gICAgIC8vICAgLnJhbmdlKE9iamVjdC52YWx1ZXMobWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkpO1xyXG4vLyAgICAgdmFyIHN0YXRlID0gc3ZnXHJcbi8vICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAuc2VsZWN0QWxsKCcuc3RhdGUnKVxyXG4vLyAgICAgICAuZGF0YShkYXRhKVxyXG4vLyAgICAgICAuZW50ZXIoKVxyXG4vLyAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHgoZC5uYW1lKSArICcsMCknO1xyXG4vLyAgICAgICB9KTtcclxuLy8gICAgIHN0YXRlXHJcbi8vICAgICAgIC5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4vLyAgICAgICAuZGF0YShmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIGxldCBuZXdMaXN0OiBhbnkgPSBbXTtcclxuLy8gICAgICAgICBzdWJncm91cHMubWFwKGZ1bmN0aW9uIChrZXkpIHtcclxuLy8gICAgICAgICAgIC8vIGlmIChrZXkgIT09IFwiZ3JvdXBcIikge1xyXG4vLyAgICAgICAgICAgbGV0IG9iajogYW55ID0geyBrZXk6IGtleSwgdmFsdWU6IGRba2V5XSwgbmFtZTogZC5uYW1lIH07XHJcbi8vICAgICAgICAgICBuZXdMaXN0LnB1c2gob2JqKTtcclxuLy8gICAgICAgICAgIC8vIH1cclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgICAgICByZXR1cm4gbmV3TGlzdDtcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLmVudGVyKClcclxuLy8gICAgICAgLmFwcGVuZCgncmVjdCcpXHJcbi8vICAgICAgIC5hdHRyKCdjbGFzcycsICdiYXJzJylcclxuLy8gICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgaWYgKGQua2V5ICE9ICdUYXJnZXQnKSB7XHJcbi8vICAgICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHxcclxuLy8gICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuLy8gICAgICAgICAgICAgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ubmFtZSkgJiZcclxuLy8gICAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/LmtleSkpXHJcbi8vICAgICAgICAgICApXHJcbi8vICAgICAgICAgICAgIC8vIHNlbGYuaGFuZGxlQ2xpY2soZC5kYXRhLm5hbWUpO1xyXG4vLyAgICAgICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbi8vICAgICAgICAgICBkYXRhLm1hcCgoaW5kaXY6IGFueSkgPT4ge1xyXG4vLyAgICAgICAgICAgICBpZiAoaW5kaXYubmFtZSA9PSBkLm5hbWUpIHtcclxuLy8gICAgICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT0gMCk7XHJcbi8vICAgICAgICAgICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbi8vICAgICAgICAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuLy8gICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIGJhciB3aWR0aCBhIGJpdCBpbiB6b29tLWluIHZpZXdcclxuLy8gICAgICAgICAgICAgICAgIGxldCByZWR1Y2VkQmFyV2lkdGggPSA2MDtcclxuLy8gICAgICAgICAgICAgICAgIGlmICghc2VsZi5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAgICAgICAgICAgICByZWR1Y2VkQmFyV2lkdGggPSAzMDtcclxuLy8gICAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PSAxKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzZWxmLmNoYXJ0RGF0YS5kYXRhWzBdKS5sZW5ndGggPT0gMikge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgcmV0dXJuIHRlbXBTY2FsZShkLmtleSk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICAgIHJldHVybiB4U3ViZ3JvdXAoZC5rZXkpO1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgaWYgKGQudmFsdWUgPT0gLTEpIHtcclxuLy8gICAgICAgICAgIHJldHVybiB5KDApO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgaWYgKGQudmFsdWUgPj0gMCkge1xyXG4vLyAgICAgICAgICAgY29uc3QgYmFySGVpZ2h0ID0gaGVpZ2h0IC0geShkLnZhbHVlKTtcclxuLy8gICAgICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmRlZmF1bHRCYXJIZWlnaHQgfHwgMjtcclxuLy8gICAgICAgICAgIHJldHVybiBiYXJIZWlnaHQgPCBtaW5IZWlnaHQgPyB5KDApIC0gbWluSGVpZ2h0IDogeShkLnZhbHVlKTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHJldHVybiB5KDApO1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuYXR0cignd2lkdGgnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIC8vIEZvciBncm91cGVkIGJhciBjaGFydHMgaW4gem9vbS1pbiB2aWV3LCBzZXQgYmFyIHdpZHRoIHRvIDUwIGZvciBtYXhpbXVtIHRoaWNrbmVzc1xyXG4vLyAgICAgICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIDUwO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICAvLyBGb3Igc2luZ2xlLWJhciAobm9uLWdyb3VwZWQpIGNoYXJ0cyBpbiB6b29tLWluIHZpZXcsIHNldCBiYXIgd2lkdGggdG8gODBcclxuLy8gICAgICAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA9PT0gMSAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIDgwO1xyXG4vLyAgICAgICAgIH1cclxuLy8gICAgICAgICAgIGxldCB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oW10pLnJhbmdlKFswLCAwXSk7XHJcbi8vICAgICAgICAgLy8gRGVmYXVsdCBsb2dpYyBmb3Igb3RoZXIgY2hhcnQgdHlwZXNcclxuLy8gICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4vLyAgICAgICAgICAgZGF0YS5tYXAoKGluZGl2OiBhbnkpID0+IHtcclxuLy8gICAgICAgICAgICAgaWYgKGluZGl2Lm5hbWUgPT0gZC5uYW1lKSB7XHJcbi8vICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4vLyAgICAgICAgICAgICAgIHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbi8vICAgICAgICAgICAgICAgICAvLyBJbmNyZWFzZSBiYXIgd2lkdGggYSBiaXQgaW4gem9vbS1pbiB2aWV3XHJcbi8vICAgICAgICAgICAgICAgICBsZXQgcmVkdWNlZEJhcldpZHRoID0gNjA7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgcmVkdWNlZEJhcldpZHRoID0gMTAwO1xyXG4vLyAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID09IDEpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PSAyKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICByZXR1cm4gc2VsZi5pc1pvb21lZE91dFxyXG4vLyAgICAgICAgICAgICA/IHRlbXBTY2FsZS5iYW5kd2lkdGgoKVxyXG4vLyAgICAgICAgICAgICA6IHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoICYmIHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOFxyXG4vLyAgICAgICAgICAgICA/IHRlbXBTY2FsZS5iYW5kd2lkdGgoKSBcclxuLy8gICAgICAgICAgICAgOiB0ZW1wU2NhbGUuYmFuZHdpZHRoKCk7XHJcbi8vICAgICAgICAgfVxyXG4vLyAgICAgICAgIHJldHVybiBzZWxmLmlzWm9vbWVkT3V0XHJcbi8vICAgICAgICAgICA/IHRlbXBTY2FsZS5iYW5kd2lkdGgoKVxyXG4vLyAgICAgICAgICAgOiBzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCAmJiBzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDhcclxuLy8gICAgICAgICAgID8gdGVtcFNjYWxlLmJhbmR3aWR0aCgpXHJcbi8vICAgICAgICAgICA6IHRlbXBTY2FsZS5iYW5kd2lkdGgoKTtcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLmF0dHIoJ2hlaWdodCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgaWYgKGQudmFsdWUgPT0gLTEpIHtcclxuLy8gICAgICAgICAgIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgaWYgKGQudmFsdWUgPj0gMCkge1xyXG4vLyAgICAgICAgICAgY29uc3QgYmFySGVpZ2h0ID0gaGVpZ2h0IC0geShkLnZhbHVlKTtcclxuLy8gICAgICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmRlZmF1bHRCYXJIZWlnaHQgfHwgMjtcclxuLy8gICAgICAgICAgIHJldHVybiBNYXRoLm1heChiYXJIZWlnaHQsIG1pbkhlaWdodCk7XHJcbi8vICAgICAgICAgfVxyXG5cclxuLy8gICAgICAgICByZXR1cm4gaGVpZ2h0IC0geSgwKTtcclxuLy8gICAgICAgfSlcclxuLy8gICAgICAgLnN0eWxlKCdjdXJzb3InLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24gJiYgIWlzcmlhKSByZXR1cm4gJ3BvaW50ZXInO1xyXG4vLyAgICAgICAgICAgZWxzZSByZXR1cm4gJ2RlZmF1bHQnO1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuYXR0cignZmlsbCcsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgaWYgKFxyXG4vLyAgICAgICAgICAgZC52YWx1ZSAmJlxyXG4vLyAgICAgICAgICAgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiZcclxuLy8gICAgICAgICAgIGQudmFsdWUgPj0gcGFyc2VGbG9hdChzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpICYmXHJcbi8vICAgICAgICAgICBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0XHJcbi8vICAgICAgICAgKSB7XHJcbi8vICAgICAgICAgICBjb25zdCBrZXkgPSBkLmtleS50b0xvd2VyQ2FzZSgpO1xyXG4vLyAgICAgICAgICAgY29uc3QgY29sb3JBYm92ZVRhcmdldCA9IE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXQpLmZpbmQoXHJcbi8vICAgICAgICAgICAgIGsgPT4gay50b0xvd2VyQ2FzZSgpID09PSBrZXlcclxuLy8gICAgICAgICAgICk7XHJcbi8vICAgICAgICAgICBpZiAoY29sb3JBYm92ZVRhcmdldCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldFtjb2xvckFib3ZlVGFyZ2V0XTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICB9XHJcbi8vICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbi8vICAgICAgIH0pO1xyXG5cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogZGlzcGxheSBhbmdsZWQgdGV4dHMgb24gdGhlIGJhcnNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgIT0gdW5kZWZpbmVkICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgIHN0YXRlXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbi8vICAgICAgICAgLmRhdGEoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIGxldCBuZXdMaXN0OiBhbnkgPSBbXTtcclxuLy8gICAgICAgICAgIHN1Ymdyb3Vwcy5tYXAoZnVuY3Rpb24gKGtleSkge1xyXG4vLyAgICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7IGtleToga2V5LCB2YWx1ZTogZFtrZXldLCBuYW1lOiBkLm5hbWUgfTtcclxuLy8gICAgICAgICAgICAgbmV3TGlzdC5wdXNoKG9iaik7XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIHJldHVybiBuZXdMaXN0O1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmVudGVyKClcclxuLy8gICAgICAgICAuYXBwZW5kKCd0ZXh0JylcclxuLy8gICAgICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIDA7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uIChkKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gMDtcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGF0YS1sYWJlbHMtd2Vla2x5Y2hhcnRzJylcclxuLy8gICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIGQua2V5ICYmIGQudmFsdWVcclxuLy8gICAgICAgICAgICAgPyBkLmtleS5sZW5ndGggPiAyMFxyXG4vLyAgICAgICAgICAgICAgID8gZC5rZXkuc3Vic3RyaW5nKDAsIDE3KSArICcuLi4nXHJcbi8vICAgICAgICAgICAgICAgOiBkLmtleVxyXG4vLyAgICAgICAgICAgICA6ICcnO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLnN0eWxlKCdmaWxsJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiAnIzAwMCc7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIGlmIChzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiAnOXB4JzsgLy8g8J+RiCBab29tZWQgb3V0IG1vZGVcclxuLy8gICAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4vLyAgICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiAxOTAwKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuICcxOHB4JztcclxuLy8gICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDE0MDApIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gJzEwcHgnO1xyXG4vLyAgICAgICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiAnMTRweCc7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH0gZWxzZSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiAnMTRweCc7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmIChpbmRpdi5uYW1lID09IGQubmFtZSkge1xyXG4vLyAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPSAwKTtcclxuLy8gICAgICAgICAgICAgICB2YXIgdGVtcDtcclxuLy8gICAgICAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgICAgICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID09IDEpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PSAyKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgLy8gLnBhZGRpbmcoMC4wNSk7XHJcbi8vICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgICAvLyAucGFkZGluZygwLjA1KTtcclxuLy8gICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgLyoqXHJcbi8vICAgICAgICAgICAgKiBpZiBzZXQsIHRoZW4gYWxsIHRleHRzIGxsIGJlIGhvcml6b250YWxcclxuLy8gICAgICAgICAgICAqL1xyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnRleHRBbHdheXNIb3Jpem9udGFsKSB7XHJcbi8vICAgICAgICAgICAgIHJldHVybiAoXHJcbi8vICAgICAgICAgICAgICAgJ3RyYW5zbGF0ZSgnICsgeFN1Ymdyb3VwKGQua2V5KSArICcsJyArICh5KGQudmFsdWUpIC0gMykgKyAnKSdcclxuLy8gICAgICAgICAgICAgKTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICAgIC8qKlxyXG4vLyAgICAgICAgICAgICogcm90YXRlIHRleHRzIGhhdmluZyBtb3JlIHRoYW4gb25lIGRpZ2l0c1xyXG4vLyAgICAgICAgICAgICovXHJcbi8vICAgICAgICAgICAvLyBpZiAoZC52YWx1ZSA+IDkpXHJcbi8vICAgICAgICAgICBpZiAoIWlzTmFOKHRlbXBTY2FsZShkLmtleSkpKVxyXG4vLyAgICAgICAgICAgICByZXR1cm4gKFxyXG4vLyAgICAgICAgICAgICAgICd0cmFuc2xhdGUoJyArXHJcbi8vICAgICAgICAgICAgICAgKHRlbXBTY2FsZShkLmtleSkgKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKiAwLjU1KSArXHJcbi8vICAgICAgICAgICAgICAgJywnICtcclxuLy8gICAgICAgICAgICAgICAoeSgwKSAtIDEwKSArXHJcbi8vICAgICAgICAgICAgICAgJykgcm90YXRlKDI3MCknXHJcbi8vICAgICAgICAgICAgICk7XHJcbi8vICAgICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgwLDApJztcclxuLy8gICAgICAgICAgIC8vIGVsc2VcclxuLy8gICAgICAgICAgIC8vICAgcmV0dXJuIChcclxuLy8gICAgICAgICAgIC8vICAgICAndHJhbnNsYXRlKCcgK1xyXG4vLyAgICAgICAgICAgLy8gICAgICh0ZW1wU2NhbGUoZC5rZXkpICsgdGVtcFNjYWxlLmJhbmR3aWR0aCgpIC8gMikgK1xyXG4vLyAgICAgICAgICAgLy8gICAgICcsJyArXHJcbi8vICAgICAgICAgICAvLyAgICAgeSgwKSArXHJcbi8vICAgICAgICAgICAvLyAgICAgJyknXHJcbi8vICAgICAgICAgICAvLyAgICk7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljayB8fFxyXG4vLyAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmxlbmd0aCB8fFxyXG4vLyAgICAgICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJlxyXG4vLyAgICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSlcclxuLy8gICAgICAgICAgIClcclxuLy8gICAgICAgICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgICAgICAgICAgaWYgKCFpc3JpYSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgIHN0YXRlXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgnLmxpYi1kYXRhLWxhYmVscy13ZWVrbHljaGFydHMnKVxyXG4vLyAgICAgICAgIC5vbignbW91c2VvdXQnLCBoYW5kbGVNb3VzZU91dClcclxuLy8gICAgICAgICAub24oJ21vdXNlb3ZlcicsIGhhbmRsZU1vdXNlT3Zlcik7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgIH1cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCB8fCAoXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgPT0gdW5kZWZpbmVkICYmXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wID09IHVuZGVmaW5lZFxyXG4vLyAgICAgKSkge1xyXG5cclxuLy8gICAgICAgICAgICAgICAgICAgaWYgKCFpc3JpYSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgncmVjdCcpXHJcbi8vICAgICAgICAgLm9uKCdtb3VzZW91dCcsIGhhbmRsZU1vdXNlT3V0KVxyXG4vLyAgICAgICAgIC5vbignbW91c2VvdmVyJywgaGFuZGxlTW91c2VPdmVyKTtcclxuLy8gICAgICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgICAgZnVuY3Rpb24gaGFuZGxlTW91c2VPdmVyKGQsIGkpIHtcclxuLy8gICAgICAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2ZvcmVpZ25PYmplY3QnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd4JywgZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgLy8gLi4uZXhpc3RpbmcgY29kZSBmb3IgdGVtcFNjYWxlIGNhbGN1bGF0aW9uLi4uXHJcbi8vICAgICAgICAgICB2YXIgZWxlbWVudHNDb3VudGVyO1xyXG4vLyAgICAgICAgICAgZGF0YS5tYXAoKGluZGl2OiBhbnkpID0+IHtcclxuLy8gICAgICAgICAgICAgaWYgKGluZGl2Lm5hbWUgPT0gZC5uYW1lKSB7XHJcbi8vICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9IDApO1xyXG4vLyAgICAgICAgICAgICAgIGVsZW1lbnRzQ291bnRlciA9IGtleXMubGVuZ3RoO1xyXG4vLyAgICAgICAgICAgICAgIHRlbXBTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4vLyAgICAgICAgICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbi8vICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT0gMSkge1xyXG4vLyAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09IDIpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW1xyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAyMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICBdKTtcclxuLy8gICAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMzAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICB9IGVsc2VcclxuLy8gICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICB4LmJhbmR3aWR0aCgpIC0gKHguYmFuZHdpZHRoKCkgLSAxMjUpIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24pIHtcclxuLy8gICAgICAgICAgICAgaWYgKHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIgPiAxODApIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gKFxyXG4vLyAgICAgICAgICAgICAgICAgeChkLm5hbWUpICsgdGVtcFNjYWxlKGQua2V5KSArIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAvIDIgLSA5MFxyXG4vLyAgICAgICAgICAgICAgICk7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgcmV0dXJuIChcclxuLy8gICAgICAgICAgICAgICB4KGQubmFtZSkgK1xyXG4vLyAgICAgICAgICAgICAgIHRlbXBTY2FsZShkLmtleSkgLVxyXG4vLyAgICAgICAgICAgICAgICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyKSAvIDIgK1xyXG4vLyAgICAgICAgICAgICAgIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSAvIDJcclxuLy8gICAgICAgICAgICAgKTtcclxuLy8gICAgICAgICAgIH0gZWxzZSByZXR1cm4geChkLm5hbWUpICsgdGVtcFNjYWxlKGQua2V5KSAtICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyKSAvIDIgKyB0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuLy8gICAgICAgICAuYXR0cigneScsIGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIHJldHVybiB5KGQudmFsdWUpIC0gMyAtIDQwIC0gMTA7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignZHknLCBmdW5jdGlvbiAoKSB7XHJcbi8vICAgICAgICAgICByZXR1cm4gZC5jbGFzcztcclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIGRhdGEubWFwKChpbmRpdjogYW55KSA9PiB7XHJcbi8vICAgICAgICAgICAgIGlmIChpbmRpdi5uYW1lID09IGQubmFtZSkge1xyXG4vLyAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPSAwKTtcclxuLy8gICAgICAgICAgICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuLy8gICAgICAgICAgICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4vLyAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID09IDEpIHtcclxuLy8gICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PSAyKSB7XHJcbi8vICAgICAgICAgICAgICAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIDAgKyAoeC5iYW5kd2lkdGgoKSAtIDIwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMjAwKSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgXSk7XHJcbi8vICAgICAgICAgICAgICAgICAgIH0gZWxzZVxyXG4vLyAgICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgICAwICsgKHguYmFuZHdpZHRoKCkgLSAzMDApIC8gMixcclxuLy8gICAgICAgICAgICAgICAgICAgICAgIHguYmFuZHdpZHRoKCkgLSAoeC5iYW5kd2lkdGgoKSAtIDMwMCkgLyAyLFxyXG4vLyAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgICAgfSBlbHNlXHJcbi8vICAgICAgICAgICAgICAgICAgIHRlbXBTY2FsZS5yYW5nZShbXHJcbi8vICAgICAgICAgICAgICAgICAgICAgMCArICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgICAgeC5iYW5kd2lkdGgoKSAtICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDIsXHJcbi8vICAgICAgICAgICAgICAgICAgIF0pO1xyXG4vLyAgICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgfVxyXG4vLyAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbi8vICAgICAgICAgICAgIGlmICh0ZW1wU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyID4gMTgwKSB7XHJcbi8vICAgICAgICAgICAgICAgcmV0dXJuICcxODBweCc7XHJcbi8vICAgICAgICAgICAgIH1cclxuLy8gICAgICAgICAgICAgcmV0dXJuIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDI7XHJcbi8vICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHRlbXBTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDI7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignaGVpZ2h0JywgNTApXHJcbi8vICAgICAgICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuLy8gICAgICAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxyXG4vLyAgICAgICAgIC5zdHlsZSgnei1pbmRleCcsIDk5KVxyXG4vLyAgICAgICAgIC5odG1sKGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIGxldCBiYXJMYWJlbCA9IGQua2V5O1xyXG4vLyAgICAgICAgICAgbGV0IGRhdGFUeXBlID0gbWV0YURhdGEuZGF0YVR5cGUgPyBtZXRhRGF0YS5kYXRhVHlwZSA6ICcnO1xyXG4vLyAgICAgICAgICAgbGV0IHZhbHVlID0gZC52YWx1ZTtcclxuLy8gICAgICAgICAgIGxldCBkZXNpcmVkVGV4dCA9XHJcbi8vICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRpdGxlLWJhci1uYW1lXCI+JyArIGJhckxhYmVsICsgJzwvc3Bhbj4nO1xyXG4vLyAgICAgICAgICAgZGVzaXJlZFRleHQgKz1cclxuLy8gICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwidGl0bGUtYmFyLXZhbHVlXCI+PHNwYW4+JyArXHJcbi8vICAgICAgICAgICAgIHZhbHVlICtcclxuLy8gICAgICAgICAgICAgJzwvc3Bhbj4nICtcclxuLy8gICAgICAgICAgICAgZGF0YVR5cGUgK1xyXG4vLyAgICAgICAgICAgICAnPC9zcGFuPic7XHJcbi8vICAgICAgICAgICByZXR1cm4gZGVzaXJlZFRleHQ7XHJcbi8vICAgICAgICAgfSk7XHJcbi8vICAgICB9XHJcbi8vICAgICBmdW5jdGlvbiBoYW5kbGVNb3VzZU91dChkLCBpKSB7XHJcbi8vICAgICAgIHN2Zy5zZWxlY3RBbGwoJy5saWItdmVydGljYWxzdGFjay10aXRsZS1vbnRvcCcpLnJlbW92ZSgpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgc3ZnXHJcbi8vICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAuYXR0cignY2xhc3MnLCAneDIgYXhpczInKVxyXG4vLyAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLCcgKyBoZWlnaHQgKyAnKScpXHJcbi8vICAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgIzAwMCknKSAvLyBVc2UgQ1NTIHZhcmlhYmxlIGluc3RlYWQgb2YgaGFyZGNvZGVkICMwMDBcclxuLy8gICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4U2NhbGVGcm9tT3JpZ2luKS50aWNrU2l6ZSgwKSlcclxuLy8gICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykuYXR0cignZmlsbCcsICdub25lJykpO1xyXG4vLyAgICAgc3ZnLnNlbGVjdEFsbCgnZy54Mi5heGlzMiBnLnRpY2sgdGV4dCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuLy8gICAgIHN2Z1xyXG4vLyAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0IHlheGlzLWRhc2hlZCcpXHJcbi8vICAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuLy8gICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbi8vICAgICAgIC5jYWxsKHkpXHJcbi8vICAgICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcbi8vICAgICBzdmdZQXhpc0xlZnRcclxuLy8gICAgICAgLmFwcGVuZCgnZycpXHJcbi8vICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuLy8gICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4vLyAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuLy8gICAgICAgLmNhbGwoXHJcbi8vICAgICAgICAgZDNcclxuLy8gICAgICAgICAgIC5heGlzTGVmdCh5KVxyXG4vLyAgICAgICAgICAgLnRpY2tTaXplKDApXHJcbi8vICAgICAgICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbi8vICAgICAgICAgICAudGlja0Zvcm1hdChmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQgPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0xhYmVsRm9tYXR0ZXJcclxuLy8gICAgICAgICAgICAgICA/IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzTGFiZWxGb21hdHRlcihkKVxyXG4vLyAgICAgICAgICAgICAgIDogZDtcclxuLy8gICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZCA+PSAxMDAwID8gZm9ybWF0dGVkIC8gMTAwMCArICdrJyA6IGZvcm1hdHRlZDtcclxuLy8gICAgICAgICAgIH0pXHJcbi8vICAgICAgIClcclxuLy8gICAgICAgLmNhbGwoKGcpID0+IHtcclxuLy8gICAgICAgICAvLyBTdHlsZSB0aGUgZG9tYWluIGxpbmUgZm9yIHRoZW1lIHN1cHBvcnRcclxuLy8gICAgICAgICBnLnNlbGVjdCgnLmRvbWFpbicpXHJcbi8vICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jaGFydC1kb21haW4tY29sb3IsICMwMDAwMDApJylcclxuLy8gICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpO1xyXG4vLyAgICAgICB9KVxyXG4vLyAgICAgICAuc2VsZWN0QWxsKCd0ZXh0JylcclxuLy8gICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcbi8vICAgICBzdmdZQXhpc1JpZ2h0XHJcbi8vICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuLy8gICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4vLyAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuLy8gICAgICAgLmNhbGwoeSlcclxuLy8gICAgICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogaGlkZSB4IGF4aXMgbGFiZWxzXHJcbi8vICAgICAgKiBjb25maWcgaXMgdGhlcmUgZm9yIGZ1dHVyZSB1c2VcclxuLy8gICAgICAqIHVzZWQgYnkgd2Vla2x5IGNoYXJ0c1xyXG4vLyAgICAgICovXHJcbi8vICAgICBpZiAoXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbiAhPSB1bmRlZmluZWQgJiZcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNYYXhpc0xhYmVsSGlkZGVuXHJcbi8vICAgICApIHtcclxuLy8gICAgICAgZDMuc2VsZWN0QWxsKCdnLmxpYi1saW5lLXgtYXhpcy10ZXh0ID4gZyA+IHRleHQnKS5hdHRyKFxyXG4vLyAgICAgICAgICdjbGFzcycsXHJcbi8vICAgICAgICAgJ2xpYi1kaXNwbGF5LWhpZGRlbidcclxuLy8gICAgICAgKTtcclxuLy8gICAgIH1cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogaGlkZSB5IGF4aXMgbGFiZWxzXHJcbi8vICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKFxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzTGFiZWxIaWRkZW4gIT0gdW5kZWZpbmVkICYmXHJcbi8vICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNMYWJlbEhpZGRlblxyXG4vLyAgICAgKSB7XHJcbi8vICAgICAgIGQzLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCA+IGcgPiB0ZXh0JykuYXR0cihcclxuLy8gICAgICAgICAnY2xhc3MnLFxyXG4vLyAgICAgICAgICdsaWItZGlzcGxheS1oaWRkZW4nXHJcbi8vICAgICAgICk7XHJcbi8vICAgICB9XHJcbi8vICAgICAvKipcclxuLy8gICAgICAqIGhpZGUgeSBheGlzIGxhYmVsc1xyXG4vLyAgICAgICogY29uZmlnIGlzIHRoZXJlIGZvciBmdXR1cmUgdXNlXHJcbi8vICAgICAgKi9cclxuLy8gICAgIGlmIChcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlbiAhPSB1bmRlZmluZWQgJiZcclxuLy8gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlblxyXG4vLyAgICAgKSB7XHJcbi8vICAgICAgIGQzLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCcpLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiBkYXNoZWQgeSBheGlzXHJcbi8vICAgICAgKiB1c2VkIGJ5IHdlZWtseSBjaGFydHNcclxuLy8gICAgICAqL1xyXG4vLyAgICAgaWYgKFxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzRGFzaGVkICE9IHVuZGVmaW5lZCAmJlxyXG4vLyAgICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzRGFzaGVkXHJcbi8vICAgICApIHtcclxuLy8gICAgICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJylcclxuLy8gICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuLy8gICAgICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICM5OTk5OTkpJyk7IC8vIFVzZSBDU1MgdmFyaWFibGVcclxuLy8gICAgIH1cclxuLy8gICAgIGlmIChsaW5lRGF0YSAhPSBudWxsKSB7XHJcbi8vICAgICAgIGlmIChsaW5lRGF0YSAmJiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5zaG93TGluZUNoYXJ0QXhpcykge1xyXG4vLyAgICAgICAgIHN2Z1lBeGlzUmlnaHRcclxuLy8gICAgICAgICAgIC5hcHBlbmQoJ2cnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0MScpXHJcbi8vICAgICAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbi8vICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgMCArICcsMCknKVxyXG4vLyAgICAgICAgICAgLmNhbGwoeUxpbmVBeGlzKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgICAgLyoqXHJcbi8vICAgICAgKiB1c2VkIHRvIGRpc3BsYXkgeSBsYWJlbFxyXG4vLyAgICAgICovXHJcblxyXG4vLyAgICAgLy8gaWYgKHRoaXMuaXNab29tZWRPdXQpIHtcclxuLy8gICAgIC8vICAgc3ZnXHJcbi8vICAgICAvLyAgICAgLnNlbGVjdEFsbCgnLmxpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuLy8gICAgIC8vICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbi8vICAgICAvLyB9XHJcblxyXG4vLyAgICAgaWYgKHRoaXMuaXNab29tZWRPdXQpIHtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLnNlbGVjdEFsbCgnLmxpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuLy8gICAgICAgICAuZWFjaCgoZCwgaSwgbm9kZXMpID0+IHtcclxuLy8gICAgICAgICAgIGNvbnN0IHRleHQgPSBkMy5zZWxlY3Qobm9kZXNbaV0pO1xyXG4vLyAgICAgICAgICAgY29uc3QgbGFiZWwgPSB0ZXh0LnRleHQoKTtcclxuLy8gICAgICAgICAgIGlmIChsYWJlbC5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gbGFiZWwuc3BsaXQoJ1xcbicpO1xyXG4vLyAgICAgICAgICAgICB0ZXh0LnRleHQobnVsbCk7XHJcbi8vICAgICAgICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmUsIGlkeCkgPT4ge1xyXG4vLyAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCd0c3BhbicpXHJcbi8vICAgICAgICAgICAgICAgICAudGV4dChsaW5lKVxyXG4vLyAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxyXG4vLyAgICAgICAgICAgICAgICAgLmF0dHIoJ2R5JywgaWR4ID09PSAwID8gJzFlbScgOiAnMS4xZW0nKTtcclxuLy8gICAgICAgICAgICAgfSk7XHJcbi8vICAgICAgICAgICB9IGVsc2Uge1xyXG4vLyAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IGxhYmVsLnNwbGl0KCcgJyk7XHJcbi8vICAgICAgICAgICAgIHRleHQudGV4dChudWxsKTtcclxuLy8gICAgICAgICAgICAgd29yZHMuZm9yRWFjaCgod29yZCwgaW5kZXgpID0+IHtcclxuLy8gICAgICAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKS50ZXh0KHdvcmQpO1xyXG4vLyAgICAgICAgICAgICB9KTtcclxuLy8gICAgICAgICAgIH1cclxuLy8gICAgICAgICB9KVxyXG4vLyAgICAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIG51bGwpOyBcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLnNlbGVjdCgnLngtYXhpcycpXHJcbi8vICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHtoZWlnaHQgLSBtYXJnaW4uYm90dG9tICsgMTB9KWApO1xyXG4vLyAgICAgfVxyXG5cclxuLy8gICAgIC8qKlxyXG4vLyAgICAgICogdXNlZCB0byB3cml0ZSB5IGxhYmVscyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXHJcbi8vICAgICAgKi9cclxuLy8gaWYgKG1ldGFEYXRhLnlMYWJlbCkge1xyXG4vLyAgIGNvbnN0IHlQb3NpdGlvbiA9IGlzcmlhID8gMCAtIG1hcmdpbi5sZWZ0IC8gMiAtIDMwIDogMCAtIG1hcmdpbi5sZWZ0IC8gMiAtIDQwO1xyXG5cclxuLy8gICBzdmdZQXhpc0xlZnRcclxuLy8gICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4vLyAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJylcclxuLy8gICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbi8vICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3JvdGF0ZSgtOTApJylcclxuLy8gICAgIC5hdHRyKCd5JywgeVBvc2l0aW9uKVxyXG4vLyAgICAgLmF0dHIoJ3gnLCAwIC0gaGVpZ2h0IC8gMilcclxuLy8gICAgIC5hdHRyKCdkeScsICcxZW0nKVxyXG4vLyAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4vLyAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbi8vICAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09PSB1bmRlZmluZWQpIHtcclxuLy8gICAgIHN2Z1lBeGlzTGVmdFxyXG4vLyAgICAgICAuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4vLyAgICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsICdzbWFsbGVyJylcclxuLy8gICAgICAgLnRleHQobWV0YURhdGEueUxhYmVsKTtcclxuLy8gICB9IGVsc2Uge1xyXG4vLyAgICAgc3ZnXHJcbi8vICAgICAgIC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbi8vICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWxhYmVsLXdlZWtseUNoYXJ0cycpXHJcbi8vICAgICAgIC50ZXh0KG1ldGFEYXRhLnlMYWJlbC50b0xvd2VyQ2FzZSgpKTtcclxuLy8gICB9XHJcbi8vIH1cclxuXHJcbi8vICAgICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHtcclxuLy8gICAgICAgY29uc3QgeVplcm8gPSB5KHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCk7XHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2xpbmUnKVxyXG4vLyAgICAgICAgIC5hdHRyKCd4MScsIDApXHJcbi8vICAgICAgICAgLmF0dHIoJ3gyJywgd2lkdGgpXHJcbi8vICAgICAgICAgLmF0dHIoJ3kxJywgeVplcm8pXHJcbi8vICAgICAgICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbi8vICAgICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5jb2xvcik7XHJcbi8vICAgICAgIC8vIHN2Z1lBeGlzUmlnaHRcclxuLy8gICAgICAgLy8gICAuYXBwZW5kKCdsaW5lJylcclxuLy8gICAgICAgLy8gICAuYXR0cigneDEnLCAwKVxyXG4vLyAgICAgICAvLyAgIC5hdHRyKCd4MicsIHJpZ2h0U3ZnV2lkdGgpXHJcbi8vICAgICAgIC8vICAgLmF0dHIoJ3kxJywgeVplcm8pXHJcbi8vICAgICAgIC8vICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbi8vICAgICAgIC8vICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5jb2xvcik7XHJcbi8vICAgICAgIHN2Z1lBeGlzUmlnaHRcclxuLy8gICAgICAgICAuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuLy8gICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgMCArICcsJyArICh5WmVybyAtIDMwKSArICcpJylcclxuLy8gICAgICAgICAuYXR0cignd2lkdGgnLCByaWdodFN2Z1dpZHRoKVxyXG4vLyAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuLy8gICAgICAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsICd0YXJnZXQtZGlzcGxheScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgLmh0bWwoZnVuY3Rpb24gKCkge1xyXG4vLyAgICAgICAgICAgbGV0IGRhdGFUeXBlVGVtcCA9ICcnO1xyXG4vLyAgICAgICAgICAgbGV0IHRhcmdldExpbmVOYW1lID0gJ3RhcmdldCc7XHJcbi8vICAgICAgICAgICBpZiAobWV0YURhdGEuZGF0YVR5cGUpIHtcclxuLy8gICAgICAgICAgICAgZGF0YVR5cGVUZW1wID0gbWV0YURhdGEuZGF0YVR5cGU7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICBpZiAoXHJcbi8vICAgICAgICAgICAgIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmXHJcbi8vICAgICAgICAgICAgIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldE5hbWVcclxuLy8gICAgICAgICAgICkge1xyXG4vLyAgICAgICAgICAgICB0YXJnZXRMaW5lTmFtZSA9IHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldE5hbWU7XHJcbi8vICAgICAgICAgICB9XHJcbi8vICAgICAgICAgICByZXR1cm4gKFxyXG4vLyAgICAgICAgICAgICBgPGRpdj4ke3RhcmdldExpbmVOYW1lfTwvZGl2PmAgK1xyXG4vLyAgICAgICAgICAgICAnPGRpdj4nICtcclxuLy8gICAgICAgICAgICAgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0ICtcclxuLy8gICAgICAgICAgICAgJycgK1xyXG4vLyAgICAgICAgICAgICBkYXRhVHlwZVRlbXAgK1xyXG4vLyAgICAgICAgICAgICAnPC9kaXY+J1xyXG4vLyAgICAgICAgICAgKTtcclxuLy8gICAgICAgICB9KTtcclxuLy8gICAgIH1cclxuLy8gICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbi8vICAgICAgIC8qKlxyXG4vLyAgICAgICAgKiB1c2VkIGJ5IGRyaWxsZG93biBjaGFydHNcclxuLy8gICAgICAgICovXHJcbi8vICAgICAgIC8vIHN2Z1xyXG4vLyAgICAgICAvLyAgIC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbi8vICAgICAgIC8vICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15bGFiZWwtZHJpbGxkb3duY2hhcnRzJylcclxuLy8gICAgICAgLy8gICAudGV4dChtZXRhRGF0YS55TGFiZWwudG9Mb3dlckNhc2UoKSk7XHJcbi8vICAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcbi8vICAgICB9XHJcblxyXG4vLyAgICAgaWYgKG1ldGFEYXRhLnhMYWJlbCkge1xyXG4vLyAgICAgICBmdW5jdGlvbiBpc0Fjcm9ueW0obGFiZWwpIHtcclxuLy8gICAgICAgICByZXR1cm4gKFxyXG4vLyAgICAgICAgICAgKGxhYmVsLmxlbmd0aCA8PSA0ICYmIC9eW0EtWl0rJC8udGVzdChsYWJlbCkpIHx8XHJcbi8vICAgICAgICAgICAobGFiZWwgPT09IGxhYmVsLnRvVXBwZXJDYXNlKCkgJiYgL1tBLVpdLy50ZXN0KGxhYmVsKSlcclxuLy8gICAgICAgICApO1xyXG4vLyAgICAgICB9XHJcbi8vICAgICAgIGNvbnN0IHhMYWJlbFRleHQgPSBtZXRhRGF0YS54TGFiZWw7XHJcbi8vICAgICAgIGNvbnN0IGlzQWNyID0gaXNBY3JvbnltKHhMYWJlbFRleHQucmVwbGFjZSgvW15BLVphLXpdL2csICcnKSk7XHJcblxyXG4vLyAgICAgICAgIGNvbnN0IHhQb3NpdGlvbiA9IGlzcmlhID8gKGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKSA6IChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDQwKTtcclxuXHJcbi8vICAgICAgIHN2Z1xyXG4vLyAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdjbGFzcycsIGZ1bmN0aW9uICgpIHtcclxuLy8gICAgICAgICAgIGxldCBiYXNlQ2xhc3MgPSAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgZm9udC1zaXplLTEnO1xyXG4vLyAgICAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpXHJcbi8vICAgICAgICAgICAgIHJldHVybiBiYXNlQ2xhc3MgKyAnIGxpYi14bGFiZWwtZHJpbGxkb3duY2hhcnRzJztcclxuLy8gICAgICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPSB1bmRlZmluZWQpXHJcbi8vICAgICAgICAgICAgIHJldHVybiBiYXNlQ2xhc3MgKyAnIGxpYi14bGFiZWwtd2Vla2x5Q2hhcnRzJztcclxuLy8gICAgICAgICAgIHJldHVybiBiYXNlQ2xhc3MgKyAnIGxpYi1heGlzLXdhdGVyZmFsbC1sYWJlbCc7XHJcbi8vICAgICAgICAgfSlcclxuLy8gICAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi54QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4vLyAgICAgICAgIC5hdHRyKFxyXG4vLyAgICAgICAgICAgJ3RyYW5zZm9ybScsXHJcbi8vICAgICAgICAgICAndHJhbnNsYXRlKCcgKyB3aWR0aCAvIDIgKyAnICwnICsgeFBvc2l0aW9uICsgJyknXHJcbi8vICAgICAgICAgKVxyXG4vLyAgICAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuLy8gICAgICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4vLyAgICAgICAgIC50ZXh0KGlzQWNyID8geExhYmVsVGV4dC50b1VwcGVyQ2FzZSgpIDogeExhYmVsVGV4dC50b0xvd2VyQ2FzZSgpKVxyXG4vLyAgICAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0FjciA/ICdub25lJyA6ICdjYXBpdGFsaXplJyk7XHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAobWV0YURhdGEubGluZXlMYWJlbCkge1xyXG4vLyAgICAgICBzdmdZQXhpc1JpZ2h0XHJcbi8vICAgICAgICAgLmFwcGVuZCgndGV4dCcpXHJcbi8vICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGxpYi1saW5lLWF4aXMnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuLy8gICAgICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbWxhYmVsU3R5bGVzKVxyXG4vLyAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCkgcm90YXRlKDkwKScpXHJcbi8vICAgICAgICAgLmF0dHIoJ3knLCAwIC0gMTAwKVxyXG4vLyAgICAgICAgIC5hdHRyKCd4JywgMCArIDEwMClcclxuLy8gICAgICAgICAuYXR0cignZHknLCAnNWVtJylcclxuLy8gICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbi8vICAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbi8vICAgICAgICAgLnRleHQobWV0YURhdGEubGluZXlMYWJlbCk7XHJcbi8vICAgICB9XHJcbi8vICAgICBpZiAobGluZURhdGEpIHtcclxuLy8gICAgICAgc3ZnXHJcbi8vICAgICAgICAgLmFwcGVuZCgncGF0aCcpXHJcbi8vICAgICAgICAgLmRhdHVtKGxpbmVEYXRhKVxyXG4vLyAgICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4vLyAgICAgICAgIC5hdHRyKCdzdHJva2UnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuLy8gICAgICAgICAuYXR0cignc3Ryb2tlLXdpZHRoJywgMS41KVxyXG4vLyAgICAgICAgIC5hdHRyKFxyXG4vLyAgICAgICAgICAgJ2QnLFxyXG4vLyAgICAgICAgICAgZDNcclxuLy8gICAgICAgICAgICAgLmxpbmUoKVxyXG4vLyAgICAgICAgICAgICAueChmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICAgIHJldHVybiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMjtcclxuLy8gICAgICAgICAgICAgfSlcclxuLy8gICAgICAgICAgICAgLnkoZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgICAgICByZXR1cm4gbGluZVlzY2FsZShkLnZhbHVlKTtcclxuLy8gICAgICAgICAgICAgfSlcclxuLy8gICAgICAgICApO1xyXG5cclxuLy8gICAgICAgdmFyIGRvdCA9IHN2Z1xyXG4vLyAgICAgICAgIC5zZWxlY3RBbGwoJ215Q2lyY2xlcycpXHJcbi8vICAgICAgICAgLmRhdGEobGluZURhdGEpXHJcbi8vICAgICAgICAgLmVudGVyKClcclxuLy8gICAgICAgICAuYXBwZW5kKCdnJylcclxuLy8gICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIGlmIChcclxuLy8gICAgICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljayB8fFxyXG4vLyAgICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmxlbmd0aCB8fFxyXG4vLyAgICAgICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJlxyXG4vLyAgICAgICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSlcclxuLy8gICAgICAgICAgIClcclxuLy8gICAgICAgICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuLy8gICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgIGRvdFxyXG4vLyAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpXHJcbi8vICAgICAgICAgLmF0dHIoJ2ZpbGwnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdub25lJylcclxuLy8gICAgICAgICAuYXR0cignY3gnLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgcmV0dXJuIHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLmF0dHIoJ2N5JywgZnVuY3Rpb24gKGQpIHtcclxuLy8gICAgICAgICAgIHJldHVybiBsaW5lWXNjYWxlKGQudmFsdWUpO1xyXG4vLyAgICAgICAgIH0pXHJcbi8vICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAoKSA9PlxyXG4vLyAgICAgICAgICAgc2VsZi5jaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnXHJcbi8vICAgICAgICAgKVxyXG4vLyAgICAgICAgIC5hdHRyKCdyJywgMyk7XHJcblxyXG4vLyAgICAgICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpIHtcclxuLy8gICAgICAgICBkb3RcclxuLy8gICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RvdCcpXHJcbi8vICAgICAgICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbi8vICAgICAgICAgICAuYXR0cignY29sb3InLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuLy8gICAgICAgICAgIC5hdHRyKCdzdHlsZScsICdmb250LXNpemU6ICcgKyAnLjg1ZW0nKVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3gnLCBmdW5jdGlvbiAoZCwgaSkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4geChkLm5hbWUpICsgeC5iYW5kd2lkdGgoKSAvIDI7XHJcbi8vICAgICAgICAgICB9KVxyXG4vLyAgICAgICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gbGluZVlzY2FsZShkLnZhbHVlKTtcclxuLy8gICAgICAgICAgIH0pXHJcbi8vICAgICAgICAgICAuYXR0cignZHknLCAnLTFlbScpXHJcbi8vICAgICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkge1xyXG4vLyAgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxGb3JtYXR0ZXIoZC52YWx1ZSk7XHJcbi8vICAgICAgICAgICB9KTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfVxyXG4vLyAgIH1cclxuXHJcbmluaXRpYWxpemVncm91cENoYXJ0KCkge1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFZBUklBQkxFIERFQ0xBUkFUSU9OUyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gIGxldCBkYXRhID0gW107XHJcbiAgbGV0IG1ldGFEYXRhOiBhbnkgPSBudWxsO1xyXG4gIGxldCBrZXlMaXN0ID0gbnVsbDtcclxuICBsZXQgbGluZURhdGEgPSBudWxsO1xyXG4gIGxldCBjb2xvck1hcCA9IHt9O1xyXG4gIGxldCBmb3JtYXRGcm9tQmFja2VuZDtcclxuICBsZXQgZm9ybWF0Rm9ySHVnZU51bWJlcnM7XHJcbiAgXHJcbiAgLy8gRGV2aWNlIGRldGVjdGlvblxyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA1NzY7XHJcbiAgY29uc3QgaXNUYWJsZXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA1NzYgJiYgd2luZG93LmlubmVyV2lkdGggPCA5OTI7XHJcbiAgY29uc3QgaXNEZXNrdG9wID0gd2luZG93LmlubmVyV2lkdGggPj0gOTkyO1xyXG4gIGNvbnN0IGlzcmlhID0gdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWE7XHJcblxyXG4gIC8vIENoYXJ0IHNjYWxlIHZhcmlhYmxlc1xyXG4gIGxldCB4OiBhbnk7XHJcbiAgbGV0IHRlbXBTY2FsZTtcclxuXHJcbiAgLy8gVGljayBsZW5ndGggY29uc3RhbnRzXHJcbiAgY29uc3QgU0hPUlRfVElDS19MRU5HVEggPSA0O1xyXG4gIGNvbnN0IExPTkdfVElDS19MRU5HVEggPSAxNjtcclxuICBjb25zdCBTSE9SVF9USUNLX0xFTkdUSF9CRyA9IDU7XHJcbiAgY29uc3QgTE9OR19USUNLX0xFTkdUSF9CRyA9IDMwO1xyXG4gIGNvbnN0IExFRlRfQU5EX1JJR0hUX1NQQUNFUyA9IDUwO1xyXG4gIGNvbnN0IFJJR0hUX1NWR19XSURUSCA9IDYwO1xyXG4gIFxyXG4gIC8vIEZsYWdzXHJcbiAgbGV0IGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENPTkZJR1VSQVRJT04gU0VUVVAgPT09PT09PT09PT09PT09PT09PT1cclxuICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRlZmF1bHRDb25maWd1cmF0aW9uKSB7XHJcbiAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbltrZXldID0gQ2hhcnRIZWxwZXIuZ2V0VmFsdWVCeUNvbmZpZ3VyYXRpb25UeXBlKFxyXG4gICAgICBrZXksXHJcbiAgICAgIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24sXHJcbiAgICAgIHRoaXMuY3VzdG9tQ2hhcnRDb25maWd1cmF0aW9uXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gRXh0cmFjdCBjaGFydCBkYXRhXHJcbiAgZGF0YSA9IHRoaXMuY2hhcnREYXRhLmRhdGE7XHJcbiAgbWV0YURhdGEgPSB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YTtcclxuICBsaW5lRGF0YSA9IHRoaXMuY2hhcnREYXRhLmxpbmVEYXRhO1xyXG5cclxuICAvLyBTZXR1cCBjb2xvciBtYXBwaW5nc1xyXG4gIGlmICghbWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkge1xyXG4gICAgbWV0YURhdGFbJ2NvbG9yQWJvdmVUYXJnZXQnXSA9IG1ldGFEYXRhLmNvbG9ycztcclxuICB9XHJcbiAgY29sb3JNYXAgPSBtZXRhRGF0YS5jb2xvcnM7XHJcbiAga2V5TGlzdCA9IG1ldGFEYXRhLmtleUxpc3Q7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IENPTlRBSU5FUiBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IGNoYXJ0Q29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gIGNvbnN0IHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzLmdyb3VwY29udGFpbmVyRWx0Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gIGNvbnN0IG1hcmdpbiA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLm1hcmdpbjtcclxuICBcclxuICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuY2FsY3VsYXRlQ2hhcnREaW1lbnNpb25zKFxyXG4gICAgY2hhcnRDb250YWluZXIsXHJcbiAgICB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIsXHJcbiAgICBtYXJnaW4sXHJcbiAgICBzZWxmXHJcbiAgKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gVklTSUJJTElUWSBDT05GSUdVUkFUSU9OID09PT09PT09PT09PT09PT09PT09XHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmlzSGVhZGVyVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMubGVnZW5kVmlzaWJsZSA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGU7XHJcbiAgfVxyXG5cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCA9IHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gREFUQSBGT1JNQVRUSU5HID09PT09PT09PT09PT09PT09PT09XHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRGb3JtYXR0ZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgZm9ybWF0RnJvbUJhY2tlbmQgPSBDaGFydEhlbHBlci5kYXRhVmFsdWVGb3JtYXR0ZXIodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlcik7XHJcbiAgICBmb3JtYXRGb3JIdWdlTnVtYmVycyA9IENoYXJ0SGVscGVyLmRhdGFWYWx1ZUZvcm1hdHRlcignLjJzJyk7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBTVkcgQ09OVEFJTkVSUyBDUkVBVElPTiA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHtcclxuICAgIG91dGVyQ29udGFpbmVyLFxyXG4gICAgc3ZnWUF4aXNMZWZ0LFxyXG4gICAgc3ZnWUF4aXNSaWdodCxcclxuICAgIGlubmVyQ29udGFpbmVyLFxyXG4gICAgc3ZnXHJcbiAgfSA9IHRoaXMuY3JlYXRlQ2hhcnRDb250YWluZXJzKGNoYXJ0Q29udGFpbmVyLCBtYXJnaW4sIGhlaWdodCwgUklHSFRfU1ZHX1dJRFRILCBzZWxmLCB3aWR0aCk7XHJcblxyXG4gIC8vIE9ubHkgZW5hYmxlIGhvcml6b250YWwgc2Nyb2xsaW5nIG9uIG1vYmlsZS90YWJsZXQgd2hlbiBpbiB6b29tZWQtb3V0XHJcbiAgLy8gbW9kZSBhbmQgdGhlcmUgYXJlIG1hbnkgZ3JvdXBzIG9yIG11bHRpcGxlIHN1Ymdyb3Vwcy4gT3RoZXJ3aXNlIGtlZXBcclxuICAvLyB0aGUgaW5uZXIgY29udGFpbmVyIGZpeGVkIChubyBzY3JvbGxiYXIpLlxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBncm91cHNDb3VudCA9IChkYXRhIGFzIGFueSkubGVuZ3RoIHx8IDA7XHJcbiAgICBjb25zdCBzdWJncm91cHNDb3VudCA9IChrZXlMaXN0IGFzIGFueSAmJiAoa2V5TGlzdCBhcyBhbnkpLmxlbmd0aCkgfHwgMDtcclxuICAgIC8vIE9uIG1vYmlsZS90YWJsZXQ6IGFsd2F5cyBlbmFibGUgaG9yaXpvbnRhbCBzY3JvbGxpbmcgd2hlbiB0aGVyZSBpc1xyXG4gICAgLy8gbW9yZSB0aGFuIG9uZSBzdWJncm91cCBzbyBncm91cGVkIGJhcnMgZG9uJ3QgZ2V0IGNvbmdlc3RlZC5cclxuICAgIC8vIE9uIGRlc2t0b3A6IGVuYWJsZSBzY3JvbGxpbmcgd2hlbiB0aGVyZSBhcmUgbWFueSBncm91cHMgb3JcclxuICAgIC8vIG11bHRpcGxlIHN1Ymdyb3VwcyAoa2VlcHMgcHJldmlvdXMgYmVoYXZpb3IpLlxyXG4gICAgaWYgKChpc01vYmlsZSB8fCBpc1RhYmxldCkgJiYgc3ViZ3JvdXBzQ291bnQgPiAxKSB7XHJcbiAgICAgIGlubmVyQ29udGFpbmVyLnN0eWxlKCdvdmVyZmxvdy14JywgJ2F1dG8nKTtcclxuICAgICAgaW5uZXJDb250YWluZXIuY2xhc3NlZCgnc2Nyb2xsLWVuYWJsZWQnLCB0cnVlKTtcclxuICAgIH0gZWxzZSBpZiAoZ3JvdXBzQ291bnQgPiA4IHx8IHN1Ymdyb3Vwc0NvdW50ID4gMikge1xyXG4gICAgICBpbm5lckNvbnRhaW5lci5zdHlsZSgnb3ZlcmZsb3cteCcsICdhdXRvJyk7XHJcbiAgICAgIGlubmVyQ29udGFpbmVyLmNsYXNzZWQoJ3Njcm9sbC1lbmFibGVkJywgdHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpbm5lckNvbnRhaW5lci5zdHlsZSgnb3ZlcmZsb3cteCcsICdoaWRkZW4nKTtcclxuICAgICAgaW5uZXJDb250YWluZXIuY2xhc3NlZCgnc2Nyb2xsLWVuYWJsZWQnLCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgLy8gaWdub3JlXHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBTQ0FMRVMgU0VUVVAgPT09PT09PT09PT09PT09PT09PT1cclxuICBjb25zdCBzdWJncm91cHM6IGFueSA9IGtleUxpc3Q7XHJcbiAgY29uc3QgZ3JvdXBzID0gZDMubWFwKGRhdGEsIChkKSA9PiBkLm5hbWUpLmtleXMoKTtcclxuXHJcbiAgLy8gWC1heGlzIHNjYWxlIGNvbmZpZ3VyYXRpb25cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgeCA9IGQzLnNjYWxlQmFuZCgpXHJcbiAgICAgIC5yYW5nZVJvdW5kKFt3aWR0aCwgMF0pXHJcbiAgICAgIC5hbGlnbigwLjUpXHJcbiAgICAgIC5wYWRkaW5nKFswLjVdKVxyXG4gICAgICAuZG9tYWluKGRhdGEubWFwKChkOiBhbnkpID0+IGQubmFtZS50b0xvd2VyQ2FzZSgpKSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHggPSBkMy5zY2FsZUJhbmQoKVxyXG4gICAgICAuZG9tYWluKGdyb3VwcylcclxuICAgICAgLnJhbmdlKFtMRUZUX0FORF9SSUdIVF9TUEFDRVMsIHdpZHRoIC0gUklHSFRfU1ZHX1dJRFRIIC0gTEVGVF9BTkRfUklHSFRfU1BBQ0VTXSlcclxuICAgICAgLnBhZGRpbmcoWzAuM10pO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgeFNjYWxlRnJvbU9yaWdpbiA9IGQzLnNjYWxlQmFuZCgpXHJcbiAgICAuZG9tYWluKGdyb3VwcylcclxuICAgIC5yYW5nZShbMCwgd2lkdGggLSBSSUdIVF9TVkdfV0lEVEhdKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gWC1BWElTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIHRoaXMucmVuZGVyWEF4aXMoc3ZnLCB4LCBoZWlnaHQsIG1ldGFEYXRhLCBzdWJncm91cHMsIGRhdGEsIFxyXG4gICAgU0hPUlRfVElDS19MRU5HVEhfQkcsIExPTkdfVElDS19MRU5HVEhfQkcsIHNlbGYsIGlzcmlhLCBpc01vYmlsZSk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFktQVhJUyBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHkgPSBkMy5zY2FsZUxpbmVhcigpLnJhbmdlUm91bmQoW2hlaWdodCwgMF0pO1xyXG4gIGxldCBtYXhWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlTWF4VmFsdWUoZGF0YSwga2V5TGlzdCk7XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUpIHtcclxuICAgIG1heFZhbHVlID0gbWF4VmFsdWUgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbiAgfVxyXG5cclxuICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiYgbWF4VmFsdWUgPCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpIHtcclxuICAgIG1heFZhbHVlID0gbWF4VmFsdWUgPCAxMCAmJiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgPCAxMFxyXG4gICAgICA/IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDNcclxuICAgICAgOiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuICB9XHJcblxyXG4gIHkuZG9tYWluKFswLCBtYXhWYWx1ZV0pLm5pY2UoKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTElORSBDSEFSVCBZLVNDQUxFID09PT09PT09PT09PT09PT09PT09XHJcbiAgbGV0IGxpbmVZc2NhbGU7XHJcbiAgbGV0IHlMaW5lQXhpcztcclxuXHJcbiAgaWYgKGxpbmVEYXRhICE9IG51bGwpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2V0dXBMaW5lWVNjYWxlKGxpbmVEYXRhLCBoZWlnaHQsIHNlbGYpO1xyXG4gICAgbGluZVlzY2FsZSA9IHJlc3VsdC5saW5lWXNjYWxlO1xyXG4gICAgeUxpbmVBeGlzID0gcmVzdWx0LnlMaW5lQXhpcztcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEdSSUQgTElORVMgPT09PT09PT09PT09PT09PT09PT1cclxuICB0aGlzLnJlbmRlckdyaWRMaW5lcyhzdmcsIHgsIHksIGhlaWdodCwgd2lkdGgsIHNlbGYpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBCQVJTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHhTdWJncm91cCA9IHRoaXMuc2V0dXBYU3ViZ3JvdXBTY2FsZShzdWJncm91cHMsIHgsIHNlbGYpO1xyXG4gIGNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKClcclxuICAgIC5kb21haW4oc3ViZ3JvdXBzKVxyXG4gICAgLnJhbmdlKE9iamVjdC52YWx1ZXMobWV0YURhdGEuY29sb3JzKSk7XHJcblxyXG4gIHRoaXMucmVuZGVyQmFycyhzdmcsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCB5LCBoZWlnaHQsIGNvbG9yLCBcclxuICAgIG1ldGFEYXRhLCBzZWxmLCBMRUZUX0FORF9SSUdIVF9TUEFDRVMsIHRlbXBTY2FsZSwgaXNyaWEpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBCQVIgTEFCRUxTID09PT09PT09PT09PT09PT09PT09XHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgdGhpcy5yZW5kZXJCYXJMYWJlbHMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBcclxuICAgICAgbWV0YURhdGEsIHNlbGYsIHRlbXBTY2FsZSwgaXNyaWEpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gWS1BWElTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIHRoaXMucmVuZGVyWUF4aXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHksIHlMaW5lQXhpcywgXHJcbiAgICBsaW5lRGF0YSwgc2VsZiwgaXNyaWEsIG1hcmdpbik7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEFYSVMgTEFCRUxTID09PT09PT09PT09PT09PT09PT09XHJcbiAgdGhpcy5yZW5kZXJBeGlzTGFiZWxzKHN2Zywgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0LCBtZXRhRGF0YSwgXHJcbiAgICB3aWR0aCwgaGVpZ2h0LCBtYXJnaW4sIHNlbGYsIGlzcmlhLCBSSUdIVF9TVkdfV0lEVEgpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBUQVJHRVQgTElORSA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgdGhpcy5yZW5kZXJUYXJnZXRMaW5lKHN2Zywgc3ZnWUF4aXNSaWdodCwgeSwgd2lkdGgsIFJJR0hUX1NWR19XSURUSCwgXHJcbiAgICAgIG1ldGFEYXRhLCBzZWxmKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IExJTkUgQ0hBUlQgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAobGluZURhdGEpIHtcclxuICAgIHRoaXMucmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHgsIGxpbmVZc2NhbGUsIG1ldGFEYXRhLCBzZWxmKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFpPT00gSEFORExJTkcgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgdGhpcy5oYW5kbGVab29tT3V0KHN2ZywgaGVpZ2h0LCBtYXJnaW4pO1xyXG4gIH1cclxufVxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT0gSEVMUEVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbnByaXZhdGUgcmVuZGVyWEF4aXMoc3ZnLCB4LCBoZWlnaHQsIG1ldGFEYXRhLCBzdWJncm91cHMsIGRhdGEsIFxyXG4gIHNob3J0VGlja0xlbmd0aEJnLCBsb25nVGlja0xlbmd0aEJnLCBzZWxmLCBpc3JpYSwgaXNNb2JpbGUpIHtcclxuICBcclxuICBsZXQgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lID09PSB1bmRlZmluZWQpIHtcclxuICAgIC8vIE5vcm1hbCB0aWNrcyBmb3IgZGFzaGJvYXJkIGNoYXJ0c1xyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHtoZWlnaHR9KWApXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNCb3R0b20oeCkpXHJcbiAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuXHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykucmVtb3ZlKCk7XHJcblxyXG4gICAgY29uc3QgeU9mZnNldCA9IHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFtZXRhRGF0YS54TGFiZWwgPyAzMiA6IDA7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmF0dHIoJ3knLCB5T2Zmc2V0IHx8IG51bGwpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBCaWdnZXIgdGlja3MgZm9yIHdlZWtseSBjaGFydHNcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAneDEgYXhpczEnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7aGVpZ2h0fSlgKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpLnRpY2tTaXplKDApKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5hdHRyKCdmaWxsJywgJ25vbmUnKSk7XHJcblxyXG4gICAgLy8gQWx0ZXJuYXRlIHRpY2sgbGluZSBzaXplc1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLmF0dHIoJ3kyJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAoYWx0ZXJuYXRlX3RleHQgJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNOb0FsdGVybmF0ZVhheGlzVGV4dCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbG9uZ1RpY2tMZW5ndGhCZyAtIDc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiBzaG9ydFRpY2tMZW5ndGhCZyAtIDQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcblxyXG4gICAgLy8gWC1heGlzIGxhYmVsIHRleHRzXHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtd2Vla2x5Y2hhcnRzJylcclxuICAgICAgLmF0dHIoJ3knLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlbikge1xyXG4gICAgICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWx0ZXJuYXRlX3RleHQpIHtcclxuICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm4gbG9uZ1RpY2tMZW5ndGhCZztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYWx0ZXJuYXRlX3RleHQgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyBBcHBseSBsYWJlbHMgb24gc2FtZSBsaW5lIGNvbmZpZ3VyYXRpb25cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueExhYmVsc09uU2FtZUxpbmUpIHtcclxuICAgIHRoaXMuYXBwbHlYTGFiZWxzT25TYW1lTGluZShzdmcsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIFxyXG4gICAgICBzaG9ydFRpY2tMZW5ndGhCZywgaXNNb2JpbGUsIGlzcmlhKTtcclxuICB9XHJcblxyXG4gIC8vIE1vYmlsZSBvdmVycmlkZSBmb3IgUklBXHJcbiAgaWYgKGlzcmlhICYmIHNlbGYuY2hhcnREYXRhLmRhdGEubGVuZ3RoID4gOCkge1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCB0cnVlKVxyXG4gICAgICAudGV4dCgoZDogc3RyaW5nKSA9PiBkLnN1YnN0cmluZygwLCAzKSlcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnMTJweCcpXHJcbiAgICAgIC5hdHRyKCd5JywgNSlcclxuICAgICAgLmF0dHIoJ3gnLCA1KVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpO1xyXG4gIH1cclxuXHJcbiAgLy8gTW9iaWxlIG92ZXJyaWRlIC0gY2hlY2sgZm9yIHNpbmdsZS1ncm91cCBkYXRlIGNoYXJ0cyBmaXJzdFxyXG4gIGlmIChpc01vYmlsZSkge1xyXG4gICAgY29uc3QgdGV4dE5vZGVzID0gc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpO1xyXG4gICAgY29uc3QgZ3JvdXBzQ291bnQgPSAoZGF0YSBhcyBhbnkpLmxlbmd0aCB8fCAwO1xyXG4gICAgXHJcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGRhdGVzIGluIHgtYXhpcyBhbmQgc2luZ2xlIGdyb3VwXHJcbiAgICBsZXQgaGFzRGF0ZVZhbHVlcyA9IGZhbHNlO1xyXG4gICAgdGV4dE5vZGVzLmVhY2goZnVuY3Rpb24oZCkge1xyXG4gICAgICAvLyBDaGVjayBmb3IgZGF0ZSB2YWx1ZXMgdXNpbmcgYm90aCBEYXRlLnBhcnNlIGFuZCByZWdleCBmb3IgZGF0ZSBmb3JtYXRcclxuICAgICAgICBjb25zdCBpc0RhdGVTdHJpbmcgPVxyXG4gICAgL15cXGR7MSw0fVstXFwvXVxcZHsxLDJ9Wy1cXC9dXFxkezEsNH0kLy50ZXN0KGQudHJpbSgpKSB8fFxyXG4gICAgL14oXFxkezEsNH1bLVxcL11cXGR7MSwyfVstXFwvXVxcZHsxLDR9KVxccypbLeKAk11cXHMqKFxcZHsxLDR9Wy1cXC9dXFxkezEsMn1bLVxcL11cXGR7MSw0fSkkLy50ZXN0KGQudHJpbSgpKTtcclxuICAgICAgaWYgKCFoYXNEYXRlVmFsdWVzICYmIGlzRGF0ZVN0cmluZykge1xyXG4gICAgICAgIGhhc0RhdGVWYWx1ZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoaGFzRGF0ZVZhbHVlcyAmJiBzdWJncm91cHMgJiYgc3ViZ3JvdXBzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgLy8gRm9yIHNpbmdsZSBjaGFydCB3aXRoIGRhdGVzLCBlbnN1cmUgaG9yaXpvbnRhbCBkaXNwbGF5XHJcbiAgICAgIHRleHROb2Rlc1xyXG4gICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ2hvcml6b250YWwtdGInKSAgLy8gRXhwbGljaXRseSBzZXQgaG9yaXpvbnRhbFxyXG4gICAgICAgIC5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCBmYWxzZSkgLy8gUmVtb3ZlIHZlcnRpY2FsIGNsYXNzXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoMCknKSAgICAgICAgICAvLyBSZW1vdmUgYW55IHJvdGF0aW9uXHJcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpICAgICAgICAgICAvLyBDZW50ZXIgYWxpZ25cclxuICAgICAgICAuYXR0cigneScsIDIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCBkb3duIGEgYml0XHJcbiAgICAgICAgLmF0dHIoJ2R4JywgJzAnKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFueSB4IG9mZnNldFxyXG4gICAgICAgIC5hdHRyKCdkeScsICcwJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBhbnkgeSBvZmZzZXRcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgIC8vIERlZmF1bHQgbW9iaWxlIGJlaGF2aW9yIGZvciBub24tZGF0ZSBvciBtdWx0aS1ncm91cFxyXG4gICAgICB0ZXh0Tm9kZXMuY2xhc3NlZCgnbW9iaWxlLXhheGlzLW92ZXJyaWRlJywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgdGhlcmUgYXJlIG1hbnkgZ3JvdXBzIG9uIG1vYmlsZSwgcm90YXRlIGxhYmVscyB0byBzaWRld2F5cyB0b1xyXG4gICAgLy8gYXZvaWQgb3ZlcmxhcHBpbmcgYW5kIG1ha2UgdGhlbSByZWFkYWJsZS4gVXNlIGEgbG93ZXIgdGhyZXNob2xkXHJcbiAgICAvLyAoMykgc28gZXZlbiBzbWFsbCBtb2JpbGUgc2NyZWVucyBnZXQgcm90YXRlZCBsYWJlbHMgd2hlbiBuZWVkZWQuXHJcbiAgICBpZiAoZ3JvdXBzQ291bnQgPiAzKSB7XHJcbiAgICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ3NpZGV3YXlzLWxyJylcclxuICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgICAgLmF0dHIoJ3knLCAwKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgYXBwbHlYTGFiZWxzT25TYW1lTGluZShzdmcsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIFxyXG4gIHNob3J0VGlja0xlbmd0aEJnLCBpc01vYmlsZSwgaXNyaWEpIHtcclxuICBcclxuICBjb25zdCB4QXhpc0xhYmVscyA9IHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5pc0hlYWRlclZpc2libGUgPyAnMThweCcgOiAnMTRweCcpXHJcbiAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgIC5hdHRyKCd5JywgKGQpID0+IHRoaXMuY2FsY3VsYXRlWExhYmVsWVBvc2l0aW9uKGQsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIHNob3J0VGlja0xlbmd0aEJnKSlcclxuICAgIC5hdHRyKCd4JywgKGQpID0+IChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpID8gMSA6IDApXHJcbiAgICAudGV4dCgoZCkgPT4gdGhpcy5mb3JtYXRYTGFiZWxUZXh0KGQsIGRhdGEsIG1ldGFEYXRhLCBzdWJncm91cHMsIHNlbGYsIGlzTW9iaWxlKSk7XHJcblxyXG4gIC8vIEFwcGx5IHdyaXRpbmctbW9kZSBmb3IgZ3JvdXBlZCBjaGFydHMgd2l0aCBkYXRlIGxhYmVscyBpbiB6b29tZWQtb3V0IHZpZXdcclxuICB4QXhpc0xhYmVscy5lYWNoKGZ1bmN0aW9uKHRoaXM6IFNWR1RleHRFbGVtZW50LCBkOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzRGF0ZUxhYmVsID0gL14oXFxkezIsNH1bLVxcL10pP1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0kLy50ZXN0KGQudHJpbSgpKTtcclxuICAgIGNvbnN0IGlzV2Vla0xhYmVsID0gL3dlZWt8d2t8d1xcZCsvaS50ZXN0KGQpO1xyXG4gICAgXHJcbiAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgc2VsZi5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDggJiYgaXNEYXRlTGFiZWwgJiYgIWlzV2Vla0xhYmVsKSB7XHJcbiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ3NpZGV3YXlzLWxyJyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8vIEFkZCBzZWNvbmQgbGluZSBmb3Igbm9uLWRhdGUgbGFiZWxzIG9uIGRlc2t0b3BcclxuICBpZiAoIWlzTW9iaWxlKSB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+ICEvXFxkezIsNH1bLVxcL10vLnRlc3QoZCkpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuYXR0cigneScsIDMwKVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5hdHRyKCd4JywgKGQpID0+IChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpID8gMSA6IDApXHJcbiAgICAgIC50ZXh0KChkKSA9PiB7XHJcbiAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm4gZC50cmltKCkuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpLCBkLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlWExhYmVsWVBvc2l0aW9uKGQsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIHNob3J0VGlja0xlbmd0aEJnKSB7XHJcbiAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyB3aXRoIG1hbnkgYmFycyBhbmQgeExhYmVsIHByZXNlbnRcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmIG1ldGFEYXRhLnhMYWJlbCkge1xyXG4gICAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbiAgICByZXR1cm4gaXNEYXRlTGFiZWwgPyBzaG9ydFRpY2tMZW5ndGhCZyArIDE0IDogc2hvcnRUaWNrTGVuZ3RoQmc7XHJcbiAgfVxyXG5cclxuICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIHdpdGggbWFueSBiYXJzIGFuZCBOTyB4TGFiZWxcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmICFtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgIGNvbnN0IGNoYXJ0SGFzRXh0cmFCb3R0b20gPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4gJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLmJvdHRvbSA+PSA0MDtcclxuICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnICsgMjtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFydEhhc0V4dHJhQm90dG9tID8gc2hvcnRUaWNrTGVuZ3RoQmcgOiBzaG9ydFRpY2tMZW5ndGhCZyArIDEwO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVmYXVsdC9mYWxsYmFjayBsb2dpY1xyXG4gIGxldCBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRUaWNrTGVuZ3RoQmcgKyAyNSA6IHNob3J0VGlja0xlbmd0aEJnO1xyXG4gIFxyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhbWV0YURhdGEueExhYmVsICYmIFxyXG4gICAgICAoL1xcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgfHwgL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkpKSB7XHJcbiAgICBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRUaWNrTGVuZ3RoQmcgKyAxNSA6IHNob3J0VGlja0xlbmd0aEJnICsgMjU7XHJcbiAgfVxyXG5cclxuICBpZiAoL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgJiYgZC5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4gICAgYmFzZVkgKz0gNDtcclxuICB9XHJcblxyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gJiYgc3ViZ3JvdXBzLmxlbmd0aCA+IDEpIHtcclxuICAgIGJhc2VZID0gTWF0aC5tYXgoc2hvcnRUaWNrTGVuZ3RoQmcsIGJhc2VZIC0gMTApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGJhc2VZO1xyXG59XHJcblxyXG5wcml2YXRlIGZvcm1hdFhMYWJlbFRleHQoZCwgZGF0YSwgbWV0YURhdGEsIHN1Ymdyb3Vwcywgc2VsZiwgaXNNb2JpbGUpIHtcclxuICAvLyBNb2JpbGUgaGFuZGxpbmc6IGtlZXAgZGF0ZSBsYWJlbHMgaW50YWN0IGZvciBzaW5nbGUtc2VyaWVzIGNoYXJ0cyAoZG8gbm90IHRyaW0pXHJcbiAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICBjb25zdCBpc0RhdGVMYWJlbCA9IC9cXGR7Miw0fVstXFwvXVxcZHsxLDJ9Wy1cXC9dXFxkezEsNH0vLnRlc3QoZCkgfHwgIWlzTmFOKERhdGUucGFyc2UoZCkpO1xyXG5cclxuICAgIGlmIChpc0RhdGVMYWJlbCAmJiBzdWJncm91cHMgJiYgc3ViZ3JvdXBzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgLy8gRm9yIHNpbmdsZS1zZXJpZXMgY2hhcnRzIG9uIG1vYmlsZSwgc2hvdyBmdWxsIGRhdGUgbGFiZWxzIChubyB0cmltbWluZylcclxuICAgICAgcmV0dXJuIGQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgaGVhZGVyIGlzIGhpZGRlbiAoY29tcGFjdCBtb2JpbGUpLCB0cmltIG5vbi1kYXRlIGxhYmVscyBhcyBiZWZvcmVcclxuICAgIGlmICghc2VsZi5pc0hlYWRlclZpc2libGUpIHtcclxuICAgICAgY29uc3QgZmlyc3RQYXJ0ID0gZC5zcGxpdCgvW1xcc1xcLV0rLylbMF07XHJcbiAgICAgIHJldHVybiBmaXJzdFBhcnQuc3Vic3RyaW5nKDAsIDMpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiB2YWx1ZSBzaG91bGQgYmUgaWdub3JlZFxyXG4gIGNvbnN0IGlzVmFsdWVUb0JlSWdub3JlZCA9IGRhdGEuc29tZSgoaW5kaXY6IGFueSkgPT4gXHJcbiAgICBpbmRpdi5uYW1lICYmIGluZGl2Lm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZC50cmltKCkudG9Mb3dlckNhc2UoKSAmJiBcclxuICAgIGluZGl2W21ldGFEYXRhLmtleUxpc3RbMF1dID09PSAtMVxyXG4gICk7XHJcblxyXG4gIGlmIChpc1ZhbHVlVG9CZUlnbm9yZWQpIHtcclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBkYXRlIHJhbmdlIGxhYmVsc1xyXG4gIGNvbnN0IGRhdGVSYW5nZVJlZ2V4ID0gLyhcXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9KVxccyotXFxzKihcXGR7Miw0fVstXFwvXVxcZHsyfVstXFwvXVxcZHsyLDR9KS87XHJcbiAgaWYgKGRhdGVSYW5nZVJlZ2V4LnRlc3QoZC50cmltKCkpKSB7XHJcbiAgICByZXR1cm4gZC50cmltKCkucmVwbGFjZShkYXRlUmFuZ2VSZWdleCwgKG0sIGQxLCBkMikgPT4gYCR7ZDF9IC0gJHtkMn1gKTtcclxuICB9XHJcblxyXG4gIC8vIFNwbGl0IGRhdGUgYW5kIHdlZWsgbGFiZWxzIGludG8gdHdvIGxpbmVzXHJcbiAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbiAgY29uc3QgaXNXZWVrTGFiZWwgPSAvd2Vla3x3a3x3XFxkKy9pLnRlc3QoZCk7XHJcbiAgXHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFzZWxmLmlzWm9vbWVkT3V0ICYmIGRhdGEubGVuZ3RoID4gOCAmJiBcclxuICAgICAgZC5pbmRleE9mKCcgJykgPiAtMSAmJiAoaXNEYXRlTGFiZWwgfHwgaXNXZWVrTGFiZWwpKSB7XHJcbiAgICBjb25zdCBmaXJzdCA9IGQuc3Vic3RyaW5nKDAsIGQuaW5kZXhPZignICcpKTtcclxuICAgIGNvbnN0IHNlY29uZCA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpICsgMSkudHJpbSgpO1xyXG4gICAgcmV0dXJuIGAke2ZpcnN0fVxcbiR7c2Vjb25kfWA7XHJcbiAgfVxyXG5cclxuICAvLyBIYW5kbGUgZGF0ZSBsYWJlbHMgaW4gbWluaW1pemVkIHZpZXdcclxuICBpZiAoaXNEYXRlTGFiZWwpIHtcclxuICAgIGlmICghc2VsZi5pc0hlYWRlclZpc2libGUgJiYgZGF0YS5sZW5ndGggPiA4ICYmIGQuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgICAgY29uc3QgZmlyc3QgPSBkLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSk7XHJcbiAgICAgIGNvbnN0IHNlY29uZCA9IGQuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpICsgMSkudHJpbSgpO1xyXG4gICAgICByZXR1cm4gYCR7Zmlyc3R9XFxuJHtzZWNvbmR9YDtcclxuICAgIH1cclxuICAgIHJldHVybiBkO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIGxhYmVscyB3aXRoIHNwYWNlc1xyXG4gIGlmIChkLnRyaW0oKS5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4gICAgcmV0dXJuIGQudHJpbSgpLnN1YnN0cmluZygwLCBkLmluZGV4T2YoJyAnKSkudG9Mb3dlckNhc2UoKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBkLnRvTG93ZXJDYXNlKCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlTWF4VmFsdWUoZGF0YSwga2V5TGlzdCkge1xyXG4gIGxldCBtYXhWYWx1ZSA9IGQzLm1heChkYXRhLCAoZCkgPT4gZDMubWF4KGtleUxpc3QsIChrZXkpID0+ICtkW2tleV0pKTtcclxuICBcclxuICBpZiAobWF4VmFsdWUgPT09IDApIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgICBtYXhWYWx1ZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDIwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbWF4VmFsdWUgPSAxMDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbWF4VmFsdWU7XHJcbn1cclxuXHJcbnByaXZhdGUgc2V0dXBMaW5lWVNjYWxlKGxpbmVEYXRhLCBoZWlnaHQsIHNlbGYpIHtcclxuICBsZXQgbWF4TGluZVZhbHVlID0gZDMubWF4KGxpbmVEYXRhLCAoZCkgPT4gK2QudmFsdWUpO1xyXG4gIG1heExpbmVWYWx1ZSA9IG1heExpbmVWYWx1ZSAqIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmN1c3RvbVlzY2FsZTtcclxuXHJcbiAgbGV0IG1pbkxpbmVWYWx1ZSA9IGQzLm1pbihsaW5lRGF0YSwgKGQpID0+ICtkLnZhbHVlKTtcclxuICBpZiAobWF4TGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlID0gbWluTGluZVZhbHVlIC0gMztcclxuICBpZiAobWluTGluZVZhbHVlID4gMCkgbWluTGluZVZhbHVlID0gMDtcclxuXHJcbiAgY29uc3QgbGluZVlzY2FsZSA9IGQzLnNjYWxlTGluZWFyKClcclxuICAgIC5kb21haW4oW21pbkxpbmVWYWx1ZSwgbWF4TGluZVZhbHVlXSlcclxuICAgIC5yYW5nZShbaGVpZ2h0LCBtaW5MaW5lVmFsdWVdKTtcclxuXHJcbiAgY29uc3QgeUxpbmVBeGlzID0gZDMuYXhpc1JpZ2h0KGxpbmVZc2NhbGUpXHJcbiAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAudGlja1NpemUoMClcclxuICAgIC50aWNrRm9ybWF0KHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlMaW5lQXhpc0xhYmVsRm9tYXR0ZXIpO1xyXG5cclxuICByZXR1cm4geyBsaW5lWXNjYWxlLCB5TGluZUF4aXMgfTtcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJHcmlkTGluZXMoc3ZnLCB4LCB5LCBoZWlnaHQsIHdpZHRoLCBzZWxmKSB7XHJcbiAgLy8gWC1heGlzIGdyaWQgYmV0d2VlbiBsYWJlbHNcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNYZ3JpZEJldHdlZW5MYWJlbHMpIHtcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnZ3JpZCcpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7eC5iYW5kd2lkdGgoKSAvIDJ9LCR7aGVpZ2h0fSlgKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpLnRpY2tTaXplKC1oZWlnaHQpLnRpY2tGb3JtYXQoJycpKVxyXG4gICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1ncmlkLWNvbG9yLCAjOTk5OTk5KScpXHJcbiAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpKTtcclxuICB9XHJcblxyXG4gIC8vIFktYXhpcyBncmlkXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzR3JpZCkge1xyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKS50aWNrU2l6ZSgtd2lkdGgpKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICNCOUI5QjkpJylcclxuICAgICAgLnN0eWxlKCdvcGFjaXR5JywgJzAuNScpXHJcbiAgICAgIC5jYWxsKChnKSA9PiBnLnNlbGVjdCgnLmRvbWFpbicpLnJlbW92ZSgpLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKSlcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgc2V0dXBYU3ViZ3JvdXBTY2FsZShzdWJncm91cHMsIHgsIHNlbGYpIHtcclxuICBjb25zdCB4U3ViZ3JvdXAgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oc3ViZ3JvdXBzKTtcclxuXHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICB9IGVsc2UgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPT09IDEgJiYgIXRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgIHhTdWJncm91cC5yYW5nZShbMCwgMTAwXSk7XHJcbiAgfSBlbHNlIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICB9IGVsc2Uge1xyXG4gICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geFN1Ymdyb3VwO1xyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlckJhcnMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBjb2xvciwgXHJcbiAgbWV0YURhdGEsIHNlbGYsIGxlZnRBbmRSaWdodFNwYWNlcywgdGVtcFNjYWxlLCBpc3JpYSkge1xyXG4gIFxyXG4gIGNvbnN0IHN0YXRlID0gc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAuc2VsZWN0QWxsKCcuc3RhdGUnKVxyXG4gICAgLmRhdGEoZGF0YSlcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoZCkgPT4gYHRyYW5zbGF0ZSgke3goZC5uYW1lKX0sMClgKTtcclxuXHJcbiAgY29uc3QgYmFycyA9IHN0YXRlLnNlbGVjdEFsbCgncmVjdCcpXHJcbiAgICAuZGF0YSgoZCkgPT4gdGhpcy5wcmVwYXJlQmFyRGF0YShkLCBzdWJncm91cHMpKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoJ3JlY3QnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2JhcnMnKVxyXG4gICAgLm9uKCdjbGljaycsIChkKSA9PiB0aGlzLmhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhLCBzZWxmKSlcclxuICAgIC5hdHRyKCd4JywgKGQpID0+IHRoaXMuY2FsY3VsYXRlQmFyWChkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHNlbGYsIHRlbXBTY2FsZSkpXHJcbiAgICAuYXR0cigneScsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhclkoZCwgeSwgaGVpZ2h0LCBzZWxmKSlcclxuICAgIC5hdHRyKCd3aWR0aCcsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhcldpZHRoKGQsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCBzZWxmLCB0ZW1wU2NhbGUpKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhckhlaWdodChkLCB5LCBoZWlnaHQsIHNlbGYpKVxyXG4gICAgLnN0eWxlKCdjdXJzb3InLCAoKSA9PiAobWV0YURhdGEuaGFzRHJpbGxEb3duICYmICFpc3JpYSkgPyAncG9pbnRlcicgOiAnZGVmYXVsdCcpXHJcbiAgICAuYXR0cignZmlsbCcsIChkKSA9PiB0aGlzLmdldEJhckNvbG9yKGQsIG1ldGFEYXRhLCBzZWxmKSk7XHJcblxyXG4gIC8vIEF0dGFjaCBtb3VzZSBldmVudHMgaWYgbm90IFJJQVxyXG4gIGlmICghaXNyaWEgJiYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wIHx8IFxyXG4gICAgICAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dHNPbkJhciA9PT0gdW5kZWZpbmVkICYmIFxyXG4gICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uZGlzcGxheVRpdGxlT25Ub3AgPT09IHVuZGVmaW5lZCkpKSB7XHJcbiAgICBiYXJzLm9uKCdtb3VzZW91dCcsIChkLCBpKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3V0KHN2ZykpXHJcbiAgICAgICAgLm9uKCdtb3VzZW92ZXInLCAoZCwgaSkgPT4gdGhpcy5oYW5kbGVNb3VzZU92ZXIoZCwgc3ZnLCBkYXRhLCB4LCB5LCBoZWlnaHQsIG1ldGFEYXRhLCBzZWxmLCBsZWZ0QW5kUmlnaHRTcGFjZXMsIHRlbXBTY2FsZSkpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBwcmVwYXJlQmFyRGF0YShkLCBzdWJncm91cHMpIHtcclxuICBjb25zdCBuZXdMaXN0OiBhbnkgPSBbXTtcclxuICBzdWJncm91cHMuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICBuZXdMaXN0LnB1c2goeyBrZXk6IGtleSwgdmFsdWU6IGRba2V5XSwgbmFtZTogZC5uYW1lIH0pO1xyXG4gIH0pO1xyXG4gIHJldHVybiBuZXdMaXN0O1xyXG59XHJcblxyXG5wcml2YXRlIGhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgaWYgKGQua2V5ICE9PSAnVGFyZ2V0Jykge1xyXG4gICAgaWYgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHwgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJiBcclxuICAgICAgICAgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5rZXkpKSkge1xyXG4gICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVCYXJYKGQsIGRhdGEsIHgsIHhTdWJncm91cCwgc2VsZiwgdGVtcFNjYWxlKSB7XHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZURyaWxsZG93bkJhclgoZCwgZGF0YSwgeCwgc2VsZiwgdGVtcFNjYWxlKTtcclxuICB9XHJcbiAgcmV0dXJuIHhTdWJncm91cChkLmtleSk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlRHJpbGxkb3duQmFyWChkLCBkYXRhLCB4LCBzZWxmLCB0ZW1wU2NhbGUpIHtcclxuICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT09IDApO1xyXG4gICAgICB0ZW1wU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oa2V5cykucmFuZ2UoWzAsIHguYmFuZHdpZHRoKCldKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbiAgICAgICAgY29uc3QgcmVkdWNlZEJhcldpZHRoID0gc2VsZi5pc1pvb21lZE91dCA/IDYwIDogMzA7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkQmFyV2lkdGgpIC8gMjtcclxuICAgICAgICB0ZW1wU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHRlbXBTY2FsZShkLmtleSk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQmFyWShkLCB5LCBoZWlnaHQsIHNlbGYpIHtcclxuICBpZiAoZC52YWx1ZSA9PT0gLTEpIHtcclxuICAgIHJldHVybiB5KDApO1xyXG4gIH1cclxuXHJcbiAgaWYgKGQudmFsdWUgPj0gMCkge1xyXG4gICAgY29uc3QgYmFySGVpZ2h0ID0gaGVpZ2h0IC0geShkLnZhbHVlKTtcclxuICAgIGNvbnN0IG1pbkhlaWdodCA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmRlZmF1bHRCYXJIZWlnaHQgfHwgMjtcclxuICAgIHJldHVybiBiYXJIZWlnaHQgPCBtaW5IZWlnaHQgPyB5KDApIC0gbWluSGVpZ2h0IDogeShkLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHJldHVybiB5KDApO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZUJhcldpZHRoKGQsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCBzZWxmLCB0ZW1wU2NhbGUpIHtcclxuICAvLyBEZXZpY2UgZGV0ZWN0aW9uIGZvciByZXNwb25zaXZlIHNpemluZ1xyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA1NzY7XHJcbiAgY29uc3QgaXNUYWJsZXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA1NzYgJiYgd2luZG93LmlubmVyV2lkdGggPCA5OTI7XHJcblxyXG4gIC8vIEZvciBncm91cGVkIGJhciBjaGFydHMgaW4gem9vbS1pbiB2aWV3XHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPiAxICYmICFzZWxmLmlzWm9vbWVkT3V0KSB7XHJcbiAgICByZXR1cm4gaXNNb2JpbGUgPyAyMiA6IGlzVGFibGV0ID8gMzYgOiA1MDtcclxuICB9XHJcblxyXG4gIC8vIEZvciBzaW5nbGUtYmFyIGNoYXJ0cyBpbiB6b29tLWluIHZpZXdcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA9PT0gMSAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4gICAgcmV0dXJuIGlzTW9iaWxlID8gNjAgOiA4MDtcclxuICB9XHJcblxyXG4gIC8vIE1pbmltdW0gYmFyIHdpZHRocyBmb3Igem9vbWVkLW91dCBzdGF0ZVxyXG4gIGNvbnN0IG1pbkJhcldpZHRoID0gKCgpID0+IHtcclxuICAgIGlmIChzdWJncm91cHMubGVuZ3RoID4gMikge1xyXG4gICAgICByZXR1cm4gaXNNb2JpbGUgPyAxOCA6IGlzVGFibGV0ID8gMjQgOiAzMDtcclxuICAgIH1cclxuICAgIHJldHVybiBpc01vYmlsZSA/IDEyIDogaXNUYWJsZXQgPyAxNiA6IDIwO1xyXG4gIH0pKCk7XHJcblxyXG4gIC8vIERlZmF1bHQgbG9naWMgZm9yIGRyaWxsZG93biBjaGFydHNcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgbGV0IGNhbGN1bGF0ZWRTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihbXSkucmFuZ2UoWzAsIDBdKTtcclxuICAgIFxyXG4gICAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPT0gMCk7XHJcbiAgICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuICAgICAgICAgIGNvbnN0IHJlZHVjZWRCYXJXaWR0aCA9IHNlbGYuaXNab29tZWRPdXQgPyA2MCA6IDEwMDtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIC8vIEVuc3VyZSBtaW5pbXVtIHdpZHRoIGV2ZW4gaW4gZHJpbGxkb3duIG1vZGVcclxuICAgIHJldHVybiBNYXRoLm1heChjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCksIG1pbkJhcldpZHRoKTtcclxuICB9XHJcblxyXG4gIC8vIEZvciByZWd1bGFyIGNoYXJ0cywgZW5zdXJlIG1pbmltdW0gd2lkdGhcclxuICByZXR1cm4gTWF0aC5tYXgoeFN1Ymdyb3VwLmJhbmR3aWR0aCgpLCBtaW5CYXJXaWR0aCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQmFySGVpZ2h0KGQsIHksIGhlaWdodCwgc2VsZikge1xyXG4gIGlmIChkLnZhbHVlID09PSAtMSkge1xyXG4gICAgcmV0dXJuIGhlaWdodCAtIHkoMCk7XHJcbiAgfVxyXG5cclxuICBpZiAoZC52YWx1ZSA+PSAwKSB7XHJcbiAgICBjb25zdCBiYXJIZWlnaHQgPSBoZWlnaHQgLSB5KGQudmFsdWUpO1xyXG4gICAgY29uc3QgbWluSGVpZ2h0ID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uZGVmYXVsdEJhckhlaWdodCB8fCAyO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KGJhckhlaWdodCwgbWluSGVpZ2h0KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG59XHJcblxyXG5wcml2YXRlIGdldEJhckNvbG9yKGQsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgaWYgKGQudmFsdWUgJiYgc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiYgXHJcbiAgICAgIGQudmFsdWUgPj0gcGFyc2VGbG9hdChzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpICYmIFxyXG4gICAgICBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICBcclxuICAgIGNvbnN0IGtleSA9IGQua2V5LnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBjb2xvckFib3ZlVGFyZ2V0ID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldClcclxuICAgICAgLmZpbmQoayA9PiBrLnRvTG93ZXJDYXNlKCkgPT09IGtleSk7XHJcbiAgICBcclxuICAgIGlmIChjb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybiBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0W2NvbG9yQWJvdmVUYXJnZXRdO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JzW2Qua2V5XTtcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJCYXJMYWJlbHMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBcclxuICBtZXRhRGF0YSwgc2VsZiwgdGVtcFNjYWxlLCBpc3JpYSkge1xyXG4gIFxyXG4gIGNvbnN0IHN0YXRlID0gc3ZnLnNlbGVjdEFsbCgnLnN0YXRlJyk7XHJcbiAgXHJcbiAgY29uc3QgbGFiZWxzID0gc3RhdGUuc2VsZWN0QWxsKCd0ZXh0JylcclxuICAgIC5kYXRhKChkKSA9PiB0aGlzLnByZXBhcmVCYXJEYXRhKGQsIHN1Ymdyb3VwcykpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgndGV4dCcpXHJcbiAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuYXR0cigneCcsIDApXHJcbiAgICAuYXR0cigneScsIDApXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLWRhdGEtbGFiZWxzLXdlZWtseWNoYXJ0cycpXHJcbiAgICAudGV4dCgoZCkgPT4gdGhpcy5mb3JtYXRCYXJMYWJlbChkKSlcclxuICAgIC5zdHlsZSgnZmlsbCcsICcjMDAwJylcclxuICAgIC5zdHlsZSgnZm9udC13ZWlnaHQnLCAnYm9sZCcpXHJcbiAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUxhYmVsRm9udFNpemUoc2VsZikpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IHRoaXMuY2FsY3VsYXRlTGFiZWxUcmFuc2Zvcm0oZCwgZGF0YSwgeCwgeFN1Ymdyb3VwLCB5LCBzZWxmLCB0ZW1wU2NhbGUpKVxyXG4gICAgLm9uKCdjbGljaycsIChkKSA9PiB0aGlzLmhhbmRsZUJhckNsaWNrKGQsIG1ldGFEYXRhLCBzZWxmKSk7XHJcblxyXG4gIGlmICghaXNyaWEpIHtcclxuICAgIGxhYmVscy5vbignbW91c2VvdXQnLCAoKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3V0KHN2ZykpXHJcbiAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIChkKSA9PiB0aGlzLmhhbmRsZU1vdXNlT3ZlcihkLCBzdmcsIGRhdGEsIHgsIHksIGhlaWdodCwgbWV0YURhdGEsIHNlbGYsIDUwLCB0ZW1wU2NhbGUpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgZm9ybWF0QmFyTGFiZWwoZCkge1xyXG4gIGlmICghZC5rZXkgfHwgIWQudmFsdWUpIHJldHVybiAnJztcclxuICByZXR1cm4gZC5rZXkubGVuZ3RoID4gMjAgPyBkLmtleS5zdWJzdHJpbmcoMCwgMTcpICsgJy4uLicgOiBkLmtleTtcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVMYWJlbEZvbnRTaXplKHNlbGYpIHtcclxuICBpZiAoc2VsZi5pc1pvb21lZE91dCkgcmV0dXJuICc5cHgnO1xyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gMTkwMCkgcmV0dXJuICcxOHB4JztcclxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDE0MDApIHJldHVybiAnMTBweCc7XHJcbiAgICByZXR1cm4gJzE0cHgnO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICcxNHB4JztcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVMYWJlbFRyYW5zZm9ybShkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHksIHNlbGYsIHRlbXBTY2FsZSkge1xyXG4gIGxldCBjYWxjdWxhdGVkU2NhbGU7XHJcbiAgXHJcbiAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgY29uc3QgcmVkdWNlZFdpZHRoID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09PSAyID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkV2lkdGgpIC8gMjtcclxuICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5yYW5nZShbb2Zmc2V0LCB4LmJhbmR3aWR0aCgpIC0gb2Zmc2V0XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24udGV4dEFsd2F5c0hvcml6b250YWwpIHtcclxuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7eFN1Ymdyb3VwKGQua2V5KX0sJHt5KGQudmFsdWUpIC0gM30pYDtcclxuICB9XHJcblxyXG4gIGlmICghaXNOYU4oY2FsY3VsYXRlZFNjYWxlKGQua2V5KSkpIHtcclxuICAgIHJldHVybiBgdHJhbnNsYXRlKCR7Y2FsY3VsYXRlZFNjYWxlKGQua2V5KSArIGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSAqIDAuNTV9LCR7eSgwKSAtIDEwfSkgcm90YXRlKDI3MClgO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuICd0cmFuc2xhdGUoMCwwKSc7XHJcbn1cclxuXHJcbnByaXZhdGUgaGFuZGxlTW91c2VPdmVyKGQsIHN2ZywgZGF0YSwgeCwgeSwgaGVpZ2h0LCBtZXRhRGF0YSwgc2VsZiwgbGVmdEFuZFJpZ2h0U3BhY2VzLCB0ZW1wU2NhbGUpIHtcclxuICBzdmcuc2VsZWN0QWxsKCcubGliLXZlcnRpY2Fsc3RhY2stdGl0bGUtb250b3AnKS5yZW1vdmUoKTtcclxuXHJcbiAgbGV0IGNhbGN1bGF0ZWRTY2FsZTtcclxuICBsZXQgZWxlbWVudHNDb3VudGVyO1xyXG5cclxuICBkYXRhLmZvckVhY2goKGluZGl2OiBhbnkpID0+IHtcclxuICAgIGlmIChpbmRpdi5uYW1lID09PSBkLm5hbWUpIHtcclxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT09IDApO1xyXG4gICAgICBlbGVtZW50c0NvdW50ZXIgPSBrZXlzLmxlbmd0aDtcclxuICAgICAgY2FsY3VsYXRlZFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgY29uc3QgcmVkdWNlZFdpZHRoID0gT2JqZWN0LmtleXMoc2VsZi5jaGFydERhdGEuZGF0YVswXSkubGVuZ3RoID09PSAyID8gMjAwIDogMzAwO1xyXG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKHguYmFuZHdpZHRoKCkgLSByZWR1Y2VkV2lkdGgpIC8gMjtcclxuICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5yYW5nZShbb2Zmc2V0LCB4LmJhbmR3aWR0aCgpIC0gb2Zmc2V0XSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gMTI1KSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBjb25zdCB4UG9zaXRpb24gPSB0aGlzLmNhbGN1bGF0ZVRvb2x0aXBYKGQsIHgsIGNhbGN1bGF0ZWRTY2FsZSwgbWV0YURhdGEsIGxlZnRBbmRSaWdodFNwYWNlcyk7XHJcbiAgY29uc3Qgd2lkdGggPSB0aGlzLmNhbGN1bGF0ZVRvb2x0aXBXaWR0aChjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpO1xyXG5cclxuICBzdmcuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgIC5hdHRyKCd4JywgeFBvc2l0aW9uKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJylcclxuICAgIC5hdHRyKCd5JywgeShkLnZhbHVlKSAtIDMgLSA0MCAtIDEwKVxyXG4gICAgLmF0dHIoJ2R5JywgZC5jbGFzcylcclxuICAgIC5hdHRyKCd3aWR0aCcsIHdpZHRoKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIDUwKVxyXG4gICAgLmFwcGVuZCgneGh0bWw6ZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICd0aXRsZScpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCA5OSlcclxuICAgIC5odG1sKCgpID0+IHRoaXMuZ2VuZXJhdGVUb29sdGlwSFRNTChkLCBtZXRhRGF0YSkpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBYKGQsIHgsIGNhbGN1bGF0ZWRTY2FsZSwgbWV0YURhdGEsIGxlZnRBbmRSaWdodFNwYWNlcykge1xyXG4gIGlmIChtZXRhRGF0YS5oYXNEcmlsbERvd24pIHtcclxuICAgIGlmIChjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyID4gMTgwKSB7XHJcbiAgICAgIHJldHVybiB4KGQubmFtZSkgKyBjYWxjdWxhdGVkU2NhbGUoZC5rZXkpICsgY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpIC8gMiAtIDkwO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHgoZC5uYW1lKSArIGNhbGN1bGF0ZWRTY2FsZShkLmtleSkgLSBcclxuICAgICAgICAgICAoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMikgLyAyICsgXHJcbiAgICAgICAgICAgY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpIC8gMjtcclxuICB9XHJcbiAgcmV0dXJuIHgoZC5uYW1lKSArIGNhbGN1bGF0ZWRTY2FsZShkLmtleSkgLSBcclxuICAgICAgICAgKGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gMiArIFxyXG4gICAgICAgICBjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgLyAyO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZVRvb2x0aXBXaWR0aChjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpIHtcclxuICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICBpZiAoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4gICAgICByZXR1cm4gJzE4MHB4JztcclxuICAgIH1cclxuICAgIHJldHVybiBjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyO1xyXG4gIH1cclxuICByZXR1cm4gY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMjtcclxufVxyXG5cclxucHJpdmF0ZSBnZW5lcmF0ZVRvb2x0aXBIVE1MKGQsIG1ldGFEYXRhKSB7XHJcbiAgY29uc3QgYmFyTGFiZWwgPSBkLmtleTtcclxuICBjb25zdCBkYXRhVHlwZSA9IG1ldGFEYXRhLmRhdGFUeXBlIHx8ICcnO1xyXG4gIGNvbnN0IHZhbHVlID0gZC52YWx1ZTtcclxuICBcclxuICBsZXQgaHRtbCA9IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci1uYW1lXCI+JHtiYXJMYWJlbH08L3NwYW4+YDtcclxuICBodG1sICs9IGA8c3BhbiBjbGFzcz1cInRpdGxlLWJhci12YWx1ZVwiPjxzcGFuPiR7dmFsdWV9PC9zcGFuPiR7ZGF0YVR5cGV9PC9zcGFuPmA7XHJcbiAgXHJcbiAgcmV0dXJuIGh0bWw7XHJcbn1cclxuXHJcbnByaXZhdGUgaGFuZGxlTW91c2VPdXQoc3ZnKSB7XHJcbiAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyWUF4aXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHksIHlMaW5lQXhpcywgbGluZURhdGEsIHNlbGYsIGlzcmlhLCBtYXJnaW4pIHtcclxuICAvLyBIaWRkZW4geS1heGlzIGZvciByZWZlcmVuY2VcclxuICBzdmcuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dCB5YXhpcy1kYXNoZWQnKVxyXG4gICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAuY2FsbCh5KVxyXG4gICAgLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuXHJcbiAgLy8gTGVmdCB5LWF4aXNcclxuICBzdmdZQXhpc0xlZnQuYXBwZW5kKCdnJylcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgIC5jYWxsKGQzLmF4aXNMZWZ0KHkpXHJcbiAgICAgIC50aWNrU2l6ZSgwKVxyXG4gICAgICAudGlja3Moc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubnVtYmVyT2ZZVGlja3MpXHJcbiAgICAgIC50aWNrRm9ybWF0KChkKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkID0gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyIFxyXG4gICAgICAgICAgPyBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0xhYmVsRm9tYXR0ZXIoZCkgXHJcbiAgICAgICAgICA6IGQ7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZCA+PSAxMDAwID8gZm9ybWF0dGVkIC8gMTAwMCArICdrJyA6IGZvcm1hdHRlZDtcclxuICAgICAgfSkpXHJcbiAgICAuY2FsbCgoZykgPT4ge1xyXG4gICAgICBnLnNlbGVjdCgnLmRvbWFpbicpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAndmFyKC0tY2hhcnQtZG9tYWluLWNvbG9yLCAjMDAwMDAwKScpXHJcbiAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCAnMXB4Jyk7XHJcbiAgICB9KVxyXG4gICAgLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgLy8gUmlnaHQgeS1heGlzIChoaWRkZW4gYnkgZGVmYXVsdClcclxuICBzdmdZQXhpc1JpZ2h0LmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXlheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24geWF4aXMtZGFzaGVkJylcclxuICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgLmNhbGwoeSlcclxuICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gIC8vIExpbmUgY2hhcnQgYXhpcyBpZiBhcHBsaWNhYmxlXHJcbiAgaWYgKGxpbmVEYXRhICE9IG51bGwgJiYgbGluZURhdGEgJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uc2hvd0xpbmVDaGFydEF4aXMpIHtcclxuICAgIHN2Z1lBeGlzUmlnaHQuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1zdGFja2VkLXktYXhpcy10ZXh0MScpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAgIC5jYWxsKHlMaW5lQXhpcyk7XHJcbiAgfVxyXG5cclxuICAvLyBBcHBseSBheGlzIHZpc2liaWxpdHkgY29uZmlndXJhdGlvbnNcclxuICB0aGlzLmFwcGx5QXhpc1Zpc2liaWxpdHlDb25maWcoc2VsZik7XHJcbn1cclxuXHJcbnByaXZhdGUgYXBwbHlBeGlzVmlzaWJpbGl0eUNvbmZpZyhzZWxmKSB7XHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWGF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgZDMuc2VsZWN0QWxsKCdnLmxpYi1saW5lLXgtYXhpcy10ZXh0ID4gZyA+IHRleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0xhYmVsSGlkZGVuKSB7XHJcbiAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQgPiBnID4gdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItZGlzcGxheS1oaWRkZW4nKTtcclxuICB9XHJcblxyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1lheGlzSGlkZGVuKSB7XHJcbiAgICBkMy5zZWxlY3RBbGwoJy55YXhpcy1kYXNoZWQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0Rhc2hlZCkge1xyXG4gICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJylcclxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgIzk5OTk5OSknKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyQXhpc0xhYmVscyhzdmcsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgbWV0YURhdGEsIHdpZHRoLCBoZWlnaHQsIG1hcmdpbiwgc2VsZiwgaXNyaWEsIHJpZ2h0U3ZnV2lkdGgpIHtcclxuICAvLyBZLWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEueUxhYmVsKSB7XHJcbiAgICBjb25zdCB5UG9zaXRpb24gPSBpc3JpYSA/IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSAzMCA6IDAgLSBtYXJnaW4ubGVmdCAvIDIgLSA0MDtcclxuXHJcbiAgICBzdmdZQXhpc0xlZnQuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoLTkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgeVBvc2l0aW9uKVxyXG4gICAgICAuYXR0cigneCcsIDAgLSBoZWlnaHQgLyAyKVxyXG4gICAgICAuYXR0cignZHknLCAnMWVtJylcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpO1xyXG5cclxuICAgIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHN2Z1lBeGlzTGVmdC5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbiAgICAgICAgLnRleHQobWV0YURhdGEueUxhYmVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN2Zy5zZWxlY3RBbGwoJy5saWItYXhpcy1ncm91cC1sYWJlbCcpXHJcbiAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15bGFiZWwtd2Vla2x5Q2hhcnRzJylcclxuICAgICAgICAudGV4dChtZXRhRGF0YS55TGFiZWwudG9Mb3dlckNhc2UoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBYLWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEueExhYmVsKSB7XHJcbiAgICBjb25zdCBpc0Fjcm9ueW0gPSB0aGlzLmlzTGFiZWxBY3JvbnltKG1ldGFEYXRhLnhMYWJlbCk7XHJcbiAgICBjb25zdCB4UG9zaXRpb24gPSBpc3JpYSBcclxuICAgICAgPyAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20pIFxyXG4gICAgICA6IChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDQwKTtcclxuXHJcbiAgICBzdmcuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgdGhpcy5nZXRYTGFiZWxDbGFzcyhzZWxmKSlcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueEF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt3aWR0aCAvIDJ9LCR7eFBvc2l0aW9ufSlgKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC50ZXh0KGlzQWNyb255bSA/IG1ldGFEYXRhLnhMYWJlbC50b1VwcGVyQ2FzZSgpIDogbWV0YURhdGEueExhYmVsLnRvTG93ZXJDYXNlKCkpXHJcbiAgICAgIC5zdHlsZSgndGV4dC10cmFuc2Zvcm0nLCBpc0Fjcm9ueW0gPyAnbm9uZScgOiAnY2FwaXRhbGl6ZScpO1xyXG4gIH1cclxuXHJcbiAgLy8gTGluZSB5LWF4aXMgbGFiZWxcclxuICBpZiAobWV0YURhdGEubGluZXlMYWJlbCkge1xyXG4gICAgc3ZnWUF4aXNSaWdodC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWF4aXMtZ3JvdXAtbGFiZWwgbGliLWxpbmUtYXhpcycpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21sYWJlbFN0eWxlcylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKSByb3RhdGUoOTApJylcclxuICAgICAgLmF0dHIoJ3knLCAtMTAwKVxyXG4gICAgICAuYXR0cigneCcsIDEwMClcclxuICAgICAgLmF0dHIoJ2R5JywgJzVlbScpXHJcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAnc21hbGxlcicpXHJcbiAgICAgIC50ZXh0KG1ldGFEYXRhLmxpbmV5TGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgLy8gQXBwbHkgZHJpbGxkb3duIGNoYXJ0IHNwZWNpZmljIHN0eWxlc1xyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljayBsaW5lJykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBpc0xhYmVsQWNyb255bShsYWJlbCkge1xyXG4gIHJldHVybiAobGFiZWwubGVuZ3RoIDw9IDQgJiYgL15bQS1aXSskLy50ZXN0KGxhYmVsKSkgfHxcclxuICAgICAgICAgKGxhYmVsID09PSBsYWJlbC50b1VwcGVyQ2FzZSgpICYmIC9bQS1aXS8udGVzdChsYWJlbCkpO1xyXG59XHJcblxyXG5wcml2YXRlIGdldFhMYWJlbENsYXNzKHNlbGYpIHtcclxuICBsZXQgYmFzZUNsYXNzID0gJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGZvbnQtc2l6ZS0xJztcclxuICBcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC1kcmlsbGRvd25jaGFydHMnO1xyXG4gIH1cclxuICBcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLXhsYWJlbC13ZWVrbHlDaGFydHMnO1xyXG4gIH1cclxuICBcclxuICByZXR1cm4gYmFzZUNsYXNzICsgJyBsaWItYXhpcy13YXRlcmZhbGwtbGFiZWwnO1xyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlclRhcmdldExpbmUoc3ZnLCBzdmdZQXhpc1JpZ2h0LCB5LCB3aWR0aCwgcmlnaHRTdmdXaWR0aCwgbWV0YURhdGEsIHNlbGYpIHtcclxuICBjb25zdCB5WmVybyA9IHkodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KTtcclxuXHJcbiAgLy8gRHJhdyB0YXJnZXQgbGluZVxyXG4gIHN2Zy5hcHBlbmQoJ2xpbmUnKVxyXG4gICAgLmF0dHIoJ3gxJywgMClcclxuICAgIC5hdHRyKCd4MicsIHdpZHRoKVxyXG4gICAgLmF0dHIoJ3kxJywgeVplcm8pXHJcbiAgICAuYXR0cigneTInLCB5WmVybylcclxuICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgLnN0eWxlKCdzdHJva2UnLCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS5jb2xvcik7XHJcblxyXG4gIC8vIEFkZCB0YXJnZXQgbGFiZWxcclxuICBjb25zdCBkYXRhVHlwZVRlbXAgPSBtZXRhRGF0YS5kYXRhVHlwZSB8fCAnJztcclxuICBjb25zdCB0YXJnZXRMaW5lTmFtZSA9IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldE5hbWUgfHwgJ3RhcmdldCc7XHJcblxyXG4gIHN2Z1lBeGlzUmlnaHQuYXBwZW5kKCdmb3JlaWduT2JqZWN0JylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt5WmVybyAtIDMwfSlgKVxyXG4gICAgLmF0dHIoJ3dpZHRoJywgcmlnaHRTdmdXaWR0aClcclxuICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAuYXR0cignY2xhc3MnLCAndGFyZ2V0LWRpc3BsYXknKVxyXG4gICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuaHRtbChgPGRpdj4ke3RhcmdldExpbmVOYW1lfTwvZGl2PjxkaXY+JHtzZWxmLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXR9JHtkYXRhVHlwZVRlbXB9PC9kaXY+YCk7XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHgsIGxpbmVZc2NhbGUsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgLy8gRHJhdyBsaW5lIHBhdGhcclxuICBzdmcuYXBwZW5kKCdwYXRoJylcclxuICAgIC5kYXR1bShsaW5lRGF0YSlcclxuICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKVxyXG4gICAgLmF0dHIoJ3N0cm9rZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4gICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDEuNSlcclxuICAgIC5hdHRyKCdkJywgZDMubGluZSgpXHJcbiAgICAgIC54KChkKSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLnkoKGQpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpKTtcclxuXHJcbiAgLy8gQWRkIGRvdHNcclxuICBjb25zdCBkb3QgPSBzdmcuc2VsZWN0QWxsKCdteUNpcmNsZXMnKVxyXG4gICAgLmRhdGEobGluZURhdGEpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAub24oJ2NsaWNrJywgKGQpID0+IHtcclxuICAgICAgaWYgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2sgfHwgIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5sZW5ndGggfHxcclxuICAgICAgICAgICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/Lm5hbWUpICYmIFxyXG4gICAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSkpIHtcclxuICAgICAgICBzZWxmLmhhbmRsZUNsaWNrKGQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgZG90LmFwcGVuZCgnY2lyY2xlJylcclxuICAgIC5hdHRyKCdmaWxsJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAuYXR0cignc3Ryb2tlJywgJ25vbmUnKVxyXG4gICAgLmF0dHIoJ2N4JywgKGQpID0+IHgoZC5uYW1lKSArIHguYmFuZHdpZHRoKCkgLyAyKVxyXG4gICAgLmF0dHIoJ2N5JywgKGQpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAuc3R5bGUoJ2N1cnNvcicsICgpID0+IHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93biA/ICdwb2ludGVyJyA6ICdkZWZhdWx0JylcclxuICAgIC5hdHRyKCdyJywgMyk7XHJcblxyXG4gIC8vIEFkZCB2YWx1ZSBsYWJlbHNcclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpIHtcclxuICAgIGRvdC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnZG90JylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAuYXR0cignY29sb3InLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgICAgLmF0dHIoJ3N0eWxlJywgJ2ZvbnQtc2l6ZTogLjg1ZW0nKVxyXG4gICAgICAuYXR0cigneCcsIChkKSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgICAgLmF0dHIoJ3knLCAoZCkgPT4gbGluZVlzY2FsZShkLnZhbHVlKSlcclxuICAgICAgLmF0dHIoJ2R5JywgJy0xZW0nKVxyXG4gICAgICAudGV4dCgoZCkgPT4gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGFiZWxGb3JtYXR0ZXIoZC52YWx1ZSkpO1xyXG4gIH1cclxufVxyXG5cclxucHJpdmF0ZSBoYW5kbGVab29tT3V0KHN2ZywgaGVpZ2h0LCBtYXJnaW4pIHtcclxuICBzdmcuc2VsZWN0QWxsKCcubGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgLmVhY2goKGQsIGksIG5vZGVzKSA9PiB7XHJcbiAgICAgIGNvbnN0IHRleHQgPSBkMy5zZWxlY3Qobm9kZXNbaV0pO1xyXG4gICAgICBjb25zdCBsYWJlbCA9IHRleHQudGV4dCgpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGxhYmVsLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcclxuICAgICAgICBjb25zdCBsaW5lcyA9IGxhYmVsLnNwbGl0KCdcXG4nKTtcclxuICAgICAgICB0ZXh0LnRleHQobnVsbCk7XHJcbiAgICAgICAgbGluZXMuZm9yRWFjaCgobGluZSwgaWR4KSA9PiB7XHJcbiAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKVxyXG4gICAgICAgICAgICAudGV4dChsaW5lKVxyXG4gICAgICAgICAgICAuYXR0cigneCcsIDApXHJcbiAgICAgICAgICAgIC5hdHRyKCdkeScsIGlkeCA9PT0gMCA/ICcxZW0nIDogJzEuMWVtJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgd29yZHMgPSBsYWJlbC5zcGxpdCgnICcpO1xyXG4gICAgICAgIHRleHQudGV4dChudWxsKTtcclxuICAgICAgICB3b3Jkcy5mb3JFYWNoKCh3b3JkKSA9PiB7XHJcbiAgICAgICAgICB0ZXh0LmFwcGVuZCgndHNwYW4nKS50ZXh0KHdvcmQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKTtcclxuXHJcbiAgc3ZnLnNlbGVjdCgnLngtYXhpcycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCAke2hlaWdodCAtIG1hcmdpbi5ib3R0b20gKyAxMH0pYCk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQ2hhcnREaW1lbnNpb25zKGNoYXJ0Q29udGFpbmVyOiBhbnksIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcjogYW55LCBtYXJnaW46IGFueSwgc2VsZjogYW55KSB7XHJcbiAgbGV0IHdpZHRoID0gcGFyc2VJbnQoY2hhcnRDb250YWluZXIuc3R5bGUoJ3dpZHRoJykpIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQ7XHJcbiAgY29uc3QgZGF0YUxlbmd0aCA9IHRoaXMuY2hhcnREYXRhLmRhdGEubGVuZ3RoO1xyXG4gIGNvbnN0IHN1Ymdyb3Vwc0NvdW50ID0gKHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhLmtleUxpc3QgYXMgYW55IHx8IFtdKS5sZW5ndGg7XHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDU3NjtcclxuICBjb25zdCBpc1RhYmxldCA9IHdpbmRvdy5pbm5lcldpZHRoID49IDU3NiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDk5MjtcclxuXHJcbiAgLy8gTWluaW11bSB3aWR0aCBwZXIgYmFyIGdyb3VwIGJhc2VkIG9uIGRldmljZSBhbmQgbnVtYmVyIG9mIHN1Ymdyb3Vwc1xyXG4gIGNvbnN0IG1pbldpZHRoUGVyR3JvdXAgPSAoKCkgPT4ge1xyXG4gICAgaWYgKHN1Ymdyb3Vwc0NvdW50ID4gMikge1xyXG4gICAgICByZXR1cm4gaXNNb2JpbGUgPyA4MCA6IGlzVGFibGV0ID8gMTAwIDogMTIwOyAvLyBXaWRlciBmb3IgbXVsdGlwbGUgc3ViZ3JvdXBzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNNb2JpbGUgPyA0MCA6IGlzVGFibGV0ID8gNjAgOiA4MDsgLy8gTm9ybWFsIHdpZHRoIGZvciAxLTIgc3ViZ3JvdXBzXHJcbiAgfSkoKTtcclxuXHJcbiAgLy8gQ2FsY3VsYXRlIG1pbmltdW0gcmVxdWlyZWQgd2lkdGggZm9yIGFsbCBncm91cHNcclxuICBjb25zdCBtaW5SZXF1aXJlZFdpZHRoID0gZGF0YUxlbmd0aCAqIG1pbldpZHRoUGVyR3JvdXA7XHJcblxyXG4gIC8vIEluIHpvb21lZC1vdXQgc3RhdGUsIGVuc3VyZSBtaW5pbXVtIHdpZHRoIGZvciByZWFkYWJpbGl0eVxyXG4gIGlmICh0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICAvLyBJZiB3ZSBoYXZlIG1hbnkgZ3JvdXBzIG9yIG11bHRpcGxlIHN1Ymdyb3VwcywgZW5zdXJlIG1pbmltdW0gd2lkdGhcclxuICAgIGlmIChkYXRhTGVuZ3RoID4gOCB8fCBzdWJncm91cHNDb3VudCA+IDIpIHtcclxuICAgICAgd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbWluUmVxdWlyZWRXaWR0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBJbiB6b29tZWQtaW4gc3RhdGUsIGFsd2F5cyBlbnN1cmUgZ2VuZXJvdXMgc3BhY2luZ1xyXG4gIGlmIChkYXRhTGVuZ3RoID4gOCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5kcm9wZG93bkRhdGEyICYmXHJcbiAgICAgIHdpZHRoIDwgZGF0YUxlbmd0aCAqIDI1MFxyXG4gICAgKSB7XHJcbiAgICAgIHdpZHRoID0gZGF0YUxlbmd0aCAqIDI1MDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIEluY3JlYXNlIHdpZHRoIGZvciBtdWx0aXBsZSBzdWJncm91cHNcclxuICAgICAgd2lkdGggPSBkYXRhTGVuZ3RoICogKHN1Ymdyb3Vwc0NvdW50ID4gMiA/IDIwMCA6IDE2MCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tIEhlaWdodCBMb2dpYyAobm8gY2hhbmdlKSAtLS0tXHJcbiAgbGV0IGhlaWdodCA9XHJcbiAgICBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKSAqXHJcbiAgICAgIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgLyAxMDApIC1cclxuICAgIG1hcmdpbi50b3AgLVxyXG4gICAgbWFyZ2luLmJvdHRvbTtcclxuXHJcbiAgaWYgKFxyXG4gICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuICE9PSB1bmRlZmluZWQgJiZcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRnVsbFNjcmVlblxyXG4gICkge1xyXG4gICAgaGVpZ2h0ID1cclxuICAgICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0ICE9PSA3MFxyXG4gICAgICAgID8gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0XHJcbiAgICAgICAgOiBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0ICYmICF0aGlzLmlzSGVhZGVyVmlzaWJsZSkge1xyXG4gICAgaGVpZ2h0ID1cclxuICAgICAgcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLVxyXG4gICAgICBtYXJnaW4udG9wIC1cclxuICAgICAgbWFyZ2luLmJvdHRvbSAtXHJcbiAgICAgIDEzMDtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0hlYWRlclZpc2libGUpIHtcclxuICAgIGhlaWdodCA9XHJcbiAgICAgIHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpIC1cclxuICAgICAgbWFyZ2luLnRvcCAtXHJcbiAgICAgIG1hcmdpbi5ib3R0b20gLVxyXG4gICAgICAxMDA7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0IH07XHJcbn1cclxucHJpdmF0ZSBjcmVhdGVDaGFydENvbnRhaW5lcnMoXHJcbiAgY2hhcnRDb250YWluZXI6IGFueSxcclxuICBtYXJnaW46IGFueSxcclxuICBoZWlnaHQ6IG51bWJlcixcclxuICByaWdodFN2Z1dpZHRoOiBudW1iZXIsXHJcbiAgc2VsZjogYW55LFxyXG4gIHdpZHRoOiBudW1iZXJcclxuKSB7XHJcbiAgLy8gT3V0ZXIgY29udGFpbmVyXHJcbiAgY29uc3Qgb3V0ZXJDb250YWluZXIgPSBjaGFydENvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5hdHRyKCdpZCcsIHNlbGYudW5pcXVlSWQpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnb3V0ZXItY29udGFpbmVyJylcclxuICAgIC5zdHlsZSgnd2lkdGgnLCAnMTAwJScpXHJcbiAgICAuc3R5bGUoJ2hlaWdodCcsIGhlaWdodClcclxuICAgIC5zdHlsZSgnb3ZlcmZsb3cnLCAndmlzaWJsZScpIC8vIEFsbG93IG92ZXJmbG93IHRvIHNob3cgc2Nyb2xsYmFyc1xyXG4gICAgLnN0eWxlKCdwYWRkaW5nLWxlZnQnLCBgJHttYXJnaW4ubGVmdH1weGApXHJcbiAgICAuc3R5bGUoJ3BhZGRpbmctcmlnaHQnLCBgJHtyaWdodFN2Z1dpZHRofXB4YClcclxuICAgIC5zdHlsZSgnbWFyZ2luLWxlZnQnLCAnMTVweCcpO1xyXG5cclxuICAvLyBMZWZ0IFktQXhpc1xyXG4gIGNvbnN0IHN2Z1lBeGlzTGVmdCA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdzdmcnKVxyXG4gICAgLmF0dHIoJ3dpZHRoJywgJzEwMCcpXHJcbiAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAxMClcclxuICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgLnN0eWxlKCdsZWZ0JywgJzAnKVxyXG4gICAgLnN0eWxlKCd6LWluZGV4JywgMSlcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHttYXJnaW4ubGVmdCArIDE1fSwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICAvLyBSaWdodCBZLUF4aXNcclxuICBjb25zdCBzdmdZQXhpc1JpZ2h0ID0gb3V0ZXJDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAuYXR0cignd2lkdGgnLCByaWdodFN2Z1dpZHRoKVxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgMTApXHJcbiAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJylcclxuICAgIC5zdHlsZSgncmlnaHQnLCAnMTJweCcpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gIC8vIElubmVyIHNjcm9sbGFibGUgY29udGFpbmVyXHJcbiAgY29uc3QgaW5uZXJDb250YWluZXIgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnZGl2JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdpbm5lci1jb250YWluZXInKVxyXG4gICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgIC5zdHlsZSgnb3ZlcmZsb3cteCcsICdhdXRvJyk7XHJcblxyXG4gIC8vIE1haW4gU1ZHXHJcbiAgY29uc3Qgc3ZnID0gaW5uZXJDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAuYXR0cignd2lkdGgnLCBNYXRoLm1heCh3aWR0aCAtIHJpZ2h0U3ZnV2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoICogMC44KSkgLy8gRW5zdXJlIG1pbmltdW0gd2lkdGhcclxuICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDYwKVxyXG4gICAgLnN0eWxlKCdtaW4td2lkdGgnLCAnMTAwJScpIC8vIFByZXZlbnQgc3ZnIGZyb20gc2hyaW5raW5nXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgcmV0dXJuIHsgb3V0ZXJDb250YWluZXIsIHN2Z1lBeGlzTGVmdCwgc3ZnWUF4aXNSaWdodCwgaW5uZXJDb250YWluZXIsIHN2ZyB9O1xyXG59XHJcbiAgaGFuZGxlQ2xpY2soZDogYW55KSB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duIHx8IGQ/LnRvZ2dsZUZyb20pXHJcbiAgICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGQpO1xyXG4gIH1cclxuICBoYW5kbGVIZWFkZXJNZW51Q2xpY2soaWQpIHtcclxuICAgIHRoaXMuaGVhZGVyTWVudWNsaWNrRXZlbnQuZW1pdChpZCk7XHJcbiAgfVxyXG4gIGhhbmRsZUREMUNsaWNrKGV2ZW50KSB7XHJcbiAgICB0aGlzLmlzREQxT3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLmlzREQyT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuICBoYW5kbGVERDJDbGljayhldmVudCkge1xyXG4gICAgdGhpcy5pc0REMk9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5pc0REMU9wZW4gPSBmYWxzZTtcclxuICB9XHJcbiAgaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKGV2ZW50KSB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcclxuICAjZ3JvdXBjb250YWluZXJcclxuICBjbGFzcz1cImxpYi1jaGFydC13cmFwcGVyXCJcclxuICBbbmdDbGFzc109XCJ7ICdsaWItbm8tYmFja2dyb3VuZCc6IGlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kIH1cIlxyXG4gIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY2FyZC1iZyk7XCJcclxuICAocmVzaXplZCk9XCJvblJlc2l6ZWQoJGV2ZW50KVwiXHJcbj5cclxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFsdFwiICpuZ0lmPVwiIWlzSGVhZGVyVmlzaWJsZVwiPlxyXG4gICAgPGxpYi1jaGFydC1oZWFkZXItdjJcclxuICAgICAgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIlxyXG4gICAgICBbY2hhcnRDb25maWd1cmF0aW9uXT1cImNoYXJ0Q29uZmlndXJhdGlvblwiXHJcbiAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxyXG4gICAgPjwvbGliLWNoYXJ0LWhlYWRlci12Mj5cclxuICAgIDxsaWItY2hhcnQtaGVhZGVyLXYzXHJcbiAgICAgIFtjaGFydERhdGFdPVwiY2hhcnREYXRhXCJcclxuICAgICAgW2NoYXJ0Q29uZmlndXJhdGlvbl09XCJjaGFydENvbmZpZ3VyYXRpb25cIlxyXG4gICAgICAoY29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKT1cImhhbmRsZUNvbXBhcmVCeUZpbHRlclNlbGVjdGlvbigkZXZlbnQpXCJcclxuICAgICAgKHpvb21Jblpvb21PdXRDbGljayk9XCJoYW5kbGVab29taW5ab29tb3V0Q2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYzPlxyXG4gIDwvZGl2PlxyXG4gIDxsaWItY2hhcnQtaGVhZGVyLXYxXHJcbiAgICBbdGl0bGVdPVwiY2hhcnREYXRhLm1ldGFEYXRhLnRpdGxlXCJcclxuICAgIFtoYXNEcmlsbERvd25dPVwiY2hhcnREYXRhLm1ldGFEYXRhLmhhc0RyaWxsRG93blwiXHJcbiAgICBbaXNFZGl0RW5hYmxlZF09XCJjaGFydERhdGEubWV0YURhdGEuaXNFZGl0RW5hYmxlZFwiXHJcbiAgICBbbWVudU9wdGlvbnNdPVwiY2hhcnRDb25maWd1cmF0aW9uLmhlYWRlck1lbnVPcHRpb25zXCJcclxuICAgIFtpc3JpYV09XCJjdXN0b21DaGFydENvbmZpZ3VyYXRpb24uaXNSaWFcIlxyXG4gICAgW3NlbGVjdGVkS3BpVG9vbHRvcF09XCJjaGFydENvbmZpZ3VyYXRpb24uc2VsZWN0ZWRLcGlUb29sdG9wXCJcclxuICAgIChtZW51T3B0aW9uQ2xpY2tFdmVudCk9XCJoYW5kbGVIZWFkZXJNZW51Q2xpY2soJGV2ZW50KVwiXHJcbiAgICBbaXNBbGVydEVuYWJsZWRdPVwiaXNBbGVydEVuYWJsZWRcIlxyXG4gICAgKm5nSWY9XCJpc0hlYWRlclZpc2libGVcIlxyXG4gID48L2xpYi1jaGFydC1oZWFkZXItdjE+XHJcbiAgPGRpdlxyXG4gICAgKm5nSWY9XCJcclxuICAgICAgY2hhcnREYXRhICYmXHJcbiAgICAgIGNoYXJ0RGF0YS5tZXRhRGF0YSAmJlxyXG4gICAgICBjaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kSnVzdGlmaWVkICYmXHJcbiAgICAgIGxlZ2VuZFZpc2libGUgJiZcclxuICAgICAgY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZEF0VG9wUmlnaHRcclxuICAgIFwiXHJcbiAgICBjbGFzcz1cImxlZ2VuZC1ob2xkZXItcmlnaHRcIlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCJjaGFydENvbmZpZ3VyYXRpb24uZm9vdGVySGVpZ2h0XCJcclxuICA+XHJcbiAgICA8dWwgY2xhc3M9XCJkaXNwbGF5LWZsZXhcIj5cclxuICAgICAgPGxpXHJcbiAgICAgICAgY2xhc3M9XCJsZWdlbmRzLXBvc2l0aW9uaW5nLWlubGluZVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycyB8IGtleXZhbHVlIDoga2VlcE9yZGVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtaWNvbi1kcmlsbGRvd25cIlxyXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXRlbS52YWx1ZVwiXHJcbiAgICAgICAgPjwvc3BhblxyXG4gICAgICAgID48c3Bhbj57eyBpdGVtLmtleSB9fTwvc3Bhbj5cclxuICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdlxyXG4gICAgW3N0eWxlLmhlaWdodF09XCJjaGFydENvbmZpZ3VyYXRpb24uc3ZnSGVpZ2h0XCJcclxuICAgIGlkPVwiZ3JvdXBjaGFydGNvbnRhaW5lclwiXHJcbiAgICAjZ3JvdXBjaGFydGNvbnRhaW5lclxyXG4gICAgY2xhc3M9XCJsaWItY2hhcnQtc3ZnXCJcclxuICA+PC9kaXY+XHJcblxyXG5cclxuICA8IS0tIDxkaXZcclxuICAgICpuZ0lmPVwiXHJcbiAgICAgIGNoYXJ0RGF0YSAmJlxyXG4gICAgICBjaGFydERhdGEubWV0YURhdGEgJiZcclxuICAgICAgY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZEp1c3RpZmllZCAmJlxyXG4gICAgICBsZWdlbmRWaXNpYmxlICYmXHJcbiAgICAgICFjaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kQXRUb3BSaWdodFxyXG4gICAgXCJcclxuICAgIGNsYXNzPVwibGliLWRvbnV0LWNoYXJ0LWZvb3RlclwiXHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5mb290ZXJIZWlnaHRcIlxyXG4gID5cclxuICAgIDx1bCBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtd3JhcHBlclwiPlxyXG4gICAgICA8bGlcclxuICAgICAgICBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtaXRlbVwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycyB8IGtleXZhbHVlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cImxpYi1kb251dC1qdXN0aWZpZWQtbGFiZWwtaWNvblwiXHJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICA+PC9zcGFuXHJcbiAgICAgICAgPjxzcGFuPnt7IGl0ZW0ua2V5IH19PC9zcGFuPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICA8L2Rpdj4gLS0+XHJcblxyXG5cclxuICA8IS0tIDxkaXYgKm5nSWY9XCJjaGFydENvbmZpZ3VyYXRpb24/LmlzRGlzcGxheUJhckRldGFpbHNBdEJvdHRvbVwiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJhci12YWx1ZXMgbGliLWRpc3BsYXktZmxleCBsaWItanVzdGlmeS1jb250ZW50LWNlbnRlciBsaWItYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgKm5nRm9yPVwiXHJcbiAgICAgICAgbGV0IGl0ZW0gb2YgY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9ycyB8IGtleXZhbHVlIDoga2VlcE9yZGVyO1xyXG4gICAgICAgIGxldCBpID0gaW5kZXhcclxuICAgICAgXCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImJhci1uYW1lIGZvbnQtc2l6ZS0xXCJcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgY2hhcnREYXRhLmRhdGFbMF1baXRlbS5rZXldICYmXHJcbiAgICAgICAgICBpIDw9IGNoYXJ0Q29uZmlndXJhdGlvbi5ob3dtYW55QmFyRGV0YWlsc1RvRGlzcGxheVxyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBpdGVtLmtleSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYmFyLXZhbHVlIGxpYi1kaXNwbGF5LWZsZXggbGliLWFsaWduLWl0ZW1zLWNlbnRlciBmb250LXNpemUtMVwiXHJcbiAgICAgICAgW3N0eWxlLmNvbG9yXT1cIlxyXG4gICAgICAgICAgY2hhcnRDb25maWd1cmF0aW9uLmJhclZhdWxlQ29sb3IgPyBiYXJWYXVsZUNvbG9yIDogaXRlbS52YWx1ZVxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgIGNoYXJ0RGF0YS5kYXRhWzBdW2l0ZW0ua2V5XSAmJlxyXG4gICAgICAgICAgaSA8PSBjaGFydENvbmZpZ3VyYXRpb24uaG93bWFueUJhckRldGFpbHNUb0Rpc3BsYXlcclxuICAgICAgICBcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgY2hhcnREYXRhLmRhdGFbMF1baXRlbS5rZXldIH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+IC0tPlxyXG48L2Rpdj5cclxuIl19
1208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F4aWRpby1zdHlsZWd1aWRlLWxpYnJhcnkvc3JjL2xpYi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakQsT0FBTyxXQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFFekIsT0FBTyxrQkFBa0IsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7OztBQVdsRCxNQUFNLE9BQU8sMkNBQ1gsU0FBUSxpQkFBaUI7SUF5RXpCO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUEvREEsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN6RCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUM5Qiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFD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Q0FBQyxDQUFDO0lBQzlCLENBQUM7K0dBMTNDVSwyQ0FBMkM7bUdBQTNDLDJDQUEyQyxnaEJDekJ4RCxrN0hBd0hBOzs0RkQvRmEsMkNBQTJDO2tCQVR2RCxTQUFTOytCQUNFLDZDQUE2QyxpQkFNeEMsaUJBQWlCLENBQUMsSUFBSTt3REFPckMsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJbEQsaUJBQWlCO3NCQURoQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHcEMsU0FBUztzQkFBakIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0ksVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tcG9uZW50VW5pcXVlSWQgfSBmcm9tICcuLi91bmlxdWUtaWQnO1xyXG5pbXBvcnQgQ2hhcnRIZWxwZXIgZnJvbSAnLi4vY2hhcnQtaGVscGVyJztcclxuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xyXG5pbXBvcnQgeyBSZXNpemVkRXZlbnQgfSBmcm9tICdhbmd1bGFyLXJlc2l6ZS1ldmVudCc7XHJcbmltcG9ydCBIZWFkZXJDb25maWdIZWxwZXIgZnJvbSAnLi4vaGVhZGVyLWNvbmZpZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9ob3Jpem9udGFsLWdyb3VwZWQtYmFyLXdpdGgtc2Nyb2xsLXpvb20uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW1xyXG4gICAgJy4vaG9yaXpvbnRhbC1ncm91cGVkLWJhci13aXRoLXNjcm9sbC16b29tLmNvbXBvbmVudC5sZXNzJyxcclxuICAgICcuLi9jb21tb24tc3R5bGVzLmxlc3MnLFxyXG4gIF0sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEhvcml6b250YWxHcm91cGVkQmFyV2l0aFNjcm9sbFpvb21Db21wb25lbnRcclxuICBleHRlbmRzIENvbXBvbmVudFVuaXF1ZUlkXHJcbiAgaW1wbGVtZW50cyBPbkluaXRcclxue1xyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY2hhcnRjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2dyb3VwY29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBncm91cGNvbnRhaW5lckVsdCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGNoYXJ0RGF0YTogYW55O1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbjogYW55O1xyXG4gIEBPdXRwdXQoKSBjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGhlYWRlck1lbnVjbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgaXNIZWFkZXJWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBsZWdlbmRWaXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcclxuICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNoYXJ0Q29uZmlndXJhdGlvbjogYW55ID0ge307XHJcbiAgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzO1xyXG5cclxuICBkZWZhdWx0Q29uZmlndXJhdGlvbjogYW55ID0ge1xyXG4gICAgbWFyZ2luOiB7IHRvcDogMjAsIHJpZ2h0OiAyMCwgYm90dG9tOiAyMCwgbGVmdDogNDAgfSxcclxuICAgIGxhYmVsRm9ybWF0dGVyOiBDaGFydEhlbHBlci5kZWZhdWx0Rm9ybWF0dGVyLFxyXG4gICAgc3ZnSGVpZ2h0OiA3MCxcclxuICAgIG51bWJlck9mWVRpY2tzOiA1LFxyXG4gICAgbGVnZW5kSnVzdGlmaWVkOiB0cnVlLFxyXG4gICAgeUxpbmVBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIHlBeGlzTGFiZWxGb21hdHRlcjogQ2hhcnRIZWxwZXIuZGVmYXVsdEZvcm1hdHRlcixcclxuICAgIGxpbmVHcmFwaENvbG9yOiAnI0Y2RDI4MycsXHJcbiAgICBzaG93TGluZUNoYXJ0QXhpczogdHJ1ZSxcclxuICAgIHNob3dWYWx1ZXM6IHRydWUsXHJcbiAgICBoZWFkZXJNZW51T3B0aW9uczogSGVhZGVyQ29uZmlnSGVscGVyLmhlYWRlckNvbmZpZy5oZWFkZXJNZW51T3B0aW9ucyxcclxuICAgIHhBeGlzR3JpZDogdW5kZWZpbmVkLFxyXG4gICAgeUF4aXNHcmlkOiBmYWxzZSxcclxuICAgIGxlZ2VuZFZpc2libGU6IGZhbHNlLFxyXG4gICAgaXNIZWFkZXJWaXNpYmxlOiB1bmRlZmluZWQsXHJcbiAgICBpc1RyYW5zcGFyZW50QmFja2dyb3VuZDogdW5kZWZpbmVkLFxyXG4gICAgaXNNdWx0aUNoYXJ0R3JpZExpbmU6IHVuZGVmaW5lZCxcclxuICAgIGlzRnVsbFNjcmVlbjogdW5kZWZpbmVkLFxyXG4gICAgY3VzdG9tWXNjYWxlOiB1bmRlZmluZWQsXHJcbiAgICB0ZXh0c09uQmFyOiB1bmRlZmluZWQsXHJcbiAgICBpc1hheGlzTGFiZWxIaWRkZW46IHVuZGVmaW5lZCxcclxuICAgIGlzWWF4aXNMYWJlbEhpZGRlbjogZmFsc2UsXHJcbiAgICBpc1lheGlzSGlkZGVuOiB1bmRlZmluZWQsXHJcbiAgICBpc1lheGlzRGFzaGVkOiB1bmRlZmluZWQsXHJcbiAgICB0ZXh0Rm9ybWF0dGVyOiB1bmRlZmluZWQsXHJcbiAgICBpc05vQWx0ZXJuYXRlWGF4aXNUZXh0OiB1bmRlZmluZWQsXHJcbiAgICBpc1hncmlkQmV0d2VlbkxhYmVsczogdW5kZWZpbmVkLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiAnI0ZGRkZGRicsXHJcbiAgICBoaWRlTGVnZW5kT25Ub3A6IHRydWUsXHJcbiAgICBpc1hheGlzQ29sb3I6ICcjOTk5OTk5JyxcclxuICAgIGxhYmVsT3ZlcmxhcE1pbm9yRml4OiB0cnVlLFxyXG4gICAgbm9Ib3ZlckVmZmVjdDogdHJ1ZSxcclxuICAgIG5vSG92ZXJEaXNwbGF5RGF0YTogdHJ1ZSxcclxuICAgIHNob3dYYXhpc1RvcDogdHJ1ZSxcclxuICAgIGRpc3BsYXlZYXhpc0xhYmVsczogdW5kZWZpbmVkLFxyXG4gICAgeExhYmVsc09uU2FtZUxpbmU6IHVuZGVmaW5lZCxcclxuICAgIHRleHRBbHdheXNIb3Jpem9udGFsOiB1bmRlZmluZWQsXHJcbiAgICBsZWdlbmRBdFRvcFJpZ2h0OiB1bmRlZmluZWQsXHJcbiAgICBpc0RyaWxsZG93bkNoYXJ0OiB0cnVlLFxyXG4gICAgZGlzcGxheVRpdGxlT25Ub3A6IHVuZGVmaW5lZCxcclxuICAgIGlzVG9nZ2xlVmlzaWJsZTogdW5kZWZpbmVkLFxyXG4gICAgaXNUaXRsZUhpZGRlbjogdW5kZWZpbmVkLFxyXG4gICAgaXNEaXNwbGF5QmFyRGV0YWlsc0F0Qm90dG9tOiB1bmRlZmluZWQsXHJcbiAgICBob3dtYW55QmFyRGV0YWlsc1RvRGlzcGxheTogMCxcclxuICAgIGJhclZhdWxlQ29sb3I6IHVuZGVmaW5lZCxcclxuICAgIGRlZmF1bHRCYXJIZWlnaHQ6IDIsXHJcbiAgfTtcclxuXHJcbiAgdW5pcXVlSWQ6IGFueSA9IHRoaXMuZ2V0VW5pcXVlSWQoKTtcclxuICBpc1pvb21lZE91dDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNERDFPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNERDJPcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG9uUmVzaXplZChldmVudDogUmVzaXplZEV2ZW50KSB7XHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICBzZXRUaW1lb3V0KFxyXG4gICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZDMuc2VsZWN0KCcjJyArIHNlbGYudW5pcXVlSWQpLnJlbW92ZSgpO1xyXG4gICAgICAgIHNlbGYuaW5pdGlhbGl6ZWdyb3VwQ2hhcnQoKTtcclxuICAgICAgfS5iaW5kKHNlbGYpLFxyXG4gICAgICAxMFxyXG4gICAgKTtcclxuICB9XHJcbiAgaXNab29tT3V0U2VsZWN0ZWQoaXNab29tT3V0LCBldmVudCkge1xyXG4gICAgdGhpcy5pc1pvb21lZE91dCA9IGlzWm9vbU91dDtcclxuICAgIHRoaXMub25SZXNpemVkKGV2ZW50KTtcclxuICB9XHJcbiAgaGFuZGxlWm9vbWluWm9vbW91dENsaWNrKHsgaXNab29tT3V0LCBldmVudCB9KSB7XHJcbiAgICB0aGlzLmlzWm9vbU91dFNlbGVjdGVkKGlzWm9vbU91dCwgZXZlbnQpO1xyXG4gIH1cclxuICBuZ09uSW5pdCgpIHt9XHJcbiAgaXNMZWdlbmRWaXNpYmxlKCkge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YSAmJlxyXG4gICAgICB0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5jb2xvcnMgJiZcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5jaGFydERhdGEubWV0YURhdGEuY29sb3JzKS5sZW5ndGggPiAxXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGtlZXBPcmRlciA9IChhLCBiKSA9PiB7XHJcbiAgICByZXR1cm4gYTtcclxuICB9O1xyXG5cclxuICBnZXQgaXNBbGVydEVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24/LmhlYWRlck1lbnVPcHRpb25zPy5zb21lKFxyXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24uaWQgPT09ICdlZGl0QWxlcnQnXHJcbiAgICApO1xyXG4gIH0gIFxyXG5cclxuaW5pdGlhbGl6ZWdyb3VwQ2hhcnQoKSB7XHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gVkFSSUFCTEUgREVDTEFSQVRJT05TID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgbGV0IGRhdGEgPSBbXTtcclxuICBsZXQgbWV0YURhdGE6IGFueSA9IG51bGw7XHJcbiAgbGV0IGtleUxpc3QgPSBudWxsO1xyXG4gIGxldCBsaW5lRGF0YSA9IG51bGw7XHJcbiAgbGV0IGNvbG9yTWFwID0ge307XHJcbiAgbGV0IGZvcm1hdEZyb21CYWNrZW5kO1xyXG4gIGxldCBmb3JtYXRGb3JIdWdlTnVtYmVycztcclxuICBcclxuICAvLyBEZXZpY2UgZGV0ZWN0aW9uXHJcbiAgY29uc3QgaXNNb2JpbGUgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDU3NjtcclxuICBjb25zdCBpc1RhYmxldCA9IHdpbmRvdy5pbm5lcldpZHRoID49IDU3NiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDk5MjtcclxuICBjb25zdCBpc0Rlc2t0b3AgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA5OTI7XHJcbiAgY29uc3QgaXNyaWEgPSB0aGlzLmN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYTtcclxuXHJcbiAgLy8gQ2hhcnQgc2NhbGUgdmFyaWFibGVzXHJcbiAgbGV0IHg6IGFueTtcclxuICBsZXQgdGVtcFNjYWxlO1xyXG5cclxuICAvLyBUaWNrIGxlbmd0aCBjb25zdGFudHNcclxuICBjb25zdCBTSE9SVF9USUNLX0xFTkdUSCA9IDQ7XHJcbiAgY29uc3QgTE9OR19USUNLX0xFTkdUSCA9IDE2O1xyXG4gIGNvbnN0IFNIT1JUX1RJQ0tfTEVOR1RIX0JHID0gNTtcclxuICBjb25zdCBMT05HX1RJQ0tfTEVOR1RIX0JHID0gMzA7XHJcbiAgY29uc3QgTEVGVF9BTkRfUklHSFRfU1BBQ0VTID0gNTA7XHJcbiAgY29uc3QgUklHSFRfU1ZHX1dJRFRIID0gNjA7XHJcbiAgXHJcbiAgLy8gRmxhZ3NcclxuICBsZXQgYWx0ZXJuYXRlX3RleHQgPSBmYWxzZTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQ09ORklHVVJBVElPTiBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcclxuICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uW2tleV0gPSBDaGFydEhlbHBlci5nZXRWYWx1ZUJ5Q29uZmlndXJhdGlvblR5cGUoXHJcbiAgICAgIGtleSxcclxuICAgICAgdGhpcy5kZWZhdWx0Q29uZmlndXJhdGlvbixcclxuICAgICAgdGhpcy5jdXN0b21DaGFydENvbmZpZ3VyYXRpb25cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBFeHRyYWN0IGNoYXJ0IGRhdGFcclxuICBkYXRhID0gdGhpcy5jaGFydERhdGEuZGF0YTtcclxuICBtZXRhRGF0YSA9IHRoaXMuY2hhcnREYXRhLm1ldGFEYXRhO1xyXG4gIGxpbmVEYXRhID0gdGhpcy5jaGFydERhdGEubGluZURhdGE7XHJcblxyXG4gIC8vIFNldHVwIGNvbG9yIG1hcHBpbmdzXHJcbiAgaWYgKCFtZXRhRGF0YS5jb2xvckFib3ZlVGFyZ2V0KSB7XHJcbiAgICBtZXRhRGF0YVsnY29sb3JBYm92ZVRhcmdldCddID0gbWV0YURhdGEuY29sb3JzO1xyXG4gIH1cclxuICBjb2xvck1hcCA9IG1ldGFEYXRhLmNvbG9ycztcclxuICBrZXlMaXN0ID0gbWV0YURhdGEua2V5TGlzdDtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gQ09OVEFJTkVSIFNFVFVQID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3QgY2hhcnRDb250YWluZXIgPSBkMy5zZWxlY3QodGhpcy5jb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgY29uc3QgdmVydGljYWxzdGFja2VkY29udGFpbmVyID0gZDMuc2VsZWN0KHRoaXMuZ3JvdXBjb250YWluZXJFbHQubmF0aXZlRWxlbWVudCk7XHJcbiAgY29uc3QgbWFyZ2luID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luO1xyXG4gIFxyXG4gIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYWxjdWxhdGVDaGFydERpbWVuc2lvbnMoXHJcbiAgICBjaGFydENvbnRhaW5lcixcclxuICAgIHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lcixcclxuICAgIG1hcmdpbixcclxuICAgIHNlbGZcclxuICApO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBWSVNJQklMSVRZIENPTkZJR1VSQVRJT04gPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlICE9PSB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuaXNIZWFkZXJWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNIZWFkZXJWaXNpYmxlO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmxlZ2VuZFZpc2libGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5sZWdlbmRWaXNpYmxlID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kVmlzaWJsZTtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1RyYW5zcGFyZW50QmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLmlzVHJhbnNwYXJlbnRCYWNrZ3JvdW5kID0gdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNUcmFuc3BhcmVudEJhY2tncm91bmQ7XHJcbiAgfVxyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBEQVRBIEZPUk1BVFRJTkcgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24udGV4dEZvcm1hdHRlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICBmb3JtYXRGcm9tQmFja2VuZCA9IENoYXJ0SGVscGVyLmRhdGFWYWx1ZUZvcm1hdHRlcih0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi50ZXh0Rm9ybWF0dGVyKTtcclxuICAgIGZvcm1hdEZvckh1Z2VOdW1iZXJzID0gQ2hhcnRIZWxwZXIuZGF0YVZhbHVlRm9ybWF0dGVyKCcuMnMnKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNWRyBDT05UQUlORVJTIENSRUFUSU9OID09PT09PT09PT09PT09PT09PT09XHJcbiAgY29uc3Qge1xyXG4gICAgb3V0ZXJDb250YWluZXIsXHJcbiAgICBzdmdZQXhpc0xlZnQsXHJcbiAgICBzdmdZQXhpc1JpZ2h0LFxyXG4gICAgaW5uZXJDb250YWluZXIsXHJcbiAgICBzdmdcclxuICB9ID0gdGhpcy5jcmVhdGVDaGFydENvbnRhaW5lcnMoY2hhcnRDb250YWluZXIsIG1hcmdpbiwgaGVpZ2h0LCBSSUdIVF9TVkdfV0lEVEgsIHNlbGYsIHdpZHRoKTtcclxuXHJcbiAgLy8gT25seSBlbmFibGUgaG9yaXpvbnRhbCBzY3JvbGxpbmcgb24gbW9iaWxlL3RhYmxldCB3aGVuIGluIHpvb21lZC1vdXRcclxuICAvLyBtb2RlIGFuZCB0aGVyZSBhcmUgbWFueSBncm91cHMgb3IgbXVsdGlwbGUgc3ViZ3JvdXBzLiBPdGhlcndpc2Uga2VlcFxyXG4gIC8vIHRoZSBpbm5lciBjb250YWluZXIgZml4ZWQgKG5vIHNjcm9sbGJhcikuXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGdyb3Vwc0NvdW50ID0gKGRhdGEgYXMgYW55KS5sZW5ndGggfHwgMDtcclxuICAgIGNvbnN0IHN1Ymdyb3Vwc0NvdW50ID0gKGtleUxpc3QgYXMgYW55ICYmIChrZXlMaXN0IGFzIGFueSkubGVuZ3RoKSB8fCAwO1xyXG4gICAgLy8gT24gbW9iaWxlL3RhYmxldDogYWx3YXlzIGVuYWJsZSBob3Jpem9udGFsIHNjcm9sbGluZyB3aGVuIHRoZXJlIGlzXHJcbiAgICAvLyBtb3JlIHRoYW4gb25lIHN1Ymdyb3VwIHNvIGdyb3VwZWQgYmFycyBkb24ndCBnZXQgY29uZ2VzdGVkLlxyXG4gICAgLy8gT24gZGVza3RvcDogZW5hYmxlIHNjcm9sbGluZyB3aGVuIHRoZXJlIGFyZSBtYW55IGdyb3VwcyBvclxyXG4gICAgLy8gbXVsdGlwbGUgc3ViZ3JvdXBzIChrZWVwcyBwcmV2aW91cyBiZWhhdmlvcikuXHJcbiAgICBpZiAoKGlzTW9iaWxlIHx8IGlzVGFibGV0KSAmJiBzdWJncm91cHNDb3VudCA+IDEpIHtcclxuICAgICAgaW5uZXJDb250YWluZXIuc3R5bGUoJ292ZXJmbG93LXgnLCAnYXV0bycpO1xyXG4gICAgICBpbm5lckNvbnRhaW5lci5jbGFzc2VkKCdzY3JvbGwtZW5hYmxlZCcsIHRydWUpO1xyXG4gICAgfSBlbHNlIGlmIChncm91cHNDb3VudCA+IDggfHwgc3ViZ3JvdXBzQ291bnQgPiAyKSB7XHJcbiAgICAgIGlubmVyQ29udGFpbmVyLnN0eWxlKCdvdmVyZmxvdy14JywgJ2F1dG8nKTtcclxuICAgICAgaW5uZXJDb250YWluZXIuY2xhc3NlZCgnc2Nyb2xsLWVuYWJsZWQnLCB0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlubmVyQ29udGFpbmVyLnN0eWxlKCdvdmVyZmxvdy14JywgJ2hpZGRlbicpO1xyXG4gICAgICBpbm5lckNvbnRhaW5lci5jbGFzc2VkKCdzY3JvbGwtZW5hYmxlZCcsIGZhbHNlKTtcclxuICAgIH1cclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICAvLyBpZ25vcmVcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNDQUxFUyBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHN1Ymdyb3VwczogYW55ID0ga2V5TGlzdDtcclxuICBjb25zdCBncm91cHMgPSBkMy5tYXAoZGF0YSwgKGQpID0+IGQubmFtZSkua2V5cygpO1xyXG5cclxuICAvLyBYLWF4aXMgc2NhbGUgY29uZmlndXJhdGlvblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB4ID0gZDMuc2NhbGVCYW5kKClcclxuICAgICAgLnJhbmdlUm91bmQoW3dpZHRoLCAwXSlcclxuICAgICAgLmFsaWduKDAuNSlcclxuICAgICAgLnBhZGRpbmcoWzAuNV0pXHJcbiAgICAgIC5kb21haW4oZGF0YS5tYXAoKGQ6IGFueSkgPT4gZC5uYW1lLnRvTG93ZXJDYXNlKCkpKTtcclxuICB9IGVsc2Uge1xyXG4gICAgeCA9IGQzLnNjYWxlQmFuZCgpXHJcbiAgICAgIC5kb21haW4oZ3JvdXBzKVxyXG4gICAgICAucmFuZ2UoW0xFRlRfQU5EX1JJR0hUX1NQQUNFUywgd2lkdGggLSBSSUdIVF9TVkdfV0lEVEggLSBMRUZUX0FORF9SSUdIVF9TUEFDRVNdKVxyXG4gICAgICAucGFkZGluZyhbMC4zXSk7XHJcbiAgfVxyXG5cclxuICBjb25zdCB4U2NhbGVGcm9tT3JpZ2luID0gZDMuc2NhbGVCYW5kKClcclxuICAgIC5kb21haW4oZ3JvdXBzKVxyXG4gICAgLnJhbmdlKFswLCB3aWR0aCAtIFJJR0hUX1NWR19XSURUSF0pO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBYLUFYSVMgUkVOREVSSU5HID09PT09PT09PT09PT09PT09PT09XHJcbiAgdGhpcy5yZW5kZXJYQXhpcyhzdmcsIHgsIGhlaWdodCwgbWV0YURhdGEsIHN1Ymdyb3VwcywgZGF0YSwgXHJcbiAgICBTSE9SVF9USUNLX0xFTkdUSF9CRywgTE9OR19USUNLX0xFTkdUSF9CRywgc2VsZiwgaXNyaWEsIGlzTW9iaWxlLCBpc1RhYmxldCk7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFktQVhJUyBTRVRVUCA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHkgPSBkMy5zY2FsZUxpbmVhcigpLnJhbmdlUm91bmQoW2hlaWdodCwgMF0pO1xyXG4gIGxldCBtYXhWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlTWF4VmFsdWUoZGF0YSwga2V5TGlzdCk7XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGUpIHtcclxuICAgIG1heFZhbHVlID0gbWF4VmFsdWUgKiB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcbiAgfVxyXG5cclxuICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEgJiYgbWF4VmFsdWUgPCB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQpIHtcclxuICAgIG1heFZhbHVlID0gbWF4VmFsdWUgPCAxMCAmJiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgPCAxMFxyXG4gICAgICA/IHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCArIDNcclxuICAgICAgOiB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuICB9XHJcblxyXG4gIHkuZG9tYWluKFswLCBtYXhWYWx1ZV0pLm5pY2UoKTtcclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTElORSBDSEFSVCBZLVNDQUxFID09PT09PT09PT09PT09PT09PT09XHJcbiAgbGV0IGxpbmVZc2NhbGU7XHJcbiAgbGV0IHlMaW5lQXhpcztcclxuXHJcbiAgaWYgKGxpbmVEYXRhICE9IG51bGwpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2V0dXBMaW5lWVNjYWxlKGxpbmVEYXRhLCBoZWlnaHQsIHNlbGYpO1xyXG4gICAgbGluZVlzY2FsZSA9IHJlc3VsdC5saW5lWXNjYWxlO1xyXG4gICAgeUxpbmVBeGlzID0gcmVzdWx0LnlMaW5lQXhpcztcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEdSSUQgTElORVMgPT09PT09PT09PT09PT09PT09PT1cclxuICB0aGlzLnJlbmRlckdyaWRMaW5lcyhzdmcsIHgsIHksIGhlaWdodCwgd2lkdGgsIHNlbGYpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBCQVJTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGNvbnN0IHhTdWJncm91cCA9IHRoaXMuc2V0dXBYU3ViZ3JvdXBTY2FsZShzdWJncm91cHMsIHgsIHNlbGYpO1xyXG4gIGNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKClcclxuICAgIC5kb21haW4oc3ViZ3JvdXBzKVxyXG4gICAgLnJhbmdlKE9iamVjdC52YWx1ZXMobWV0YURhdGEuY29sb3JzKSk7XHJcblxyXG4gIHRoaXMucmVuZGVyQmFycyhzdmcsIGRhdGEsIHN1Ymdyb3VwcywgeCwgeFN1Ymdyb3VwLCB5LCBoZWlnaHQsIGNvbG9yLCBcclxuICAgIG1ldGFEYXRhLCBzZWxmLCBMRUZUX0FORF9SSUdIVF9TUEFDRVMsIHRlbXBTY2FsZSwgaXNyaWEpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBCQVIgTEFCRUxTID09PT09PT09PT09PT09PT09PT09XHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgdGhpcy5yZW5kZXJCYXJMYWJlbHMoc3ZnLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgeSwgaGVpZ2h0LCBcclxuICAgICAgbWV0YURhdGEsIHNlbGYsIHRlbXBTY2FsZSwgaXNyaWEpO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gWS1BWElTIFJFTkRFUklORyA9PT09PT09PT09PT09PT09PT09PVxyXG4gIHRoaXMucmVuZGVyWUF4aXMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIHksIHlMaW5lQXhpcywgXHJcbiAgICBsaW5lRGF0YSwgc2VsZiwgaXNyaWEsIG1hcmdpbik7XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IEFYSVMgTEFCRUxTID09PT09PT09PT09PT09PT09PT09XHJcbiAgdGhpcy5yZW5kZXJBeGlzTGFiZWxzKHN2Zywgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0LCBtZXRhRGF0YSwgXHJcbiAgICB3aWR0aCwgaGVpZ2h0LCBtYXJnaW4sIHNlbGYsIGlzcmlhLCBSSUdIVF9TVkdfV0lEVEgpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBUQVJHRVQgTElORSA9PT09PT09PT09PT09PT09PT09PVxyXG4gIGlmICh0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YSkge1xyXG4gICAgdGhpcy5yZW5kZXJUYXJnZXRMaW5lKHN2Zywgc3ZnWUF4aXNSaWdodCwgeSwgd2lkdGgsIFJJR0hUX1NWR19XSURUSCwgXHJcbiAgICAgIG1ldGFEYXRhLCBzZWxmKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IExJTkUgQ0hBUlQgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAobGluZURhdGEpIHtcclxuICAgIHRoaXMucmVuZGVyTGluZUNoYXJ0KHN2ZywgbGluZURhdGEsIHgsIGxpbmVZc2NhbGUsIG1ldGFEYXRhLCBzZWxmKTtcclxuICB9XHJcblxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFpPT00gSEFORExJTkcgPT09PT09PT09PT09PT09PT09PT1cclxuICBpZiAodGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgdGhpcy5oYW5kbGVab29tT3V0KHN2ZywgaGVpZ2h0LCBtYXJnaW4pO1xyXG4gIH1cclxufVxyXG5cclxuLy8gPT09PT09PT09PT09PT09PT09PT0gSEVMUEVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbnByaXZhdGUgcmVuZGVyWEF4aXMoc3ZnLCB4LCBoZWlnaHQsIG1ldGFEYXRhLCBzdWJncm91cHMsIGRhdGEsIFxyXG4gIHNob3J0VGlja0xlbmd0aEJnLCBsb25nVGlja0xlbmd0aEJnLCBzZWxmLCBpc3JpYSwgaXNNb2JpbGUsIGlzVGFibGV0KSB7XHJcbiAgXHJcbiAgbGV0IGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcblxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc011bHRpQ2hhcnRHcmlkTGluZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAvLyBOb3JtYWwgdGlja3MgZm9yIGRhc2hib2FyZCBjaGFydHNcclxuICAgIC8vIER5bmFtaWNhbGx5IGFkanVzdCBZIHRyYW5zbGF0aW9uIGZvciBtb2JpbGVcclxuICAgIGxldCB0cmFuc2xhdGVZID0gaGVpZ2h0O1xyXG4gICAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICAgIHRyYW5zbGF0ZVkgPSBoZWlnaHQgKyAyNDsgLy8gQWRkIGV4dHJhIHNwYWNlIGF0IHRoZSB0b3AgZm9yIG1vYmlsZVxyXG4gICAgfVxyXG4gICAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICd4MSBheGlzMScpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHt0cmFuc2xhdGVZfSlgKVxyXG4gICAgICAuY2FsbChkMy5heGlzQm90dG9tKHgpKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcblxyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLnJlbW92ZSgpO1xyXG5cclxuICAgIGNvbnN0IHlPZmZzZXQgPSBzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhbWV0YURhdGEueExhYmVsID8gMzIgOiAwO1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93bicpXHJcbiAgICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5hdHRyKCd5JywgeU9mZnNldCB8fCBudWxsKTtcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gQmlnZ2VyIHRpY2tzIGZvciB3ZWVrbHkgY2hhcnRzXHJcbiAgICBzdmcuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ3gxIGF4aXMxJylcclxuICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke2hlaWdodH0pYClcclxuICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgwKSlcclxuICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJykuYXR0cignZmlsbCcsICdub25lJykpO1xyXG5cclxuICAgIC8vIEFsdGVybmF0ZSB0aWNrIGxpbmUgc2l6ZXNcclxuICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIGxpbmUnKS5hdHRyKCd5MicsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKGFsdGVybmF0ZV90ZXh0ICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzTm9BbHRlcm5hdGVYYXhpc1RleHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIGxvbmdUaWNrTGVuZ3RoQmcgLSA3O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gc2hvcnRUaWNrTGVuZ3RoQmcgLSA0O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIFgtYXhpcyBsYWJlbCB0ZXh0c1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteGF4aXMtbGFiZWxzLXRleHRzLXdlZWtseWNoYXJ0cycpXHJcbiAgICAgIC5hdHRyKCd5JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgICAgIHJldHVybiBzaG9ydFRpY2tMZW5ndGhCZztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFsdGVybmF0ZV90ZXh0KSB7XHJcbiAgICAgICAgICBhbHRlcm5hdGVfdGV4dCA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIGxvbmdUaWNrTGVuZ3RoQmc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGFsdGVybmF0ZV90ZXh0ID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiBzaG9ydFRpY2tMZW5ndGhCZztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQXBwbHkgbGFiZWxzIG9uIHNhbWUgbGluZSBjb25maWd1cmF0aW9uXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnhMYWJlbHNPblNhbWVMaW5lKSB7XHJcbiAgICB0aGlzLmFwcGx5WExhYmVsc09uU2FtZUxpbmUoc3ZnLCBzdWJncm91cHMsIGRhdGEsIG1ldGFEYXRhLCBzZWxmLCBcclxuICAgICAgc2hvcnRUaWNrTGVuZ3RoQmcsIGlzTW9iaWxlLCBpc3JpYSk7XHJcbiAgfVxyXG5cclxuICAvLyBNb2JpbGUgb3ZlcnJpZGUgZm9yIFJJQVxyXG4gIGlmIChpc3JpYSAmJiBzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDgpIHtcclxuICAgIHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgICAuY2xhc3NlZCgnbW9iaWxlLXhheGlzLW92ZXJyaWRlJywgdHJ1ZSlcclxuICAgICAgLnRleHQoKGQ6IHN0cmluZykgPT4gZC5zdWJzdHJpbmcoMCwgMykpXHJcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJzEycHgnKVxyXG4gICAgICAuYXR0cigneScsIDUpXHJcbiAgICAgIC5hdHRyKCd4JywgNSlcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcclxuICB9XHJcblxyXG5cclxuICBcclxuICAvLyBNb2JpbGUvdGFibGV0IG92ZXJyaWRlIC0gY2hlY2sgZm9yIHNpbmdsZS1ncm91cCBkYXRlIGNoYXJ0cyBmaXJzdFxyXG4gIGlmIChpc01vYmlsZSkge1xyXG4gICAgY29uc3QgdGV4dE5vZGVzID0gc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgdGV4dCcpO1xyXG4gICAgY29uc3QgZ3JvdXBzQ291bnQgPSAoZGF0YSBhcyBhbnkpLmxlbmd0aCB8fCAwO1xyXG4gICAgXHJcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGRhdGVzIGluIHgtYXhpcyBhbmQgc2luZ2xlIGdyb3VwXHJcbiAgICBsZXQgaGFzRGF0ZVZhbHVlcyA9IGZhbHNlO1xyXG4gICAgdGV4dE5vZGVzLmVhY2goZnVuY3Rpb24oZCkge1xyXG4gICAgICAvLyBDaGVjayBmb3IgZGF0ZSB2YWx1ZXMgdXNpbmcgYm90aCBEYXRlLnBhcnNlIGFuZCByZWdleCBmb3IgZGF0ZSBmb3JtYXRcclxuICAgICAgICBjb25zdCBpc0RhdGVTdHJpbmcgPVxyXG4gICAgL15cXGR7MSw0fVstXFwvXVxcZHsxLDJ9Wy1cXC9dXFxkezEsNH0kLy50ZXN0KGQudHJpbSgpKSB8fFxyXG4gICAgL14oXFxkezEsNH1bLVxcL11cXGR7MSwyfVstXFwvXVxcZHsxLDR9KVxccypbLeKAk11cXHMqKFxcZHsxLDR9Wy1cXC9dXFxkezEsMn1bLVxcL11cXGR7MSw0fSkkLy50ZXN0KGQudHJpbSgpKTtcclxuICAgICAgaWYgKCFoYXNEYXRlVmFsdWVzICYmIGlzRGF0ZVN0cmluZykge1xyXG4gICAgICAgIGhhc0RhdGVWYWx1ZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoaGFzRGF0ZVZhbHVlcyAmJiBzdWJncm91cHMgJiYgc3ViZ3JvdXBzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgLy8gRm9yIHNpbmdsZSBjaGFydCB3aXRoIGRhdGVzLCBlbnN1cmUgaG9yaXpvbnRhbCBkaXNwbGF5XHJcbiAgICAgIHRleHROb2Rlc1xyXG4gICAgICAgIC5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ2hvcml6b250YWwtdGInKSAgLy8gRXhwbGljaXRseSBzZXQgaG9yaXpvbnRhbFxyXG4gICAgICAgIC5jbGFzc2VkKCdtb2JpbGUteGF4aXMtb3ZlcnJpZGUnLCBmYWxzZSkgLy8gUmVtb3ZlIHZlcnRpY2FsIGNsYXNzXHJcbiAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICdyb3RhdGUoMCknKSAgICAgICAgICAvLyBSZW1vdmUgYW55IHJvdGF0aW9uXHJcbiAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpICAgICAgICAgICAvLyBDZW50ZXIgYWxpZ25cclxuICAgICAgICAuYXR0cigneScsIDIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHVzaCBkb3duIGEgYml0XHJcbiAgICAgICAgLmF0dHIoJ2R4JywgJzAnKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IGFueSB4IG9mZnNldFxyXG4gICAgICAgIC5hdHRyKCdkeScsICcwJyk7ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBhbnkgeSBvZmZzZXRcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgIC8vIERlZmF1bHQgbW9iaWxlIGJlaGF2aW9yIGZvciBub24tZGF0ZSBvciBtdWx0aS1ncm91cFxyXG4gICAgICB0ZXh0Tm9kZXMuY2xhc3NlZCgnbW9iaWxlLXhheGlzLW92ZXJyaWRlJywgdHJ1ZSk7XHJcbiAgICB9ICBcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgYXBwbHlYTGFiZWxzT25TYW1lTGluZShzdmcsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIFxyXG4gIHNob3J0VGlja0xlbmd0aEJnLCBpc01vYmlsZSwgaXNyaWEpIHtcclxuICBcclxuICBjb25zdCB4QXhpc0xhYmVscyA9IHN2Zy5zZWxlY3RBbGwoJ2cueDEuYXhpczEgZy50aWNrIHRleHQnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgIC5zdHlsZSgnZm9udC1zaXplJywgdGhpcy5pc0hlYWRlclZpc2libGUgPyAnMThweCcgOiAnMTRweCcpXHJcbiAgICAuYXR0cigndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgIC5hdHRyKCd5JywgKGQpID0+IHRoaXMuY2FsY3VsYXRlWExhYmVsWVBvc2l0aW9uKGQsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIHNob3J0VGlja0xlbmd0aEJnKSlcclxuICAgIC5hdHRyKCd4JywgKGQpID0+IChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpID8gMSA6IDApXHJcbiAgICAudGV4dCgoZCkgPT4gdGhpcy5mb3JtYXRYTGFiZWxUZXh0KGQsIGRhdGEsIG1ldGFEYXRhLCBzdWJncm91cHMsIHNlbGYsIGlzTW9iaWxlKSk7XHJcblxyXG4gIC8vIEFwcGx5IHdyaXRpbmctbW9kZSBmb3IgZ3JvdXBlZCBjaGFydHMgd2l0aCBkYXRlIGxhYmVscyBpbiB6b29tZWQtb3V0IHZpZXdcclxuICB4QXhpc0xhYmVscy5lYWNoKGZ1bmN0aW9uKHRoaXM6IFNWR1RleHRFbGVtZW50LCBkOiBhbnkpIHtcclxuICAgIGNvbnN0IGlzRGF0ZUxhYmVsID0gL14oXFxkezIsNH1bLVxcL10pP1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0kLy50ZXN0KGQudHJpbSgpKTtcclxuICAgIGNvbnN0IGlzV2Vla0xhYmVsID0gL3dlZWt8d2t8d1xcZCsvaS50ZXN0KGQpO1xyXG4gICAgXHJcbiAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgc2VsZi5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDggJiYgaXNEYXRlTGFiZWwgJiYgIWlzV2Vla0xhYmVsKSB7XHJcbiAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgnd3JpdGluZy1tb2RlJywgJ3NpZGV3YXlzLWxyJyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIC8vIEFkZCBzZWNvbmQgbGluZSBmb3Igbm9uLWRhdGUgbGFiZWxzIG9uIGRlc2t0b3BcclxuICBpZiAoIWlzTW9iaWxlKSB7XHJcbiAgICBzdmcuc2VsZWN0QWxsKCdnLngxLmF4aXMxIGcudGljaycpXHJcbiAgICAgIC5maWx0ZXIoKGQpID0+ICEvXFxkezIsNH1bLVxcL10vLnRlc3QoZCkpXHJcbiAgICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLXhheGlzLWxhYmVscy10ZXh0cy1kcmlsbGRvd24nKVxyXG4gICAgICAuYXR0cigneScsIDMwKVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5hdHRyKCd4JywgKGQpID0+IChzZWxmLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aCA+IDggJiYgIXNlbGYuaXNab29tZWRPdXQpID8gMSA6IDApXHJcbiAgICAgIC50ZXh0KChkKSA9PiB7XHJcbiAgICAgICAgaWYgKGQudHJpbSgpLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm4gZC50cmltKCkuc3Vic3RyaW5nKGQuaW5kZXhPZignICcpLCBkLmxlbmd0aCkudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlWExhYmVsWVBvc2l0aW9uKGQsIHN1Ymdyb3VwcywgZGF0YSwgbWV0YURhdGEsIHNlbGYsIHNob3J0VGlja0xlbmd0aEJnKSB7XHJcbiAgLy8gRm9yIGdyb3VwZWQgYmFyIGNoYXJ0cyB3aXRoIG1hbnkgYmFycyBhbmQgeExhYmVsIHByZXNlbnRcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmIG1ldGFEYXRhLnhMYWJlbCkge1xyXG4gICAgY29uc3QgaXNEYXRlTGFiZWwgPSAvXFxkezIsNH1bLVxcL10vLnRlc3QoZCk7XHJcbiAgICByZXR1cm4gaXNEYXRlTGFiZWwgPyBzaG9ydFRpY2tMZW5ndGhCZyArIDE0IDogc2hvcnRUaWNrTGVuZ3RoQmc7XHJcbiAgfVxyXG5cclxuICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIHdpdGggbWFueSBiYXJzIGFuZCBOTyB4TGFiZWxcclxuICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDEgJiYgZGF0YS5sZW5ndGggPiA4ICYmICFtZXRhRGF0YS54TGFiZWwpIHtcclxuICAgIGNvbnN0IGNoYXJ0SGFzRXh0cmFCb3R0b20gPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5tYXJnaW4gJiYgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubWFyZ2luLmJvdHRvbSA+PSA0MDtcclxuICAgIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4pIHtcclxuICAgICAgcmV0dXJuIHNob3J0VGlja0xlbmd0aEJnICsgMjtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFydEhhc0V4dHJhQm90dG9tID8gc2hvcnRUaWNrTGVuZ3RoQmcgOiBzaG9ydFRpY2tMZW5ndGhCZyArIDEwO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVmYXVsdC9mYWxsYmFjayBsb2dpY1xyXG4gIGxldCBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRUaWNrTGVuZ3RoQmcgKyAyNSA6IHNob3J0VGlja0xlbmd0aEJnO1xyXG4gIFxyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhbWV0YURhdGEueExhYmVsICYmIFxyXG4gICAgICAoL1xcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgfHwgL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkpKSB7XHJcbiAgICBiYXNlWSA9IHNlbGYuaXNIZWFkZXJWaXNpYmxlID8gc2hvcnRUaWNrTGVuZ3RoQmcgKyAxNSA6IHNob3J0VGlja0xlbmd0aEJnICsgMjU7XHJcbiAgfVxyXG5cclxuICBpZiAoL1xcZHsyLDR9Wy1cXC9dXFxkezIsNH0vLnRlc3QoZCkgJiYgZC5pbmRleE9mKCcgJykgPiAtMSkge1xyXG4gICAgYmFzZVkgKz0gNDtcclxuICB9XHJcblxyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gJiYgc3ViZ3JvdXBzLmxlbmd0aCA+IDEpIHtcclxuICAgIGJhc2VZID0gTWF0aC5tYXgoc2hvcnRUaWNrTGVuZ3RoQmcsIGJhc2VZIC0gMTApO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGJhc2VZO1xyXG59XHJcblxyXG5wcml2YXRlIGZvcm1hdFhMYWJlbFRleHQoZCwgZGF0YSwgbWV0YURhdGEsIHN1Ymdyb3Vwcywgc2VsZiwgaXNNb2JpbGUpIHtcclxuICAvLyBDaGVjayBpZiB3ZSdyZSBvbiBtb2JpbGUgb3IgdGFibGV0XHJcbiAgY29uc3QgaXNTbWFsbFNjcmVlbiA9IHdpbmRvdy5pbm5lcldpZHRoIDwgOTkyOyAvLyBMZXNzIHRoYW4gOTkycHggKG1vYmlsZSBvciB0YWJsZXQpXHJcbiAgXHJcbiAgLy8gQ2hlY2sgaWYgbGFiZWwgY29udGFpbnMgYm90aCBkYXRlIGFuZCB3ZWVrIGluZm9ybWF0aW9uXHJcbiAgY29uc3QgaGFzRGF0ZUFuZFRpbWUgPSAodGV4dDogc3RyaW5nKSA9PiB7XHJcbiAgICBjb25zdCBkYXRlTWF0Y2ggPSAvXFxkezIsNH1bLVxcL11cXGR7MSwyfVstXFwvXVxcZHsxLDR9Ly50ZXN0KHRleHQpIHx8ICFpc05hTihEYXRlLnBhcnNlKHRleHQpKTtcclxuICAgIGNvbnN0IHdlZWtNYXRjaCA9IC93ZWVrfHdrfHdcXGQrL2kudGVzdCh0ZXh0KTtcclxuICAgIHJldHVybiB7IGlzRGF0ZTogZGF0ZU1hdGNoLCBpc1dlZWs6IHdlZWtNYXRjaCB9O1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGxhYmVsSW5mbyA9IGhhc0RhdGVBbmRUaW1lKGQpO1xyXG5cclxuICAvLyBXaGVuIGxhYmVsIGNvbnRhaW5zIGJvdGggZGF0ZSBhbmQgd2Vlaywgc2hvdyBpdCBhcy1pcyAobm8gdHJpbW1pbmcpXHJcbiAgaWYgKGlzU21hbGxTY3JlZW4gJiYgbGFiZWxJbmZvLmlzRGF0ZSAmJiBsYWJlbEluZm8uaXNXZWVrKSB7XHJcbiAgICByZXR1cm4gZDtcclxuICB9XHJcblxyXG4gIC8vIE1vYmlsZSBoYW5kbGluZzoga2VlcCBkYXRlIGxhYmVscyBpbnRhY3QgZm9yIHNpbmdsZS1zZXJpZXMgY2hhcnRzIChkbyBub3QgdHJpbSlcclxuICBpZiAoaXNNb2JpbGUpIHtcclxuICAgIC8vIElmIGhlYWRlciBpcyBoaWRkZW4gKGNvbXBhY3QgbW9iaWxlKSwgdHJpbSBub24tZGF0ZSBsYWJlbHMgYXMgYmVmb3JlXHJcbiAgICBpZiAoIXNlbGYuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICAgIC8vIGNvbnN0IGZpcnN0UGFydCA9IGQuc3BsaXQoL1tcXHNcXC1dKy8pWzBdO1xyXG4gICAgICAvLyByZXR1cm4gZmlyc3RQYXJ0LnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICByZXR1cm4gZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENoZWNrIGlmIHZhbHVlIHNob3VsZCBiZSBpZ25vcmVkXHJcbiAgY29uc3QgaXNWYWx1ZVRvQmVJZ25vcmVkID0gZGF0YS5zb21lKChpbmRpdjogYW55KSA9PiBcclxuICAgIGluZGl2Lm5hbWUgJiYgaW5kaXYubmFtZS50b0xvd2VyQ2FzZSgpID09PSBkLnRyaW0oKS50b0xvd2VyQ2FzZSgpICYmIFxyXG4gICAgaW5kaXZbbWV0YURhdGEua2V5TGlzdFswXV0gPT09IC0xXHJcbiAgKTtcclxuXHJcbiAgaWYgKGlzVmFsdWVUb0JlSWdub3JlZCkge1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIGRhdGUgcmFuZ2UgbGFiZWxzXHJcbiAgY29uc3QgZGF0ZVJhbmdlUmVnZXggPSAvKFxcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0pXFxzKi1cXHMqKFxcZHsyLDR9Wy1cXC9dXFxkezJ9Wy1cXC9dXFxkezIsNH0pLztcclxuICBpZiAoZGF0ZVJhbmdlUmVnZXgudGVzdChkLnRyaW0oKSkpIHtcclxuICAgIHJldHVybiBkLnRyaW0oKS5yZXBsYWNlKGRhdGVSYW5nZVJlZ2V4LCAobSwgZDEsIGQyKSA9PiBgJHtkMX0gLSAke2QyfWApO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIHNwbGl0dGluZyBvZiBtdWx0aS1wYXJ0IGxhYmVsc1xyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhc2VsZi5pc1pvb21lZE91dCAmJiBkYXRhLmxlbmd0aCA+IDggJiYgXHJcbiAgICAgIGQuaW5kZXhPZignICcpID4gLTEgJiYgKGxhYmVsSW5mby5pc0RhdGUgfHwgbGFiZWxJbmZvLmlzV2VlaykpIHtcclxuICAgIGNvbnN0IGZpcnN0ID0gZC5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpO1xyXG4gICAgY29uc3Qgc2Vjb25kID0gZC5zdWJzdHJpbmcoZC5pbmRleE9mKCcgJykgKyAxKS50cmltKCk7XHJcbiAgICByZXR1cm4gYCR7Zmlyc3R9XFxuJHtzZWNvbmR9YDtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBkYXRlIGxhYmVscyBpbiBtaW5pbWl6ZWQgdmlld1xyXG4gIGlmIChsYWJlbEluZm8uaXNEYXRlKSB7XHJcbiAgICBpZiAoIXNlbGYuaXNIZWFkZXJWaXNpYmxlICYmIGRhdGEubGVuZ3RoID4gOCAmJiBkLmluZGV4T2YoJyAnKSA+IC0xKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0ID0gZC5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpO1xyXG4gICAgICBjb25zdCBzZWNvbmQgPSBkLnN1YnN0cmluZyhkLmluZGV4T2YoJyAnKSArIDEpLnRyaW0oKTtcclxuICAgICAgcmV0dXJuIGAke2ZpcnN0fVxcbiR7c2Vjb25kfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZDtcclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSBsYWJlbHMgd2l0aCBzcGFjZXNcclxuICBpZiAoZC50cmltKCkuaW5kZXhPZignICcpID4gLTEpIHtcclxuICAgIHJldHVybiBkLnRyaW0oKS5zdWJzdHJpbmcoMCwgZC5pbmRleE9mKCcgJykpLnRvTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZC50b0xvd2VyQ2FzZSgpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZU1heFZhbHVlKGRhdGEsIGtleUxpc3QpIHtcclxuICBsZXQgbWF4VmFsdWUgPSBkMy5tYXgoZGF0YSwgKGQpID0+IGQzLm1heChrZXlMaXN0LCAoa2V5KSA9PiArZFtrZXldKSk7XHJcbiAgXHJcbiAgaWYgKG1heFZhbHVlID09PSAwKSB7XHJcbiAgICBpZiAodGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEpIHtcclxuICAgICAgbWF4VmFsdWUgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXQgKyAyMDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1heFZhbHVlID0gMTAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG1heFZhbHVlO1xyXG59XHJcblxyXG5wcml2YXRlIHNldHVwTGluZVlTY2FsZShsaW5lRGF0YSwgaGVpZ2h0LCBzZWxmKSB7XHJcbiAgbGV0IG1heExpbmVWYWx1ZSA9IGQzLm1heChsaW5lRGF0YSwgKGQpID0+ICtkLnZhbHVlKTtcclxuICBtYXhMaW5lVmFsdWUgPSBtYXhMaW5lVmFsdWUgKiBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5jdXN0b21Zc2NhbGU7XHJcblxyXG4gIGxldCBtaW5MaW5lVmFsdWUgPSBkMy5taW4obGluZURhdGEsIChkKSA9PiArZC52YWx1ZSk7XHJcbiAgaWYgKG1heExpbmVWYWx1ZSA+IDApIG1pbkxpbmVWYWx1ZSA9IG1pbkxpbmVWYWx1ZSAtIDM7XHJcbiAgaWYgKG1pbkxpbmVWYWx1ZSA+IDApIG1pbkxpbmVWYWx1ZSA9IDA7XHJcblxyXG4gIGNvbnN0IGxpbmVZc2NhbGUgPSBkMy5zY2FsZUxpbmVhcigpXHJcbiAgICAuZG9tYWluKFttaW5MaW5lVmFsdWUsIG1heExpbmVWYWx1ZV0pXHJcbiAgICAucmFuZ2UoW2hlaWdodCwgbWluTGluZVZhbHVlXSk7XHJcblxyXG4gIGNvbnN0IHlMaW5lQXhpcyA9IGQzLmF4aXNSaWdodChsaW5lWXNjYWxlKVxyXG4gICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgLnRpY2tTaXplKDApXHJcbiAgICAudGlja0Zvcm1hdChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55TGluZUF4aXNMYWJlbEZvbWF0dGVyKTtcclxuXHJcbiAgcmV0dXJuIHsgbGluZVlzY2FsZSwgeUxpbmVBeGlzIH07XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyR3JpZExpbmVzKHN2ZywgeCwgeSwgaGVpZ2h0LCB3aWR0aCwgc2VsZikge1xyXG4gIC8vIFgtYXhpcyBncmlkIGJldHdlZW4gbGFiZWxzXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWGdyaWRCZXR3ZWVuTGFiZWxzKSB7XHJcbiAgICBzdmcuYXBwZW5kKCdnJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2dyaWQnKVxyXG4gICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3guYmFuZHdpZHRoKCkgLyAyfSwke2hlaWdodH0pYClcclxuICAgICAgLmNhbGwoZDMuYXhpc0JvdHRvbSh4KS50aWNrU2l6ZSgtaGVpZ2h0KS50aWNrRm9ybWF0KCcnKSlcclxuICAgICAgLnN0eWxlKCdzdHJva2UtZGFzaGFycmF5JywgJzUgNScpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtZ3JpZC1jb2xvciwgIzk5OTk5OSknKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKSk7XHJcbiAgfVxyXG5cclxuICAvLyBZLWF4aXMgZ3JpZFxyXG4gIGlmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0dyaWQpIHtcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuY2FsbChkMy5heGlzTGVmdCh5KS50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcykudGlja1NpemUoLXdpZHRoKSlcclxuICAgICAgLnN0eWxlKCdjb2xvcicsICd2YXIoLS1jaGFydC1heGlzLWNvbG9yLCAjQjlCOUI5KScpXHJcbiAgICAgIC5zdHlsZSgnb3BhY2l0eScsICcwLjUnKVxyXG4gICAgICAuY2FsbCgoZykgPT4gZy5zZWxlY3QoJy5kb21haW4nKS5yZW1vdmUoKS5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgICAuY2FsbChkMy5heGlzTGVmdCh5KS50aWNrcyhzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5udW1iZXJPZllUaWNrcykpXHJcbiAgICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtYXhpcy1jb2xvciwgI0I5QjlCOSknKVxyXG4gICAgICAuc3R5bGUoJ29wYWNpdHknLCAnMC41JylcclxuICAgICAgLmNhbGwoKGcpID0+IGcuc2VsZWN0KCcuZG9tYWluJylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZScsICd2YXIoLS1jaGFydC1kb21haW4tY29sb3IsICMwMDAwMDApJylcclxuICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsICcxcHgnKSk7XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIHNldHVwWFN1Ymdyb3VwU2NhbGUoc3ViZ3JvdXBzLCB4LCBzZWxmKSB7XHJcbiAgY29uc3QgeFN1Ymdyb3VwID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKHN1Ymdyb3Vwcyk7XHJcblxyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhdGhpcy5pc1pvb21lZE91dCkge1xyXG4gICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgfSBlbHNlIGlmIChzdWJncm91cHMubGVuZ3RoID09PSAxICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICB4U3ViZ3JvdXAucmFuZ2UoWzAsIDEwMF0pO1xyXG4gIH0gZWxzZSBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgeFN1Ymdyb3VwLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHhTdWJncm91cC5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHhTdWJncm91cDtcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJCYXJzKHN2ZywgZGF0YSwgc3ViZ3JvdXBzLCB4LCB4U3ViZ3JvdXAsIHksIGhlaWdodCwgY29sb3IsIFxyXG4gIG1ldGFEYXRhLCBzZWxmLCBsZWZ0QW5kUmlnaHRTcGFjZXMsIHRlbXBTY2FsZSwgaXNyaWEpIHtcclxuICBcclxuICBjb25zdCBzdGF0ZSA9IHN2Zy5hcHBlbmQoJ2cnKVxyXG4gICAgLnNlbGVjdEFsbCgnLnN0YXRlJylcclxuICAgIC5kYXRhKGRhdGEpXHJcbiAgICAuZW50ZXIoKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgKGQpID0+IGB0cmFuc2xhdGUoJHt4KGQubmFtZSl9LDApYCk7XHJcblxyXG4gIGNvbnN0IGJhcnMgPSBzdGF0ZS5zZWxlY3RBbGwoJ3JlY3QnKVxyXG4gICAgLmRhdGEoKGQpID0+IHRoaXMucHJlcGFyZUJhckRhdGEoZCwgc3ViZ3JvdXBzKSlcclxuICAgIC5lbnRlcigpXHJcbiAgICAuYXBwZW5kKCdyZWN0JylcclxuICAgIC5hdHRyKCdjbGFzcycsICdiYXJzJylcclxuICAgIC5vbignY2xpY2snLCAoZCkgPT4gdGhpcy5oYW5kbGVCYXJDbGljayhkLCBtZXRhRGF0YSwgc2VsZikpXHJcbiAgICAuYXR0cigneCcsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUJhclgoZCwgZGF0YSwgeCwgeFN1Ymdyb3VwLCBzZWxmLCB0ZW1wU2NhbGUpKVxyXG4gICAgLmF0dHIoJ3knLCAoZCkgPT4gdGhpcy5jYWxjdWxhdGVCYXJZKGQsIHksIGhlaWdodCwgc2VsZikpXHJcbiAgICAuYXR0cignd2lkdGgnLCAoZCkgPT4gdGhpcy5jYWxjdWxhdGVCYXJXaWR0aChkLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgc2VsZiwgdGVtcFNjYWxlKSlcclxuICAgIC5hdHRyKCdoZWlnaHQnLCAoZCkgPT4gdGhpcy5jYWxjdWxhdGVCYXJIZWlnaHQoZCwgeSwgaGVpZ2h0LCBzZWxmKSlcclxuICAgIC5zdHlsZSgnY3Vyc29yJywgKCkgPT4gKG1ldGFEYXRhLmhhc0RyaWxsRG93biAmJiAhaXNyaWEpID8gJ3BvaW50ZXInIDogJ2RlZmF1bHQnKVxyXG4gICAgLmF0dHIoJ2ZpbGwnLCAoZCkgPT4gdGhpcy5nZXRCYXJDb2xvcihkLCBtZXRhRGF0YSwgc2VsZikpO1xyXG5cclxuICAvLyBBdHRhY2ggbW91c2UgZXZlbnRzIGlmIG5vdCBSSUFcclxuICBpZiAoIWlzcmlhICYmICh0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5kaXNwbGF5VGl0bGVPblRvcCB8fCBcclxuICAgICAgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLnRleHRzT25CYXIgPT09IHVuZGVmaW5lZCAmJiBcclxuICAgICAgIHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmRpc3BsYXlUaXRsZU9uVG9wID09PSB1bmRlZmluZWQpKSkge1xyXG4gICAgYmFycy5vbignbW91c2VvdXQnLCAoZCwgaSkgPT4gdGhpcy5oYW5kbGVNb3VzZU91dChzdmcpKVxyXG4gICAgICAgIC5vbignbW91c2VvdmVyJywgKGQsIGkpID0+IHRoaXMuaGFuZGxlTW91c2VPdmVyKGQsIHN2ZywgZGF0YSwgeCwgeSwgaGVpZ2h0LCBtZXRhRGF0YSwgc2VsZiwgbGVmdEFuZFJpZ2h0U3BhY2VzLCB0ZW1wU2NhbGUpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgcHJlcGFyZUJhckRhdGEoZCwgc3ViZ3JvdXBzKSB7XHJcbiAgY29uc3QgbmV3TGlzdDogYW55ID0gW107XHJcbiAgc3ViZ3JvdXBzLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgbmV3TGlzdC5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiBkW2tleV0sIG5hbWU6IGQubmFtZSB9KTtcclxuICB9KTtcclxuICByZXR1cm4gbmV3TGlzdDtcclxufVxyXG5cclxucHJpdmF0ZSBoYW5kbGVCYXJDbGljayhkLCBtZXRhRGF0YSwgc2VsZikge1xyXG4gIGlmIChkLmtleSAhPT0gJ1RhcmdldCcpIHtcclxuICAgIGlmICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrIHx8ICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbiAgICAgICAgKCFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ubmFtZSkgJiYgXHJcbiAgICAgICAgICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2suaW5jbHVkZXMoZD8ua2V5KSkpIHtcclxuICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlQmFyWChkLCBkYXRhLCB4LCB4U3ViZ3JvdXAsIHNlbGYsIHRlbXBTY2FsZSkge1xyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0RyaWxsZG93bkNoYXJ0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWxjdWxhdGVEcmlsbGRvd25CYXJYKGQsIGRhdGEsIHgsIHNlbGYsIHRlbXBTY2FsZSk7XHJcbiAgfVxyXG4gIHJldHVybiB4U3ViZ3JvdXAoZC5rZXkpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZURyaWxsZG93bkJhclgoZCwgZGF0YSwgeCwgc2VsZiwgdGVtcFNjYWxlKSB7XHJcbiAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgdGVtcFNjYWxlID0gZDMuc2NhbGVCYW5kKCkuZG9tYWluKGtleXMpLnJhbmdlKFswLCB4LmJhbmR3aWR0aCgpXSk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoeC5iYW5kd2lkdGgoKSA+IDEwMCkge1xyXG4gICAgICAgIGNvbnN0IHJlZHVjZWRCYXJXaWR0aCA9IHNlbGYuaXNab29tZWRPdXQgPyA2MCA6IDMwO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZEJhcldpZHRoKSAvIDI7XHJcbiAgICAgICAgdGVtcFNjYWxlLnJhbmdlKFtvZmZzZXQsIHguYmFuZHdpZHRoKCkgLSBvZmZzZXRdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiB0ZW1wU2NhbGUoZC5rZXkpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZUJhclkoZCwgeSwgaGVpZ2h0LCBzZWxmKSB7XHJcbiAgaWYgKGQudmFsdWUgPT09IC0xKSB7XHJcbiAgICByZXR1cm4geSgwKTtcclxuICB9XHJcblxyXG4gIGlmIChkLnZhbHVlID49IDApIHtcclxuICAgIGNvbnN0IGJhckhlaWdodCA9IGhlaWdodCAtIHkoZC52YWx1ZSk7XHJcbiAgICBjb25zdCBtaW5IZWlnaHQgPSBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5kZWZhdWx0QmFySGVpZ2h0IHx8IDI7XHJcbiAgICByZXR1cm4gYmFySGVpZ2h0IDwgbWluSGVpZ2h0ID8geSgwKSAtIG1pbkhlaWdodCA6IHkoZC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geSgwKTtcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVCYXJXaWR0aChkLCBkYXRhLCBzdWJncm91cHMsIHgsIHhTdWJncm91cCwgc2VsZiwgdGVtcFNjYWxlKSB7XHJcbiAgLy8gRGV2aWNlIGRldGVjdGlvbiBmb3IgcmVzcG9uc2l2ZSBzaXppbmdcclxuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDwgNTc2O1xyXG4gIGNvbnN0IGlzVGFibGV0ID0gd2luZG93LmlubmVyV2lkdGggPj0gNTc2ICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgOTkyO1xyXG5cclxuICAvLyBGb3IgZ3JvdXBlZCBiYXIgY2hhcnRzIGluIHpvb20taW4gdmlld1xyXG4gIGlmIChzdWJncm91cHMubGVuZ3RoID4gMSAmJiAhc2VsZi5pc1pvb21lZE91dCkge1xyXG4gICAgcmV0dXJuIGlzTW9iaWxlID8gMjIgOiBpc1RhYmxldCA/IDM2IDogNTA7XHJcbiAgfVxyXG5cclxuICAvLyBGb3Igc2luZ2xlLWJhciBjaGFydHMgaW4gem9vbS1pbiB2aWV3XHJcbiAgaWYgKHN1Ymdyb3Vwcy5sZW5ndGggPT09IDEgJiYgIXNlbGYuaXNab29tZWRPdXQpIHtcclxuICAgIHJldHVybiBpc01vYmlsZSA/IDYwIDogODA7XHJcbiAgfVxyXG5cclxuICAvLyBNaW5pbXVtIGJhciB3aWR0aHMgZm9yIHpvb21lZC1vdXQgc3RhdGVcclxuICBjb25zdCBtaW5CYXJXaWR0aCA9ICgoKSA9PiB7XHJcbiAgICBpZiAoc3ViZ3JvdXBzLmxlbmd0aCA+IDIpIHtcclxuICAgICAgcmV0dXJuIGlzTW9iaWxlID8gMTggOiBpc1RhYmxldCA/IDI0IDogMzA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNNb2JpbGUgPyAxMiA6IGlzVGFibGV0ID8gMTYgOiAyMDtcclxuICB9KSgpO1xyXG5cclxuICAvLyBEZWZhdWx0IGxvZ2ljIGZvciBkcmlsbGRvd24gY2hhcnRzXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgIGxldCBjYWxjdWxhdGVkU2NhbGUgPSBkMy5zY2FsZUJhbmQoKS5kb21haW4oW10pLnJhbmdlKFswLCAwXSk7XHJcbiAgICBcclxuICAgIGRhdGEuZm9yRWFjaCgoaW5kaXY6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGluZGl2KS5maWx0ZXIoKHRlbXAsIGkpID0+IGkgIT09IDApO1xyXG4gICAgICAgIGNhbGN1bGF0ZWRTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh4LmJhbmR3aWR0aCgpID4gMTAwKSB7XHJcbiAgICAgICAgICBjb25zdCByZWR1Y2VkQmFyV2lkdGggPSBzZWxmLmlzWm9vbWVkT3V0ID8gNjAgOiAxMDA7XHJcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoeC5iYW5kd2lkdGgoKSAtIHJlZHVjZWRCYXJXaWR0aCkgLyAyO1xyXG4gICAgICAgICAgY2FsY3VsYXRlZFNjYWxlLnJhbmdlKFtvZmZzZXQsIHguYmFuZHdpZHRoKCkgLSBvZmZzZXRdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBFbnN1cmUgbWluaW11bSB3aWR0aCBldmVuIGluIGRyaWxsZG93biBtb2RlXHJcbiAgICByZXR1cm4gTWF0aC5tYXgoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpLCBtaW5CYXJXaWR0aCk7XHJcbiAgfVxyXG5cclxuICAvLyBGb3IgcmVndWxhciBjaGFydHMsIGVuc3VyZSBtaW5pbXVtIHdpZHRoXHJcbiAgcmV0dXJuIE1hdGgubWF4KHhTdWJncm91cC5iYW5kd2lkdGgoKSwgbWluQmFyV2lkdGgpO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZUJhckhlaWdodChkLCB5LCBoZWlnaHQsIHNlbGYpIHtcclxuICBpZiAoZC52YWx1ZSA9PT0gLTEpIHtcclxuICAgIHJldHVybiBoZWlnaHQgLSB5KDApO1xyXG4gIH1cclxuXHJcbiAgaWYgKGQudmFsdWUgPj0gMCkge1xyXG4gICAgY29uc3QgYmFySGVpZ2h0ID0gaGVpZ2h0IC0geShkLnZhbHVlKTtcclxuICAgIGNvbnN0IG1pbkhlaWdodCA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmRlZmF1bHRCYXJIZWlnaHQgfHwgMjtcclxuICAgIHJldHVybiBNYXRoLm1heChiYXJIZWlnaHQsIG1pbkhlaWdodCk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gaGVpZ2h0IC0geSgwKTtcclxufVxyXG5cclxucHJpdmF0ZSBnZXRCYXJDb2xvcihkLCBtZXRhRGF0YSwgc2VsZikge1xyXG4gIGlmIChkLnZhbHVlICYmIHNlbGYuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhICYmIFxyXG4gICAgICBkLnZhbHVlID49IHBhcnNlRmxvYXQoc2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0KSAmJiBcclxuICAgICAgc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldCkge1xyXG4gICAgXHJcbiAgICBjb25zdCBrZXkgPSBkLmtleS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgY29sb3JBYm92ZVRhcmdldCA9IE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yQWJvdmVUYXJnZXQpXHJcbiAgICAgIC5maW5kKGsgPT4gay50b0xvd2VyQ2FzZSgpID09PSBrZXkpO1xyXG4gICAgXHJcbiAgICBpZiAoY29sb3JBYm92ZVRhcmdldCkge1xyXG4gICAgICByZXR1cm4gc2VsZi5jaGFydERhdGEubWV0YURhdGEuY29sb3JBYm92ZVRhcmdldFtjb2xvckFib3ZlVGFyZ2V0XTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHNlbGYuY2hhcnREYXRhLm1ldGFEYXRhLmNvbG9yc1tkLmtleV07XHJcbn1cclxuXHJcbnByaXZhdGUgcmVuZGVyQmFyTGFiZWxzKHN2ZywgZGF0YSwgc3ViZ3JvdXBzLCB4LCB4U3ViZ3JvdXAsIHksIGhlaWdodCwgXHJcbiAgbWV0YURhdGEsIHNlbGYsIHRlbXBTY2FsZSwgaXNyaWEpIHtcclxuICBcclxuICBjb25zdCBzdGF0ZSA9IHN2Zy5zZWxlY3RBbGwoJy5zdGF0ZScpO1xyXG4gIFxyXG4gIGNvbnN0IGxhYmVscyA9IHN0YXRlLnNlbGVjdEFsbCgndGV4dCcpXHJcbiAgICAuZGF0YSgoZCkgPT4gdGhpcy5wcmVwYXJlQmFyRGF0YShkLCBzdWJncm91cHMpKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoJ3RleHQnKVxyXG4gICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgLmF0dHIoJ3gnLCAwKVxyXG4gICAgLmF0dHIoJ3knLCAwKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kYXRhLWxhYmVscy13ZWVrbHljaGFydHMnKVxyXG4gICAgLnRleHQoKGQpID0+IHRoaXMuZm9ybWF0QmFyTGFiZWwoZCkpXHJcbiAgICAuc3R5bGUoJ2ZpbGwnLCAnIzAwMCcpXHJcbiAgICAuc3R5bGUoJ2ZvbnQtd2VpZ2h0JywgJ2JvbGQnKVxyXG4gICAgLnN0eWxlKCdmb250LXNpemUnLCAoZCkgPT4gdGhpcy5jYWxjdWxhdGVMYWJlbEZvbnRTaXplKHNlbGYpKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIChkKSA9PiB0aGlzLmNhbGN1bGF0ZUxhYmVsVHJhbnNmb3JtKGQsIGRhdGEsIHgsIHhTdWJncm91cCwgeSwgc2VsZiwgdGVtcFNjYWxlKSlcclxuICAgIC5vbignY2xpY2snLCAoZCkgPT4gdGhpcy5oYW5kbGVCYXJDbGljayhkLCBtZXRhRGF0YSwgc2VsZikpO1xyXG5cclxuICBpZiAoIWlzcmlhKSB7XHJcbiAgICBsYWJlbHMub24oJ21vdXNlb3V0JywgKCkgPT4gdGhpcy5oYW5kbGVNb3VzZU91dChzdmcpKVxyXG4gICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCAoZCkgPT4gdGhpcy5oYW5kbGVNb3VzZU92ZXIoZCwgc3ZnLCBkYXRhLCB4LCB5LCBoZWlnaHQsIG1ldGFEYXRhLCBzZWxmLCA1MCwgdGVtcFNjYWxlKSk7XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIGZvcm1hdEJhckxhYmVsKGQpIHtcclxuICBpZiAoIWQua2V5IHx8ICFkLnZhbHVlKSByZXR1cm4gJyc7XHJcbiAgcmV0dXJuIGQua2V5Lmxlbmd0aCA+IDIwID8gZC5rZXkuc3Vic3RyaW5nKDAsIDE3KSArICcuLi4nIDogZC5rZXk7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlTGFiZWxGb250U2l6ZShzZWxmKSB7XHJcbiAgaWYgKHNlbGYuaXNab29tZWRPdXQpIHJldHVybiAnOXB4JztcclxuXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+IDE5MDApIHJldHVybiAnMThweCc7XHJcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPCAxNDAwKSByZXR1cm4gJzEwcHgnO1xyXG4gICAgcmV0dXJuICcxNHB4JztcclxuICB9XHJcblxyXG4gIHJldHVybiAnMTRweCc7XHJcbn1cclxuXHJcbnByaXZhdGUgY2FsY3VsYXRlTGFiZWxUcmFuc2Zvcm0oZCwgZGF0YSwgeCwgeFN1Ymdyb3VwLCB5LCBzZWxmLCB0ZW1wU2NhbGUpIHtcclxuICBsZXQgY2FsY3VsYXRlZFNjYWxlO1xyXG4gIFxyXG4gIGRhdGEuZm9yRWFjaCgoaW5kaXY6IGFueSkgPT4ge1xyXG4gICAgaWYgKGluZGl2Lm5hbWUgPT09IGQubmFtZSkge1xyXG4gICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaW5kaXYpLmZpbHRlcigodGVtcCwgaSkgPT4gaSAhPT0gMCk7XHJcbiAgICAgIGNhbGN1bGF0ZWRTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4gICAgICBcclxuICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgIGNvbnN0IHJlZHVjZWRXaWR0aCA9IE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PT0gMiA/IDIwMCA6IDMwMDtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyO1xyXG4gICAgICAgICAgY2FsY3VsYXRlZFNjYWxlLnJhbmdlKFtvZmZzZXQsIHguYmFuZHdpZHRoKCkgLSBvZmZzZXRdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnRleHRBbHdheXNIb3Jpem9udGFsKSB7XHJcbiAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3hTdWJncm91cChkLmtleSl9LCR7eShkLnZhbHVlKSAtIDN9KWA7XHJcbiAgfVxyXG5cclxuICBpZiAoIWlzTmFOKGNhbGN1bGF0ZWRTY2FsZShkLmtleSkpKSB7XHJcbiAgICByZXR1cm4gYHRyYW5zbGF0ZSgke2NhbGN1bGF0ZWRTY2FsZShkLmtleSkgKyBjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKiAwLjU1fSwke3koMCkgLSAxMH0pIHJvdGF0ZSgyNzApYDtcclxuICB9XHJcblxyXG4gIHJldHVybiAndHJhbnNsYXRlKDAsMCknO1xyXG59XHJcblxyXG5wcml2YXRlIGhhbmRsZU1vdXNlT3ZlcihkLCBzdmcsIGRhdGEsIHgsIHksIGhlaWdodCwgbWV0YURhdGEsIHNlbGYsIGxlZnRBbmRSaWdodFNwYWNlcywgdGVtcFNjYWxlKSB7XHJcbiAgc3ZnLnNlbGVjdEFsbCgnLmxpYi12ZXJ0aWNhbHN0YWNrLXRpdGxlLW9udG9wJykucmVtb3ZlKCk7XHJcblxyXG4gIGxldCBjYWxjdWxhdGVkU2NhbGU7XHJcbiAgbGV0IGVsZW1lbnRzQ291bnRlcjtcclxuXHJcbiAgZGF0YS5mb3JFYWNoKChpbmRpdjogYW55KSA9PiB7XHJcbiAgICBpZiAoaW5kaXYubmFtZSA9PT0gZC5uYW1lKSB7XHJcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbmRpdikuZmlsdGVyKCh0ZW1wLCBpKSA9PiBpICE9PSAwKTtcclxuICAgICAgZWxlbWVudHNDb3VudGVyID0ga2V5cy5sZW5ndGg7XHJcbiAgICAgIGNhbGN1bGF0ZWRTY2FsZSA9IGQzLnNjYWxlQmFuZCgpLmRvbWFpbihrZXlzKS5yYW5nZShbMCwgeC5iYW5kd2lkdGgoKV0pO1xyXG4gICAgICBcclxuICAgICAgaWYgKHguYmFuZHdpZHRoKCkgPiAxMDApIHtcclxuICAgICAgICBpZiAoc2VsZi5jaGFydERhdGEuZGF0YS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgIGNvbnN0IHJlZHVjZWRXaWR0aCA9IE9iamVjdC5rZXlzKHNlbGYuY2hhcnREYXRhLmRhdGFbMF0pLmxlbmd0aCA9PT0gMiA/IDIwMCA6IDMwMDtcclxuICAgICAgICAgIGNvbnN0IG9mZnNldCA9ICh4LmJhbmR3aWR0aCgpIC0gcmVkdWNlZFdpZHRoKSAvIDI7XHJcbiAgICAgICAgICBjYWxjdWxhdGVkU2NhbGUucmFuZ2UoW29mZnNldCwgeC5iYW5kd2lkdGgoKSAtIG9mZnNldF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoeC5iYW5kd2lkdGgoKSAtIDEyNSkgLyAyO1xyXG4gICAgICAgICAgY2FsY3VsYXRlZFNjYWxlLnJhbmdlKFtvZmZzZXQsIHguYmFuZHdpZHRoKCkgLSBvZmZzZXRdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgY29uc3QgeFBvc2l0aW9uID0gdGhpcy5jYWxjdWxhdGVUb29sdGlwWChkLCB4LCBjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpO1xyXG4gIGNvbnN0IHdpZHRoID0gdGhpcy5jYWxjdWxhdGVUb29sdGlwV2lkdGgoY2FsY3VsYXRlZFNjYWxlLCBtZXRhRGF0YSwgbGVmdEFuZFJpZ2h0U3BhY2VzKTtcclxuXHJcbiAgc3ZnLmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAuYXR0cigneCcsIHhQb3NpdGlvbilcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWItdmVydGljYWxzdGFjay10aXRsZS1vbnRvcCcpXHJcbiAgICAuYXR0cigneScsIHkoZC52YWx1ZSkgLSAzIC0gNDAgLSAxMClcclxuICAgIC5hdHRyKCdkeScsIGQuY2xhc3MpXHJcbiAgICAuYXR0cignd2lkdGgnLCB3aWR0aClcclxuICAgIC5hdHRyKCdoZWlnaHQnLCA1MClcclxuICAgIC5hcHBlbmQoJ3hodG1sOmRpdicpXHJcbiAgICAuYXR0cignY2xhc3MnLCAndGl0bGUnKVxyXG4gICAgLnN0eWxlKCd6LWluZGV4JywgOTkpXHJcbiAgICAuaHRtbCgoKSA9PiB0aGlzLmdlbmVyYXRlVG9vbHRpcEhUTUwoZCwgbWV0YURhdGEpKTtcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVUb29sdGlwWChkLCB4LCBjYWxjdWxhdGVkU2NhbGUsIG1ldGFEYXRhLCBsZWZ0QW5kUmlnaHRTcGFjZXMpIHtcclxuICBpZiAobWV0YURhdGEuaGFzRHJpbGxEb3duKSB7XHJcbiAgICBpZiAoY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMiA+IDE4MCkge1xyXG4gICAgICByZXR1cm4geChkLm5hbWUpICsgY2FsY3VsYXRlZFNjYWxlKGQua2V5KSArIGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSAvIDIgLSA5MDtcclxuICAgIH1cclxuICAgIHJldHVybiB4KGQubmFtZSkgKyBjYWxjdWxhdGVkU2NhbGUoZC5rZXkpIC0gXHJcbiAgICAgICAgICAgKGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIpIC8gMiArIFxyXG4gICAgICAgICAgIGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSAvIDI7XHJcbiAgfVxyXG4gIHJldHVybiB4KGQubmFtZSkgKyBjYWxjdWxhdGVkU2NhbGUoZC5rZXkpIC0gXHJcbiAgICAgICAgIChjYWxjdWxhdGVkU2NhbGUuYmFuZHdpZHRoKCkgKyBsZWZ0QW5kUmlnaHRTcGFjZXMgKiAyKSAvIDIgKyBcclxuICAgICAgICAgY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpIC8gMjtcclxufVxyXG5cclxucHJpdmF0ZSBjYWxjdWxhdGVUb29sdGlwV2lkdGgoY2FsY3VsYXRlZFNjYWxlLCBtZXRhRGF0YSwgbGVmdEFuZFJpZ2h0U3BhY2VzKSB7XHJcbiAgaWYgKG1ldGFEYXRhLmhhc0RyaWxsRG93bikge1xyXG4gICAgaWYgKGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDIgPiAxODApIHtcclxuICAgICAgcmV0dXJuICcxODBweCc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2FsY3VsYXRlZFNjYWxlLmJhbmR3aWR0aCgpICsgbGVmdEFuZFJpZ2h0U3BhY2VzICogMjtcclxuICB9XHJcbiAgcmV0dXJuIGNhbGN1bGF0ZWRTY2FsZS5iYW5kd2lkdGgoKSArIGxlZnRBbmRSaWdodFNwYWNlcyAqIDI7XHJcbn1cclxuXHJcbnByaXZhdGUgZ2VuZXJhdGVUb29sdGlwSFRNTChkLCBtZXRhRGF0YSkge1xyXG4gIGNvbnN0IGJhckxhYmVsID0gZC5rZXk7XHJcbiAgY29uc3QgZGF0YVR5cGUgPSBtZXRhRGF0YS5kYXRhVHlwZSB8fCAnJztcclxuICBjb25zdCB2YWx1ZSA9IGQudmFsdWU7XHJcbiAgXHJcbiAgbGV0IGh0bWwgPSBgPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItbmFtZVwiPiR7YmFyTGFiZWx9PC9zcGFuPmA7XHJcbiAgaHRtbCArPSBgPHNwYW4gY2xhc3M9XCJ0aXRsZS1iYXItdmFsdWVcIj48c3Bhbj4ke3ZhbHVlfTwvc3Bhbj4ke2RhdGFUeXBlfTwvc3Bhbj5gO1xyXG4gIFxyXG4gIHJldHVybiBodG1sO1xyXG59XHJcblxyXG5wcml2YXRlIGhhbmRsZU1vdXNlT3V0KHN2Zykge1xyXG4gIHN2Zy5zZWxlY3RBbGwoJy5saWItdmVydGljYWxzdGFjay10aXRsZS1vbnRvcCcpLnJlbW92ZSgpO1xyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlcllBeGlzKHN2Zywgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0LCB5LCB5TGluZUF4aXMsIGxpbmVEYXRhLCBzZWxmLCBpc3JpYSwgbWFyZ2luKSB7XHJcbiAgLy8gSGlkZGVuIHktYXhpcyBmb3IgcmVmZXJlbmNlXHJcbiAgc3ZnLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cignY2xhc3MnLCAnbGliLXN0YWNrZWQteS1heGlzLXRleHQgeWF4aXMtZGFzaGVkJylcclxuICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tVGV4dFN0eWxlcylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgLmNhbGwoeSlcclxuICAgIC5zdHlsZSgnZGlzcGxheScsICdub25lJyk7XHJcblxyXG4gIC8vIExlZnQgeS1heGlzXHJcbiAgc3ZnWUF4aXNMZWZ0LmFwcGVuZCgnZycpXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWF4aXMtbGFiZWxzLXRleHRzLWRyaWxsZG93biB5YXhpcy1kYXNoZWQnKVxyXG4gICAgLmF0dHIoJ3N0eWxlJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNDdXN0b21UZXh0U3R5bGVzKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwwKScpXHJcbiAgICAuY2FsbChkMy5heGlzTGVmdCh5KVxyXG4gICAgICAudGlja1NpemUoMClcclxuICAgICAgLnRpY2tzKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLm51bWJlck9mWVRpY2tzKVxyXG4gICAgICAudGlja0Zvcm1hdCgoZCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZCA9IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzTGFiZWxGb21hdHRlciBcclxuICAgICAgICAgID8gc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ueUF4aXNMYWJlbEZvbWF0dGVyKGQpIFxyXG4gICAgICAgICAgOiBkO1xyXG4gICAgICAgIHJldHVybiBmb3JtYXR0ZWQgPj0gMTAwMCA/IGZvcm1hdHRlZCAvIDEwMDAgKyAnaycgOiBmb3JtYXR0ZWQ7XHJcbiAgICAgIH0pKVxyXG4gICAgLmNhbGwoKGcpID0+IHtcclxuICAgICAgZy5zZWxlY3QoJy5kb21haW4nKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ3ZhcigtLWNoYXJ0LWRvbWFpbi1jb2xvciwgIzAwMDAwMCknKVxyXG4gICAgICAgIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgJzFweCcpO1xyXG4gICAgfSlcclxuICAgIC5zZWxlY3RBbGwoJ3RleHQnKVxyXG4gICAgLnN0eWxlKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJyk7XHJcblxyXG4gIC8vIFJpZ2h0IHktYXhpcyAoaGlkZGVuIGJ5IGRlZmF1bHQpXHJcbiAgc3ZnWUF4aXNSaWdodC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi15YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duIHlheGlzLWRhc2hlZCcpXHJcbiAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgwLDApJylcclxuICAgIC5jYWxsKHkpXHJcbiAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpO1xyXG5cclxuICAvLyBMaW5lIGNoYXJ0IGF4aXMgaWYgYXBwbGljYWJsZVxyXG4gIGlmIChsaW5lRGF0YSAhPSBudWxsICYmIGxpbmVEYXRhICYmIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnNob3dMaW5lQ2hhcnRBeGlzKSB7XHJcbiAgICBzdmdZQXhpc1JpZ2h0LmFwcGVuZCgnZycpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItc3RhY2tlZC15LWF4aXMtdGV4dDEnKVxyXG4gICAgICAuYXR0cignc3R5bGUnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi55QXhpc0N1c3RvbVRleHRTdHlsZXMpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCknKVxyXG4gICAgICAuY2FsbCh5TGluZUF4aXMpO1xyXG4gIH1cclxuXHJcbiAgLy8gQXBwbHkgYXhpcyB2aXNpYmlsaXR5IGNvbmZpZ3VyYXRpb25zXHJcbiAgdGhpcy5hcHBseUF4aXNWaXNpYmlsaXR5Q29uZmlnKHNlbGYpO1xyXG59XHJcblxyXG5wcml2YXRlIGFwcGx5QXhpc1Zpc2liaWxpdHlDb25maWcoc2VsZikge1xyXG4gIGlmIChzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5pc1hheGlzTGFiZWxIaWRkZW4pIHtcclxuICAgIGQzLnNlbGVjdEFsbCgnZy5saWItbGluZS14LWF4aXMtdGV4dCA+IGcgPiB0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNMYWJlbEhpZGRlbikge1xyXG4gICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkID4gZyA+IHRleHQnKVxyXG4gICAgICAuYXR0cignY2xhc3MnLCAnbGliLWRpc3BsYXktaGlkZGVuJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VsZi5jaGFydENvbmZpZ3VyYXRpb24uaXNZYXhpc0hpZGRlbikge1xyXG4gICAgZDMuc2VsZWN0QWxsKCcueWF4aXMtZGFzaGVkJylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1kaXNwbGF5LWhpZGRlbicpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzWWF4aXNEYXNoZWQpIHtcclxuICAgIGQzLnNlbGVjdEFsbCgnLnlheGlzLWRhc2hlZCcpXHJcbiAgICAgIC5zdHlsZSgnc3Ryb2tlLWRhc2hhcnJheScsICc1IDUnKVxyXG4gICAgICAuc3R5bGUoJ2NvbG9yJywgJ3ZhcigtLWNoYXJ0LWF4aXMtY29sb3IsICM5OTk5OTkpJyk7XHJcbiAgfVxyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlckF4aXNMYWJlbHMoc3ZnLCBzdmdZQXhpc0xlZnQsIHN2Z1lBeGlzUmlnaHQsIG1ldGFEYXRhLCB3aWR0aCwgaGVpZ2h0LCBtYXJnaW4sIHNlbGYsIGlzcmlhLCByaWdodFN2Z1dpZHRoKSB7XHJcbiAgLy8gWS1heGlzIGxhYmVsXHJcbiAgaWYgKG1ldGFEYXRhLnlMYWJlbCkge1xyXG4gICAgY29uc3QgeVBvc2l0aW9uID0gaXNyaWEgPyAwIC0gbWFyZ2luLmxlZnQgLyAyIC0gMzAgOiAwIC0gbWFyZ2luLmxlZnQgLyAyIC0gNDA7XHJcblxyXG4gICAgc3ZnWUF4aXNMZWZ0LmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMScpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAncm90YXRlKC05MCknKVxyXG4gICAgICAuYXR0cigneScsIHlQb3NpdGlvbilcclxuICAgICAgLmF0dHIoJ3gnLCAwIC0gaGVpZ2h0IC8gMilcclxuICAgICAgLmF0dHIoJ2R5JywgJzFlbScpXHJcbiAgICAgIC5zdHlsZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJylcclxuICAgICAgLmF0dHIoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKTtcclxuXHJcbiAgICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNNdWx0aUNoYXJ0R3JpZExpbmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzdmdZQXhpc0xlZnQuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4gICAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ3NtYWxsZXInKVxyXG4gICAgICAgIC50ZXh0KG1ldGFEYXRhLnlMYWJlbCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdmcuc2VsZWN0QWxsKCcubGliLWF4aXMtZ3JvdXAtbGFiZWwnKVxyXG4gICAgICAgIC5hdHRyKCdjbGFzcycsICdsaWIteWxhYmVsLXdlZWtseUNoYXJ0cycpXHJcbiAgICAgICAgLnRleHQobWV0YURhdGEueUxhYmVsLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gWC1heGlzIGxhYmVsXHJcbiAgaWYgKG1ldGFEYXRhLnhMYWJlbCkge1xyXG4gICAgY29uc3QgaXNBY3JvbnltID0gdGhpcy5pc0xhYmVsQWNyb255bShtZXRhRGF0YS54TGFiZWwpO1xyXG4gICAgY29uc3QgeFBvc2l0aW9uID0gaXNyaWEgXHJcbiAgICAgID8gKGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tKSBcclxuICAgICAgOiAoaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyA0MCk7XHJcblxyXG4gICAgc3ZnLmFwcGVuZCgndGV4dCcpXHJcbiAgICAgIC5hdHRyKCdjbGFzcycsIHRoaXMuZ2V0WExhYmVsQ2xhc3Moc2VsZikpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnhBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7d2lkdGggLyAyfSwke3hQb3NpdGlvbn0pYClcclxuICAgICAgLnN0eWxlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKVxyXG4gICAgICAuc3R5bGUoJ2ZpbGwnLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgICAudGV4dChpc0Fjcm9ueW0gPyBtZXRhRGF0YS54TGFiZWwudG9VcHBlckNhc2UoKSA6IG1ldGFEYXRhLnhMYWJlbC50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtdHJhbnNmb3JtJywgaXNBY3JvbnltID8gJ25vbmUnIDogJ2NhcGl0YWxpemUnKTtcclxuICB9XHJcblxyXG4gIC8vIExpbmUgeS1heGlzIGxhYmVsXHJcbiAgaWYgKG1ldGFEYXRhLmxpbmV5TGFiZWwpIHtcclxuICAgIHN2Z1lBeGlzUmlnaHQuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2xpYi1heGlzLWdyb3VwLWxhYmVsIGxpYi1saW5lLWF4aXMnKVxyXG4gICAgICAuYXR0cignZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnlBeGlzQ3VzdG9tbGFiZWxTdHlsZXMpXHJcbiAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsMCkgcm90YXRlKDkwKScpXHJcbiAgICAgIC5hdHRyKCd5JywgLTEwMClcclxuICAgICAgLmF0dHIoJ3gnLCAxMDApXHJcbiAgICAgIC5hdHRyKCdkeScsICc1ZW0nKVxyXG4gICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpXHJcbiAgICAgIC5zdHlsZSgnZm9udC1zaXplJywgJ3NtYWxsZXInKVxyXG4gICAgICAudGV4dChtZXRhRGF0YS5saW5leUxhYmVsKTtcclxuICB9XHJcblxyXG4gIC8vIEFwcGx5IGRyaWxsZG93biBjaGFydCBzcGVjaWZpYyBzdHlsZXNcclxuICBpZiAodGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNEcmlsbGRvd25DaGFydCkge1xyXG4gICAgc3ZnLnNlbGVjdEFsbCgnZy54MS5heGlzMSBnLnRpY2sgbGluZScpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgaXNMYWJlbEFjcm9ueW0obGFiZWwpIHtcclxuICByZXR1cm4gKGxhYmVsLmxlbmd0aCA8PSA0ICYmIC9eW0EtWl0rJC8udGVzdChsYWJlbCkpIHx8XHJcbiAgICAgICAgIChsYWJlbCA9PT0gbGFiZWwudG9VcHBlckNhc2UoKSAmJiAvW0EtWl0vLnRlc3QobGFiZWwpKTtcclxufVxyXG5cclxucHJpdmF0ZSBnZXRYTGFiZWxDbGFzcyhzZWxmKSB7XHJcbiAgbGV0IGJhc2VDbGFzcyA9ICdsaWItYXhpcy1ncm91cC1sYWJlbCBmb250LXNpemUtMSc7XHJcbiAgXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQpIHtcclxuICAgIHJldHVybiBiYXNlQ2xhc3MgKyAnIGxpYi14bGFiZWwtZHJpbGxkb3duY2hhcnRzJztcclxuICB9XHJcbiAgXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmlzTXVsdGlDaGFydEdyaWRMaW5lICE9PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBiYXNlQ2xhc3MgKyAnIGxpYi14bGFiZWwtd2Vla2x5Q2hhcnRzJztcclxuICB9XHJcbiAgXHJcbiAgcmV0dXJuIGJhc2VDbGFzcyArICcgbGliLWF4aXMtd2F0ZXJmYWxsLWxhYmVsJztcclxufVxyXG5cclxucHJpdmF0ZSByZW5kZXJUYXJnZXRMaW5lKHN2Zywgc3ZnWUF4aXNSaWdodCwgeSwgd2lkdGgsIHJpZ2h0U3ZnV2lkdGgsIG1ldGFEYXRhLCBzZWxmKSB7XHJcbiAgY29uc3QgeVplcm8gPSB5KHRoaXMuY2hhcnREYXRhLnRhcmdldExpbmVEYXRhLnRhcmdldCk7XHJcblxyXG4gIC8vIERyYXcgdGFyZ2V0IGxpbmVcclxuICBzdmcuYXBwZW5kKCdsaW5lJylcclxuICAgIC5hdHRyKCd4MScsIDApXHJcbiAgICAuYXR0cigneDInLCB3aWR0aClcclxuICAgIC5hdHRyKCd5MScsIHlaZXJvKVxyXG4gICAgLmF0dHIoJ3kyJywgeVplcm8pXHJcbiAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnNSA1JylcclxuICAgIC5zdHlsZSgnc3Ryb2tlJywgdGhpcy5jaGFydERhdGEudGFyZ2V0TGluZURhdGEuY29sb3IpO1xyXG5cclxuICAvLyBBZGQgdGFyZ2V0IGxhYmVsXHJcbiAgY29uc3QgZGF0YVR5cGVUZW1wID0gbWV0YURhdGEuZGF0YVR5cGUgfHwgJyc7XHJcbiAgY29uc3QgdGFyZ2V0TGluZU5hbWUgPSB0aGlzLmNoYXJ0RGF0YS50YXJnZXRMaW5lRGF0YS50YXJnZXROYW1lIHx8ICd0YXJnZXQnO1xyXG5cclxuICBzdmdZQXhpc1JpZ2h0LmFwcGVuZCgnZm9yZWlnbk9iamVjdCcpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7eVplcm8gLSAzMH0pYClcclxuICAgIC5hdHRyKCd3aWR0aCcsIHJpZ2h0U3ZnV2lkdGgpXHJcbiAgICAuYXR0cignaGVpZ2h0JywgNTApXHJcbiAgICAuYXBwZW5kKCd4aHRtbDpkaXYnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ3RhcmdldC1kaXNwbGF5JylcclxuICAgIC5zdHlsZSgnY29sb3InLCAndmFyKC0tY2hhcnQtdGV4dC1jb2xvciknKVxyXG4gICAgLmh0bWwoYDxkaXY+JHt0YXJnZXRMaW5lTmFtZX08L2Rpdj48ZGl2PiR7c2VsZi5jaGFydERhdGEudGFyZ2V0TGluZURhdGEudGFyZ2V0fSR7ZGF0YVR5cGVUZW1wfTwvZGl2PmApO1xyXG59XHJcblxyXG5wcml2YXRlIHJlbmRlckxpbmVDaGFydChzdmcsIGxpbmVEYXRhLCB4LCBsaW5lWXNjYWxlLCBtZXRhRGF0YSwgc2VsZikge1xyXG4gIC8vIERyYXcgbGluZSBwYXRoXHJcbiAgc3ZnLmFwcGVuZCgncGF0aCcpXHJcbiAgICAuZGF0dW0obGluZURhdGEpXHJcbiAgICAuYXR0cignZmlsbCcsICdub25lJylcclxuICAgIC5hdHRyKCdzdHJva2UnLCBzZWxmLmNoYXJ0Q29uZmlndXJhdGlvbi5saW5lR3JhcGhDb2xvcilcclxuICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAxLjUpXHJcbiAgICAuYXR0cignZCcsIGQzLmxpbmUoKVxyXG4gICAgICAueCgoZCkgPT4geChkLm5hbWUpICsgeC5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgIC55KChkKSA9PiBsaW5lWXNjYWxlKGQudmFsdWUpKSk7XHJcblxyXG4gIC8vIEFkZCBkb3RzXHJcbiAgY29uc3QgZG90ID0gc3ZnLnNlbGVjdEFsbCgnbXlDaXJjbGVzJylcclxuICAgIC5kYXRhKGxpbmVEYXRhKVxyXG4gICAgLmVudGVyKClcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLm9uKCdjbGljaycsIChkKSA9PiB7XHJcbiAgICAgIGlmICghbWV0YURhdGEuYmFyV2l0aG91dENsaWNrIHx8ICFtZXRhRGF0YS5iYXJXaXRob3V0Q2xpY2subGVuZ3RoIHx8XHJcbiAgICAgICAgICAoIW1ldGFEYXRhLmJhcldpdGhvdXRDbGljay5pbmNsdWRlcyhkPy5uYW1lKSAmJiBcclxuICAgICAgICAgICAhbWV0YURhdGEuYmFyV2l0aG91dENsaWNrLmluY2x1ZGVzKGQ/LmtleSkpKSB7XHJcbiAgICAgICAgc2VsZi5oYW5kbGVDbGljayhkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIGRvdC5hcHBlbmQoJ2NpcmNsZScpXHJcbiAgICAuYXR0cignZmlsbCcsIHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKVxyXG4gICAgLmF0dHIoJ3N0cm9rZScsICdub25lJylcclxuICAgIC5hdHRyKCdjeCcsIChkKSA9PiB4KGQubmFtZSkgKyB4LmJhbmR3aWR0aCgpIC8gMilcclxuICAgIC5hdHRyKCdjeScsIChkKSA9PiBsaW5lWXNjYWxlKGQudmFsdWUpKVxyXG4gICAgLnN0eWxlKCdjdXJzb3InLCAoKSA9PiBzZWxmLmNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd24gPyAncG9pbnRlcicgOiAnZGVmYXVsdCcpXHJcbiAgICAuYXR0cigncicsIDMpO1xyXG5cclxuICAvLyBBZGQgdmFsdWUgbGFiZWxzXHJcbiAgaWYgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxpbmVHcmFwaENvbG9yKSB7XHJcbiAgICBkb3QuYXBwZW5kKCd0ZXh0JylcclxuICAgICAgLmF0dHIoJ2NsYXNzJywgJ2RvdCcpXHJcbiAgICAgIC5hdHRyKCdmaWxsJywgJ3ZhcigtLWNoYXJ0LXRleHQtY29sb3IpJylcclxuICAgICAgLmF0dHIoJ2NvbG9yJywgc2VsZi5jaGFydENvbmZpZ3VyYXRpb24ubGluZUdyYXBoQ29sb3IpXHJcbiAgICAgIC5hdHRyKCdzdHlsZScsICdmb250LXNpemU6IC44NWVtJylcclxuICAgICAgLmF0dHIoJ3gnLCAoZCkgPT4geChkLm5hbWUpICsgeC5iYW5kd2lkdGgoKSAvIDIpXHJcbiAgICAgIC5hdHRyKCd5JywgKGQpID0+IGxpbmVZc2NhbGUoZC52YWx1ZSkpXHJcbiAgICAgIC5hdHRyKCdkeScsICctMWVtJylcclxuICAgICAgLnRleHQoKGQpID0+IHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLmxhYmVsRm9ybWF0dGVyKGQudmFsdWUpKTtcclxuICB9XHJcbn1cclxuXHJcbnByaXZhdGUgaGFuZGxlWm9vbU91dChzdmcsIGhlaWdodCwgbWFyZ2luKSB7XHJcbiAgc3ZnLnNlbGVjdEFsbCgnLmxpYi14YXhpcy1sYWJlbHMtdGV4dHMtZHJpbGxkb3duJylcclxuICAgIC5lYWNoKChkLCBpLCBub2RlcykgPT4ge1xyXG4gICAgICBjb25zdCB0ZXh0ID0gZDMuc2VsZWN0KG5vZGVzW2ldKTtcclxuICAgICAgY29uc3QgbGFiZWwgPSB0ZXh0LnRleHQoKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChsYWJlbC5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XHJcbiAgICAgICAgY29uc3QgbGluZXMgPSBsYWJlbC5zcGxpdCgnXFxuJyk7XHJcbiAgICAgICAgdGV4dC50ZXh0KG51bGwpO1xyXG4gICAgICAgIGxpbmVzLmZvckVhY2goKGxpbmUsIGlkeCkgPT4ge1xyXG4gICAgICAgICAgdGV4dC5hcHBlbmQoJ3RzcGFuJylcclxuICAgICAgICAgICAgLnRleHQobGluZSlcclxuICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKVxyXG4gICAgICAgICAgICAuYXR0cignZHknLCBpZHggPT09IDAgPyAnMWVtJyA6ICcxLjFlbScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHdvcmRzID0gbGFiZWwuc3BsaXQoJyAnKTtcclxuICAgICAgICB0ZXh0LnRleHQobnVsbCk7XHJcbiAgICAgICAgd29yZHMuZm9yRWFjaCgod29yZCkgPT4ge1xyXG4gICAgICAgICAgdGV4dC5hcHBlbmQoJ3RzcGFuJykudGV4dCh3b3JkKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5zdHlsZSgnZmlsbCcsICd2YXIoLS1jaGFydC10ZXh0LWNvbG9yKScpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgbnVsbCk7XHJcblxyXG4gIHN2Zy5zZWxlY3QoJy54LWF4aXMnKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwgJHtoZWlnaHQgLSBtYXJnaW4uYm90dG9tICsgMTB9KWApO1xyXG59XHJcblxyXG5wcml2YXRlIGNhbGN1bGF0ZUNoYXJ0RGltZW5zaW9ucyhjaGFydENvbnRhaW5lcjogYW55LCB2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXI6IGFueSwgbWFyZ2luOiBhbnksIHNlbGY6IGFueSkge1xyXG4gIGxldCB3aWR0aCA9IHBhcnNlSW50KGNoYXJ0Q29udGFpbmVyLnN0eWxlKCd3aWR0aCcpKSAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0O1xyXG4gIGNvbnN0IGRhdGFMZW5ndGggPSB0aGlzLmNoYXJ0RGF0YS5kYXRhLmxlbmd0aDtcclxuICBjb25zdCBzdWJncm91cHNDb3VudCA9ICh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5rZXlMaXN0IGFzIGFueSB8fCBbXSkubGVuZ3RoO1xyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93LmlubmVyV2lkdGggPCA1NzY7XHJcbiAgY29uc3QgaXNUYWJsZXQgPSB3aW5kb3cuaW5uZXJXaWR0aCA+PSA1NzYgJiYgd2luZG93LmlubmVyV2lkdGggPCA5OTI7XHJcblxyXG4gIC8vIE1pbmltdW0gd2lkdGggcGVyIGJhciBncm91cCBiYXNlZCBvbiBkZXZpY2UgYW5kIG51bWJlciBvZiBzdWJncm91cHNcclxuICBjb25zdCBtaW5XaWR0aFBlckdyb3VwID0gKCgpID0+IHtcclxuICAgIGlmIChzdWJncm91cHNDb3VudCA+IDIpIHtcclxuICAgICAgcmV0dXJuIGlzTW9iaWxlID8gMTAwIDogaXNUYWJsZXQgPyAxMDAgOiAxMjA7IC8vIFdpZGVyIGZvciBtdWx0aXBsZSBzdWJncm91cHNcclxuICAgIH1cclxuICAgIHJldHVybiBpc01vYmlsZSA/IDQwIDogaXNUYWJsZXQgPyA2MCA6IDgwOyAvLyBOb3JtYWwgd2lkdGggZm9yIDEtMiBzdWJncm91cHNcclxuICB9KSgpO1xyXG5cclxuICAvLyBDYWxjdWxhdGUgbWluaW11bSByZXF1aXJlZCB3aWR0aCBmb3IgYWxsIGdyb3Vwc1xyXG4gIGNvbnN0IG1pblJlcXVpcmVkV2lkdGggPSBkYXRhTGVuZ3RoICogbWluV2lkdGhQZXJHcm91cDtcclxuXHJcbiAgLy8gSW4gem9vbWVkLW91dCBzdGF0ZSwgZW5zdXJlIG1pbmltdW0gd2lkdGggZm9yIHJlYWRhYmlsaXR5XHJcbiAgaWYgKHRoaXMuaXNab29tZWRPdXQpIHtcclxuICAgIC8vIElmIHdlIGhhdmUgbWFueSBncm91cHMgb3IgbXVsdGlwbGUgc3ViZ3JvdXBzLCBlbnN1cmUgbWluaW11bSB3aWR0aFxyXG4gICAgaWYgKGRhdGFMZW5ndGggPiA4IHx8IHN1Ymdyb3Vwc0NvdW50ID4gMikge1xyXG4gICAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBtaW5SZXF1aXJlZFdpZHRoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEluIHpvb21lZC1pbiBzdGF0ZSwgYWx3YXlzIGVuc3VyZSBnZW5lcm91cyBzcGFjaW5nXHJcbiAgaWYgKGRhdGFMZW5ndGggPiA4ICYmICF0aGlzLmlzWm9vbWVkT3V0KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMuY2hhcnREYXRhLmRyb3Bkb3duRGF0YTIgJiZcclxuICAgICAgd2lkdGggPCBkYXRhTGVuZ3RoICogMjUwXHJcbiAgICApIHtcclxuICAgICAgd2lkdGggPSBkYXRhTGVuZ3RoICogMjUwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSW5jcmVhc2Ugd2lkdGggZm9yIG11bHRpcGxlIHN1Ymdyb3Vwc1xyXG4gICAgICB3aWR0aCA9IGRhdGFMZW5ndGggKiAoc3ViZ3JvdXBzQ291bnQgPiAyID8gMjAwIDogMTYwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC0tLS0gSGVpZ2h0IExvZ2ljIChubyBjaGFuZ2UpIC0tLS1cclxuICBsZXQgaGVpZ2h0ID1cclxuICAgIHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpICpcclxuICAgICAgKHNlbGYuY2hhcnRDb25maWd1cmF0aW9uLnN2Z0hlaWdodCAvIDEwMCkgLVxyXG4gICAgbWFyZ2luLnRvcCAtXHJcbiAgICBtYXJnaW4uYm90dG9tO1xyXG5cclxuICBpZiAoXHJcbiAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5pc0Z1bGxTY3JlZW4gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgdGhpcy5jaGFydENvbmZpZ3VyYXRpb24uaXNGdWxsU2NyZWVuXHJcbiAgKSB7XHJcbiAgICBoZWlnaHQgPVxyXG4gICAgICB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHQgIT09IDcwXHJcbiAgICAgICAgPyB0aGlzLmNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcclxuICAgICAgICA6IHBhcnNlSW50KHZlcnRpY2Fsc3RhY2tlZGNvbnRhaW5lci5zdHlsZSgnaGVpZ2h0JykpO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzRHJpbGxkb3duQ2hhcnQgJiYgIXRoaXMuaXNIZWFkZXJWaXNpYmxlKSB7XHJcbiAgICBoZWlnaHQgPVxyXG4gICAgICBwYXJzZUludCh2ZXJ0aWNhbHN0YWNrZWRjb250YWluZXIuc3R5bGUoJ2hlaWdodCcpKSAtXHJcbiAgICAgIG1hcmdpbi50b3AgLVxyXG4gICAgICBtYXJnaW4uYm90dG9tIC1cclxuICAgICAgMTMwO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY2hhcnRDb25maWd1cmF0aW9uLmlzSGVhZGVyVmlzaWJsZSkge1xyXG4gICAgaGVpZ2h0ID1cclxuICAgICAgcGFyc2VJbnQodmVydGljYWxzdGFja2VkY29udGFpbmVyLnN0eWxlKCdoZWlnaHQnKSkgLVxyXG4gICAgICBtYXJnaW4udG9wIC1cclxuICAgICAgbWFyZ2luLmJvdHRvbSAtXHJcbiAgICAgIDEwMDtcclxuICB9XHJcblxyXG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcclxufVxyXG5wcml2YXRlIGNyZWF0ZUNoYXJ0Q29udGFpbmVycyhcclxuICBjaGFydENvbnRhaW5lcjogYW55LFxyXG4gIG1hcmdpbjogYW55LFxyXG4gIGhlaWdodDogbnVtYmVyLFxyXG4gIHJpZ2h0U3ZnV2lkdGg6IG51bWJlcixcclxuICBzZWxmOiBhbnksXHJcbiAgd2lkdGg6IG51bWJlclxyXG4pIHtcclxuICAvLyBPdXRlciBjb250YWluZXJcclxuICBjb25zdCBvdXRlckNvbnRhaW5lciA9IGNoYXJ0Q29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgLmF0dHIoJ2lkJywgc2VsZi51bmlxdWVJZClcclxuICAgIC5hdHRyKCdjbGFzcycsICdvdXRlci1jb250YWluZXInKVxyXG4gICAgLnN0eWxlKCd3aWR0aCcsICcxMDAlJylcclxuICAgIC5zdHlsZSgnaGVpZ2h0JywgaGVpZ2h0KVxyXG4gICAgLnN0eWxlKCdvdmVyZmxvdycsICd2aXNpYmxlJykgLy8gQWxsb3cgb3ZlcmZsb3cgdG8gc2hvdyBzY3JvbGxiYXJzXHJcbiAgICAuc3R5bGUoJ3BhZGRpbmctbGVmdCcsIGAke21hcmdpbi5sZWZ0fXB4YClcclxuICAgIC5zdHlsZSgncGFkZGluZy1yaWdodCcsIGAke3JpZ2h0U3ZnV2lkdGh9cHhgKVxyXG4gICAgLnN0eWxlKCdtYXJnaW4tbGVmdCcsICcxNXB4Jyk7XHJcblxyXG4gIC8vIExlZnQgWS1BeGlzXHJcbiAgY29uc3Qgc3ZnWUF4aXNMZWZ0ID0gb3V0ZXJDb250YWluZXJcclxuICAgIC5hcHBlbmQoJ3N2ZycpXHJcbiAgICAuYXR0cignd2lkdGgnLCAnMTAwJylcclxuICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSArIDEwKVxyXG4gICAgLnN0eWxlKCdwb3NpdGlvbicsICdhYnNvbHV0ZScpXHJcbiAgICAuc3R5bGUoJ2xlZnQnLCAnMCcpXHJcbiAgICAuc3R5bGUoJ3otaW5kZXgnLCAxKVxyXG4gICAgLmFwcGVuZCgnZycpXHJcbiAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke21hcmdpbi5sZWZ0ICsgMTV9LCR7bWFyZ2luLnRvcH0pYCk7XHJcblxyXG4gIC8vIFJpZ2h0IFktQXhpc1xyXG4gIGNvbnN0IHN2Z1lBeGlzUmlnaHQgPSBvdXRlckNvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnc3ZnJylcclxuICAgIC5hdHRyKCd3aWR0aCcsIHJpZ2h0U3ZnV2lkdGgpXHJcbiAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20gKyAxMClcclxuICAgIC5zdHlsZSgncG9zaXRpb24nLCAnYWJzb2x1dGUnKVxyXG4gICAgLnN0eWxlKCdyaWdodCcsICcxMnB4JylcclxuICAgIC5zdHlsZSgnei1pbmRleCcsIDEpXHJcbiAgICAuYXBwZW5kKCdnJylcclxuICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKDAsJHttYXJnaW4udG9wfSlgKTtcclxuXHJcbiAgLy8gSW5uZXIgc2Nyb2xsYWJsZSBjb250YWluZXJcclxuICBjb25zdCBpbm5lckNvbnRhaW5lciA9IG91dGVyQ29udGFpbmVyXHJcbiAgICAuYXBwZW5kKCdkaXYnKVxyXG4gICAgLmF0dHIoJ2NsYXNzJywgJ2lubmVyLWNvbnRhaW5lcicpXHJcbiAgICAuc3R5bGUoJ3dpZHRoJywgJzEwMCUnKVxyXG4gICAgLnN0eWxlKCdvdmVyZmxvdy14JywgJ2F1dG8nKTtcclxuXHJcbiAgLy8gTWFpbiBTVkdcclxuICBjb25zdCBzdmcgPSBpbm5lckNvbnRhaW5lclxyXG4gICAgLmFwcGVuZCgnc3ZnJylcclxuICAgIC5hdHRyKCd3aWR0aCcsIE1hdGgubWF4KHdpZHRoIC0gcmlnaHRTdmdXaWR0aCwgd2luZG93LmlubmVyV2lkdGggKiAwLjgpKSAvLyBFbnN1cmUgbWluaW11bSB3aWR0aFxyXG4gICAgLmF0dHIoJ2hlaWdodCcsIGhlaWdodCArIG1hcmdpbi50b3AgKyBtYXJnaW4uYm90dG9tICsgNjApXHJcbiAgICAuc3R5bGUoJ21pbi13aWR0aCcsICcxMDAlJykgLy8gUHJldmVudCBzdmcgZnJvbSBzaHJpbmtpbmdcclxuICAgIC5hcHBlbmQoJ2cnKVxyXG4gICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoMCwke21hcmdpbi50b3B9KWApO1xyXG5cclxuICByZXR1cm4geyBvdXRlckNvbnRhaW5lciwgc3ZnWUF4aXNMZWZ0LCBzdmdZQXhpc1JpZ2h0LCBpbm5lckNvbnRhaW5lciwgc3ZnIH07XHJcbn1cclxuICBoYW5kbGVDbGljayhkOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0RGF0YS5tZXRhRGF0YS5oYXNEcmlsbERvd24gfHwgZD8udG9nZ2xlRnJvbSlcclxuICAgICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZCk7XHJcbiAgfVxyXG4gIGhhbmRsZUhlYWRlck1lbnVDbGljayhpZCkge1xyXG4gICAgdGhpcy5oZWFkZXJNZW51Y2xpY2tFdmVudC5lbWl0KGlkKTtcclxuICB9XHJcbiAgaGFuZGxlREQxQ2xpY2soZXZlbnQpIHtcclxuICAgIHRoaXMuaXNERDFPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuaXNERDJPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG4gIGhhbmRsZUREMkNsaWNrKGV2ZW50KSB7XHJcbiAgICB0aGlzLmlzREQyT3BlbiA9IHRydWU7XHJcbiAgICB0aGlzLmlzREQxT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuICBoYW5kbGVDb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24oZXZlbnQpIHtcclxuICAgIHRoaXMuY2xpY2tFdmVudC5lbWl0KGV2ZW50KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gICNncm91cGNvbnRhaW5lclxyXG4gIGNsYXNzPVwibGliLWNoYXJ0LXdyYXBwZXJcIlxyXG4gIFtuZ0NsYXNzXT1cInsgJ2xpYi1uby1iYWNrZ3JvdW5kJzogaXNUcmFuc3BhcmVudEJhY2tncm91bmQgfVwiXHJcbiAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jYXJkLWJnKTtcIlxyXG4gIChyZXNpemVkKT1cIm9uUmVzaXplZCgkZXZlbnQpXCJcclxuPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXItYWx0XCIgKm5nSWY9XCIhaXNIZWFkZXJWaXNpYmxlXCI+XHJcbiAgICA8bGliLWNoYXJ0LWhlYWRlci12MlxyXG4gICAgICBbY2hhcnREYXRhXT1cImNoYXJ0RGF0YVwiXHJcbiAgICAgIFtjaGFydENvbmZpZ3VyYXRpb25dPVwiY2hhcnRDb25maWd1cmF0aW9uXCJcclxuICAgICAgKGNsaWNrRXZlbnQpPVwiaGFuZGxlQ2xpY2soJGV2ZW50KVwiXHJcbiAgICA+PC9saWItY2hhcnQtaGVhZGVyLXYyPlxyXG4gICAgPGxpYi1jaGFydC1oZWFkZXItdjNcclxuICAgICAgW2NoYXJ0RGF0YV09XCJjaGFydERhdGFcIlxyXG4gICAgICBbY2hhcnRDb25maWd1cmF0aW9uXT1cImNoYXJ0Q29uZmlndXJhdGlvblwiXHJcbiAgICAgIChjb21wYXJlQnlGaWx0ZXJTZWxlY3Rpb24pPVwiaGFuZGxlQ29tcGFyZUJ5RmlsdGVyU2VsZWN0aW9uKCRldmVudClcIlxyXG4gICAgICAoem9vbUluWm9vbU91dENsaWNrKT1cImhhbmRsZVpvb21pblpvb21vdXRDbGljaygkZXZlbnQpXCJcclxuICAgID48L2xpYi1jaGFydC1oZWFkZXItdjM+XHJcbiAgPC9kaXY+XHJcbiAgPGxpYi1jaGFydC1oZWFkZXItdjFcclxuICAgIFt0aXRsZV09XCJjaGFydERhdGEubWV0YURhdGEudGl0bGVcIlxyXG4gICAgW2hhc0RyaWxsRG93bl09XCJjaGFydERhdGEubWV0YURhdGEuaGFzRHJpbGxEb3duXCJcclxuICAgIFtpc0VkaXRFbmFibGVkXT1cImNoYXJ0RGF0YS5tZXRhRGF0YS5pc0VkaXRFbmFibGVkXCJcclxuICAgIFttZW51T3B0aW9uc109XCJjaGFydENvbmZpZ3VyYXRpb24uaGVhZGVyTWVudU9wdGlvbnNcIlxyXG4gICAgW2lzcmlhXT1cImN1c3RvbUNoYXJ0Q29uZmlndXJhdGlvbi5pc1JpYVwiXHJcbiAgICBbc2VsZWN0ZWRLcGlUb29sdG9wXT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zZWxlY3RlZEtwaVRvb2x0b3BcIlxyXG4gICAgKG1lbnVPcHRpb25DbGlja0V2ZW50KT1cImhhbmRsZUhlYWRlck1lbnVDbGljaygkZXZlbnQpXCJcclxuICAgIFtpc0FsZXJ0RW5hYmxlZF09XCJpc0FsZXJ0RW5hYmxlZFwiXHJcbiAgICAqbmdJZj1cImlzSGVhZGVyVmlzaWJsZVwiXHJcbiAgPjwvbGliLWNoYXJ0LWhlYWRlci12MT5cclxuICA8ZGl2XHJcbiAgICAqbmdJZj1cIlxyXG4gICAgICBjaGFydERhdGEgJiZcclxuICAgICAgY2hhcnREYXRhLm1ldGFEYXRhICYmXHJcbiAgICAgIGNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRKdXN0aWZpZWQgJiZcclxuICAgICAgbGVnZW5kVmlzaWJsZSAmJlxyXG4gICAgICBjaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kQXRUb3BSaWdodFxyXG4gICAgXCJcclxuICAgIGNsYXNzPVwibGVnZW5kLWhvbGRlci1yaWdodFwiXHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5mb290ZXJIZWlnaHRcIlxyXG4gID5cclxuICAgIDx1bCBjbGFzcz1cImRpc3BsYXktZmxleFwiPlxyXG4gICAgICA8bGlcclxuICAgICAgICBjbGFzcz1cImxlZ2VuZHMtcG9zaXRpb25pbmctaW5saW5lXCJcclxuICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjaGFydERhdGEubWV0YURhdGEuY29sb3JzIHwga2V5dmFsdWUgOiBrZWVwT3JkZXJcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgIGNsYXNzPVwibGliLWRvbnV0LWp1c3RpZmllZC1sYWJlbC1pY29uLWRyaWxsZG93blwiXHJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpdGVtLnZhbHVlXCJcclxuICAgICAgICA+PC9zcGFuXHJcbiAgICAgICAgPjxzcGFuPnt7IGl0ZW0ua2V5IH19PC9zcGFuPlxyXG4gICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuICA8L2Rpdj5cclxuICA8ZGl2XHJcbiAgICBbc3R5bGUuaGVpZ2h0XT1cImNoYXJ0Q29uZmlndXJhdGlvbi5zdmdIZWlnaHRcIlxyXG4gICAgaWQ9XCJncm91cGNoYXJ0Y29udGFpbmVyXCJcclxuICAgICNncm91cGNoYXJ0Y29udGFpbmVyXHJcbiAgICBjbGFzcz1cImxpYi1jaGFydC1zdmdcIlxyXG4gID48L2Rpdj5cclxuXHJcblxyXG4gIDwhLS0gPGRpdlxyXG4gICAgKm5nSWY9XCJcclxuICAgICAgY2hhcnREYXRhICYmXHJcbiAgICAgIGNoYXJ0RGF0YS5tZXRhRGF0YSAmJlxyXG4gICAgICBjaGFydENvbmZpZ3VyYXRpb24ubGVnZW5kSnVzdGlmaWVkICYmXHJcbiAgICAgIGxlZ2VuZFZpc2libGUgJiZcclxuICAgICAgIWNoYXJ0Q29uZmlndXJhdGlvbi5sZWdlbmRBdFRvcFJpZ2h0XHJcbiAgICBcIlxyXG4gICAgY2xhc3M9XCJsaWItZG9udXQtY2hhcnQtZm9vdGVyXCJcclxuICAgIFtzdHlsZS5oZWlnaHRdPVwiY2hhcnRDb25maWd1cmF0aW9uLmZvb3RlckhlaWdodFwiXHJcbiAgPlxyXG4gICAgPHVsIGNsYXNzPVwibGliLWRvbnV0LWp1c3RpZmllZC1sYWJlbC13cmFwcGVyXCI+XHJcbiAgICAgIDxsaVxyXG4gICAgICAgIGNsYXNzPVwibGliLWRvbnV0LWp1c3RpZmllZC1sYWJlbC1pdGVtXCJcclxuICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjaGFydERhdGEubWV0YURhdGEuY29sb3JzIHwga2V5dmFsdWVcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW5cclxuICAgICAgICAgIGNsYXNzPVwibGliLWRvbnV0LWp1c3RpZmllZC1sYWJlbC1pY29uXCJcclxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cIml0ZW0udmFsdWVcIlxyXG4gICAgICAgID48L3NwYW5cclxuICAgICAgICA+PHNwYW4+e3sgaXRlbS5rZXkgfX08L3NwYW4+XHJcbiAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gIDwvZGl2PiAtLT5cclxuXHJcblxyXG4gIDwhLS0gPGRpdiAqbmdJZj1cImNoYXJ0Q29uZmlndXJhdGlvbj8uaXNEaXNwbGF5QmFyRGV0YWlsc0F0Qm90dG9tXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYmFyLXZhbHVlcyBsaWItZGlzcGxheS1mbGV4IGxpYi1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGxpYi1hbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAqbmdGb3I9XCJcclxuICAgICAgICBsZXQgaXRlbSBvZiBjaGFydERhdGEubWV0YURhdGEuY29sb3JzIHwga2V5dmFsdWUgOiBrZWVwT3JkZXI7XHJcbiAgICAgICAgbGV0IGkgPSBpbmRleFxyXG4gICAgICBcIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiYmFyLW5hbWUgZm9udC1zaXplLTFcIlxyXG4gICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICBjaGFydERhdGEuZGF0YVswXVtpdGVtLmtleV0gJiZcclxuICAgICAgICAgIGkgPD0gY2hhcnRDb25maWd1cmF0aW9uLmhvd21hbnlCYXJEZXRhaWxzVG9EaXNwbGF5XHJcbiAgICAgICAgXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IGl0ZW0ua2V5IH19XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJiYXItdmFsdWUgbGliLWRpc3BsYXktZmxleCBsaWItYWxpZ24taXRlbXMtY2VudGVyIGZvbnQtc2l6ZS0xXCJcclxuICAgICAgICBbc3R5bGUuY29sb3JdPVwiXHJcbiAgICAgICAgICBjaGFydENvbmZpZ3VyYXRpb24uYmFyVmF1bGVDb2xvciA/IGJhclZhdWxlQ29sb3IgOiBpdGVtLnZhbHVlXHJcbiAgICAgICAgXCJcclxuICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgY2hhcnREYXRhLmRhdGFbMF1baXRlbS5rZXldICYmXHJcbiAgICAgICAgICBpIDw9IGNoYXJ0Q29uZmlndXJhdGlvbi5ob3dtYW55QmFyRGV0YWlsc1RvRGlzcGxheVxyXG4gICAgICAgIFwiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBjaGFydERhdGEuZGF0YVswXVtpdGVtLmtleV0gfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj4gLS0+XHJcbjwvZGl2PlxyXG4iXX0=