@rivet-health/design-system 35.9.0 → 35.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -55,6 +55,11 @@ export var Chart;
55
55
  console.warn("Heads up! Labeled series aren't currently supported for line charts");
56
56
  return emptyChart;
57
57
  }
58
+ if (hiddenData.supplementaryYs && hiddenData.supplementaryYs.length > 0) {
59
+ // eslint-disable-next-line no-console
60
+ console.warn("Heads up! Supplementary y values aren't supported for non-bar charts");
61
+ return emptyChart;
62
+ }
58
63
  //This assignment makes typescript recognize the actual type (TimeseriesData)
59
64
  const data = hiddenData;
60
65
  const xScale = scaleUtc(timeseriesDomain(data), xRange(dimensions, config));
@@ -152,6 +157,12 @@ export var Chart;
152
157
  console.warn("Heads up! Data labels aren't supported for any stacked chart type");
153
158
  return emptyChart;
154
159
  }
160
+ if (uncheckedData.supplementaryYs &&
161
+ uncheckedData.supplementaryYs.length > 0) {
162
+ // eslint-disable-next-line no-console
163
+ console.warn("Heads up! Supplementary y values aren't supported for non-bar charts");
164
+ return emptyChart;
165
+ }
155
166
  //This assignment makes typescript recognize the actual type (TimeseriesData)
156
167
  const data = uncheckedData;
157
168
  const xScale = scaleUtc(timeseriesDomain(data), xRange(dimensions, config));
@@ -255,11 +266,23 @@ export var Chart;
255
266
  console.warn("Heads up! Labeled series aren't currently supported for vertical bar charts");
256
267
  return emptyChart;
257
268
  }
258
- if (config.showDataLabels == true && config.groupingType == 'stacked') {
269
+ //When there's only 1 series, the distinction between 'stacked' and 'clustered' doesn't apply
270
+ const isSingleSeries = uncheckedData.ys.length == 1;
271
+ if (config.showDataLabels == true &&
272
+ config.groupingType == 'stacked' &&
273
+ !isSingleSeries) {
259
274
  // eslint-disable-next-line no-console
260
275
  console.warn("Heads up! Data labels aren't supported for any stacked chart type");
261
276
  return emptyChart;
262
277
  }
278
+ if (uncheckedData.supplementaryYs &&
279
+ uncheckedData.supplementaryYs.length > 0 &&
280
+ config.groupingType == 'clustered' &&
281
+ !isSingleSeries) {
282
+ // eslint-disable-next-line no-console
283
+ console.warn("Heads up! Supplementary y values aren't supported for clustered data (just use another normal y series)");
284
+ return emptyChart;
285
+ }
263
286
  //This assignment makes typescript recognize the actual type (TimeseriesData)
264
287
  const data = uncheckedData;
265
288
  const { range: xRange, binSize } = barXRange(dimensions, data, config);
@@ -287,6 +310,14 @@ export var Chart;
287
310
  const offset = yIndex * (width + SMALL_PADDING);
288
311
  xValue = xValue + offset;
289
312
  }
313
+ const yInclSuppCount = data.supplementaryYs
314
+ ? data.supplementaryYs.filter(y => y.associatedYIndex == yIndex)
315
+ .length + 1
316
+ : 1;
317
+ if (yInclSuppCount > 1) {
318
+ width =
319
+ (binSize - (yInclSuppCount - 1) * SMALL_PADDING) / yInclSuppCount;
320
+ }
290
321
  return {
291
322
  x: xValue,
292
323
  y: yValue,
@@ -294,6 +325,31 @@ export var Chart;
294
325
  height,
295
326
  };
296
327
  }));
328
+ let suppBars = [];
329
+ if (data.supplementaryYs) {
330
+ suppBars = data.supplementaryYs.map((y, yIndex) => y.values.map((_, index) => {
331
+ const { yValue, height } = getBarYInfo(data, yIndex, index, scale, config.groupingType == 'stacked', true);
332
+ let xValue = xScale(data.x[index]) - halfBinSize;
333
+ let width = binSize;
334
+ const matchingYSupps = data.supplementaryYs
335
+ ? data.supplementaryYs.filter(suppY => suppY.associatedYIndex == y.associatedYIndex)
336
+ : [];
337
+ const yInclSuppCount = matchingYSupps.length + 1;
338
+ const ySuppMatchingIndex = y.supplementalIndex + 1;
339
+ if (yInclSuppCount > 1) {
340
+ const xCalc = calculateXValueAndOffsetForBars(binSize, yInclSuppCount, ySuppMatchingIndex, xValue);
341
+ width = xCalc.width;
342
+ xValue = xCalc.xValue;
343
+ }
344
+ return {
345
+ x: xValue,
346
+ y: yValue,
347
+ width,
348
+ height,
349
+ };
350
+ }));
351
+ bars.push(...suppBars);
352
+ }
297
353
  const zeroAxisPosVal = scale(0, true);
298
354
  const dataLabels = data.ys.flatMap((y, yIndex) => {
299
355
  const subLabels = y.values.map((val, xIndex) => {
@@ -313,10 +369,45 @@ export var Chart;
313
369
  });
314
370
  return subLabels;
315
371
  });
372
+ if (data.supplementaryYs) {
373
+ const suppDataLabels = data.supplementaryYs.flatMap((y, yIndex) => {
374
+ const subLabels = y.values.map((val, xIndex) => {
375
+ const isNegativeBar = suppBars[yIndex][xIndex].y >= zeroAxisPosVal &&
376
+ suppBars[yIndex][xIndex].height > 0;
377
+ const yOffset = isNegativeBar
378
+ ? SMALL_PADDING +
379
+ DATA_LABEL_HEIGHT +
380
+ suppBars[yIndex][xIndex].height
381
+ : -SMALL_PADDING;
382
+ return {
383
+ label: (checkIfSecondary(data, yIndex, xIndex, true)
384
+ ? secondaryPipe.transform(val)
385
+ : pipe.transform(val)) ?? '',
386
+ yPos: suppBars[yIndex][xIndex].y + yOffset,
387
+ xPos: suppBars[yIndex][xIndex].x + suppBars[yIndex][xIndex].width / 2,
388
+ anchor: 'middle',
389
+ };
390
+ });
391
+ return subLabels;
392
+ });
393
+ dataLabels.push(...suppDataLabels);
394
+ }
316
395
  function hover(pos) {
317
396
  const xIndex = findNearestIndex(data.x, xScale.invert(pos.x).getTime());
318
397
  const x = xScale(data.x[xIndex]);
319
- const ys = data.ys.map((_, mapYIndex) => getBarYInfo(data, mapYIndex, xIndex, scale, config.groupingType == 'stacked').yValue);
398
+ let isSuppValue = false;
399
+ let suppIndexVal = 0;
400
+ let yInclSuppCount = 1;
401
+ if (data.supplementaryYs) {
402
+ yInclSuppCount = getClusterCountWithSupp(data);
403
+ suppIndexVal = findSubIndex(x, pos.x, binSize, yInclSuppCount) - 1;
404
+ if (suppIndexVal >= 0) {
405
+ isSuppValue = true;
406
+ }
407
+ }
408
+ const ys = data.ys.map((_, mapYIndex) => isSuppValue
409
+ ? getSuppBarYInfoViaYIndex(data, mapYIndex, suppIndexVal, xIndex, scale, config.groupingType == 'stacked').yValue
410
+ : getBarYInfo(data, mapYIndex, xIndex, scale, config.groupingType == 'stacked').yValue);
320
411
  const yPosSign = zeroAxisPosVal - pos.y;
321
412
  let visibleYIndex = -1;
322
413
  if (yPosSign < 0 && data.ys.find(y => y.values.find(val => val < 0))) {
@@ -347,8 +438,23 @@ export var Chart;
347
438
  }
348
439
  }
349
440
  const yIndex = visibleIndices[visibleYIndex];
350
- const { yValue, height } = getBarYInfo(data, yIndex, xIndex, scale, config.groupingType == 'stacked');
351
- const anchor = new DOMRect(pos.rect.x + bars[visibleYIndex][xIndex].x - SMALL_PADDING, pos.rect.y + yValue, bars[visibleYIndex][xIndex].width + SMALL_PADDING * 2, height);
441
+ const { yValue, height } = isSuppValue
442
+ ? getSuppBarYInfoViaYIndex(data, yIndex, suppIndexVal, xIndex, scale, config.groupingType == 'stacked')
443
+ : getBarYInfo(data, yIndex, xIndex, scale, config.groupingType == 'stacked');
444
+ const xCalc = calculateXValueAndOffsetForBars(binSize, yInclSuppCount, suppIndexVal + 1, xScale(data.x[xIndex]) - halfBinSize);
445
+ const anchorX = isSuppValue
446
+ ? xCalc.xValue
447
+ : bars[visibleYIndex][xIndex].x;
448
+ const anchorWidth = isSuppValue
449
+ ? xCalc.width
450
+ : bars[visibleYIndex][xIndex].width;
451
+ const anchor = new DOMRect(pos.rect.x + anchorX - SMALL_PADDING, pos.rect.y + yValue, anchorWidth + SMALL_PADDING * 2, height);
452
+ //We need to preserve the original index for the later checkIfSecondary call
453
+ const ysForMetrics = isSuppValue && data.supplementaryYs
454
+ ? data.supplementaryYs
455
+ .map((suppY, index) => ({ data: suppY, originalIndex: index }))
456
+ .filter(suppY => suppY.data.supplementalIndex == suppIndexVal)
457
+ : data.ys.map((y, index) => ({ data: y, originalIndex: index }));
352
458
  return {
353
459
  x,
354
460
  xIndex,
@@ -358,13 +464,15 @@ export var Chart;
358
464
  tooltip: {
359
465
  anchor,
360
466
  date: utcFormat('%B %d, %Y')(new Date(data.x[xIndex])),
361
- metrics: data.ys
467
+ metrics: ysForMetrics
362
468
  .map((y, index) => ({
363
- color: colors[index % colors.length],
364
- label: y.label,
365
- value: (checkIfSecondary(data, index, xIndex)
366
- ? secondaryFullPipe.transform(y.values[xIndex])
367
- : fullPipe.transform(y.values[xIndex])) ?? '-',
469
+ color: colors['associatedYIndex' in y.data
470
+ ? y.data.associatedYIndex
471
+ : index % colors.length],
472
+ label: y.data.label,
473
+ value: (checkIfSecondary(data, y.originalIndex, xIndex, isSuppValue)
474
+ ? secondaryFullPipe.transform(y.data.values[xIndex])
475
+ : fullPipe.transform(y.data.values[xIndex])) ?? '-',
368
476
  }))
369
477
  .filter((_, i) => config.groupedTooltip || i == visibleYIndex),
370
478
  },
@@ -396,13 +504,24 @@ export var Chart;
396
504
  data.ys.length ==
397
505
  data.ys.filter(y => y.values.filter(val => val != 0).length == 1)
398
506
  .length;
507
+ //When there's only 1 series, the distinction between 'stacked' and 'clustered' doesn't apply
508
+ const isSingleSeries = data.ys.length == 1;
399
509
  if (config.showDataLabels == true &&
400
510
  config.groupingType == 'stacked' &&
401
- !isMetricChart) {
511
+ !isMetricChart &&
512
+ !isSingleSeries) {
402
513
  // eslint-disable-next-line no-console
403
514
  console.warn("Heads up! Data labels aren't supported for any stacked chart type");
404
515
  return emptyChart;
405
516
  }
517
+ if (data.supplementaryYs &&
518
+ data.supplementaryYs.length > 0 &&
519
+ config.groupingType == 'clustered' &&
520
+ !isSingleSeries) {
521
+ // eslint-disable-next-line no-console
522
+ console.warn("Heads up! Supplementary y values aren't supported for clustered data (just use another normal y series)");
523
+ return emptyChart;
524
+ }
406
525
  const { range: yRange } = barYRange(dimensions, data, config);
407
526
  let yScale = data.type == 'labeled'
408
527
  ? scaleLinear(indexDomain(data), yRange)
@@ -438,6 +557,17 @@ export var Chart;
438
557
  const offset = (yIndex - centerIndex) * (HORIZONTAL_BAR_HEIGHT + SMALL_PADDING);
439
558
  yValue = yValue + offset;
440
559
  }
560
+ const matchingYSupps = data.supplementaryYs
561
+ ? data.supplementaryYs.filter(suppY => suppY.associatedYIndex == yIndex)
562
+ : [];
563
+ const yInclSuppCount = matchingYSupps.length + 1;
564
+ const ySuppMatchingIndex = 0;
565
+ if (yInclSuppCount > 1) {
566
+ const centerIndex = yInclSuppCount / 2 - 0.5;
567
+ const offset = (ySuppMatchingIndex - centerIndex) *
568
+ (HORIZONTAL_BAR_HEIGHT + SMALL_PADDING);
569
+ yValue = yValue + offset;
570
+ }
441
571
  const horR = Math.min(4, Math.floor(width / 2));
442
572
  const verR = Math.min(4, Math.floor(HORIZONTAL_BAR_HEIGHT / 2));
443
573
  subSimpHorBars.push({
@@ -477,63 +607,85 @@ export var Chart;
477
607
  .map(y => y.values[index])
478
608
  .filter(val => val < 0).length == 0 && !hasAnyPositiveBars;
479
609
  const rightSideRound = config.groupingType == 'clustered' || allRightZero;
480
- if (leftSideRound && rightSideRound) {
481
- //Both-sides rounding variation
482
- const pathD = `
483
- M ${xValue + horR},${yValue}
484
- h ${width - horR * 2}
485
- q${horR},0 ${horR},${verR}
486
- v ${HORIZONTAL_BAR_HEIGHT - verR * 2}
487
- q0,${verR} -${horR},${verR}
488
- h ${-(width - horR * 2)}
489
- q-${horR},0 -${horR},-${verR}
490
- v -${HORIZONTAL_BAR_HEIGHT - verR * 2}
491
- q0,-${verR} ${horR},-${verR}
492
- Z
493
- `;
494
- return pathD;
495
- }
496
- if (leftSideRound) {
497
- //Left-side rounding variation
498
- const pathD = `
499
- M ${xValue + horR},${yValue}
500
- h ${width - horR}
501
- v ${HORIZONTAL_BAR_HEIGHT}
502
- h ${-(width - horR)}
503
- q-${horR},0 -${horR},-${verR}
504
- v -${HORIZONTAL_BAR_HEIGHT - verR * 2}
505
- q0,-${verR} ${horR},-${verR}
506
- Z
507
- `;
508
- return pathD;
509
- }
510
- if (rightSideRound) {
511
- //Right-side rounding variation
512
- const pathD = `
513
- M ${xValue},${yValue}
514
- h ${width - horR}
515
- q${horR},0 ${horR},${verR}
516
- v ${HORIZONTAL_BAR_HEIGHT - verR * 2}
517
- q0,${verR} -${horR},${verR}
518
- h ${-(width - horR)}
519
- Z
520
- `;
521
- return pathD;
522
- }
523
- //No-rounding variation
524
- const pathD = `
525
- M ${xValue},${yValue}
526
- h ${width}
527
- v ${HORIZONTAL_BAR_HEIGHT}
528
- h ${-width}
529
- v -${HORIZONTAL_BAR_HEIGHT}
530
- Z
531
- `;
610
+ const pathD = calculateHorizontalBarPath(leftSideRound, rightSideRound, xValue, yValue, horR, verR, width);
532
611
  return pathD;
533
612
  });
534
613
  simplifiedHorizontalBars.push(subSimpHorBars);
535
614
  return retVal;
536
615
  });
616
+ const suppYs = data.supplementaryYs;
617
+ const simplifiedSuppHorizontalBars = [];
618
+ if (suppYs) {
619
+ const suppHorizontalBars = suppYs.map((y, yIndex) => {
620
+ const subSimpHorBars = [];
621
+ const retVal = y.values.map((_, index) => {
622
+ const { xValue, width } = getBarXInfo(data, yIndex, index, scale, config.groupingType == 'stacked', true);
623
+ let yValue = yScale(data.type == 'labeled' ? index : data.x[index]) -
624
+ HORIZONTAL_BAR_HEIGHT * 1.5;
625
+ const matchingYSupps = data.supplementaryYs
626
+ ? data.supplementaryYs.filter(suppY => suppY.associatedYIndex == y.associatedYIndex)
627
+ : [];
628
+ const yInclSuppCount = matchingYSupps.length + 1;
629
+ const ySuppMatchingIndex = y.supplementalIndex + 1;
630
+ if (yInclSuppCount > 1) {
631
+ const centerIndex = yInclSuppCount / 2 - 0.5;
632
+ const offset = (ySuppMatchingIndex - centerIndex) *
633
+ (HORIZONTAL_BAR_HEIGHT + SMALL_PADDING);
634
+ yValue = yValue + offset;
635
+ }
636
+ const horR = Math.min(4, Math.floor(width / 2));
637
+ const verR = Math.min(4, Math.floor(HORIZONTAL_BAR_HEIGHT / 2));
638
+ subSimpHorBars.push({
639
+ xPos: xValue,
640
+ yPos: yValue,
641
+ width,
642
+ });
643
+ //Don't draw anything for zero-value bars
644
+ if (width == 0) {
645
+ return '';
646
+ }
647
+ const isPositive = suppYs[yIndex].values[index] > 0;
648
+ const hasAnyNegativeBars = suppYs
649
+ .filter(suppY => suppY.supplementalIndex == y.supplementalIndex)
650
+ .map(y => y.values[index])
651
+ .find(val => val < 0);
652
+ const hasAnyPositiveBars = suppYs
653
+ .filter(suppY => suppY.supplementalIndex == y.supplementalIndex)
654
+ .map(y => y.values[index])
655
+ .find(val => val > 0);
656
+ //These checks are to make sure we still round if all previous/later values are 0
657
+ const allLeftZero = isPositive
658
+ ? suppYs
659
+ .slice(0, yIndex)
660
+ .filter(suppY => suppY.supplementalIndex == y.supplementalIndex)
661
+ .map(y => y.values[index])
662
+ .filter(val => val > 0).length == 0 && !hasAnyNegativeBars
663
+ : suppYs
664
+ .slice(yIndex + 1, suppYs.length)
665
+ .filter(suppY => suppY.supplementalIndex == y.supplementalIndex)
666
+ .map(y => y.values[index])
667
+ .filter(val => val < 0).length == 0;
668
+ const leftSideRound = config.groupingType == 'clustered' || allLeftZero;
669
+ const allRightZero = isPositive
670
+ ? suppYs
671
+ .slice(yIndex + 1, suppYs.length)
672
+ .filter(suppY => suppY.supplementalIndex == y.supplementalIndex)
673
+ .map(y => y.values[index])
674
+ .filter(val => val > 0).length == 0
675
+ : suppYs
676
+ .slice(0, yIndex)
677
+ .filter(suppY => suppY.supplementalIndex == y.supplementalIndex)
678
+ .map(y => y.values[index])
679
+ .filter(val => val < 0).length == 0 && !hasAnyPositiveBars;
680
+ const rightSideRound = config.groupingType == 'clustered' || allRightZero;
681
+ const pathD = calculateHorizontalBarPath(leftSideRound, rightSideRound, xValue, yValue, horR, verR, width);
682
+ return pathD;
683
+ });
684
+ simplifiedSuppHorizontalBars.push(subSimpHorBars);
685
+ return retVal;
686
+ });
687
+ horizontalBars.push(...suppHorizontalBars);
688
+ }
537
689
  const yOffset = HORIZONTAL_BAR_HEIGHT;
538
690
  const dataLabels = data.ys.flatMap((y, yIndex) => {
539
691
  const subLabels = y.values.map((val, xIndex) => {
@@ -553,6 +705,29 @@ export var Chart;
553
705
  });
554
706
  return subLabels;
555
707
  });
708
+ if (suppYs) {
709
+ const suppDataLabels = suppYs.flatMap((y, yIndex) => {
710
+ const subLabels = y.values.map((val, xIndex) => {
711
+ const barIsNegative = simplifiedSuppHorizontalBars[yIndex][xIndex].xPos <
712
+ zeroAxisPosVal &&
713
+ simplifiedSuppHorizontalBars[yIndex][xIndex].width > 0;
714
+ const xOffset = barIsNegative
715
+ ? -SMALL_PADDING
716
+ : simplifiedSuppHorizontalBars[yIndex][xIndex].width +
717
+ SMALL_PADDING;
718
+ return {
719
+ label: (checkIfSecondary(data, yIndex, xIndex, true)
720
+ ? secondaryPipe.transform(val)
721
+ : pipe.transform(val)) ?? '',
722
+ yPos: simplifiedSuppHorizontalBars[yIndex][xIndex].yPos + yOffset,
723
+ xPos: simplifiedSuppHorizontalBars[yIndex][xIndex].xPos + xOffset,
724
+ anchor: barIsNegative ? 'end' : 'start',
725
+ };
726
+ });
727
+ return subLabels;
728
+ });
729
+ dataLabels.push(...suppDataLabels);
730
+ }
556
731
  function hover(pos) {
557
732
  let xIndex = 0;
558
733
  let x = 0;
@@ -565,7 +740,19 @@ export var Chart;
565
740
  xIndex = findNearestIndexString(data.x, yScale.invert(pos.y));
566
741
  x = yScale(xIndex) - SMALL_PADDING;
567
742
  }
568
- const fullYs = data.ys.map((_, mapYIndex) => getBarXInfo(data, mapYIndex, xIndex, scale, config.groupingType == 'stacked'));
743
+ let isSuppValue = false;
744
+ let suppIndexVal = 0;
745
+ let yInclSuppCount = 1;
746
+ if (data.supplementaryYs) {
747
+ yInclSuppCount = getClusterCountWithSupp(data);
748
+ suppIndexVal = findSubIndexHorizontal(x, pos.y, yInclSuppCount) - 1;
749
+ if (suppIndexVal >= 0) {
750
+ isSuppValue = true;
751
+ }
752
+ }
753
+ const fullYs = data.ys.map((_, mapYIndex) => isSuppValue
754
+ ? getSuppBarXInfoViaYIndex(data, mapYIndex, suppIndexVal, xIndex, scale, config.groupingType == 'stacked')
755
+ : getBarXInfo(data, mapYIndex, xIndex, scale, config.groupingType == 'stacked'));
569
756
  const ys = fullYs.map(y => y.xValue);
570
757
  let visibleYIndex = -1;
571
758
  for (let i = 0; i < fullYs.length; i++) {
@@ -617,10 +804,26 @@ export var Chart;
617
804
  }
618
805
  }
619
806
  }
620
- const anchor = new DOMRect(pos.rect.x +
621
- simplifiedHorizontalBars[visibleYIndex][xIndex].xPos -
622
- SMALL_PADDING, pos.rect.y + simplifiedHorizontalBars[visibleYIndex][xIndex].yPos, simplifiedHorizontalBars[visibleYIndex][xIndex].width +
623
- SMALL_PADDING * 2, HORIZONTAL_BAR_HEIGHT);
807
+ const suppYIndex = isSuppValue && suppYs
808
+ ? suppYs.findIndex(suppY => suppY.associatedYIndex == visibleYIndex &&
809
+ suppY.supplementalIndex == suppIndexVal)
810
+ : -1;
811
+ const barXPos = isSuppValue
812
+ ? simplifiedSuppHorizontalBars[suppYIndex][xIndex].xPos
813
+ : simplifiedHorizontalBars[visibleYIndex][xIndex].xPos;
814
+ const barYPos = isSuppValue
815
+ ? simplifiedSuppHorizontalBars[suppYIndex][xIndex].yPos
816
+ : simplifiedHorizontalBars[visibleYIndex][xIndex].yPos;
817
+ const barWidth = isSuppValue
818
+ ? simplifiedSuppHorizontalBars[suppYIndex][xIndex].width
819
+ : simplifiedHorizontalBars[visibleYIndex][xIndex].width;
820
+ const anchor = new DOMRect(pos.rect.x + barXPos - SMALL_PADDING, pos.rect.y + barYPos, barWidth + SMALL_PADDING * 2, HORIZONTAL_BAR_HEIGHT);
821
+ //We need to preserve the original index for the later checkIfSecondary call
822
+ const ysForMetrics = isSuppValue && suppYs
823
+ ? suppYs
824
+ .map((suppY, index) => ({ data: suppY, originalIndex: index }))
825
+ .filter(suppY => suppY.data.supplementalIndex == suppIndexVal)
826
+ : data.ys.map((y, index) => ({ data: y, originalIndex: index }));
624
827
  return {
625
828
  x,
626
829
  xIndex,
@@ -632,13 +835,15 @@ export var Chart;
632
835
  date: data.type == 'labeled'
633
836
  ? data.x[xIndex].label
634
837
  : utcFormat('%B %d, %Y')(new Date(data.x[xIndex])),
635
- metrics: data.ys
838
+ metrics: ysForMetrics
636
839
  .map((y, index) => ({
637
- color: colors[index % colors.length],
638
- label: y.label,
639
- value: (checkIfSecondary(data, index, xIndex)
640
- ? secondaryFullPipe.transform(y.values[xIndex])
641
- : fullPipe.transform(y.values[xIndex])) ?? '-',
840
+ color: colors['associatedYIndex' in y.data
841
+ ? y.data.associatedYIndex
842
+ : index % colors.length],
843
+ label: y.data.label,
844
+ value: (checkIfSecondary(data, y.originalIndex, xIndex, isSuppValue)
845
+ ? secondaryFullPipe.transform(y.data.values[xIndex])
846
+ : fullPipe.transform(y.data.values[xIndex])) ?? '-',
642
847
  }))
643
848
  .filter((_, i) => config.groupedTooltip || i == visibleYIndex),
644
849
  },
@@ -668,6 +873,11 @@ export var Chart;
668
873
  console.warn("Heads up! Two axes with percentage aren't supported for donut charts");
669
874
  return emptyChart;
670
875
  }
876
+ if (allData.supplementaryYs && allData.supplementaryYs.length > 0) {
877
+ // eslint-disable-next-line no-console
878
+ console.warn("Heads up! Supplementary y values aren't supported for non-bar charts");
879
+ return emptyChart;
880
+ }
671
881
  const { data: unstackedData, visibleIndices } = hide(allData);
672
882
  const donutData = Chart.convertChartDataToDonutData(unstackedData);
673
883
  const hasNonZeroValue = donutData.some(d => d.value > 0);
@@ -778,6 +988,12 @@ export var Chart;
778
988
  console.warn("Heads up! Time-based series aren't currently supported for waterfall charts");
779
989
  return emptyChart;
780
990
  }
991
+ if (uncheckedData.supplementaryYs &&
992
+ uncheckedData.supplementaryYs.length > 0) {
993
+ // eslint-disable-next-line no-console
994
+ console.warn("Heads up! Supplementary y values aren't supported for non-bar charts");
995
+ return emptyChart;
996
+ }
781
997
  if (config.secondaryValueType) {
782
998
  // eslint-disable-next-line no-console
783
999
  console.warn('Heads up! Waterfall charts do not currently have two-axis support');
@@ -1083,10 +1299,6 @@ export var Chart;
1083
1299
  ];
1084
1300
  }
1085
1301
  function calcYScalesAndTicks(data, dimensions, pipe, secondaryPipe, isStacked, config) {
1086
- const primaryData = {
1087
- ...data,
1088
- ys: data.ys.filter(y => !y.isSecondary),
1089
- };
1090
1302
  const secondaryData = {
1091
1303
  ...data,
1092
1304
  ys: data.ys.filter(y => y.isSecondary),
@@ -1094,8 +1306,11 @@ export var Chart;
1094
1306
  const scaleRange = yRange(dimensions, config, data);
1095
1307
  //Simpler path for data w/o secondaries
1096
1308
  if (secondaryData.ys.length == 0) {
1097
- const data = isStacked ? stack(primaryData) : primaryData;
1098
- const yScale = scaleLinear(yDomain(data), scaleRange);
1309
+ const yScaleDomainValues = calcYScaleDomainValues(data, isStacked, false);
1310
+ const yScale = scaleLinear([
1311
+ Math.min(...yScaleDomainValues.map(val => val.min)),
1312
+ Math.max(...yScaleDomainValues.map(val => val.max)),
1313
+ ], scaleRange);
1099
1314
  const yTicks = yScale.ticks(5).map(tick => ({
1100
1315
  y: yScale(tick),
1101
1316
  label: pipe.transform(tick),
@@ -1110,17 +1325,16 @@ export var Chart;
1110
1325
  yTicks,
1111
1326
  };
1112
1327
  }
1328
+ const primaryYScaleDomainValues = calcYScaleDomainValues(data, isStacked, false);
1329
+ const secondaryYScaleDomainValues = calcYScaleDomainValues(data, isStacked, true);
1113
1330
  let scaleDomainMultiple = 1;
1114
1331
  //Calculating how much we need to multiple the domain by to 'fit' both axes' data
1115
1332
  if (isStacked) {
1116
- //Stacking each individual data type makes finding the max easier
1117
- const primaryStacked = stack(primaryData);
1118
- const secondaryStacked = stack(secondaryData);
1119
- const primaryDataMax = Math.max(...primaryStacked.ys.map(y => Math.max(...y.values)));
1120
- const secondaryDataMax = Math.max(...secondaryStacked.ys.map(y => Math.max(...y.values)));
1121
- for (let i = 0; i < primaryStacked.x.length; i++) {
1122
- const primaryVal = Math.max(...primaryStacked.ys.map(y => y.values[i]));
1123
- const secondaryVal = Math.max(...secondaryStacked.ys.map(y => y.values[i]));
1333
+ const primaryDataMax = Math.max(...primaryYScaleDomainValues.map(val => val.max));
1334
+ const secondaryDataMax = Math.max(...secondaryYScaleDomainValues.map(val => val.max));
1335
+ for (let i = 0; i < primaryYScaleDomainValues.length; i++) {
1336
+ const primaryVal = primaryYScaleDomainValues[i].max;
1337
+ const secondaryVal = secondaryYScaleDomainValues[i].max;
1124
1338
  const primaryRatio = primaryDataMax != 0 ? primaryVal / primaryDataMax : 0;
1125
1339
  const secondaryRatio = secondaryDataMax != 0 ? secondaryVal / secondaryDataMax : 0;
1126
1340
  const multVal = primaryRatio + secondaryRatio;
@@ -1129,10 +1343,18 @@ export var Chart;
1129
1343
  }
1130
1344
  }
1131
1345
  }
1132
- const primaryYDomain = yDomain(isStacked ? stack(primaryData) : primaryData, scaleDomainMultiple);
1346
+ const primaryYDomain = [
1347
+ Math.min(...primaryYScaleDomainValues.map(val => val.min)),
1348
+ Math.max(...primaryYScaleDomainValues.map(val => val.max)) *
1349
+ scaleDomainMultiple,
1350
+ ];
1133
1351
  //Figuring out the best tick count to fit the two data srouces
1134
1352
  const yScalePrimaryProto = scaleLinear(primaryYDomain, scaleRange);
1135
- const yScaleSecondaryProto = scaleLinear(yDomain(isStacked ? stack(secondaryData) : secondaryData, scaleDomainMultiple), scaleRange);
1353
+ const yScaleSecondaryProto = scaleLinear([
1354
+ Math.min(...secondaryYScaleDomainValues.map(val => val.min)),
1355
+ Math.max(...secondaryYScaleDomainValues.map(val => val.max)) *
1356
+ scaleDomainMultiple,
1357
+ ], scaleRange);
1136
1358
  const tickCount = Math.max(5, yScalePrimaryProto.ticks(5).length, yScaleSecondaryProto.ticks(5).length);
1137
1359
  //Finding a domain for the secondary data such that it will result in round tick values when matched with the primary ticks
1138
1360
  const secondaryTicksProto = yScaleSecondaryProto
@@ -1174,17 +1396,183 @@ export var Chart;
1174
1396
  yTicks,
1175
1397
  };
1176
1398
  }
1399
+ function calcYScaleDomainValues(data, isStacked, forSecondary) {
1400
+ const possiblyStackedYs = data.ys.map((y, yIndex) => {
1401
+ //Handle stacking
1402
+ return isStacked
1403
+ ? y.values.map((val, xIndex) => {
1404
+ let prevRunningTotal = 0;
1405
+ for (let yI = 0; yI < yIndex; yI++) {
1406
+ if (checkIfSecondary(data, yIndex, xIndex, false) != forSecondary) {
1407
+ continue;
1408
+ }
1409
+ const addVal = data.ys[yI].values[xIndex];
1410
+ //Only stack values of the same sign
1411
+ if (addVal < 0 == val < 0) {
1412
+ prevRunningTotal += addVal;
1413
+ }
1414
+ }
1415
+ return val + prevRunningTotal;
1416
+ })
1417
+ : y.values;
1418
+ });
1419
+ const suppYs = data.supplementaryYs;
1420
+ let possiblyStackedSupYs = [];
1421
+ if (suppYs && suppYs.length > 0) {
1422
+ possiblyStackedSupYs = suppYs.map((y, yIndex) => {
1423
+ //Handle stacking
1424
+ return isStacked
1425
+ ? y.values.map((val, xIndex) => {
1426
+ let prevRunningTotal = 0;
1427
+ for (let yI = 0; yI < yIndex; yI++) {
1428
+ if (checkIfSecondary(data, yIndex, xIndex, true) !=
1429
+ forSecondary ||
1430
+ suppYs[yI].supplementalIndex != y.supplementalIndex) {
1431
+ continue;
1432
+ }
1433
+ const addVal = suppYs[yI].values[xIndex];
1434
+ //Only stack values of the same sign
1435
+ if (addVal < 0 == val < 0) {
1436
+ prevRunningTotal += addVal;
1437
+ }
1438
+ }
1439
+ return val + prevRunningTotal;
1440
+ })
1441
+ : y.values;
1442
+ });
1443
+ }
1444
+ const scaleRange = [];
1445
+ for (let i = 0; i < data.x.length; i++) {
1446
+ const maxNormY = Math.max(...possiblyStackedYs.map((y, yIndex) => {
1447
+ if (checkIfSecondary(data, yIndex, i, false) != forSecondary) {
1448
+ return 0;
1449
+ }
1450
+ return y[i];
1451
+ }));
1452
+ const minNormY = Math.min(...possiblyStackedYs.map((y, yIndex) => {
1453
+ if (checkIfSecondary(data, yIndex, i, false) != forSecondary) {
1454
+ return 0;
1455
+ }
1456
+ return y[i];
1457
+ }));
1458
+ const maxSupY = suppYs
1459
+ ? Math.max(...possiblyStackedSupYs.map((y, yIndex) => {
1460
+ if (checkIfSecondary(data, yIndex, i, true) != forSecondary) {
1461
+ return 0;
1462
+ }
1463
+ return y[i];
1464
+ }))
1465
+ : 0;
1466
+ const minSupY = suppYs
1467
+ ? Math.min(...possiblyStackedSupYs.map((y, yIndex) => {
1468
+ if (checkIfSecondary(data, yIndex, i, true) != forSecondary) {
1469
+ return 0;
1470
+ }
1471
+ return y[i];
1472
+ }))
1473
+ : 0;
1474
+ const max = maxNormY > 0 && maxNormY > maxSupY
1475
+ ? maxNormY
1476
+ : maxSupY > 0
1477
+ ? maxSupY
1478
+ : 0;
1479
+ const min = minNormY < 0 && minNormY < minSupY
1480
+ ? minNormY
1481
+ : minSupY < 0
1482
+ ? minSupY
1483
+ : 0;
1484
+ scaleRange.push({ max, min });
1485
+ }
1486
+ return scaleRange;
1487
+ }
1488
+ function getClusterCountWithSupp(data) {
1489
+ const suppYs = data.supplementaryYs;
1490
+ if (suppYs) {
1491
+ return Math.max(...suppYs.map(suppY => suppY.supplementalIndex)) + 2;
1492
+ }
1493
+ return 1;
1494
+ }
1495
+ function calculateXValueAndOffsetForBars(binSize, clusterCount, matchingIndex, originalXValue) {
1496
+ const width = (binSize - (clusterCount - 1) * SMALL_PADDING) / clusterCount;
1497
+ const offset = matchingIndex * (width + SMALL_PADDING);
1498
+ const xValue = originalXValue + offset;
1499
+ return {
1500
+ width,
1501
+ xValue,
1502
+ };
1503
+ }
1504
+ function calculateHorizontalBarPath(leftSideRound, rightSideRound, xValue, yValue, horR, verR, width) {
1505
+ if (leftSideRound && rightSideRound) {
1506
+ //Both-sides rounding variation
1507
+ const pathD = `
1508
+ M ${xValue + horR},${yValue}
1509
+ h ${width - horR * 2}
1510
+ q${horR},0 ${horR},${verR}
1511
+ v ${HORIZONTAL_BAR_HEIGHT - verR * 2}
1512
+ q0,${verR} -${horR},${verR}
1513
+ h ${-(width - horR * 2)}
1514
+ q-${horR},0 -${horR},-${verR}
1515
+ v -${HORIZONTAL_BAR_HEIGHT - verR * 2}
1516
+ q0,-${verR} ${horR},-${verR}
1517
+ Z
1518
+ `;
1519
+ return pathD;
1520
+ }
1521
+ if (leftSideRound) {
1522
+ //Left-side rounding variation
1523
+ const pathD = `
1524
+ M ${xValue + horR},${yValue}
1525
+ h ${width - horR}
1526
+ v ${HORIZONTAL_BAR_HEIGHT}
1527
+ h ${-(width - horR)}
1528
+ q-${horR},0 -${horR},-${verR}
1529
+ v -${HORIZONTAL_BAR_HEIGHT - verR * 2}
1530
+ q0,-${verR} ${horR},-${verR}
1531
+ Z
1532
+ `;
1533
+ return pathD;
1534
+ }
1535
+ if (rightSideRound) {
1536
+ //Right-side rounding variation
1537
+ const pathD = `
1538
+ M ${xValue},${yValue}
1539
+ h ${width - horR}
1540
+ q${horR},0 ${horR},${verR}
1541
+ v ${HORIZONTAL_BAR_HEIGHT - verR * 2}
1542
+ q0,${verR} -${horR},${verR}
1543
+ h ${-(width - horR)}
1544
+ Z
1545
+ `;
1546
+ return pathD;
1547
+ }
1548
+ //No-rounding variation
1549
+ const pathD = `
1550
+ M ${xValue},${yValue}
1551
+ h ${width}
1552
+ v ${HORIZONTAL_BAR_HEIGHT}
1553
+ h ${-width}
1554
+ v -${HORIZONTAL_BAR_HEIGHT}
1555
+ Z
1556
+ `;
1557
+ return pathD;
1558
+ }
1177
1559
  function calcXScalesAndTicks(data, dimensions, pipe, secondaryPipe, isStacked, config) {
1178
1560
  const primaryData = convertDataToJustOneValueType(data, false);
1179
1561
  const secondaryData = convertDataToJustOneValueType(data, true);
1180
- const largestLabelLength = Math.max(...data.ys.map((y, yIndex) => Math.max(...y.values.map((val, xIndex) => (checkIfSecondary(data, yIndex, xIndex)
1181
- ? secondaryPipe.transform(y.values[xIndex])
1182
- : pipe.transform(y.values[xIndex])).length))));
1562
+ const suppYs = data.supplementaryYs;
1563
+ const largestLabelLength = Math.max(...data.ys.map((y, yIndex) => Math.max(...y.values.map((val, xIndex) => (checkIfSecondary(data, yIndex, xIndex, false)
1564
+ ? secondaryPipe.transform(val)
1565
+ : pipe.transform(val)).length))), ...(suppYs ?? []).map((y, yIndex) => Math.max(...y.values.map((val, xIndex) => (checkIfSecondary(data, yIndex, xIndex, true)
1566
+ ? secondaryPipe.transform(val)
1567
+ : pipe.transform(val)).length))));
1183
1568
  const scaleRange = xRangeHorizontal(dimensions, data, largestLabelLength, config);
1184
1569
  //Simpler path for data w/o secondaries
1185
1570
  if (!secondaryData.ys.find(y => y.values.find(val => val != 0))) {
1186
- const data = isStacked ? stack(primaryData) : primaryData;
1187
- const xScale = scaleLinear(yDomain(data), scaleRange);
1571
+ const yScaleDomainValues = calcYScaleDomainValues(primaryData, isStacked, false);
1572
+ const xScale = scaleLinear([
1573
+ Math.min(...yScaleDomainValues.map(val => val.min)),
1574
+ Math.max(...yScaleDomainValues.map(val => val.max)),
1575
+ ], scaleRange);
1188
1576
  const xTicks = xScale.ticks(5).map(tick => ({
1189
1577
  x: xScale(tick),
1190
1578
  label: pipe.transform(tick),
@@ -1199,26 +1587,35 @@ export var Chart;
1199
1587
  xTicks,
1200
1588
  };
1201
1589
  }
1590
+ const primaryYScaleDomainValues = calcYScaleDomainValues(data, isStacked, false);
1591
+ const secondaryYScaleDomainValues = calcYScaleDomainValues(data, isStacked, true);
1202
1592
  let scaleDomainMultiple = 1;
1203
1593
  //Calculating how much we need to multiple the domain by to 'fit' both axes' data
1204
1594
  if (isStacked) {
1205
- //Stacking each individual data type makes finding the max easier
1206
- const primaryStacked = stack(primaryData);
1207
- const secondaryStacked = stack(secondaryData);
1208
- const primaryDataMax = Math.max(...primaryStacked.ys.map(y => Math.max(...y.values)));
1209
- const secondaryDataMax = Math.max(...secondaryStacked.ys.map(y => Math.max(...y.values)));
1210
- for (let i = 0; i < primaryStacked.x.length; i++) {
1211
- const primaryVal = Math.max(...primaryStacked.ys.map(y => y.values[i]));
1212
- const secondaryVal = Math.max(...secondaryStacked.ys.map(y => y.values[i]));
1213
- const multVal = primaryVal / primaryDataMax + secondaryVal / secondaryDataMax;
1595
+ const primaryDataMax = Math.max(...primaryYScaleDomainValues.map(val => val.max));
1596
+ const secondaryDataMax = Math.max(...secondaryYScaleDomainValues.map(val => val.max));
1597
+ for (let i = 0; i < primaryYScaleDomainValues.length; i++) {
1598
+ const primaryVal = primaryYScaleDomainValues[i].max;
1599
+ const secondaryVal = secondaryYScaleDomainValues[i].max;
1600
+ const primaryRatio = primaryDataMax != 0 ? primaryVal / primaryDataMax : 0;
1601
+ const secondaryRatio = secondaryDataMax != 0 ? secondaryVal / secondaryDataMax : 0;
1602
+ const multVal = primaryRatio + secondaryRatio;
1214
1603
  if (multVal > scaleDomainMultiple) {
1215
1604
  scaleDomainMultiple = multVal;
1216
1605
  }
1217
1606
  }
1218
1607
  }
1219
- const primaryXDomain = yDomain(isStacked ? stack(primaryData) : primaryData, scaleDomainMultiple);
1608
+ const primaryXDomain = [
1609
+ Math.min(...primaryYScaleDomainValues.map(val => val.min)),
1610
+ Math.max(...primaryYScaleDomainValues.map(val => val.max)) *
1611
+ scaleDomainMultiple,
1612
+ ];
1220
1613
  const xScalePrimaryProto = scaleLinear(primaryXDomain, scaleRange);
1221
- const xScaleSecondaryProto = scaleLinear(yDomain(isStacked ? stack(secondaryData) : secondaryData, scaleDomainMultiple), scaleRange);
1614
+ const xScaleSecondaryProto = scaleLinear([
1615
+ Math.min(...secondaryYScaleDomainValues.map(val => val.min)),
1616
+ Math.max(...secondaryYScaleDomainValues.map(val => val.max)) *
1617
+ scaleDomainMultiple,
1618
+ ], scaleRange);
1222
1619
  const tickCount = Math.max(5, xScalePrimaryProto.ticks(5).length, xScaleSecondaryProto.ticks(5).length);
1223
1620
  //Finding a domain for the secondary data such that it will result in round tick values when matched with the primary ticks
1224
1621
  const secondaryTicksProto = xScaleSecondaryProto
@@ -1303,7 +1700,7 @@ export var Chart;
1303
1700
  }, 0);
1304
1701
  }
1305
1702
  function findSubIndex(value, input, binSize, subBinCount) {
1306
- const subBinSize = (binSize - (subBinCount - 1 * SMALL_PADDING)) / subBinCount;
1703
+ const subBinSize = (binSize - (subBinCount - 1) * SMALL_PADDING) / subBinCount;
1307
1704
  const centerIndex = subBinCount / 2 - 0.5;
1308
1705
  let closestIndex = 0;
1309
1706
  let closenessVal = -1;
@@ -1333,14 +1730,24 @@ export var Chart;
1333
1730
  }
1334
1731
  return closestIndex;
1335
1732
  }
1336
- function getBarYInfo(data, yIndex, xIndex, scale, isStacked) {
1733
+ function getBarYInfo(data, yIndex, xIndex, scale, isStacked, isSupplementary = false) {
1337
1734
  const zeroVal = scale(0, true);
1338
- const scaleValue = scale(data.ys[yIndex].values[xIndex], checkIfSecondary(data, yIndex, xIndex));
1735
+ const yData = getMainOrSuppY(data, yIndex, isSupplementary);
1736
+ const scaleValue = scale(yData.values[xIndex], checkIfSecondary(data, yIndex, xIndex, isSupplementary));
1339
1737
  if (scaleValue > zeroVal) {
1340
1738
  let prevBarHeights = 0;
1341
1739
  if (isStacked) {
1342
1740
  for (let i = 0; i < yIndex; i++) {
1343
- const checkValue = scale(data.ys[i].values[xIndex], checkIfSecondary(data, i, xIndex));
1741
+ const checkData = getMainOrSuppY(data, i, isSupplementary);
1742
+ //Both yData and checkData are definitely SupplementaryDataYs if isSupplementary is true, but they don't realize it
1743
+ if (isSupplementary &&
1744
+ 'supplementalIndex' in yData &&
1745
+ 'supplementalIndex' in checkData) {
1746
+ if (yData.supplementalIndex != checkData.supplementalIndex) {
1747
+ continue;
1748
+ }
1749
+ }
1750
+ const checkValue = scale(checkData.values[xIndex], checkIfSecondary(data, i, xIndex, isSupplementary));
1344
1751
  //Skip positive values
1345
1752
  if (checkValue < zeroVal) {
1346
1753
  continue;
@@ -1355,7 +1762,16 @@ export var Chart;
1355
1762
  let prevBarHeights = 0;
1356
1763
  if (isStacked) {
1357
1764
  for (let i = 0; i < yIndex; i++) {
1358
- const checkValue = scale(data.ys[i].values[xIndex], checkIfSecondary(data, i, xIndex));
1765
+ const checkData = getMainOrSuppY(data, i, isSupplementary);
1766
+ //Both yData and checkData are definitely SupplementaryDataYs if isSupplementary is true, but they don't realize it
1767
+ if (isSupplementary &&
1768
+ 'supplementalIndex' in yData &&
1769
+ 'supplementalIndex' in checkData) {
1770
+ if (yData.supplementalIndex != checkData.supplementalIndex) {
1771
+ continue;
1772
+ }
1773
+ }
1774
+ const checkValue = scale(checkData.values[xIndex], checkIfSecondary(data, i, xIndex, isSupplementary));
1359
1775
  //Skip negative values
1360
1776
  if (checkValue > zeroVal) {
1361
1777
  continue;
@@ -1368,14 +1784,44 @@ export var Chart;
1368
1784
  const height = zeroVal - yValue - prevBarHeights;
1369
1785
  return { yValue, height };
1370
1786
  }
1371
- function getBarXInfo(data, yIndex, xIndex, scale, isStacked) {
1787
+ function getSuppBarYInfoViaYIndex(data, yIndex, suppIndex, xIndex, scale, isStacked) {
1788
+ const suppYs = data.supplementaryYs;
1789
+ if (!suppYs || suppYs.length == 0) {
1790
+ return { yValue: 0, height: 0 };
1791
+ }
1792
+ for (let i = 0; i < suppYs.length; i++) {
1793
+ if (suppYs[i].associatedYIndex == yIndex &&
1794
+ suppYs[i].supplementalIndex == suppIndex) {
1795
+ return getBarYInfo(data, i, xIndex, scale, isStacked, true);
1796
+ }
1797
+ }
1798
+ return { yValue: 0, height: 0 };
1799
+ }
1800
+ function getMainOrSuppY(data, yIndex, isSupplementary) {
1801
+ const suppYs = data.supplementaryYs;
1802
+ if (suppYs && isSupplementary) {
1803
+ return suppYs[yIndex];
1804
+ }
1805
+ return data.ys[yIndex];
1806
+ }
1807
+ function getBarXInfo(data, yIndex, xIndex, scale, isStacked, isSupplementary = false) {
1372
1808
  const zeroVal = scale(0, true);
1373
- const scaleValue = scale(data.ys[yIndex].values[xIndex], checkIfSecondary(data, yIndex, xIndex));
1809
+ const yData = getMainOrSuppY(data, yIndex, isSupplementary);
1810
+ const scaleValue = scale(yData.values[xIndex], checkIfSecondary(data, yIndex, xIndex, isSupplementary));
1374
1811
  if (scaleValue < zeroVal) {
1375
1812
  let prevBarWidths = 0;
1376
1813
  if (isStacked) {
1377
1814
  for (let i = 0; i < yIndex; i++) {
1378
- const checkVal = scale(data.ys[i].values[xIndex], checkIfSecondary(data, i, xIndex));
1815
+ const checkData = getMainOrSuppY(data, i, isSupplementary);
1816
+ //Both yData and checkData are definitely SupplementaryDataYs if isSupplementary is true, but they don't realize it
1817
+ if (isSupplementary &&
1818
+ 'supplementalIndex' in yData &&
1819
+ 'supplementalIndex' in checkData) {
1820
+ if (yData.supplementalIndex != checkData.supplementalIndex) {
1821
+ continue;
1822
+ }
1823
+ }
1824
+ const checkVal = scale(checkData.values[xIndex], checkIfSecondary(data, i, xIndex, isSupplementary));
1379
1825
  //Skip positive values
1380
1826
  if (checkVal > zeroVal) {
1381
1827
  continue;
@@ -1390,7 +1836,16 @@ export var Chart;
1390
1836
  let prevBarWidths = 0;
1391
1837
  if (isStacked) {
1392
1838
  for (let i = 0; i < yIndex; i++) {
1393
- const checkVal = scale(data.ys[i].values[xIndex], checkIfSecondary(data, i, xIndex));
1839
+ const checkData = getMainOrSuppY(data, i, isSupplementary);
1840
+ //Both yData and checkData are definitely SupplementaryDataYs if isSupplementary is true, but they don't realize it
1841
+ if (isSupplementary &&
1842
+ 'supplementalIndex' in yData &&
1843
+ 'supplementalIndex' in checkData) {
1844
+ if (yData.supplementalIndex != checkData.supplementalIndex) {
1845
+ continue;
1846
+ }
1847
+ }
1848
+ const checkVal = scale(checkData.values[xIndex], checkIfSecondary(data, i, xIndex, isSupplementary));
1394
1849
  //Skip negative values
1395
1850
  if (checkVal < zeroVal) {
1396
1851
  continue;
@@ -1402,13 +1857,26 @@ export var Chart;
1402
1857
  const width = scaleValue - zeroVal;
1403
1858
  return { xValue, width };
1404
1859
  }
1405
- function checkIfSecondary(data, yIndex, xIndex) {
1860
+ function getSuppBarXInfoViaYIndex(data, yIndex, suppIndex, xIndex, scale, isStacked) {
1861
+ const suppYs = data.supplementaryYs;
1862
+ if (!suppYs || suppYs.length == 0) {
1863
+ return { xValue: 0, width: 0 };
1864
+ }
1865
+ for (let i = 0; i < suppYs.length; i++) {
1866
+ if (suppYs[i].associatedYIndex == yIndex &&
1867
+ suppYs[i].supplementalIndex == suppIndex) {
1868
+ return getBarXInfo(data, i, xIndex, scale, isStacked, true);
1869
+ }
1870
+ }
1871
+ return { xValue: 0, width: 0 };
1872
+ }
1873
+ function checkIfSecondary(data, yIndex, xIndex, isSupplementary = false) {
1406
1874
  if (data.type == 'labeled') {
1407
1875
  if (data.x[xIndex].isSecondary == true) {
1408
1876
  return true;
1409
1877
  }
1410
1878
  }
1411
- return data.ys[yIndex].isSecondary == true;
1879
+ return getMainOrSuppY(data, yIndex, isSupplementary).isSecondary == true;
1412
1880
  }
1413
1881
  // stack returns a new data where each set of yValues is stacked
1414
1882
  // on top of the previous.
@@ -1538,4 +2006,4 @@ export var Chart;
1538
2006
  };
1539
2007
  }
1540
2008
  })(Chart || (Chart = {}));
1541
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWUsV0FBVyxFQUFhLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTNFLE1BQU0sS0FBVyxLQUFLLENBNnBFckI7QUE3cEVELFdBQWlCLEtBQUs7SUFDUCx5QkFBbUIsR0FBRztRQUNqQyxhQUFhO1FBQ2IsaUJBQWlCO1FBQ2pCLG1CQUFtQjtRQUNuQixXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO1FBQ1gsZ0NBQWdDO1FBQ2hDLGlCQUFpQjtRQUNqQixtQkFBbUI7UUFDbkIsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLCtCQUErQjtRQUMvQixpQkFBaUI7UUFDakIsbUJBQW1CO1FBQ25CLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7S0FDWixDQUFDO0lBRUYsU0FBZ0IsS0FBSyxD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QUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUMxQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMsRUE3cEVnQixLQUFLLEtBQUwsS0FBSyxRQTZwRXJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNjYWxlTGluZWFyLCBzY2FsZUxpbmVhciwgU2NhbGVUaW1lLCBzY2FsZVV0YyB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IGFyYywgYXJlYSwgbGluZSwgcGllIH0gZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0IHsgdXRjRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRGF5c1BpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvZGF5cy5waXBlJztcbmltcG9ydCB7IE51bWJlclBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgUGVyY2VudGFnZVBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvcGVyY2VudGFnZS5waXBlJztcbmltcG9ydCB7IFNtYWxsQ3VycmVuY3lQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL3NtYWxsLWN1cnJlbmN5LnBpcGUnO1xuXG5leHBvcnQgbmFtZXNwYWNlIENoYXJ0IHtcbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb2xvclBhbGV0dGUgPSBbXG4gICAgLy9CYXNlIGNvbG9yc1xuICAgICctLWJhamEtYmxhc3QtNTAnLFxuICAgICctLXRlYWwtZGlhbW9uZC01MCcsXG4gICAgJy0tZnlyZS01MCcsXG4gICAgJy0tdGFuZy01MCcsXG4gICAgJy0tcHVycC02MCcsXG4gICAgJy0tcm9zaS03MCcsXG4gICAgLy9TaGlmdCBsaWdodGVyIGZyb20gYmFzZSBieSAtMjBcbiAgICAnLS1iYWphLWJsYXN0LTMwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtMzAnLFxuICAgICctLWZ5cmUtMzAnLFxuICAgICctLXRhbmctMzAnLFxuICAgICctLXB1cnAtNDAnLFxuICAgICctLXJvc2ktNTAnLFxuICAgIC8vU2hpZnQgZGFya2VyIGZyb20gYmFzZSBieSArMjBcbiAgICAnLS1iYWphLWJsYXN0LTcwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtNzAnLFxuICAgICctLWZ5cmUtNzAnLFxuICAgICctLXRhbmctNzAnLFxuICAgICctLXB1cnAtODAnLFxuICAgICctLXJvc2ktOTAnLFxuICBdO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFydChjb25maWc6IENvbmZpZywgZGF0YTogRGF0YSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHJldHVybiBjb25maWcudHlwZSA9PSAnbGluZSdcbiAgICAgID8gbGluZXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnYXJlYSdcbiAgICAgID8gYXJlYXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnZG9udXQnXG4gICAgICA/IGFyY3MoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnaG9yaXpvbnRhbC1iYXInXG4gICAgICA/IGhvcml6b250YWxCYXJzKGNvbmZpZywgZGF0YSwgZGltZW5zaW9ucylcbiAgICAgIDogY29uZmlnLnR5cGUgPT0gJ2JhcidcbiAgICAgID8gYmFycyhjb25maWcsIGRhdGEsIGRpbWVuc2lvbnMpXG4gICAgICA6IGNvbmZpZy50eXBlID09ICd3YXRlcmZhbGwnXG4gICAgICA/IHdhdGVyZmFsbChjb25maWcsIGRhdGEsIGRpbWVuc2lvbnMpXG4gICAgICA6IGVtcHR5Q2hhcnQ7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGxpbmVzKFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgY29uc3QgeyBkYXRhOiBoaWRkZW5EYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICBpZiAoaGlkZGVuRGF0YS50eXBlID09ICdsYWJlbGVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgTGFiZWxlZCBzZXJpZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGxpbmUgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIC8vVGhpcyBhc3NpZ25tZW50IG1ha2VzIHR5cGVzY3JpcHQgcmVjb2duaXplIHRoZSBhY3R1YWwgdHlwZSAoVGltZXNlcmllc0RhdGEpXG4gICAgY29uc3QgZGF0YSA9IGhpZGRlbkRhdGE7XG4gICAgY29uc3QgeFNjYWxlID0gc2NhbGVVdGModGltZXNlcmllc0RvbWFpbihkYXRhKSwgeFJhbmdlKGRpbWVuc2lvbnMsIGNvbmZpZykpO1xuICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcblxuICAgIGNvbnN0IHRpY2tDb3VudCA9IGdldFRpY2tDb3VudChkaW1lbnNpb25zLCBjb25maWcpO1xuICAgIGNvbnN0IHhUaWNrcyA9IGdlbmVyYXRlWFRpY2tzKGRhdGEsIHhTY2FsZSwgdGlja0NvdW50LCBmb3JtYXQpO1xuXG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeyBwaXBlOiBzZWNvbmRhcnlQaXBlLCBmdWxsUGlwZTogc2Vjb25kYXJ5RnVsbFBpcGUgfSA9XG4gICAgICBjb25maWcuc2Vjb25kYXJ5VmFsdWVUeXBlXG4gICAgICAgID8gZ2V0UGlwZXMoY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSlcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBwaXBlLFxuICAgICAgICAgICAgZnVsbFBpcGUsXG4gICAgICAgICAgfTtcblxuICAgIGNvbnN0IHsgc2NhbGUsIHlUaWNrcyB9ID0gY2FsY1lTY2FsZXNBbmRUaWNrcyhcbiAgICAgIGRhdGEsXG4gICAgICBkaW1lbnNpb25zLFxuICAgICAgcGlwZSxcbiAgICAgIHNlY29uZGFyeVBpcGUsXG4gICAgICBmYWxzZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBpbmRpY2VzID0gZGF0YS54Lm1hcCgoXywgaSkgPT4gaSk7XG4gICAgY29uc3QgbGluZXMgPVxuICAgICAgZGF0YS54Lmxlbmd0aCA+IDFcbiAgICAgICAgPyBkYXRhLnlzLm1hcCh5ID0+XG4gICAgICAgICAgICBsaW5lPG51bWJlcj4oXG4gICAgICAgICAgICAgIGkgPT4geFNjYWxlKGRhdGEueFtpXSksXG4gICAgICAgICAgICAgIGkgPT4gc2NhbGUoeS52YWx1ZXNbaV0sIHkuaXNTZWNvbmRhcnkpLFxuICAgICAgICAgICAgKShpbmRpY2VzKSxcbiAgICAgICAgICApXG4gICAgICAgIDogW107XG4gICAgY29uc3QgY2lyY2xlcyA9XG4gICAgICBkYXRhLngubGVuZ3RoID09PSAxXG4gICAgICAgID8gZGF0YS55cy5tYXAoKHlTZXJpZXMsIGkpID0+ICh7XG4gICAgICAgICAgICBjeDogeFNjYWxlKGRhdGEueFswXSksXG4gICAgICAgICAgICBjeTogc2NhbGUoeVNlcmllcy52YWx1ZXNbMF0sIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgaSwgMCkpLFxuICAgICAgICAgIH0pKVxuICAgICAgICA6IFtdO1xuXG4gICAgY29uc3QgeU9mZnNldCA9IFNNQUxMX1BBRERJTkc7XG4gICAgY29uc3QgZGF0YUxhYmVsczogRGF0YUxhYmVsW10gPSBkYXRhLnlzLmZsYXRNYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3ViTGFiZWxzOiBEYXRhTGFiZWxbXSA9IHkudmFsdWVzLm1hcCgodmFsLCB4SW5kZXgpID0+ICh7XG4gICAgICAgIGxhYmVsOlxuICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIHlJbmRleCwgeEluZGV4KVxuICAgICAgICAgICAgPyBzZWNvbmRhcnlQaXBlLnRyYW5zZm9ybSh2YWwpXG4gICAgICAgICAgICA6IHBpcGUudHJhbnNmb3JtKHZhbCkpID8/ICcnLFxuICAgICAgICB5UG9zOiBzY2FsZSh2YWwsIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgpKSAtIHlPZmZzZXQsXG4gICAgICAgIHhQb3M6IHhTY2FsZShkYXRhLnhbeEluZGV4XSksXG4gICAgICAgIGFuY2hvcjogJ21pZGRsZScsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gc3ViTGFiZWxzO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gaG92ZXIocG9zOiB7IHJlY3Q6IERPTVJlY3Q7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICAgIGNvbnN0IHhJbmRleCA9IGZpbmROZWFyZXN0SW5kZXgoZGF0YS54LCB4U2NhbGUuaW52ZXJ0KHBvcy54KS5nZXRUaW1lKCkpO1xuICAgICAgY29uc3QgeCA9IHhTY2FsZShkYXRhLnhbeEluZGV4XSk7XG4gICAgICBjb25zdCB2aXNpYmxlWUluZGV4ID0gZmluZE5lYXJlc3RJbmRleFdpdGhTZWNvbmRhcnkoXG4gICAgICAgIGRhdGEueXMubWFwKCh5LCBpKSA9PiAoe1xuICAgICAgICAgIHZhbHVlOiB5LnZhbHVlc1t4SW5kZXhdLFxuICAgICAgICAgIGlzU2Vjb25kYXJ5OiBjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGksIHhJbmRleCksXG4gICAgICAgIH0pKSxcbiAgICAgICAgcG9zLnksXG4gICAgICAgIHNjYWxlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHlJbmRleCA9IHZpc2libGVJbmRpY2VzW3Zpc2libGVZSW5kZXhdO1xuICAgICAgY29uc3QgeXMgPSBkYXRhLnlzLm1hcCgoeSwgaSkgPT5cbiAgICAgICAgc2NhbGUoeS52YWx1ZXNbeEluZGV4XSwgY2hlY2tJZlNlY29uZGFyeShkYXRhLCBpLCB4SW5kZXgpKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgICBmb3JtYXRlZERhdGUoY29uZmlnLmRhdGVGb3JtYXQgfHwgJ2RheScsIGRhdGUpO1xuXG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgcG9zLnJlY3QueCArIHgsXG4gICAgICAgIHBvcy5yZWN0LnkgKyB5c1t2aXNpYmxlWUluZGV4XSxcbiAgICAgICAgOCxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHlzLFxuICAgICAgICB5SW5kZXgsXG4gICAgICAgIHZpc2libGVZSW5kZXgsXG4gICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgZGF0ZTogZm9ybWF0KG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogZGF0YS55c1xuICAgICAgICAgICAgLm1hcCgoeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgICAgICA/IHNlY29uZGFyeUZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgICAgOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSkpID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3MsXG4gICAgICB5VGlja3MsXG4gICAgICBjb2xvcnMsXG4gICAgICBsaW5lcyxcbiAgICAgIGNpcmNsZXMsXG4gICAgICBob3ZlcixcbiAgICAgIGJhcnM6IFtdLFxuICAgICAgYXJlYXM6IFtdLFxuICAgICAgYXJjczogW10sXG4gICAgICBob3Jpem9udGFsQmFyczogW10sXG4gICAgICBkYXRhTGFiZWxzLFxuICAgICAgd2F0ZXJmYWxsTGluZXM6IFtdLFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYXJlYXMoXG4gICAgY29uZmlnOiBDb25maWcsXG4gICAgYWxsRGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICApOiBSZW5kZXJlZENoYXJ0IHtcbiAgICBjb25zdCB7IGRhdGE6IHVuY2hlY2tlZERhdGEsIHZpc2libGVJbmRpY2VzIH0gPSBoaWRlKGFsbERhdGEpO1xuICAgIGlmICh1bmNoZWNrZWREYXRhLnR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBMYWJlbGVkIHNlcmllcyBhcmVuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgYXJlYSBjaGFydHNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZW1wdHlDaGFydDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5zaG93RGF0YUxhYmVscyA9PSB0cnVlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBEYXRhIGxhYmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGZvciBhbnkgc3RhY2tlZCBjaGFydCB0eXBlXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIC8vVGhpcyBhc3NpZ25tZW50IG1ha2VzIHR5cGVzY3JpcHQgcmVjb2duaXplIHRoZSBhY3R1YWwgdHlwZSAoVGltZXNlcmllc0RhdGEpXG4gICAgY29uc3QgZGF0YSA9IHVuY2hlY2tlZERhdGE7XG4gICAgY29uc3QgeFNjYWxlID0gc2NhbGVVdGModGltZXNlcmllc0RvbWFpbihkYXRhKSwgeFJhbmdlKGRpbWVuc2lvbnMsIGNvbmZpZykpO1xuICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcbiAgICBjb25zdCB0aWNrQ291bnQgPSBnZXRUaWNrQ291bnQoZGltZW5zaW9ucywgY29uZmlnKTtcbiAgICBjb25zdCB4VGlja3MgPSBnZW5lcmF0ZVhUaWNrcyhkYXRhLCB4U2NhbGUsIHRpY2tDb3VudCwgZm9ybWF0KTtcblxuICAgIGNvbnN0IHsgcGlwZSwgZnVsbFBpcGUgfSA9IGdldFBpcGVzKGNvbmZpZy52YWx1ZVR5cGUpO1xuICAgIGNvbnN0IHsgcGlwZTogc2Vjb25kYXJ5UGlwZSwgZnVsbFBpcGU6IHNlY29uZGFyeUZ1bGxQaXBlIH0gPVxuICAgICAgY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZVxuICAgICAgICA/IGdldFBpcGVzKGNvbmZpZy5zZWNvbmRhcnlWYWx1ZVR5cGUpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgcGlwZSxcbiAgICAgICAgICAgIGZ1bGxQaXBlLFxuICAgICAgICAgIH07XG5cbiAgICBjb25zdCB7IHNjYWxlLCB5VGlja3MgfSA9IGNhbGNZU2NhbGVzQW5kVGlja3MoXG4gICAgICBkYXRhLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHBpcGUsXG4gICAgICBzZWNvbmRhcnlQaXBlLFxuICAgICAgdHJ1ZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICAgIGNvbnN0IHplcm9BeGlzUG9zVmFsID0gc2NhbGUoMCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBpbmRpY2VzID0gZGF0YS54Lm1hcCgoXywgaSkgPT4gaSk7XG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBhcmVhcyA9IGRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+XG4gICAgICBhcmVhPG51bWJlcj4oXG4gICAgICAgIGkgPT4geFNjYWxlKGRhdGEueFtpXSksXG4gICAgICAgIGkgPT4gZ2V0QmFyWUluZm8oZGF0YSwgeUluZGV4LCBpLCBzY2FsZSwgdHJ1ZSkueVZhbHVlLFxuICAgICAgICBpID0+XG4gICAgICAgICAgZ2V0QmFyWUluZm8oZGF0YSwgeUluZGV4LCBpLCBzY2FsZSwgdHJ1ZSkueVZhbHVlICtcbiAgICAgICAgICBnZXRCYXJZSW5mbyhkYXRhLCB5SW5kZXgsIGksIHNjYWxlLCB0cnVlKS5oZWlnaHQsXG4gICAgICApKGluZGljZXMpLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgY29uc3QgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleChkYXRhLngsIHhTY2FsZS5pbnZlcnQocG9zLngpLmdldFRpbWUoKSk7XG4gICAgICBjb25zdCB4ID0geFNjYWxlKGRhdGEueFt4SW5kZXhdKTtcbiAgICAgIGNvbnN0IGZ1bGxZcyA9IGRhdGEueXMubWFwKChfLCBtYXBZSW5kZXgpID0+XG4gICAgICAgIGdldEJhcllJbmZvKGRhdGEsIG1hcFlJbmRleCwgeEluZGV4LCBzY2FsZSwgdHJ1ZSksXG4gICAgICApO1xuICAgICAgY29uc3QgeXMgPSBmdWxsWXMubWFwKHkgPT4geS55VmFsdWUpO1xuICAgICAgLy9UaGlzIGlzIHRoZSB5cyBhcnJheSwgYnV0IHNoaWZ0ZWQgc28gdGhhdCB0aGUgeSBwb3NpdGlvbiBmb3IgbmVnYXRpdmUgdmFsdWVzIGlzIGF3YXkgZnJvbSB0aGUgYXhpcyAoZm9yIHRoZSBob3ZlciBjaXJjbGVzKVxuICAgICAgY29uc3Qgc2hpZnRlZFlzID0gZnVsbFlzLm1hcCh5ID0+IHtcbiAgICAgICAgaWYgKHkueVZhbHVlID49IHplcm9BeGlzUG9zVmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHkueVZhbHVlICsgeS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHkueVZhbHVlO1xuICAgICAgfSk7XG4gICAgICBjb25zdCB5UG9zU2lnbiA9IHplcm9BeGlzUG9zVmFsIC0gcG9zLnk7XG4gICAgICBsZXQgdmlzaWJsZVlJbmRleCA9IC0xO1xuICAgICAgaWYgKHlQb3NTaWduIDwgMCAmJiBkYXRhLnlzLmZpbmQoeSA9PiB5LnZhbHVlcy5maW5kKHZhbCA9PiB2YWwgPCAwKSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKHlzW2ldID49IHplcm9BeGlzUG9zVmFsICYmIHlzW2ldIDwgcG9zLnkpIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHlzW2ldIDw9IHplcm9BeGlzUG9zVmFsICYmIHlzW2ldIDwgcG9zLnkpIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmlzaWJsZVlJbmRleCA9PSAtMSkge1xuICAgICAgICBpZiAocG9zLnkgPCB6ZXJvQXhpc1Bvc1ZhbCkge1xuICAgICAgICAgIHZpc2libGVZSW5kZXggPSB5cy5pbmRleE9mKE1hdGgubWluKC4uLnlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcy55ID4gemVyb0F4aXNQb3NWYWwpIHtcbiAgICAgICAgICB2aXNpYmxlWUluZGV4ID0geXMuaW5kZXhPZihNYXRoLm1heCguLi55cykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB5SW5kZXggPSB2aXNpYmxlSW5kaWNlc1t2aXNpYmxlWUluZGV4XTtcbiAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBET01SZWN0KFxuICAgICAgICBwb3MucmVjdC54ICsgeCxcbiAgICAgICAgcG9zLnJlY3QueSArIHNoaWZ0ZWRZc1t2aXNpYmxlWUluZGV4XSxcbiAgICAgICAgU01BTExfUEFERElORyxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHlzOiBzaGlmdGVkWXMsXG4gICAgICAgIHlJbmRleCxcbiAgICAgICAgdmlzaWJsZVlJbmRleCxcbiAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBkYXRlOiB1dGNGb3JtYXQoJyVCICVkLCAlWScpKG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogZGF0YS55c1xuICAgICAgICAgICAgLm1hcCgoeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgICAgICA/IHNlY29uZGFyeUZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgICAgOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSkpID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3MsXG4gICAgICB5VGlja3MsXG4gICAgICBjb2xvcnMsXG4gICAgICBhcmVhcyxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgaG92ZXIsXG4gICAgICBiYXJzOiBbXSxcbiAgICAgIGFyY3M6IFtdLFxuICAgICAgaG9yaXpvbnRhbEJhcnM6IFtdLFxuICAgICAgZGF0YUxhYmVsczogW10sXG4gICAgICB3YXRlcmZhbGxMaW5lczogW10sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBiYXJzKFxuICAgIGNvbmZpZzogQmFyQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgY29uc3QgeyBkYXRhOiB1bmNoZWNrZWREYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICBpZiAodW5jaGVja2VkRGF0YS50eXBlID09ICdsYWJlbGVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgTGFiZWxlZCBzZXJpZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIHZlcnRpY2FsIGJhciBjaGFydHNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZW1wdHlDaGFydDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5zaG93RGF0YUxhYmVscyA9PSB0cnVlICYmIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBEYXRhIGxhYmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGZvciBhbnkgc3RhY2tlZCBjaGFydCB0eXBlXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIC8vVGhpcyBhc3NpZ25tZW50IG1ha2VzIHR5cGVzY3JpcHQgcmVjb2duaXplIHRoZSBhY3R1YWwgdHlwZSAoVGltZXNlcmllc0RhdGEpXG4gICAgY29uc3QgZGF0YSA9IHVuY2hlY2tlZERhdGE7XG4gICAgY29uc3QgeyByYW5nZTogeFJhbmdlLCBiaW5TaXplIH0gPSBiYXJYUmFuZ2UoZGltZW5zaW9ucywgZGF0YSwgY29uZmlnKTtcbiAgICBjb25zdCBoYWxmQmluU2l6ZSA9IGJpblNpemUgLyAyO1xuICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlVXRjKHRpbWVzZXJpZXNEb21haW4oZGF0YSksIHhSYW5nZSk7XG4gICAgY29uc3QgZm9ybWF0ID0gKGRhdGU6IERhdGUpID0+XG4gICAgICBmb3JtYXRlZERhdGUoY29uZmlnLmRhdGVGb3JtYXQgfHwgJ2RheScsIGRhdGUpO1xuICAgIGNvbnN0IHRpY2tDb3VudCA9IGdldFRpY2tDb3VudChkaW1lbnNpb25zLCBjb25maWcpO1xuICAgIGNvbnN0IHhUaWNrcyA9IGdlbmVyYXRlWFRpY2tzKGRhdGEsIHhTY2FsZSwgdGlja0NvdW50LCBmb3JtYXQpO1xuXG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeyBwaXBlOiBzZWNvbmRhcnlQaXBlLCBmdWxsUGlwZTogc2Vjb25kYXJ5RnVsbFBpcGUgfSA9XG4gICAgICBjb25maWcuc2Vjb25kYXJ5VmFsdWVUeXBlXG4gICAgICAgID8gZ2V0UGlwZXMoY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSlcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBwaXBlLFxuICAgICAgICAgICAgZnVsbFBpcGUsXG4gICAgICAgICAgfTtcblxuICAgIGNvbnN0IHsgc2NhbGUsIHlUaWNrcyB9ID0gY2FsY1lTY2FsZXNBbmRUaWNrcyhcbiAgICAgIGRhdGEsXG4gICAgICBkaW1lbnNpb25zLFxuICAgICAgcGlwZSxcbiAgICAgIHNlY29uZGFyeVBpcGUsXG4gICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBiYXJzID0gZGF0YS55cy5tYXAoKHksIHlJbmRleCkgPT5cbiAgICAgIHkudmFsdWVzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgeyB5VmFsdWUsIGhlaWdodCB9ID0gZ2V0QmFyWUluZm8oXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICB5SW5kZXgsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnc3RhY2tlZCcsXG4gICAgICAgICk7XG4gICAgICAgIGxldCB4VmFsdWUgPSB4U2NhbGUoZGF0YS54W2luZGV4XSkgLSBoYWxmQmluU2l6ZTtcbiAgICAgICAgbGV0IHdpZHRoID0gYmluU2l6ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ2NsdXN0ZXJlZCcpIHtcbiAgICAgICAgICB3aWR0aCA9XG4gICAgICAgICAgICAoYmluU2l6ZSAtIChkYXRhLnlzLmxlbmd0aCAtIDEpICogU01BTExfUEFERElORykgLyBkYXRhLnlzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSB5SW5kZXggKiAod2lkdGggKyBTTUFMTF9QQURESU5HKTtcbiAgICAgICAgICB4VmFsdWUgPSB4VmFsdWUgKyBvZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4VmFsdWUsXG4gICAgICAgICAgeTogeVZhbHVlLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgemVyb0F4aXNQb3NWYWwgPSBzY2FsZSgwLCB0cnVlKTtcbiAgICBjb25zdCBkYXRhTGFiZWxzOiBEYXRhTGFiZWxbXSA9IGRhdGEueXMuZmxhdE1hcCgoeSwgeUluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdWJMYWJlbHM6IERhdGFMYWJlbFtdID0geS52YWx1ZXMubWFwKCh2YWwsIHhJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpc05lZ2F0aXZlQmFyID1cbiAgICAgICAgICBiYXJzW3lJbmRleF1beEluZGV4XS55ID49IHplcm9BeGlzUG9zVmFsICYmXG4gICAgICAgICAgYmFyc1t5SW5kZXhdW3hJbmRleF0uaGVpZ2h0ID4gMDtcbiAgICAgICAgY29uc3QgeU9mZnNldCA9IGlzTmVnYXRpdmVCYXJcbiAgICAgICAgICA/IFNNQUxMX1BBRERJTkcgKyBEQVRBX0xBQkVMX0hFSUdIVCArIGJhcnNbeUluZGV4XVt4SW5kZXhdLmhlaWdodFxuICAgICAgICAgIDogLVNNQUxMX1BBRERJTkc7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICAoY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIHhJbmRleClcbiAgICAgICAgICAgICAgPyBzZWNvbmRhcnlQaXBlLnRyYW5zZm9ybSh2YWwpXG4gICAgICAgICAgICAgIDogcGlwZS50cmFuc2Zvcm0odmFsKSkgPz8gJycsXG4gICAgICAgICAgeVBvczogYmFyc1t5SW5kZXhdW3hJbmRleF0ueSArIHlPZmZzZXQsXG4gICAgICAgICAgeFBvczogYmFyc1t5SW5kZXhdW3hJbmRleF0ueCArIGJhcnNbeUluZGV4XVt4SW5kZXhdLndpZHRoIC8gMixcbiAgICAgICAgICBhbmNob3I6ICdtaWRkbGUnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3ViTGFiZWxzO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gaG92ZXIocG9zOiB7IHJlY3Q6IERPTVJlY3Q7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICAgIGNvbnN0IHhJbmRleCA9IGZpbmROZWFyZXN0SW5kZXgoZGF0YS54LCB4U2NhbGUuaW52ZXJ0KHBvcy54KS5nZXRUaW1lKCkpO1xuICAgICAgY29uc3QgeCA9IHhTY2FsZShkYXRhLnhbeEluZGV4XSk7XG4gICAgICBjb25zdCB5cyA9IGRhdGEueXMubWFwKFxuICAgICAgICAoXywgbWFwWUluZGV4KSA9PlxuICAgICAgICAgIGdldEJhcllJbmZvKFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIG1hcFlJbmRleCxcbiAgICAgICAgICAgIHhJbmRleCxcbiAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnc3RhY2tlZCcsXG4gICAgICAgICAgKS55VmFsdWUsXG4gICAgICApO1xuICAgICAgY29uc3QgeVBvc1NpZ24gPSB6ZXJvQXhpc1Bvc1ZhbCAtIHBvcy55O1xuICAgICAgbGV0IHZpc2libGVZSW5kZXggPSAtMTtcbiAgICAgIGlmICh5UG9zU2lnbiA8IDAgJiYgZGF0YS55cy5maW5kKHkgPT4geS52YWx1ZXMuZmluZCh2YWwgPT4gdmFsIDwgMCkpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB5cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmICh5c1tpXSA+PSB6ZXJvQXhpc1Bvc1ZhbCAmJiB5c1tpXSA8IHBvcy55KSB7XG4gICAgICAgICAgICB2aXNpYmxlWUluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh5c1tpXSA8PSB6ZXJvQXhpc1Bvc1ZhbCAmJiB5c1tpXSA8IHBvcy55KSB7XG4gICAgICAgICAgICB2aXNpYmxlWUluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ2NsdXN0ZXJlZCcpIHtcbiAgICAgICAgdmlzaWJsZVlJbmRleCA9IGZpbmRTdWJJbmRleCh4LCBwb3MueCwgYmluU2l6ZSwgZGF0YS55cy5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgaWYgKHZpc2libGVZSW5kZXggPT0gLTEpIHtcbiAgICAgICAgaWYgKHBvcy55IDwgemVyb0F4aXNQb3NWYWwpIHtcbiAgICAgICAgICB2aXNpYmxlWUluZGV4ID0geXMuaW5kZXhPZihNYXRoLm1pbiguLi55cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MueSA+IHplcm9BeGlzUG9zVmFsKSB7XG4gICAgICAgICAgdmlzaWJsZVlJbmRleCA9IHlzLmluZGV4T2YoTWF0aC5tYXgoLi4ueXMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeUluZGV4ID0gdmlzaWJsZUluZGljZXNbdmlzaWJsZVlJbmRleF07XG4gICAgICBjb25zdCB7IHlWYWx1ZSwgaGVpZ2h0IH0gPSBnZXRCYXJZSW5mbyhcbiAgICAgICAgZGF0YSxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICk7XG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgcG9zLnJlY3QueCArIGJhcnNbdmlzaWJsZVlJbmRleF1beEluZGV4XS54IC0gU01BTExfUEFERElORyxcbiAgICAgICAgcG9zLnJlY3QueSArIHlWYWx1ZSxcbiAgICAgICAgYmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLndpZHRoICsgU01BTExfUEFERElORyAqIDIsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHlzLFxuICAgICAgICB5SW5kZXgsXG4gICAgICAgIHZpc2libGVZSW5kZXgsXG4gICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgZGF0ZTogdXRjRm9ybWF0KCclQiAlZCwgJVknKShuZXcgRGF0ZShkYXRhLnhbeEluZGV4XSkpLFxuICAgICAgICAgIG1ldHJpY3M6IGRhdGEueXNcbiAgICAgICAgICAgIC5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICBjb2xvcjogY29sb3JzW2luZGV4ICUgY29sb3JzLmxlbmd0aF0sXG4gICAgICAgICAgICAgIGxhYmVsOiB5LmxhYmVsLFxuICAgICAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgICAgICAoY2hlY2tJZlNlY29uZGFyeShkYXRhLCBpbmRleCwgeEluZGV4KVxuICAgICAgICAgICAgICAgICAgPyBzZWNvbmRhcnlGdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSlcbiAgICAgICAgICAgICAgICAgIDogZnVsbFBpcGUudHJhbnNmb3JtKHkudmFsdWVzW3hJbmRleF0pKSA/PyAnLScsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8sIGkpID0+IGNvbmZpZy5ncm91cGVkVG9vbHRpcCB8fCBpID09IHZpc2libGVZSW5kZXgpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeFRpY2tzLFxuICAgICAgeVRpY2tzLFxuICAgICAgY29sb3JzLFxuICAgICAgYmFycyxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgYXJlYXM6IFtdLFxuICAgICAgaG92ZXIsXG4gICAgICBhcmNzOiBbXSxcbiAgICAgIGhvcml6b250YWxCYXJzOiBbXSxcbiAgICAgIGRhdGFMYWJlbHMsXG4gICAgICB3YXRlcmZhbGxMaW5lczogW10sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBob3Jpem9udGFsQmFycyhcbiAgICBjb25maWc6IEJhckNvbmZpZyxcbiAgICBhbGxEYXRhOiBEYXRhLFxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXG4gICk6IFJlbmRlcmVkQ2hhcnQge1xuICAgIC8vU29tZSBvZiB0aGlzIHN0dWZmIGdldHMgY29uZnVzaW5nLCBiZWNhdXNlIHggYW5kIHkgYXJlIGVzc2VudGlhbGx5IGludmVydGVkIGhlcmVcbiAgICAvLyAgU28sIGlmIHlvdSBzZWUgYSBzaXR1YXRpb24gd2hlcmUgYSB2YXJpYWJsZSBpcyBuYW1lZCAneScsIGJ1dCByZWZlcmVuY2luZ1xuICAgIC8vICAneCcgKG9yIHZpY2UgdmVyc2EpLCB0aGF0J3Mgd2h5XG4gICAgY29uc3QgeyBkYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICAvLydNZXRyaWMnIGNoYXJ0cyBhcmUgYSBzcGVjaWFsIGNhc2UgZm9yIGhvcml6b250YWwgYmFyIGNoYXJ0cywgd2hlcmUgZWFjaCBzZXJpZXMgaXMgYWxzbyBhIGJ1Y2tldCAoYW5kIHZpY2UgdmVyc2EpXG4gICAgY29uc3QgaXNNZXRyaWNDaGFydCA9XG4gICAgICBkYXRhLngubGVuZ3RoID09IGRhdGEueXMubGVuZ3RoICYmXG4gICAgICBkYXRhLnlzLmxlbmd0aCA9PVxuICAgICAgICBkYXRhLnlzLmZpbHRlcih5ID0+IHkudmFsdWVzLmZpbHRlcih2YWwgPT4gdmFsICE9IDApLmxlbmd0aCA9PSAxKVxuICAgICAgICAgIC5sZW5ndGg7XG4gICAgaWYgKFxuICAgICAgY29uZmlnLnNob3dEYXRhTGFiZWxzID09IHRydWUgJiZcbiAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnICYmXG4gICAgICAhaXNNZXRyaWNDaGFydFxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgRGF0YSBsYWJlbHMgYXJlbid0IHN1cHBvcnRlZCBmb3IgYW55IHN0YWNrZWQgY2hhcnQgdHlwZVwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBlbXB0eUNoYXJ0O1xuICAgIH1cbiAgICBjb25zdCB7IHJhbmdlOiB5UmFuZ2UgfSA9IGJhcllSYW5nZShkaW1lbnNpb25zLCBkYXRhLCBjb25maWcpO1xuICAgIGxldCB5U2NhbGUgPVxuICAgICAgZGF0YS50eXBlID09ICdsYWJlbGVkJ1xuICAgICAgICA/IHNjYWxlTGluZWFyKGluZGV4RG9tYWluKGRhdGEpLCB5UmFuZ2UpXG4gICAgICAgIDogc2NhbGVVdGModGltZXNlcmllc0RvbWFpbihkYXRhKSwgeVJhbmdlKTtcbiAgICBjb25zdCBkYXRlRm9ybWF0ID0gKGRhdGU6IERhdGUpID0+XG4gICAgICBmb3JtYXRlZERhdGUoY29uZmlnLmRhdGVGb3JtYXQgfHwgJ2RheScsIGRhdGUpO1xuICAgIGNvbnN0IHsgcGlwZSwgZnVsbFBpcGUgfSA9IGdldFBpcGVzKGNvbmZpZy52YWx1ZVR5cGUpO1xuICAgIGNvbnN0IHsgcGlwZTogc2Vjb25kYXJ5UGlwZSwgZnVsbFBpcGU6IHNlY29uZGFyeUZ1bGxQaXBlIH0gPVxuICAgICAgY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZVxuICAgICAgICA/IGdldFBpcGVzKGNvbmZpZy5zZWNvbmRhcnlWYWx1ZVR5cGUpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgcGlwZSxcbiAgICAgICAgICAgIGZ1bGxQaXBlLFxuICAgICAgICAgIH07XG4gICAgY29uc3QgeVRpY2tzID0geVNjYWxlLnRpY2tzKE1hdGgubWF4KGRhdGEueC5sZW5ndGggLSAxLCAxKSkubWFwKHRpY2sgPT4gKHtcbiAgICAgIHk6IHlTY2FsZSh0aWNrKSxcbiAgICAgIGxhYmVsOiBpc051bWJlcih0aWNrKVxuICAgICAgICA/IGRhdGEudHlwZSA9PSAnbGFiZWxlZCdcbiAgICAgICAgICA/IGRhdGEueFt0aWNrXS5sYWJlbFxuICAgICAgICAgIDogJy0nXG4gICAgICAgIDogZGF0ZUZvcm1hdCh0aWNrKSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCB7IHNjYWxlLCB4VGlja3MgfSA9IGNhbGNYU2NhbGVzQW5kVGlja3MoXG4gICAgICBkYXRhLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHBpcGUsXG4gICAgICBzZWNvbmRhcnlQaXBlLFxuICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnc3RhY2tlZCcsXG4gICAgICBjb25maWcsXG4gICAgKTtcbiAgICBjb25zdCB6ZXJvQXhpc1Bvc1ZhbCA9IHNjYWxlKDAsIHRydWUpO1xuICAgIGNvbnN0IGNvbG9ycyA9IHZpc2libGVJbmRpY2VzLm1hcChcbiAgICAgIGkgPT4gY29uZmlnLmNvbG9yc1tpICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdLFxuICAgICk7XG4gICAgY29uc3Qgc2ltcGxpZmllZEhvcml6b250YWxCYXJzOiB7XG4gICAgICB4UG9zOiBudW1iZXI7XG4gICAgICB5UG9zOiBudW1iZXI7XG4gICAgICB3aWR0aDogbnVtYmVyO1xuICAgIH1bXVtdID0gW107XG4gICAgY29uc3QgaG9yaXpvbnRhbEJhcnMgPSBkYXRhLnlzLm1hcCgoeSwgeUluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdWJTaW1wSG9yQmFyczoge1xuICAgICAgICB4UG9zOiBudW1iZXI7XG4gICAgICAgIHlQb3M6IG51bWJlcjtcbiAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgY29uc3QgcmV0VmFsID0geS52YWx1ZXMubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB7IHhWYWx1ZSwgd2lkdGggfSA9IGdldEJhclhJbmZvKFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgeUluZGV4LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnLFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCB5VmFsdWUgPVxuICAgICAgICAgIHlTY2FsZShkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnID8gaW5kZXggOiBkYXRhLnhbaW5kZXhdKSAtXG4gICAgICAgICAgSE9SSVpPTlRBTF9CQVJfSEVJR0hUICogMS41O1xuICAgICAgICBpZiAoY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnY2x1c3RlcmVkJykge1xuICAgICAgICAgIGNvbnN0IGNlbnRlckluZGV4ID0gZGF0YS55cy5sZW5ndGggLyAyIC0gMC41O1xuICAgICAgICAgIGNvbnN0IG9mZnNldCA9XG4gICAgICAgICAgICAoeUluZGV4IC0gY2VudGVySW5kZXgpICogKEhPUklaT05UQUxfQkFSX0hFSUdIVCArIFNNQUxMX1BBRERJTkcpO1xuICAgICAgICAgIHlWYWx1ZSA9IHlWYWx1ZSArIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhvclIgPSBNYXRoLm1pbig0LCBNYXRoLmZsb29yKHdpZHRoIC8gMikpO1xuICAgICAgICBjb25zdCB2ZXJSID0gTWF0aC5taW4oNCwgTWF0aC5mbG9vcihIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLyAyKSk7XG4gICAgICAgIHN1YlNpbXBIb3JCYXJzLnB1c2goe1xuICAgICAgICAgIHhQb3M6IHhWYWx1ZSxcbiAgICAgICAgICB5UG9zOiB5VmFsdWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH0pO1xuICAgICAgICAvL0Rvbid0IGRyYXcgYW55dGhpbmcgZm9yIHplcm8tdmFsdWUgYmFyc1xuICAgICAgICBpZiAod2lkdGggPT0gMCkge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUG9zaXRpdmUgPSBkYXRhLnlzW3lJbmRleF0udmFsdWVzW2luZGV4XSA+IDA7XG4gICAgICAgIGNvbnN0IGhhc0FueU5lZ2F0aXZlQmFycyA9IGRhdGEueXNcbiAgICAgICAgICAubWFwKHkgPT4geS52YWx1ZXNbaW5kZXhdKVxuICAgICAgICAgIC5maW5kKHZhbCA9PiB2YWwgPCAwKTtcbiAgICAgICAgY29uc3QgaGFzQW55UG9zaXRpdmVCYXJzID0gZGF0YS55c1xuICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgLmZpbmQodmFsID0+IHZhbCA+IDApO1xuXG4gICAgICAgIC8vVGhlc2UgY2hlY2tzIGFyZSB0byBtYWtlIHN1cmUgd2Ugc3RpbGwgcm91bmQgaWYgYWxsIHByZXZpb3VzL2xhdGVyIHZhbHVlcyBhcmUgMFxuICAgICAgICBjb25zdCBhbGxMZWZ0WmVybyA9IGlzUG9zaXRpdmVcbiAgICAgICAgICA/IGRhdGEueXNcbiAgICAgICAgICAgICAgLnNsaWNlKDAsIHlJbmRleClcbiAgICAgICAgICAgICAgLm1hcCh5ID0+IHkudmFsdWVzW2luZGV4XSlcbiAgICAgICAgICAgICAgLmZpbHRlcih2YWwgPT4gdmFsID4gMCkubGVuZ3RoID09IDAgJiYgIWhhc0FueU5lZ2F0aXZlQmFyc1xuICAgICAgICAgIDogZGF0YS55c1xuICAgICAgICAgICAgICAuc2xpY2UoeUluZGV4ICsgMSwgZGF0YS55cy5sZW5ndGgpXG4gICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgIC5maWx0ZXIodmFsID0+IHZhbCA8IDApLmxlbmd0aCA9PSAwO1xuICAgICAgICBjb25zdCBsZWZ0U2lkZVJvdW5kID0gY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnY2x1c3RlcmVkJyB8fCBhbGxMZWZ0WmVybztcbiAgICAgICAgY29uc3QgYWxsUmlnaHRaZXJvID0gaXNQb3NpdGl2ZVxuICAgICAgICAgID8gZGF0YS55c1xuICAgICAgICAgICAgICAuc2xpY2UoeUluZGV4ICsgMSwgZGF0YS55cy5sZW5ndGgpXG4gICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgIC5maWx0ZXIodmFsID0+IHZhbCA+IDApLmxlbmd0aCA9PSAwXG4gICAgICAgICAgOiBkYXRhLnlzXG4gICAgICAgICAgICAgIC5zbGljZSgwLCB5SW5kZXgpXG4gICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgIC5maWx0ZXIodmFsID0+IHZhbCA8IDApLmxlbmd0aCA9PSAwICYmICFoYXNBbnlQb3NpdGl2ZUJhcnM7XG4gICAgICAgIGNvbnN0IHJpZ2h0U2lkZVJvdW5kID1cbiAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnIHx8IGFsbFJpZ2h0WmVybztcblxuICAgICAgICBpZiAobGVmdFNpZGVSb3VuZCAmJiByaWdodFNpZGVSb3VuZCkge1xuICAgICAgICAgIC8vQm90aC1zaWRlcyByb3VuZGluZyB2YXJpYXRpb25cbiAgICAgICAgICBjb25zdCBwYXRoRCA9IGBcbiAgICAgICAgICAgIE0gJHt4VmFsdWUgKyBob3JSfSwke3lWYWx1ZX1cbiAgICAgICAgICAgIGggJHt3aWR0aCAtIGhvclIgKiAyfVxuICAgICAgICAgICAgcSR7aG9yUn0sMCAke2hvclJ9LCR7dmVyUn1cbiAgICAgICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSB2ZXJSICogMn1cbiAgICAgICAgICAgIHEwLCR7dmVyUn0gLSR7aG9yUn0sJHt2ZXJSfVxuICAgICAgICAgICAgaCAkey0od2lkdGggLSBob3JSICogMil9XG4gICAgICAgICAgICBxLSR7aG9yUn0sMCAtJHtob3JSfSwtJHt2ZXJSfVxuICAgICAgICAgICAgdiAtJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSB2ZXJSICogMn1cbiAgICAgICAgICAgIHEwLC0ke3ZlclJ9ICR7aG9yUn0sLSR7dmVyUn1cbiAgICAgICAgICAgIFpcbiAgICAgICAgICBgO1xuICAgICAgICAgIHJldHVybiBwYXRoRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVmdFNpZGVSb3VuZCkge1xuICAgICAgICAgIC8vTGVmdC1zaWRlIHJvdW5kaW5nIHZhcmlhdGlvblxuICAgICAgICAgIGNvbnN0IHBhdGhEID0gYFxuICAgICAgICAgICAgTSAke3hWYWx1ZSArIGhvclJ9LCR7eVZhbHVlfVxuICAgICAgICAgICAgaCAke3dpZHRoIC0gaG9yUn1cbiAgICAgICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFR9XG4gICAgICAgICAgICBoICR7LSh3aWR0aCAtIGhvclIpfVxuICAgICAgICAgICAgcS0ke2hvclJ9LDAgLSR7aG9yUn0sLSR7dmVyUn1cbiAgICAgICAgICAgIHYgLSR7SE9SSVpPTlRBTF9CQVJfSEVJR0hUIC0gdmVyUiAqIDJ9XG4gICAgICAgICAgICBxMCwtJHt2ZXJSfSAke2hvclJ9LC0ke3ZlclJ9XG4gICAgICAgICAgICBaXG4gICAgICAgICAgYDtcbiAgICAgICAgICByZXR1cm4gcGF0aEQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJpZ2h0U2lkZVJvdW5kKSB7XG4gICAgICAgICAgLy9SaWdodC1zaWRlIHJvdW5kaW5nIHZhcmlhdGlvblxuICAgICAgICAgIGNvbnN0IHBhdGhEID0gYFxuICAgICAgICAgICAgTSAke3hWYWx1ZX0sJHt5VmFsdWV9XG4gICAgICAgICAgICBoICR7d2lkdGggLSBob3JSfVxuICAgICAgICAgICAgcSR7aG9yUn0sMCAke2hvclJ9LCR7dmVyUn1cbiAgICAgICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSB2ZXJSICogMn1cbiAgICAgICAgICAgIHEwLCR7dmVyUn0gLSR7aG9yUn0sJHt2ZXJSfVxuICAgICAgICAgICAgaCAkey0od2lkdGggLSBob3JSKX1cbiAgICAgICAgICAgIFpcbiAgICAgICAgICBgO1xuICAgICAgICAgIHJldHVybiBwYXRoRDtcbiAgICAgICAgfVxuICAgICAgICAvL05vLXJvdW5kaW5nIHZhcmlhdGlvblxuICAgICAgICBjb25zdCBwYXRoRCA9IGBcbiAgICAgICAgICBNICR7eFZhbHVlfSwke3lWYWx1ZX1cbiAgICAgICAgICBoICR7d2lkdGh9XG4gICAgICAgICAgdiAke0hPUklaT05UQUxfQkFSX0hFSUdIVH1cbiAgICAgICAgICBoICR7LXdpZHRofVxuICAgICAgICAgIHYgLSR7SE9SSVpPTlRBTF9CQVJfSEVJR0hUfVxuICAgICAgICAgIFpcbiAgICAgICAgYDtcbiAgICAgICAgcmV0dXJuIHBhdGhEO1xuICAgICAgfSk7XG4gICAgICBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnMucHVzaChzdWJTaW1wSG9yQmFycyk7XG4gICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeU9mZnNldCA9IEhPUklaT05UQUxfQkFSX0hFSUdIVDtcbiAgICBjb25zdCBkYXRhTGFiZWxzOiBEYXRhTGFiZWxbXSA9IGRhdGEueXMuZmxhdE1hcCgoeSwgeUluZGV4KSA9PiB7XG4gICAgICBjb25zdCBzdWJMYWJlbHM6IERhdGFMYWJlbFtdID0geS52YWx1ZXMubWFwKCh2YWwsIHhJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBiYXJJc05lZ2F0aXZlID1cbiAgICAgICAgICBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnNbeUluZGV4XVt4SW5kZXhdLnhQb3MgPCB6ZXJvQXhpc1Bvc1ZhbCAmJlxuICAgICAgICAgIHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t5SW5kZXhdW3hJbmRleF0ud2lkdGggPiAwO1xuICAgICAgICBjb25zdCB4T2Zmc2V0ID0gYmFySXNOZWdhdGl2ZVxuICAgICAgICAgID8gLVNNQUxMX1BBRERJTkdcbiAgICAgICAgICA6IHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t5SW5kZXhdW3hJbmRleF0ud2lkdGggKyBTTUFMTF9QQURESU5HO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgID8gc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odmFsKVxuICAgICAgICAgICAgICA6IHBpcGUudHJhbnNmb3JtKHZhbCkpID8/ICcnLFxuICAgICAgICAgIHlQb3M6IHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t5SW5kZXhdW3hJbmRleF0ueVBvcyArIHlPZmZzZXQsXG4gICAgICAgICAgeFBvczogc2ltcGxpZmllZEhvcml6b250YWxCYXJzW3lJbmRleF1beEluZGV4XS54UG9zICsgeE9mZnNldCxcbiAgICAgICAgICBhbmNob3I6IGJhcklzTmVnYXRpdmUgPyAnZW5kJyA6ICdzdGFydCcsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJMYWJlbHM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgbGV0IHhJbmRleDogbnVtYmVyID0gMDtcbiAgICAgIGxldCB4ID0gMDtcbiAgICAgIGlmIChjaGVja1lTY2FsZVR5cGUoeVNjYWxlLCBkYXRhLnR5cGUpICYmIGRhdGEudHlwZSAhPSAnbGFiZWxlZCcpIHtcbiAgICAgICAgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleChkYXRhLngsIHlTY2FsZS5pbnZlcnQocG9zLnkpLmdldFRpbWUoKSk7XG4gICAgICAgIHggPSB5U2NhbGUoZGF0YS54W3hJbmRleF0pIC0gU01BTExfUEFERElORztcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICFjaGVja1lTY2FsZVR5cGUoeVNjYWxlLCBkYXRhLnR5cGUpICYmXG4gICAgICAgIGRhdGEudHlwZSA9PSAnbGFiZWxlZCdcbiAgICAgICkge1xuICAgICAgICB4SW5kZXggPSBmaW5kTmVhcmVzdEluZGV4U3RyaW5nKGRhdGEueCwgeVNjYWxlLmludmVydChwb3MueSkpO1xuICAgICAgICB4ID0geVNjYWxlKHhJbmRleCkgLSBTTUFMTF9QQURESU5HO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbFlzID0gZGF0YS55cy5tYXAoKF8sIG1hcFlJbmRleCkgPT5cbiAgICAgICAgZ2V0QmFyWEluZm8oXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBtYXBZSW5kZXgsXG4gICAgICAgICAgeEluZGV4LFxuICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHlzID0gZnVsbFlzLm1hcCh5ID0+IHkueFZhbHVlKTtcbiAgICAgIGxldCB2aXNpYmxlWUluZGV4ID0gLTE7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZ1bGxZcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBsZWZ0Qm9yZGVyID0gZnVsbFlzW2ldLnhWYWx1ZTtcbiAgICAgICAgY29uc3QgcmlnaHRCb3JkZXJDYW5kaWRhdGVzID0gZnVsbFlzXG4gICAgICAgICAgLmZpbHRlcih5ID0+IHkueFZhbHVlID4gbGVmdEJvcmRlcilcbiAgICAgICAgICAubWFwKHkgPT4geS54VmFsdWUpO1xuICAgICAgICBjb25zdCByaWdodEJvcmRlciA9XG4gICAgICAgICAgcmlnaHRCb3JkZXJDYW5kaWRhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gTWF0aC5taW4oLi4ucmlnaHRCb3JkZXJDYW5kaWRhdGVzKVxuICAgICAgICAgICAgOiBsZWZ0Qm9yZGVyICsgZnVsbFlzW2ldLndpZHRoO1xuICAgICAgICBpZiAocG9zLnggPiBsZWZ0Qm9yZGVyICYmIHBvcy54IDwgcmlnaHRCb3JkZXIpIHtcbiAgICAgICAgICB2aXNpYmxlWUluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ2NsdXN0ZXJlZCcpIHtcbiAgICAgICAgdmlzaWJsZVlJbmRleCA9IGZpbmRTdWJJbmRleEhvcml6b250YWwoeCwgcG9zLnksIGRhdGEueXMubGVuZ3RoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZpc2libGVZSW5kZXggPT0gLTEpIHtcbiAgICAgICAgaWYgKHBvcy54ID4gemVyb0F4aXNQb3NWYWwpIHtcbiAgICAgICAgICB2aXNpYmxlWUluZGV4ID0geXMuaW5kZXhPZihNYXRoLm1heCguLi55cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MueCA8IHplcm9BeGlzUG9zVmFsKSB7XG4gICAgICAgICAgdmlzaWJsZVlJbmRleCA9IHlzLmluZGV4T2YoTWF0aC5taW4oLi4ueXMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeUluZGV4ID0gdmlzaWJsZUluZGljZXNbdmlzaWJsZVlJbmRleF07XG5cbiAgICAgIC8vQ2hlY2sgaWYgd2UndmUgbGFuZGVkIG9uIGEgemVyby13aWR0aCBiYXIgKG9ubHkgcmVhbGx5IHJlbGV2YW50IG9uIGVuZHMpXG4gICAgICBpZiAoXG4gICAgICAgIHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLndpZHRoID09IDAgJiZcbiAgICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnc3RhY2tlZCdcbiAgICAgICkge1xuICAgICAgICBsZXQgYWx0QmFyRm91bmQgPSBmYWxzZTtcbiAgICAgICAgLy9DaGVjayB1cHdhcmRzXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgbGV0IGkgPSB2aXNpYmxlWUluZGV4ICsgMTtcbiAgICAgICAgICBpIDwgc2ltcGxpZmllZEhvcml6b250YWxCYXJzLmxlbmd0aDtcbiAgICAgICAgICBpKytcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKGFsdEJhckZvdW5kKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1tpXVt4SW5kZXhdLndpZHRoICE9IDApIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYWx0QmFyRm91bmQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vQ2hlY2sgZG93bndhcmRzXG4gICAgICAgIGZvciAobGV0IGkgPSB2aXNpYmxlWUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAoYWx0QmFyRm91bmQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2ltcGxpZmllZEhvcml6b250YWxCYXJzW2ldW3hJbmRleF0ud2lkdGggIT0gMCkge1xuICAgICAgICAgICAgdmlzaWJsZVlJbmRleCA9IGk7XG4gICAgICAgICAgICBhbHRCYXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBET01SZWN0KFxuICAgICAgICBwb3MucmVjdC54ICtcbiAgICAgICAgICBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnNbdmlzaWJsZVlJbmRleF1beEluZGV4XS54UG9zIC1cbiAgICAgICAgICBTTUFMTF9QQURESU5HLFxuICAgICAgICBwb3MucmVjdC55ICsgc2ltcGxpZmllZEhvcml6b250YWxCYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ueVBvcyxcbiAgICAgICAgc2ltcGxpZmllZEhvcml6b250YWxCYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ud2lkdGggK1xuICAgICAgICAgIFNNQUxMX1BBRERJTkcgKiAyLFxuICAgICAgICBIT1JJWk9OVEFMX0JBUl9IRUlHSFQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeCxcbiAgICAgICAgeEluZGV4LFxuICAgICAgICB5cyxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB2aXNpYmxlWUluZGV4LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGRhdGU6XG4gICAgICAgICAgICBkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnXG4gICAgICAgICAgICAgID8gZGF0YS54W3hJbmRleF0ubGFiZWxcbiAgICAgICAgICAgICAgOiB1dGNGb3JtYXQoJyVCICVkLCAlWScpKG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogZGF0YS55c1xuICAgICAgICAgICAgLm1hcCgoeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgICAgICA/IHNlY29uZGFyeUZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgICAgOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSkpID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3M6IHhUaWNrcyxcbiAgICAgIHlUaWNrczogeVRpY2tzLFxuICAgICAgaG92ZXIsXG4gICAgICBjb2xvcnMsXG4gICAgICBiYXJzOiBbXSxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgYXJlYXM6IFtdLFxuICAgICAgYXJjczogW10sXG4gICAgICBob3Jpem9udGFsQmFycyxcbiAgICAgIGRhdGFMYWJlbHMsXG4gICAgICB3YXRlcmZhbGxMaW5lczogW10sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBhcmNzKFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgaWYgKFxuICAgICAgY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSAmJlxuICAgICAgKGNvbmZpZy52YWx1ZVR5cGUgPT0gJ3BlcmNlbnRhZ2UnIHx8XG4gICAgICAgIGNvbmZpZy5zZWNvbmRhcnlWYWx1ZVR5cGUgPT0gJ3BlcmNlbnRhZ2UnKVxuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgVHdvIGF4ZXMgd2l0aCBwZXJjZW50YWdlIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIGRvbnV0IGNoYXJ0c1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBlbXB0eUNoYXJ0O1xuICAgIH1cbiAgICBjb25zdCB7IGRhdGE6IHVuc3RhY2tlZERhdGEsIHZpc2libGVJbmRpY2VzIH0gPSBoaWRlKGFsbERhdGEpO1xuICAgIGNvbnN0IGRvbnV0RGF0YSA9IENoYXJ0LmNvbnZlcnRDaGFydERhdGFUb0RvbnV0RGF0YSh1bnN0YWNrZWREYXRhKTtcbiAgICBjb25zdCBoYXNOb25aZXJvVmFsdWUgPSBkb251dERhdGEuc29tZShkID0+IGQudmFsdWUgPiAwKTtcbiAgICBjb25zdCBhcmNEYXRhID0gaGFzTm9uWmVyb1ZhbHVlXG4gICAgICA/IGRvbnV0RGF0YVxuICAgICAgOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgdmFsdWU6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICBjb25zdCBjb2xvcnMgPSBoYXNOb25aZXJvVmFsdWVcbiAgICAgID8gdmlzaWJsZUluZGljZXMubWFwKGkgPT4gY29uZmlnLmNvbG9yc1tpICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdKVxuICAgICAgOiBbJy0tZ3JheS0zMCddO1xuICAgIGNvbnN0IHsgcGlwZSwgZnVsbFBpcGUgfSA9IGdldFBpcGVzKGNvbmZpZy52YWx1ZVR5cGUpO1xuICAgIGNvbnN0IHsgcGlwZTogc2Vjb25kYXJ5UGlwZSwgZnVsbFBpcGU6IHNlY29uZGFyeUZ1bGxQaXBlIH0gPVxuICAgICAgY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZVxuICAgICAgICA/IGdldFBpcGVzKGNvbmZpZy5zZWNvbmRhcnlWYWx1ZVR5cGUpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgcGlwZSxcbiAgICAgICAgICAgIGZ1bGxQaXBlLFxuICAgICAgICAgIH07XG5cbiAgICBjb25zdCBvdXRlciA9IChkaW1lbnNpb25zLmhlaWdodCAvIDIpICogMC43NTtcbiAgICBjb25zdCBpbm5lciA9IG91dGVyIC0gMTI7XG5cbiAgICBjb25zdCBwaWVBcmNzID0gcGllPERvbnV0RGF0YT4oKVxuICAgICAgLnNvcnRWYWx1ZXMobnVsbClcbiAgICAgIC52YWx1ZShkID0+IE1hdGgubWF4KGQudmFsdWUsIDApKShhcmNEYXRhKTtcblxuICAgIGNvbnN0IGFyY3MgPSBwaWVBcmNzLm1hcChwaWVBcmMgPT5cbiAgICAgIGFyYzxEb251dERhdGE+KClcbiAgICAgICAgLmlubmVyUmFkaXVzKGlubmVyKVxuICAgICAgICAub3V0ZXJSYWRpdXMob3V0ZXIpXG4gICAgICAgIC5wYWRBbmdsZSgwLjAxMylcbiAgICAgICAgLnN0YXJ0QW5nbGUocGllQXJjLnN0YXJ0QW5nbGUpXG4gICAgICAgIC5lbmRBbmdsZShwaWVBcmMuZW5kQW5nbGUpKHBpZUFyYy5kYXRhKSxcbiAgICApO1xuXG4gICAgY29uc3QgZGF0YUxhYmVsczogRGF0YUxhYmVsW10gPSBoYXNOb25aZXJvVmFsdWVcbiAgICAgID8gcGllQXJjcy5tYXAoYXJjID0+IHtcbiAgICAgICAgICAvL0Rvbid0IHNob3cgZGF0YSBsYWJlbHMgZm9yIHplcm8td2lkdGggZG9udXQgc2xpY2VzIChpbmNsdWRlcyBuZWdhdGl2ZSB2YWx1ZXMpXG4gICAgICAgICAgaWYgKGFyYy5zdGFydEFuZ2xlID09IGFyYy5lbmRBbmdsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbGFiZWw6ICcnLFxuICAgICAgICAgICAgICB5UG9zOiAwLFxuICAgICAgICAgICAgICB4UG9zOiAwLFxuICAgICAgICAgICAgICBhbmNob3I6ICdtaWRkbGUnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXJjQ2VudGVyQW5nbGUgPSAoYXJjLnN0YXJ0QW5nbGUgKyBhcmMuZW5kQW5nbGUpIC8gMjtcbiAgICAgICAgICBjb25zdCBlZGdlUG9pbnQgPSBhcmNUb1BvaW50KGFyY0NlbnRlckFuZ2xlLCBvdXRlcik7XG4gICAgICAgICAgY29uc3QgbGluZUVuZFBvaW50ID0gYXJjVG9Qb2ludChhcmNDZW50ZXJBbmdsZSwgb3V0ZXIgKyAxNik7XG4gICAgICAgICAgY29uc3QgbWlkZGxlQXJlYSA9IG91dGVyIC8gNDtcbiAgICAgICAgICBsZXQgeU9mZnNldCA9IDA7XG4gICAgICAgICAgbGV0IHhPZmZzZXQgPSAwO1xuICAgICAgICAgIGlmIChsaW5lRW5kUG9pbnQueSA+IDApIHtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhsaW5lRW5kUG9pbnQueSkgPCBtaWRkbGVBcmVhKSB7XG4gICAgICAgICAgICAgIHlPZmZzZXQgPSBTTUFMTF9QQURESU5HIC8gMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHlPZmZzZXQgPSBTTUFMTF9QQURESU5HO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGxpbmVFbmRQb2ludC54KSA8IG1pZGRsZUFyZWEpIHtcbiAgICAgICAgICAgICAgeU9mZnNldCArPSBTTUFMTF9QQURESU5HIC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGxpbmVFbmRQb2ludC55KSA8IG1pZGRsZUFyZWEpIHtcbiAgICAgICAgICAgICAgeU9mZnNldCA9IFNNQUxMX1BBRERJTkcgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGxpbmVFbmRQb2ludC54KSA8IG1pZGRsZUFyZWEpIHtcbiAgICAgICAgICAgICAgeU9mZnNldCAtPSBTTUFMTF9QQURESU5HIC8gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgICAoYXJjLmRhdGEuaXNTZWNvbmRhcnlcbiAgICAgICAgICAgICAgICA/IHNlY29uZGFyeVBpcGUudHJhbnNmb3JtKGFyYy5kYXRhLnZhbHVlKVxuICAgICAgICAgICAgICAgIDogcGlwZS50cmFuc2Zvcm0oYXJjLmRhdGEudmFsdWUpKSA/PyAnJyxcbiAgICAgICAgICAgIHlQb3M6IGxpbmVFbmRQb2ludC55ICsgeU9mZnNldCxcbiAgICAgICAgICAgIHhQb3M6IGxpbmVFbmRQb2ludC54ICsgeE9mZnNldCxcbiAgICAgICAgICAgIGFuY2hvcjpcbiAgICAgICAgICAgICAgTWF0aC5hYnMobGluZUVuZFBvaW50LngpIDwgbWlkZGxlQXJlYVxuICAgICAgICAgICAgICAgID8gJ21pZGRsZSdcbiAgICAgICAgICAgICAgICA6IGxpbmVFbmRQb2ludC54IDwgMFxuICAgICAgICAgICAgICAgID8gJ2VuZCdcbiAgICAgICAgICAgICAgICA6ICdzdGFydCcsXG4gICAgICAgICAgICBsaW5lOiB7XG4gICAgICAgICAgICAgIHgxOiBlZGdlUG9pbnQueCxcbiAgICAgICAgICAgICAgeTE6IGVkZ2VQb2ludC55LFxuICAgICAgICAgICAgICB4MjogbGluZUVuZFBvaW50LngsXG4gICAgICAgICAgICAgIHkyOiBsaW5lRW5kUG9pbnQueSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgIDogW107XG5cbiAgICByZXR1cm4ge1xuICAgICAgeFRpY2tzOiBbXSxcbiAgICAgIHlUaWNrczogW10sXG4gICAgICBhcmVhczogW10sXG4gICAgICBsaW5lczogW10sXG4gICAgICBjaXJjbGVzOiBbXSxcbiAgICAgIGJhcnM6IFtdLFxuICAgICAgY29sb3JzLFxuICAgICAgYXJjcyxcbiAgICAgIGhvcml6b250YWxCYXJzOiBbXSxcbiAgICAgIGRhdGFMYWJlbHMsXG4gICAgICB3YXRlcmZhbGxMaW5lczogW10sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB3YXRlcmZhbGwoXG4gICAgY29uZmlnOiBDb25maWcsXG4gICAgYWxsRGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICApOiBSZW5kZXJlZENoYXJ0IHtcbiAgICBjb25zdCB7IGRhdGE6IHVuY2hlY2tlZERhdGEsIHZpc2libGVJbmRpY2VzIH0gPSBoaWRlKGFsbERhdGEpO1xuICAgIGlmICh1bmNoZWNrZWREYXRhLnR5cGUgPT0gJ3RpbWVzZXJpZXMnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBUaW1lLWJhc2VkIHNlcmllcyBhcmVuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3Igd2F0ZXJmYWxsIGNoYXJ0c1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBlbXB0eUNoYXJ0O1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ0hlYWRzIHVwISBXYXRlcmZhbGwgY2hhcnRzIGRvIG5vdCBjdXJyZW50bHkgaGF2ZSB0d28tYXhpcyBzdXBwb3J0JyxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZW1wdHlDaGFydDtcbiAgICB9XG4gICAgLy9UaGlzIGFzc2lnbm1lbnQgbWFrZXMgdHlwZXNjcmlwdCByZWNvZ25pemUgdGhlIGFjdHVhbCB0eXBlIChUaW1lc2VyaWVzRGF0YSlcbiAgICBjb25zdCBkYXRhID0gd2F0ZXJmYWxsVHJhbnNmb3JtKHVuY2hlY2tlZERhdGEpO1xuICAgIGNvbnN0IHsgcmFuZ2U6IHhSYW5nZSwgYmluU2l6ZSB9ID0gYmFyWFJhbmdlKGRpbWVuc2lvbnMsIGRhdGEsIGNvbmZpZyk7XG4gICAgY29uc3QgaGFsZkJpblNpemUgPSBiaW5TaXplIC8gMjtcbiAgICBjb25zdCB4U2NhbGUgPSBzY2FsZUxpbmVhcihpbmRleERvbWFpbihkYXRhKSwgeFJhbmdlKTtcbiAgICBjb25zdCB0aWNrQ291bnQgPSBnZXRUaWNrQ291bnQoZGltZW5zaW9ucywgY29uZmlnKTtcbiAgICBjb25zdCB4VGlja3MgPSBnZW5lcmF0ZUxhYmVsbGVkWFRpY2tzKGRhdGEsIHhTY2FsZSwgdGlja0NvdW50KTtcblxuICAgIGNvbnN0IHsgcGlwZSwgZnVsbFBpcGUgfSA9IGdldFBpcGVzKGNvbmZpZy52YWx1ZVR5cGUpO1xuXG4gICAgY29uc3QgeyBzY2FsZSwgeVRpY2tzIH0gPSBjYWxjWVNjYWxlc0FuZFRpY2tzKFxuICAgICAgZGF0YSxcbiAgICAgIGRpbWVuc2lvbnMsXG4gICAgICBwaXBlLFxuICAgICAgcGlwZSxcbiAgICAgIHRydWUsXG4gICAgICBjb25maWcsXG4gICAgKTtcbiAgICBjb25zdCB6ZXJvQXhpc1Bvc1ZhbCA9IHNjYWxlKDAsIHRydWUpO1xuXG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBiYXJzID0gZGF0YS55cy5tYXAoKHksIHlJbmRleCkgPT5cbiAgICAgIHkudmFsdWVzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgeyB5VmFsdWUsIGhlaWdodCB9ID0gZ2V0QmFyWUluZm8oXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICB5SW5kZXgsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHhWYWx1ZSA9IHhTY2FsZShpbmRleCkgLSBoYWxmQmluU2l6ZTtcbiAgICAgICAgbGV0IHdpZHRoID0gYmluU2l6ZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiB4VmFsdWUsXG4gICAgICAgICAgeTogeVZhbHVlLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy9Nb3ZlIGJhcnMgYmFzZWQgb24gaGVpZ2h0IG9mIHByZXZpb3VzIGJhcnMgKGV4Y2VwdCB0aGUgdG90YWwgYmFyKVxuICAgIGxldCBiYXJPZmZzZXRSdW5uaW5nVG90YWwgPSAwO1xuICAgIGNvbnN0IHdhdGVyZmFsbExpbmVzOiB7XG4gICAgICB4MTogbnVtYmVyO1xuICAgICAgeDI6IG51bWJlcjtcbiAgICAgIHkxOiBudW1iZXI7XG4gICAgICB5MjogbnVtYmVyO1xuICAgIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgbGV0IGJhck9mZnNldENoYW5nZSA9IDA7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJhcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY29uc3QgYmFySXNOZWdhdGl2ZSA9XG4gICAgICAgICAgYmFyc1tqXVtpXS55ID49IHplcm9BeGlzUG9zVmFsICYmIGJhcnNbal1baV0uaGVpZ2h0ID4gMDtcbiAgICAgICAgaWYgKGJhcklzTmVnYXRpdmUpIHtcbiAgICAgICAgICBiYXJPZmZzZXRDaGFuZ2UgLT0gYmFyc1tqXVtpXS5oZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFyT2Zmc2V0Q2hhbmdlICs9IGJhcnNbal1baV0uaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGJhcnNbal1baV0ub2Zmc2V0ID0gYmFyT2Zmc2V0UnVubmluZ1RvdGFsO1xuICAgICAgICBiYXJzW2pdW2ldLnkgLT0gYmFyT2Zmc2V0UnVubmluZ1RvdGFsO1xuICAgICAgICBpZiAoaiA9PSBiYXJzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjb25zdCB4MSA9IGJhcnNbal1baV0ueCArIGJhcnNbYmFycy5sZW5ndGggLSAxXVtpXS53aWR0aDtcbiAgICAgICAgICBjb25zdCB5MSA9IGJhcnNbal1baV0ueSArIChiYXJJc05lZ2F0aXZlID8gYmFyc1tqXVtpXS5oZWlnaHQgOiAwKTtcbiAgICAgICAgICBjb25zdCB4MiA9IGJhcnNbal1baSArIDFdLng7XG4gICAgICAgICAgY29uc3QgeTIgPSB5MTtcbiAgICAgICAgICB3YXRlcmZhbGxMaW5lcy5wdXNoKHtcbiAgICAgICAgICAgIHgxLFxuICAgICAgICAgICAgeTEsXG4gICAgICAgICAgICB4MixcbiAgICAgICAgICAgIHkyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBiYXJPZmZzZXRSdW5uaW5nVG90YWwgKz0gYmFyT2Zmc2V0Q2hhbmdlO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGFMYWJlbHM6IERhdGFMYWJlbFtdID0gZGF0YS55cy5mbGF0TWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHN1YkxhYmVsczogRGF0YUxhYmVsW10gPSB5LnZhbHVlcy5tYXAoKHZhbCwgeEluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGlzTmVnYXRpdmVCYXIgPVxuICAgICAgICAgIGJhcnNbeUluZGV4XVt4SW5kZXhdLnkgPj0gemVyb0F4aXNQb3NWYWwgJiZcbiAgICAgICAgICBiYXJzW3lJbmRleF1beEluZGV4XS5oZWlnaHQgPiAwO1xuICAgICAgICBjb25zdCB5T2Zmc2V0ID0gaXNOZWdhdGl2ZUJhclxuICAgICAgICAgID8gU01BTExfUEFERElORyArIERBVEFfTEFCRUxfSEVJR0hUICsgYmFyc1t5SW5kZXhdW3hJbmRleF0uaGVpZ2h0XG4gICAgICAgICAgOiAtU01BTExfUEFERElORztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDogcGlwZS50cmFuc2Zvcm0odmFsKSA/PyAnJyxcbiAgICAgICAgICB5UG9zOiBiYXJzW3lJbmRleF1beEluZGV4XS55ICsgeU9mZnNldCxcbiAgICAgICAgICB4UG9zOiBiYXJzW3lJbmRleF1beEluZGV4XS54ICsgYmFyc1t5SW5kZXhdW3hJbmRleF0ud2lkdGggLyAyLFxuICAgICAgICAgIGFuY2hvcjogJ21pZGRsZScsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdWJMYWJlbHM7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgY29uc3QgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleFN0cmluZyhkYXRhLngsIHhTY2FsZS5pbnZlcnQocG9zLngpKTtcbiAgICAgIGNvbnN0IHggPSB4U2NhbGUoeEluZGV4KTtcbiAgICAgIGNvbnN0IHlzID0gYmFycy5tYXAoYmFyID0+IGJhclt4SW5kZXhdLnkpO1xuICAgICAgY29uc3QgeVBvc1NpZ24gPSB6ZXJvQXhpc1Bvc1ZhbCAtIHBvcy55O1xuICAgICAgbGV0IHZpc2libGVZSW5kZXggPSAtMTtcbiAgICAgIGlmICh5UG9zU2lnbiA8IDAgJiYgZGF0YS55cy5maW5kKHkgPT4geS52YWx1ZXMuZmluZCh2YWwgPT4gdmFsIDwgMCkpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSB5cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgIGlmICh5c1tpXSA+PSB6ZXJvQXhpc1Bvc1ZhbCAmJiB5c1tpXSA8IHBvcy55KSB7XG4gICAgICAgICAgICB2aXNpYmxlWUluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICh5c1tpXSA8PSB6ZXJvQXhpc1Bvc1ZhbCAmJiB5c1tpXSA8IHBvcy55KSB7XG4gICAgICAgICAgICB2aXNpYmxlWUluZGV4ID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZpc2libGVZSW5kZXggPT0gLTEpIHtcbiAgICAgICAgaWYgKHBvcy55IDwgemVyb0F4aXNQb3NWYWwpIHtcbiAgICAgICAgICB2aXNpYmxlWUluZGV4ID0geXMuaW5kZXhPZihNYXRoLm1pbiguLi55cykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3MueSA+IHplcm9BeGlzUG9zVmFsKSB7XG4gICAgICAgICAgdmlzaWJsZVlJbmRleCA9IHlzLmluZGV4T2YoTWF0aC5tYXgoLi4ueXMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeUluZGV4ID0gdmlzaWJsZUluZGljZXNbdmlzaWJsZVlJbmRleF07XG4gICAgICBjb25zdCB7IHlWYWx1ZSwgaGVpZ2h0IH0gPSBnZXRCYXJZSW5mbyhkYXRhLCB5SW5kZXgsIHhJbmRleCwgc2NhbGUsIHRydWUpO1xuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERPTVJlY3QoXG4gICAgICAgIHBvcy5yZWN0LnggKyBiYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ueCAtIFNNQUxMX1BBRERJTkcsXG4gICAgICAgIHBvcy5yZWN0LnkgKyB5VmFsdWUgLSBiYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ub2Zmc2V0LFxuICAgICAgICBiYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ud2lkdGggKyBTTUFMTF9QQURESU5HICogMixcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgsXG4gICAgICAgIHhJbmRleCxcbiAgICAgICAgeXMsXG4gICAgICAgIHlJbmRleCxcbiAgICAgICAgdmlzaWJsZVlJbmRleCxcbiAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBkYXRlOiBkYXRhLnhbeEluZGV4XS5sYWJlbCxcbiAgICAgICAgICBtZXRyaWNzOiBkYXRhLnlzXG4gICAgICAgICAgICAubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdLFxuICAgICAgICAgICAgICBsYWJlbDogeS5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6IGZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKSA/PyAnLScsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIC5maWx0ZXIoKF8sIGkpID0+IGNvbmZpZy5ncm91cGVkVG9vbHRpcCB8fCBpID09IHZpc2libGVZSW5kZXgpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgeFRpY2tzLFxuICAgICAgeVRpY2tzLFxuICAgICAgY29sb3JzLFxuICAgICAgYmFycyxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgYXJlYXM6IFtdLFxuICAgICAgaG92ZXIsXG4gICAgICBhcmNzOiBbXSxcbiAgICAgIGhvcml6b250YWxCYXJzOiBbXSxcbiAgICAgIGRhdGFMYWJlbHMsXG4gICAgICB3YXRlcmZhbGxMaW5lcyxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgTEVGVF9QQURESU5HID0gNDg7XG4gIGNvbnN0IExFRlRfUEFERElOR19XSVRIX0RBVEFfTEFCRUxTID0gNTY7XG4gIGNvbnN0IExFRlRfUEFERElOR19EQVRFID0gNjQ7XG4gIGV4cG9ydCBjb25zdCBMRUZUX1BBRERJTkdfTEFCRUxfTUFYID0gMTkyO1xuICBleHBvcnQgY29uc3QgUklHSFRfUEFERElORyA9IDQ4O1xuICBjb25zdCBSSUdIVF9QQURESU5HX0hPUklaT05UQUwgPSA5NjtcbiAgY29uc3QgVE9QX1BBRERJTkcgPSAxNjtcbiAgY29uc3QgVE9QX1BBRERJTkdfV0lUSF9EQVRBX0xBQkVMUyA9IDM2O1xuICBjb25zdCBCT1RUT01fUEFERElORyA9IDI0O1xuICBjb25zdCBCT1RUT01fUEFERElOR19XSVRIX0RBVEFfTEFCRUxTID0gNDQ7XG4gIGNvbnN0IFNNQUxMX1BBRERJTkcgPSA4O1xuICBjb25zdCBIT1JJWk9OVEFMX0JBUl9IRUlHSFQgPSA4O1xuICBjb25zdCBXSURUSF9QRVJfTEVUVEVSID0gNi41O1xuICBjb25zdCBNSU5fVElDS19TUEFDSU5HID0gMTAwO1xuICBjb25zdCBNQVhfWF9USUNLUyA9IDY7XG4gIGNvbnN0IERBVEFfTEFCRUxfSEVJR0hUID0gMTI7XG5cbiAgZnVuY3Rpb24gZ2V0VGlja0NvdW50KGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsIGNvbmZpZzogQ29uZmlnKTogbnVtYmVyIHtcbiAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9XG4gICAgICBkaW1lbnNpb25zLndpZHRoIC1cbiAgICAgIChjb25maWcuc2hvd0RhdGFMYWJlbHMgPyBMRUZUX1BBRERJTkdfV0lUSF9EQVRBX0xBQkVMUyA6IExFRlRfUEFERElORykgLVxuICAgICAgUklHSFRfUEFERElORztcbiAgICByZXR1cm4gTWF0aC5taW4oXG4gICAgICBNQVhfWF9USUNLUyxcbiAgICAgIE1hdGgubWF4KDIsIE1hdGguZmxvb3IoYXZhaWxhYmxlV2lkdGggLyBNSU5fVElDS19TUEFDSU5HKSksXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlWFRpY2tzKFxuICAgIGRhdGE6IFRpbWVzZXJpZXNEYXRhLFxuICAgIHhTY2FsZTogU2NhbGVUaW1lPG51bWJlciwgbnVtYmVyLCBuZXZlcj4sXG4gICAgdGlja0NvdW50OiBudW1iZXIsXG4gICAgZm9ybWF0OiAoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nLFxuICApOiBYVGlja1tdIHtcbiAgICBpZiAoZGF0YS54Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoZGF0YS54Lmxlbmd0aCA9PT0gMSB8fCB0aWNrQ291bnQgPD0gMSkge1xuICAgICAgcmV0dXJuIFt7IHg6IHhTY2FsZShkYXRhLnhbMF0pLCBsYWJlbDogZm9ybWF0KG5ldyBEYXRlKGRhdGEueFswXSkpIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGRhdGEueC5sZW5ndGggLSAxO1xuICAgIGNvbnN0IG51bVRpY2tzID0gTWF0aC5taW4odGlja0NvdW50LCBkYXRhLngubGVuZ3RoKTtcbiAgICBjb25zdCBzdGVwID0gbGFzdEluZGV4IC8gKG51bVRpY2tzIC0gMSk7XG5cbiAgICAvLyBBbHdheXMgaW5jbHVkZSBmaXJzdCBhbmQgbGFzdCBkYXRhIHBvaW50cy5cbiAgICAvLyBJbm5lciB0aWNrcyBhcmUgYXBwcm94aW1hdGVseSBldmVubHkgc3BhY2VkIHVzaW5nIHJvdW5kaW5nLlxuICAgIGNvbnN0IGluZGljZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UaWNrczsgaSsrKSB7XG4gICAgICBpbmRpY2VzLnB1c2goTWF0aC5yb3VuZChpICogc3RlcCkpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRpY2VzLm1hcChpID0+ICh7XG4gICAgICB4OiB4U2NhbGUoZGF0YS54W2ldKSxcbiAgICAgIGxhYmVsOiBmb3JtYXQobmV3IERhdGUoZGF0YS54W2ldKSksXG4gICAgfSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVMYWJlbGxlZFhUaWNrcyhcbiAgICBkYXRhOiBMYWJlbGVkRGF0YSxcbiAgICB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4sXG4gICAgdGlja0NvdW50OiBudW1iZXIsXG4gICk6IFhUaWNrW10ge1xuICAgIGlmIChkYXRhLngubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChkYXRhLngubGVuZ3RoID09PSAxIHx8IHRpY2tDb3VudCA8PSAxKSB7XG4gICAgICByZXR1cm4gW3sgeDogeFNjYWxlKDApLCBsYWJlbDogZGF0YS54WzBdLmxhYmVsIH1dO1xuICAgIH1cblxuICAgIGNvbnN0IHhUaWNrczogWFRpY2tbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS54Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB4VGlja3MucHVzaCh7XG4gICAgICAgIHg6IHhTY2FsZShpKSxcbiAgICAgICAgbGFiZWw6IGRhdGEueFtpXS5sYWJlbCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB4VGlja3M7XG4gIH1cblxuICBleHBvcnQgdHlwZSBEYXRhID0gTGFiZWxlZERhdGEgfCBUaW1lc2VyaWVzRGF0YTtcblxuICB0eXBlIEJhc2VEYXRhID0ge1xuICAgIHlzOiB7XG4gICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgaGlkZGVuPzogYm9vbGVhbjtcbiAgICAgIGlzU2Vjb25kYXJ5PzogYm9vbGVhbjtcbiAgICAgIHZhbHVlczogbnVtYmVyW107XG4gICAgfVtdO1xuICB9O1xuXG4gIC8vQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBob3Jpem9udGFsIGJhciBjaGFydHNcbiAgZXhwb3J0IHR5cGUgTGFiZWxlZERhdGEgPSBCYXNlRGF0YSAmIHtcbiAgICB0eXBlOiAnbGFiZWxlZCc7XG4gICAgeDogeyBsYWJlbDogc3RyaW5nOyBpc1NlY29uZGFyeT86IGJvb2xlYW4gfVtdO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFRpbWVzZXJpZXNEYXRhID0gQmFzZURhdGEgJiB7XG4gICAgdHlwZTogJ3RpbWVzZXJpZXMnO1xuICAgIHg6IG51bWJlcltdO1xuICB9O1xuXG4gIHR5cGUgRG9udXREYXRhID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgaGlkZGVuPzogYm9vbGVhbjtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIGlzU2Vjb25kYXJ5PzogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBEaW1lbnNpb25zID0ge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gIH07XG5cbiAgdHlwZSBCYXNlQ29uZmlnID0ge1xuICAgIGdyb3VwZWRUb29sdGlwOiBib29sZWFuO1xuICAgIGNvbG9yczogc3RyaW5nW107XG4gICAgYWxsb3dMZWdlbmRUb2dnbGU6IGJvb2xlYW47XG4gICAgemVyb1N0YXRlTWVzc2FnZTogc3RyaW5nO1xuICAgIHZhbHVlVHlwZTogVmFsdWVUeXBlO1xuICAgIHNlY29uZGFyeVZhbHVlVHlwZT86IFZhbHVlVHlwZTtcbiAgICB0cnVuY2F0ZUxlZ2VuZDogYm9vbGVhbjtcbiAgICBkYXRlRm9ybWF0PzogSW50ZXJ2YWw7XG4gICAgc2hvd0RhdGFMYWJlbHM/OiBib29sZWFuO1xuICB9O1xuXG4gIHR5cGUgRG9udXRDb25maWcgPSB7XG4gICAgc2l6ZTogJ3hzbWFsbCcgfCAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnO1xuICAgIGRpc3BsYXlWYWx1ZTogc3RyaW5nO1xuICAgIGRpc3BsYXlMYWJlbD86IHN0cmluZztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBDb25maWcgPSBCYXNlQ29uZmlnICZcbiAgICAoXG4gICAgICB8IHtcbiAgICAgICAgICB0eXBlOiAnbGluZScgfCAnYXJlYScgfCAnd2F0ZXJmYWxsJztcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgdHlwZTogJ2JhcicgfCAnaG9yaXpvbnRhbC1iYXInO1xuICAgICAgICAgIGdyb3VwaW5nVHlwZTogJ3N0YWNrZWQnIHwgJ2NsdXN0ZXJlZCc7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIHR5cGU6ICdkb251dCc7XG4gICAgICAgICAgZG9udXREaXNwbGF5SW5mbzogRG9udXRDb25maWc7XG4gICAgICAgIH1cbiAgICApO1xuXG4gIHR5cGUgQmFyQ29uZmlnID0gRXh0cmFjdDxDb25maWcsIHsgdHlwZTogJ2JhcicgfCAnaG9yaXpvbnRhbC1iYXInIH0+O1xuXG4gIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnOiBDb25maWcgPSB7XG4gICAgdHlwZTogJ2xpbmUnLFxuICAgIGdyb3VwZWRUb29sdGlwOiB0cnVlLFxuICAgIGNvbG9yczogZGVmYXVsdENvbG9yUGFsZXR0ZSxcbiAgICBhbGxvd0xlZ2VuZFRvZ2dsZTogZmFsc2UsXG4gICAgemVyb1N0YXRlTWVzc2FnZTogJ05vIGRhdGEgdG8gZGlzcGxheS4nLFxuICAgIHZhbHVlVHlwZTogJ2N1cnJlbmN5JyxcbiAgICB0cnVuY2F0ZUxlZ2VuZDogdHJ1ZSxcbiAgICBkYXRlRm9ybWF0OiAnZGF5JyxcbiAgfTtcblxuICBleHBvcnQgY29uc3QgZGVmYXVsdERvbnV0Q29uZmlnOiBDb25maWcgPSB7XG4gICAgdHlwZTogJ2RvbnV0JyxcbiAgICBncm91cGVkVG9vbHRpcDogdHJ1ZSxcbiAgICBjb2xvcnM6IGRlZmF1bHRDb2xvclBhbGV0dGUsXG4gICAgYWxsb3dMZWdlbmRUb2dnbGU6IGZhbHNlLFxuICAgIHplcm9TdGF0ZU1lc3NhZ2U6ICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgICB2YWx1ZVR5cGU6ICdjdXJyZW5jeScsXG4gICAgdHJ1bmNhdGVMZWdlbmQ6IHRydWUsXG4gICAgZGF0ZUZvcm1hdDogJ2RheScsXG4gICAgZG9udXREaXNwbGF5SW5mbzoge1xuICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICBkaXNwbGF5VmFsdWU6ICcnLFxuICAgIH0sXG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgQXJlYSA9IHtcbiAgICBwYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIGZpbGw6IHN0cmluZztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBYVGljayA9IHtcbiAgICB4OiBudW1iZXI7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzZWNvbmRhcnlMYWJlbD86IHN0cmluZztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBZVGljayA9IHtcbiAgICB5OiBudW1iZXI7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzZWNvbmRhcnlMYWJlbD86IHN0cmluZztcbiAgfTtcblxuICB0eXBlIFJlY3QgPSB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEJhclNlcmllcyA9IHtcbiAgICBmaWxsOiBzdHJpbmc7XG4gICAgcmVjdHM6IFJlY3RbXTtcbiAgfTtcblxuICB0eXBlIENpcmNsZSA9IHtcbiAgICBjeDogbnVtYmVyO1xuICAgIGN5OiBudW1iZXI7XG4gIH07XG5cbiAgLy8gSG92ZXIgaXMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmlld3BvcnQgeCBhbmQgeSBhbmQgcmV0dXJucyBhIHJpY2hcbiAgLy8gc2V0IG9mIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdmFsdWVzIGFyZSBiZWluZyBob3ZlcmVkIGFuZCB3aGF0IHRoZSB0b29sdGlwXG4gIC8vIHNob3VsZCBsb29rIGxpa2VcbiAgZXhwb3J0IHR5cGUgSG92ZXIgPSAocG9zOiB7IHJlY3Q6IERPTVJlY3Q7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pID0+IHtcbiAgICAvLyB0aGUgaW5kaWNlcyBpbnRvIHRoZSBkYXRhIG9mIHRoZSBjbG9zZXN0IHBvaW50XG4gICAgeEluZGV4OiBudW1iZXI7XG4gICAgLy8gd2Ugd2FudCB0byBrbm93IHdoaWNoIHZpc2libGUgeSBpbmRleCBpcyBob3ZlcmVkXG4gICAgLy8gYW5kIHdoaWNoIGFjdHVhbCB5IGluZGV4IGlzIGhvdmVyZWRcbiAgICB5SW5kZXg6IG51bWJlcjtcbiAgICB2aXNpYmxlWUluZGV4OiBudW1iZXI7XG5cbiAgICAvLyB0aGUgdmlld3BvcnQgeCBhbmQgeXMgb2YgdGhlIGhvdmVyZWQgaXRlbXNcbiAgICB4OiBudW1iZXI7XG4gICAgeXM6IG51bWJlcltdO1xuXG4gICAgdG9vbHRpcDoge1xuICAgICAgYW5jaG9yOiBET01SZWN0O1xuICAgICAgZGF0ZTogc3RyaW5nO1xuICAgICAgbWV0cmljczoge1xuICAgICAgICBjb2xvcjogc3RyaW5nO1xuICAgICAgICBsYWJlbDogc3RyaW5nO1xuICAgICAgICB2YWx1ZTogc3RyaW5nO1xuICAgICAgfVtdO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUmVuZGVyZWRDaGFydCByZXByZXNlbnRzIGFsbCBvZiB0aGUgcGFydHMgb2YgYSBjaGFydFxuICAvLyB0aGF0IGVuZCB1cCBvbiBzY3JlZW4uIEV2ZXJ5IGNoYXJ0IGhhcyB4IGFuZCB5IHRpY2tzXG4gIC8vIGFuZCBob3ZlciBmdW5jdGlvbmFsaXR5LCBldmVuIHRob3VnaCB0aGV5IG1pZ2h0IGJlXG4gIC8vIGRpZmZlcmVudCBmcm9tIGNoYXJ0IHRvIGNoYXJ0LlxuICB0eXBlIFJlbmRlcmVkQ2hhcnQgPSB7XG4gICAgeFRpY2tzOiBYVGlja1tdO1xuICAgIHlUaWNrczogWVRpY2tbXTtcbiAgICBob3Zlcj86IEhvdmVyO1xuICAgIGNvbG9yczogc3RyaW5nW107XG4gICAgbGluZXM6IChzdHJpbmcgfCBudWxsKVtdO1xuICAgIGNpcmNsZXM6IENpcmNsZVtdOyAvL0xpbmUgZmFsbGJhY2sgZm9yIGEgc2luZ2xlIHBvaW50XG4gICAgYXJlYXM6IChzdHJpbmcgfCBudWxsKVtdO1xuICAgIGJhcnM6IFJlY3RbXVtdO1xuICAgIGFyY3M6IChzdHJpbmcgfCBudWxsKVtdO1xuICAgIGhvcml6b250YWxCYXJzOiAoc3RyaW5nIHwgbnVsbClbXVtdO1xuICAgIGRhdGFMYWJlbHM6IERhdGFMYWJlbFtdO1xuICAgIHdhdGVyZmFsbExpbmVzOiB7XG4gICAgICB4MTogbnVtYmVyO1xuICAgICAgeDI6IG51bWJlcjtcbiAgICAgIHkxOiBudW1iZXI7XG4gICAgICB5MjogbnVtYmVyO1xuICAgIH1bXTtcbiAgfTtcblxuICB0eXBlIERhdGFMYWJlbCA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHhQb3M6IG51bWJlcjtcbiAgICB5UG9zOiBudW1iZXI7XG4gICAgYW5jaG9yOiAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJztcbiAgICBsaW5lPzoge1xuICAgICAgeDE6IG51bWJlcjtcbiAgICAgIHkxOiBudW1iZXI7XG4gICAgICB4MjogbnVtYmVyO1xuICAgICAgeTI6IG51bWJlcjtcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGVtcHR5Q2hhcnQ6IFJlbmRlcmVkQ2hhcnQgPSB7XG4gICAgeFRpY2tzOiBbXSxcbiAgICB5VGlja3M6IFtdLFxuICAgIGNvbG9yczogW10sXG4gICAgbGluZXM6IFtdLFxuICAgIGNpcmNsZXM6IFtdLFxuICAgIGFyZWFzOiBbXSxcbiAgICBiYXJzOiBbXSxcbiAgICBhcmNzOiBbXSxcbiAgICBob3Jpem9udGFsQmFyczogW10sXG4gICAgZGF0YUxhYmVsczogW10sXG4gICAgd2F0ZXJmYWxsTGluZXM6IFtdLFxuICB9O1xuXG4gIGZ1bmN0aW9uIHRpbWVzZXJpZXNEb21haW4oZGF0YTogVGltZXNlcmllc0RhdGEpIHtcbiAgICByZXR1cm4gW01hdGgubWluKC4uLmRhdGEueCksIE1hdGgubWF4KC4uLmRhdGEueCldO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5kZXhEb21haW4oZGF0YTogTGFiZWxlZERhdGEpIHtcbiAgICByZXR1cm4gWzAsIGRhdGEueC5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHlEb21haW4oZGF0YTogRGF0YSwgc2NhbGVGYWN0b3I6IG51bWJlciA9IDEpIHtcbiAgICBjb25zdCBtYXggPVxuICAgICAgTWF0aC5tYXgoLi4uZGF0YS55cy5tYXAoeSA9PiBNYXRoLm1heCguLi55LnZhbHVlcykpKSAqIHNjYWxlRmFjdG9yO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKC4uLmRhdGEueXMubWFwKHkgPT4gTWF0aC5taW4oLi4ueS52YWx1ZXMpKSk7XG4gICAgcmV0dXJuIFttaW4gPCAwID8gbWluIDogMCwgbWF4IDw9IDAgPyAxIDogbWF4XTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHhSYW5nZShkaW1lbnNpb25zOiBEaW1lbnNpb25zLCBjb25maWc6IENvbmZpZykge1xuICAgIHJldHVybiBbXG4gICAgICBjb25maWcuc2hvd0RhdGFMYWJlbHMgPyBMRUZUX1BBRERJTkdfV0lUSF9EQVRBX0xBQkVMUyA6IExFRlRfUEFERElORyxcbiAgICAgIGRpbWVuc2lvbnMud2lkdGggLSBSSUdIVF9QQURESU5HLFxuICAgIF07XG4gIH1cblxuICBmdW5jdGlvbiB4UmFuZ2VIb3Jpem9udGFsKFxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXG4gICAgZGF0YTogRGF0YSxcbiAgICBsYXJnZXN0TGFiZWxMZW5ndGg6IG51bWJlcixcbiAgICBjb25maWc6IENvbmZpZyxcbiAgKSB7XG4gICAgbGV0IGxlZnRQYWRkaW5nTWF4ID1cbiAgICAgIGRhdGEudHlwZSA9PSAnbGFiZWxlZCcgPyBMRUZUX1BBRERJTkdfTEFCRUxfTUFYIDogTEVGVF9QQURESU5HX0RBVEU7XG4gICAgbGV0IGxlZnRQYWRkaW5nQ2FsY3VsYXRlZCA9IGxlZnRQYWRkaW5nTWF4O1xuICAgIGlmIChkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICBjb25zdCBtYXhMYWJlbFNpemUgPSBNYXRoLm1heCguLi5kYXRhLngubWFwKHggPT4geC5sYWJlbC5sZW5ndGgpKTtcbiAgICAgIGxlZnRQYWRkaW5nQ2FsY3VsYXRlZCA9IE1hdGgubWluKFxuICAgICAgICBsZWZ0UGFkZGluZ01heCxcbiAgICAgICAgbWF4TGFiZWxTaXplICogV0lEVEhfUEVSX0xFVFRFUixcbiAgICAgICk7XG4gICAgfVxuICAgIC8vU3BhY2UgYmV0d2VlbiBsYWJlbCBhbmQgY2hhcnRcbiAgICBsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQgPSBsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQgKyBTTUFMTF9QQURESU5HO1xuXG4gICAgLy9JZiBkYXRhIGxhYmVscyBhcmUgb24sIGFuZCB3ZSBoYXZlIG5lZ2F0aXZlIGJhcnMsIHdlIG5lZWQgZXZlbiBtb3JlIGxlZnQgcGFkZGluZ1xuICAgIGNvbnN0IGRhdGFMYWJlbFBhZGRpbmcgPVxuICAgICAgY29uZmlnLnNob3dEYXRhTGFiZWxzICYmIGRhdGEueXMuZmluZCh5ID0+IHkudmFsdWVzLmZpbmQodmFsID0+IHZhbCA8IDApKVxuICAgICAgICA/IGxhcmdlc3RMYWJlbExlbmd0aCAqIFdJRFRIX1BFUl9MRVRURVJcbiAgICAgICAgOiAwO1xuICAgIHJldHVybiBbXG4gICAgICBNYXRoLm1heChsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQsIExFRlRfUEFERElORykgKyBkYXRhTGFiZWxQYWRkaW5nLFxuICAgICAgZGltZW5zaW9ucy53aWR0aCAtIFJJR0hUX1BBRERJTkdfSE9SSVpPTlRBTCxcbiAgICBdO1xuICB9XG5cbiAgZnVuY3Rpb24gYmFyWFJhbmdlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsIGRhdGE6IERhdGEsIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgY29uc3QgbGVmdCA9IGNvbmZpZy5zaG93RGF0YUxhYmVsc1xuICAgICAgPyBMRUZUX1BBRERJTkdfV0lUSF9EQVRBX0xBQkVMU1xuICAgICAgOiBMRUZUX1BBRERJTkc7XG4gICAgY29uc3QgcmlnaHQgPSBkaW1lbnNpb25zLndpZHRoIC0gUklHSFRfUEFERElORztcbiAgICBjb25zdCB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICBjb25zdCBiaW5TaXplID0gd2lkdGggLyAoZGF0YS54Lmxlbmd0aCB8fCAxKTtcbiAgICBjb25zdCBoYWxmQmluU2l6ZSA9IGJpblNpemUgLyAyO1xuICAgIGNvbnN0IHJhbmdlID0gW2xlZnQgKyBoYWxmQmluU2l6ZSwgcmlnaHQgLSBoYWxmQmluU2l6ZV07XG4gICAgcmV0dXJuIHsgYmluU2l6ZTogTWF0aC5taW4oYmluU2l6ZSAqIDAuNywgODApLCByYW5nZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gYmFyWVJhbmdlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsIGRhdGE6IERhdGEsIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgY29uc3QgdG9wID1cbiAgICAgIGRpbWVuc2lvbnMuaGVpZ2h0IC1cbiAgICAgIChjb25maWcuc2hvd0RhdGFMYWJlbHMgPyBUT1BfUEFERElOR19XSVRIX0RBVEFfTEFCRUxTIDogVE9QX1BBRERJTkcpO1xuICAgIGNvbnN0IGJvdHRvbSA9IEJPVFRPTV9QQURESU5HO1xuICAgIGNvbnN0IGhlaWdodCA9IHRvcCAtIGJvdHRvbTtcbiAgICBjb25zdCBiaW5TaXplID0gaGVpZ2h0IC8gKGRhdGEueC5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgaGFsZkJpblNpemUgPSBiaW5TaXplIC8gMjtcbiAgICBjb25zdCByYW5nZSA9IFtib3R0b20gKyBoYWxmQmluU2l6ZSwgdG9wIC0gaGFsZkJpblNpemVdO1xuICAgIHJldHVybiB7IHJhbmdlIH07XG4gIH1cblxuICBmdW5jdGlvbiB5UmFuZ2UoZGltZW5zaW9uczogRGltZW5zaW9ucywgY29uZmlnOiBDb25maWcsIGRhdGE6IERhdGEpIHtcbiAgICBjb25zdCBleHRyYUJvdHRvbVBhZGRpbmcgPVxuICAgICAgY29uZmlnLnNob3dEYXRhTGFiZWxzICYmXG4gICAgICBkYXRhLnlzLmZpbmQoeSA9PiB5LnZhbHVlcy5maW5kKHZhbCA9PiB2YWwgPCAwKSkgJiZcbiAgICAgIChjb25maWcudHlwZSA9PSAnYmFyJyB8fCBjb25maWcudHlwZSA9PSAnd2F0ZXJmYWxsJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGRpbWVuc2lvbnMuaGVpZ2h0IC1cbiAgICAgICAgKGV4dHJhQm90dG9tUGFkZGluZyA/IEJPVFRPTV9QQURESU5HX1dJVEhfREFUQV9MQUJFTFMgOiBCT1RUT01fUEFERElORyksXG4gICAgICBjb25maWcuc2hvd0RhdGFMYWJlbHMgPyBUT1BfUEFERElOR19XSVRIX0RBVEFfTEFCRUxTIDogVE9QX1BBRERJTkcsXG4gICAgXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbGNZU2NhbGVzQW5kVGlja3MoXG4gICAgZGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICAgIHBpcGU6IE51bWJlclBpcGUgfCBTbWFsbEN1cnJlbmN5UGlwZSB8IFBlcmNlbnRhZ2VQaXBlIHwgRGF5c1BpcGUsXG4gICAgc2Vjb25kYXJ5UGlwZTogTnVtYmVyUGlwZSB8IFNtYWxsQ3VycmVuY3lQaXBlIHwgUGVyY2VudGFnZVBpcGUgfCBEYXlzUGlwZSxcbiAgICBpc1N0YWNrZWQ6IGJvb2xlYW4sXG4gICAgY29uZmlnOiBDb25maWcsXG4gICk6IHtcbiAgICB5U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj47XG4gICAgeVNjYWxlU2Vjb25kYXJ5OiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICAgIHNjYWxlOiAoaW5wdXQ6IG51bWJlciwgaXNTZWNvbmRhcnk6IGJvb2xlYW4gfCB1bmRlZmluZWQpID0+IG51bWJlcjtcbiAgICB5VGlja3M6IFlUaWNrW107XG4gIH0ge1xuICAgIGNvbnN0IHByaW1hcnlEYXRhID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHlzOiBkYXRhLnlzLmZpbHRlcih5ID0+ICF5LmlzU2Vjb25kYXJ5KSxcbiAgICB9O1xuICAgIGNvbnN0IHNlY29uZGFyeURhdGEgPSB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgeXM6IGRhdGEueXMuZmlsdGVyKHkgPT4geS5pc1NlY29uZGFyeSksXG4gICAgfTtcbiAgICBjb25zdCBzY2FsZVJhbmdlID0geVJhbmdlKGRpbWVuc2lvbnMsIGNvbmZpZywgZGF0YSk7XG5cbiAgICAvL1NpbXBsZXIgcGF0aCBmb3IgZGF0YSB3L28gc2Vjb25kYXJpZXNcbiAgICBpZiAoc2Vjb25kYXJ5RGF0YS55cy5sZW5ndGggPT0gMCkge1xuICAgICAgY29uc3QgZGF0YSA9IGlzU3RhY2tlZCA/IHN0YWNrKHByaW1hcnlEYXRhKSA6IHByaW1hcnlEYXRhO1xuICAgICAgY29uc3QgeVNjYWxlID0gc2NhbGVMaW5lYXIoeURvbWFpbihkYXRhKSwgc2NhbGVSYW5nZSk7XG4gICAgICBjb25zdCB5VGlja3M6IFlUaWNrW10gPSB5U2NhbGUudGlja3MoNSkubWFwKHRpY2sgPT4gKHtcbiAgICAgICAgeTogeVNjYWxlKHRpY2spLFxuICAgICAgICBsYWJlbDogcGlwZS50cmFuc2Zvcm0odGljayksXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBzY2FsZSA9IChpbnB1dDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHlTY2FsZShpbnB1dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeVNjYWxlLFxuICAgICAgICB5U2NhbGVTZWNvbmRhcnk6IHlTY2FsZSxcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIHlUaWNrcyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHNjYWxlRG9tYWluTXVsdGlwbGUgPSAxO1xuICAgIC8vQ2FsY3VsYXRpbmcgaG93IG11Y2ggd2UgbmVlZCB0byBtdWx0aXBsZSB0aGUgZG9tYWluIGJ5IHRvICdmaXQnIGJvdGggYXhlcycgZGF0YVxuICAgIGlmIChpc1N0YWNrZWQpIHtcbiAgICAgIC8vU3RhY2tpbmcgZWFjaCBpbmRpdmlkdWFsIGRhdGEgdHlwZSBtYWtlcyBmaW5kaW5nIHRoZSBtYXggZWFzaWVyXG4gICAgICBjb25zdCBwcmltYXJ5U3RhY2tlZCA9IHN0YWNrKHByaW1hcnlEYXRhKTtcbiAgICAgIGNvbnN0IHNlY29uZGFyeVN0YWNrZWQgPSBzdGFjayhzZWNvbmRhcnlEYXRhKTtcbiAgICAgIGNvbnN0IHByaW1hcnlEYXRhTWF4ID0gTWF0aC5tYXgoXG4gICAgICAgIC4uLnByaW1hcnlTdGFja2VkLnlzLm1hcCh5ID0+IE1hdGgubWF4KC4uLnkudmFsdWVzKSksXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Vjb25kYXJ5RGF0YU1heCA9IE1hdGgubWF4KFxuICAgICAgICAuLi5zZWNvbmRhcnlTdGFja2VkLnlzLm1hcCh5ID0+IE1hdGgubWF4KC4uLnkudmFsdWVzKSksXG4gICAgICApO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmltYXJ5U3RhY2tlZC54Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWwgPSBNYXRoLm1heCguLi5wcmltYXJ5U3RhY2tlZC55cy5tYXAoeSA9PiB5LnZhbHVlc1tpXSkpO1xuICAgICAgICBjb25zdCBzZWNvbmRhcnlWYWwgPSBNYXRoLm1heChcbiAgICAgICAgICAuLi5zZWNvbmRhcnlTdGFja2VkLnlzLm1hcCh5ID0+IHkudmFsdWVzW2ldKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeVJhdGlvID1cbiAgICAgICAgICBwcmltYXJ5RGF0YU1heCAhPSAwID8gcHJpbWFyeVZhbCAvIHByaW1hcnlEYXRhTWF4IDogMDtcbiAgICAgICAgY29uc3Qgc2Vjb25kYXJ5UmF0aW8gPVxuICAgICAgICAgIHNlY29uZGFyeURhdGFNYXggIT0gMCA/IHNlY29uZGFyeVZhbCAvIHNlY29uZGFyeURhdGFNYXggOiAwO1xuICAgICAgICBjb25zdCBtdWx0VmFsID0gcHJpbWFyeVJhdGlvICsgc2Vjb25kYXJ5UmF0aW87XG4gICAgICAgIGlmIChtdWx0VmFsID4gc2NhbGVEb21haW5NdWx0aXBsZSkge1xuICAgICAgICAgIHNjYWxlRG9tYWluTXVsdGlwbGUgPSBtdWx0VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlZRG9tYWluID0geURvbWFpbihcbiAgICAgIGlzU3RhY2tlZCA/IHN0YWNrKHByaW1hcnlEYXRhKSA6IHByaW1hcnlEYXRhLFxuICAgICAgc2NhbGVEb21haW5NdWx0aXBsZSxcbiAgICApO1xuXG4gICAgLy9GaWd1cmluZyBvdXQgdGhlIGJlc3QgdGljayBjb3VudCB0byBmaXQgdGhlIHR3byBkYXRhIHNyb3VjZXNcbiAgICBjb25zdCB5U2NhbGVQcmltYXJ5UHJvdG8gPSBzY2FsZUxpbmVhcihwcmltYXJ5WURvbWFpbiwgc2NhbGVSYW5nZSk7XG4gICAgY29uc3QgeVNjYWxlU2Vjb25kYXJ5UHJvdG8gPSBzY2FsZUxpbmVhcihcbiAgICAgIHlEb21haW4oXG4gICAgICAgIGlzU3RhY2tlZCA/IHN0YWNrKHNlY29uZGFyeURhdGEpIDogc2Vjb25kYXJ5RGF0YSxcbiAgICAgICAgc2NhbGVEb21haW5NdWx0aXBsZSxcbiAgICAgICksXG4gICAgICBzY2FsZVJhbmdlLFxuICAgICk7XG4gICAgY29uc3QgdGlja0NvdW50ID0gTWF0aC5tYXgoXG4gICAgICA1LFxuICAgICAgeVNjYWxlUHJpbWFyeVByb3RvLnRpY2tzKDUpLmxlbmd0aCxcbiAgICAgIHlTY2FsZVNlY29uZGFyeVByb3RvLnRpY2tzKDUpLmxlbmd0aCxcbiAgICApO1xuXG4gICAgLy9GaW5kaW5nIGEgZG9tYWluIGZvciB0aGUgc2Vjb25kYXJ5IGRhdGEgc3VjaCB0aGF0IGl0IHdpbGwgcmVzdWx0IGluIHJvdW5kIHRpY2sgdmFsdWVzIHdoZW4gbWF0Y2hlZCB3aXRoIHRoZSBwcmltYXJ5IHRpY2tzXG4gICAgY29uc3Qgc2Vjb25kYXJ5VGlja3NQcm90byA9IHlTY2FsZVNlY29uZGFyeVByb3RvXG4gICAgICAudGlja3ModGlja0NvdW50KVxuICAgICAgLm1hcCh0aWNrID0+ICh7XG4gICAgICAgIHk6IHlTY2FsZVNlY29uZGFyeVByb3RvKHRpY2spLFxuICAgICAgICByYXdZOiB0aWNrLFxuICAgICAgICBsYWJlbDogc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odGljayksXG4gICAgICB9KSk7XG4gICAgY29uc3QgeVNjYWxlRG9tYWluTWF4ID0gTWF0aC5tYXgoLi4ucHJpbWFyeVlEb21haW4pO1xuICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKHByaW1hcnlZRG9tYWluLCBzY2FsZVJhbmdlKTtcbiAgICBjb25zdCB5U2NhbGVUaWNrTWF4ID0gTWF0aC5tYXgoLi4ueVNjYWxlLnRpY2tzKHRpY2tDb3VudCkpO1xuICAgIGNvbnN0IHNlY29uZGFyeUdhcCA9XG4gICAgICBzZWNvbmRhcnlUaWNrc1Byb3RvWzFdLnJhd1kgLSBzZWNvbmRhcnlUaWNrc1Byb3RvWzBdLnJhd1k7XG4gICAgY29uc3QgZ2FwQ291bnQgPSB5U2NhbGUudGlja3ModGlja0NvdW50KS5sZW5ndGggLSAxO1xuICAgIGxldCBjYWxjTWF4ID0gc2Vjb25kYXJ5R2FwICogZ2FwQ291bnQ7XG4gICAgY29uc3QgdGlja01heCA9IE1hdGgubWF4KFxuICAgICAgLi4uc2Vjb25kYXJ5VGlja3NQcm90by5tYXAoc2VjVGljayA9PiBzZWNUaWNrLnJhd1kpLFxuICAgICk7XG4gICAgd2hpbGUgKGNhbGNNYXggPCB0aWNrTWF4KSB7XG4gICAgICBjYWxjTWF4ID0gY2FsY01heCAqIDI7XG4gICAgfVxuICAgIHdoaWxlIChjYWxjTWF4ID4gdGlja01heCAqIDIpIHtcbiAgICAgIGNhbGNNYXggPSBjYWxjTWF4IC8gMjtcbiAgICB9XG4gICAgY29uc3QgeVNjYWxlU2Vjb25kYXJ5ID0gc2NhbGVMaW5lYXIoXG4gICAgICBbMCwgY2FsY01heCAqICh5U2NhbGVEb21haW5NYXggLyB5U2NhbGVUaWNrTWF4KV0sXG4gICAgICBzY2FsZVJhbmdlLFxuICAgICk7XG5cbiAgICBjb25zdCB5VGlja3M6IFlUaWNrW10gPSB5U2NhbGUudGlja3ModGlja0NvdW50KS5tYXAodGljayA9PiAoe1xuICAgICAgeTogeVNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgICAgc2Vjb25kYXJ5TGFiZWw6IHNlY29uZGFyeVBpcGUudHJhbnNmb3JtKFxuICAgICAgICB5U2NhbGVTZWNvbmRhcnkuaW52ZXJ0KHlTY2FsZSh0aWNrKSksXG4gICAgICApLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHNjYWxlID0gKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKTogbnVtYmVyID0+IHtcbiAgICAgIGlmIChpc1NlY29uZGFyeSkge1xuICAgICAgICByZXR1cm4geVNjYWxlU2Vjb25kYXJ5KGlucHV0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB5U2NhbGUoaW5wdXQpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHlTY2FsZSxcbiAgICAgIHlTY2FsZVNlY29uZGFyeSxcbiAgICAgIHNjYWxlLFxuICAgICAgeVRpY2tzLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjWFNjYWxlc0FuZFRpY2tzKFxuICAgIGRhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgICBwaXBlOiBOdW1iZXJQaXBlIHwgU21hbGxDdXJyZW5jeVBpcGUgfCBQZXJjZW50YWdlUGlwZSB8IERheXNQaXBlLFxuICAgIHNlY29uZGFyeVBpcGU6IE51bWJlclBpcGUgfCBTbWFsbEN1cnJlbmN5UGlwZSB8IFBlcmNlbnRhZ2VQaXBlIHwgRGF5c1BpcGUsXG4gICAgaXNTdGFja2VkOiBib29sZWFuLFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICApOiB7XG4gICAgeFNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICAgIHhTY2FsZVNlY29uZGFyeTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgICBzY2FsZTogKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBudW1iZXI7XG4gICAgeFRpY2tzOiBYVGlja1tdO1xuICB9IHtcbiAgICBjb25zdCBwcmltYXJ5RGF0YSA9IGNvbnZlcnREYXRhVG9KdXN0T25lVmFsdWVUeXBlKGRhdGEsIGZhbHNlKTtcbiAgICBjb25zdCBzZWNvbmRhcnlEYXRhID0gY29udmVydERhdGFUb0p1c3RPbmVWYWx1ZVR5cGUoZGF0YSwgdHJ1ZSk7XG5cbiAgICBjb25zdCBsYXJnZXN0TGFiZWxMZW5ndGggPSBNYXRoLm1heChcbiAgICAgIC4uLmRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+XG4gICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgIC4uLnkudmFsdWVzLm1hcChcbiAgICAgICAgICAgICh2YWwsIHhJbmRleCkgPT5cbiAgICAgICAgICAgICAgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgICAgPyBzZWNvbmRhcnlQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgIDogcGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSlcbiAgICAgICAgICAgICAgKS5sZW5ndGgsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBzY2FsZVJhbmdlID0geFJhbmdlSG9yaXpvbnRhbChcbiAgICAgIGRpbWVuc2lvbnMsXG4gICAgICBkYXRhLFxuICAgICAgbGFyZ2VzdExhYmVsTGVuZ3RoLFxuICAgICAgY29uZmlnLFxuICAgICk7XG5cbiAgICAvL1NpbXBsZXIgcGF0aCBmb3IgZGF0YSB3L28gc2Vjb25kYXJpZXNcbiAgICBpZiAoIXNlY29uZGFyeURhdGEueXMuZmluZCh5ID0+IHkudmFsdWVzLmZpbmQodmFsID0+IHZhbCAhPSAwKSkpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBpc1N0YWNrZWQgPyBzdGFjayhwcmltYXJ5RGF0YSkgOiBwcmltYXJ5RGF0YTtcbiAgICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlTGluZWFyKHlEb21haW4oZGF0YSksIHNjYWxlUmFuZ2UpO1xuICAgICAgY29uc3QgeFRpY2tzOiBYVGlja1tdID0geFNjYWxlLnRpY2tzKDUpLm1hcCh0aWNrID0+ICh7XG4gICAgICAgIHg6IHhTY2FsZSh0aWNrKSxcbiAgICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgICAgfSkpO1xuXG4gICAgICBjb25zdCBzY2FsZSA9IChpbnB1dDogbnVtYmVyKTogbnVtYmVyID0+IHtcbiAgICAgICAgcmV0dXJuIHhTY2FsZShpbnB1dCk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeFNjYWxlLFxuICAgICAgICB4U2NhbGVTZWNvbmRhcnk6IHhTY2FsZSxcbiAgICAgICAgc2NhbGUsXG4gICAgICAgIHhUaWNrcyxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBzY2FsZURvbWFpbk11bHRpcGxlID0gMTtcblxuICAgIC8vQ2FsY3VsYXRpbmcgaG93IG11Y2ggd2UgbmVlZCB0byBtdWx0aXBsZSB0aGUgZG9tYWluIGJ5IHRvICdmaXQnIGJvdGggYXhlcycgZGF0YVxuICAgIGlmIChpc1N0YWNrZWQpIHtcbiAgICAgIC8vU3RhY2tpbmcgZWFjaCBpbmRpdmlkdWFsIGRhdGEgdHlwZSBtYWtlcyBmaW5kaW5nIHRoZSBtYXggZWFzaWVyXG4gICAgICBjb25zdCBwcmltYXJ5U3RhY2tlZCA9IHN0YWNrKHByaW1hcnlEYXRhKTtcbiAgICAgIGNvbnN0IHNlY29uZGFyeVN0YWNrZWQgPSBzdGFjayhzZWNvbmRhcnlEYXRhKTtcbiAgICAgIGNvbnN0IHByaW1hcnlEYXRhTWF4ID0gTWF0aC5tYXgoXG4gICAgICAgIC4uLnByaW1hcnlTdGFja2VkLnlzLm1hcCh5ID0+IE1hdGgubWF4KC4uLnkudmFsdWVzKSksXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Vjb25kYXJ5RGF0YU1heCA9IE1hdGgubWF4KFxuICAgICAgICAuLi5zZWNvbmRhcnlTdGFja2VkLnlzLm1hcCh5ID0+IE1hdGgubWF4KC4uLnkudmFsdWVzKSksXG4gICAgICApO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmltYXJ5U3RhY2tlZC54Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWwgPSBNYXRoLm1heCguLi5wcmltYXJ5U3RhY2tlZC55cy5tYXAoeSA9PiB5LnZhbHVlc1tpXSkpO1xuICAgICAgICBjb25zdCBzZWNvbmRhcnlWYWwgPSBNYXRoLm1heChcbiAgICAgICAgICAuLi5zZWNvbmRhcnlTdGFja2VkLnlzLm1hcCh5ID0+IHkudmFsdWVzW2ldKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbXVsdFZhbCA9XG4gICAgICAgICAgcHJpbWFyeVZhbCAvIHByaW1hcnlEYXRhTWF4ICsgc2Vjb25kYXJ5VmFsIC8gc2Vjb25kYXJ5RGF0YU1heDtcbiAgICAgICAgaWYgKG11bHRWYWwgPiBzY2FsZURvbWFpbk11bHRpcGxlKSB7XG4gICAgICAgICAgc2NhbGVEb21haW5NdWx0aXBsZSA9IG11bHRWYWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJpbWFyeVhEb21haW4gPSB5RG9tYWluKFxuICAgICAgaXNTdGFja2VkID8gc3RhY2socHJpbWFyeURhdGEpIDogcHJpbWFyeURhdGEsXG4gICAgICBzY2FsZURvbWFpbk11bHRpcGxlLFxuICAgICk7XG4gICAgY29uc3QgeFNjYWxlUHJpbWFyeVByb3RvID0gc2NhbGVMaW5lYXIocHJpbWFyeVhEb21haW4sIHNjYWxlUmFuZ2UpO1xuICAgIGNvbnN0IHhTY2FsZVNlY29uZGFyeVByb3RvID0gc2NhbGVMaW5lYXIoXG4gICAgICB5RG9tYWluKFxuICAgICAgICBpc1N0YWNrZWQgPyBzdGFjayhzZWNvbmRhcnlEYXRhKSA6IHNlY29uZGFyeURhdGEsXG4gICAgICAgIHNjYWxlRG9tYWluTXVsdGlwbGUsXG4gICAgICApLFxuICAgICAgc2NhbGVSYW5nZSxcbiAgICApO1xuICAgIGNvbnN0IHRpY2tDb3VudCA9IE1hdGgubWF4KFxuICAgICAgNSxcbiAgICAgIHhTY2FsZVByaW1hcnlQcm90by50aWNrcyg1KS5sZW5ndGgsXG4gICAgICB4U2NhbGVTZWNvbmRhcnlQcm90by50aWNrcyg1KS5sZW5ndGgsXG4gICAgKTtcblxuICAgIC8vRmluZGluZyBhIGRvbWFpbiBmb3IgdGhlIHNlY29uZGFyeSBkYXRhIHN1Y2ggdGhhdCBpdCB3aWxsIHJlc3VsdCBpbiByb3VuZCB0aWNrIHZhbHVlcyB3aGVuIG1hdGNoZWQgd2l0aCB0aGUgcHJpbWFyeSB0aWNrc1xuICAgIGNvbnN0IHNlY29uZGFyeVRpY2tzUHJvdG8gPSB4U2NhbGVTZWNvbmRhcnlQcm90b1xuICAgICAgLnRpY2tzKHRpY2tDb3VudClcbiAgICAgIC5tYXAodGljayA9PiAoe1xuICAgICAgICB4OiB4U2NhbGVTZWNvbmRhcnlQcm90byh0aWNrKSxcbiAgICAgICAgcmF3WDogdGljayxcbiAgICAgICAgbGFiZWw6IHNlY29uZGFyeVBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgICAgfSkpO1xuICAgIGNvbnN0IHhTY2FsZURvbWFpbk1heCA9IE1hdGgubWF4KC4uLnByaW1hcnlYRG9tYWluKTtcbiAgICBjb25zdCB4U2NhbGUgPSBzY2FsZUxpbmVhcihwcmltYXJ5WERvbWFpbiwgc2NhbGVSYW5nZSk7XG4gICAgY29uc3QgeFNjYWxlVGlja01heCA9IE1hdGgubWF4KC4uLnhTY2FsZS50aWNrcyh0aWNrQ291bnQpKTtcbiAgICBjb25zdCBzZWNvbmRhcnlHYXAgPVxuICAgICAgc2Vjb25kYXJ5VGlja3NQcm90b1sxXS5yYXdYIC0gc2Vjb25kYXJ5VGlja3NQcm90b1swXS5yYXdYO1xuICAgIGNvbnN0IGdhcENvdW50ID0geFNjYWxlLnRpY2tzKHRpY2tDb3VudCkubGVuZ3RoIC0gMTtcbiAgICBsZXQgY2FsY01heCA9IHNlY29uZGFyeUdhcCAqIGdhcENvdW50O1xuICAgIGNvbnN0IHRpY2tNYXggPSBNYXRoLm1heChcbiAgICAgIC4uLnNlY29uZGFyeVRpY2tzUHJvdG8ubWFwKHNlY1RpY2sgPT4gc2VjVGljay5yYXdYKSxcbiAgICApO1xuICAgIHdoaWxlIChjYWxjTWF4IDwgdGlja01heCkge1xuICAgICAgY2FsY01heCA9IGNhbGNNYXggKiAyO1xuICAgIH1cbiAgICB3aGlsZSAoY2FsY01heCA+IHRpY2tNYXggKiAyKSB7XG4gICAgICBjYWxjTWF4ID0gY2FsY01heCAvIDI7XG4gICAgfVxuICAgIGNvbnN0IHhTY2FsZVNlY29uZGFyeSA9IHNjYWxlTGluZWFyKFxuICAgICAgWzAsIGNhbGNNYXggKiAoeFNjYWxlRG9tYWluTWF4IC8geFNjYWxlVGlja01heCldLFxuICAgICAgc2NhbGVSYW5nZSxcbiAgICApO1xuXG4gICAgY29uc3QgeFRpY2tzOiBYVGlja1tdID0geFNjYWxlLnRpY2tzKHRpY2tDb3VudCkubWFwKHRpY2sgPT4gKHtcbiAgICAgIHg6IHhTY2FsZSh0aWNrKSxcbiAgICAgIGxhYmVsOiBwaXBlLnRyYW5zZm9ybSh0aWNrKSxcbiAgICAgIHNlY29uZGFyeUxhYmVsOiBzZWNvbmRhcnlQaXBlLnRyYW5zZm9ybShcbiAgICAgICAgeFNjYWxlU2Vjb25kYXJ5LmludmVydCh4U2NhbGUodGljaykpLFxuICAgICAgKSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzY2FsZSA9IChpbnB1dDogbnVtYmVyLCBpc1NlY29uZGFyeTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoaXNTZWNvbmRhcnkpIHtcbiAgICAgICAgcmV0dXJuIHhTY2FsZVNlY29uZGFyeShpbnB1dCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geFNjYWxlKGlucHV0KTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICB4U2NhbGUsXG4gICAgICB4U2NhbGVTZWNvbmRhcnksXG4gICAgICBzY2FsZSxcbiAgICAgIHhUaWNrcyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydERhdGFUb0p1c3RPbmVWYWx1ZVR5cGUoXG4gICAgZGF0YTogRGF0YSxcbiAgICBpc1NlY29uZGFyeTogYm9vbGVhbixcbiAgKTogRGF0YSB7XG4gICAgY29uc3QgbmV3RGF0YTogRGF0YSA9IHsgLi4uZGF0YSwgeXM6IFtdIH07XG4gICAgZGF0YS55cy5mb3JFYWNoKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgIG5ld0RhdGEueXMucHVzaCh7IC4uLnksIHZhbHVlczogW10gfSk7XG4gICAgICB5LnZhbHVlcy5mb3JFYWNoKChfLCB4SW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgpICE9IGlzU2Vjb25kYXJ5KSB7XG4gICAgICAgICAgbmV3RGF0YS55c1t5SW5kZXhdLnZhbHVlcy5wdXNoKDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0RhdGEueXNbeUluZGV4XS52YWx1ZXMucHVzaChkYXRhLnlzW3lJbmRleF0udmFsdWVzW3hJbmRleF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3RGF0YTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmROZWFyZXN0SW5kZXgodmFsdWVzOiBudW1iZXJbXSwgaW5wdXQ6IG51bWJlcikge1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChuZWFyZXN0SW5kZXgsIHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlIC0gaW5wdXQpIDwgTWF0aC5hYnModmFsdWVzW25lYXJlc3RJbmRleF0gLSBpbnB1dClcbiAgICAgICAgPyBpbmRleFxuICAgICAgICA6IG5lYXJlc3RJbmRleDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmROZWFyZXN0SW5kZXhXaXRoU2Vjb25kYXJ5KFxuICAgIHlJbmZvOiB7IHZhbHVlOiBudW1iZXI7IGlzU2Vjb25kYXJ5OiBib29sZWFuIH1bXSxcbiAgICB5UG9zOiBudW1iZXIsXG4gICAgc2NhbGU6IChpbnB1dDogbnVtYmVyLCBpc1NlY29uZGFyeTogYm9vbGVhbiB8IHVuZGVmaW5lZCkgPT4gbnVtYmVyLFxuICApIHtcbiAgICBsZXQgZm91bmRJbmRleCA9IDA7XG4gICAgbGV0IGN1cnJNaW5EaXN0YW5jZSA9IE1hdGguYWJzKFxuICAgICAgc2NhbGUoeUluZm9bMF0udmFsdWUsIHlJbmZvWzBdLmlzU2Vjb25kYXJ5KSAtIHlQb3MsXG4gICAgKTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHlJbmZvLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXdEaXN0YW5jZSA9IE1hdGguYWJzKFxuICAgICAgICBzY2FsZSh5SW5mb1tpXS52YWx1ZSwgeUluZm9baV0uaXNTZWNvbmRhcnkpIC0geVBvcyxcbiAgICAgICk7XG4gICAgICBpZiAobmV3RGlzdGFuY2UgPCBjdXJyTWluRGlzdGFuY2UpIHtcbiAgICAgICAgZm91bmRJbmRleCA9IGk7XG4gICAgICAgIGN1cnJNaW5EaXN0YW5jZSA9IG5ld0Rpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm91bmRJbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmROZWFyZXN0SW5kZXhTdHJpbmcodmFsdWVzOiB1bmtub3duW10sIGlucHV0OiBudW1iZXIpIHtcbiAgICBjb25zdCBudW1WYWx1ZXMgPSB2YWx1ZXMubWFwKChfLCBpKSA9PiBpKTtcbiAgICByZXR1cm4gbnVtVmFsdWVzLnJlZHVjZSgobmVhcmVzdEluZGV4LCB2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgIHJldHVybiBNYXRoLmFicyh2YWx1ZSAtIGlucHV0KSA8IE1hdGguYWJzKG51bVZhbHVlc1tuZWFyZXN0SW5kZXhdIC0gaW5wdXQpXG4gICAgICAgID8gaW5kZXhcbiAgICAgICAgOiBuZWFyZXN0SW5kZXg7XG4gICAgfSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kU3ViSW5kZXgoXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBpbnB1dDogbnVtYmVyLFxuICAgIGJpblNpemU6IG51bWJlcixcbiAgICBzdWJCaW5Db3VudDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBzdWJCaW5TaXplID1cbiAgICAgIChiaW5TaXplIC0gKHN1YkJpbkNvdW50IC0gMSAqIFNNQUxMX1BBRERJTkcpKSAvIHN1YkJpbkNvdW50O1xuICAgIGNvbnN0IGNlbnRlckluZGV4ID0gc3ViQmluQ291bnQgLyAyIC0gMC41O1xuICAgIGxldCBjbG9zZXN0SW5kZXggPSAwO1xuICAgIGxldCBjbG9zZW5lc3NWYWwgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YkJpbkNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9IChpIC0gY2VudGVySW5kZXgpICogKHN1YkJpblNpemUgKyBTTUFMTF9QQURESU5HKTtcbiAgICAgIGNvbnN0IHN1YkJpblBvcyA9IHZhbHVlICsgb2Zmc2V0O1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dCAtIHN1YkJpblBvcyk7XG4gICAgICBpZiAoY2xvc2VuZXNzVmFsIDwgMCB8fCBjbG9zZW5lc3NWYWwgPiBkaXN0YW5jZSkge1xuICAgICAgICBjbG9zZXN0SW5kZXggPSBpO1xuICAgICAgICBjbG9zZW5lc3NWYWwgPSBkaXN0YW5jZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNsb3Nlc3RJbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRTdWJJbmRleEhvcml6b250YWwoXG4gICAgdmFsdWU6IG51bWJlcixcbiAgICBpbnB1dDogbnVtYmVyLFxuICAgIHN1YkJpbkNvdW50OiBudW1iZXIsXG4gICkge1xuICAgIGNvbnN0IGNlbnRlckluZGV4ID0gc3ViQmluQ291bnQgLyAyIC0gMC41O1xuICAgIGxldCBjbG9zZXN0SW5kZXggPSAwO1xuICAgIGxldCBjbG9zZW5lc3NWYWwgPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YkJpbkNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG9mZnNldCA9XG4gICAgICAgIChpIC0gY2VudGVySW5kZXgpICogKEhPUklaT05UQUxfQkFSX0hFSUdIVCArIFNNQUxMX1BBRERJTkcpO1xuICAgICAgY29uc3Qgc3ViQmluUG9zID0gdmFsdWUgKyBvZmZzZXQ7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0IC0gc3ViQmluUG9zKTtcbiAgICAgIGlmIChjbG9zZW5lc3NWYWwgPCAwIHx8IGNsb3NlbmVzc1ZhbCA+IGRpc3RhbmNlKSB7XG4gICAgICAgIGNsb3Nlc3RJbmRleCA9IGk7XG4gICAgICAgIGNsb3NlbmVzc1ZhbCA9IGRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdEluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmFyWUluZm8oXG4gICAgZGF0YTogRGF0YSxcbiAgICB5SW5kZXg6IG51bWJlcixcbiAgICB4SW5kZXg6IG51bWJlcixcbiAgICBzY2FsZTogKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBudW1iZXIsXG4gICAgaXNTdGFja2VkOiBib29sZWFuLFxuICApOiB7IHlWYWx1ZTogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCB6ZXJvVmFsID0gc2NhbGUoMCwgdHJ1ZSk7XG4gICAgY29uc3Qgc2NhbGVWYWx1ZSA9IHNjYWxlKFxuICAgICAgZGF0YS55c1t5SW5kZXhdLnZhbHVlc1t4SW5kZXhdLFxuICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIHhJbmRleCksXG4gICAgKTtcbiAgICBpZiAoc2NhbGVWYWx1ZSA+IHplcm9WYWwpIHtcbiAgICAgIGxldCBwcmV2QmFySGVpZ2h0cyA9IDA7XG4gICAgICBpZiAoaXNTdGFja2VkKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeUluZGV4OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjaGVja1ZhbHVlID0gc2NhbGUoXG4gICAgICAgICAgICBkYXRhLnlzW2ldLnZhbHVlc1t4SW5kZXhdLFxuICAgICAgICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCBpLCB4SW5kZXgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9Ta2lwIHBvc2l0aXZlIHZhbHVlc1xuICAgICAgICAgIGlmIChjaGVja1ZhbHVlIDwgemVyb1ZhbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByZXZCYXJIZWlnaHRzID0gcHJldkJhckhlaWdodHMgKyBjaGVja1ZhbHVlIC0gemVyb1ZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeVZhbHVlID0gemVyb1ZhbCArIHByZXZCYXJIZWlnaHRzO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gc2NhbGVWYWx1ZSAtIHlWYWx1ZSArIHByZXZCYXJIZWlnaHRzO1xuICAgICAgcmV0dXJuIHsgeVZhbHVlLCBoZWlnaHQgfTtcbiAgICB9XG4gICAgbGV0IHByZXZCYXJIZWlnaHRzID0gMDtcbiAgICBpZiAoaXNTdGFja2VkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHlJbmRleDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoZWNrVmFsdWUgPSBzY2FsZShcbiAgICAgICAgICBkYXRhLnlzW2ldLnZhbHVlc1t4SW5kZXhdLFxuICAgICAgICAgIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgaSwgeEluZGV4KSxcbiAgICAgICAgKTtcbiAgICAgICAgLy9Ta2lwIG5lZ2F0aXZlIHZhbHVlc1xuICAgICAgICBpZiAoY2hlY2tWYWx1ZSA+IHplcm9WYWwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmV2QmFyWVZhbCA9IGNoZWNrVmFsdWUgLSBwcmV2QmFySGVpZ2h0cztcbiAgICAgICAgcHJldkJhckhlaWdodHMgPSB6ZXJvVmFsIC0gcHJldkJhcllWYWw7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHlWYWx1ZSA9IHNjYWxlVmFsdWUgLSBwcmV2QmFySGVpZ2h0cztcbiAgICBjb25zdCBoZWlnaHQgPSB6ZXJvVmFsIC0geVZhbHVlIC0gcHJldkJhckhlaWdodHM7XG4gICAgcmV0dXJuIHsgeVZhbHVlLCBoZWlnaHQgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJhclhJbmZvKFxuICAgIGRhdGE6IERhdGEsXG4gICAgeUluZGV4OiBudW1iZXIsXG4gICAgeEluZGV4OiBudW1iZXIsXG4gICAgc2NhbGU6IChpbnB1dDogbnVtYmVyLCBpc1NlY29uZGFyeTogYm9vbGVhbiB8IHVuZGVmaW5lZCkgPT4gbnVtYmVyLFxuICAgIGlzU3RhY2tlZDogYm9vbGVhbixcbiAgKTogeyB4VmFsdWU6IG51bWJlcjsgd2lkdGg6IG51bWJlciB9IHtcbiAgICBjb25zdCB6ZXJvVmFsID0gc2NhbGUoMCwgdHJ1ZSk7XG4gICAgY29uc3Qgc2NhbGVWYWx1ZSA9IHNjYWxlKFxuICAgICAgZGF0YS55c1t5SW5kZXhdLnZhbHVlc1t4SW5kZXhdLFxuICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIHhJbmRleCksXG4gICAgKTtcbiAgICBpZiAoc2NhbGVWYWx1ZSA8IHplcm9WYWwpIHtcbiAgICAgIGxldCBwcmV2QmFyV2lkdGhzID0gMDtcbiAgICAgIGlmIChpc1N0YWNrZWQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB5SW5kZXg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNoZWNrVmFsID0gc2NhbGUoXG4gICAgICAgICAgICBkYXRhLnlzW2ldLnZhbHVlc1t4SW5kZXhdLFxuICAgICAgICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCBpLCB4SW5kZXgpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9Ta2lwIHBvc2l0aXZlIHZhbHVlc1xuICAgICAgICAgIGlmIChjaGVja1ZhbCA+IHplcm9WYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmV2QmFyV2lkdGhzICs9IHplcm9WYWwgLSBjaGVja1ZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeFZhbHVlID0gc2NhbGVWYWx1ZSAtIHByZXZCYXJXaWR0aHM7XG4gICAgICBjb25zdCB3aWR0aCA9IHplcm9WYWwgLSBzY2FsZVZhbHVlO1xuICAgICAgcmV0dXJuIHsgeFZhbHVlLCB3aWR0aCB9O1xuICAgIH1cbiAgICBsZXQgcHJldkJhcldpZHRocyA9IDA7XG4gICAgaWYgKGlzU3RhY2tlZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB5SW5kZXg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGVja1ZhbCA9IHNjYWxlKFxuICAgICAgICAgIGRhdGEueXNbaV0udmFsdWVzW3hJbmRleF0sXG4gICAgICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCBpLCB4SW5kZXgpLFxuICAgICAgICApO1xuICAgICAgICAvL1NraXAgbmVnYXRpdmUgdmFsdWVzXG4gICAgICAgIGlmIChjaGVja1ZhbCA8IHplcm9WYWwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2QmFyV2lkdGhzICs9IGNoZWNrVmFsIC0gemVyb1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeFZhbHVlID0gcHJldkJhcldpZHRocyArIHplcm9WYWw7XG4gICAgY29uc3Qgd2lkdGggPSBzY2FsZVZhbHVlIC0gemVyb1ZhbDtcbiAgICByZXR1cm4geyB4VmFsdWUsIHdpZHRoIH07XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0lmU2Vjb25kYXJ5KFxuICAgIGRhdGE6IERhdGEsXG4gICAgeUluZGV4OiBudW1iZXIsXG4gICAgeEluZGV4OiBudW1iZXIsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICBpZiAoZGF0YS54W3hJbmRleF0uaXNTZWNvbmRhcnkgPT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGEueXNbeUluZGV4XS5pc1NlY29uZGFyeSA9PSB0cnVlO1xuICB9XG5cbiAgLy8gc3RhY2sgcmV0dXJucyBhIG5ldyBkYXRhIHdoZXJlIGVhY2ggc2V0IG9mIHlWYWx1ZXMgaXMgc3RhY2tlZFxuICAvLyBvbiB0b3Agb2YgdGhlIHByZXZpb3VzLlxuICBmdW5jdGlvbiBzdGFjayhkYXRhOiBEYXRhKTogRGF0YSB7XG4gICAgY29uc3Qgc3RhY2tlZDogRGF0YSA9IHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB5czogZGF0YS55cy5tYXAoeSA9PiAoe1xuICAgICAgICBsYWJlbDogeS5sYWJlbCxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgaXNTZWNvbmRhcnk6IHkuaXNTZWNvbmRhcnksXG4gICAgICB9KSksXG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHBvc0Zyb20gPSAwO1xuICAgICAgbGV0IG5lZ0Zyb20gPSAwO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkYXRhLnlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbCA9IGRhdGEueXNbal0udmFsdWVzW2ldO1xuICAgICAgICBpZiAoc291cmNlVmFsIDwgMCkge1xuICAgICAgICAgIGNvbnN0IHRvID0gbmVnRnJvbSArIHNvdXJjZVZhbDtcbiAgICAgICAgICBzdGFja2VkLnlzW2pdLnZhbHVlcy5wdXNoKHRvKTtcbiAgICAgICAgICBuZWdGcm9tID0gdG87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdG8gPSBwb3NGcm9tICsgc291cmNlVmFsO1xuICAgICAgICAgIHN0YWNrZWQueXNbal0udmFsdWVzLnB1c2godG8pO1xuICAgICAgICAgIHBvc0Zyb20gPSB0bztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuXG4gIC8vIGhpZGUgc3RyaXBzIG91dCBoaWRkZW4geSB2YWx1ZXMgd2hpbGUgcmV0YWluaW5nIHRoZSBvcmlnaW5hbCBpbmRpY2VzXG4gIC8vIGZvciB0aGUgcmVtYWluaW5nIHZpc2libGUgdmFsdWVzXG4gIGZ1bmN0aW9uIGhpZGUoZGF0YTogRGF0YSk6IHsgZGF0YTogRGF0YTsgdmlzaWJsZUluZGljZXM6IG51bWJlcltdIH0ge1xuICAgIGNvbnN0IHZpc2libGVJbmRpY2VzID0gZGF0YS55c1xuICAgICAgLm1hcCgoeSwgaSkgPT4gKHsgeSwgaSB9KSlcbiAgICAgIC5maWx0ZXIoKHsgeSB9KSA9PiAheS5oaWRkZW4pXG4gICAgICAubWFwKCh7IGkgfSkgPT4gaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHsgLi4uZGF0YSwgeXM6IHZpc2libGVJbmRpY2VzLm1hcChpID0+IGRhdGEueXNbaV0pIH0sXG4gICAgICB2aXNpYmxlSW5kaWNlcyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd2F0ZXJmYWxsVHJhbnNmb3JtKGRhdGE6IExhYmVsZWREYXRhKTogTGFiZWxlZERhdGEge1xuICAgIGNvbnN0IG5ld0RhdGEgPSB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgeDogWy4uLmRhdGEueCwgeyBsYWJlbDogJ1RvdGFsJyB9XSxcbiAgICAgIHlzOiBbXG4gICAgICAgIC4uLmRhdGEueXMubWFwKHkgPT4gKHtcbiAgICAgICAgICAuLi55LFxuICAgICAgICAgIHZhbHVlczogWy4uLnkudmFsdWVzLCB5LnZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKV0sXG4gICAgICAgIH0pKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICByZXR1cm4gbmV3RGF0YTtcbiAgfVxuXG4gIHR5cGUgVmFsdWVUeXBlID0gJ2NvdW50JyB8ICdjdXJyZW5jeScgfCAncGVyY2VudGFnZScgfCAnZGF5cyc7XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFBpcGVzKHZhbHVlVHlwZTogVmFsdWVUeXBlKSB7XG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvdW50Jzoge1xuICAgICAgICBjb25zdCBwaXBlID0gbmV3IE51bWJlclBpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwaXBlOiBuZXcgU21hbGxDdXJyZW5jeVBpcGUoKSxcbiAgICAgICAgICBmdWxsUGlwZTogbmV3IEN1cnJlbmN5UGlwZSgnZW4tdXMnKSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOiB7XG4gICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgUGVyY2VudGFnZVBpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RheXMnOiB7XG4gICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgRGF5c1BpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgY29uc3QgaW50ZXJ2YWxzID0gWyd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgSW50ZXJ2YWwgPSAodHlwZW9mIGludGVydmFscylbbnVtYmVyXTtcblxuICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0ZWREYXRlKGRhdGVGb3JtYXQ6IEludGVydmFsLCBkYXRlOiBEYXRlKSB7XG4gICAgaWYgKGRhdGVGb3JtYXQgPT0gJ3F1YXJ0ZXInKSB7XG4gICAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSAvIDMpO1xuICAgICAgY29uc3QgeWVhciA9IHV0Y0Zvcm1hdChnZXRUaW1lSW50ZXJ2YWxGb3JtYXQoJ3llYXInKSkoZGF0ZSk7XG4gICAgICByZXR1cm4gYFEke3F1YXJ0ZXJ9ICR7eWVhcn1gO1xuICAgIH1cbiAgICBjb25zdCBmb3JtYXQgPSBnZXRUaW1lSW50ZXJ2YWxGb3JtYXQoZGF0ZUZvcm1hdCk7XG4gICAgcmV0dXJuIHV0Y0Zvcm1hdChmb3JtYXQpKGRhdGUpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVJbnRlcnZhbEZvcm1hdChpbnRlcnZhbDogSW50ZXJ2YWwpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgcmV0dXJuICclbS8lZC8lWSc7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuICclYiAlWSc7XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgcmV0dXJuICclWSc7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFydERhdGFUb0RvbnV0RGF0YShjaGFydERhdGE6IERhdGEpOiBEb251dERhdGFbXSB7XG4gICAgaWYgKGNoYXJ0RGF0YS55cy5maW5kKHkgPT4geS52YWx1ZXMubGVuZ3RoID4gMSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiSGVhZHMgdXAhIFBpZSBjaGFydHMgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXMgcGVyIHNlcmllc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb251dERhdGEgPSBjaGFydERhdGEueXMubWFwKHkgPT4gKHtcbiAgICAgIGxhYmVsOiB5LmxhYmVsLFxuICAgICAgaGlkZGVuOiB5LmhpZGRlbixcbiAgICAgIHZhbHVlOiB5LnZhbHVlcy5sZW5ndGggPj0gMSA/IHkudmFsdWVzWzBdIDogMCxcbiAgICAgIGlzU2Vjb25kYXJ5OiB5LmlzU2Vjb25kYXJ5LFxuICAgIH0pKTtcbiAgICByZXR1cm4gZG9udXREYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tZU2NhbGVUeXBlKFxuICAgIGlucHV0OlxuICAgICAgfCBTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXIsIG5ldmVyPlxuICAgICAgfCBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+LFxuICAgIGRhdGFUeXBlOiAnbGFiZWxlZCcgfCAndGltZXNlcmllcycgfCB1bmRlZmluZWQsXG4gICk6IGlucHV0IGlzIFNjYWxlVGltZTxudW1iZXIsIG51bWJlciwgbmV2ZXI+IHtcbiAgICBpZiAoZGF0YVR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJjVG9Qb2ludChhbmdsZTogbnVtYmVyLCByYWRpdXM6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSAtIE1hdGguUEkgLyAyKSxcbiAgICAgIHk6IHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC0gTWF0aC5QSSAvIDIpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
2009
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWUsV0FBVyxFQUFhLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRTNFLE1BQU0sS0FBVyxLQUFLLENBazJGckI7QUFsMkZELFdBQWlCLEtBQUs7SUFDUCx5QkFBbUIsR0FBRztRQUNqQyxhQUFhO1FBQ2IsaUJBQWlCO1FBQ2pCLG1CQUFtQjtRQUNuQixXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO1FBQ1gsZ0NBQWdDO1FBQ2hDLGlCQUFpQjtRQUNqQixtQkFBbUI7UUFDbkIsV0FBVztRQUNYLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLCtCQUErQjtRQUMvQixpQkFBaUI7UUFDakIsbUJBQW1CO1FBQ25CLFdBQVc7UUFDWCxXQUFXO1FBQ1gsV0FBVztRQUNYLFdBQVc7S0FDWixDQUFDO0lBRUYsU0FBZ0IsS0FBSyxDQUFDLE1BQWMsRUFBRSxJQUFVLEVBQUUsVUFBc0I7UUFDdEUsT0FBTyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU07WUFDMUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQztZQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNO2dCQUN2QixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO2dCQUNqQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxPQUFPO29CQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO29CQUNoQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxnQkFBZ0I7d0JBQ2pDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUM7d0JBQzFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUs7NEJBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUM7NEJBQ2hDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLFdBQVc7Z0NBQzVCLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUM7Z0NBQ3JDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDakIsQ0FBQztJQWRlLFdBQUssUUFjcEIsQ0FBQTtJQUNELFNBQWdCLEtBQUssQ0FDbkIsTUFBYyxFQUNkLE9BQWEsRUFDYixVQUFzQjtRQUV0QixNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUNoQyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixxRUFBcUUsQ0FDdEUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxVQUFVLENBQUMsZUFBZSxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RSxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixzRUFBc0UsQ0FDdkUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsNkVBQTZFO1FBQzdFLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBVSxFQUFFLEVBQUUsQ0FDNUIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRS9ELE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsR0FDeEQsTUFBTSxDQUFDLGtCQUFrQjtZQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztZQUNyQyxDQUFDLENBQUM7Z0JBQ0UsSUFBSTtnQkFDSixRQUFRO2FBQ1QsQ0FBQztRQUVSLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsbUJBQW1CLENBQzNDLElBQUksRUFDSixVQUFVLEVBQ1YsSUFBSSxFQUNKLGFBQWEsRUFDYixLQUFLLEVBQ0wsTUFBTSxDQUNQLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUMvQixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQzdDLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sS0FBSyxHQUNULElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDZCxJQUFJLENBQ0YsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUN0QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FDdkMsQ0FBQyxPQUFPLENBQUMsQ0FDWDtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDVCxNQUFNLE9BQU8sR0FDWCxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzNCLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDckIsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDM0QsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUVULE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQztRQUM5QixNQUFNLFVBQVUsR0FBZ0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDNUQsTUFBTSxTQUFTLEdBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUQsS0FBSyxFQUNILENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7b0JBQ3JDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUNoQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsT0FBTztnQkFDbEUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixNQUFNLEVBQUUsUUFBUTthQUNqQixDQUFDLENBQUMsQ0FBQztZQUNKLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxLQUFLLENBQUMsR0FBNEM7WUFDekQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxhQUFhLEdBQUcsNkJBQTZCLENBQ2pELElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDckIsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUN2QixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7YUFDL0MsQ0FBQyxDQUFDLEVBQ0gsR0FBRyxDQUFDLENBQUMsRUFDTCxLQUFLLENBQ04sQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3QyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUM5QixLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQzNELENBQUM7WUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVUsRUFBRSxFQUFFLENBQzVCLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUNkLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFDOUIsQ0FBQyxFQUNELENBQUMsQ0FDRixDQUFDO1lBQ0YsT0FBTztnQkFDTCxDQUFDO2dCQUNELE1BQU07Z0JBQ04sRUFBRTtnQkFDRixNQUFNO2dCQUNOLGFBQWE7Z0JBQ2IsT0FBTyxFQUFFO29CQUNQLE1BQU07b0JBQ04sSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTt5QkFDYixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNsQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO3dCQUNwQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7d0JBQ2QsS0FBSyxFQUNILENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7NEJBQ3BDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDL0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRztxQkFDbkQsQ0FBQyxDQUFDO3lCQUNGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQztpQkFDakU7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNO1lBQ04sTUFBTTtZQUNOLE1BQU07WUFDTixLQUFLO1lBQ0wsT0FBTztZQUNQLEtBQUs7WUFDTCxJQUFJLEVBQUUsRUFBRTtZQUNSLEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxFQUFFLEVBQUU7WUFDUixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVO1lBQ1YsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQztJQUNKLENBQUM7SUFoSmUsV0FBSyxRQWdKcEIsQ0FBQTtJQUVELFNBQWdCLEtBQUssQ0FDbkIsTUFBYyxFQUNkLE9BQWEsRUFDYixVQUFzQjtRQUV0QixNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxhQUFhLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUNuQyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixxRUFBcUUsQ0FDdEUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksRUFBRTtZQUNqQyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixtRUFBbUUsQ0FDcEUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsSUFDRSxhQUFhLENBQUMsZUFBZTtZQUM3QixhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3hDO1lBQ0Esc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysc0VBQXNFLENBQ3ZFLENBQUM7WUFDRixPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUNELDZFQUE2RTtRQUM3RSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUM7UUFDM0IsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM1RSxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQVUsRUFBRSxFQUFFLENBQzVCLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvRCxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLEdBQ3hELE1BQU0sQ0FBQyxrQkFBa0I7WUFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7WUFDckMsQ0FBQyxDQUFDO2dCQUNFLElBQUk7Z0JBQ0osUUFBUTthQUNULENBQUM7UUFFUixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLG1CQUFtQixDQUMzQyxJQUFJLEVBQ0osVUFBVSxFQUNWLElBQUksRUFDSixhQUFhLEVBQ2IsSUFBSSxFQUNKLE1BQU0sQ0FDUCxDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FDRixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3RCLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQ3JELENBQUMsQ0FBQyxFQUFFLENBQ0YsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNO1lBQ2hELFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUNuRCxDQUFDLE9BQU8sQ0FBQyxDQUNYLENBQUM7UUFFRixTQUFTLEtBQUssQ0FBQyxHQUE0QztZQUN6RCxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUMxQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUNsRCxDQUFDO1lBQ0YsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyw0SEFBNEg7WUFDNUgsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLGNBQWMsRUFBRTtvQkFDOUIsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7aUJBQzVCO2dCQUNELE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLGNBQWMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO3dCQUM1QyxhQUFhLEdBQUcsQ0FBQyxDQUFDO3dCQUNsQixNQUFNO3FCQUNQO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDNUMsYUFBYSxHQUFHLENBQUMsQ0FBQzt3QkFDbEIsTUFBTTtxQkFDUDtpQkFDRjthQUNGO1lBQ0QsSUFBSSxhQUFhLElBQUksQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxjQUFjLEVBQUU7b0JBQzFCLGFBQWEsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM3QztnQkFDRCxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxFQUFFO29CQUMxQixhQUFhLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDN0M7YUFDRjtZQUNELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUNkLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFDckMsYUFBYSxFQUNiLENBQUMsQ0FDRixDQUFDO1lBQ0YsT0FBTztnQkFDTCxDQUFDO2dCQUNELE1BQU07Z0JBQ04sRUFBRSxFQUFFLFNBQVM7Z0JBQ2IsTUFBTTtnQkFDTixhQUFhO2dCQUNiLE9BQU8sRUFBRTtvQkFDUCxNQUFNO29CQUNOLElBQUksRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUN0RCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7eUJBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDbEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3QkFDcEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO3dCQUNkLEtBQUssRUFDSCxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDOzRCQUNwQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBQy9DLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUc7cUJBQ25ELENBQUMsQ0FBQzt5QkFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUM7aUJBQ2pFO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sS0FBSztZQUNMLEtBQUssRUFBRSxFQUFFO1lBQ1QsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLO1lBQ0wsSUFBSSxFQUFFLEVBQUU7WUFDUixJQUFJLEVBQUUsRUFBRTtZQUNSLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFVBQVUsRUFBRSxFQUFFO1lBQ2QsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQztJQUNKLENBQUM7SUExSmUsV0FBSyxRQTBKcEIsQ0FBQTtJQUVELFNBQWdCLElBQUksQ0FDbEIsTUFBaUIsRUFDakIsT0FBYSxFQUNiLFVBQXNCO1FBRXRCLE1BQU0sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5RCxJQUFJLGFBQWEsQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFO1lBQ25DLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLDZFQUE2RSxDQUM5RSxDQUFDO1lBQ0YsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCw2RkFBNkY7UUFDN0YsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQ0UsTUFBTSxDQUFDLGNBQWMsSUFBSSxJQUFJO1lBQzdCLE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUztZQUNoQyxDQUFDLGNBQWMsRUFDZjtZQUNBLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLG1FQUFtRSxDQUNwRSxDQUFDO1lBQ0YsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCxJQUNFLGFBQWEsQ0FBQyxlQUFlO1lBQzdCLGFBQWEsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDeEMsTUFBTSxDQUFDLFlBQVksSUFBSSxXQUFXO1lBQ2xDLENBQUMsY0FBYyxFQUNmO1lBQ0Esc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQ1YseUdBQXlHLENBQzFHLENBQUM7WUFDRixPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUNELDZFQUE2RTtRQUM3RSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUM7UUFDM0IsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkUsTUFBTSxXQUFXLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFVLEVBQUUsRUFBRSxDQUM1QixZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFL0QsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxHQUN4RCxNQUFNLENBQUMsa0JBQWtCO1lBQ3ZCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDO1lBQ3JDLENBQUMsQ0FBQztnQkFDRSxJQUFJO2dCQUNKLFFBQVE7YUFDVCxDQUFDO1FBRVIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxtQkFBbUIsQ0FDM0MsSUFBSSxFQUNKLFVBQVUsRUFDVixJQUFJLEVBQ0osYUFBYSxFQUNiLE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUyxFQUNoQyxNQUFNLENBQ1AsQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQ3JDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUNwQyxJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQ2pDLENBQUM7WUFDRixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUNqRCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUM7WUFDcEIsSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLFdBQVcsRUFBRTtnQkFDdEMsS0FBSztvQkFDSCxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUNwRSxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO2FBQzFCO1lBQ0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWU7Z0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUM7cUJBQzNELE1BQU0sR0FBRyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RCLEtBQUs7b0JBQ0gsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsY0FBYyxDQUFDO2FBQ3JFO1lBRUQsT0FBTztnQkFDTCxDQUFDLEVBQUUsTUFBTTtnQkFDVCxDQUFDLEVBQUUsTUFBTTtnQkFDVCxLQUFLO2dCQUNMLE1BQU07YUFDUCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksUUFBUSxHQUtKLEVBQUUsQ0FBQztRQUNYLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FDaEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQ3hCLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUNwQyxJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxDQUFDLFlBQVksSUFBSSxTQUFTLEVBQ2hDLElBQUksQ0FDTCxDQUFDO2dCQUNGLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO2dCQUNqRCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUM7Z0JBQ3BCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlO29CQUN6QyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQ3pCLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FDdEQ7b0JBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDUCxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDakQsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7b0JBQ3RCLE1BQU0sS0FBSyxHQUFHLCtCQUErQixDQUMzQyxPQUFPLEVBQ1AsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixNQUFNLENBQ1AsQ0FBQztvQkFDRixLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztvQkFDcEIsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7aUJBQ3ZCO2dCQUNELE9BQU87b0JBQ0wsQ0FBQyxFQUFFLE1BQU07b0JBQ1QsQ0FBQyxFQUFFLE1BQU07b0JBQ1QsS0FBSztvQkFDTCxNQUFNO2lCQUNQLENBQUM7WUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO1NBQ3hCO1FBQ0QsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBZ0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDNUQsTUFBTSxTQUFTLEdBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUMxRCxNQUFNLGFBQWEsR0FDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjO29CQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDbEMsTUFBTSxPQUFPLEdBQUcsYUFBYTtvQkFDM0IsQ0FBQyxDQUFDLGFBQWEsR0FBRyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTTtvQkFDakUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUNuQixPQUFPO29CQUNMLEtBQUssRUFDSCxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO3dCQUNyQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7d0JBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRTtvQkFDaEMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTztvQkFDdEMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO29CQUM3RCxNQUFNLEVBQUUsUUFBUTtpQkFDakIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsTUFBTSxjQUFjLEdBQWdCLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUM5RCxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDWixNQUFNLFNBQVMsR0FBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7b0JBQzFELE1BQU0sYUFBYSxHQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWM7d0JBQzVDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO29CQUN0QyxNQUFNLE9BQU8sR0FBRyxhQUFhO3dCQUMzQixDQUFDLENBQUMsYUFBYTs0QkFDYixpQkFBaUI7NEJBQ2pCLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNO3dCQUNqQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7b0JBQ25CLE9BQU87d0JBQ0wsS0FBSyxFQUNILENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDOzRCQUMzQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7NEJBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRTt3QkFDaEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTzt3QkFDMUMsSUFBSSxFQUNGLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDO3dCQUNqRSxNQUFNLEVBQUUsUUFBUTtxQkFDakIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDLENBQ0YsQ0FBQztZQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztTQUNwQztRQUVELFNBQVMsS0FBSyxDQUFDLEdBQTRDO1lBQ3pELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN4RSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksV0FBVyxHQUFZLEtBQUssQ0FBQztZQUNqQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDeEIsY0FBYyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxZQUFZLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25FLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRTtvQkFDckIsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDcEI7YUFDRjtZQUNELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQ3RDLFdBQVc7Z0JBQ1QsQ0FBQyxDQUFDLHdCQUF3QixDQUN0QixJQUFJLEVBQ0osU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUyxDQUNqQyxDQUFDLE1BQU07Z0JBQ1YsQ0FBQyxDQUFDLFdBQVcsQ0FDVCxJQUFJLEVBQ0osU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQ2pDLENBQUMsTUFBTSxDQUNiLENBQUM7WUFDRixNQUFNLFFBQVEsR0FBRyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwRSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDNUMsYUFBYSxHQUFHLENBQUMsQ0FBQzt3QkFDbEIsTUFBTTtxQkFDUDtpQkFDRjthQUNGO2lCQUFNO2dCQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNsQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQzVDLGFBQWEsR0FBRyxDQUFDLENBQUM7d0JBQ2xCLE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtZQUNELElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxXQUFXLEVBQUU7Z0JBQ3RDLGFBQWEsR0FBRyxZQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakU7WUFDRCxJQUFJLGFBQWEsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsRUFBRTtvQkFDMUIsYUFBYSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzdDO2dCQUNELElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxjQUFjLEVBQUU7b0JBQzFCLGFBQWEsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM3QzthQUNGO1lBQ0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsV0FBVztnQkFDcEMsQ0FBQyxDQUFDLHdCQUF3QixDQUN0QixJQUFJLEVBQ0osTUFBTSxFQUNOLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUyxDQUNqQztnQkFDSCxDQUFDLENBQUMsV0FBVyxDQUNULElBQUksRUFDSixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FDakMsQ0FBQztZQUVOLE1BQU0sS0FBSyxHQUFHLCtCQUErQixDQUMzQyxPQUFPLEVBQ1AsY0FBYyxFQUNkLFlBQVksR0FBRyxDQUFDLEVBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUNyQyxDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUcsV0FBVztnQkFDekIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUNkLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sV0FBVyxHQUFHLFdBQVc7Z0JBQzdCLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSztnQkFDYixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sQ0FDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLGFBQWEsRUFDcEMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUNuQixXQUFXLEdBQUcsYUFBYSxHQUFHLENBQUMsRUFDL0IsTUFBTSxDQUNQLENBQUM7WUFDRiw0RUFBNEU7WUFDNUUsTUFBTSxZQUFZLEdBSWhCLFdBQVcsSUFBSSxJQUFJLENBQUMsZUFBZTtnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlO3FCQUNqQixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztxQkFDOUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxZQUFZLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsT0FBTztnQkFDTCxDQUFDO2dCQUNELE1BQU07Z0JBQ04sRUFBRTtnQkFDRixNQUFNO2dCQUNOLGFBQWE7Z0JBQ2IsT0FBTyxFQUFFO29CQUNQLE1BQU07b0JBQ04sSUFBSSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQ3RELE9BQU8sRUFBRSxZQUFZO3lCQUNsQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUNsQixLQUFLLEVBQ0gsTUFBTSxDQUNKLGtCQUFrQixJQUFJLENBQUMsQ0FBQyxJQUFJOzRCQUMxQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7NEJBQ3pCLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDMUI7d0JBQ0gsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSzt3QkFDbkIsS0FBSyxFQUNILENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQzs0QkFDM0QsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDcEQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUc7cUJBQ3hELENBQUMsQ0FBQzt5QkFDRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUM7aUJBQ2pFO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsTUFBTTtZQUNOLE1BQU07WUFDTixNQUFNO1lBQ04sSUFBSTtZQUNKLEtBQUssRUFBRSxFQUFFO1lBQ1QsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLLEVBQUUsRUFBRTtZQUNULEtBQUs7WUFDTCxJQUFJLEVBQUUsRUFBRTtZQUNSLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFVBQVU7WUFDVixjQUFjLEVBQUUsRUFBRTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQTFWZSxVQUFJLE9BMFZuQixDQUFBO0lBRUQsU0FBZ0IsY0FBYyxDQUM1QixNQUFpQixFQUNqQixPQUFhLEVBQ2IsVUFBc0I7UUFFdEIsa0ZBQWtGO1FBQ2xGLDZFQUE2RTtRQUM3RSxtQ0FBbUM7UUFDbkMsTUFBTSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsbUhBQW1IO1FBQ25ILE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU07WUFDL0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNO2dCQUNaLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztxQkFDOUQsTUFBTSxDQUFDO1FBQ2QsNkZBQTZGO1FBQzdGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUNFLE1BQU0sQ0FBQyxjQUFjLElBQUksSUFBSTtZQUM3QixNQUFNLENBQUMsWUFBWSxJQUFJLFNBQVM7WUFDaEMsQ0FBQyxhQUFhO1lBQ2QsQ0FBQyxjQUFjLEVBQ2Y7WUFDQSxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixtRUFBbUUsQ0FDcEUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsSUFDRSxJQUFJLENBQUMsZUFBZTtZQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxZQUFZLElBQUksV0FBVztZQUNsQyxDQUFDLGNBQWMsRUFDZjtZQUNBLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLHlHQUF5RyxDQUMxRyxDQUFDO1lBQ0YsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzlELElBQUksTUFBTSxHQUNSLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUztZQUNwQixDQUFDLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7WUFDeEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVUsRUFBRSxFQUFFLENBQ2hDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLEdBQ3hELE1BQU0sQ0FBQyxrQkFBa0I7WUFDdkIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUM7WUFDckMsQ0FBQyxDQUFDO2dCQUNFLElBQUk7Z0JBQ0osUUFBUTthQUNULENBQUM7UUFDUixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNmLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDO2dCQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTO29CQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLO29CQUNwQixDQUFDLENBQUMsR0FBRztnQkFDUCxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztTQUNyQixDQUFDLENBQUMsQ0FBQztRQUVKLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsbUJBQW1CLENBQzNDLElBQUksRUFDSixVQUFVLEVBQ1YsSUFBSSxFQUNKLGFBQWEsRUFDYixNQUFNLENBQUMsWUFBWSxJQUFJLFNBQVMsRUFDaEMsTUFBTSxDQUNQLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE1BQU0sd0JBQXdCLEdBSXRCLEVBQUUsQ0FBQztRQUNYLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9DLE1BQU0sY0FBYyxHQUlkLEVBQUUsQ0FBQztZQUNULE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN2QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFdBQVcsQ0FDbkMsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUyxDQUNqQyxDQUFDO2dCQUVGLElBQUksTUFBTSxHQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0RCxxQkFBcUIsR0FBRyxHQUFHLENBQUM7Z0JBQzlCLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxXQUFXLEVBQUU7b0JBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQzdDLE1BQU0sTUFBTSxHQUNWLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMscUJBQXFCLEdBQUcsYUFBYSxDQUFDLENBQUM7b0JBQ25FLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO2lCQUMxQjtnQkFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZTtvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUN6QixLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQzFDO29CQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1AsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7b0JBQ3RCLE1BQU0sV0FBVyxHQUFHLGNBQWMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUM3QyxNQUFNLE1BQU0sR0FDVixDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQzt3QkFDbEMsQ0FBQyxxQkFBcUIsR0FBRyxhQUFhLENBQUMsQ0FBQztvQkFDMUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7aUJBQzFCO2dCQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsY0FBYyxDQUFDLElBQUksQ0FBQztvQkFDbEIsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLE1BQU07b0JBQ1osS0FBSztpQkFDTixDQUFDLENBQUM7Z0JBQ0gseUNBQXlDO2dCQUN6QyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7b0JBQ2QsT0FBTyxFQUFFLENBQUM7aUJBQ1g7Z0JBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxFQUFFO3FCQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3FCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEVBQUU7cUJBQy9CLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFFeEIsaUZBQWlGO2dCQUNqRixNQUFNLFdBQVcsR0FBRyxVQUFVO29CQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7eUJBQ0osS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7eUJBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCO29CQUM5RCxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7eUJBQ0osS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUM7eUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUM7Z0JBQ3hFLE1BQU0sWUFBWSxHQUFHLFVBQVU7b0JBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRTt5QkFDSixLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQzt5QkFDakMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzt5QkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDO29CQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7eUJBQ0osS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7eUJBQ2hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7Z0JBQ2pFLE1BQU0sY0FBYyxHQUNsQixNQUFNLENBQUMsWUFBWSxJQUFJLFdBQVcsSUFBSSxZQUFZLENBQUM7Z0JBQ3JELE1BQU0sS0FBSyxHQUFHLDBCQUEwQixDQUN0QyxhQUFhLEVBQ2IsY0FBYyxFQUNkLE1BQU0sRUFDTixNQUFNLEVBQ04sSUFBSSxFQUNKLElBQUksRUFDSixLQUFLLENBQ04sQ0FBQztnQkFDRixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFDO1lBQ0gsd0JBQXdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNwQyxNQUFNLDRCQUE0QixHQUkxQixFQUFFLENBQUM7UUFDWCxJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxjQUFjLEdBSWQsRUFBRSxDQUFDO2dCQUNULE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUN2QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFdBQVcsQ0FDbkMsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUyxFQUNoQyxJQUFJLENBQ0wsQ0FBQztvQkFFRixJQUFJLE1BQU0sR0FDUixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDdEQscUJBQXFCLEdBQUcsR0FBRyxDQUFDO29CQUM5QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZTt3QkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUN6QixLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQ3REO3dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ1AsTUFBTSxjQUFjLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7b0JBQ2pELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztvQkFDbkQsSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFO3dCQUN0QixNQUFNLFdBQVcsR0FBRyxjQUFjLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzt3QkFDN0MsTUFBTSxNQUFNLEdBQ1YsQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLENBQUM7NEJBQ2xDLENBQUMscUJBQXFCLEdBQUcsYUFBYSxDQUFDLENBQUM7d0JBQzFDLE1BQU0sR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO3FCQUMxQjtvQkFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ2hFLGNBQWMsQ0FBQyxJQUFJLENBQUM7d0JBQ2xCLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRSxNQUFNO3dCQUNaLEtBQUs7cUJBQ04sQ0FBQyxDQUFDO29CQUNILHlDQUF5QztvQkFDekMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO3dCQUNkLE9BQU8sRUFBRSxDQUFDO3FCQUNYO29CQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNwRCxNQUFNLGtCQUFrQixHQUFHLE1BQU07eUJBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUM7eUJBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDeEIsTUFBTSxrQkFBa0IsR0FBRyxNQUFNO3lCQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDO3lCQUMvRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3lCQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBRXhCLGlGQUFpRjtvQkFDakYsTUFBTSxXQUFXLEdBQUcsVUFBVTt3QkFDNUIsQ0FBQyxDQUFDLE1BQU07NkJBQ0gsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUM7NkJBQ2hCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsaUJBQWlCLENBQUM7NkJBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7NkJBQ3pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCO3dCQUM5RCxDQUFDLENBQUMsTUFBTTs2QkFDSCxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDOzZCQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDOzZCQUMvRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDOzZCQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztvQkFDMUMsTUFBTSxhQUFhLEdBQ2pCLE1BQU0sQ0FBQyxZQUFZLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQztvQkFDcEQsTUFBTSxZQUFZLEdBQUcsVUFBVTt3QkFDN0IsQ0FBQyxDQUFDLE1BQU07NkJBQ0gsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQzs2QkFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQzs2QkFDL0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDO3dCQUN2QyxDQUFDLENBQUMsTUFBTTs2QkFDSCxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQzs2QkFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQzs2QkFDL0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzs2QkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDakUsTUFBTSxjQUFjLEdBQ2xCLE1BQU0sQ0FBQyxZQUFZLElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQztvQkFDckQsTUFBTSxLQUFLLEdBQUcsMEJBQTBCLENBQ3RDLGFBQWEsRUFDYixjQUFjLEVBQ2QsTUFBTSxFQUNOLE1BQU0sRUFDTixJQUFJLEVBQ0osSUFBSSxFQUNKLEtBQUssQ0FDTixDQUFDO29CQUNGLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxDQUFDO2dCQUNILDRCQUE0QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDbEQsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztTQUM1QztRQUVELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDO1FBQ3RDLE1BQU0sVUFBVSxHQUFnQixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM1RCxNQUFNLFNBQVMsR0FBZ0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzFELE1BQU0sYUFBYSxHQUNqQix3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEdBQUcsY0FBYztvQkFDOUQsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDckQsTUFBTSxPQUFPLEdBQUcsYUFBYTtvQkFDM0IsQ0FBQyxDQUFDLENBQUMsYUFBYTtvQkFDaEIsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUM7Z0JBQ25FLE9BQU87b0JBQ0wsS0FBSyxFQUNILENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7d0JBQ3JDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQzt3QkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFO29CQUNoQyxJQUFJLEVBQUUsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHLE9BQU87b0JBQzdELElBQUksRUFBRSx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEdBQUcsT0FBTztvQkFDN0QsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPO2lCQUN4QyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxjQUFjLEdBQWdCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQy9ELE1BQU0sU0FBUyxHQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDMUQsTUFBTSxhQUFhLEdBQ2pCLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUk7d0JBQy9DLGNBQWM7d0JBQ2hCLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ3pELE1BQU0sT0FBTyxHQUFHLGFBQWE7d0JBQzNCLENBQUMsQ0FBQyxDQUFDLGFBQWE7d0JBQ2hCLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLOzRCQUNsRCxhQUFhLENBQUM7b0JBQ2xCLE9BQU87d0JBQ0wsS0FBSyxFQUNILENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDOzRCQUMzQyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7NEJBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRTt3QkFDaEMsSUFBSSxFQUFFLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksR0FBRyxPQUFPO3dCQUNqRSxJQUFJLEVBQUUsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHLE9BQU87d0JBQ2pFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTztxQkFDeEMsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztTQUNwQztRQUVELFNBQVMsS0FBSyxDQUFDLEdBQTRDO1lBQ3pELElBQUksTUFBTSxHQUFXLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFO2dCQUNoRSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNsRSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUM7YUFDNUM7aUJBQU0sSUFDTCxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDbkMsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQ3RCO2dCQUNBLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDO2FBQ3BDO1lBQ0QsSUFBSSxXQUFXLEdBQVksS0FBSyxDQUFDO1lBQ2pDLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztZQUNyQixJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN4QixjQUFjLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3BFLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRTtvQkFDckIsV0FBVyxHQUFHLElBQUksQ0FBQztpQkFDcEI7YUFDRjtZQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQzFDLFdBQVc7Z0JBQ1QsQ0FBQyxDQUFDLHdCQUF3QixDQUN0QixJQUFJLEVBQ0osU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sQ0FBQyxZQUFZLElBQUksU0FBUyxDQUNqQztnQkFDSCxDQUFDLENBQUMsV0FBVyxDQUNULElBQUksRUFDSixTQUFTLEVBQ1QsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FDakMsQ0FDTixDQUFDO1lBQ0YsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDcEMsTUFBTSxxQkFBcUIsR0FBRyxNQUFNO3FCQUNqQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztxQkFDbEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QixNQUFNLFdBQVcsR0FDZixxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxxQkFBcUIsQ0FBQztvQkFDcEMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNuQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsV0FBVyxFQUFFO29CQUM3QyxhQUFhLEdBQUcsQ0FBQyxDQUFDO2lCQUNuQjthQUNGO1lBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLFdBQVcsRUFBRTtnQkFDdEMsYUFBYSxHQUFHLHNCQUFzQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbEU7WUFFRCxJQUFJLGFBQWEsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsRUFBRTtvQkFDMUIsYUFBYSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzdDO2dCQUNELElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxjQUFjLEVBQUU7b0JBQzFCLGFBQWEsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUM3QzthQUNGO1lBQ0QsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTdDLDBFQUEwRTtZQUMxRSxJQUNFLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDO2dCQUMxRCxNQUFNLENBQUMsWUFBWSxJQUFJLFNBQVMsRUFDaEM7Z0JBQ0EsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixlQUFlO2dCQUNmLEtBQ0UsSUFBSSxDQUFDLEdBQUcsYUFBYSxHQUFHLENBQUMsRUFDekIsQ0FBQyxHQUFHLHdCQUF3QixDQUFDLE1BQU0sRUFDbkMsQ0FBQyxFQUFFLEVBQ0g7b0JBQ0EsSUFBSSxXQUFXLEVBQUU7d0JBQ2YsTUFBTTtxQkFDUDtvQkFDRCxJQUFJLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEVBQUU7d0JBQ2xELGFBQWEsR0FBRyxDQUFDLENBQUM7d0JBQ2xCLFdBQVcsR0FBRyxJQUFJLENBQUM7cUJBQ3BCO2lCQUNGO2dCQUVELGlCQUFpQjtnQkFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQzNDLElBQUksV0FBVyxFQUFFO3dCQUNmLE1BQU07cUJBQ1A7b0JBQ0QsSUFBSSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFO3dCQUNsRCxhQUFhLEdBQUcsQ0FBQyxDQUFDO3dCQUNsQixXQUFXLEdBQUcsSUFBSSxDQUFDO3FCQUNwQjtpQkFDRjthQUNGO1lBRUQsTUFBTSxVQUFVLEdBQ2QsV0FBVyxJQUFJLE1BQU07Z0JBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUNkLEtBQUssQ0FBQyxFQUFFLENBQ04sS0FBSyxDQUFDLGdCQUFnQixJQUFJLGFBQWE7b0JBQ3ZDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxZQUFZLENBQzFDO2dCQUNILENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVULE1BQU0sT0FBTyxHQUFHLFdBQVc7Z0JBQ3pCLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJO2dCQUN2RCxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3pELE1BQU0sT0FBTyxHQUFHLFdBQVc7Z0JBQ3pCLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJO2dCQUN2RCxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3pELE1BQU0sUUFBUSxHQUFHLFdBQVc7Z0JBQzFCLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLO2dCQUN4RCxDQUFDLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRTFELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxDQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsYUFBYSxFQUNwQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQ3BCLFFBQVEsR0FBRyxhQUFhLEdBQUcsQ0FBQyxFQUM1QixxQkFBcUIsQ0FDdEIsQ0FBQztZQUNGLDRFQUE0RTtZQUM1RSxNQUFNLFlBQVksR0FJaEIsV0FBVyxJQUFJLE1BQU07Z0JBQ25CLENBQUMsQ0FBQyxNQUFNO3FCQUNILEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO3FCQUM5RCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFlBQVksQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRSxPQUFPO2dCQUNMLENBQUM7Z0JBQ0QsTUFBTTtnQkFDTixFQUFFO2dCQUNGLE1BQU07Z0JBQ04sYUFBYTtnQkFDYixPQUFPLEVBQUU7b0JBQ1AsTUFBTTtvQkFDTixJQUFJLEVBQ0YsSUFBSSxDQUFDLElBQUksSUFBSSxTQUFTO3dCQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLO3dCQUN0QixDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDdEQsT0FBTyxFQUFFLFlBQVk7eUJBQ2xCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ2xCLEtBQUssRUFDSCxNQUFNLENBQ0osa0JBQWtCLElBQUksQ0FBQyxDQUFDLElBQUk7NEJBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQjs0QkFDekIsQ0FBQyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUMxQjt3QkFDSCxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLO3dCQUNuQixLQUFLLEVBQ0gsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDOzRCQUMzRCxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzRCQUNwRCxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRztxQkFDeEQsQ0FBQyxDQUFDO3lCQUNGLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQztpQkFDakU7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxNQUFNLEVBQUUsTUFBTTtZQUNkLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSztZQUNMLE1BQU07WUFDTixJQUFJLEVBQUUsRUFBRTtZQUNSLEtBQUssRUFBRSxFQUFFO1lBQ1QsT0FBTyxFQUFFLEVBQUU7WUFDWCxLQUFLLEVBQUUsRUFBRTtZQUNULElBQUksRUFBRSxFQUFFO1lBQ1IsY0FBYztZQUNkLFVBQVU7WUFDVixjQUFjLEVBQUUsRUFBRTtTQUNuQixDQUFDO0lBQ0osQ0FBQztJQWxnQmUsb0JBQWMsaUJBa2dCN0IsQ0FBQTtJQUVELFNBQWdCLElBQUksQ0FDbEIsTUFBYyxFQUNkLE9BQWEsRUFDYixVQUFzQjtRQUV0QixJQUNFLE1BQU0sQ0FBQyxrQkFBa0I7WUFDekIsQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLFlBQVk7Z0JBQy9CLE1BQU0sQ0FBQyxrQkFBa0IsSUFBSSxZQUFZLENBQUMsRUFDNUM7WUFDQSxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixzRUFBc0UsQ0FDdkUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsSUFBSSxPQUFPLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqRSxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDVixzRUFBc0UsQ0FDdkUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsTUFBTSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuRSxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLE9BQU8sR0FBRyxlQUFlO1lBQzdCLENBQUMsQ0FBQyxTQUFTO1lBQ1gsQ0FBQyxDQUFDO2dCQUNFO29CQUNFLEtBQUssRUFBRSxFQUFFO29CQUNULEtBQUssRUFBRSxDQUFDO2lCQUNUO2FBQ0YsQ0FBQztRQUNOLE1BQU0sTUFBTSxHQUFHLGVBQWU7WUFDNUIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsR0FDeEQsTUFBTSxDQUFDLGtCQUFrQjtZQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQztZQUNyQyxDQUFDLENBQUM7Z0JBQ0UsSUFBSTtnQkFDSixRQUFRO2FBQ1QsQ0FBQztRQUVSLE1BQU0sS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUV6QixNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQWE7YUFDN0IsVUFBVSxDQUFDLElBQUksQ0FBQzthQUNoQixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ2hDLEdBQUcsRUFBYTthQUNiLFdBQVcsQ0FBQyxLQUFLLENBQUM7YUFDbEIsV0FBVyxDQUFDLEtBQUssQ0FBQzthQUNsQixRQUFRLENBQUMsS0FBSyxDQUFDO2FBQ2YsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7YUFDN0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQzFDLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBZ0IsZUFBZTtZQUM3QyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDaEIsK0VBQStFO2dCQUMvRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRTtvQkFDbEMsT0FBTzt3QkFDTCxLQUFLLEVBQUUsRUFBRTt3QkFDVCxJQUFJLEVBQUUsQ0FBQzt3QkFDUCxJQUFJLEVBQUUsQ0FBQzt3QkFDUCxNQUFNLEVBQUUsUUFBUTtxQkFDakIsQ0FBQztpQkFDSDtnQkFDRCxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQzVELE1BQU0sVUFBVSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzdCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN0QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRTt3QkFDekMsT0FBTyxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7cUJBQzdCO3lCQUFNO3dCQUNMLE9BQU8sR0FBRyxhQUFhLENBQUM7cUJBQ3pCO29CQUNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFO3dCQUN6QyxPQUFPLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztxQkFDOUI7aUJBQ0Y7cUJBQU07b0JBQ0wsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUU7d0JBQ3pDLE9BQU8sR0FBRyxhQUFhLEdBQUcsQ0FBQyxDQUFDO3FCQUM3QjtvQkFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRTt3QkFDekMsT0FBTyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7cUJBQzlCO2lCQUNGO2dCQUNELE9BQU87b0JBQ0wsS0FBSyxFQUNILENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXO3dCQUNuQixDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzt3QkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQzNDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLE9BQU87b0JBQzlCLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxHQUFHLE9BQU87b0JBQzlCLE1BQU0sRUFDSixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVO3dCQUNuQyxDQUFDLENBQUMsUUFBUTt3QkFDVixDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDOzRCQUNwQixDQUFDLENBQUMsS0FBSzs0QkFDUCxDQUFDLENBQUMsT0FBTztvQkFDYixJQUFJLEVBQUU7d0JBQ0osRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUNmLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDZixFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQ2xCLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztxQkFDbkI7aUJBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQztZQUNKLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCxPQUFPO1lBQ0wsTUFBTSxFQUFFLEVBQUU7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLEVBQUU7WUFDVCxPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxFQUFFO1lBQ1IsTUFBTTtZQUNOLElBQUk7WUFDSixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVO1lBQ1YsY0FBYyxFQUFFLEVBQUU7U0FDbkIsQ0FBQztJQUNKLENBQUM7SUFwSWUsVUFBSSxPQW9JbkIsQ0FBQTtJQUVELFNBQWdCLFNBQVMsQ0FDdkIsTUFBYyxFQUNkLE9BQWEsRUFDYixVQUFzQjtRQUV0QixNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxhQUFhLENBQUMsSUFBSSxJQUFJLFlBQVksRUFBRTtZQUN0QyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FDViw2RUFBNkUsQ0FDOUUsQ0FBQztZQUNGLE9BQU8sVUFBVSxDQUFDO1NBQ25CO1FBQ0QsSUFDRSxhQUFhLENBQUMsZUFBZTtZQUM3QixhQUFhLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3hDO1lBQ0Esc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysc0VBQXNFLENBQ3ZFLENBQUM7WUFDRixPQUFPLFVBQVUsQ0FBQztTQUNuQjtRQUNELElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFO1lBQzdCLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLG1FQUFtRSxDQUNwRSxDQUFDO1lBQ0YsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFDRCw2RUFBNkU7UUFDN0UsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkUsTUFBTSxXQUFXLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbkQsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUvRCxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdEQsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxtQkFBbUIsQ0FDM0MsSUFBSSxFQUNKLFVBQVUsRUFDVixJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksRUFDSixNQUFNLENBQ1AsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FDL0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUM3QyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FDckMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQ3BDLElBQUksRUFDSixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFDTCxJQUFJLENBQ0wsQ0FBQztZQUNGLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDekMsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsQ0FBQyxFQUFFLE1BQU07Z0JBQ1QsQ0FBQyxFQUFFLE1BQU07Z0JBQ1QsS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU0sRUFBRSxDQUFDO2FBQ1YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixtRUFBbUU7UUFDbkUsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDOUIsTUFBTSxjQUFjLEdBS2QsRUFBRSxDQUFDO1FBQ1QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7WUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BDLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxhQUFhLEVBQUU7b0JBQ2pCLGVBQWUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2lCQUN0QztxQkFBTTtvQkFDTCxlQUFlLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztpQkFDdEM7Z0JBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxxQkFBcUIsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUN6RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztvQkFDZCxjQUFjLENBQUMsSUFBSSxDQUFDO3dCQUNsQixFQUFFO3dCQUNGLEVBQUU7d0JBQ0YsRUFBRTt3QkFDRixFQUFFO3FCQUNILENBQUMsQ0FBQztpQkFDSjthQUNGO1lBQ0QscUJBQXFCLElBQUksZUFBZSxDQUFDO1NBQzFDO1FBRUQsTUFBTSxVQUFVLEdBQWdCLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzVELE1BQU0sU0FBUyxHQUFnQixDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDMUQsTUFBTSxhQUFhLEdBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksY0FBYztvQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU0sT0FBTyxHQUFHLGFBQWE7b0JBQzNCLENBQUMsQ0FBQyxhQUFhLEdBQUcsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU07b0JBQ2pFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFDbkIsT0FBTztvQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO29CQUNoQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPO29CQUN0QyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7b0JBQzdELE1BQU0sRUFBRSxRQUFRO2lCQUNqQixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILFNBQVMsS0FBSyxDQUFDLEdBQTRDO1lBQ3pELE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDekIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQyxNQUFNLFFBQVEsR0FBRyxjQUFjLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLFFBQVEsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwRSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTt3QkFDNUMsYUFBYSxHQUFHLENBQUMsQ0FBQzt3QkFDbEIsTUFBTTtxQkFDUDtpQkFDRjthQUNGO2lCQUFNO2dCQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNsQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxjQUFjLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUU7d0JBQzVDLGFBQWEsR0FBRyxDQUFDLENBQUM7d0JBQ2xCLE1BQU07cUJBQ1A7aUJBQ0Y7YUFDRjtZQUNELElBQUksYUFBYSxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsY0FBYyxFQUFFO29CQUMxQixhQUFhLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDN0M7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLGNBQWMsRUFBRTtvQkFDMUIsYUFBYSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7WUFDRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFFLE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxDQUN4QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsRUFDMUQsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQ3hELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsRUFDckQsTUFBTSxDQUNQLENBQUM7WUFDRixPQUFPO2dCQUNMLENBQUM7Z0JBQ0QsTUFBTTtnQkFDTixFQUFFO2dCQUNGLE1BQU07Z0JBQ04sYUFBYTtnQkFDYixPQUFPLEVBQUU7b0JBQ1AsTUFBTTtvQkFDTixJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLO29CQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7eUJBQ2IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDbEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3QkFDcEMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO3dCQUNkLEtBQUssRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHO3FCQUNuRCxDQUFDLENBQUM7eUJBQ0YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksYUFBYSxDQUFDO2lCQUNqRTthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLE1BQU07WUFDTixNQUFNO1lBQ04sTUFBTTtZQUNOLElBQUk7WUFDSixLQUFLLEVBQUUsRUFBRTtZQUNULE9BQU8sRUFBRSxFQUFFO1lBQ1gsS0FBSyxFQUFFLEVBQUU7WUFDVCxLQUFLO1lBQ0wsSUFBSSxFQUFFLEVBQUU7WUFDUixjQUFjLEVBQUUsRUFBRTtZQUNsQixVQUFVO1lBQ1YsY0FBYztTQUNmLENBQUM7SUFDSixDQUFDO0lBdk1lLGVBQVMsWUF1TXhCLENBQUE7SUFFRCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDeEIsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7SUFDekMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDaEIsNEJBQXNCLEdBQUcsR0FBRyxDQUFDO0lBQzdCLG1CQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUN2QixNQUFNLDRCQUE0QixHQUFHLEVBQUUsQ0FBQztJQUN4QyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDMUIsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUM7SUFDM0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0lBQzdCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztJQUN0QixNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUU3QixTQUFTLFlBQVksQ0FBQyxVQUFzQixFQUFFLE1BQWM7UUFDMUQsTUFBTSxjQUFjLEdBQ2xCLFVBQVUsQ0FBQyxLQUFLO1lBQ2hCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztZQUN0RSxNQUFBLGFBQWEsQ0FBQztRQUNoQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQ2IsV0FBVyxFQUNYLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FDM0QsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FDckIsSUFBb0IsRUFDcEIsTUFBd0MsRUFDeEMsU0FBaUIsRUFDakIsTUFBOEI7UUFFOUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUU7WUFDekMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDdkU7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDcEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUksR0FBRyxTQUFTLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFeEMsNkNBQTZDO1FBQzdDLDhEQUE4RDtRQUM5RCxNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7UUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxTQUFTLHNCQUFzQixDQUM3QixJQUFpQixFQUNqQixNQUEwQyxFQUMxQyxTQUFpQjtRQUVqQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTtZQUN6QyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDbkQ7UUFFRCxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7UUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ1YsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ1osS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSzthQUN2QixDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUErRVksbUJBQWEsR0FBVztRQUNuQyxJQUFJLEVBQUUsTUFBTTtRQUNaLGNBQWMsRUFBRSxJQUFJO1FBQ3BCLE1BQU0sRUFBRSxNQUFBLG1CQUFtQjtRQUMzQixpQkFBaUIsRUFBRSxLQUFLO1FBQ3hCLGdCQUFnQixFQUFFLHFCQUFxQjtRQUN2QyxTQUFTLEVBQUUsVUFBVTtRQUNyQixjQUFjLEVBQUUsSUFBSTtRQUNwQixVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDO0lBRVcsd0JBQWtCLEdBQVc7UUFDeEMsSUFBSSxFQUFFLE9BQU87UUFDYixjQUFjLEVBQUUsSUFBSTtRQUNwQixNQUFNLEVBQUUsTUFBQSxtQkFBbUI7UUFDM0IsaUJBQWlCLEVBQUUsS0FBSztRQUN4QixnQkFBZ0IsRUFBRSxxQkFBcUI7UUFDdkMsU0FBUyxFQUFFLFVBQVU7UUFDckIsY0FBYyxFQUFFLElBQUk7UUFDcEIsVUFBVSxFQUFFLEtBQUs7UUFDakIsZ0JBQWdCLEVBQUU7WUFDaEIsSUFBSSxFQUFFLFFBQVE7WUFDZCxZQUFZLEVBQUUsRUFBRTtTQUNqQjtLQUNGLENBQUM7SUFtR0YsTUFBTSxVQUFVLEdBQWtCO1FBQ2hDLE1BQU0sRUFBRSxFQUFFO1FBQ1YsTUFBTSxFQUFFLEVBQUU7UUFDVixNQUFNLEVBQUUsRUFBRTtRQUNWLEtBQUssRUFBRSxFQUFFO1FBQ1QsT0FBTyxFQUFFLEVBQUU7UUFDWCxLQUFLLEVBQUUsRUFBRTtRQUNULElBQUksRUFBRSxFQUFFO1FBQ1IsSUFBSSxFQUFFLEVBQUU7UUFDUixjQUFjLEVBQUUsRUFBRTtRQUNsQixVQUFVLEVBQUUsRUFBRTtRQUNkLGNBQWMsRUFBRSxFQUFFO0tBQ25CLENBQUM7SUFFRixTQUFTLGdCQUFnQixDQUFDLElBQW9CO1FBQzVDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsU0FBUyxXQUFXLENBQUMsSUFBaUI7UUFDcEMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUyxPQUFPLENBQUMsSUFBVSxFQUFFLGNBQXNCLENBQUM7UUFDbEQsTUFBTSxHQUFHLEdBQ1AsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3JFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxTQUFTLE1BQU0sQ0FBQyxVQUFzQixFQUFFLE1BQWM7UUFDcEQsT0FBTztZQUNMLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxZQUFZO1lBQ3BFLFVBQVUsQ0FBQyxLQUFLLEdBQUcsTUFBQSxhQUFhO1NBQ2pDLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsVUFBc0IsRUFDdEIsSUFBVSxFQUNWLGtCQUEwQixFQUMxQixNQUFjO1FBRWQsSUFBSSxjQUFjLEdBQ2hCLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFBLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUN0RSxJQUFJLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxFQUFFO1lBQzFCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNsRSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUM5QixjQUFjLEVBQ2QsWUFBWSxHQUFHLGdCQUFnQixDQUNoQyxDQUFDO1NBQ0g7UUFDRCwrQkFBK0I7UUFDL0IscUJBQXFCLEdBQUcscUJBQXFCLEdBQUcsYUFBYSxDQUFDO1FBRTlELGtGQUFrRjtRQUNsRixNQUFNLGdCQUFnQixHQUNwQixNQUFNLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLGtCQUFrQixHQUFHLGdCQUFnQjtZQUN2QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsT0FBTztZQUNMLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsWUFBWSxDQUFDLEdBQUcsZ0JBQWdCO1lBQ2hFLFVBQVUsQ0FBQyxLQUFLLEdBQUcsd0JBQXdCO1NBQzVDLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxTQUFTLENBQUMsVUFBc0IsRUFBRSxJQUFVLEVBQUUsTUFBYztRQUNuRSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsY0FBYztZQUNoQyxDQUFDLENBQUMsNkJBQTZCO1lBQy9CLENBQUMsQ0FBQyxZQUFZLENBQUM7UUFDakIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssR0FBRyxNQUFBLGFBQWEsQ0FBQztRQUMvQyxNQUFNLEtBQUssR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQztRQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQsU0FBUyxTQUFTLENBQUMsVUFBc0IsRUFBRSxJQUFVLEVBQUUsTUFBYztRQUNuRSxNQUFNLEdBQUcsR0FDUCxVQUFVLENBQUMsTUFBTTtZQUNqQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RSxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUM7UUFDOUIsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUM1QixNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLFdBQVcsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLFdBQVcsRUFBRSxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxTQUFTLE1BQU0sQ0FBQyxVQUFzQixFQUFFLE1BQWMsRUFBRSxJQUFVO1FBQ2hFLE1BQU0sa0JBQWtCLEdBQ3RCLE1BQU0sQ0FBQyxjQUFjO1lBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE9BQU87WUFDTCxVQUFVLENBQUMsTUFBTTtnQkFDZixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO1lBQ3pFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxXQUFXO1NBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxtQkFBbUIsQ0FDMUIsSUFBVSxFQUNWLFVBQXNCLEVBQ3RCLElBQWdFLEVBQ2hFLGFBQXlFLEVBQ3pFLFNBQWtCLEVBQ2xCLE1BQWM7UUFPZCxNQUFNLGFBQWEsR0FBRztZQUNwQixHQUFHLElBQUk7WUFDUCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ3ZDLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVwRCx1Q0FBdUM7UUFDdkMsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDaEMsTUFBTSxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFFLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FDeEI7Z0JBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNwRCxFQUNELFVBQVUsQ0FDWCxDQUFDO1lBQ0YsTUFBTSxNQUFNLEdBQVksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7YUFDNUIsQ0FBQyxDQUFDLENBQUM7WUFDSixNQUFNLEtBQUssR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFO2dCQUN0QyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUM7WUFDRixPQUFPO2dCQUNMLE1BQU07Z0JBQ04sZUFBZSxFQUFFLE1BQU07Z0JBQ3ZCLEtBQUs7Z0JBQ0wsTUFBTTthQUNQLENBQUM7U0FDSDtRQUVELE1BQU0seUJBQXlCLEdBQUcsc0JBQXNCLENBQ3RELElBQUksRUFDSixTQUFTLEVBQ1QsS0FBSyxDQUNOLENBQUM7UUFDRixNQUFNLDJCQUEyQixHQUFHLHNCQUFzQixDQUN4RCxJQUFJLEVBQ0osU0FBUyxFQUNULElBQUksQ0FDTCxDQUFDO1FBRUYsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDNUIsaUZBQWlGO1FBQ2pGLElBQUksU0FBUyxFQUFFO1lBQ2IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDN0IsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQ2pELENBQUM7WUFDRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQy9CLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUNuRCxDQUFDO1lBQ0YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDekQsTUFBTSxVQUFVLEdBQUcseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUNwRCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hELE1BQU0sWUFBWSxHQUNoQixjQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sY0FBYyxHQUNsQixnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLE9BQU8sR0FBRyxZQUFZLEdBQUcsY0FBYyxDQUFDO2dCQUM5QyxJQUFJLE9BQU8sR0FBRyxtQkFBbUIsRUFBRTtvQkFDakMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDO2lCQUMvQjthQUNGO1NBQ0Y7UUFDRCxNQUFNLGNBQWMsR0FBRztZQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcseUJBQXlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hELG1CQUFtQjtTQUN0QixDQUFDO1FBRUYsOERBQThEO1FBQzlELE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRSxNQUFNLG9CQUFvQixHQUFHLFdBQVcsQ0FDdEM7WUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFELG1CQUFtQjtTQUN0QixFQUNELFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDeEIsQ0FBQyxFQUNELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQ2xDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQ3JDLENBQUM7UUFFRiwySEFBMkg7UUFDM0gsTUFBTSxtQkFBbUIsR0FBRyxvQkFBb0I7YUFDN0MsS0FBSyxDQUFDLFNBQVMsQ0FBQzthQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUM3QixJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztTQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNOLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQ2hCLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksT0FBTyxHQUFHLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDdEIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQ3BELENBQUM7UUFDRixPQUFPLE9BQU8sR0FBRyxPQUFPLEVBQUU7WUFDeEIsT0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDdkI7UUFDRCxPQUFPLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUNqQyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFDaEQsVUFBVSxDQUNYLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBWSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDM0IsY0FBYyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQ3JDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3JDO1NBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLEtBQUssR0FBRyxDQUFDLEtBQWEsRUFBRSxXQUFnQyxFQUFVLEVBQUU7WUFDeEUsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0I7WUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFDRixPQUFPO1lBQ0wsTUFBTTtZQUNOLGVBQWU7WUFDZixLQUFLO1lBQ0wsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsSUFBVSxFQUNWLFNBQWtCLEVBQ2xCLFlBQXFCO1FBRXJCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbEQsaUJBQWlCO1lBQ2pCLE9BQU8sU0FBUztnQkFDZCxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7b0JBQzNCLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO29CQUN6QixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFO3dCQUNsQyxJQUNFLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLFlBQVksRUFDN0Q7NEJBQ0EsU0FBUzt5QkFDVjt3QkFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDMUMsb0NBQW9DO3dCQUNwQyxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTs0QkFDekIsZ0JBQWdCLElBQUksTUFBTSxDQUFDO3lCQUM1QjtxQkFDRjtvQkFDRCxPQUFPLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztnQkFDaEMsQ0FBQyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3BDLElBQUksb0JBQW9CLEdBQWUsRUFBRSxDQUFDO1FBQzFDLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzlDLGlCQUFpQjtnQkFDakIsT0FBTyxTQUFTO29CQUNkLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTt3QkFDM0IsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7d0JBQ3pCLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUU7NEJBQ2xDLElBQ0UsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDO2dDQUMxQyxZQUFZO2dDQUNkLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsaUJBQWlCLEVBQ25EO2dDQUNBLFNBQVM7NkJBQ1Y7NEJBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDekMsb0NBQW9DOzRCQUNwQyxJQUFJLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtnQ0FDekIsZ0JBQWdCLElBQUksTUFBTSxDQUFDOzZCQUM1Qjt5QkFDRjt3QkFDRCxPQUFPLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztvQkFDaEMsQ0FBQyxDQUFDO29CQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE1BQU0sVUFBVSxHQUFtQyxFQUFFLENBQUM7UUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3ZCLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQyxJQUFJLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLFlBQVksRUFBRTtvQkFDNUQsT0FBTyxDQUFDLENBQUM7aUJBQ1Y7Z0JBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FDSCxDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDdkIsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksWUFBWSxFQUFFO29CQUM1RCxPQUFPLENBQUMsQ0FBQztpQkFDVjtnQkFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUNILENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxNQUFNO2dCQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDTixHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUU7d0JBQzNELE9BQU8sQ0FBQyxDQUFDO3FCQUNWO29CQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUNIO2dCQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixNQUFNLE9BQU8sR0FBRyxNQUFNO2dCQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FDTixHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRTtvQkFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUU7d0JBQzNELE9BQU8sQ0FBQyxDQUFDO3FCQUNWO29CQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNkLENBQUMsQ0FBQyxDQUNIO2dCQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixNQUFNLEdBQUcsR0FDUCxRQUFRLEdBQUcsQ0FBQyxJQUFJLFFBQVEsR0FBRyxPQUFPO2dCQUNoQyxDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsT0FBTyxHQUFHLENBQUM7b0JBQ2IsQ0FBQyxDQUFDLE9BQU87b0JBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNSLE1BQU0sR0FBRyxHQUNQLFFBQVEsR0FBRyxDQUFDLElBQUksUUFBUSxHQUFHLE9BQU87Z0JBQ2hDLENBQUMsQ0FBQyxRQUFRO2dCQUNWLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQztvQkFDYixDQUFDLENBQUMsT0FBTztvQkFDVCxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELFNBQVMsdUJBQXVCLENBQUMsSUFBVTtRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3BDLElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsU0FBUywrQkFBK0IsQ0FDdEMsT0FBZSxFQUNmLFlBQW9CLEVBQ3BCLGFBQXFCLEVBQ3JCLGNBQXNCO1FBRXRCLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUM1RSxNQUFNLE1BQU0sR0FBRyxhQUFhLEdBQUcsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUN2QyxPQUFPO1lBQ0wsS0FBSztZQUNMLE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsMEJBQTBCLENBQ2pDLGFBQXNCLEVBQ3RCLGNBQXVCLEVBQ3ZCLE1BQWMsRUFDZCxNQUFjLEVBQ2QsSUFBWSxFQUNaLElBQVksRUFDWixLQUFhO1FBRWIsSUFBSSxhQUFhLElBQUksY0FBYyxFQUFFO1lBQ25DLCtCQUErQjtZQUMvQixNQUFNLEtBQUssR0FBRztZQUNSLE1BQU0sR0FBRyxJQUFJLElBQUksTUFBTTtZQUN2QixLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUM7V0FDakIsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJO1lBQ3JCLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDO2FBQy9CLElBQUksS0FBSyxJQUFJLElBQUksSUFBSTtZQUN0QixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxPQUFPLElBQUksS0FBSyxJQUFJO2FBQ3ZCLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDO2NBQy9CLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSTs7T0FFNUIsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxJQUFJLGFBQWEsRUFBRTtZQUNqQiw4QkFBOEI7WUFDOUIsTUFBTSxLQUFLLEdBQUc7WUFDUixNQUFNLEdBQUcsSUFBSSxJQUFJLE1BQU07WUFDdkIsS0FBSyxHQUFHLElBQUk7WUFDWixxQkFBcUI7WUFDckIsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDZixJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUk7YUFDdkIscUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQUM7Y0FDL0IsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJOztPQUU1QixDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUNELElBQUksY0FBYyxFQUFFO1lBQ2xCLCtCQUErQjtZQUMvQixNQUFNLEtBQUssR0FBRztZQUNSLE1BQU0sSUFBSSxNQUFNO1lBQ2hCLEtBQUssR0FBRyxJQUFJO1dBQ2IsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJO1lBQ3JCLHFCQUFxQixHQUFHLElBQUksR0FBRyxDQUFDO2FBQy9CLElBQUksS0FBSyxJQUFJLElBQUksSUFBSTtZQUN0QixDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs7T0FFcEIsQ0FBQztZQUNGLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCx1QkFBdUI7UUFDdkIsTUFBTSxLQUFLLEdBQUc7VUFDUixNQUFNLElBQUksTUFBTTtVQUNoQixLQUFLO1VBQ0wscUJBQXFCO1VBQ3JCLENBQUMsS0FBSztXQUNMLHFCQUFxQjs7S0FFM0IsQ0FBQztRQUNGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFNBQVMsbUJBQW1CLENBQzFCLElBQVUsRUFDVixVQUFzQixFQUN0QixJQUFnRSxFQUNoRSxhQUF5RSxFQUN6RSxTQUFrQixFQUNsQixNQUFjO1FBT2QsTUFBTSxXQUFXLEdBQUcsNkJBQTZCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9ELE1BQU0sYUFBYSxHQUFHLDZCQUE2QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRXBDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDakMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUMzQixJQUFJLENBQUMsR0FBRyxDQUNOLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQ2IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FDZCxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztZQUM1QyxDQUFDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDOUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQ3RCLENBQUMsTUFBTSxDQUNYLENBQ0YsQ0FDRixFQUNELEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQ2xDLElBQUksQ0FBQyxHQUFHLENBQ04sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDYixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUNkLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztZQUM5QixDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FDdEIsQ0FBQyxNQUFNLENBQ1gsQ0FDRixDQUNGLENBQ0YsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUNqQyxVQUFVLEVBQ1YsSUFBSSxFQUNKLGtCQUFrQixFQUNsQixNQUFNLENBQ1AsQ0FBQztRQUVGLHVDQUF1QztRQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9ELE1BQU0sa0JBQWtCLEdBQUcsc0JBQXNCLENBQy9DLFdBQVcsRUFDWCxTQUFTLEVBQ1QsS0FBSyxDQUNOLENBQUM7WUFDRixNQUFNLE1BQU0sR0FBRyxXQUFXLENBQ3hCO2dCQUNFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDcEQsRUFDRCxVQUFVLENBQ1gsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFZLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbkQsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2FBQzVCLENBQUMsQ0FBQyxDQUFDO1lBRUosTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRTtnQkFDdEMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDO1lBQ0YsT0FBTztnQkFDTCxNQUFNO2dCQUNOLGVBQWUsRUFBRSxNQUFNO2dCQUN2QixLQUFLO2dCQUNMLE1BQU07YUFDUCxDQUFDO1NBQ0g7UUFDRCxNQUFNLHlCQUF5QixHQUFHLHNCQUFzQixDQUN0RCxJQUFJLEVBQ0osU0FBUyxFQUNULEtBQUssQ0FDTixDQUFDO1FBQ0YsTUFBTSwyQkFBMkIsR0FBRyxzQkFBc0IsQ0FDeEQsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLENBQ0wsQ0FBQztRQUNGLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLGlGQUFpRjtRQUNqRixJQUFJLFNBQVMsRUFBRTtZQUNiLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQzdCLEdBQUcseUJBQXlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUNqRCxDQUFDO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMvQixHQUFHLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FDbkQsQ0FBQztZQUNGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pELE1BQU0sVUFBVSxHQUFHLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDcEQsTUFBTSxZQUFZLEdBQUcsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUN4RCxNQUFNLFlBQVksR0FDaEIsY0FBYyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLGNBQWMsR0FDbEIsZ0JBQWdCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxHQUFHLGNBQWMsQ0FBQztnQkFDOUMsSUFBSSxPQUFPLEdBQUcsbUJBQW1CLEVBQUU7b0JBQ2pDLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztpQkFDL0I7YUFDRjtTQUNGO1FBQ0QsTUFBTSxjQUFjLEdBQUc7WUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcseUJBQXlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4RCxtQkFBbUI7U0FDdEIsQ0FBQztRQUNGLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNuRSxNQUFNLG9CQUFvQixHQUFHLFdBQVcsQ0FDdEM7WUFDRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFELG1CQUFtQjtTQUN0QixFQUNELFVBQVUsQ0FDWCxDQUFDO1FBQ0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDeEIsQ0FBQyxFQUNELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQ2xDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQ3JDLENBQUM7UUFFRiwySEFBMkg7UUFDM0gsTUFBTSxtQkFBbUIsR0FBRyxvQkFBb0I7YUFDN0MsS0FBSyxDQUFDLFNBQVMsQ0FBQzthQUNoQixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ1osQ0FBQyxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUM3QixJQUFJLEVBQUUsSUFBSTtZQUNWLEtBQUssRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztTQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNOLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztRQUNwRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQ2hCLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksT0FBTyxHQUFHLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDdEIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQ3BELENBQUM7UUFDRixPQUFPLE9BQU8sR0FBRyxPQUFPLEVBQUU7WUFDeEIsT0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDdkI7UUFDRCxPQUFPLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCO1FBQ0QsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUNqQyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxlQUFlLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFDaEQsVUFBVSxDQUNYLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBWSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0QsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDM0IsY0FBYyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQ3JDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3JDO1NBQ0YsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLEtBQUssR0FBRyxDQUFDLEtBQWEsRUFBRSxXQUFnQyxFQUFVLEVBQUU7WUFDeEUsSUFBSSxXQUFXLEVBQUU7Z0JBQ2YsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0I7WUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFDRixPQUFPO1lBQ0wsTUFBTTtZQUNOLGVBQWU7WUFDZixLQUFLO1lBQ0wsTUFBTTtTQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyw2QkFBNkIsQ0FDcEMsSUFBVSxFQUNWLFdBQW9CO1FBRXBCLE1BQU0sT0FBTyxHQUFTLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQzdCLElBQUksZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxXQUFXLEVBQUU7b0JBQ3pELE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbkM7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7aUJBQ2hFO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQWdCLEVBQUUsS0FBYTtRQUN2RCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNyRSxDQUFDLENBQUMsS0FBSztnQkFDUCxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ25CLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFRCxTQUFTLDZCQUE2QixDQUNwQyxLQUFnRCxFQUNoRCxJQUFZLEVBQ1osS0FBa0U7UUFFbEUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQ25ELENBQUM7UUFDRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUNuRCxDQUFDO1lBQ0YsSUFBSSxXQUFXLEdBQUcsZUFBZSxFQUFFO2dCQUNqQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLGVBQWUsR0FBRyxXQUFXLENBQUM7YUFDL0I7U0FDRjtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTLHNCQUFzQixDQUFDLE1BQWlCLEVBQUUsS0FBYTtRQUM5RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDeEUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ1AsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNuQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsU0FBUyxZQUFZLENBQ25CLEtBQWEsRUFDYixLQUFhLEVBQ2IsT0FBZSxFQUNmLFdBQW1CO1FBRW5CLE1BQU0sVUFBVSxHQUNkLENBQUMsT0FBTyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUM5RCxNQUFNLFdBQVcsR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUNoRSxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzdDLElBQUksWUFBWSxHQUFHLENBQUMsSUFBSSxZQUFZLEdBQUcsUUFBUSxFQUFFO2dCQUMvQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixZQUFZLEdBQUcsUUFBUSxDQUFDO2FBQ3pCO1NBQ0Y7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsU0FBUyxzQkFBc0IsQ0FDN0IsS0FBYSxFQUNiLEtBQWEsRUFDYixXQUFtQjtRQUVuQixNQUFNLFdBQVcsR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUMxQyxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxNQUFNLE1BQU0sR0FDVixDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBQzlELE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7WUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDN0MsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksR0FBRyxRQUFRLEVBQUU7Z0JBQy9DLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLFlBQVksR0FBRyxRQUFRLENBQUM7YUFDekI7U0FDRjtRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FDbEIsSUFBVSxFQUNWLE1BQWMsRUFDZCxNQUFjLEVBQ2QsS0FBa0UsRUFDbEUsU0FBa0IsRUFDbEIsa0JBQTJCLEtBQUs7UUFFaEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQixNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM1RCxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQ3RCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQ3BCLGdCQUFnQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUN4RCxDQUFDO1FBQ0YsSUFBSSxVQUFVLEdBQUcsT0FBTyxFQUFFO1lBQ3hCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixJQUFJLFNBQVMsRUFBRTtnQkFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMvQixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDM0QsbUhBQW1IO29CQUNuSCxJQUNFLGVBQWU7d0JBQ2YsbUJBQW1CLElBQUksS0FBSzt3QkFDNUIsbUJBQW1CLElBQUksU0FBUyxFQUNoQzt3QkFDQSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLENBQUMsaUJBQWlCLEVBQUU7NEJBQzFELFNBQVM7eUJBQ1Y7cUJBQ0Y7b0JBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUN0QixTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUN4QixnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FDbkQsQ0FBQztvQkFDRixzQkFBc0I7b0JBQ3RCLElBQUksVUFBVSxHQUFHLE9BQU8sRUFBRTt3QkFDeEIsU0FBUztxQkFDVjtvQkFDRCxjQUFjLEdBQUcsY0FBYyxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7aUJBQ3hEO2FBQ0Y7WUFDRCxNQUFNLE1BQU0sR0FBRyxPQUFPLEdBQUcsY0FBYyxDQUFDO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsY0FBYyxDQUFDO1lBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDM0I7UUFDRCxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxTQUFTLEVBQUU7WUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMvQixNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDM0QsbUhBQW1IO2dCQUNuSCxJQUNFLGVBQWU7b0JBQ2YsbUJBQW1CLElBQUksS0FBSztvQkFDNUIsbUJBQW1CLElBQUksU0FBUyxFQUNoQztvQkFDQSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLENBQUMsaUJBQWlCLEVBQUU7d0JBQzFELFNBQVM7cUJBQ1Y7aUJBQ0Y7Z0JBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUN0QixTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUN4QixnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FDbkQsQ0FBQztnQkFDRixzQkFBc0I7Z0JBQ3RCLElBQUksVUFBVSxHQUFHLE9BQU8sRUFBRTtvQkFDeEIsU0FBUztpQkFDVjtnQkFDRCxNQUFNLFdBQVcsR0FBRyxVQUFVLEdBQUcsY0FBYyxDQUFDO2dCQUNoRCxjQUFjLEdBQUcsT0FBTyxHQUFHLFdBQVcsQ0FBQzthQUN4QztTQUNGO1FBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxHQUFHLGNBQWMsQ0FBQztRQUMzQyxNQUFNLE1BQU0sR0FBRyxPQUFPLEdBQUcsTUFBTSxHQUFHLGNBQWMsQ0FBQztRQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxTQUFTLHdCQUF3QixDQUMvQixJQUFVLEVBQ1YsTUFBYyxFQUNkLFNBQWlCLEVBQ2pCLE1BQWMsRUFDZCxLQUFrRSxFQUNsRSxTQUFrQjtRQUVsQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDakMsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2pDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFDRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLElBQUksTUFBTTtnQkFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixJQUFJLFNBQVMsRUFDeEM7Z0JBQ0EsT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM3RDtTQUNGO1FBQ0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FDckIsSUFBVSxFQUNWLE1BQWMsRUFDZCxlQUF3QjtRQUV4QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3BDLElBQUksTUFBTSxJQUFJLGVBQWUsRUFBRTtZQUM3QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsU0FBUyxXQUFXLENBQ2xCLElBQVUsRUFDVixNQUFjLEVBQ2QsTUFBYyxFQUNkLEtBQWtFLEVBQ2xFLFNBQWtCLEVBQ2xCLGtCQUEyQixLQUFLO1FBRWhDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUN0QixLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUNwQixnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FDeEQsQ0FBQztRQUNGLElBQUksVUFBVSxHQUFHLE9BQU8sRUFBRTtZQUN4QixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDL0IsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQzNELG1IQUFtSDtvQkFDbkgsSUFDRSxlQUFlO3dCQUNmLG1CQUFtQixJQUFJLEtBQUs7d0JBQzVCLG1CQUFtQixJQUFJLFNBQVMsRUFDaEM7d0JBQ0EsSUFBSSxLQUFLLENBQUMsaUJBQWlCLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFOzRCQUMxRCxTQUFTO3lCQUNWO3FCQUNGO29CQUNELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FDcEIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFDeEIsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQ25ELENBQUM7b0JBQ0Ysc0JBQXNCO29CQUN0QixJQUFJLFFBQVEsR0FBRyxPQUFPLEVBQUU7d0JBQ3RCLFNBQVM7cUJBQ1Y7b0JBQ0QsYUFBYSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7aUJBQ3JDO2FBQ0Y7WUFDRCxNQUFNLE1BQU0sR0FBRyxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBQzFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxVQUFVLENBQUM7WUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLFNBQVMsRUFBRTtZQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUMzRCxtSEFBbUg7Z0JBQ25ILElBQ0UsZUFBZTtvQkFDZixtQkFBbUIsSUFBSSxLQUFLO29CQUM1QixtQkFBbUIsSUFBSSxTQUFTLEVBQ2hDO29CQUNBLElBQUksS0FBSyxDQUFDLGlCQUFpQixJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRTt3QkFDMUQsU0FBUztxQkFDVjtpQkFDRjtnQkFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQ3BCLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQ3hCLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUNuRCxDQUFDO2dCQUNGLHNCQUFzQjtnQkFDdEIsSUFBSSxRQUFRLEdBQUcsT0FBTyxFQUFFO29CQUN0QixTQUFTO2lCQUNWO2dCQUNELGFBQWEsSUFBSSxRQUFRLEdBQUcsT0FBTyxDQUFDO2FBQ3JDO1NBQ0Y7UUFDRCxNQUFNLE1BQU0sR0FBRyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsU0FBUyx3QkFBd0IsQ0FDL0IsSUFBVSxFQUNWLE1BQWMsRUFDZCxTQUFpQixFQUNqQixNQUFjLEVBQ2QsS0FBa0UsRUFDbEUsU0FBa0I7UUFFbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztTQUNoQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLElBQ0UsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixJQUFJLE1BQU07Z0JBQ3BDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLEVBQ3hDO2dCQUNBLE9BQU8sV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDN0Q7U0FDRjtRQUNELE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsSUFBVSxFQUNWLE1BQWMsRUFDZCxNQUFjLEVBQ2Qsa0JBQTJCLEtBQUs7UUFFaEMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUMxQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtnQkFDdEMsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO0lBQzNFLENBQUM7SUFFRCxnRUFBZ0U7SUFDaEUsMEJBQTBCO0lBQzFCLFNBQVMsS0FBSyxDQUFDLElBQVU7UUFDdkIsTUFBTSxPQUFPLEdBQVM7WUFDcEIsR0FBRyxJQUFJO1lBQ1AsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNkLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFdBQVcsRUFBRSxDQUFDLENBQUMsV0FBVzthQUMzQixDQUFDLENBQUM7U0FDSixDQUFDO1FBQ0YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO29CQUNqQixNQUFNLEVBQUUsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDO29CQUMvQixPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzlCLE9BQU8sR0FBRyxFQUFFLENBQUM7aUJBQ2Q7cUJBQU07b0JBQ0wsTUFBTSxFQUFFLEdBQUcsT0FBTyxHQUFHLFNBQVMsQ0FBQztvQkFDL0IsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM5QixPQUFPLEdBQUcsRUFBRSxDQUFDO2lCQUNkO2FBQ0Y7U0FDRjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsbUNBQW1DO0lBQ25DLFNBQVMsSUFBSSxDQUFDLElBQVU7UUFDdEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUU7YUFDM0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3pCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUM1QixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixPQUFPO1lBQ0wsSUFBSSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDMUQsY0FBYztTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsU0FBUyxrQkFBa0IsQ0FBQyxJQUFpQjtRQUMzQyxNQUFNLE9BQU8sR0FBRztZQUNkLEdBQUcsSUFBSTtZQUNQLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNsQyxFQUFFLEVBQUU7Z0JBQ0YsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ25CLEdBQUcsQ0FBQztvQkFDSixNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUMzRCxDQUFDLENBQUM7YUFDSjtTQUNGLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBSUQsU0FBZ0IsUUFBUSxDQUFDLFNBQW9CO1FBQzNDLFFBQVEsU0FBUyxFQUFFO1lBQ2pCLEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBQ1osTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDakM7WUFDRCxLQUFLLFVBQVU7Z0JBQ2IsT0FBTztvQkFDTCxJQUFJLEVBQUUsSUFBSSxpQkFBaUIsRUFBRTtvQkFDN0IsUUFBUSxFQUFFLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQztpQkFDcEMsQ0FBQztZQUNKLEtBQUssWUFBWSxDQUFDLENBQUM7Z0JBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO2FBQ2pDO1lBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQztnQkFDWCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUNqQztTQUNGO0lBQ0gsQ0FBQztJQXBCZSxjQUFRLFdBb0J2QixDQUFBO0lBRVksZUFBUyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBVSxDQUFDO0lBRzlFLFNBQWdCLFlBQVksQ0FBQyxVQUFvQixFQUFFLElBQVU7UUFDM0QsSUFBSSxVQUFVLElBQUksU0FBUyxFQUFFO1lBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDeEQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsT0FBTyxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQztTQUM5QjtRQUNELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFSZSxrQkFBWSxlQVEzQixDQUFBO0lBRUQsU0FBZ0IscUJBQXFCLENBQUMsUUFBa0I7UUFDdEQsUUFBUSxRQUFRLEVBQUU7WUFDaEIsS0FBSyxLQUFLLENBQUM7WUFDWCxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxPQUFPLENBQUM7WUFDakIsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBWGUsMkJBQXFCLHdCQVdwQyxDQUFBO0lBRUQsU0FBZ0IsMkJBQTJCLENBQUMsU0FBZTtRQUN6RCxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDL0Msc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0RBQStELENBQ2hFLENBQUM7U0FDSDtRQUVELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7WUFDZCxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLFdBQVc7U0FDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBZmUsaUNBQTJCLDhCQWUxQyxDQUFBO0lBRUQsU0FBUyxlQUFlLENBQ3RCLEtBRXNDLEVBQ3RDLFFBQThDO1FBRTlDLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRTtZQUN6QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsU0FBUyxVQUFVLENBQUMsS0FBYSxFQUFFLE1BQWM7UUFDL0MsT0FBTztZQUNMLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDekMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztTQUMxQyxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMsRUFsMkZnQixLQUFLLEtBQUwsS0FBSyxRQWsyRnJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNjYWxlTGluZWFyLCBzY2FsZUxpbmVhciwgU2NhbGVUaW1lLCBzY2FsZVV0YyB9IGZyb20gJ2QzLXNjYWxlJztcbmltcG9ydCB7IGFyYywgYXJlYSwgbGluZSwgcGllIH0gZnJvbSAnZDMtc2hhcGUnO1xuaW1wb3J0IHsgdXRjRm9ybWF0IH0gZnJvbSAnZDMtdGltZS1mb3JtYXQnO1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRGF5c1BpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvZGF5cy5waXBlJztcbmltcG9ydCB7IE51bWJlclBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvbnVtYmVyLnBpcGUnO1xuaW1wb3J0IHsgUGVyY2VudGFnZVBpcGUgfSBmcm9tICcuLi8uLi9mb3JtYXQvcGlwZXMvcGVyY2VudGFnZS5waXBlJztcbmltcG9ydCB7IFNtYWxsQ3VycmVuY3lQaXBlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL3NtYWxsLWN1cnJlbmN5LnBpcGUnO1xuXG5leHBvcnQgbmFtZXNwYWNlIENoYXJ0IHtcbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb2xvclBhbGV0dGUgPSBbXG4gICAgLy9CYXNlIGNvbG9yc1xuICAgICctLWJhamEtYmxhc3QtNTAnLFxuICAgICctLXRlYWwtZGlhbW9uZC01MCcsXG4gICAgJy0tZnlyZS01MCcsXG4gICAgJy0tdGFuZy01MCcsXG4gICAgJy0tcHVycC02MCcsXG4gICAgJy0tcm9zaS03MCcsXG4gICAgLy9TaGlmdCBsaWdodGVyIGZyb20gYmFzZSBieSAtMjBcbiAgICAnLS1iYWphLWJsYXN0LTMwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtMzAnLFxuICAgICctLWZ5cmUtMzAnLFxuICAgICctLXRhbmctMzAnLFxuICAgICctLXB1cnAtNDAnLFxuICAgICctLXJvc2ktNTAnLFxuICAgIC8vU2hpZnQgZGFya2VyIGZyb20gYmFzZSBieSArMjBcbiAgICAnLS1iYWphLWJsYXN0LTcwJyxcbiAgICAnLS10ZWFsLWRpYW1vbmQtNzAnLFxuICAgICctLWZ5cmUtNzAnLFxuICAgICctLXRhbmctNzAnLFxuICAgICctLXB1cnAtODAnLFxuICAgICctLXJvc2ktOTAnLFxuICBdO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjaGFydChjb25maWc6IENvbmZpZywgZGF0YTogRGF0YSwgZGltZW5zaW9uczogRGltZW5zaW9ucykge1xuICAgIHJldHVybiBjb25maWcudHlwZSA9PSAnbGluZSdcbiAgICAgID8gbGluZXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnYXJlYSdcbiAgICAgID8gYXJlYXMoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnZG9udXQnXG4gICAgICA/IGFyY3MoY29uZmlnLCBkYXRhLCBkaW1lbnNpb25zKVxuICAgICAgOiBjb25maWcudHlwZSA9PSAnaG9yaXpvbnRhbC1iYXInXG4gICAgICA/IGhvcml6b250YWxCYXJzKGNvbmZpZywgZGF0YSwgZGltZW5zaW9ucylcbiAgICAgIDogY29uZmlnLnR5cGUgPT0gJ2JhcidcbiAgICAgID8gYmFycyhjb25maWcsIGRhdGEsIGRpbWVuc2lvbnMpXG4gICAgICA6IGNvbmZpZy50eXBlID09ICd3YXRlcmZhbGwnXG4gICAgICA/IHdhdGVyZmFsbChjb25maWcsIGRhdGEsIGRpbWVuc2lvbnMpXG4gICAgICA6IGVtcHR5Q2hhcnQ7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGxpbmVzKFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgY29uc3QgeyBkYXRhOiBoaWRkZW5EYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICBpZiAoaGlkZGVuRGF0YS50eXBlID09ICdsYWJlbGVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgTGFiZWxlZCBzZXJpZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGxpbmUgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGlmIChoaWRkZW5EYXRhLnN1cHBsZW1lbnRhcnlZcyAmJiBoaWRkZW5EYXRhLnN1cHBsZW1lbnRhcnlZcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBTdXBwbGVtZW50YXJ5IHkgdmFsdWVzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIG5vbi1iYXIgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIC8vVGhpcyBhc3NpZ25tZW50IG1ha2VzIHR5cGVzY3JpcHQgcmVjb2duaXplIHRoZSBhY3R1YWwgdHlwZSAoVGltZXNlcmllc0RhdGEpXG4gICAgY29uc3QgZGF0YSA9IGhpZGRlbkRhdGE7XG4gICAgY29uc3QgeFNjYWxlID0gc2NhbGVVdGModGltZXNlcmllc0RvbWFpbihkYXRhKSwgeFJhbmdlKGRpbWVuc2lvbnMsIGNvbmZpZykpO1xuICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcblxuICAgIGNvbnN0IHRpY2tDb3VudCA9IGdldFRpY2tDb3VudChkaW1lbnNpb25zLCBjb25maWcpO1xuICAgIGNvbnN0IHhUaWNrcyA9IGdlbmVyYXRlWFRpY2tzKGRhdGEsIHhTY2FsZSwgdGlja0NvdW50LCBmb3JtYXQpO1xuXG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeyBwaXBlOiBzZWNvbmRhcnlQaXBlLCBmdWxsUGlwZTogc2Vjb25kYXJ5RnVsbFBpcGUgfSA9XG4gICAgICBjb25maWcuc2Vjb25kYXJ5VmFsdWVUeXBlXG4gICAgICAgID8gZ2V0UGlwZXMoY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSlcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBwaXBlLFxuICAgICAgICAgICAgZnVsbFBpcGUsXG4gICAgICAgICAgfTtcblxuICAgIGNvbnN0IHsgc2NhbGUsIHlUaWNrcyB9ID0gY2FsY1lTY2FsZXNBbmRUaWNrcyhcbiAgICAgIGRhdGEsXG4gICAgICBkaW1lbnNpb25zLFxuICAgICAgcGlwZSxcbiAgICAgIHNlY29uZGFyeVBpcGUsXG4gICAgICBmYWxzZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuXG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBpbmRpY2VzID0gZGF0YS54Lm1hcCgoXywgaSkgPT4gaSk7XG4gICAgY29uc3QgbGluZXMgPVxuICAgICAgZGF0YS54Lmxlbmd0aCA+IDFcbiAgICAgICAgPyBkYXRhLnlzLm1hcCh5ID0+XG4gICAgICAgICAgICBsaW5lPG51bWJlcj4oXG4gICAgICAgICAgICAgIGkgPT4geFNjYWxlKGRhdGEueFtpXSksXG4gICAgICAgICAgICAgIGkgPT4gc2NhbGUoeS52YWx1ZXNbaV0sIHkuaXNTZWNvbmRhcnkpLFxuICAgICAgICAgICAgKShpbmRpY2VzKSxcbiAgICAgICAgICApXG4gICAgICAgIDogW107XG4gICAgY29uc3QgY2lyY2xlcyA9XG4gICAgICBkYXRhLngubGVuZ3RoID09PSAxXG4gICAgICAgID8gZGF0YS55cy5tYXAoKHlTZXJpZXMsIGkpID0+ICh7XG4gICAgICAgICAgICBjeDogeFNjYWxlKGRhdGEueFswXSksXG4gICAgICAgICAgICBjeTogc2NhbGUoeVNlcmllcy52YWx1ZXNbMF0sIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgaSwgMCkpLFxuICAgICAgICAgIH0pKVxuICAgICAgICA6IFtdO1xuXG4gICAgY29uc3QgeU9mZnNldCA9IFNNQUxMX1BBRERJTkc7XG4gICAgY29uc3QgZGF0YUxhYmVsczogRGF0YUxhYmVsW10gPSBkYXRhLnlzLmZsYXRNYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3ViTGFiZWxzOiBEYXRhTGFiZWxbXSA9IHkudmFsdWVzLm1hcCgodmFsLCB4SW5kZXgpID0+ICh7XG4gICAgICAgIGxhYmVsOlxuICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIHlJbmRleCwgeEluZGV4KVxuICAgICAgICAgICAgPyBzZWNvbmRhcnlQaXBlLnRyYW5zZm9ybSh2YWwpXG4gICAgICAgICAgICA6IHBpcGUudHJhbnNmb3JtKHZhbCkpID8/ICcnLFxuICAgICAgICB5UG9zOiBzY2FsZSh2YWwsIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgpKSAtIHlPZmZzZXQsXG4gICAgICAgIHhQb3M6IHhTY2FsZShkYXRhLnhbeEluZGV4XSksXG4gICAgICAgIGFuY2hvcjogJ21pZGRsZScsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gc3ViTGFiZWxzO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gaG92ZXIocG9zOiB7IHJlY3Q6IERPTVJlY3Q7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0pIHtcbiAgICAgIGNvbnN0IHhJbmRleCA9IGZpbmROZWFyZXN0SW5kZXgoZGF0YS54LCB4U2NhbGUuaW52ZXJ0KHBvcy54KS5nZXRUaW1lKCkpO1xuICAgICAgY29uc3QgeCA9IHhTY2FsZShkYXRhLnhbeEluZGV4XSk7XG4gICAgICBjb25zdCB2aXNpYmxlWUluZGV4ID0gZmluZE5lYXJlc3RJbmRleFdpdGhTZWNvbmRhcnkoXG4gICAgICAgIGRhdGEueXMubWFwKCh5LCBpKSA9PiAoe1xuICAgICAgICAgIHZhbHVlOiB5LnZhbHVlc1t4SW5kZXhdLFxuICAgICAgICAgIGlzU2Vjb25kYXJ5OiBjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGksIHhJbmRleCksXG4gICAgICAgIH0pKSxcbiAgICAgICAgcG9zLnksXG4gICAgICAgIHNjYWxlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHlJbmRleCA9IHZpc2libGVJbmRpY2VzW3Zpc2libGVZSW5kZXhdO1xuICAgICAgY29uc3QgeXMgPSBkYXRhLnlzLm1hcCgoeSwgaSkgPT5cbiAgICAgICAgc2NhbGUoeS52YWx1ZXNbeEluZGV4XSwgY2hlY2tJZlNlY29uZGFyeShkYXRhLCBpLCB4SW5kZXgpKSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgICBmb3JtYXRlZERhdGUoY29uZmlnLmRhdGVGb3JtYXQgfHwgJ2RheScsIGRhdGUpO1xuXG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgcG9zLnJlY3QueCArIHgsXG4gICAgICAgIHBvcy5yZWN0LnkgKyB5c1t2aXNpYmxlWUluZGV4XSxcbiAgICAgICAgOCxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHlzLFxuICAgICAgICB5SW5kZXgsXG4gICAgICAgIHZpc2libGVZSW5kZXgsXG4gICAgICAgIHRvb2x0aXA6IHtcbiAgICAgICAgICBhbmNob3IsXG4gICAgICAgICAgZGF0ZTogZm9ybWF0KG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogZGF0YS55c1xuICAgICAgICAgICAgLm1hcCgoeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgICAgICA/IHNlY29uZGFyeUZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgICAgOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSkpID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3MsXG4gICAgICB5VGlja3MsXG4gICAgICBjb2xvcnMsXG4gICAgICBsaW5lcyxcbiAgICAgIGNpcmNsZXMsXG4gICAgICBob3ZlcixcbiAgICAgIGJhcnM6IFtdLFxuICAgICAgYXJlYXM6IFtdLFxuICAgICAgYXJjczogW10sXG4gICAgICBob3Jpem9udGFsQmFyczogW10sXG4gICAgICBkYXRhTGFiZWxzLFxuICAgICAgd2F0ZXJmYWxsTGluZXM6IFtdLFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gYXJlYXMoXG4gICAgY29uZmlnOiBDb25maWcsXG4gICAgYWxsRGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICApOiBSZW5kZXJlZENoYXJ0IHtcbiAgICBjb25zdCB7IGRhdGE6IHVuY2hlY2tlZERhdGEsIHZpc2libGVJbmRpY2VzIH0gPSBoaWRlKGFsbERhdGEpO1xuICAgIGlmICh1bmNoZWNrZWREYXRhLnR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBMYWJlbGVkIHNlcmllcyBhcmVuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgYXJlYSBjaGFydHNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZW1wdHlDaGFydDtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5zaG93RGF0YUxhYmVscyA9PSB0cnVlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBEYXRhIGxhYmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGZvciBhbnkgc3RhY2tlZCBjaGFydCB0eXBlXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHVuY2hlY2tlZERhdGEuc3VwcGxlbWVudGFyeVlzICYmXG4gICAgICB1bmNoZWNrZWREYXRhLnN1cHBsZW1lbnRhcnlZcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBTdXBwbGVtZW50YXJ5IHkgdmFsdWVzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIG5vbi1iYXIgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIC8vVGhpcyBhc3NpZ25tZW50IG1ha2VzIHR5cGVzY3JpcHQgcmVjb2duaXplIHRoZSBhY3R1YWwgdHlwZSAoVGltZXNlcmllc0RhdGEpXG4gICAgY29uc3QgZGF0YSA9IHVuY2hlY2tlZERhdGE7XG4gICAgY29uc3QgeFNjYWxlID0gc2NhbGVVdGModGltZXNlcmllc0RvbWFpbihkYXRhKSwgeFJhbmdlKGRpbWVuc2lvbnMsIGNvbmZpZykpO1xuICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcbiAgICBjb25zdCB0aWNrQ291bnQgPSBnZXRUaWNrQ291bnQoZGltZW5zaW9ucywgY29uZmlnKTtcbiAgICBjb25zdCB4VGlja3MgPSBnZW5lcmF0ZVhUaWNrcyhkYXRhLCB4U2NhbGUsIHRpY2tDb3VudCwgZm9ybWF0KTtcblxuICAgIGNvbnN0IHsgcGlwZSwgZnVsbFBpcGUgfSA9IGdldFBpcGVzKGNvbmZpZy52YWx1ZVR5cGUpO1xuICAgIGNvbnN0IHsgcGlwZTogc2Vjb25kYXJ5UGlwZSwgZnVsbFBpcGU6IHNlY29uZGFyeUZ1bGxQaXBlIH0gPVxuICAgICAgY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZVxuICAgICAgICA/IGdldFBpcGVzKGNvbmZpZy5zZWNvbmRhcnlWYWx1ZVR5cGUpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgcGlwZSxcbiAgICAgICAgICAgIGZ1bGxQaXBlLFxuICAgICAgICAgIH07XG5cbiAgICBjb25zdCB7IHNjYWxlLCB5VGlja3MgfSA9IGNhbGNZU2NhbGVzQW5kVGlja3MoXG4gICAgICBkYXRhLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHBpcGUsXG4gICAgICBzZWNvbmRhcnlQaXBlLFxuICAgICAgdHJ1ZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICAgIGNvbnN0IHplcm9BeGlzUG9zVmFsID0gc2NhbGUoMCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBpbmRpY2VzID0gZGF0YS54Lm1hcCgoXywgaSkgPT4gaSk7XG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBhcmVhcyA9IGRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+XG4gICAgICBhcmVhPG51bWJlcj4oXG4gICAgICAgIGkgPT4geFNjYWxlKGRhdGEueFtpXSksXG4gICAgICAgIGkgPT4gZ2V0QmFyWUluZm8oZGF0YSwgeUluZGV4LCBpLCBzY2FsZSwgdHJ1ZSkueVZhbHVlLFxuICAgICAgICBpID0+XG4gICAgICAgICAgZ2V0QmFyWUluZm8oZGF0YSwgeUluZGV4LCBpLCBzY2FsZSwgdHJ1ZSkueVZhbHVlICtcbiAgICAgICAgICBnZXRCYXJZSW5mbyhkYXRhLCB5SW5kZXgsIGksIHNjYWxlLCB0cnVlKS5oZWlnaHQsXG4gICAgICApKGluZGljZXMpLFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgY29uc3QgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleChkYXRhLngsIHhTY2FsZS5pbnZlcnQocG9zLngpLmdldFRpbWUoKSk7XG4gICAgICBjb25zdCB4ID0geFNjYWxlKGRhdGEueFt4SW5kZXhdKTtcbiAgICAgIGNvbnN0IGZ1bGxZcyA9IGRhdGEueXMubWFwKChfLCBtYXBZSW5kZXgpID0+XG4gICAgICAgIGdldEJhcllJbmZvKGRhdGEsIG1hcFlJbmRleCwgeEluZGV4LCBzY2FsZSwgdHJ1ZSksXG4gICAgICApO1xuICAgICAgY29uc3QgeXMgPSBmdWxsWXMubWFwKHkgPT4geS55VmFsdWUpO1xuICAgICAgLy9UaGlzIGlzIHRoZSB5cyBhcnJheSwgYnV0IHNoaWZ0ZWQgc28gdGhhdCB0aGUgeSBwb3NpdGlvbiBmb3IgbmVnYXRpdmUgdmFsdWVzIGlzIGF3YXkgZnJvbSB0aGUgYXhpcyAoZm9yIHRoZSBob3ZlciBjaXJjbGVzKVxuICAgICAgY29uc3Qgc2hpZnRlZFlzID0gZnVsbFlzLm1hcCh5ID0+IHtcbiAgICAgICAgaWYgKHkueVZhbHVlID49IHplcm9BeGlzUG9zVmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHkueVZhbHVlICsgeS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHkueVZhbHVlO1xuICAgICAgfSk7XG4gICAgICBjb25zdCB5UG9zU2lnbiA9IHplcm9BeGlzUG9zVmFsIC0gcG9zLnk7XG4gICAgICBsZXQgdmlzaWJsZVlJbmRleCA9IC0xO1xuICAgICAgaWYgKHlQb3NTaWduIDwgMCAmJiBkYXRhLnlzLmZpbmQoeSA9PiB5LnZhbHVlcy5maW5kKHZhbCA9PiB2YWwgPCAwKSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKHlzW2ldID49IHplcm9BeGlzUG9zVmFsICYmIHlzW2ldIDwgcG9zLnkpIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHlzW2ldIDw9IHplcm9BeGlzUG9zVmFsICYmIHlzW2ldIDwgcG9zLnkpIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmlzaWJsZVlJbmRleCA9PSAtMSkge1xuICAgICAgICBpZiAocG9zLnkgPCB6ZXJvQXhpc1Bvc1ZhbCkge1xuICAgICAgICAgIHZpc2libGVZSW5kZXggPSB5cy5pbmRleE9mKE1hdGgubWluKC4uLnlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcy55ID4gemVyb0F4aXNQb3NWYWwpIHtcbiAgICAgICAgICB2aXNpYmxlWUluZGV4ID0geXMuaW5kZXhPZihNYXRoLm1heCguLi55cykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB5SW5kZXggPSB2aXNpYmxlSW5kaWNlc1t2aXNpYmxlWUluZGV4XTtcbiAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBET01SZWN0KFxuICAgICAgICBwb3MucmVjdC54ICsgeCxcbiAgICAgICAgcG9zLnJlY3QueSArIHNoaWZ0ZWRZc1t2aXNpYmxlWUluZGV4XSxcbiAgICAgICAgU01BTExfUEFERElORyxcbiAgICAgICAgMCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4LFxuICAgICAgICB4SW5kZXgsXG4gICAgICAgIHlzOiBzaGlmdGVkWXMsXG4gICAgICAgIHlJbmRleCxcbiAgICAgICAgdmlzaWJsZVlJbmRleCxcbiAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBkYXRlOiB1dGNGb3JtYXQoJyVCICVkLCAlWScpKG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogZGF0YS55c1xuICAgICAgICAgICAgLm1hcCgoeSwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAgIGNvbG9yOiBjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkubGFiZWwsXG4gICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgICAgICA/IHNlY29uZGFyeUZ1bGxQaXBlLnRyYW5zZm9ybSh5LnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgICAgOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS52YWx1ZXNbeEluZGV4XSkpID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3MsXG4gICAgICB5VGlja3MsXG4gICAgICBjb2xvcnMsXG4gICAgICBhcmVhcyxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgaG92ZXIsXG4gICAgICBiYXJzOiBbXSxcbiAgICAgIGFyY3M6IFtdLFxuICAgICAgaG9yaXpvbnRhbEJhcnM6IFtdLFxuICAgICAgZGF0YUxhYmVsczogW10sXG4gICAgICB3YXRlcmZhbGxMaW5lczogW10sXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBiYXJzKFxuICAgIGNvbmZpZzogQmFyQ29uZmlnLFxuICAgIGFsbERhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgKTogUmVuZGVyZWRDaGFydCB7XG4gICAgY29uc3QgeyBkYXRhOiB1bmNoZWNrZWREYXRhLCB2aXNpYmxlSW5kaWNlcyB9ID0gaGlkZShhbGxEYXRhKTtcbiAgICBpZiAodW5jaGVja2VkRGF0YS50eXBlID09ICdsYWJlbGVkJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgTGFiZWxlZCBzZXJpZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIHZlcnRpY2FsIGJhciBjaGFydHNcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZW1wdHlDaGFydDtcbiAgICB9XG4gICAgLy9XaGVuIHRoZXJlJ3Mgb25seSAxIHNlcmllcywgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gJ3N0YWNrZWQnIGFuZCAnY2x1c3RlcmVkJyBkb2Vzbid0IGFwcGx5XG4gICAgY29uc3QgaXNTaW5nbGVTZXJpZXMgPSB1bmNoZWNrZWREYXRhLnlzLmxlbmd0aCA9PSAxO1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy5zaG93RGF0YUxhYmVscyA9PSB0cnVlICYmXG4gICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyAmJlxuICAgICAgIWlzU2luZ2xlU2VyaWVzXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBEYXRhIGxhYmVscyBhcmVuJ3Qgc3VwcG9ydGVkIGZvciBhbnkgc3RhY2tlZCBjaGFydCB0eXBlXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHVuY2hlY2tlZERhdGEuc3VwcGxlbWVudGFyeVlzICYmXG4gICAgICB1bmNoZWNrZWREYXRhLnN1cHBsZW1lbnRhcnlZcy5sZW5ndGggPiAwICYmXG4gICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnICYmXG4gICAgICAhaXNTaW5nbGVTZXJpZXNcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiSGVhZHMgdXAhIFN1cHBsZW1lbnRhcnkgeSB2YWx1ZXMgYXJlbid0IHN1cHBvcnRlZCBmb3IgY2x1c3RlcmVkIGRhdGEgKGp1c3QgdXNlIGFub3RoZXIgbm9ybWFsIHkgc2VyaWVzKVwiLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBlbXB0eUNoYXJ0O1xuICAgIH1cbiAgICAvL1RoaXMgYXNzaWdubWVudCBtYWtlcyB0eXBlc2NyaXB0IHJlY29nbml6ZSB0aGUgYWN0dWFsIHR5cGUgKFRpbWVzZXJpZXNEYXRhKVxuICAgIGNvbnN0IGRhdGEgPSB1bmNoZWNrZWREYXRhO1xuICAgIGNvbnN0IHsgcmFuZ2U6IHhSYW5nZSwgYmluU2l6ZSB9ID0gYmFyWFJhbmdlKGRpbWVuc2lvbnMsIGRhdGEsIGNvbmZpZyk7XG4gICAgY29uc3QgaGFsZkJpblNpemUgPSBiaW5TaXplIC8gMjtcbiAgICBjb25zdCB4U2NhbGUgPSBzY2FsZVV0Yyh0aW1lc2VyaWVzRG9tYWluKGRhdGEpLCB4UmFuZ2UpO1xuICAgIGNvbnN0IGZvcm1hdCA9IChkYXRlOiBEYXRlKSA9PlxuICAgICAgZm9ybWF0ZWREYXRlKGNvbmZpZy5kYXRlRm9ybWF0IHx8ICdkYXknLCBkYXRlKTtcbiAgICBjb25zdCB0aWNrQ291bnQgPSBnZXRUaWNrQ291bnQoZGltZW5zaW9ucywgY29uZmlnKTtcbiAgICBjb25zdCB4VGlja3MgPSBnZW5lcmF0ZVhUaWNrcyhkYXRhLCB4U2NhbGUsIHRpY2tDb3VudCwgZm9ybWF0KTtcblxuICAgIGNvbnN0IHsgcGlwZSwgZnVsbFBpcGUgfSA9IGdldFBpcGVzKGNvbmZpZy52YWx1ZVR5cGUpO1xuICAgIGNvbnN0IHsgcGlwZTogc2Vjb25kYXJ5UGlwZSwgZnVsbFBpcGU6IHNlY29uZGFyeUZ1bGxQaXBlIH0gPVxuICAgICAgY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZVxuICAgICAgICA/IGdldFBpcGVzKGNvbmZpZy5zZWNvbmRhcnlWYWx1ZVR5cGUpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgcGlwZSxcbiAgICAgICAgICAgIGZ1bGxQaXBlLFxuICAgICAgICAgIH07XG5cbiAgICBjb25zdCB7IHNjYWxlLCB5VGlja3MgfSA9IGNhbGNZU2NhbGVzQW5kVGlja3MoXG4gICAgICBkYXRhLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHBpcGUsXG4gICAgICBzZWNvbmRhcnlQaXBlLFxuICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnc3RhY2tlZCcsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbG9ycyA9IHZpc2libGVJbmRpY2VzLm1hcChcbiAgICAgIGkgPT4gY29uZmlnLmNvbG9yc1tpICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdLFxuICAgICk7XG4gICAgY29uc3QgYmFycyA9IGRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+XG4gICAgICB5LnZhbHVlcy5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeVZhbHVlLCBoZWlnaHQgfSA9IGdldEJhcllJbmZvKFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgeUluZGV4LFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnLFxuICAgICAgICApO1xuICAgICAgICBsZXQgeFZhbHVlID0geFNjYWxlKGRhdGEueFtpbmRleF0pIC0gaGFsZkJpblNpemU7XG4gICAgICAgIGxldCB3aWR0aCA9IGJpblNpemU7XG4gICAgICAgIGlmIChjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgICAgd2lkdGggPVxuICAgICAgICAgICAgKGJpblNpemUgLSAoZGF0YS55cy5sZW5ndGggLSAxKSAqIFNNQUxMX1BBRERJTkcpIC8gZGF0YS55cy5sZW5ndGg7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID0geUluZGV4ICogKHdpZHRoICsgU01BTExfUEFERElORyk7XG4gICAgICAgICAgeFZhbHVlID0geFZhbHVlICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHlJbmNsU3VwcENvdW50ID0gZGF0YS5zdXBwbGVtZW50YXJ5WXNcbiAgICAgICAgICA/IGRhdGEuc3VwcGxlbWVudGFyeVlzLmZpbHRlcih5ID0+IHkuYXNzb2NpYXRlZFlJbmRleCA9PSB5SW5kZXgpXG4gICAgICAgICAgICAgIC5sZW5ndGggKyAxXG4gICAgICAgICAgOiAxO1xuICAgICAgICBpZiAoeUluY2xTdXBwQ291bnQgPiAxKSB7XG4gICAgICAgICAgd2lkdGggPVxuICAgICAgICAgICAgKGJpblNpemUgLSAoeUluY2xTdXBwQ291bnQgLSAxKSAqIFNNQUxMX1BBRERJTkcpIC8geUluY2xTdXBwQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHhWYWx1ZSxcbiAgICAgICAgICB5OiB5VmFsdWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgKTtcbiAgICBsZXQgc3VwcEJhcnM6IHtcbiAgICAgIHg6IG51bWJlcjtcbiAgICAgIHk6IG51bWJlcjtcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICB9W11bXSA9IFtdO1xuICAgIGlmIChkYXRhLnN1cHBsZW1lbnRhcnlZcykge1xuICAgICAgc3VwcEJhcnMgPSBkYXRhLnN1cHBsZW1lbnRhcnlZcy5tYXAoKHksIHlJbmRleCkgPT5cbiAgICAgICAgeS52YWx1ZXMubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgeVZhbHVlLCBoZWlnaHQgfSA9IGdldEJhcllJbmZvKFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHlJbmRleCxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsZXQgeFZhbHVlID0geFNjYWxlKGRhdGEueFtpbmRleF0pIC0gaGFsZkJpblNpemU7XG4gICAgICAgICAgbGV0IHdpZHRoID0gYmluU2l6ZTtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1lTdXBwcyA9IGRhdGEuc3VwcGxlbWVudGFyeVlzXG4gICAgICAgICAgICA/IGRhdGEuc3VwcGxlbWVudGFyeVlzLmZpbHRlcihcbiAgICAgICAgICAgICAgICBzdXBwWSA9PiBzdXBwWS5hc3NvY2lhdGVkWUluZGV4ID09IHkuYXNzb2NpYXRlZFlJbmRleCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICBjb25zdCB5SW5jbFN1cHBDb3VudCA9IG1hdGNoaW5nWVN1cHBzLmxlbmd0aCArIDE7XG4gICAgICAgICAgY29uc3QgeVN1cHBNYXRjaGluZ0luZGV4ID0geS5zdXBwbGVtZW50YWxJbmRleCArIDE7XG4gICAgICAgICAgaWYgKHlJbmNsU3VwcENvdW50ID4gMSkge1xuICAgICAgICAgICAgY29uc3QgeENhbGMgPSBjYWxjdWxhdGVYVmFsdWVBbmRPZmZzZXRGb3JCYXJzKFxuICAgICAgICAgICAgICBiaW5TaXplLFxuICAgICAgICAgICAgICB5SW5jbFN1cHBDb3VudCxcbiAgICAgICAgICAgICAgeVN1cHBNYXRjaGluZ0luZGV4LFxuICAgICAgICAgICAgICB4VmFsdWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgd2lkdGggPSB4Q2FsYy53aWR0aDtcbiAgICAgICAgICAgIHhWYWx1ZSA9IHhDYWxjLnhWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHhWYWx1ZSxcbiAgICAgICAgICAgIHk6IHlWYWx1ZSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGJhcnMucHVzaCguLi5zdXBwQmFycyk7XG4gICAgfVxuICAgIGNvbnN0IHplcm9BeGlzUG9zVmFsID0gc2NhbGUoMCwgdHJ1ZSk7XG4gICAgY29uc3QgZGF0YUxhYmVsczogRGF0YUxhYmVsW10gPSBkYXRhLnlzLmZsYXRNYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3ViTGFiZWxzOiBEYXRhTGFiZWxbXSA9IHkudmFsdWVzLm1hcCgodmFsLCB4SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgaXNOZWdhdGl2ZUJhciA9XG4gICAgICAgICAgYmFyc1t5SW5kZXhdW3hJbmRleF0ueSA+PSB6ZXJvQXhpc1Bvc1ZhbCAmJlxuICAgICAgICAgIGJhcnNbeUluZGV4XVt4SW5kZXhdLmhlaWdodCA+IDA7XG4gICAgICAgIGNvbnN0IHlPZmZzZXQgPSBpc05lZ2F0aXZlQmFyXG4gICAgICAgICAgPyBTTUFMTF9QQURESU5HICsgREFUQV9MQUJFTF9IRUlHSFQgKyBiYXJzW3lJbmRleF1beEluZGV4XS5oZWlnaHRcbiAgICAgICAgICA6IC1TTUFMTF9QQURESU5HO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhYmVsOlxuICAgICAgICAgICAgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgpXG4gICAgICAgICAgICAgID8gc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odmFsKVxuICAgICAgICAgICAgICA6IHBpcGUudHJhbnNmb3JtKHZhbCkpID8/ICcnLFxuICAgICAgICAgIHlQb3M6IGJhcnNbeUluZGV4XVt4SW5kZXhdLnkgKyB5T2Zmc2V0LFxuICAgICAgICAgIHhQb3M6IGJhcnNbeUluZGV4XVt4SW5kZXhdLnggKyBiYXJzW3lJbmRleF1beEluZGV4XS53aWR0aCAvIDIsXG4gICAgICAgICAgYW5jaG9yOiAnbWlkZGxlJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN1YkxhYmVscztcbiAgICB9KTtcbiAgICBpZiAoZGF0YS5zdXBwbGVtZW50YXJ5WXMpIHtcbiAgICAgIGNvbnN0IHN1cHBEYXRhTGFiZWxzOiBEYXRhTGFiZWxbXSA9IGRhdGEuc3VwcGxlbWVudGFyeVlzLmZsYXRNYXAoXG4gICAgICAgICh5LCB5SW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdWJMYWJlbHM6IERhdGFMYWJlbFtdID0geS52YWx1ZXMubWFwKCh2YWwsIHhJbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNOZWdhdGl2ZUJhciA9XG4gICAgICAgICAgICAgIHN1cHBCYXJzW3lJbmRleF1beEluZGV4XS55ID49IHplcm9BeGlzUG9zVmFsICYmXG4gICAgICAgICAgICAgIHN1cHBCYXJzW3lJbmRleF1beEluZGV4XS5oZWlnaHQgPiAwO1xuICAgICAgICAgICAgY29uc3QgeU9mZnNldCA9IGlzTmVnYXRpdmVCYXJcbiAgICAgICAgICAgICAgPyBTTUFMTF9QQURESU5HICtcbiAgICAgICAgICAgICAgICBEQVRBX0xBQkVMX0hFSUdIVCArXG4gICAgICAgICAgICAgICAgc3VwcEJhcnNbeUluZGV4XVt4SW5kZXhdLmhlaWdodFxuICAgICAgICAgICAgICA6IC1TTUFMTF9QQURESU5HO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICAgICAgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgsIHRydWUpXG4gICAgICAgICAgICAgICAgICA/IHNlY29uZGFyeVBpcGUudHJhbnNmb3JtKHZhbClcbiAgICAgICAgICAgICAgICAgIDogcGlwZS50cmFuc2Zvcm0odmFsKSkgPz8gJycsXG4gICAgICAgICAgICAgIHlQb3M6IHN1cHBCYXJzW3lJbmRleF1beEluZGV4XS55ICsgeU9mZnNldCxcbiAgICAgICAgICAgICAgeFBvczpcbiAgICAgICAgICAgICAgICBzdXBwQmFyc1t5SW5kZXhdW3hJbmRleF0ueCArIHN1cHBCYXJzW3lJbmRleF1beEluZGV4XS53aWR0aCAvIDIsXG4gICAgICAgICAgICAgIGFuY2hvcjogJ21pZGRsZScsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBzdWJMYWJlbHM7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgZGF0YUxhYmVscy5wdXNoKC4uLnN1cHBEYXRhTGFiZWxzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBob3Zlcihwb3M6IHsgcmVjdDogRE9NUmVjdDsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgICAgY29uc3QgeEluZGV4ID0gZmluZE5lYXJlc3RJbmRleChkYXRhLngsIHhTY2FsZS5pbnZlcnQocG9zLngpLmdldFRpbWUoKSk7XG4gICAgICBjb25zdCB4ID0geFNjYWxlKGRhdGEueFt4SW5kZXhdKTtcbiAgICAgIGxldCBpc1N1cHBWYWx1ZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgICAgbGV0IHN1cHBJbmRleFZhbCA9IDA7XG4gICAgICBsZXQgeUluY2xTdXBwQ291bnQgPSAxO1xuICAgICAgaWYgKGRhdGEuc3VwcGxlbWVudGFyeVlzKSB7XG4gICAgICAgIHlJbmNsU3VwcENvdW50ID0gZ2V0Q2x1c3RlckNvdW50V2l0aFN1cHAoZGF0YSk7XG4gICAgICAgIHN1cHBJbmRleFZhbCA9IGZpbmRTdWJJbmRleCh4LCBwb3MueCwgYmluU2l6ZSwgeUluY2xTdXBwQ291bnQpIC0gMTtcbiAgICAgICAgaWYgKHN1cHBJbmRleFZhbCA+PSAwKSB7XG4gICAgICAgICAgaXNTdXBwVmFsdWUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB5cyA9IGRhdGEueXMubWFwKChfLCBtYXBZSW5kZXgpID0+XG4gICAgICAgIGlzU3VwcFZhbHVlXG4gICAgICAgICAgPyBnZXRTdXBwQmFyWUluZm9WaWFZSW5kZXgoXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIG1hcFlJbmRleCxcbiAgICAgICAgICAgICAgc3VwcEluZGV4VmFsLFxuICAgICAgICAgICAgICB4SW5kZXgsXG4gICAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICAgICAgICkueVZhbHVlXG4gICAgICAgICAgOiBnZXRCYXJZSW5mbyhcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgbWFwWUluZGV4LFxuICAgICAgICAgICAgICB4SW5kZXgsXG4gICAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICAgICAgICkueVZhbHVlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHlQb3NTaWduID0gemVyb0F4aXNQb3NWYWwgLSBwb3MueTtcbiAgICAgIGxldCB2aXNpYmxlWUluZGV4ID0gLTE7XG4gICAgICBpZiAoeVBvc1NpZ24gPCAwICYmIGRhdGEueXMuZmluZCh5ID0+IHkudmFsdWVzLmZpbmQodmFsID0+IHZhbCA8IDApKSkge1xuICAgICAgICBmb3IgKGxldCBpID0geXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAoeXNbaV0gPj0gemVyb0F4aXNQb3NWYWwgJiYgeXNbaV0gPCBwb3MueSkge1xuICAgICAgICAgICAgdmlzaWJsZVlJbmRleCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoeXNbaV0gPD0gemVyb0F4aXNQb3NWYWwgJiYgeXNbaV0gPCBwb3MueSkge1xuICAgICAgICAgICAgdmlzaWJsZVlJbmRleCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgIHZpc2libGVZSW5kZXggPSBmaW5kU3ViSW5kZXgoeCwgcG9zLngsIGJpblNpemUsIGRhdGEueXMubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGlmICh2aXNpYmxlWUluZGV4ID09IC0xKSB7XG4gICAgICAgIGlmIChwb3MueSA8IHplcm9BeGlzUG9zVmFsKSB7XG4gICAgICAgICAgdmlzaWJsZVlJbmRleCA9IHlzLmluZGV4T2YoTWF0aC5taW4oLi4ueXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zLnkgPiB6ZXJvQXhpc1Bvc1ZhbCkge1xuICAgICAgICAgIHZpc2libGVZSW5kZXggPSB5cy5pbmRleE9mKE1hdGgubWF4KC4uLnlzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHlJbmRleCA9IHZpc2libGVJbmRpY2VzW3Zpc2libGVZSW5kZXhdO1xuICAgICAgY29uc3QgeyB5VmFsdWUsIGhlaWdodCB9ID0gaXNTdXBwVmFsdWVcbiAgICAgICAgPyBnZXRTdXBwQmFyWUluZm9WaWFZSW5kZXgoXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgeUluZGV4LFxuICAgICAgICAgICAgc3VwcEluZGV4VmFsLFxuICAgICAgICAgICAgeEluZGV4LFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICAgICApXG4gICAgICAgIDogZ2V0QmFyWUluZm8oXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgeUluZGV4LFxuICAgICAgICAgICAgeEluZGV4LFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICAgICApO1xuXG4gICAgICBjb25zdCB4Q2FsYyA9IGNhbGN1bGF0ZVhWYWx1ZUFuZE9mZnNldEZvckJhcnMoXG4gICAgICAgIGJpblNpemUsXG4gICAgICAgIHlJbmNsU3VwcENvdW50LFxuICAgICAgICBzdXBwSW5kZXhWYWwgKyAxLFxuICAgICAgICB4U2NhbGUoZGF0YS54W3hJbmRleF0pIC0gaGFsZkJpblNpemUsXG4gICAgICApO1xuICAgICAgY29uc3QgYW5jaG9yWCA9IGlzU3VwcFZhbHVlXG4gICAgICAgID8geENhbGMueFZhbHVlXG4gICAgICAgIDogYmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLng7XG4gICAgICBjb25zdCBhbmNob3JXaWR0aCA9IGlzU3VwcFZhbHVlXG4gICAgICAgID8geENhbGMud2lkdGhcbiAgICAgICAgOiBiYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ud2lkdGg7XG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgcG9zLnJlY3QueCArIGFuY2hvclggLSBTTUFMTF9QQURESU5HLFxuICAgICAgICBwb3MucmVjdC55ICsgeVZhbHVlLFxuICAgICAgICBhbmNob3JXaWR0aCArIFNNQUxMX1BBRERJTkcgKiAyLFxuICAgICAgICBoZWlnaHQsXG4gICAgICApO1xuICAgICAgLy9XZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBpbmRleCBmb3IgdGhlIGxhdGVyIGNoZWNrSWZTZWNvbmRhcnkgY2FsbFxuICAgICAgY29uc3QgeXNGb3JNZXRyaWNzOiB7XG4gICAgICAgIGRhdGE6IFN1cHBsZW1lbnRhcnlEYXRhWSB8IERhdGFZO1xuICAgICAgICBvcmlnaW5hbEluZGV4OiBudW1iZXI7XG4gICAgICB9W10gPVxuICAgICAgICBpc1N1cHBWYWx1ZSAmJiBkYXRhLnN1cHBsZW1lbnRhcnlZc1xuICAgICAgICAgID8gZGF0YS5zdXBwbGVtZW50YXJ5WXNcbiAgICAgICAgICAgICAgLm1hcCgoc3VwcFksIGluZGV4KSA9PiAoeyBkYXRhOiBzdXBwWSwgb3JpZ2luYWxJbmRleDogaW5kZXggfSkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoc3VwcFkgPT4gc3VwcFkuZGF0YS5zdXBwbGVtZW50YWxJbmRleCA9PSBzdXBwSW5kZXhWYWwpXG4gICAgICAgICAgOiBkYXRhLnlzLm1hcCgoeSwgaW5kZXgpID0+ICh7IGRhdGE6IHksIG9yaWdpbmFsSW5kZXg6IGluZGV4IH0pKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHgsXG4gICAgICAgIHhJbmRleCxcbiAgICAgICAgeXMsXG4gICAgICAgIHlJbmRleCxcbiAgICAgICAgdmlzaWJsZVlJbmRleCxcbiAgICAgICAgdG9vbHRpcDoge1xuICAgICAgICAgIGFuY2hvcixcbiAgICAgICAgICBkYXRlOiB1dGNGb3JtYXQoJyVCICVkLCAlWScpKG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogeXNGb3JNZXRyaWNzXG4gICAgICAgICAgICAubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgY29sb3JzW1xuICAgICAgICAgICAgICAgICAgJ2Fzc29jaWF0ZWRZSW5kZXgnIGluIHkuZGF0YVxuICAgICAgICAgICAgICAgICAgICA/IHkuZGF0YS5hc3NvY2lhdGVkWUluZGV4XG4gICAgICAgICAgICAgICAgICAgIDogaW5kZXggJSBjb2xvcnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkuZGF0YS5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeS5vcmlnaW5hbEluZGV4LCB4SW5kZXgsIGlzU3VwcFZhbHVlKVxuICAgICAgICAgICAgICAgICAgPyBzZWNvbmRhcnlGdWxsUGlwZS50cmFuc2Zvcm0oeS5kYXRhLnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgICAgOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS5kYXRhLnZhbHVlc1t4SW5kZXhdKSkgPz8gJy0nLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAuZmlsdGVyKChfLCBpKSA9PiBjb25maWcuZ3JvdXBlZFRvb2x0aXAgfHwgaSA9PSB2aXNpYmxlWUluZGV4KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHhUaWNrcyxcbiAgICAgIHlUaWNrcyxcbiAgICAgIGNvbG9ycyxcbiAgICAgIGJhcnMsXG4gICAgICBsaW5lczogW10sXG4gICAgICBjaXJjbGVzOiBbXSxcbiAgICAgIGFyZWFzOiBbXSxcbiAgICAgIGhvdmVyLFxuICAgICAgYXJjczogW10sXG4gICAgICBob3Jpem9udGFsQmFyczogW10sXG4gICAgICBkYXRhTGFiZWxzLFxuICAgICAgd2F0ZXJmYWxsTGluZXM6IFtdLFxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaG9yaXpvbnRhbEJhcnMoXG4gICAgY29uZmlnOiBCYXJDb25maWcsXG4gICAgYWxsRGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICApOiBSZW5kZXJlZENoYXJ0IHtcbiAgICAvL1NvbWUgb2YgdGhpcyBzdHVmZiBnZXRzIGNvbmZ1c2luZywgYmVjYXVzZSB4IGFuZCB5IGFyZSBlc3NlbnRpYWxseSBpbnZlcnRlZCBoZXJlXG4gICAgLy8gIFNvLCBpZiB5b3Ugc2VlIGEgc2l0dWF0aW9uIHdoZXJlIGEgdmFyaWFibGUgaXMgbmFtZWQgJ3knLCBidXQgcmVmZXJlbmNpbmdcbiAgICAvLyAgJ3gnIChvciB2aWNlIHZlcnNhKSwgdGhhdCdzIHdoeVxuICAgIGNvbnN0IHsgZGF0YSwgdmlzaWJsZUluZGljZXMgfSA9IGhpZGUoYWxsRGF0YSk7XG4gICAgLy8nTWV0cmljJyBjaGFydHMgYXJlIGEgc3BlY2lhbCBjYXNlIGZvciBob3Jpem9udGFsIGJhciBjaGFydHMsIHdoZXJlIGVhY2ggc2VyaWVzIGlzIGFsc28gYSBidWNrZXQgKGFuZCB2aWNlIHZlcnNhKVxuICAgIGNvbnN0IGlzTWV0cmljQ2hhcnQgPVxuICAgICAgZGF0YS54Lmxlbmd0aCA9PSBkYXRhLnlzLmxlbmd0aCAmJlxuICAgICAgZGF0YS55cy5sZW5ndGggPT1cbiAgICAgICAgZGF0YS55cy5maWx0ZXIoeSA9PiB5LnZhbHVlcy5maWx0ZXIodmFsID0+IHZhbCAhPSAwKS5sZW5ndGggPT0gMSlcbiAgICAgICAgICAubGVuZ3RoO1xuICAgIC8vV2hlbiB0aGVyZSdzIG9ubHkgMSBzZXJpZXMsIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuICdzdGFja2VkJyBhbmQgJ2NsdXN0ZXJlZCcgZG9lc24ndCBhcHBseVxuICAgIGNvbnN0IGlzU2luZ2xlU2VyaWVzID0gZGF0YS55cy5sZW5ndGggPT0gMTtcbiAgICBpZiAoXG4gICAgICBjb25maWcuc2hvd0RhdGFMYWJlbHMgPT0gdHJ1ZSAmJlxuICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnc3RhY2tlZCcgJiZcbiAgICAgICFpc01ldHJpY0NoYXJ0ICYmXG4gICAgICAhaXNTaW5nbGVTZXJpZXNcbiAgICApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiSGVhZHMgdXAhIERhdGEgbGFiZWxzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIGFueSBzdGFja2VkIGNoYXJ0IHR5cGVcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZW1wdHlDaGFydDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGF0YS5zdXBwbGVtZW50YXJ5WXMgJiZcbiAgICAgIGRhdGEuc3VwcGxlbWVudGFyeVlzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ2NsdXN0ZXJlZCcgJiZcbiAgICAgICFpc1NpbmdsZVNlcmllc1xuICAgICkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJIZWFkcyB1cCEgU3VwcGxlbWVudGFyeSB5IHZhbHVlcyBhcmVuJ3Qgc3VwcG9ydGVkIGZvciBjbHVzdGVyZWQgZGF0YSAoanVzdCB1c2UgYW5vdGhlciBub3JtYWwgeSBzZXJpZXMpXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGNvbnN0IHsgcmFuZ2U6IHlSYW5nZSB9ID0gYmFyWVJhbmdlKGRpbWVuc2lvbnMsIGRhdGEsIGNvbmZpZyk7XG4gICAgbGV0IHlTY2FsZSA9XG4gICAgICBkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnXG4gICAgICAgID8gc2NhbGVMaW5lYXIoaW5kZXhEb21haW4oZGF0YSksIHlSYW5nZSlcbiAgICAgICAgOiBzY2FsZVV0Yyh0aW1lc2VyaWVzRG9tYWluKGRhdGEpLCB5UmFuZ2UpO1xuICAgIGNvbnN0IGRhdGVGb3JtYXQgPSAoZGF0ZTogRGF0ZSkgPT5cbiAgICAgIGZvcm1hdGVkRGF0ZShjb25maWcuZGF0ZUZvcm1hdCB8fCAnZGF5JywgZGF0ZSk7XG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeyBwaXBlOiBzZWNvbmRhcnlQaXBlLCBmdWxsUGlwZTogc2Vjb25kYXJ5RnVsbFBpcGUgfSA9XG4gICAgICBjb25maWcuc2Vjb25kYXJ5VmFsdWVUeXBlXG4gICAgICAgID8gZ2V0UGlwZXMoY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSlcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBwaXBlLFxuICAgICAgICAgICAgZnVsbFBpcGUsXG4gICAgICAgICAgfTtcbiAgICBjb25zdCB5VGlja3MgPSB5U2NhbGUudGlja3MoTWF0aC5tYXgoZGF0YS54Lmxlbmd0aCAtIDEsIDEpKS5tYXAodGljayA9PiAoe1xuICAgICAgeTogeVNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IGlzTnVtYmVyKHRpY2spXG4gICAgICAgID8gZGF0YS50eXBlID09ICdsYWJlbGVkJ1xuICAgICAgICAgID8gZGF0YS54W3RpY2tdLmxhYmVsXG4gICAgICAgICAgOiAnLSdcbiAgICAgICAgOiBkYXRlRm9ybWF0KHRpY2spLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHsgc2NhbGUsIHhUaWNrcyB9ID0gY2FsY1hTY2FsZXNBbmRUaWNrcyhcbiAgICAgIGRhdGEsXG4gICAgICBkaW1lbnNpb25zLFxuICAgICAgcGlwZSxcbiAgICAgIHNlY29uZGFyeVBpcGUsXG4gICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICAgIGNvbnN0IHplcm9BeGlzUG9zVmFsID0gc2NhbGUoMCwgdHJ1ZSk7XG4gICAgY29uc3QgY29sb3JzID0gdmlzaWJsZUluZGljZXMubWFwKFxuICAgICAgaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0sXG4gICAgKTtcbiAgICBjb25zdCBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnM6IHtcbiAgICAgIHhQb3M6IG51bWJlcjtcbiAgICAgIHlQb3M6IG51bWJlcjtcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgfVtdW10gPSBbXTtcbiAgICBjb25zdCBob3Jpem9udGFsQmFycyA9IGRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHN1YlNpbXBIb3JCYXJzOiB7XG4gICAgICAgIHhQb3M6IG51bWJlcjtcbiAgICAgICAgeVBvczogbnVtYmVyO1xuICAgICAgICB3aWR0aDogbnVtYmVyO1xuICAgICAgfVtdID0gW107XG4gICAgICBjb25zdCByZXRWYWwgPSB5LnZhbHVlcy5tYXAoKF8sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgeFZhbHVlLCB3aWR0aCB9ID0gZ2V0QmFyWEluZm8oXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICB5SW5kZXgsXG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnc3RhY2tlZCcsXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHlWYWx1ZSA9XG4gICAgICAgICAgeVNjYWxlKGRhdGEudHlwZSA9PSAnbGFiZWxlZCcgPyBpbmRleCA6IGRhdGEueFtpbmRleF0pIC1cbiAgICAgICAgICBIT1JJWk9OVEFMX0JBUl9IRUlHSFQgKiAxLjU7XG4gICAgICAgIGlmIChjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgICAgY29uc3QgY2VudGVySW5kZXggPSBkYXRhLnlzLmxlbmd0aCAvIDIgLSAwLjU7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgICAgICh5SW5kZXggLSBjZW50ZXJJbmRleCkgKiAoSE9SSVpPTlRBTF9CQVJfSEVJR0hUICsgU01BTExfUEFERElORyk7XG4gICAgICAgICAgeVZhbHVlID0geVZhbHVlICsgb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nWVN1cHBzID0gZGF0YS5zdXBwbGVtZW50YXJ5WXNcbiAgICAgICAgICA/IGRhdGEuc3VwcGxlbWVudGFyeVlzLmZpbHRlcihcbiAgICAgICAgICAgICAgc3VwcFkgPT4gc3VwcFkuYXNzb2NpYXRlZFlJbmRleCA9PSB5SW5kZXgsXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBbXTtcbiAgICAgICAgY29uc3QgeUluY2xTdXBwQ291bnQgPSBtYXRjaGluZ1lTdXBwcy5sZW5ndGggKyAxO1xuICAgICAgICBjb25zdCB5U3VwcE1hdGNoaW5nSW5kZXggPSAwO1xuICAgICAgICBpZiAoeUluY2xTdXBwQ291bnQgPiAxKSB7XG4gICAgICAgICAgY29uc3QgY2VudGVySW5kZXggPSB5SW5jbFN1cHBDb3VudCAvIDIgLSAwLjU7XG4gICAgICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgICAgICh5U3VwcE1hdGNoaW5nSW5kZXggLSBjZW50ZXJJbmRleCkgKlxuICAgICAgICAgICAgKEhPUklaT05UQUxfQkFSX0hFSUdIVCArIFNNQUxMX1BBRERJTkcpO1xuICAgICAgICAgIHlWYWx1ZSA9IHlWYWx1ZSArIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhvclIgPSBNYXRoLm1pbig0LCBNYXRoLmZsb29yKHdpZHRoIC8gMikpO1xuICAgICAgICBjb25zdCB2ZXJSID0gTWF0aC5taW4oNCwgTWF0aC5mbG9vcihIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLyAyKSk7XG4gICAgICAgIHN1YlNpbXBIb3JCYXJzLnB1c2goe1xuICAgICAgICAgIHhQb3M6IHhWYWx1ZSxcbiAgICAgICAgICB5UG9zOiB5VmFsdWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgIH0pO1xuICAgICAgICAvL0Rvbid0IGRyYXcgYW55dGhpbmcgZm9yIHplcm8tdmFsdWUgYmFyc1xuICAgICAgICBpZiAod2lkdGggPT0gMCkge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUG9zaXRpdmUgPSBkYXRhLnlzW3lJbmRleF0udmFsdWVzW2luZGV4XSA+IDA7XG4gICAgICAgIGNvbnN0IGhhc0FueU5lZ2F0aXZlQmFycyA9IGRhdGEueXNcbiAgICAgICAgICAubWFwKHkgPT4geS52YWx1ZXNbaW5kZXhdKVxuICAgICAgICAgIC5maW5kKHZhbCA9PiB2YWwgPCAwKTtcbiAgICAgICAgY29uc3QgaGFzQW55UG9zaXRpdmVCYXJzID0gZGF0YS55c1xuICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgLmZpbmQodmFsID0+IHZhbCA+IDApO1xuXG4gICAgICAgIC8vVGhlc2UgY2hlY2tzIGFyZSB0byBtYWtlIHN1cmUgd2Ugc3RpbGwgcm91bmQgaWYgYWxsIHByZXZpb3VzL2xhdGVyIHZhbHVlcyBhcmUgMFxuICAgICAgICBjb25zdCBhbGxMZWZ0WmVybyA9IGlzUG9zaXRpdmVcbiAgICAgICAgICA/IGRhdGEueXNcbiAgICAgICAgICAgICAgLnNsaWNlKDAsIHlJbmRleClcbiAgICAgICAgICAgICAgLm1hcCh5ID0+IHkudmFsdWVzW2luZGV4XSlcbiAgICAgICAgICAgICAgLmZpbHRlcih2YWwgPT4gdmFsID4gMCkubGVuZ3RoID09IDAgJiYgIWhhc0FueU5lZ2F0aXZlQmFyc1xuICAgICAgICAgIDogZGF0YS55c1xuICAgICAgICAgICAgICAuc2xpY2UoeUluZGV4ICsgMSwgZGF0YS55cy5sZW5ndGgpXG4gICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgIC5maWx0ZXIodmFsID0+IHZhbCA8IDApLmxlbmd0aCA9PSAwO1xuICAgICAgICBjb25zdCBsZWZ0U2lkZVJvdW5kID0gY29uZmlnLmdyb3VwaW5nVHlwZSA9PSAnY2x1c3RlcmVkJyB8fCBhbGxMZWZ0WmVybztcbiAgICAgICAgY29uc3QgYWxsUmlnaHRaZXJvID0gaXNQb3NpdGl2ZVxuICAgICAgICAgID8gZGF0YS55c1xuICAgICAgICAgICAgICAuc2xpY2UoeUluZGV4ICsgMSwgZGF0YS55cy5sZW5ndGgpXG4gICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgIC5maWx0ZXIodmFsID0+IHZhbCA+IDApLmxlbmd0aCA9PSAwXG4gICAgICAgICAgOiBkYXRhLnlzXG4gICAgICAgICAgICAgIC5zbGljZSgwLCB5SW5kZXgpXG4gICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgIC5maWx0ZXIodmFsID0+IHZhbCA8IDApLmxlbmd0aCA9PSAwICYmICFoYXNBbnlQb3NpdGl2ZUJhcnM7XG4gICAgICAgIGNvbnN0IHJpZ2h0U2lkZVJvdW5kID1cbiAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnIHx8IGFsbFJpZ2h0WmVybztcbiAgICAgICAgY29uc3QgcGF0aEQgPSBjYWxjdWxhdGVIb3Jpem9udGFsQmFyUGF0aChcbiAgICAgICAgICBsZWZ0U2lkZVJvdW5kLFxuICAgICAgICAgIHJpZ2h0U2lkZVJvdW5kLFxuICAgICAgICAgIHhWYWx1ZSxcbiAgICAgICAgICB5VmFsdWUsXG4gICAgICAgICAgaG9yUixcbiAgICAgICAgICB2ZXJSLFxuICAgICAgICAgIHdpZHRoLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcGF0aEQ7XG4gICAgICB9KTtcbiAgICAgIHNpbXBsaWZpZWRIb3Jpem9udGFsQmFycy5wdXNoKHN1YlNpbXBIb3JCYXJzKTtcbiAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfSk7XG4gICAgY29uc3Qgc3VwcFlzID0gZGF0YS5zdXBwbGVtZW50YXJ5WXM7XG4gICAgY29uc3Qgc2ltcGxpZmllZFN1cHBIb3Jpem9udGFsQmFyczoge1xuICAgICAgeFBvczogbnVtYmVyO1xuICAgICAgeVBvczogbnVtYmVyO1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICB9W11bXSA9IFtdO1xuICAgIGlmIChzdXBwWXMpIHtcbiAgICAgIGNvbnN0IHN1cHBIb3Jpem9udGFsQmFycyA9IHN1cHBZcy5tYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBzdWJTaW1wSG9yQmFyczoge1xuICAgICAgICAgIHhQb3M6IG51bWJlcjtcbiAgICAgICAgICB5UG9zOiBudW1iZXI7XG4gICAgICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgICAgfVtdID0gW107XG4gICAgICAgIGNvbnN0IHJldFZhbCA9IHkudmFsdWVzLm1hcCgoXywgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHhWYWx1ZSwgd2lkdGggfSA9IGdldEJhclhJbmZvKFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHlJbmRleCxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxldCB5VmFsdWUgPVxuICAgICAgICAgICAgeVNjYWxlKGRhdGEudHlwZSA9PSAnbGFiZWxlZCcgPyBpbmRleCA6IGRhdGEueFtpbmRleF0pIC1cbiAgICAgICAgICAgIEhPUklaT05UQUxfQkFSX0hFSUdIVCAqIDEuNTtcbiAgICAgICAgICBjb25zdCBtYXRjaGluZ1lTdXBwcyA9IGRhdGEuc3VwcGxlbWVudGFyeVlzXG4gICAgICAgICAgICA/IGRhdGEuc3VwcGxlbWVudGFyeVlzLmZpbHRlcihcbiAgICAgICAgICAgICAgICBzdXBwWSA9PiBzdXBwWS5hc3NvY2lhdGVkWUluZGV4ID09IHkuYXNzb2NpYXRlZFlJbmRleCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICBjb25zdCB5SW5jbFN1cHBDb3VudCA9IG1hdGNoaW5nWVN1cHBzLmxlbmd0aCArIDE7XG4gICAgICAgICAgY29uc3QgeVN1cHBNYXRjaGluZ0luZGV4ID0geS5zdXBwbGVtZW50YWxJbmRleCArIDE7XG4gICAgICAgICAgaWYgKHlJbmNsU3VwcENvdW50ID4gMSkge1xuICAgICAgICAgICAgY29uc3QgY2VudGVySW5kZXggPSB5SW5jbFN1cHBDb3VudCAvIDIgLSAwLjU7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPVxuICAgICAgICAgICAgICAoeVN1cHBNYXRjaGluZ0luZGV4IC0gY2VudGVySW5kZXgpICpcbiAgICAgICAgICAgICAgKEhPUklaT05UQUxfQkFSX0hFSUdIVCArIFNNQUxMX1BBRERJTkcpO1xuICAgICAgICAgICAgeVZhbHVlID0geVZhbHVlICsgb2Zmc2V0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGhvclIgPSBNYXRoLm1pbig0LCBNYXRoLmZsb29yKHdpZHRoIC8gMikpO1xuICAgICAgICAgIGNvbnN0IHZlclIgPSBNYXRoLm1pbig0LCBNYXRoLmZsb29yKEhPUklaT05UQUxfQkFSX0hFSUdIVCAvIDIpKTtcbiAgICAgICAgICBzdWJTaW1wSG9yQmFycy5wdXNoKHtcbiAgICAgICAgICAgIHhQb3M6IHhWYWx1ZSxcbiAgICAgICAgICAgIHlQb3M6IHlWYWx1ZSxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vRG9uJ3QgZHJhdyBhbnl0aGluZyBmb3IgemVyby12YWx1ZSBiYXJzXG4gICAgICAgICAgaWYgKHdpZHRoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpc1Bvc2l0aXZlID0gc3VwcFlzW3lJbmRleF0udmFsdWVzW2luZGV4XSA+IDA7XG4gICAgICAgICAgY29uc3QgaGFzQW55TmVnYXRpdmVCYXJzID0gc3VwcFlzXG4gICAgICAgICAgICAuZmlsdGVyKHN1cHBZID0+IHN1cHBZLnN1cHBsZW1lbnRhbEluZGV4ID09IHkuc3VwcGxlbWVudGFsSW5kZXgpXG4gICAgICAgICAgICAubWFwKHkgPT4geS52YWx1ZXNbaW5kZXhdKVxuICAgICAgICAgICAgLmZpbmQodmFsID0+IHZhbCA8IDApO1xuICAgICAgICAgIGNvbnN0IGhhc0FueVBvc2l0aXZlQmFycyA9IHN1cHBZc1xuICAgICAgICAgICAgLmZpbHRlcihzdXBwWSA9PiBzdXBwWS5zdXBwbGVtZW50YWxJbmRleCA9PSB5LnN1cHBsZW1lbnRhbEluZGV4KVxuICAgICAgICAgICAgLm1hcCh5ID0+IHkudmFsdWVzW2luZGV4XSlcbiAgICAgICAgICAgIC5maW5kKHZhbCA9PiB2YWwgPiAwKTtcblxuICAgICAgICAgIC8vVGhlc2UgY2hlY2tzIGFyZSB0byBtYWtlIHN1cmUgd2Ugc3RpbGwgcm91bmQgaWYgYWxsIHByZXZpb3VzL2xhdGVyIHZhbHVlcyBhcmUgMFxuICAgICAgICAgIGNvbnN0IGFsbExlZnRaZXJvID0gaXNQb3NpdGl2ZVxuICAgICAgICAgICAgPyBzdXBwWXNcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgeUluZGV4KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoc3VwcFkgPT4gc3VwcFkuc3VwcGxlbWVudGFsSW5kZXggPT0geS5zdXBwbGVtZW50YWxJbmRleClcbiAgICAgICAgICAgICAgICAubWFwKHkgPT4geS52YWx1ZXNbaW5kZXhdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIodmFsID0+IHZhbCA+IDApLmxlbmd0aCA9PSAwICYmICFoYXNBbnlOZWdhdGl2ZUJhcnNcbiAgICAgICAgICAgIDogc3VwcFlzXG4gICAgICAgICAgICAgICAgLnNsaWNlKHlJbmRleCArIDEsIHN1cHBZcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzdXBwWSA9PiBzdXBwWS5zdXBwbGVtZW50YWxJbmRleCA9PSB5LnN1cHBsZW1lbnRhbEluZGV4KVxuICAgICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcih2YWwgPT4gdmFsIDwgMCkubGVuZ3RoID09IDA7XG4gICAgICAgICAgY29uc3QgbGVmdFNpZGVSb3VuZCA9XG4gICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnIHx8IGFsbExlZnRaZXJvO1xuICAgICAgICAgIGNvbnN0IGFsbFJpZ2h0WmVybyA9IGlzUG9zaXRpdmVcbiAgICAgICAgICAgID8gc3VwcFlzXG4gICAgICAgICAgICAgICAgLnNsaWNlKHlJbmRleCArIDEsIHN1cHBZcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzdXBwWSA9PiBzdXBwWS5zdXBwbGVtZW50YWxJbmRleCA9PSB5LnN1cHBsZW1lbnRhbEluZGV4KVxuICAgICAgICAgICAgICAgIC5tYXAoeSA9PiB5LnZhbHVlc1tpbmRleF0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcih2YWwgPT4gdmFsID4gMCkubGVuZ3RoID09IDBcbiAgICAgICAgICAgIDogc3VwcFlzXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIHlJbmRleClcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHN1cHBZID0+IHN1cHBZLnN1cHBsZW1lbnRhbEluZGV4ID09IHkuc3VwcGxlbWVudGFsSW5kZXgpXG4gICAgICAgICAgICAgICAgLm1hcCh5ID0+IHkudmFsdWVzW2luZGV4XSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHZhbCA9PiB2YWwgPCAwKS5sZW5ndGggPT0gMCAmJiAhaGFzQW55UG9zaXRpdmVCYXJzO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0U2lkZVJvdW5kID1cbiAgICAgICAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ2NsdXN0ZXJlZCcgfHwgYWxsUmlnaHRaZXJvO1xuICAgICAgICAgIGNvbnN0IHBhdGhEID0gY2FsY3VsYXRlSG9yaXpvbnRhbEJhclBhdGgoXG4gICAgICAgICAgICBsZWZ0U2lkZVJvdW5kLFxuICAgICAgICAgICAgcmlnaHRTaWRlUm91bmQsXG4gICAgICAgICAgICB4VmFsdWUsXG4gICAgICAgICAgICB5VmFsdWUsXG4gICAgICAgICAgICBob3JSLFxuICAgICAgICAgICAgdmVyUixcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHBhdGhEO1xuICAgICAgICB9KTtcbiAgICAgICAgc2ltcGxpZmllZFN1cHBIb3Jpem9udGFsQmFycy5wdXNoKHN1YlNpbXBIb3JCYXJzKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgIH0pO1xuICAgICAgaG9yaXpvbnRhbEJhcnMucHVzaCguLi5zdXBwSG9yaXpvbnRhbEJhcnMpO1xuICAgIH1cblxuICAgIGNvbnN0IHlPZmZzZXQgPSBIT1JJWk9OVEFMX0JBUl9IRUlHSFQ7XG4gICAgY29uc3QgZGF0YUxhYmVsczogRGF0YUxhYmVsW10gPSBkYXRhLnlzLmZsYXRNYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3ViTGFiZWxzOiBEYXRhTGFiZWxbXSA9IHkudmFsdWVzLm1hcCgodmFsLCB4SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgYmFySXNOZWdhdGl2ZSA9XG4gICAgICAgICAgc2ltcGxpZmllZEhvcml6b250YWxCYXJzW3lJbmRleF1beEluZGV4XS54UG9zIDwgemVyb0F4aXNQb3NWYWwgJiZcbiAgICAgICAgICBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnNbeUluZGV4XVt4SW5kZXhdLndpZHRoID4gMDtcbiAgICAgICAgY29uc3QgeE9mZnNldCA9IGJhcklzTmVnYXRpdmVcbiAgICAgICAgICA/IC1TTUFMTF9QQURESU5HXG4gICAgICAgICAgOiBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnNbeUluZGV4XVt4SW5kZXhdLndpZHRoICsgU01BTExfUEFERElORztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIHlJbmRleCwgeEluZGV4KVxuICAgICAgICAgICAgICA/IHNlY29uZGFyeVBpcGUudHJhbnNmb3JtKHZhbClcbiAgICAgICAgICAgICAgOiBwaXBlLnRyYW5zZm9ybSh2YWwpKSA/PyAnJyxcbiAgICAgICAgICB5UG9zOiBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnNbeUluZGV4XVt4SW5kZXhdLnlQb3MgKyB5T2Zmc2V0LFxuICAgICAgICAgIHhQb3M6IHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t5SW5kZXhdW3hJbmRleF0ueFBvcyArIHhPZmZzZXQsXG4gICAgICAgICAgYW5jaG9yOiBiYXJJc05lZ2F0aXZlID8gJ2VuZCcgOiAnc3RhcnQnLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3ViTGFiZWxzO1xuICAgIH0pO1xuICAgIGlmIChzdXBwWXMpIHtcbiAgICAgIGNvbnN0IHN1cHBEYXRhTGFiZWxzOiBEYXRhTGFiZWxbXSA9IHN1cHBZcy5mbGF0TWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc3ViTGFiZWxzOiBEYXRhTGFiZWxbXSA9IHkudmFsdWVzLm1hcCgodmFsLCB4SW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXJJc05lZ2F0aXZlID1cbiAgICAgICAgICAgIHNpbXBsaWZpZWRTdXBwSG9yaXpvbnRhbEJhcnNbeUluZGV4XVt4SW5kZXhdLnhQb3MgPFxuICAgICAgICAgICAgICB6ZXJvQXhpc1Bvc1ZhbCAmJlxuICAgICAgICAgICAgc2ltcGxpZmllZFN1cHBIb3Jpem9udGFsQmFyc1t5SW5kZXhdW3hJbmRleF0ud2lkdGggPiAwO1xuICAgICAgICAgIGNvbnN0IHhPZmZzZXQgPSBiYXJJc05lZ2F0aXZlXG4gICAgICAgICAgICA/IC1TTUFMTF9QQURESU5HXG4gICAgICAgICAgICA6IHNpbXBsaWZpZWRTdXBwSG9yaXpvbnRhbEJhcnNbeUluZGV4XVt4SW5kZXhdLndpZHRoICtcbiAgICAgICAgICAgICAgU01BTExfUEFERElORztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIHlJbmRleCwgeEluZGV4LCB0cnVlKVxuICAgICAgICAgICAgICAgID8gc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odmFsKVxuICAgICAgICAgICAgICAgIDogcGlwZS50cmFuc2Zvcm0odmFsKSkgPz8gJycsXG4gICAgICAgICAgICB5UG9zOiBzaW1wbGlmaWVkU3VwcEhvcml6b250YWxCYXJzW3lJbmRleF1beEluZGV4XS55UG9zICsgeU9mZnNldCxcbiAgICAgICAgICAgIHhQb3M6IHNpbXBsaWZpZWRTdXBwSG9yaXpvbnRhbEJhcnNbeUluZGV4XVt4SW5kZXhdLnhQb3MgKyB4T2Zmc2V0LFxuICAgICAgICAgICAgYW5jaG9yOiBiYXJJc05lZ2F0aXZlID8gJ2VuZCcgOiAnc3RhcnQnLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3ViTGFiZWxzO1xuICAgICAgfSk7XG4gICAgICBkYXRhTGFiZWxzLnB1c2goLi4uc3VwcERhdGFMYWJlbHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhvdmVyKHBvczogeyByZWN0OiBET01SZWN0OyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG4gICAgICBsZXQgeEluZGV4OiBudW1iZXIgPSAwO1xuICAgICAgbGV0IHggPSAwO1xuICAgICAgaWYgKGNoZWNrWVNjYWxlVHlwZSh5U2NhbGUsIGRhdGEudHlwZSkgJiYgZGF0YS50eXBlICE9ICdsYWJlbGVkJykge1xuICAgICAgICB4SW5kZXggPSBmaW5kTmVhcmVzdEluZGV4KGRhdGEueCwgeVNjYWxlLmludmVydChwb3MueSkuZ2V0VGltZSgpKTtcbiAgICAgICAgeCA9IHlTY2FsZShkYXRhLnhbeEluZGV4XSkgLSBTTUFMTF9QQURESU5HO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIWNoZWNrWVNjYWxlVHlwZSh5U2NhbGUsIGRhdGEudHlwZSkgJiZcbiAgICAgICAgZGF0YS50eXBlID09ICdsYWJlbGVkJ1xuICAgICAgKSB7XG4gICAgICAgIHhJbmRleCA9IGZpbmROZWFyZXN0SW5kZXhTdHJpbmcoZGF0YS54LCB5U2NhbGUuaW52ZXJ0KHBvcy55KSk7XG4gICAgICAgIHggPSB5U2NhbGUoeEluZGV4KSAtIFNNQUxMX1BBRERJTkc7XG4gICAgICB9XG4gICAgICBsZXQgaXNTdXBwVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgIGxldCBzdXBwSW5kZXhWYWwgPSAwO1xuICAgICAgbGV0IHlJbmNsU3VwcENvdW50ID0gMTtcbiAgICAgIGlmIChkYXRhLnN1cHBsZW1lbnRhcnlZcykge1xuICAgICAgICB5SW5jbFN1cHBDb3VudCA9IGdldENsdXN0ZXJDb3VudFdpdGhTdXBwKGRhdGEpO1xuICAgICAgICBzdXBwSW5kZXhWYWwgPSBmaW5kU3ViSW5kZXhIb3Jpem9udGFsKHgsIHBvcy55LCB5SW5jbFN1cHBDb3VudCkgLSAxO1xuICAgICAgICBpZiAoc3VwcEluZGV4VmFsID49IDApIHtcbiAgICAgICAgICBpc1N1cHBWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxZcyA9IGRhdGEueXMubWFwKChfLCBtYXBZSW5kZXgpID0+XG4gICAgICAgIGlzU3VwcFZhbHVlXG4gICAgICAgICAgPyBnZXRTdXBwQmFyWEluZm9WaWFZSW5kZXgoXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIG1hcFlJbmRleCxcbiAgICAgICAgICAgICAgc3VwcEluZGV4VmFsLFxuICAgICAgICAgICAgICB4SW5kZXgsXG4gICAgICAgICAgICAgIHNjYWxlLFxuICAgICAgICAgICAgICBjb25maWcuZ3JvdXBpbmdUeXBlID09ICdzdGFja2VkJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGdldEJhclhJbmZvKFxuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICBtYXBZSW5kZXgsXG4gICAgICAgICAgICAgIHhJbmRleCxcbiAgICAgICAgICAgICAgc2NhbGUsXG4gICAgICAgICAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnLFxuICAgICAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICBjb25zdCB5cyA9IGZ1bGxZcy5tYXAoeSA9PiB5LnhWYWx1ZSk7XG4gICAgICBsZXQgdmlzaWJsZVlJbmRleCA9IC0xO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdWxsWXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGVmdEJvcmRlciA9IGZ1bGxZc1tpXS54VmFsdWU7XG4gICAgICAgIGNvbnN0IHJpZ2h0Qm9yZGVyQ2FuZGlkYXRlcyA9IGZ1bGxZc1xuICAgICAgICAgIC5maWx0ZXIoeSA9PiB5LnhWYWx1ZSA+IGxlZnRCb3JkZXIpXG4gICAgICAgICAgLm1hcCh5ID0+IHkueFZhbHVlKTtcbiAgICAgICAgY29uc3QgcmlnaHRCb3JkZXIgPVxuICAgICAgICAgIHJpZ2h0Qm9yZGVyQ2FuZGlkYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IE1hdGgubWluKC4uLnJpZ2h0Qm9yZGVyQ2FuZGlkYXRlcylcbiAgICAgICAgICAgIDogbGVmdEJvcmRlciArIGZ1bGxZc1tpXS53aWR0aDtcbiAgICAgICAgaWYgKHBvcy54ID4gbGVmdEJvcmRlciAmJiBwb3MueCA8IHJpZ2h0Qm9yZGVyKSB7XG4gICAgICAgICAgdmlzaWJsZVlJbmRleCA9IGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZ3JvdXBpbmdUeXBlID09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgIHZpc2libGVZSW5kZXggPSBmaW5kU3ViSW5kZXhIb3Jpem9udGFsKHgsIHBvcy55LCBkYXRhLnlzLmxlbmd0aCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh2aXNpYmxlWUluZGV4ID09IC0xKSB7XG4gICAgICAgIGlmIChwb3MueCA+IHplcm9BeGlzUG9zVmFsKSB7XG4gICAgICAgICAgdmlzaWJsZVlJbmRleCA9IHlzLmluZGV4T2YoTWF0aC5tYXgoLi4ueXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zLnggPCB6ZXJvQXhpc1Bvc1ZhbCkge1xuICAgICAgICAgIHZpc2libGVZSW5kZXggPSB5cy5pbmRleE9mKE1hdGgubWluKC4uLnlzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHlJbmRleCA9IHZpc2libGVJbmRpY2VzW3Zpc2libGVZSW5kZXhdO1xuXG4gICAgICAvL0NoZWNrIGlmIHdlJ3ZlIGxhbmRlZCBvbiBhIHplcm8td2lkdGggYmFyIChvbmx5IHJlYWxseSByZWxldmFudCBvbiBlbmRzKVxuICAgICAgaWYgKFxuICAgICAgICBzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnNbdmlzaWJsZVlJbmRleF1beEluZGV4XS53aWR0aCA9PSAwICYmXG4gICAgICAgIGNvbmZpZy5ncm91cGluZ1R5cGUgPT0gJ3N0YWNrZWQnXG4gICAgICApIHtcbiAgICAgICAgbGV0IGFsdEJhckZvdW5kID0gZmFsc2U7XG4gICAgICAgIC8vQ2hlY2sgdXB3YXJkc1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIGxldCBpID0gdmlzaWJsZVlJbmRleCArIDE7XG4gICAgICAgICAgaSA8IHNpbXBsaWZpZWRIb3Jpem9udGFsQmFycy5sZW5ndGg7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChhbHRCYXJGb3VuZCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaW1wbGlmaWVkSG9yaXpvbnRhbEJhcnNbaV1beEluZGV4XS53aWR0aCAhPSAwKSB7XG4gICAgICAgICAgICB2aXNpYmxlWUluZGV4ID0gaTtcbiAgICAgICAgICAgIGFsdEJhckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL0NoZWNrIGRvd253YXJkc1xuICAgICAgICBmb3IgKGxldCBpID0gdmlzaWJsZVlJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGFsdEJhckZvdW5kKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1tpXVt4SW5kZXhdLndpZHRoICE9IDApIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYWx0QmFyRm91bmQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdXBwWUluZGV4ID1cbiAgICAgICAgaXNTdXBwVmFsdWUgJiYgc3VwcFlzXG4gICAgICAgICAgPyBzdXBwWXMuZmluZEluZGV4KFxuICAgICAgICAgICAgICBzdXBwWSA9PlxuICAgICAgICAgICAgICAgIHN1cHBZLmFzc29jaWF0ZWRZSW5kZXggPT0gdmlzaWJsZVlJbmRleCAmJlxuICAgICAgICAgICAgICAgIHN1cHBZLnN1cHBsZW1lbnRhbEluZGV4ID09IHN1cHBJbmRleFZhbCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IC0xO1xuXG4gICAgICBjb25zdCBiYXJYUG9zID0gaXNTdXBwVmFsdWVcbiAgICAgICAgPyBzaW1wbGlmaWVkU3VwcEhvcml6b250YWxCYXJzW3N1cHBZSW5kZXhdW3hJbmRleF0ueFBvc1xuICAgICAgICA6IHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLnhQb3M7XG4gICAgICBjb25zdCBiYXJZUG9zID0gaXNTdXBwVmFsdWVcbiAgICAgICAgPyBzaW1wbGlmaWVkU3VwcEhvcml6b250YWxCYXJzW3N1cHBZSW5kZXhdW3hJbmRleF0ueVBvc1xuICAgICAgICA6IHNpbXBsaWZpZWRIb3Jpem9udGFsQmFyc1t2aXNpYmxlWUluZGV4XVt4SW5kZXhdLnlQb3M7XG4gICAgICBjb25zdCBiYXJXaWR0aCA9IGlzU3VwcFZhbHVlXG4gICAgICAgID8gc2ltcGxpZmllZFN1cHBIb3Jpem9udGFsQmFyc1tzdXBwWUluZGV4XVt4SW5kZXhdLndpZHRoXG4gICAgICAgIDogc2ltcGxpZmllZEhvcml6b250YWxCYXJzW3Zpc2libGVZSW5kZXhdW3hJbmRleF0ud2lkdGg7XG5cbiAgICAgIGNvbnN0IGFuY2hvciA9IG5ldyBET01SZWN0KFxuICAgICAgICBwb3MucmVjdC54ICsgYmFyWFBvcyAtIFNNQUxMX1BBRERJTkcsXG4gICAgICAgIHBvcy5yZWN0LnkgKyBiYXJZUG9zLFxuICAgICAgICBiYXJXaWR0aCArIFNNQUxMX1BBRERJTkcgKiAyLFxuICAgICAgICBIT1JJWk9OVEFMX0JBUl9IRUlHSFQsXG4gICAgICApO1xuICAgICAgLy9XZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBpbmRleCBmb3IgdGhlIGxhdGVyIGNoZWNrSWZTZWNvbmRhcnkgY2FsbFxuICAgICAgY29uc3QgeXNGb3JNZXRyaWNzOiB7XG4gICAgICAgIGRhdGE6IFN1cHBsZW1lbnRhcnlEYXRhWSB8IERhdGFZO1xuICAgICAgICBvcmlnaW5hbEluZGV4OiBudW1iZXI7XG4gICAgICB9W10gPVxuICAgICAgICBpc1N1cHBWYWx1ZSAmJiBzdXBwWXNcbiAgICAgICAgICA/IHN1cHBZc1xuICAgICAgICAgICAgICAubWFwKChzdXBwWSwgaW5kZXgpID0+ICh7IGRhdGE6IHN1cHBZLCBvcmlnaW5hbEluZGV4OiBpbmRleCB9KSlcbiAgICAgICAgICAgICAgLmZpbHRlcihzdXBwWSA9PiBzdXBwWS5kYXRhLnN1cHBsZW1lbnRhbEluZGV4ID09IHN1cHBJbmRleFZhbClcbiAgICAgICAgICA6IGRhdGEueXMubWFwKCh5LCBpbmRleCkgPT4gKHsgZGF0YTogeSwgb3JpZ2luYWxJbmRleDogaW5kZXggfSkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeCxcbiAgICAgICAgeEluZGV4LFxuICAgICAgICB5cyxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB2aXNpYmxlWUluZGV4LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGRhdGU6XG4gICAgICAgICAgICBkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnXG4gICAgICAgICAgICAgID8gZGF0YS54W3hJbmRleF0ubGFiZWxcbiAgICAgICAgICAgICAgOiB1dGNGb3JtYXQoJyVCICVkLCAlWScpKG5ldyBEYXRlKGRhdGEueFt4SW5kZXhdKSksXG4gICAgICAgICAgbWV0cmljczogeXNGb3JNZXRyaWNzXG4gICAgICAgICAgICAubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgY29sb3JzW1xuICAgICAgICAgICAgICAgICAgJ2Fzc29jaWF0ZWRZSW5kZXgnIGluIHkuZGF0YVxuICAgICAgICAgICAgICAgICAgICA/IHkuZGF0YS5hc3NvY2lhdGVkWUluZGV4XG4gICAgICAgICAgICAgICAgICAgIDogaW5kZXggJSBjb2xvcnMubGVuZ3RoXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgbGFiZWw6IHkuZGF0YS5sYWJlbCxcbiAgICAgICAgICAgICAgdmFsdWU6XG4gICAgICAgICAgICAgICAgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeS5vcmlnaW5hbEluZGV4LCB4SW5kZXgsIGlzU3VwcFZhbHVlKVxuICAgICAgICAgICAgICAgICAgPyBzZWNvbmRhcnlGdWxsUGlwZS50cmFuc2Zvcm0oeS5kYXRhLnZhbHVlc1t4SW5kZXhdKVxuICAgICAgICAgICAgICAgICAgOiBmdWxsUGlwZS50cmFuc2Zvcm0oeS5kYXRhLnZhbHVlc1t4SW5kZXhdKSkgPz8gJy0nLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAuZmlsdGVyKChfLCBpKSA9PiBjb25maWcuZ3JvdXBlZFRvb2x0aXAgfHwgaSA9PSB2aXNpYmxlWUluZGV4KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgICAgeVRpY2tzOiB5VGlja3MsXG4gICAgICBob3ZlcixcbiAgICAgIGNvbG9ycyxcbiAgICAgIGJhcnM6IFtdLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgY2lyY2xlczogW10sXG4gICAgICBhcmVhczogW10sXG4gICAgICBhcmNzOiBbXSxcbiAgICAgIGhvcml6b250YWxCYXJzLFxuICAgICAgZGF0YUxhYmVscyxcbiAgICAgIHdhdGVyZmFsbExpbmVzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGFyY3MoXG4gICAgY29uZmlnOiBDb25maWcsXG4gICAgYWxsRGF0YTogRGF0YSxcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICApOiBSZW5kZXJlZENoYXJ0IHtcbiAgICBpZiAoXG4gICAgICBjb25maWcuc2Vjb25kYXJ5VmFsdWVUeXBlICYmXG4gICAgICAoY29uZmlnLnZhbHVlVHlwZSA9PSAncGVyY2VudGFnZScgfHxcbiAgICAgICAgY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSA9PSAncGVyY2VudGFnZScpXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBUd28gYXhlcyB3aXRoIHBlcmNlbnRhZ2UgYXJlbid0IHN1cHBvcnRlZCBmb3IgZG9udXQgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGlmIChhbGxEYXRhLnN1cHBsZW1lbnRhcnlZcyAmJiBhbGxEYXRhLnN1cHBsZW1lbnRhcnlZcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBTdXBwbGVtZW50YXJ5IHkgdmFsdWVzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIG5vbi1iYXIgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGNvbnN0IHsgZGF0YTogdW5zdGFja2VkRGF0YSwgdmlzaWJsZUluZGljZXMgfSA9IGhpZGUoYWxsRGF0YSk7XG4gICAgY29uc3QgZG9udXREYXRhID0gQ2hhcnQuY29udmVydENoYXJ0RGF0YVRvRG9udXREYXRhKHVuc3RhY2tlZERhdGEpO1xuICAgIGNvbnN0IGhhc05vblplcm9WYWx1ZSA9IGRvbnV0RGF0YS5zb21lKGQgPT4gZC52YWx1ZSA+IDApO1xuICAgIGNvbnN0IGFyY0RhdGEgPSBoYXNOb25aZXJvVmFsdWVcbiAgICAgID8gZG9udXREYXRhXG4gICAgICA6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgIGNvbnN0IGNvbG9ycyA9IGhhc05vblplcm9WYWx1ZVxuICAgICAgPyB2aXNpYmxlSW5kaWNlcy5tYXAoaSA9PiBjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF0pXG4gICAgICA6IFsnLS1ncmF5LTMwJ107XG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG4gICAgY29uc3QgeyBwaXBlOiBzZWNvbmRhcnlQaXBlLCBmdWxsUGlwZTogc2Vjb25kYXJ5RnVsbFBpcGUgfSA9XG4gICAgICBjb25maWcuc2Vjb25kYXJ5VmFsdWVUeXBlXG4gICAgICAgID8gZ2V0UGlwZXMoY29uZmlnLnNlY29uZGFyeVZhbHVlVHlwZSlcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBwaXBlLFxuICAgICAgICAgICAgZnVsbFBpcGUsXG4gICAgICAgICAgfTtcblxuICAgIGNvbnN0IG91dGVyID0gKGRpbWVuc2lvbnMuaGVpZ2h0IC8gMikgKiAwLjc1O1xuICAgIGNvbnN0IGlubmVyID0gb3V0ZXIgLSAxMjtcblxuICAgIGNvbnN0IHBpZUFyY3MgPSBwaWU8RG9udXREYXRhPigpXG4gICAgICAuc29ydFZhbHVlcyhudWxsKVxuICAgICAgLnZhbHVlKGQgPT4gTWF0aC5tYXgoZC52YWx1ZSwgMCkpKGFyY0RhdGEpO1xuXG4gICAgY29uc3QgYXJjcyA9IHBpZUFyY3MubWFwKHBpZUFyYyA9PlxuICAgICAgYXJjPERvbnV0RGF0YT4oKVxuICAgICAgICAuaW5uZXJSYWRpdXMoaW5uZXIpXG4gICAgICAgIC5vdXRlclJhZGl1cyhvdXRlcilcbiAgICAgICAgLnBhZEFuZ2xlKDAuMDEzKVxuICAgICAgICAuc3RhcnRBbmdsZShwaWVBcmMuc3RhcnRBbmdsZSlcbiAgICAgICAgLmVuZEFuZ2xlKHBpZUFyYy5lbmRBbmdsZSkocGllQXJjLmRhdGEpLFxuICAgICk7XG5cbiAgICBjb25zdCBkYXRhTGFiZWxzOiBEYXRhTGFiZWxbXSA9IGhhc05vblplcm9WYWx1ZVxuICAgICAgPyBwaWVBcmNzLm1hcChhcmMgPT4ge1xuICAgICAgICAgIC8vRG9uJ3Qgc2hvdyBkYXRhIGxhYmVscyBmb3IgemVyby13aWR0aCBkb251dCBzbGljZXMgKGluY2x1ZGVzIG5lZ2F0aXZlIHZhbHVlcylcbiAgICAgICAgICBpZiAoYXJjLnN0YXJ0QW5nbGUgPT0gYXJjLmVuZEFuZ2xlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBsYWJlbDogJycsXG4gICAgICAgICAgICAgIHlQb3M6IDAsXG4gICAgICAgICAgICAgIHhQb3M6IDAsXG4gICAgICAgICAgICAgIGFuY2hvcjogJ21pZGRsZScsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhcmNDZW50ZXJBbmdsZSA9IChhcmMuc3RhcnRBbmdsZSArIGFyYy5lbmRBbmdsZSkgLyAyO1xuICAgICAgICAgIGNvbnN0IGVkZ2VQb2ludCA9IGFyY1RvUG9pbnQoYXJjQ2VudGVyQW5nbGUsIG91dGVyKTtcbiAgICAgICAgICBjb25zdCBsaW5lRW5kUG9pbnQgPSBhcmNUb1BvaW50KGFyY0NlbnRlckFuZ2xlLCBvdXRlciArIDE2KTtcbiAgICAgICAgICBjb25zdCBtaWRkbGVBcmVhID0gb3V0ZXIgLyA0O1xuICAgICAgICAgIGxldCB5T2Zmc2V0ID0gMDtcbiAgICAgICAgICBsZXQgeE9mZnNldCA9IDA7XG4gICAgICAgICAgaWYgKGxpbmVFbmRQb2ludC55ID4gMCkge1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGxpbmVFbmRQb2ludC55KSA8IG1pZGRsZUFyZWEpIHtcbiAgICAgICAgICAgICAgeU9mZnNldCA9IFNNQUxMX1BBRERJTkcgLyAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgeU9mZnNldCA9IFNNQUxMX1BBRERJTkc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMobGluZUVuZFBvaW50LngpIDwgbWlkZGxlQXJlYSkge1xuICAgICAgICAgICAgICB5T2Zmc2V0ICs9IFNNQUxMX1BBRERJTkcgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMobGluZUVuZFBvaW50LnkpIDwgbWlkZGxlQXJlYSkge1xuICAgICAgICAgICAgICB5T2Zmc2V0ID0gU01BTExfUEFERElORyAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMobGluZUVuZFBvaW50LngpIDwgbWlkZGxlQXJlYSkge1xuICAgICAgICAgICAgICB5T2Zmc2V0IC09IFNNQUxMX1BBRERJTkcgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICAgIChhcmMuZGF0YS5pc1NlY29uZGFyeVxuICAgICAgICAgICAgICAgID8gc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0oYXJjLmRhdGEudmFsdWUpXG4gICAgICAgICAgICAgICAgOiBwaXBlLnRyYW5zZm9ybShhcmMuZGF0YS52YWx1ZSkpID8/ICcnLFxuICAgICAgICAgICAgeVBvczogbGluZUVuZFBvaW50LnkgKyB5T2Zmc2V0LFxuICAgICAgICAgICAgeFBvczogbGluZUVuZFBvaW50LnggKyB4T2Zmc2V0LFxuICAgICAgICAgICAgYW5jaG9yOlxuICAgICAgICAgICAgICBNYXRoLmFicyhsaW5lRW5kUG9pbnQueCkgPCBtaWRkbGVBcmVhXG4gICAgICAgICAgICAgICAgPyAnbWlkZGxlJ1xuICAgICAgICAgICAgICAgIDogbGluZUVuZFBvaW50LnggPCAwXG4gICAgICAgICAgICAgICAgPyAnZW5kJ1xuICAgICAgICAgICAgICAgIDogJ3N0YXJ0JyxcbiAgICAgICAgICAgIGxpbmU6IHtcbiAgICAgICAgICAgICAgeDE6IGVkZ2VQb2ludC54LFxuICAgICAgICAgICAgICB5MTogZWRnZVBvaW50LnksXG4gICAgICAgICAgICAgIHgyOiBsaW5lRW5kUG9pbnQueCxcbiAgICAgICAgICAgICAgeTI6IGxpbmVFbmRQb2ludC55LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgOiBbXTtcblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3M6IFtdLFxuICAgICAgeVRpY2tzOiBbXSxcbiAgICAgIGFyZWFzOiBbXSxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIGNpcmNsZXM6IFtdLFxuICAgICAgYmFyczogW10sXG4gICAgICBjb2xvcnMsXG4gICAgICBhcmNzLFxuICAgICAgaG9yaXpvbnRhbEJhcnM6IFtdLFxuICAgICAgZGF0YUxhYmVscyxcbiAgICAgIHdhdGVyZmFsbExpbmVzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHdhdGVyZmFsbChcbiAgICBjb25maWc6IENvbmZpZyxcbiAgICBhbGxEYXRhOiBEYXRhLFxuICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsXG4gICk6IFJlbmRlcmVkQ2hhcnQge1xuICAgIGNvbnN0IHsgZGF0YTogdW5jaGVja2VkRGF0YSwgdmlzaWJsZUluZGljZXMgfSA9IGhpZGUoYWxsRGF0YSk7XG4gICAgaWYgKHVuY2hlY2tlZERhdGEudHlwZSA9PSAndGltZXNlcmllcycpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiSGVhZHMgdXAhIFRpbWUtYmFzZWQgc2VyaWVzIGFyZW4ndCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciB3YXRlcmZhbGwgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHVuY2hlY2tlZERhdGEuc3VwcGxlbWVudGFyeVlzICYmXG4gICAgICB1bmNoZWNrZWREYXRhLnN1cHBsZW1lbnRhcnlZcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIkhlYWRzIHVwISBTdXBwbGVtZW50YXJ5IHkgdmFsdWVzIGFyZW4ndCBzdXBwb3J0ZWQgZm9yIG5vbi1iYXIgY2hhcnRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVtcHR5Q2hhcnQ7XG4gICAgfVxuICAgIGlmIChjb25maWcuc2Vjb25kYXJ5VmFsdWVUeXBlKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnSGVhZHMgdXAhIFdhdGVyZmFsbCBjaGFydHMgZG8gbm90IGN1cnJlbnRseSBoYXZlIHR3by1heGlzIHN1cHBvcnQnLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBlbXB0eUNoYXJ0O1xuICAgIH1cbiAgICAvL1RoaXMgYXNzaWdubWVudCBtYWtlcyB0eXBlc2NyaXB0IHJlY29nbml6ZSB0aGUgYWN0dWFsIHR5cGUgKFRpbWVzZXJpZXNEYXRhKVxuICAgIGNvbnN0IGRhdGEgPSB3YXRlcmZhbGxUcmFuc2Zvcm0odW5jaGVja2VkRGF0YSk7XG4gICAgY29uc3QgeyByYW5nZTogeFJhbmdlLCBiaW5TaXplIH0gPSBiYXJYUmFuZ2UoZGltZW5zaW9ucywgZGF0YSwgY29uZmlnKTtcbiAgICBjb25zdCBoYWxmQmluU2l6ZSA9IGJpblNpemUgLyAyO1xuICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlTGluZWFyKGluZGV4RG9tYWluKGRhdGEpLCB4UmFuZ2UpO1xuICAgIGNvbnN0IHRpY2tDb3VudCA9IGdldFRpY2tDb3VudChkaW1lbnNpb25zLCBjb25maWcpO1xuICAgIGNvbnN0IHhUaWNrcyA9IGdlbmVyYXRlTGFiZWxsZWRYVGlja3MoZGF0YSwgeFNjYWxlLCB0aWNrQ291bnQpO1xuXG4gICAgY29uc3QgeyBwaXBlLCBmdWxsUGlwZSB9ID0gZ2V0UGlwZXMoY29uZmlnLnZhbHVlVHlwZSk7XG5cbiAgICBjb25zdCB7IHNjYWxlLCB5VGlja3MgfSA9IGNhbGNZU2NhbGVzQW5kVGlja3MoXG4gICAgICBkYXRhLFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIHBpcGUsXG4gICAgICBwaXBlLFxuICAgICAgdHJ1ZSxcbiAgICAgIGNvbmZpZyxcbiAgICApO1xuICAgIGNvbnN0IHplcm9BeGlzUG9zVmFsID0gc2NhbGUoMCwgdHJ1ZSk7XG5cbiAgICBjb25zdCBjb2xvcnMgPSB2aXNpYmxlSW5kaWNlcy5tYXAoXG4gICAgICBpID0+IGNvbmZpZy5jb2xvcnNbaSAlIGNvbmZpZy5jb2xvcnMubGVuZ3RoXSxcbiAgICApO1xuICAgIGNvbnN0IGJhcnMgPSBkYXRhLnlzLm1hcCgoeSwgeUluZGV4KSA9PlxuICAgICAgeS52YWx1ZXMubWFwKChfLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB7IHlWYWx1ZSwgaGVpZ2h0IH0gPSBnZXRCYXJZSW5mbyhcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIHlJbmRleCxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBzY2FsZSxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgICBsZXQgeFZhbHVlID0geFNjYWxlKGluZGV4KSAtIGhhbGZCaW5TaXplO1xuICAgICAgICBsZXQgd2lkdGggPSBiaW5TaXplO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IHhWYWx1ZSxcbiAgICAgICAgICB5OiB5VmFsdWUsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvL01vdmUgYmFycyBiYXNlZCBvbiBoZWlnaHQgb2YgcHJldmlvdXMgYmFycyAoZXhjZXB0IHRoZSB0b3RhbCBiYXIpXG4gICAgbGV0IGJhck9mZnNldFJ1bm5pbmdUb3RhbCA9IDA7XG4gICAgY29uc3Qgd2F0ZXJmYWxsTGluZXM6IHtcbiAgICAgIHgxOiBudW1iZXI7XG4gICAgICB4MjogbnVtYmVyO1xuICAgICAgeTE6IG51bWJlcjtcbiAgICAgIHkyOiBudW1iZXI7XG4gICAgfVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBsZXQgYmFyT2Zmc2V0Q2hhbmdlID0gMDtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYmFycy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBiYXJJc05lZ2F0aXZlID1cbiAgICAgICAgICBiYXJzW2pdW2ldLnkgPj0gemVyb0F4aXNQb3NWYWwgJiYgYmFyc1tqXVtpXS5oZWlnaHQgPiAwO1xuICAgICAgICBpZiAoYmFySXNOZWdhdGl2ZSkge1xuICAgICAgICAgIGJhck9mZnNldENoYW5nZSAtPSBiYXJzW2pdW2ldLmhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYXJPZmZzZXRDaGFuZ2UgKz0gYmFyc1tqXVtpXS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgYmFyc1tqXVtpXS5vZmZzZXQgPSBiYXJPZmZzZXRSdW5uaW5nVG90YWw7XG4gICAgICAgIGJhcnNbal1baV0ueSAtPSBiYXJPZmZzZXRSdW5uaW5nVG90YWw7XG4gICAgICAgIGlmIChqID09IGJhcnMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGNvbnN0IHgxID0gYmFyc1tqXVtpXS54ICsgYmFyc1tiYXJzLmxlbmd0aCAtIDFdW2ldLndpZHRoO1xuICAgICAgICAgIGNvbnN0IHkxID0gYmFyc1tqXVtpXS55ICsgKGJhcklzTmVnYXRpdmUgPyBiYXJzW2pdW2ldLmhlaWdodCA6IDApO1xuICAgICAgICAgIGNvbnN0IHgyID0gYmFyc1tqXVtpICsgMV0ueDtcbiAgICAgICAgICBjb25zdCB5MiA9IHkxO1xuICAgICAgICAgIHdhdGVyZmFsbExpbmVzLnB1c2goe1xuICAgICAgICAgICAgeDEsXG4gICAgICAgICAgICB5MSxcbiAgICAgICAgICAgIHgyLFxuICAgICAgICAgICAgeTIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJhck9mZnNldFJ1bm5pbmdUb3RhbCArPSBiYXJPZmZzZXRDaGFuZ2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUxhYmVsczogRGF0YUxhYmVsW10gPSBkYXRhLnlzLmZsYXRNYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc3ViTGFiZWxzOiBEYXRhTGFiZWxbXSA9IHkudmFsdWVzLm1hcCgodmFsLCB4SW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgaXNOZWdhdGl2ZUJhciA9XG4gICAgICAgICAgYmFyc1t5SW5kZXhdW3hJbmRleF0ueSA+PSB6ZXJvQXhpc1Bvc1ZhbCAmJlxuICAgICAgICAgIGJhcnNbeUluZGV4XVt4SW5kZXhdLmhlaWdodCA+IDA7XG4gICAgICAgIGNvbnN0IHlPZmZzZXQgPSBpc05lZ2F0aXZlQmFyXG4gICAgICAgICAgPyBTTUFMTF9QQURESU5HICsgREFUQV9MQUJFTF9IRUlHSFQgKyBiYXJzW3lJbmRleF1beEluZGV4XS5oZWlnaHRcbiAgICAgICAgICA6IC1TTUFMTF9QQURESU5HO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxhYmVsOiBwaXBlLnRyYW5zZm9ybSh2YWwpID8/ICcnLFxuICAgICAgICAgIHlQb3M6IGJhcnNbeUluZGV4XVt4SW5kZXhdLnkgKyB5T2Zmc2V0LFxuICAgICAgICAgIHhQb3M6IGJhcnNbeUluZGV4XVt4SW5kZXhdLnggKyBiYXJzW3lJbmRleF1beEluZGV4XS53aWR0aCAvIDIsXG4gICAgICAgICAgYW5jaG9yOiAnbWlkZGxlJyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHN1YkxhYmVscztcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGhvdmVyKHBvczogeyByZWN0OiBET01SZWN0OyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSB7XG4gICAgICBjb25zdCB4SW5kZXggPSBmaW5kTmVhcmVzdEluZGV4U3RyaW5nKGRhdGEueCwgeFNjYWxlLmludmVydChwb3MueCkpO1xuICAgICAgY29uc3QgeCA9IHhTY2FsZSh4SW5kZXgpO1xuICAgICAgY29uc3QgeXMgPSBiYXJzLm1hcChiYXIgPT4gYmFyW3hJbmRleF0ueSk7XG4gICAgICBjb25zdCB5UG9zU2lnbiA9IHplcm9BeGlzUG9zVmFsIC0gcG9zLnk7XG4gICAgICBsZXQgdmlzaWJsZVlJbmRleCA9IC0xO1xuICAgICAgaWYgKHlQb3NTaWduIDwgMCAmJiBkYXRhLnlzLmZpbmQoeSA9PiB5LnZhbHVlcy5maW5kKHZhbCA9PiB2YWwgPCAwKSkpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKHlzW2ldID49IHplcm9BeGlzUG9zVmFsICYmIHlzW2ldIDwgcG9zLnkpIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHlzW2ldIDw9IHplcm9BeGlzUG9zVmFsICYmIHlzW2ldIDwgcG9zLnkpIHtcbiAgICAgICAgICAgIHZpc2libGVZSW5kZXggPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodmlzaWJsZVlJbmRleCA9PSAtMSkge1xuICAgICAgICBpZiAocG9zLnkgPCB6ZXJvQXhpc1Bvc1ZhbCkge1xuICAgICAgICAgIHZpc2libGVZSW5kZXggPSB5cy5pbmRleE9mKE1hdGgubWluKC4uLnlzKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvcy55ID4gemVyb0F4aXNQb3NWYWwpIHtcbiAgICAgICAgICB2aXNpYmxlWUluZGV4ID0geXMuaW5kZXhPZihNYXRoLm1heCguLi55cykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB5SW5kZXggPSB2aXNpYmxlSW5kaWNlc1t2aXNpYmxlWUluZGV4XTtcbiAgICAgIGNvbnN0IHsgeVZhbHVlLCBoZWlnaHQgfSA9IGdldEJhcllJbmZvKGRhdGEsIHlJbmRleCwgeEluZGV4LCBzY2FsZSwgdHJ1ZSk7XG4gICAgICBjb25zdCBhbmNob3IgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgcG9zLnJlY3QueCArIGJhcnNbdmlzaWJsZVlJbmRleF1beEluZGV4XS54IC0gU01BTExfUEFERElORyxcbiAgICAgICAgcG9zLnJlY3QueSArIHlWYWx1ZSAtIGJhcnNbdmlzaWJsZVlJbmRleF1beEluZGV4XS5vZmZzZXQsXG4gICAgICAgIGJhcnNbdmlzaWJsZVlJbmRleF1beEluZGV4XS53aWR0aCArIFNNQUxMX1BBRERJTkcgKiAyLFxuICAgICAgICBoZWlnaHQsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeCxcbiAgICAgICAgeEluZGV4LFxuICAgICAgICB5cyxcbiAgICAgICAgeUluZGV4LFxuICAgICAgICB2aXNpYmxlWUluZGV4LFxuICAgICAgICB0b29sdGlwOiB7XG4gICAgICAgICAgYW5jaG9yLFxuICAgICAgICAgIGRhdGU6IGRhdGEueFt4SW5kZXhdLmxhYmVsLFxuICAgICAgICAgIG1ldHJpY3M6IGRhdGEueXNcbiAgICAgICAgICAgIC5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICBjb2xvcjogY29sb3JzW2luZGV4ICUgY29sb3JzLmxlbmd0aF0sXG4gICAgICAgICAgICAgIGxhYmVsOiB5LmxhYmVsLFxuICAgICAgICAgICAgICB2YWx1ZTogZnVsbFBpcGUudHJhbnNmb3JtKHkudmFsdWVzW3hJbmRleF0pID8/ICctJyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLmZpbHRlcigoXywgaSkgPT4gY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT0gdmlzaWJsZVlJbmRleCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB4VGlja3MsXG4gICAgICB5VGlja3MsXG4gICAgICBjb2xvcnMsXG4gICAgICBiYXJzLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgY2lyY2xlczogW10sXG4gICAgICBhcmVhczogW10sXG4gICAgICBob3ZlcixcbiAgICAgIGFyY3M6IFtdLFxuICAgICAgaG9yaXpvbnRhbEJhcnM6IFtdLFxuICAgICAgZGF0YUxhYmVscyxcbiAgICAgIHdhdGVyZmFsbExpbmVzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBMRUZUX1BBRERJTkcgPSA0ODtcbiAgY29uc3QgTEVGVF9QQURESU5HX1dJVEhfREFUQV9MQUJFTFMgPSA1NjtcbiAgY29uc3QgTEVGVF9QQURESU5HX0RBVEUgPSA2NDtcbiAgZXhwb3J0IGNvbnN0IExFRlRfUEFERElOR19MQUJFTF9NQVggPSAxOTI7XG4gIGV4cG9ydCBjb25zdCBSSUdIVF9QQURESU5HID0gNDg7XG4gIGNvbnN0IFJJR0hUX1BBRERJTkdfSE9SSVpPTlRBTCA9IDk2O1xuICBjb25zdCBUT1BfUEFERElORyA9IDE2O1xuICBjb25zdCBUT1BfUEFERElOR19XSVRIX0RBVEFfTEFCRUxTID0gMzY7XG4gIGNvbnN0IEJPVFRPTV9QQURESU5HID0gMjQ7XG4gIGNvbnN0IEJPVFRPTV9QQURESU5HX1dJVEhfREFUQV9MQUJFTFMgPSA0NDtcbiAgY29uc3QgU01BTExfUEFERElORyA9IDg7XG4gIGNvbnN0IEhPUklaT05UQUxfQkFSX0hFSUdIVCA9IDg7XG4gIGNvbnN0IFdJRFRIX1BFUl9MRVRURVIgPSA2LjU7XG4gIGNvbnN0IE1JTl9USUNLX1NQQUNJTkcgPSAxMDA7XG4gIGNvbnN0IE1BWF9YX1RJQ0tTID0gNjtcbiAgY29uc3QgREFUQV9MQUJFTF9IRUlHSFQgPSAxMjtcblxuICBmdW5jdGlvbiBnZXRUaWNrQ291bnQoZGltZW5zaW9uczogRGltZW5zaW9ucywgY29uZmlnOiBDb25maWcpOiBudW1iZXIge1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID1cbiAgICAgIGRpbWVuc2lvbnMud2lkdGggLVxuICAgICAgKGNvbmZpZy5zaG93RGF0YUxhYmVscyA/IExFRlRfUEFERElOR19XSVRIX0RBVEFfTEFCRUxTIDogTEVGVF9QQURESU5HKSAtXG4gICAgICBSSUdIVF9QQURESU5HO1xuICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgIE1BWF9YX1RJQ0tTLFxuICAgICAgTWF0aC5tYXgoMiwgTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIE1JTl9USUNLX1NQQUNJTkcpKSxcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVYVGlja3MoXG4gICAgZGF0YTogVGltZXNlcmllc0RhdGEsXG4gICAgeFNjYWxlOiBTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgICB0aWNrQ291bnQ6IG51bWJlcixcbiAgICBmb3JtYXQ6IChkYXRlOiBEYXRlKSA9PiBzdHJpbmcsXG4gICk6IFhUaWNrW10ge1xuICAgIGlmIChkYXRhLngubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChkYXRhLngubGVuZ3RoID09PSAxIHx8IHRpY2tDb3VudCA8PSAxKSB7XG4gICAgICByZXR1cm4gW3sgeDogeFNjYWxlKGRhdGEueFswXSksIGxhYmVsOiBmb3JtYXQobmV3IERhdGUoZGF0YS54WzBdKSkgfV07XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEluZGV4ID0gZGF0YS54Lmxlbmd0aCAtIDE7XG4gICAgY29uc3QgbnVtVGlja3MgPSBNYXRoLm1pbih0aWNrQ291bnQsIGRhdGEueC5sZW5ndGgpO1xuICAgIGNvbnN0IHN0ZXAgPSBsYXN0SW5kZXggLyAobnVtVGlja3MgLSAxKTtcblxuICAgIC8vIEFsd2F5cyBpbmNsdWRlIGZpcnN0IGFuZCBsYXN0IGRhdGEgcG9pbnRzLlxuICAgIC8vIElubmVyIHRpY2tzIGFyZSBhcHByb3hpbWF0ZWx5IGV2ZW5seSBzcGFjZWQgdXNpbmcgcm91bmRpbmcuXG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVRpY2tzOyBpKyspIHtcbiAgICAgIGluZGljZXMucHVzaChNYXRoLnJvdW5kKGkgKiBzdGVwKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGljZXMubWFwKGkgPT4gKHtcbiAgICAgIHg6IHhTY2FsZShkYXRhLnhbaV0pLFxuICAgICAgbGFiZWw6IGZvcm1hdChuZXcgRGF0ZShkYXRhLnhbaV0pKSxcbiAgICB9KSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZUxhYmVsbGVkWFRpY2tzKFxuICAgIGRhdGE6IExhYmVsZWREYXRhLFxuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgICB0aWNrQ291bnQ6IG51bWJlcixcbiAgKTogWFRpY2tbXSB7XG4gICAgaWYgKGRhdGEueC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKGRhdGEueC5sZW5ndGggPT09IDEgfHwgdGlja0NvdW50IDw9IDEpIHtcbiAgICAgIHJldHVybiBbeyB4OiB4U2NhbGUoMCksIGxhYmVsOiBkYXRhLnhbMF0ubGFiZWwgfV07XG4gICAgfVxuXG4gICAgY29uc3QgeFRpY2tzOiBYVGlja1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLngubGVuZ3RoOyBpKyspIHtcbiAgICAgIHhUaWNrcy5wdXNoKHtcbiAgICAgICAgeDogeFNjYWxlKGkpLFxuICAgICAgICBsYWJlbDogZGF0YS54W2ldLmxhYmVsLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHhUaWNrcztcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIERhdGEgPSBMYWJlbGVkRGF0YSB8IFRpbWVzZXJpZXNEYXRhO1xuXG4gIHR5cGUgQmFzZURhdGEgPSB7XG4gICAgeXM6IERhdGFZW107XG4gICAgc3VwcGxlbWVudGFyeVlzPzogU3VwcGxlbWVudGFyeURhdGFZW107XG4gIH07XG5cbiAgdHlwZSBEYXRhWSA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGhpZGRlbj86IGJvb2xlYW47XG4gICAgaXNTZWNvbmRhcnk/OiBib29sZWFuO1xuICAgIHZhbHVlczogbnVtYmVyW107XG4gIH07XG5cbiAgdHlwZSBTdXBwbGVtZW50YXJ5RGF0YVkgPSBEYXRhWSAmIHtcbiAgICBhc3NvY2lhdGVkWUluZGV4OiBudW1iZXI7XG4gICAgc3VwcGxlbWVudGFsSW5kZXg6IG51bWJlcjtcbiAgfTtcblxuICAvL0N1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgaG9yaXpvbnRhbCBiYXIgY2hhcnRzXG4gIGV4cG9ydCB0eXBlIExhYmVsZWREYXRhID0gQmFzZURhdGEgJiB7XG4gICAgdHlwZTogJ2xhYmVsZWQnO1xuICAgIHg6IHsgbGFiZWw6IHN0cmluZzsgaXNTZWNvbmRhcnk/OiBib29sZWFuIH1bXTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBUaW1lc2VyaWVzRGF0YSA9IEJhc2VEYXRhICYge1xuICAgIHR5cGU6ICd0aW1lc2VyaWVzJztcbiAgICB4OiBudW1iZXJbXTtcbiAgfTtcblxuICB0eXBlIERvbnV0RGF0YSA9IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGhpZGRlbj86IGJvb2xlYW47XG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICBpc1NlY29uZGFyeT86IGJvb2xlYW47XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRGltZW5zaW9ucyA9IHtcbiAgICB3aWR0aDogbnVtYmVyO1xuICAgIGhlaWdodDogbnVtYmVyO1xuICB9O1xuXG4gIHR5cGUgQmFzZUNvbmZpZyA9IHtcbiAgICBncm91cGVkVG9vbHRpcDogYm9vbGVhbjtcbiAgICBjb2xvcnM6IHN0cmluZ1tdO1xuICAgIGFsbG93TGVnZW5kVG9nZ2xlOiBib29sZWFuO1xuICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZztcbiAgICB2YWx1ZVR5cGU6IFZhbHVlVHlwZTtcbiAgICBzZWNvbmRhcnlWYWx1ZVR5cGU/OiBWYWx1ZVR5cGU7XG4gICAgdHJ1bmNhdGVMZWdlbmQ6IGJvb2xlYW47XG4gICAgZGF0ZUZvcm1hdD86IEludGVydmFsO1xuICAgIHNob3dEYXRhTGFiZWxzPzogYm9vbGVhbjtcbiAgfTtcblxuICB0eXBlIERvbnV0Q29uZmlnID0ge1xuICAgIHNpemU6ICd4c21hbGwnIHwgJ3NtYWxsJyB8ICdtZWRpdW0nIHwgJ2xhcmdlJztcbiAgICBkaXNwbGF5VmFsdWU6IHN0cmluZztcbiAgICBkaXNwbGF5TGFiZWw/OiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgQ29uZmlnID0gQmFzZUNvbmZpZyAmXG4gICAgKFxuICAgICAgfCB7XG4gICAgICAgICAgdHlwZTogJ2xpbmUnIHwgJ2FyZWEnIHwgJ3dhdGVyZmFsbCc7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIHR5cGU6ICdiYXInIHwgJ2hvcml6b250YWwtYmFyJztcbiAgICAgICAgICBncm91cGluZ1R5cGU6ICdzdGFja2VkJyB8ICdjbHVzdGVyZWQnO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICB0eXBlOiAnZG9udXQnO1xuICAgICAgICAgIGRvbnV0RGlzcGxheUluZm86IERvbnV0Q29uZmlnO1xuICAgICAgICB9XG4gICAgKTtcblxuICB0eXBlIEJhckNvbmZpZyA9IEV4dHJhY3Q8Q29uZmlnLCB7IHR5cGU6ICdiYXInIHwgJ2hvcml6b250YWwtYmFyJyB9PjtcblxuICBleHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZzogQ29uZmlnID0ge1xuICAgIHR5cGU6ICdsaW5lJyxcbiAgICBncm91cGVkVG9vbHRpcDogdHJ1ZSxcbiAgICBjb2xvcnM6IGRlZmF1bHRDb2xvclBhbGV0dGUsXG4gICAgYWxsb3dMZWdlbmRUb2dnbGU6IGZhbHNlLFxuICAgIHplcm9TdGF0ZU1lc3NhZ2U6ICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgICB2YWx1ZVR5cGU6ICdjdXJyZW5jeScsXG4gICAgdHJ1bmNhdGVMZWdlbmQ6IHRydWUsXG4gICAgZGF0ZUZvcm1hdDogJ2RheScsXG4gIH07XG5cbiAgZXhwb3J0IGNvbnN0IGRlZmF1bHREb251dENvbmZpZzogQ29uZmlnID0ge1xuICAgIHR5cGU6ICdkb251dCcsXG4gICAgZ3JvdXBlZFRvb2x0aXA6IHRydWUsXG4gICAgY29sb3JzOiBkZWZhdWx0Q29sb3JQYWxldHRlLFxuICAgIGFsbG93TGVnZW5kVG9nZ2xlOiBmYWxzZSxcbiAgICB6ZXJvU3RhdGVNZXNzYWdlOiAnTm8gZGF0YSB0byBkaXNwbGF5LicsXG4gICAgdmFsdWVUeXBlOiAnY3VycmVuY3knLFxuICAgIHRydW5jYXRlTGVnZW5kOiB0cnVlLFxuICAgIGRhdGVGb3JtYXQ6ICdkYXknLFxuICAgIGRvbnV0RGlzcGxheUluZm86IHtcbiAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgZGlzcGxheVZhbHVlOiAnJyxcbiAgICB9LFxuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEFyZWEgPSB7XG4gICAgcGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxsOiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgWFRpY2sgPSB7XG4gICAgeDogbnVtYmVyO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgc2Vjb25kYXJ5TGFiZWw/OiBzdHJpbmc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgWVRpY2sgPSB7XG4gICAgeTogbnVtYmVyO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgc2Vjb25kYXJ5TGFiZWw/OiBzdHJpbmc7XG4gIH07XG5cbiAgdHlwZSBSZWN0ID0ge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBCYXJTZXJpZXMgPSB7XG4gICAgZmlsbDogc3RyaW5nO1xuICAgIHJlY3RzOiBSZWN0W107XG4gIH07XG5cbiAgdHlwZSBDaXJjbGUgPSB7XG4gICAgY3g6IG51bWJlcjtcbiAgICBjeTogbnVtYmVyO1xuICB9O1xuXG4gIC8vIEhvdmVyIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZpZXdwb3J0IHggYW5kIHkgYW5kIHJldHVybnMgYSByaWNoXG4gIC8vIHNldCBvZiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHZhbHVlcyBhcmUgYmVpbmcgaG92ZXJlZCBhbmQgd2hhdCB0aGUgdG9vbHRpcFxuICAvLyBzaG91bGQgbG9vayBsaWtlXG4gIGV4cG9ydCB0eXBlIEhvdmVyID0gKHBvczogeyByZWN0OiBET01SZWN0OyB4OiBudW1iZXI7IHk6IG51bWJlciB9KSA9PiB7XG4gICAgLy8gdGhlIGluZGljZXMgaW50byB0aGUgZGF0YSBvZiB0aGUgY2xvc2VzdCBwb2ludFxuICAgIHhJbmRleDogbnVtYmVyO1xuICAgIC8vIHdlIHdhbnQgdG8ga25vdyB3aGljaCB2aXNpYmxlIHkgaW5kZXggaXMgaG92ZXJlZFxuICAgIC8vIGFuZCB3aGljaCBhY3R1YWwgeSBpbmRleCBpcyBob3ZlcmVkXG4gICAgeUluZGV4OiBudW1iZXI7XG4gICAgdmlzaWJsZVlJbmRleDogbnVtYmVyO1xuXG4gICAgLy8gdGhlIHZpZXdwb3J0IHggYW5kIHlzIG9mIHRoZSBob3ZlcmVkIGl0ZW1zXG4gICAgeDogbnVtYmVyO1xuICAgIHlzOiBudW1iZXJbXTtcblxuICAgIHRvb2x0aXA6IHtcbiAgICAgIGFuY2hvcjogRE9NUmVjdDtcbiAgICAgIGRhdGU6IHN0cmluZztcbiAgICAgIG1ldHJpY3M6IHtcbiAgICAgICAgY29sb3I6IHN0cmluZztcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgdmFsdWU6IHN0cmluZztcbiAgICAgIH1bXTtcbiAgICB9O1xuICB9O1xuXG4gIC8vIFJlbmRlcmVkQ2hhcnQgcmVwcmVzZW50cyBhbGwgb2YgdGhlIHBhcnRzIG9mIGEgY2hhcnRcbiAgLy8gdGhhdCBlbmQgdXAgb24gc2NyZWVuLiBFdmVyeSBjaGFydCBoYXMgeCBhbmQgeSB0aWNrc1xuICAvLyBhbmQgaG92ZXIgZnVuY3Rpb25hbGl0eSwgZXZlbiB0aG91Z2ggdGhleSBtaWdodCBiZVxuICAvLyBkaWZmZXJlbnQgZnJvbSBjaGFydCB0byBjaGFydC5cbiAgdHlwZSBSZW5kZXJlZENoYXJ0ID0ge1xuICAgIHhUaWNrczogWFRpY2tbXTtcbiAgICB5VGlja3M6IFlUaWNrW107XG4gICAgaG92ZXI/OiBIb3ZlcjtcbiAgICBjb2xvcnM6IHN0cmluZ1tdO1xuICAgIGxpbmVzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBjaXJjbGVzOiBDaXJjbGVbXTsgLy9MaW5lIGZhbGxiYWNrIGZvciBhIHNpbmdsZSBwb2ludFxuICAgIGFyZWFzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBiYXJzOiBSZWN0W11bXTtcbiAgICBhcmNzOiAoc3RyaW5nIHwgbnVsbClbXTtcbiAgICBob3Jpem9udGFsQmFyczogKHN0cmluZyB8IG51bGwpW11bXTtcbiAgICBkYXRhTGFiZWxzOiBEYXRhTGFiZWxbXTtcbiAgICB3YXRlcmZhbGxMaW5lczoge1xuICAgICAgeDE6IG51bWJlcjtcbiAgICAgIHgyOiBudW1iZXI7XG4gICAgICB5MTogbnVtYmVyO1xuICAgICAgeTI6IG51bWJlcjtcbiAgICB9W107XG4gIH07XG5cbiAgdHlwZSBEYXRhTGFiZWwgPSB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICB4UG9zOiBudW1iZXI7XG4gICAgeVBvczogbnVtYmVyO1xuICAgIGFuY2hvcjogJ3N0YXJ0JyB8ICdtaWRkbGUnIHwgJ2VuZCc7XG4gICAgbGluZT86IHtcbiAgICAgIHgxOiBudW1iZXI7XG4gICAgICB5MTogbnVtYmVyO1xuICAgICAgeDI6IG51bWJlcjtcbiAgICAgIHkyOiBudW1iZXI7XG4gICAgfTtcbiAgfTtcblxuICBjb25zdCBlbXB0eUNoYXJ0OiBSZW5kZXJlZENoYXJ0ID0ge1xuICAgIHhUaWNrczogW10sXG4gICAgeVRpY2tzOiBbXSxcbiAgICBjb2xvcnM6IFtdLFxuICAgIGxpbmVzOiBbXSxcbiAgICBjaXJjbGVzOiBbXSxcbiAgICBhcmVhczogW10sXG4gICAgYmFyczogW10sXG4gICAgYXJjczogW10sXG4gICAgaG9yaXpvbnRhbEJhcnM6IFtdLFxuICAgIGRhdGFMYWJlbHM6IFtdLFxuICAgIHdhdGVyZmFsbExpbmVzOiBbXSxcbiAgfTtcblxuICBmdW5jdGlvbiB0aW1lc2VyaWVzRG9tYWluKGRhdGE6IFRpbWVzZXJpZXNEYXRhKSB7XG4gICAgcmV0dXJuIFtNYXRoLm1pbiguLi5kYXRhLngpLCBNYXRoLm1heCguLi5kYXRhLngpXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluZGV4RG9tYWluKGRhdGE6IExhYmVsZWREYXRhKSB7XG4gICAgcmV0dXJuIFswLCBkYXRhLngubGVuZ3RoIC0gMV07XG4gIH1cblxuICBmdW5jdGlvbiB5RG9tYWluKGRhdGE6IERhdGEsIHNjYWxlRmFjdG9yOiBudW1iZXIgPSAxKSB7XG4gICAgY29uc3QgbWF4ID1cbiAgICAgIE1hdGgubWF4KC4uLmRhdGEueXMubWFwKHkgPT4gTWF0aC5tYXgoLi4ueS52YWx1ZXMpKSkgKiBzY2FsZUZhY3RvcjtcbiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbiguLi5kYXRhLnlzLm1hcCh5ID0+IE1hdGgubWluKC4uLnkudmFsdWVzKSkpO1xuICAgIHJldHVybiBbbWluIDwgMCA/IG1pbiA6IDAsIG1heCA8PSAwID8gMSA6IG1heF07XG4gIH1cblxuICBmdW5jdGlvbiB4UmFuZ2UoZGltZW5zaW9uczogRGltZW5zaW9ucywgY29uZmlnOiBDb25maWcpIHtcbiAgICByZXR1cm4gW1xuICAgICAgY29uZmlnLnNob3dEYXRhTGFiZWxzID8gTEVGVF9QQURESU5HX1dJVEhfREFUQV9MQUJFTFMgOiBMRUZUX1BBRERJTkcsXG4gICAgICBkaW1lbnNpb25zLndpZHRoIC0gUklHSFRfUEFERElORyxcbiAgICBdO1xuICB9XG5cbiAgZnVuY3Rpb24geFJhbmdlSG9yaXpvbnRhbChcbiAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zLFxuICAgIGRhdGE6IERhdGEsXG4gICAgbGFyZ2VzdExhYmVsTGVuZ3RoOiBudW1iZXIsXG4gICAgY29uZmlnOiBDb25maWcsXG4gICkge1xuICAgIGxldCBsZWZ0UGFkZGluZ01heCA9XG4gICAgICBkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnID8gTEVGVF9QQURESU5HX0xBQkVMX01BWCA6IExFRlRfUEFERElOR19EQVRFO1xuICAgIGxldCBsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQgPSBsZWZ0UGFkZGluZ01heDtcbiAgICBpZiAoZGF0YS50eXBlID09ICdsYWJlbGVkJykge1xuICAgICAgY29uc3QgbWF4TGFiZWxTaXplID0gTWF0aC5tYXgoLi4uZGF0YS54Lm1hcCh4ID0+IHgubGFiZWwubGVuZ3RoKSk7XG4gICAgICBsZWZ0UGFkZGluZ0NhbGN1bGF0ZWQgPSBNYXRoLm1pbihcbiAgICAgICAgbGVmdFBhZGRpbmdNYXgsXG4gICAgICAgIG1heExhYmVsU2l6ZSAqIFdJRFRIX1BFUl9MRVRURVIsXG4gICAgICApO1xuICAgIH1cbiAgICAvL1NwYWNlIGJldHdlZW4gbGFiZWwgYW5kIGNoYXJ0XG4gICAgbGVmdFBhZGRpbmdDYWxjdWxhdGVkID0gbGVmdFBhZGRpbmdDYWxjdWxhdGVkICsgU01BTExfUEFERElORztcblxuICAgIC8vSWYgZGF0YSBsYWJlbHMgYXJlIG9uLCBhbmQgd2UgaGF2ZSBuZWdhdGl2ZSBiYXJzLCB3ZSBuZWVkIGV2ZW4gbW9yZSBsZWZ0IHBhZGRpbmdcbiAgICBjb25zdCBkYXRhTGFiZWxQYWRkaW5nID1cbiAgICAgIGNvbmZpZy5zaG93RGF0YUxhYmVscyAmJiBkYXRhLnlzLmZpbmQoeSA9PiB5LnZhbHVlcy5maW5kKHZhbCA9PiB2YWwgPCAwKSlcbiAgICAgICAgPyBsYXJnZXN0TGFiZWxMZW5ndGggKiBXSURUSF9QRVJfTEVUVEVSXG4gICAgICAgIDogMDtcbiAgICByZXR1cm4gW1xuICAgICAgTWF0aC5tYXgobGVmdFBhZGRpbmdDYWxjdWxhdGVkLCBMRUZUX1BBRERJTkcpICsgZGF0YUxhYmVsUGFkZGluZyxcbiAgICAgIGRpbWVuc2lvbnMud2lkdGggLSBSSUdIVF9QQURESU5HX0hPUklaT05UQUwsXG4gICAgXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhclhSYW5nZShkaW1lbnNpb25zOiBEaW1lbnNpb25zLCBkYXRhOiBEYXRhLCBjb25maWc6IENvbmZpZykge1xuICAgIGNvbnN0IGxlZnQgPSBjb25maWcuc2hvd0RhdGFMYWJlbHNcbiAgICAgID8gTEVGVF9QQURESU5HX1dJVEhfREFUQV9MQUJFTFNcbiAgICAgIDogTEVGVF9QQURESU5HO1xuICAgIGNvbnN0IHJpZ2h0ID0gZGltZW5zaW9ucy53aWR0aCAtIFJJR0hUX1BBRERJTkc7XG4gICAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gICAgY29uc3QgYmluU2l6ZSA9IHdpZHRoIC8gKGRhdGEueC5sZW5ndGggfHwgMSk7XG4gICAgY29uc3QgaGFsZkJpblNpemUgPSBiaW5TaXplIC8gMjtcbiAgICBjb25zdCByYW5nZSA9IFtsZWZ0ICsgaGFsZkJpblNpemUsIHJpZ2h0IC0gaGFsZkJpblNpemVdO1xuICAgIHJldHVybiB7IGJpblNpemU6IE1hdGgubWluKGJpblNpemUgKiAwLjcsIDgwKSwgcmFuZ2UgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJhcllSYW5nZShkaW1lbnNpb25zOiBEaW1lbnNpb25zLCBkYXRhOiBEYXRhLCBjb25maWc6IENvbmZpZykge1xuICAgIGNvbnN0IHRvcCA9XG4gICAgICBkaW1lbnNpb25zLmhlaWdodCAtXG4gICAgICAoY29uZmlnLnNob3dEYXRhTGFiZWxzID8gVE9QX1BBRERJTkdfV0lUSF9EQVRBX0xBQkVMUyA6IFRPUF9QQURESU5HKTtcbiAgICBjb25zdCBib3R0b20gPSBCT1RUT01fUEFERElORztcbiAgICBjb25zdCBoZWlnaHQgPSB0b3AgLSBib3R0b207XG4gICAgY29uc3QgYmluU2l6ZSA9IGhlaWdodCAvIChkYXRhLngubGVuZ3RoIHx8IDEpO1xuICAgIGNvbnN0IGhhbGZCaW5TaXplID0gYmluU2l6ZSAvIDI7XG4gICAgY29uc3QgcmFuZ2UgPSBbYm90dG9tICsgaGFsZkJpblNpemUsIHRvcCAtIGhhbGZCaW5TaXplXTtcbiAgICByZXR1cm4geyByYW5nZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24geVJhbmdlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMsIGNvbmZpZzogQ29uZmlnLCBkYXRhOiBEYXRhKSB7XG4gICAgY29uc3QgZXh0cmFCb3R0b21QYWRkaW5nID1cbiAgICAgIGNvbmZpZy5zaG93RGF0YUxhYmVscyAmJlxuICAgICAgZGF0YS55cy5maW5kKHkgPT4geS52YWx1ZXMuZmluZCh2YWwgPT4gdmFsIDwgMCkpICYmXG4gICAgICAoY29uZmlnLnR5cGUgPT0gJ2JhcicgfHwgY29uZmlnLnR5cGUgPT0gJ3dhdGVyZmFsbCcpO1xuICAgIHJldHVybiBbXG4gICAgICBkaW1lbnNpb25zLmhlaWdodCAtXG4gICAgICAgIChleHRyYUJvdHRvbVBhZGRpbmcgPyBCT1RUT01fUEFERElOR19XSVRIX0RBVEFfTEFCRUxTIDogQk9UVE9NX1BBRERJTkcpLFxuICAgICAgY29uZmlnLnNob3dEYXRhTGFiZWxzID8gVE9QX1BBRERJTkdfV0lUSF9EQVRBX0xBQkVMUyA6IFRPUF9QQURESU5HLFxuICAgIF07XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjWVNjYWxlc0FuZFRpY2tzKFxuICAgIGRhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgICBwaXBlOiBOdW1iZXJQaXBlIHwgU21hbGxDdXJyZW5jeVBpcGUgfCBQZXJjZW50YWdlUGlwZSB8IERheXNQaXBlLFxuICAgIHNlY29uZGFyeVBpcGU6IE51bWJlclBpcGUgfCBTbWFsbEN1cnJlbmN5UGlwZSB8IFBlcmNlbnRhZ2VQaXBlIHwgRGF5c1BpcGUsXG4gICAgaXNTdGFja2VkOiBib29sZWFuLFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICApOiB7XG4gICAgeVNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICAgIHlTY2FsZVNlY29uZGFyeTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgICBzY2FsZTogKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBudW1iZXI7XG4gICAgeVRpY2tzOiBZVGlja1tdO1xuICB9IHtcbiAgICBjb25zdCBzZWNvbmRhcnlEYXRhID0ge1xuICAgICAgLi4uZGF0YSxcbiAgICAgIHlzOiBkYXRhLnlzLmZpbHRlcih5ID0+IHkuaXNTZWNvbmRhcnkpLFxuICAgIH07XG4gICAgY29uc3Qgc2NhbGVSYW5nZSA9IHlSYW5nZShkaW1lbnNpb25zLCBjb25maWcsIGRhdGEpO1xuXG4gICAgLy9TaW1wbGVyIHBhdGggZm9yIGRhdGEgdy9vIHNlY29uZGFyaWVzXG4gICAgaWYgKHNlY29uZGFyeURhdGEueXMubGVuZ3RoID09IDApIHtcbiAgICAgIGNvbnN0IHlTY2FsZURvbWFpblZhbHVlcyA9IGNhbGNZU2NhbGVEb21haW5WYWx1ZXMoZGF0YSwgaXNTdGFja2VkLCBmYWxzZSk7XG4gICAgICBjb25zdCB5U2NhbGUgPSBzY2FsZUxpbmVhcihcbiAgICAgICAgW1xuICAgICAgICAgIE1hdGgubWluKC4uLnlTY2FsZURvbWFpblZhbHVlcy5tYXAodmFsID0+IHZhbC5taW4pKSxcbiAgICAgICAgICBNYXRoLm1heCguLi55U2NhbGVEb21haW5WYWx1ZXMubWFwKHZhbCA9PiB2YWwubWF4KSksXG4gICAgICAgIF0sXG4gICAgICAgIHNjYWxlUmFuZ2UsXG4gICAgICApO1xuICAgICAgY29uc3QgeVRpY2tzOiBZVGlja1tdID0geVNjYWxlLnRpY2tzKDUpLm1hcCh0aWNrID0+ICh7XG4gICAgICAgIHk6IHlTY2FsZSh0aWNrKSxcbiAgICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc2NhbGUgPSAoaW5wdXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB5U2NhbGUoaW5wdXQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHlTY2FsZSxcbiAgICAgICAgeVNjYWxlU2Vjb25kYXJ5OiB5U2NhbGUsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICB5VGlja3MsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHByaW1hcnlZU2NhbGVEb21haW5WYWx1ZXMgPSBjYWxjWVNjYWxlRG9tYWluVmFsdWVzKFxuICAgICAgZGF0YSxcbiAgICAgIGlzU3RhY2tlZCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gICAgY29uc3Qgc2Vjb25kYXJ5WVNjYWxlRG9tYWluVmFsdWVzID0gY2FsY1lTY2FsZURvbWFpblZhbHVlcyhcbiAgICAgIGRhdGEsXG4gICAgICBpc1N0YWNrZWQsXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBsZXQgc2NhbGVEb21haW5NdWx0aXBsZSA9IDE7XG4gICAgLy9DYWxjdWxhdGluZyBob3cgbXVjaCB3ZSBuZWVkIHRvIG11bHRpcGxlIHRoZSBkb21haW4gYnkgdG8gJ2ZpdCcgYm90aCBheGVzJyBkYXRhXG4gICAgaWYgKGlzU3RhY2tlZCkge1xuICAgICAgY29uc3QgcHJpbWFyeURhdGFNYXggPSBNYXRoLm1heChcbiAgICAgICAgLi4ucHJpbWFyeVlTY2FsZURvbWFpblZhbHVlcy5tYXAodmFsID0+IHZhbC5tYXgpLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlY29uZGFyeURhdGFNYXggPSBNYXRoLm1heChcbiAgICAgICAgLi4uc2Vjb25kYXJ5WVNjYWxlRG9tYWluVmFsdWVzLm1hcCh2YWwgPT4gdmFsLm1heCksXG4gICAgICApO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmltYXJ5WVNjYWxlRG9tYWluVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlWYWwgPSBwcmltYXJ5WVNjYWxlRG9tYWluVmFsdWVzW2ldLm1heDtcbiAgICAgICAgY29uc3Qgc2Vjb25kYXJ5VmFsID0gc2Vjb25kYXJ5WVNjYWxlRG9tYWluVmFsdWVzW2ldLm1heDtcbiAgICAgICAgY29uc3QgcHJpbWFyeVJhdGlvID1cbiAgICAgICAgICBwcmltYXJ5RGF0YU1heCAhPSAwID8gcHJpbWFyeVZhbCAvIHByaW1hcnlEYXRhTWF4IDogMDtcbiAgICAgICAgY29uc3Qgc2Vjb25kYXJ5UmF0aW8gPVxuICAgICAgICAgIHNlY29uZGFyeURhdGFNYXggIT0gMCA/IHNlY29uZGFyeVZhbCAvIHNlY29uZGFyeURhdGFNYXggOiAwO1xuICAgICAgICBjb25zdCBtdWx0VmFsID0gcHJpbWFyeVJhdGlvICsgc2Vjb25kYXJ5UmF0aW87XG4gICAgICAgIGlmIChtdWx0VmFsID4gc2NhbGVEb21haW5NdWx0aXBsZSkge1xuICAgICAgICAgIHNjYWxlRG9tYWluTXVsdGlwbGUgPSBtdWx0VmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByaW1hcnlZRG9tYWluID0gW1xuICAgICAgTWF0aC5taW4oLi4ucHJpbWFyeVlTY2FsZURvbWFpblZhbHVlcy5tYXAodmFsID0+IHZhbC5taW4pKSxcbiAgICAgIE1hdGgubWF4KC4uLnByaW1hcnlZU2NhbGVEb21haW5WYWx1ZXMubWFwKHZhbCA9PiB2YWwubWF4KSkgKlxuICAgICAgICBzY2FsZURvbWFpbk11bHRpcGxlLFxuICAgIF07XG5cbiAgICAvL0ZpZ3VyaW5nIG91dCB0aGUgYmVzdCB0aWNrIGNvdW50IHRvIGZpdCB0aGUgdHdvIGRhdGEgc3JvdWNlc1xuICAgIGNvbnN0IHlTY2FsZVByaW1hcnlQcm90byA9IHNjYWxlTGluZWFyKHByaW1hcnlZRG9tYWluLCBzY2FsZVJhbmdlKTtcbiAgICBjb25zdCB5U2NhbGVTZWNvbmRhcnlQcm90byA9IHNjYWxlTGluZWFyKFxuICAgICAgW1xuICAgICAgICBNYXRoLm1pbiguLi5zZWNvbmRhcnlZU2NhbGVEb21haW5WYWx1ZXMubWFwKHZhbCA9PiB2YWwubWluKSksXG4gICAgICAgIE1hdGgubWF4KC4uLnNlY29uZGFyeVlTY2FsZURvbWFpblZhbHVlcy5tYXAodmFsID0+IHZhbC5tYXgpKSAqXG4gICAgICAgICAgc2NhbGVEb21haW5NdWx0aXBsZSxcbiAgICAgIF0sXG4gICAgICBzY2FsZVJhbmdlLFxuICAgICk7XG4gICAgY29uc3QgdGlja0NvdW50ID0gTWF0aC5tYXgoXG4gICAgICA1LFxuICAgICAgeVNjYWxlUHJpbWFyeVByb3RvLnRpY2tzKDUpLmxlbmd0aCxcbiAgICAgIHlTY2FsZVNlY29uZGFyeVByb3RvLnRpY2tzKDUpLmxlbmd0aCxcbiAgICApO1xuXG4gICAgLy9GaW5kaW5nIGEgZG9tYWluIGZvciB0aGUgc2Vjb25kYXJ5IGRhdGEgc3VjaCB0aGF0IGl0IHdpbGwgcmVzdWx0IGluIHJvdW5kIHRpY2sgdmFsdWVzIHdoZW4gbWF0Y2hlZCB3aXRoIHRoZSBwcmltYXJ5IHRpY2tzXG4gICAgY29uc3Qgc2Vjb25kYXJ5VGlja3NQcm90byA9IHlTY2FsZVNlY29uZGFyeVByb3RvXG4gICAgICAudGlja3ModGlja0NvdW50KVxuICAgICAgLm1hcCh0aWNrID0+ICh7XG4gICAgICAgIHk6IHlTY2FsZVNlY29uZGFyeVByb3RvKHRpY2spLFxuICAgICAgICByYXdZOiB0aWNrLFxuICAgICAgICBsYWJlbDogc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odGljayksXG4gICAgICB9KSk7XG4gICAgY29uc3QgeVNjYWxlRG9tYWluTWF4ID0gTWF0aC5tYXgoLi4ucHJpbWFyeVlEb21haW4pO1xuICAgIGNvbnN0IHlTY2FsZSA9IHNjYWxlTGluZWFyKHByaW1hcnlZRG9tYWluLCBzY2FsZVJhbmdlKTtcbiAgICBjb25zdCB5U2NhbGVUaWNrTWF4ID0gTWF0aC5tYXgoLi4ueVNjYWxlLnRpY2tzKHRpY2tDb3VudCkpO1xuICAgIGNvbnN0IHNlY29uZGFyeUdhcCA9XG4gICAgICBzZWNvbmRhcnlUaWNrc1Byb3RvWzFdLnJhd1kgLSBzZWNvbmRhcnlUaWNrc1Byb3RvWzBdLnJhd1k7XG4gICAgY29uc3QgZ2FwQ291bnQgPSB5U2NhbGUudGlja3ModGlja0NvdW50KS5sZW5ndGggLSAxO1xuICAgIGxldCBjYWxjTWF4ID0gc2Vjb25kYXJ5R2FwICogZ2FwQ291bnQ7XG4gICAgY29uc3QgdGlja01heCA9IE1hdGgubWF4KFxuICAgICAgLi4uc2Vjb25kYXJ5VGlja3NQcm90by5tYXAoc2VjVGljayA9PiBzZWNUaWNrLnJhd1kpLFxuICAgICk7XG4gICAgd2hpbGUgKGNhbGNNYXggPCB0aWNrTWF4KSB7XG4gICAgICBjYWxjTWF4ID0gY2FsY01heCAqIDI7XG4gICAgfVxuICAgIHdoaWxlIChjYWxjTWF4ID4gdGlja01heCAqIDIpIHtcbiAgICAgIGNhbGNNYXggPSBjYWxjTWF4IC8gMjtcbiAgICB9XG4gICAgY29uc3QgeVNjYWxlU2Vjb25kYXJ5ID0gc2NhbGVMaW5lYXIoXG4gICAgICBbMCwgY2FsY01heCAqICh5U2NhbGVEb21haW5NYXggLyB5U2NhbGVUaWNrTWF4KV0sXG4gICAgICBzY2FsZVJhbmdlLFxuICAgICk7XG5cbiAgICBjb25zdCB5VGlja3M6IFlUaWNrW10gPSB5U2NhbGUudGlja3ModGlja0NvdW50KS5tYXAodGljayA9PiAoe1xuICAgICAgeTogeVNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgICAgc2Vjb25kYXJ5TGFiZWw6IHNlY29uZGFyeVBpcGUudHJhbnNmb3JtKFxuICAgICAgICB5U2NhbGVTZWNvbmRhcnkuaW52ZXJ0KHlTY2FsZSh0aWNrKSksXG4gICAgICApLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHNjYWxlID0gKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKTogbnVtYmVyID0+IHtcbiAgICAgIGlmIChpc1NlY29uZGFyeSkge1xuICAgICAgICByZXR1cm4geVNjYWxlU2Vjb25kYXJ5KGlucHV0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB5U2NhbGUoaW5wdXQpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHlTY2FsZSxcbiAgICAgIHlTY2FsZVNlY29uZGFyeSxcbiAgICAgIHNjYWxlLFxuICAgICAgeVRpY2tzLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjWVNjYWxlRG9tYWluVmFsdWVzKFxuICAgIGRhdGE6IERhdGEsXG4gICAgaXNTdGFja2VkOiBib29sZWFuLFxuICAgIGZvclNlY29uZGFyeTogYm9vbGVhbixcbiAgKTogeyBtYXg6IG51bWJlcjsgbWluOiBudW1iZXIgfVtdIHtcbiAgICBjb25zdCBwb3NzaWJseVN0YWNrZWRZcyA9IGRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgIC8vSGFuZGxlIHN0YWNraW5nXG4gICAgICByZXR1cm4gaXNTdGFja2VkXG4gICAgICAgID8geS52YWx1ZXMubWFwKCh2YWwsIHhJbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IHByZXZSdW5uaW5nVG90YWwgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgeUkgPSAwOyB5SSA8IHlJbmRleDsgeUkrKykge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIHhJbmRleCwgZmFsc2UpICE9IGZvclNlY29uZGFyeVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhZGRWYWwgPSBkYXRhLnlzW3lJXS52YWx1ZXNbeEluZGV4XTtcbiAgICAgICAgICAgICAgLy9Pbmx5IHN0YWNrIHZhbHVlcyBvZiB0aGUgc2FtZSBzaWduXG4gICAgICAgICAgICAgIGlmIChhZGRWYWwgPCAwID09IHZhbCA8IDApIHtcbiAgICAgICAgICAgICAgICBwcmV2UnVubmluZ1RvdGFsICs9IGFkZFZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbCArIHByZXZSdW5uaW5nVG90YWw7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiB5LnZhbHVlcztcbiAgICB9KTtcbiAgICBjb25zdCBzdXBwWXMgPSBkYXRhLnN1cHBsZW1lbnRhcnlZcztcbiAgICBsZXQgcG9zc2libHlTdGFja2VkU3VwWXM6IG51bWJlcltdW10gPSBbXTtcbiAgICBpZiAoc3VwcFlzICYmIHN1cHBZcy5sZW5ndGggPiAwKSB7XG4gICAgICBwb3NzaWJseVN0YWNrZWRTdXBZcyA9IHN1cHBZcy5tYXAoKHksIHlJbmRleCkgPT4ge1xuICAgICAgICAvL0hhbmRsZSBzdGFja2luZ1xuICAgICAgICByZXR1cm4gaXNTdGFja2VkXG4gICAgICAgICAgPyB5LnZhbHVlcy5tYXAoKHZhbCwgeEluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBwcmV2UnVubmluZ1RvdGFsID0gMDtcbiAgICAgICAgICAgICAgZm9yIChsZXQgeUkgPSAwOyB5SSA8IHlJbmRleDsgeUkrKykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgsIHRydWUpICE9XG4gICAgICAgICAgICAgICAgICAgIGZvclNlY29uZGFyeSB8fFxuICAgICAgICAgICAgICAgICAgc3VwcFlzW3lJXS5zdXBwbGVtZW50YWxJbmRleCAhPSB5LnN1cHBsZW1lbnRhbEluZGV4XG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkVmFsID0gc3VwcFlzW3lJXS52YWx1ZXNbeEluZGV4XTtcbiAgICAgICAgICAgICAgICAvL09ubHkgc3RhY2sgdmFsdWVzIG9mIHRoZSBzYW1lIHNpZ25cbiAgICAgICAgICAgICAgICBpZiAoYWRkVmFsIDwgMCA9PSB2YWwgPCAwKSB7XG4gICAgICAgICAgICAgICAgICBwcmV2UnVubmluZ1RvdGFsICs9IGFkZFZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHZhbCArIHByZXZSdW5uaW5nVG90YWw7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogeS52YWx1ZXM7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2FsZVJhbmdlOiB7IG1heDogbnVtYmVyOyBtaW46IG51bWJlciB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbWF4Tm9ybVkgPSBNYXRoLm1heChcbiAgICAgICAgLi4ucG9zc2libHlTdGFja2VkWXMubWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIGksIGZhbHNlKSAhPSBmb3JTZWNvbmRhcnkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geVtpXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgY29uc3QgbWluTm9ybVkgPSBNYXRoLm1pbihcbiAgICAgICAgLi4ucG9zc2libHlTdGFja2VkWXMubWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIGksIGZhbHNlKSAhPSBmb3JTZWNvbmRhcnkpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geVtpXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgY29uc3QgbWF4U3VwWSA9IHN1cHBZc1xuICAgICAgICA/IE1hdGgubWF4KFxuICAgICAgICAgICAgLi4ucG9zc2libHlTdGFja2VkU3VwWXMubWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCBpLCB0cnVlKSAhPSBmb3JTZWNvbmRhcnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4geVtpXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgOiAwO1xuICAgICAgY29uc3QgbWluU3VwWSA9IHN1cHBZc1xuICAgICAgICA/IE1hdGgubWluKFxuICAgICAgICAgICAgLi4ucG9zc2libHlTdGFja2VkU3VwWXMubWFwKCh5LCB5SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCBpLCB0cnVlKSAhPSBmb3JTZWNvbmRhcnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4geVtpXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgOiAwO1xuICAgICAgY29uc3QgbWF4ID1cbiAgICAgICAgbWF4Tm9ybVkgPiAwICYmIG1heE5vcm1ZID4gbWF4U3VwWVxuICAgICAgICAgID8gbWF4Tm9ybVlcbiAgICAgICAgICA6IG1heFN1cFkgPiAwXG4gICAgICAgICAgPyBtYXhTdXBZXG4gICAgICAgICAgOiAwO1xuICAgICAgY29uc3QgbWluID1cbiAgICAgICAgbWluTm9ybVkgPCAwICYmIG1pbk5vcm1ZIDwgbWluU3VwWVxuICAgICAgICAgID8gbWluTm9ybVlcbiAgICAgICAgICA6IG1pblN1cFkgPCAwXG4gICAgICAgICAgPyBtaW5TdXBZXG4gICAgICAgICAgOiAwO1xuICAgICAgc2NhbGVSYW5nZS5wdXNoKHsgbWF4LCBtaW4gfSk7XG4gICAgfVxuICAgIHJldHVybiBzY2FsZVJhbmdlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q2x1c3RlckNvdW50V2l0aFN1cHAoZGF0YTogRGF0YSk6IG51bWJlciB7XG4gICAgY29uc3Qgc3VwcFlzID0gZGF0YS5zdXBwbGVtZW50YXJ5WXM7XG4gICAgaWYgKHN1cHBZcykge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KC4uLnN1cHBZcy5tYXAoc3VwcFkgPT4gc3VwcFkuc3VwcGxlbWVudGFsSW5kZXgpKSArIDI7XG4gICAgfVxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlWFZhbHVlQW5kT2Zmc2V0Rm9yQmFycyhcbiAgICBiaW5TaXplOiBudW1iZXIsXG4gICAgY2x1c3RlckNvdW50OiBudW1iZXIsXG4gICAgbWF0Y2hpbmdJbmRleDogbnVtYmVyLFxuICAgIG9yaWdpbmFsWFZhbHVlOiBudW1iZXIsXG4gICkge1xuICAgIGNvbnN0IHdpZHRoID0gKGJpblNpemUgLSAoY2x1c3RlckNvdW50IC0gMSkgKiBTTUFMTF9QQURESU5HKSAvIGNsdXN0ZXJDb3VudDtcbiAgICBjb25zdCBvZmZzZXQgPSBtYXRjaGluZ0luZGV4ICogKHdpZHRoICsgU01BTExfUEFERElORyk7XG4gICAgY29uc3QgeFZhbHVlID0gb3JpZ2luYWxYVmFsdWUgKyBvZmZzZXQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoLFxuICAgICAgeFZhbHVlLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjdWxhdGVIb3Jpem9udGFsQmFyUGF0aChcbiAgICBsZWZ0U2lkZVJvdW5kOiBib29sZWFuLFxuICAgIHJpZ2h0U2lkZVJvdW5kOiBib29sZWFuLFxuICAgIHhWYWx1ZTogbnVtYmVyLFxuICAgIHlWYWx1ZTogbnVtYmVyLFxuICAgIGhvclI6IG51bWJlcixcbiAgICB2ZXJSOiBudW1iZXIsXG4gICAgd2lkdGg6IG51bWJlcixcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAobGVmdFNpZGVSb3VuZCAmJiByaWdodFNpZGVSb3VuZCkge1xuICAgICAgLy9Cb3RoLXNpZGVzIHJvdW5kaW5nIHZhcmlhdGlvblxuICAgICAgY29uc3QgcGF0aEQgPSBgXG4gICAgICAgIE0gJHt4VmFsdWUgKyBob3JSfSwke3lWYWx1ZX1cbiAgICAgICAgaCAke3dpZHRoIC0gaG9yUiAqIDJ9XG4gICAgICAgIHEke2hvclJ9LDAgJHtob3JSfSwke3ZlclJ9XG4gICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSB2ZXJSICogMn1cbiAgICAgICAgcTAsJHt2ZXJSfSAtJHtob3JSfSwke3ZlclJ9XG4gICAgICAgIGggJHstKHdpZHRoIC0gaG9yUiAqIDIpfVxuICAgICAgICBxLSR7aG9yUn0sMCAtJHtob3JSfSwtJHt2ZXJSfVxuICAgICAgICB2IC0ke0hPUklaT05UQUxfQkFSX0hFSUdIVCAtIHZlclIgKiAyfVxuICAgICAgICBxMCwtJHt2ZXJSfSAke2hvclJ9LC0ke3ZlclJ9XG4gICAgICAgIFpcbiAgICAgIGA7XG4gICAgICByZXR1cm4gcGF0aEQ7XG4gICAgfVxuICAgIGlmIChsZWZ0U2lkZVJvdW5kKSB7XG4gICAgICAvL0xlZnQtc2lkZSByb3VuZGluZyB2YXJpYXRpb25cbiAgICAgIGNvbnN0IHBhdGhEID0gYFxuICAgICAgICBNICR7eFZhbHVlICsgaG9yUn0sJHt5VmFsdWV9XG4gICAgICAgIGggJHt3aWR0aCAtIGhvclJ9XG4gICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFR9XG4gICAgICAgIGggJHstKHdpZHRoIC0gaG9yUil9XG4gICAgICAgIHEtJHtob3JSfSwwIC0ke2hvclJ9LC0ke3ZlclJ9XG4gICAgICAgIHYgLSR7SE9SSVpPTlRBTF9CQVJfSEVJR0hUIC0gdmVyUiAqIDJ9XG4gICAgICAgIHEwLC0ke3ZlclJ9ICR7aG9yUn0sLSR7dmVyUn1cbiAgICAgICAgWlxuICAgICAgYDtcbiAgICAgIHJldHVybiBwYXRoRDtcbiAgICB9XG4gICAgaWYgKHJpZ2h0U2lkZVJvdW5kKSB7XG4gICAgICAvL1JpZ2h0LXNpZGUgcm91bmRpbmcgdmFyaWF0aW9uXG4gICAgICBjb25zdCBwYXRoRCA9IGBcbiAgICAgICAgTSAke3hWYWx1ZX0sJHt5VmFsdWV9XG4gICAgICAgIGggJHt3aWR0aCAtIGhvclJ9XG4gICAgICAgIHEke2hvclJ9LDAgJHtob3JSfSwke3ZlclJ9XG4gICAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFQgLSB2ZXJSICogMn1cbiAgICAgICAgcTAsJHt2ZXJSfSAtJHtob3JSfSwke3ZlclJ9XG4gICAgICAgIGggJHstKHdpZHRoIC0gaG9yUil9XG4gICAgICAgIFpcbiAgICAgIGA7XG4gICAgICByZXR1cm4gcGF0aEQ7XG4gICAgfVxuICAgIC8vTm8tcm91bmRpbmcgdmFyaWF0aW9uXG4gICAgY29uc3QgcGF0aEQgPSBgXG4gICAgICBNICR7eFZhbHVlfSwke3lWYWx1ZX1cbiAgICAgIGggJHt3aWR0aH1cbiAgICAgIHYgJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFR9XG4gICAgICBoICR7LXdpZHRofVxuICAgICAgdiAtJHtIT1JJWk9OVEFMX0JBUl9IRUlHSFR9XG4gICAgICBaXG4gICAgYDtcbiAgICByZXR1cm4gcGF0aEQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYWxjWFNjYWxlc0FuZFRpY2tzKFxuICAgIGRhdGE6IERhdGEsXG4gICAgZGltZW5zaW9uczogRGltZW5zaW9ucyxcbiAgICBwaXBlOiBOdW1iZXJQaXBlIHwgU21hbGxDdXJyZW5jeVBpcGUgfCBQZXJjZW50YWdlUGlwZSB8IERheXNQaXBlLFxuICAgIHNlY29uZGFyeVBpcGU6IE51bWJlclBpcGUgfCBTbWFsbEN1cnJlbmN5UGlwZSB8IFBlcmNlbnRhZ2VQaXBlIHwgRGF5c1BpcGUsXG4gICAgaXNTdGFja2VkOiBib29sZWFuLFxuICAgIGNvbmZpZzogQ29uZmlnLFxuICApOiB7XG4gICAgeFNjYWxlOiBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+O1xuICAgIHhTY2FsZVNlY29uZGFyeTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPjtcbiAgICBzY2FsZTogKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBudW1iZXI7XG4gICAgeFRpY2tzOiBYVGlja1tdO1xuICB9IHtcbiAgICBjb25zdCBwcmltYXJ5RGF0YSA9IGNvbnZlcnREYXRhVG9KdXN0T25lVmFsdWVUeXBlKGRhdGEsIGZhbHNlKTtcbiAgICBjb25zdCBzZWNvbmRhcnlEYXRhID0gY29udmVydERhdGFUb0p1c3RPbmVWYWx1ZVR5cGUoZGF0YSwgdHJ1ZSk7XG4gICAgY29uc3Qgc3VwcFlzID0gZGF0YS5zdXBwbGVtZW50YXJ5WXM7XG5cbiAgICBjb25zdCBsYXJnZXN0TGFiZWxMZW5ndGggPSBNYXRoLm1heChcbiAgICAgIC4uLmRhdGEueXMubWFwKCh5LCB5SW5kZXgpID0+XG4gICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgIC4uLnkudmFsdWVzLm1hcChcbiAgICAgICAgICAgICh2YWwsIHhJbmRleCkgPT5cbiAgICAgICAgICAgICAgKGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgsIGZhbHNlKVxuICAgICAgICAgICAgICAgID8gc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odmFsKVxuICAgICAgICAgICAgICAgIDogcGlwZS50cmFuc2Zvcm0odmFsKVxuICAgICAgICAgICAgICApLmxlbmd0aCxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIC4uLihzdXBwWXMgPz8gW10pLm1hcCgoeSwgeUluZGV4KSA9PlxuICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICAuLi55LnZhbHVlcy5tYXAoXG4gICAgICAgICAgICAodmFsLCB4SW5kZXgpID0+XG4gICAgICAgICAgICAgIChjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIHlJbmRleCwgeEluZGV4LCB0cnVlKVxuICAgICAgICAgICAgICAgID8gc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odmFsKVxuICAgICAgICAgICAgICAgIDogcGlwZS50cmFuc2Zvcm0odmFsKVxuICAgICAgICAgICAgICApLmxlbmd0aCxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApO1xuICAgIGNvbnN0IHNjYWxlUmFuZ2UgPSB4UmFuZ2VIb3Jpem9udGFsKFxuICAgICAgZGltZW5zaW9ucyxcbiAgICAgIGRhdGEsXG4gICAgICBsYXJnZXN0TGFiZWxMZW5ndGgsXG4gICAgICBjb25maWcsXG4gICAgKTtcblxuICAgIC8vU2ltcGxlciBwYXRoIGZvciBkYXRhIHcvbyBzZWNvbmRhcmllc1xuICAgIGlmICghc2Vjb25kYXJ5RGF0YS55cy5maW5kKHkgPT4geS52YWx1ZXMuZmluZCh2YWwgPT4gdmFsICE9IDApKSkge1xuICAgICAgY29uc3QgeVNjYWxlRG9tYWluVmFsdWVzID0gY2FsY1lTY2FsZURvbWFpblZhbHVlcyhcbiAgICAgICAgcHJpbWFyeURhdGEsXG4gICAgICAgIGlzU3RhY2tlZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgY29uc3QgeFNjYWxlID0gc2NhbGVMaW5lYXIoXG4gICAgICAgIFtcbiAgICAgICAgICBNYXRoLm1pbiguLi55U2NhbGVEb21haW5WYWx1ZXMubWFwKHZhbCA9PiB2YWwubWluKSksXG4gICAgICAgICAgTWF0aC5tYXgoLi4ueVNjYWxlRG9tYWluVmFsdWVzLm1hcCh2YWwgPT4gdmFsLm1heCkpLFxuICAgICAgICBdLFxuICAgICAgICBzY2FsZVJhbmdlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHhUaWNrczogWFRpY2tbXSA9IHhTY2FsZS50aWNrcyg1KS5tYXAodGljayA9PiAoe1xuICAgICAgICB4OiB4U2NhbGUodGljayksXG4gICAgICAgIGxhYmVsOiBwaXBlLnRyYW5zZm9ybSh0aWNrKSxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3Qgc2NhbGUgPSAoaW5wdXQ6IG51bWJlcik6IG51bWJlciA9PiB7XG4gICAgICAgIHJldHVybiB4U2NhbGUoaW5wdXQpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHhTY2FsZSxcbiAgICAgICAgeFNjYWxlU2Vjb25kYXJ5OiB4U2NhbGUsXG4gICAgICAgIHNjYWxlLFxuICAgICAgICB4VGlja3MsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwcmltYXJ5WVNjYWxlRG9tYWluVmFsdWVzID0gY2FsY1lTY2FsZURvbWFpblZhbHVlcyhcbiAgICAgIGRhdGEsXG4gICAgICBpc1N0YWNrZWQsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICAgIGNvbnN0IHNlY29uZGFyeVlTY2FsZURvbWFpblZhbHVlcyA9IGNhbGNZU2NhbGVEb21haW5WYWx1ZXMoXG4gICAgICBkYXRhLFxuICAgICAgaXNTdGFja2VkLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIGxldCBzY2FsZURvbWFpbk11bHRpcGxlID0gMTtcblxuICAgIC8vQ2FsY3VsYXRpbmcgaG93IG11Y2ggd2UgbmVlZCB0byBtdWx0aXBsZSB0aGUgZG9tYWluIGJ5IHRvICdmaXQnIGJvdGggYXhlcycgZGF0YVxuICAgIGlmIChpc1N0YWNrZWQpIHtcbiAgICAgIGNvbnN0IHByaW1hcnlEYXRhTWF4ID0gTWF0aC5tYXgoXG4gICAgICAgIC4uLnByaW1hcnlZU2NhbGVEb21haW5WYWx1ZXMubWFwKHZhbCA9PiB2YWwubWF4KSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzZWNvbmRhcnlEYXRhTWF4ID0gTWF0aC5tYXgoXG4gICAgICAgIC4uLnNlY29uZGFyeVlTY2FsZURvbWFpblZhbHVlcy5tYXAodmFsID0+IHZhbC5tYXgpLFxuICAgICAgKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJpbWFyeVlTY2FsZURvbWFpblZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcmltYXJ5VmFsID0gcHJpbWFyeVlTY2FsZURvbWFpblZhbHVlc1tpXS5tYXg7XG4gICAgICAgIGNvbnN0IHNlY29uZGFyeVZhbCA9IHNlY29uZGFyeVlTY2FsZURvbWFpblZhbHVlc1tpXS5tYXg7XG4gICAgICAgIGNvbnN0IHByaW1hcnlSYXRpbyA9XG4gICAgICAgICAgcHJpbWFyeURhdGFNYXggIT0gMCA/IHByaW1hcnlWYWwgLyBwcmltYXJ5RGF0YU1heCA6IDA7XG4gICAgICAgIGNvbnN0IHNlY29uZGFyeVJhdGlvID1cbiAgICAgICAgICBzZWNvbmRhcnlEYXRhTWF4ICE9IDAgPyBzZWNvbmRhcnlWYWwgLyBzZWNvbmRhcnlEYXRhTWF4IDogMDtcbiAgICAgICAgY29uc3QgbXVsdFZhbCA9IHByaW1hcnlSYXRpbyArIHNlY29uZGFyeVJhdGlvO1xuICAgICAgICBpZiAobXVsdFZhbCA+IHNjYWxlRG9tYWluTXVsdGlwbGUpIHtcbiAgICAgICAgICBzY2FsZURvbWFpbk11bHRpcGxlID0gbXVsdFZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcmltYXJ5WERvbWFpbiA9IFtcbiAgICAgIE1hdGgubWluKC4uLnByaW1hcnlZU2NhbGVEb21haW5WYWx1ZXMubWFwKHZhbCA9PiB2YWwubWluKSksXG4gICAgICBNYXRoLm1heCguLi5wcmltYXJ5WVNjYWxlRG9tYWluVmFsdWVzLm1hcCh2YWwgPT4gdmFsLm1heCkpICpcbiAgICAgICAgc2NhbGVEb21haW5NdWx0aXBsZSxcbiAgICBdO1xuICAgIGNvbnN0IHhTY2FsZVByaW1hcnlQcm90byA9IHNjYWxlTGluZWFyKHByaW1hcnlYRG9tYWluLCBzY2FsZVJhbmdlKTtcbiAgICBjb25zdCB4U2NhbGVTZWNvbmRhcnlQcm90byA9IHNjYWxlTGluZWFyKFxuICAgICAgW1xuICAgICAgICBNYXRoLm1pbiguLi5zZWNvbmRhcnlZU2NhbGVEb21haW5WYWx1ZXMubWFwKHZhbCA9PiB2YWwubWluKSksXG4gICAgICAgIE1hdGgubWF4KC4uLnNlY29uZGFyeVlTY2FsZURvbWFpblZhbHVlcy5tYXAodmFsID0+IHZhbC5tYXgpKSAqXG4gICAgICAgICAgc2NhbGVEb21haW5NdWx0aXBsZSxcbiAgICAgIF0sXG4gICAgICBzY2FsZVJhbmdlLFxuICAgICk7XG4gICAgY29uc3QgdGlja0NvdW50ID0gTWF0aC5tYXgoXG4gICAgICA1LFxuICAgICAgeFNjYWxlUHJpbWFyeVByb3RvLnRpY2tzKDUpLmxlbmd0aCxcbiAgICAgIHhTY2FsZVNlY29uZGFyeVByb3RvLnRpY2tzKDUpLmxlbmd0aCxcbiAgICApO1xuXG4gICAgLy9GaW5kaW5nIGEgZG9tYWluIGZvciB0aGUgc2Vjb25kYXJ5IGRhdGEgc3VjaCB0aGF0IGl0IHdpbGwgcmVzdWx0IGluIHJvdW5kIHRpY2sgdmFsdWVzIHdoZW4gbWF0Y2hlZCB3aXRoIHRoZSBwcmltYXJ5IHRpY2tzXG4gICAgY29uc3Qgc2Vjb25kYXJ5VGlja3NQcm90byA9IHhTY2FsZVNlY29uZGFyeVByb3RvXG4gICAgICAudGlja3ModGlja0NvdW50KVxuICAgICAgLm1hcCh0aWNrID0+ICh7XG4gICAgICAgIHg6IHhTY2FsZVNlY29uZGFyeVByb3RvKHRpY2spLFxuICAgICAgICByYXdYOiB0aWNrLFxuICAgICAgICBsYWJlbDogc2Vjb25kYXJ5UGlwZS50cmFuc2Zvcm0odGljayksXG4gICAgICB9KSk7XG4gICAgY29uc3QgeFNjYWxlRG9tYWluTWF4ID0gTWF0aC5tYXgoLi4ucHJpbWFyeVhEb21haW4pO1xuICAgIGNvbnN0IHhTY2FsZSA9IHNjYWxlTGluZWFyKHByaW1hcnlYRG9tYWluLCBzY2FsZVJhbmdlKTtcbiAgICBjb25zdCB4U2NhbGVUaWNrTWF4ID0gTWF0aC5tYXgoLi4ueFNjYWxlLnRpY2tzKHRpY2tDb3VudCkpO1xuICAgIGNvbnN0IHNlY29uZGFyeUdhcCA9XG4gICAgICBzZWNvbmRhcnlUaWNrc1Byb3RvWzFdLnJhd1ggLSBzZWNvbmRhcnlUaWNrc1Byb3RvWzBdLnJhd1g7XG4gICAgY29uc3QgZ2FwQ291bnQgPSB4U2NhbGUudGlja3ModGlja0NvdW50KS5sZW5ndGggLSAxO1xuICAgIGxldCBjYWxjTWF4ID0gc2Vjb25kYXJ5R2FwICogZ2FwQ291bnQ7XG4gICAgY29uc3QgdGlja01heCA9IE1hdGgubWF4KFxuICAgICAgLi4uc2Vjb25kYXJ5VGlja3NQcm90by5tYXAoc2VjVGljayA9PiBzZWNUaWNrLnJhd1gpLFxuICAgICk7XG4gICAgd2hpbGUgKGNhbGNNYXggPCB0aWNrTWF4KSB7XG4gICAgICBjYWxjTWF4ID0gY2FsY01heCAqIDI7XG4gICAgfVxuICAgIHdoaWxlIChjYWxjTWF4ID4gdGlja01heCAqIDIpIHtcbiAgICAgIGNhbGNNYXggPSBjYWxjTWF4IC8gMjtcbiAgICB9XG4gICAgY29uc3QgeFNjYWxlU2Vjb25kYXJ5ID0gc2NhbGVMaW5lYXIoXG4gICAgICBbMCwgY2FsY01heCAqICh4U2NhbGVEb21haW5NYXggLyB4U2NhbGVUaWNrTWF4KV0sXG4gICAgICBzY2FsZVJhbmdlLFxuICAgICk7XG5cbiAgICBjb25zdCB4VGlja3M6IFhUaWNrW10gPSB4U2NhbGUudGlja3ModGlja0NvdW50KS5tYXAodGljayA9PiAoe1xuICAgICAgeDogeFNjYWxlKHRpY2spLFxuICAgICAgbGFiZWw6IHBpcGUudHJhbnNmb3JtKHRpY2spLFxuICAgICAgc2Vjb25kYXJ5TGFiZWw6IHNlY29uZGFyeVBpcGUudHJhbnNmb3JtKFxuICAgICAgICB4U2NhbGVTZWNvbmRhcnkuaW52ZXJ0KHhTY2FsZSh0aWNrKSksXG4gICAgICApLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IHNjYWxlID0gKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKTogbnVtYmVyID0+IHtcbiAgICAgIGlmIChpc1NlY29uZGFyeSkge1xuICAgICAgICByZXR1cm4geFNjYWxlU2Vjb25kYXJ5KGlucHV0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4U2NhbGUoaW5wdXQpO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIHhTY2FsZSxcbiAgICAgIHhTY2FsZVNlY29uZGFyeSxcbiAgICAgIHNjYWxlLFxuICAgICAgeFRpY2tzLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjb252ZXJ0RGF0YVRvSnVzdE9uZVZhbHVlVHlwZShcbiAgICBkYXRhOiBEYXRhLFxuICAgIGlzU2Vjb25kYXJ5OiBib29sZWFuLFxuICApOiBEYXRhIHtcbiAgICBjb25zdCBuZXdEYXRhOiBEYXRhID0geyAuLi5kYXRhLCB5czogW10gfTtcbiAgICBkYXRhLnlzLmZvckVhY2goKHksIHlJbmRleCkgPT4ge1xuICAgICAgbmV3RGF0YS55cy5wdXNoKHsgLi4ueSwgdmFsdWVzOiBbXSB9KTtcbiAgICAgIHkudmFsdWVzLmZvckVhY2goKF8sIHhJbmRleCkgPT4ge1xuICAgICAgICBpZiAoY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIHhJbmRleCkgIT0gaXNTZWNvbmRhcnkpIHtcbiAgICAgICAgICBuZXdEYXRhLnlzW3lJbmRleF0udmFsdWVzLnB1c2goMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3RGF0YS55c1t5SW5kZXhdLnZhbHVlcy5wdXNoKGRhdGEueXNbeUluZGV4XS52YWx1ZXNbeEluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdEYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE5lYXJlc3RJbmRleCh2YWx1ZXM6IG51bWJlcltdLCBpbnB1dDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKG5lYXJlc3RJbmRleCwgdmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5hYnModmFsdWUgLSBpbnB1dCkgPCBNYXRoLmFicyh2YWx1ZXNbbmVhcmVzdEluZGV4XSAtIGlucHV0KVxuICAgICAgICA/IGluZGV4XG4gICAgICAgIDogbmVhcmVzdEluZGV4O1xuICAgIH0sIDApO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE5lYXJlc3RJbmRleFdpdGhTZWNvbmRhcnkoXG4gICAgeUluZm86IHsgdmFsdWU6IG51bWJlcjsgaXNTZWNvbmRhcnk6IGJvb2xlYW4gfVtdLFxuICAgIHlQb3M6IG51bWJlcixcbiAgICBzY2FsZTogKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBudW1iZXIsXG4gICkge1xuICAgIGxldCBmb3VuZEluZGV4ID0gMDtcbiAgICBsZXQgY3Vyck1pbkRpc3RhbmNlID0gTWF0aC5hYnMoXG4gICAgICBzY2FsZSh5SW5mb1swXS52YWx1ZSwgeUluZm9bMF0uaXNTZWNvbmRhcnkpIC0geVBvcyxcbiAgICApO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgeUluZm8ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5ld0Rpc3RhbmNlID0gTWF0aC5hYnMoXG4gICAgICAgIHNjYWxlKHlJbmZvW2ldLnZhbHVlLCB5SW5mb1tpXS5pc1NlY29uZGFyeSkgLSB5UG9zLFxuICAgICAgKTtcbiAgICAgIGlmIChuZXdEaXN0YW5jZSA8IGN1cnJNaW5EaXN0YW5jZSkge1xuICAgICAgICBmb3VuZEluZGV4ID0gaTtcbiAgICAgICAgY3Vyck1pbkRpc3RhbmNlID0gbmV3RGlzdGFuY2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3VuZEluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZE5lYXJlc3RJbmRleFN0cmluZyh2YWx1ZXM6IHVua25vd25bXSwgaW5wdXQ6IG51bWJlcikge1xuICAgIGNvbnN0IG51bVZhbHVlcyA9IHZhbHVlcy5tYXAoKF8sIGkpID0+IGkpO1xuICAgIHJldHVybiBudW1WYWx1ZXMucmVkdWNlKChuZWFyZXN0SW5kZXgsIHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKHZhbHVlIC0gaW5wdXQpIDwgTWF0aC5hYnMobnVtVmFsdWVzW25lYXJlc3RJbmRleF0gLSBpbnB1dClcbiAgICAgICAgPyBpbmRleFxuICAgICAgICA6IG5lYXJlc3RJbmRleDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRTdWJJbmRleChcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGlucHV0OiBudW1iZXIsXG4gICAgYmluU2l6ZTogbnVtYmVyLFxuICAgIHN1YkJpbkNvdW50OiBudW1iZXIsXG4gICkge1xuICAgIGNvbnN0IHN1YkJpblNpemUgPVxuICAgICAgKGJpblNpemUgLSAoc3ViQmluQ291bnQgLSAxKSAqIFNNQUxMX1BBRERJTkcpIC8gc3ViQmluQ291bnQ7XG4gICAgY29uc3QgY2VudGVySW5kZXggPSBzdWJCaW5Db3VudCAvIDIgLSAwLjU7XG4gICAgbGV0IGNsb3Nlc3RJbmRleCA9IDA7XG4gICAgbGV0IGNsb3NlbmVzc1ZhbCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViQmluQ291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gKGkgLSBjZW50ZXJJbmRleCkgKiAoc3ViQmluU2l6ZSArIFNNQUxMX1BBRERJTkcpO1xuICAgICAgY29uc3Qgc3ViQmluUG9zID0gdmFsdWUgKyBvZmZzZXQ7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hdGguYWJzKGlucHV0IC0gc3ViQmluUG9zKTtcbiAgICAgIGlmIChjbG9zZW5lc3NWYWwgPCAwIHx8IGNsb3NlbmVzc1ZhbCA+IGRpc3RhbmNlKSB7XG4gICAgICAgIGNsb3Nlc3RJbmRleCA9IGk7XG4gICAgICAgIGNsb3NlbmVzc1ZhbCA9IGRpc3RhbmNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY2xvc2VzdEluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZFN1YkluZGV4SG9yaXpvbnRhbChcbiAgICB2YWx1ZTogbnVtYmVyLFxuICAgIGlucHV0OiBudW1iZXIsXG4gICAgc3ViQmluQ291bnQ6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgY2VudGVySW5kZXggPSBzdWJCaW5Db3VudCAvIDIgLSAwLjU7XG4gICAgbGV0IGNsb3Nlc3RJbmRleCA9IDA7XG4gICAgbGV0IGNsb3NlbmVzc1ZhbCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViQmluQ291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgb2Zmc2V0ID1cbiAgICAgICAgKGkgLSBjZW50ZXJJbmRleCkgKiAoSE9SSVpPTlRBTF9CQVJfSEVJR0hUICsgU01BTExfUEFERElORyk7XG4gICAgICBjb25zdCBzdWJCaW5Qb3MgPSB2YWx1ZSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5hYnMoaW5wdXQgLSBzdWJCaW5Qb3MpO1xuICAgICAgaWYgKGNsb3NlbmVzc1ZhbCA8IDAgfHwgY2xvc2VuZXNzVmFsID4gZGlzdGFuY2UpIHtcbiAgICAgICAgY2xvc2VzdEluZGV4ID0gaTtcbiAgICAgICAgY2xvc2VuZXNzVmFsID0gZGlzdGFuY2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjbG9zZXN0SW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCYXJZSW5mbyhcbiAgICBkYXRhOiBEYXRhLFxuICAgIHlJbmRleDogbnVtYmVyLFxuICAgIHhJbmRleDogbnVtYmVyLFxuICAgIHNjYWxlOiAoaW5wdXQ6IG51bWJlciwgaXNTZWNvbmRhcnk6IGJvb2xlYW4gfCB1bmRlZmluZWQpID0+IG51bWJlcixcbiAgICBpc1N0YWNrZWQ6IGJvb2xlYW4sXG4gICAgaXNTdXBwbGVtZW50YXJ5OiBib29sZWFuID0gZmFsc2UsXG4gICk6IHsgeVZhbHVlOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHplcm9WYWwgPSBzY2FsZSgwLCB0cnVlKTtcbiAgICBjb25zdCB5RGF0YSA9IGdldE1haW5PclN1cHBZKGRhdGEsIHlJbmRleCwgaXNTdXBwbGVtZW50YXJ5KTtcbiAgICBjb25zdCBzY2FsZVZhbHVlID0gc2NhbGUoXG4gICAgICB5RGF0YS52YWx1ZXNbeEluZGV4XSxcbiAgICAgIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgeUluZGV4LCB4SW5kZXgsIGlzU3VwcGxlbWVudGFyeSksXG4gICAgKTtcbiAgICBpZiAoc2NhbGVWYWx1ZSA+IHplcm9WYWwpIHtcbiAgICAgIGxldCBwcmV2QmFySGVpZ2h0cyA9IDA7XG4gICAgICBpZiAoaXNTdGFja2VkKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeUluZGV4OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjaGVja0RhdGEgPSBnZXRNYWluT3JTdXBwWShkYXRhLCBpLCBpc1N1cHBsZW1lbnRhcnkpO1xuICAgICAgICAgIC8vQm90aCB5RGF0YSBhbmQgY2hlY2tEYXRhIGFyZSBkZWZpbml0ZWx5IFN1cHBsZW1lbnRhcnlEYXRhWXMgaWYgaXNTdXBwbGVtZW50YXJ5IGlzIHRydWUsIGJ1dCB0aGV5IGRvbid0IHJlYWxpemUgaXRcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1N1cHBsZW1lbnRhcnkgJiZcbiAgICAgICAgICAgICdzdXBwbGVtZW50YWxJbmRleCcgaW4geURhdGEgJiZcbiAgICAgICAgICAgICdzdXBwbGVtZW50YWxJbmRleCcgaW4gY2hlY2tEYXRhXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoeURhdGEuc3VwcGxlbWVudGFsSW5kZXggIT0gY2hlY2tEYXRhLnN1cHBsZW1lbnRhbEluZGV4KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjaGVja1ZhbHVlID0gc2NhbGUoXG4gICAgICAgICAgICBjaGVja0RhdGEudmFsdWVzW3hJbmRleF0sXG4gICAgICAgICAgICBjaGVja0lmU2Vjb25kYXJ5KGRhdGEsIGksIHhJbmRleCwgaXNTdXBwbGVtZW50YXJ5KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vU2tpcCBwb3NpdGl2ZSB2YWx1ZXNcbiAgICAgICAgICBpZiAoY2hlY2tWYWx1ZSA8IHplcm9WYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmV2QmFySGVpZ2h0cyA9IHByZXZCYXJIZWlnaHRzICsgY2hlY2tWYWx1ZSAtIHplcm9WYWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHlWYWx1ZSA9IHplcm9WYWwgKyBwcmV2QmFySGVpZ2h0cztcbiAgICAgIGNvbnN0IGhlaWdodCA9IHNjYWxlVmFsdWUgLSB5VmFsdWUgKyBwcmV2QmFySGVpZ2h0cztcbiAgICAgIHJldHVybiB7IHlWYWx1ZSwgaGVpZ2h0IH07XG4gICAgfVxuICAgIGxldCBwcmV2QmFySGVpZ2h0cyA9IDA7XG4gICAgaWYgKGlzU3RhY2tlZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB5SW5kZXg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGVja0RhdGEgPSBnZXRNYWluT3JTdXBwWShkYXRhLCBpLCBpc1N1cHBsZW1lbnRhcnkpO1xuICAgICAgICAvL0JvdGggeURhdGEgYW5kIGNoZWNrRGF0YSBhcmUgZGVmaW5pdGVseSBTdXBwbGVtZW50YXJ5RGF0YVlzIGlmIGlzU3VwcGxlbWVudGFyeSBpcyB0cnVlLCBidXQgdGhleSBkb24ndCByZWFsaXplIGl0XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc1N1cHBsZW1lbnRhcnkgJiZcbiAgICAgICAgICAnc3VwcGxlbWVudGFsSW5kZXgnIGluIHlEYXRhICYmXG4gICAgICAgICAgJ3N1cHBsZW1lbnRhbEluZGV4JyBpbiBjaGVja0RhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHlEYXRhLnN1cHBsZW1lbnRhbEluZGV4ICE9IGNoZWNrRGF0YS5zdXBwbGVtZW50YWxJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrVmFsdWUgPSBzY2FsZShcbiAgICAgICAgICBjaGVja0RhdGEudmFsdWVzW3hJbmRleF0sXG4gICAgICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCBpLCB4SW5kZXgsIGlzU3VwcGxlbWVudGFyeSksXG4gICAgICAgICk7XG4gICAgICAgIC8vU2tpcCBuZWdhdGl2ZSB2YWx1ZXNcbiAgICAgICAgaWYgKGNoZWNrVmFsdWUgPiB6ZXJvVmFsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldkJhcllWYWwgPSBjaGVja1ZhbHVlIC0gcHJldkJhckhlaWdodHM7XG4gICAgICAgIHByZXZCYXJIZWlnaHRzID0gemVyb1ZhbCAtIHByZXZCYXJZVmFsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB5VmFsdWUgPSBzY2FsZVZhbHVlIC0gcHJldkJhckhlaWdodHM7XG4gICAgY29uc3QgaGVpZ2h0ID0gemVyb1ZhbCAtIHlWYWx1ZSAtIHByZXZCYXJIZWlnaHRzO1xuICAgIHJldHVybiB7IHlWYWx1ZSwgaGVpZ2h0IH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTdXBwQmFyWUluZm9WaWFZSW5kZXgoXG4gICAgZGF0YTogRGF0YSxcbiAgICB5SW5kZXg6IG51bWJlcixcbiAgICBzdXBwSW5kZXg6IG51bWJlcixcbiAgICB4SW5kZXg6IG51bWJlcixcbiAgICBzY2FsZTogKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBudW1iZXIsXG4gICAgaXNTdGFja2VkOiBib29sZWFuLFxuICApOiB7IHlWYWx1ZTogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBzdXBwWXMgPSBkYXRhLnN1cHBsZW1lbnRhcnlZcztcbiAgICBpZiAoIXN1cHBZcyB8fCBzdXBwWXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB7IHlWYWx1ZTogMCwgaGVpZ2h0OiAwIH07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3VwcFlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHN1cHBZc1tpXS5hc3NvY2lhdGVkWUluZGV4ID09IHlJbmRleCAmJlxuICAgICAgICBzdXBwWXNbaV0uc3VwcGxlbWVudGFsSW5kZXggPT0gc3VwcEluZGV4XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGdldEJhcllJbmZvKGRhdGEsIGksIHhJbmRleCwgc2NhbGUsIGlzU3RhY2tlZCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IHlWYWx1ZTogMCwgaGVpZ2h0OiAwIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNYWluT3JTdXBwWShcbiAgICBkYXRhOiBEYXRhLFxuICAgIHlJbmRleDogbnVtYmVyLFxuICAgIGlzU3VwcGxlbWVudGFyeTogYm9vbGVhbixcbiAgKTogRGF0YVkgfCBTdXBwbGVtZW50YXJ5RGF0YVkge1xuICAgIGNvbnN0IHN1cHBZcyA9IGRhdGEuc3VwcGxlbWVudGFyeVlzO1xuICAgIGlmIChzdXBwWXMgJiYgaXNTdXBwbGVtZW50YXJ5KSB7XG4gICAgICByZXR1cm4gc3VwcFlzW3lJbmRleF07XG4gICAgfVxuICAgIHJldHVybiBkYXRhLnlzW3lJbmRleF07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCYXJYSW5mbyhcbiAgICBkYXRhOiBEYXRhLFxuICAgIHlJbmRleDogbnVtYmVyLFxuICAgIHhJbmRleDogbnVtYmVyLFxuICAgIHNjYWxlOiAoaW5wdXQ6IG51bWJlciwgaXNTZWNvbmRhcnk6IGJvb2xlYW4gfCB1bmRlZmluZWQpID0+IG51bWJlcixcbiAgICBpc1N0YWNrZWQ6IGJvb2xlYW4sXG4gICAgaXNTdXBwbGVtZW50YXJ5OiBib29sZWFuID0gZmFsc2UsXG4gICk6IHsgeFZhbHVlOiBudW1iZXI7IHdpZHRoOiBudW1iZXIgfSB7XG4gICAgY29uc3QgemVyb1ZhbCA9IHNjYWxlKDAsIHRydWUpO1xuICAgIGNvbnN0IHlEYXRhID0gZ2V0TWFpbk9yU3VwcFkoZGF0YSwgeUluZGV4LCBpc1N1cHBsZW1lbnRhcnkpO1xuICAgIGNvbnN0IHNjYWxlVmFsdWUgPSBzY2FsZShcbiAgICAgIHlEYXRhLnZhbHVlc1t4SW5kZXhdLFxuICAgICAgY2hlY2tJZlNlY29uZGFyeShkYXRhLCB5SW5kZXgsIHhJbmRleCwgaXNTdXBwbGVtZW50YXJ5KSxcbiAgICApO1xuICAgIGlmIChzY2FsZVZhbHVlIDwgemVyb1ZhbCkge1xuICAgICAgbGV0IHByZXZCYXJXaWR0aHMgPSAwO1xuICAgICAgaWYgKGlzU3RhY2tlZCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHlJbmRleDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2hlY2tEYXRhID0gZ2V0TWFpbk9yU3VwcFkoZGF0YSwgaSwgaXNTdXBwbGVtZW50YXJ5KTtcbiAgICAgICAgICAvL0JvdGggeURhdGEgYW5kIGNoZWNrRGF0YSBhcmUgZGVmaW5pdGVseSBTdXBwbGVtZW50YXJ5RGF0YVlzIGlmIGlzU3VwcGxlbWVudGFyeSBpcyB0cnVlLCBidXQgdGhleSBkb24ndCByZWFsaXplIGl0XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNTdXBwbGVtZW50YXJ5ICYmXG4gICAgICAgICAgICAnc3VwcGxlbWVudGFsSW5kZXgnIGluIHlEYXRhICYmXG4gICAgICAgICAgICAnc3VwcGxlbWVudGFsSW5kZXgnIGluIGNoZWNrRGF0YVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHlEYXRhLnN1cHBsZW1lbnRhbEluZGV4ICE9IGNoZWNrRGF0YS5zdXBwbGVtZW50YWxJbmRleCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY2hlY2tWYWwgPSBzY2FsZShcbiAgICAgICAgICAgIGNoZWNrRGF0YS52YWx1ZXNbeEluZGV4XSxcbiAgICAgICAgICAgIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgaSwgeEluZGV4LCBpc1N1cHBsZW1lbnRhcnkpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9Ta2lwIHBvc2l0aXZlIHZhbHVlc1xuICAgICAgICAgIGlmIChjaGVja1ZhbCA+IHplcm9WYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmV2QmFyV2lkdGhzICs9IHplcm9WYWwgLSBjaGVja1ZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeFZhbHVlID0gc2NhbGVWYWx1ZSAtIHByZXZCYXJXaWR0aHM7XG4gICAgICBjb25zdCB3aWR0aCA9IHplcm9WYWwgLSBzY2FsZVZhbHVlO1xuICAgICAgcmV0dXJuIHsgeFZhbHVlLCB3aWR0aCB9O1xuICAgIH1cbiAgICBsZXQgcHJldkJhcldpZHRocyA9IDA7XG4gICAgaWYgKGlzU3RhY2tlZCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB5SW5kZXg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGVja0RhdGEgPSBnZXRNYWluT3JTdXBwWShkYXRhLCBpLCBpc1N1cHBsZW1lbnRhcnkpO1xuICAgICAgICAvL0JvdGggeURhdGEgYW5kIGNoZWNrRGF0YSBhcmUgZGVmaW5pdGVseSBTdXBwbGVtZW50YXJ5RGF0YVlzIGlmIGlzU3VwcGxlbWVudGFyeSBpcyB0cnVlLCBidXQgdGhleSBkb24ndCByZWFsaXplIGl0XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc1N1cHBsZW1lbnRhcnkgJiZcbiAgICAgICAgICAnc3VwcGxlbWVudGFsSW5kZXgnIGluIHlEYXRhICYmXG4gICAgICAgICAgJ3N1cHBsZW1lbnRhbEluZGV4JyBpbiBjaGVja0RhdGFcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHlEYXRhLnN1cHBsZW1lbnRhbEluZGV4ICE9IGNoZWNrRGF0YS5zdXBwbGVtZW50YWxJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoZWNrVmFsID0gc2NhbGUoXG4gICAgICAgICAgY2hlY2tEYXRhLnZhbHVlc1t4SW5kZXhdLFxuICAgICAgICAgIGNoZWNrSWZTZWNvbmRhcnkoZGF0YSwgaSwgeEluZGV4LCBpc1N1cHBsZW1lbnRhcnkpLFxuICAgICAgICApO1xuICAgICAgICAvL1NraXAgbmVnYXRpdmUgdmFsdWVzXG4gICAgICAgIGlmIChjaGVja1ZhbCA8IHplcm9WYWwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2QmFyV2lkdGhzICs9IGNoZWNrVmFsIC0gemVyb1ZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgeFZhbHVlID0gcHJldkJhcldpZHRocyArIHplcm9WYWw7XG4gICAgY29uc3Qgd2lkdGggPSBzY2FsZVZhbHVlIC0gemVyb1ZhbDtcbiAgICByZXR1cm4geyB4VmFsdWUsIHdpZHRoIH07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTdXBwQmFyWEluZm9WaWFZSW5kZXgoXG4gICAgZGF0YTogRGF0YSxcbiAgICB5SW5kZXg6IG51bWJlcixcbiAgICBzdXBwSW5kZXg6IG51bWJlcixcbiAgICB4SW5kZXg6IG51bWJlcixcbiAgICBzY2FsZTogKGlucHV0OiBudW1iZXIsIGlzU2Vjb25kYXJ5OiBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiBudW1iZXIsXG4gICAgaXNTdGFja2VkOiBib29sZWFuLFxuICApOiB7IHhWYWx1ZTogbnVtYmVyOyB3aWR0aDogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHN1cHBZcyA9IGRhdGEuc3VwcGxlbWVudGFyeVlzO1xuICAgIGlmICghc3VwcFlzIHx8IHN1cHBZcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHsgeFZhbHVlOiAwLCB3aWR0aDogMCB9O1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1cHBZcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKFxuICAgICAgICBzdXBwWXNbaV0uYXNzb2NpYXRlZFlJbmRleCA9PSB5SW5kZXggJiZcbiAgICAgICAgc3VwcFlzW2ldLnN1cHBsZW1lbnRhbEluZGV4ID09IHN1cHBJbmRleFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBnZXRCYXJYSW5mbyhkYXRhLCBpLCB4SW5kZXgsIHNjYWxlLCBpc1N0YWNrZWQsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB4VmFsdWU6IDAsIHdpZHRoOiAwIH07XG4gIH1cblxuICBmdW5jdGlvbiBjaGVja0lmU2Vjb25kYXJ5KFxuICAgIGRhdGE6IERhdGEsXG4gICAgeUluZGV4OiBudW1iZXIsXG4gICAgeEluZGV4OiBudW1iZXIsXG4gICAgaXNTdXBwbGVtZW50YXJ5OiBib29sZWFuID0gZmFsc2UsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChkYXRhLnR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICBpZiAoZGF0YS54W3hJbmRleF0uaXNTZWNvbmRhcnkgPT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldE1haW5PclN1cHBZKGRhdGEsIHlJbmRleCwgaXNTdXBwbGVtZW50YXJ5KS5pc1NlY29uZGFyeSA9PSB0cnVlO1xuICB9XG5cbiAgLy8gc3RhY2sgcmV0dXJucyBhIG5ldyBkYXRhIHdoZXJlIGVhY2ggc2V0IG9mIHlWYWx1ZXMgaXMgc3RhY2tlZFxuICAvLyBvbiB0b3Agb2YgdGhlIHByZXZpb3VzLlxuICBmdW5jdGlvbiBzdGFjayhkYXRhOiBEYXRhKTogRGF0YSB7XG4gICAgY29uc3Qgc3RhY2tlZDogRGF0YSA9IHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB5czogZGF0YS55cy5tYXAoeSA9PiAoe1xuICAgICAgICBsYWJlbDogeS5sYWJlbCxcbiAgICAgICAgdmFsdWVzOiBbXSxcbiAgICAgICAgaXNTZWNvbmRhcnk6IHkuaXNTZWNvbmRhcnksXG4gICAgICB9KSksXG4gICAgfTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEueC5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHBvc0Zyb20gPSAwO1xuICAgICAgbGV0IG5lZ0Zyb20gPSAwO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkYXRhLnlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZVZhbCA9IGRhdGEueXNbal0udmFsdWVzW2ldO1xuICAgICAgICBpZiAoc291cmNlVmFsIDwgMCkge1xuICAgICAgICAgIGNvbnN0IHRvID0gbmVnRnJvbSArIHNvdXJjZVZhbDtcbiAgICAgICAgICBzdGFja2VkLnlzW2pdLnZhbHVlcy5wdXNoKHRvKTtcbiAgICAgICAgICBuZWdGcm9tID0gdG87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgdG8gPSBwb3NGcm9tICsgc291cmNlVmFsO1xuICAgICAgICAgIHN0YWNrZWQueXNbal0udmFsdWVzLnB1c2godG8pO1xuICAgICAgICAgIHBvc0Zyb20gPSB0bztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhY2tlZDtcbiAgfVxuXG4gIC8vIGhpZGUgc3RyaXBzIG91dCBoaWRkZW4geSB2YWx1ZXMgd2hpbGUgcmV0YWluaW5nIHRoZSBvcmlnaW5hbCBpbmRpY2VzXG4gIC8vIGZvciB0aGUgcmVtYWluaW5nIHZpc2libGUgdmFsdWVzXG4gIGZ1bmN0aW9uIGhpZGUoZGF0YTogRGF0YSk6IHsgZGF0YTogRGF0YTsgdmlzaWJsZUluZGljZXM6IG51bWJlcltdIH0ge1xuICAgIGNvbnN0IHZpc2libGVJbmRpY2VzID0gZGF0YS55c1xuICAgICAgLm1hcCgoeSwgaSkgPT4gKHsgeSwgaSB9KSlcbiAgICAgIC5maWx0ZXIoKHsgeSB9KSA9PiAheS5oaWRkZW4pXG4gICAgICAubWFwKCh7IGkgfSkgPT4gaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHsgLi4uZGF0YSwgeXM6IHZpc2libGVJbmRpY2VzLm1hcChpID0+IGRhdGEueXNbaV0pIH0sXG4gICAgICB2aXNpYmxlSW5kaWNlcyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd2F0ZXJmYWxsVHJhbnNmb3JtKGRhdGE6IExhYmVsZWREYXRhKTogTGFiZWxlZERhdGEge1xuICAgIGNvbnN0IG5ld0RhdGEgPSB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgeDogWy4uLmRhdGEueCwgeyBsYWJlbDogJ1RvdGFsJyB9XSxcbiAgICAgIHlzOiBbXG4gICAgICAgIC4uLmRhdGEueXMubWFwKHkgPT4gKHtcbiAgICAgICAgICAuLi55LFxuICAgICAgICAgIHZhbHVlczogWy4uLnkudmFsdWVzLCB5LnZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKV0sXG4gICAgICAgIH0pKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgICByZXR1cm4gbmV3RGF0YTtcbiAgfVxuXG4gIHR5cGUgVmFsdWVUeXBlID0gJ2NvdW50JyB8ICdjdXJyZW5jeScgfCAncGVyY2VudGFnZScgfCAnZGF5cyc7XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFBpcGVzKHZhbHVlVHlwZTogVmFsdWVUeXBlKSB7XG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ2NvdW50Jzoge1xuICAgICAgICBjb25zdCBwaXBlID0gbmV3IE51bWJlclBpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwaXBlOiBuZXcgU21hbGxDdXJyZW5jeVBpcGUoKSxcbiAgICAgICAgICBmdWxsUGlwZTogbmV3IEN1cnJlbmN5UGlwZSgnZW4tdXMnKSxcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOiB7XG4gICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgUGVyY2VudGFnZVBpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2RheXMnOiB7XG4gICAgICAgIGNvbnN0IHBpcGUgPSBuZXcgRGF5c1BpcGUoKTtcbiAgICAgICAgcmV0dXJuIHsgcGlwZSwgZnVsbFBpcGU6IHBpcGUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBvcnQgY29uc3QgaW50ZXJ2YWxzID0gWyd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgSW50ZXJ2YWwgPSAodHlwZW9mIGludGVydmFscylbbnVtYmVyXTtcblxuICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0ZWREYXRlKGRhdGVGb3JtYXQ6IEludGVydmFsLCBkYXRlOiBEYXRlKSB7XG4gICAgaWYgKGRhdGVGb3JtYXQgPT0gJ3F1YXJ0ZXInKSB7XG4gICAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSAvIDMpO1xuICAgICAgY29uc3QgeWVhciA9IHV0Y0Zvcm1hdChnZXRUaW1lSW50ZXJ2YWxGb3JtYXQoJ3llYXInKSkoZGF0ZSk7XG4gICAgICByZXR1cm4gYFEke3F1YXJ0ZXJ9ICR7eWVhcn1gO1xuICAgIH1cbiAgICBjb25zdCBmb3JtYXQgPSBnZXRUaW1lSW50ZXJ2YWxGb3JtYXQoZGF0ZUZvcm1hdCk7XG4gICAgcmV0dXJuIHV0Y0Zvcm1hdChmb3JtYXQpKGRhdGUpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVJbnRlcnZhbEZvcm1hdChpbnRlcnZhbDogSW50ZXJ2YWwpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoaW50ZXJ2YWwpIHtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgcmV0dXJuICclbS8lZC8lWSc7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuICclYiAlWSc7XG4gICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgcmV0dXJuICclWSc7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFydERhdGFUb0RvbnV0RGF0YShjaGFydERhdGE6IERhdGEpOiBEb251dERhdGFbXSB7XG4gICAgaWYgKGNoYXJ0RGF0YS55cy5maW5kKHkgPT4geS52YWx1ZXMubGVuZ3RoID4gMSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiSGVhZHMgdXAhIFBpZSBjaGFydHMgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSB2YWx1ZXMgcGVyIHNlcmllc1wiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkb251dERhdGEgPSBjaGFydERhdGEueXMubWFwKHkgPT4gKHtcbiAgICAgIGxhYmVsOiB5LmxhYmVsLFxuICAgICAgaGlkZGVuOiB5LmhpZGRlbixcbiAgICAgIHZhbHVlOiB5LnZhbHVlcy5sZW5ndGggPj0gMSA/IHkudmFsdWVzWzBdIDogMCxcbiAgICAgIGlzU2Vjb25kYXJ5OiB5LmlzU2Vjb25kYXJ5LFxuICAgIH0pKTtcbiAgICByZXR1cm4gZG9udXREYXRhO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tZU2NhbGVUeXBlKFxuICAgIGlucHV0OlxuICAgICAgfCBTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXIsIG5ldmVyPlxuICAgICAgfCBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlciwgbmV2ZXI+LFxuICAgIGRhdGFUeXBlOiAnbGFiZWxlZCcgfCAndGltZXNlcmllcycgfCB1bmRlZmluZWQsXG4gICk6IGlucHV0IGlzIFNjYWxlVGltZTxudW1iZXIsIG51bWJlciwgbmV2ZXI+IHtcbiAgICBpZiAoZGF0YVR5cGUgPT0gJ2xhYmVsZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gYXJjVG9Qb2ludChhbmdsZTogbnVtYmVyLCByYWRpdXM6IG51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICB4OiByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZSAtIE1hdGguUEkgLyAyKSxcbiAgICAgIHk6IHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlIC0gTWF0aC5QSSAvIDIpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==