@tolle_/tolle-ui 18.2.30 → 18.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/esm2022/lib/alert-dialog-dynamic.component.mjs +8 -3
  2. package/esm2022/lib/alert-dialog.component.mjs +39 -6
  3. package/esm2022/lib/alert-dialog.service.mjs +38 -6
  4. package/esm2022/lib/bar-list.component.mjs +95 -0
  5. package/esm2022/lib/category-bar.component.mjs +130 -0
  6. package/esm2022/lib/chart-spark.component.mjs +120 -0
  7. package/esm2022/lib/chart.component.mjs +131 -45
  8. package/esm2022/lib/chart.service.mjs +33 -8
  9. package/esm2022/lib/context-menu.service.mjs +11 -7
  10. package/esm2022/lib/modal-ref.mjs +36 -7
  11. package/esm2022/lib/modal.component.mjs +42 -28
  12. package/esm2022/lib/modal.mjs +2 -29
  13. package/esm2022/lib/modal.service.mjs +26 -4
  14. package/esm2022/lib/progress-circle.component.mjs +138 -0
  15. package/esm2022/lib/resizable-panel.component.mjs +5 -5
  16. package/esm2022/lib/segment.component.mjs +3 -3
  17. package/esm2022/lib/tracker.component.mjs +84 -0
  18. package/esm2022/public-api.mjs +6 -1
  19. package/fesm2022/tolle-ui.mjs +900 -139
  20. package/fesm2022/tolle-ui.mjs.map +1 -1
  21. package/lib/alert-dialog-dynamic.component.d.ts +5 -0
  22. package/lib/alert-dialog.component.d.ts +13 -0
  23. package/lib/bar-list.component.d.ts +39 -0
  24. package/lib/category-bar.component.d.ts +49 -0
  25. package/lib/chart-spark.component.d.ts +49 -0
  26. package/lib/chart.component.d.ts +68 -9
  27. package/lib/chart.service.d.ts +25 -5
  28. package/lib/modal-ref.d.ts +6 -1
  29. package/lib/modal.component.d.ts +7 -4
  30. package/lib/modal.d.ts +9 -3
  31. package/lib/progress-circle.component.d.ts +35 -0
  32. package/lib/tracker.component.d.ts +39 -0
  33. package/package.json +3 -2
  34. package/preset.js +7 -1
  35. package/public-api.d.ts +5 -0
  36. package/registry/docs-content.json +330 -2
  37. package/registry/llms-full.txt +98 -2
  38. package/registry/llms.txt +5 -0
  39. package/registry/manifest.json +380 -3
  40. package/registry/r/alert-dialog-dynamic.json +1 -1
  41. package/registry/r/alert-dialog.json +1 -1
  42. package/registry/r/bar-list.json +21 -0
  43. package/registry/r/category-bar.json +21 -0
  44. package/registry/r/chart-pie.json +1 -1
  45. package/registry/r/chart-spark.json +30 -0
  46. package/registry/r/chart.json +2 -2
  47. package/registry/r/context-menu-trigger.json +1 -1
  48. package/registry/r/context-menu.json +1 -1
  49. package/registry/r/modal.json +3 -3
  50. package/registry/r/progress-circle.json +21 -0
  51. package/registry/r/resizable-panel.json +1 -1
  52. package/registry/r/segment.json +1 -1
  53. package/registry/r/tracker.json +25 -0
  54. package/registry/registry.json +112 -0
  55. package/theme.css +15 -3
@@ -433,6 +433,11 @@ export class ChartComponent {
433
433
  description = '';
434
434
  /** Stacks marks on a shared baseline instead of grouping them. @default false */
435
435
  stacked = false;
436
+ /**
437
+ * Which physical axis carries the category vs the value. Only bars support
438
+ * 'horizontal' — line/area marks stay vertical regardless. @default 'vertical'
439
+ */
440
+ orientation = 'vertical';
436
441
  /** Renders the crosshair, hit layer and shared tooltip. @default true */
437
442
  hover = true;
438
443
  /** Shows the data table instead of leaving it visually hidden. @default false */
@@ -505,6 +510,7 @@ export class ChartComponent {
505
510
  series: this.series ?? [],
506
511
  xKey: this.xKey,
507
512
  stacked: this.stacked,
513
+ orientation: this.orientation,
508
514
  height: this.height,
509
515
  margin: this.margin,
510
516
  width: this.chart.width || ChartComponent.fallbackWidth,
@@ -516,11 +522,19 @@ export class ChartComponent {
516
522
  /**
517
523
  * One catchment rect per x position, deliberately wider than the marks it
518
524
  * covers — readers aim at a category, never at a 2px line or an 8px dot.
525
+ * Spans the full plot in the cross direction: full height in a vertical
526
+ * chart, full width in a horizontal one.
519
527
  */
520
- get hitBands() {
528
+ get hitRects() {
521
529
  if (!this.hover)
522
530
  return [];
523
- return this.data.map((_, i) => this.chart.hitBandFor(i));
531
+ const horizontal = this.chart.orientation === 'horizontal';
532
+ return this.data.map((_, i) => {
533
+ const band = this.chart.hitBandFor(i);
534
+ return horizontal
535
+ ? { x: this.chart.plotLeft, y: band.start, width: this.chart.plotWidth, height: band.width }
536
+ : { x: band.start, y: this.chart.plotTop, width: band.width, height: this.chart.plotHeight };
537
+ });
524
538
  }
525
539
  onEnterBand(index) {
526
540
  this.chart.setActiveIndex(index);
@@ -532,7 +546,7 @@ export class ChartComponent {
532
546
  return cn(chartVariants({ variant: this.variant, density: this.density }), this.class);
533
547
  }
534
548
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
535
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartComponent, isStandalone: true, selector: "tolle-chart", inputs: { data: "data", series: "series", xKey: "xKey", height: "height", margin: "margin", ariaLabel: "ariaLabel", description: "description", stacked: "stacked", hover: "hover", showTable: "showTable", xHeader: "xHeader", variant: "variant", density: "density", class: "class" }, outputs: { activeIndexChange: "activeIndexChange" }, providers: [ChartService], viewQueries: [{ propertyName: "plotRef", first: true, predicate: ["plot"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
549
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartComponent, isStandalone: true, selector: "tolle-chart", inputs: { data: "data", series: "series", xKey: "xKey", height: "height", margin: "margin", ariaLabel: "ariaLabel", description: "description", stacked: "stacked", orientation: "orientation", hover: "hover", showTable: "showTable", xHeader: "xHeader", variant: "variant", density: "density", class: "class" }, outputs: { activeIndexChange: "activeIndexChange" }, providers: [ChartService], viewQueries: [{ propertyName: "plotRef", first: true, predicate: ["plot"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
536
550
  <div [class]="computedClass">
537
551
  <div class="relative w-full" #plot>
538
552
  <svg
@@ -563,11 +577,11 @@ export class ChartComponent {
563
577
  ></svg:line>
564
578
 
565
579
  <svg:rect
566
- *ngFor="let band of hitBands; let i = index; trackBy: trackByIndex"
567
- [attr.x]="band.start"
568
- [attr.y]="chart.plotTop"
569
- [attr.width]="band.width"
570
- [attr.height]="chart.plotHeight"
580
+ *ngFor="let rect of hitRects; let i = index; trackBy: trackByIndex"
581
+ [attr.x]="rect.x"
582
+ [attr.y]="rect.y"
583
+ [attr.width]="rect.width"
584
+ [attr.height]="rect.height"
571
585
  fill="transparent"
572
586
  (pointerenter)="onEnterBand(i)"
573
587
  ></svg:rect>
@@ -615,11 +629,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
615
629
  ></svg:line>
616
630
 
617
631
  <svg:rect
618
- *ngFor="let band of hitBands; let i = index; trackBy: trackByIndex"
619
- [attr.x]="band.start"
620
- [attr.y]="chart.plotTop"
621
- [attr.width]="band.width"
622
- [attr.height]="chart.plotHeight"
632
+ *ngFor="let rect of hitRects; let i = index; trackBy: trackByIndex"
633
+ [attr.x]="rect.x"
634
+ [attr.y]="rect.y"
635
+ [attr.width]="rect.width"
636
+ [attr.height]="rect.height"
623
637
  fill="transparent"
624
638
  (pointerenter)="onEnterBand(i)"
625
639
  ></svg:rect>
@@ -649,6 +663,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
649
663
  type: Input
650
664
  }], stacked: [{
651
665
  type: Input
666
+ }], orientation: [{
667
+ type: Input
652
668
  }], hover: [{
653
669
  type: Input
654
670
  }], showTable: [{
@@ -667,16 +683,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
667
683
  type: ViewChild,
668
684
  args: ['plot']
669
685
  }] } });
670
- /** Horizontal rules at the y ticks, with optional vertical rules at the x positions. */
686
+ /**
687
+ * Rules at the value ticks, with optional rules at the category positions.
688
+ * Orientation-aware: in a horizontal chart the value rules run vertically and
689
+ * the (optional) category rules run horizontally — the transpose of a
690
+ * vertical chart's grid.
691
+ */
671
692
  export class ChartGridComponent extends ChartChild {
672
- /** Also draws a rule at every x position. @default false */
693
+ /** Also draws a rule at every category position. @default false */
673
694
  vertical = false;
674
695
  /** Extra Tailwind classes merged onto each rule via `cn()` (last-wins). */
675
696
  class = '';
676
- get verticalXs() {
697
+ /** Rules at each value tick, spanning the plot in the cross direction. */
698
+ get valueLines() {
699
+ const horizontal = this.chart.orientation === 'horizontal';
700
+ return this.chart.ticks.map((tick) => horizontal
701
+ ? { x1: tick.y, x2: tick.y, y1: this.chart.plotTop, y2: this.chart.plotBottom }
702
+ : { x1: this.chart.plotLeft, x2: this.chart.plotRight, y1: tick.y, y2: tick.y });
703
+ }
704
+ /** Rules at each category position, only when `vertical` is set. */
705
+ get categoryLines() {
677
706
  if (!this.vertical)
678
707
  return [];
679
- return this.chart.xLabels.map((_, i) => this.chart.xFor(i));
708
+ const horizontal = this.chart.orientation === 'horizontal';
709
+ return this.chart.xLabels.map((_, i) => {
710
+ const pos = this.chart.xFor(i);
711
+ return horizontal
712
+ ? { x1: this.chart.plotLeft, x2: this.chart.plotRight, y1: pos, y2: pos }
713
+ : { x1: pos, x2: pos, y1: this.chart.plotTop, y2: this.chart.plotBottom };
714
+ });
680
715
  }
681
716
  get lineClass() {
682
717
  // Recessive by design: a grid is a reading aid, never a mark.
@@ -685,20 +720,20 @@ export class ChartGridComponent extends ChartChild {
685
720
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartGridComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
686
721
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartGridComponent, isStandalone: true, selector: "svg:g[tolle-chart-grid]", inputs: { vertical: "vertical", class: "class" }, usesInheritance: true, ngImport: i0, template: `
687
722
  <svg:line
688
- *ngFor="let tick of chart.ticks; trackBy: trackByIndex"
689
- [attr.x1]="chart.plotLeft"
690
- [attr.x2]="chart.plotRight"
691
- [attr.y1]="tick.y"
692
- [attr.y2]="tick.y"
723
+ *ngFor="let line of valueLines; trackBy: trackByIndex"
724
+ [attr.x1]="line.x1"
725
+ [attr.x2]="line.x2"
726
+ [attr.y1]="line.y1"
727
+ [attr.y2]="line.y2"
693
728
  [class]="lineClass"
694
729
  stroke-width="1"
695
730
  ></svg:line>
696
731
  <svg:line
697
- *ngFor="let x of verticalXs; trackBy: trackByIndex"
698
- [attr.x1]="x"
699
- [attr.x2]="x"
700
- [attr.y1]="chart.plotTop"
701
- [attr.y2]="chart.plotBottom"
732
+ *ngFor="let line of categoryLines; trackBy: trackByIndex"
733
+ [attr.x1]="line.x1"
734
+ [attr.x2]="line.x2"
735
+ [attr.y1]="line.y1"
736
+ [attr.y2]="line.y2"
702
737
  [class]="lineClass"
703
738
  stroke-width="1"
704
739
  ></svg:line>
@@ -713,20 +748,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
713
748
  changeDetection: ChangeDetectionStrategy.OnPush,
714
749
  template: `
715
750
  <svg:line
716
- *ngFor="let tick of chart.ticks; trackBy: trackByIndex"
717
- [attr.x1]="chart.plotLeft"
718
- [attr.x2]="chart.plotRight"
719
- [attr.y1]="tick.y"
720
- [attr.y2]="tick.y"
751
+ *ngFor="let line of valueLines; trackBy: trackByIndex"
752
+ [attr.x1]="line.x1"
753
+ [attr.x2]="line.x2"
754
+ [attr.y1]="line.y1"
755
+ [attr.y2]="line.y2"
721
756
  [class]="lineClass"
722
757
  stroke-width="1"
723
758
  ></svg:line>
724
759
  <svg:line
725
- *ngFor="let x of verticalXs; trackBy: trackByIndex"
726
- [attr.x1]="x"
727
- [attr.x2]="x"
728
- [attr.y1]="chart.plotTop"
729
- [attr.y2]="chart.plotBottom"
760
+ *ngFor="let line of categoryLines; trackBy: trackByIndex"
761
+ [attr.x1]="line.x1"
762
+ [attr.x2]="line.x2"
763
+ [attr.y1]="line.y1"
764
+ [attr.y2]="line.y2"
730
765
  [class]="lineClass"
731
766
  stroke-width="1"
732
767
  ></svg:line>
@@ -739,7 +774,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
739
774
  }] } });
740
775
  /** X-axis tick labels, thinned so they never collide. */
741
776
  export class ChartXAxisComponent extends ChartChild {
742
- /** Approximate px per character, used to decide when labels would collide. @default 7 */
777
+ /**
778
+ * Approximate px per character, used to decide when category labels would
779
+ * collide. Only consulted in the vertical orientation. @default 7
780
+ */
743
781
  charWidth = 7;
744
782
  /** Extra Tailwind classes merged onto each label via `cn()` (last-wins). */
745
783
  class = '';
@@ -758,7 +796,15 @@ export class ChartXAxisComponent extends ChartChild {
758
796
  return 1;
759
797
  return Math.max(1, Math.ceil(needed / perLabel));
760
798
  }
799
+ /**
800
+ * Vertical orientation: category labels, thinned so they never collide
801
+ * (today's behaviour). Horizontal orientation: this is the bottom axis'
802
+ * physical position, which a horizontal chart uses for its value ticks.
803
+ */
761
804
  get visibleTicks() {
805
+ if (this.chart.orientation === 'horizontal') {
806
+ return this.chart.ticks.map((tick) => ({ x: tick.y, label: tick.label }));
807
+ }
762
808
  const stride = this.stride;
763
809
  return this.chart.xLabels
764
810
  .map((label, i) => ({ label, x: this.chart.xFor(i), i }))
@@ -815,13 +861,24 @@ export class ChartYAxisComponent extends ChartChild {
815
861
  get labelX() {
816
862
  return this.chart.plotLeft - this.offset;
817
863
  }
864
+ /**
865
+ * Vertical orientation: value ticks (today's behaviour). Horizontal
866
+ * orientation: this is the left axis' physical position, which a
867
+ * horizontal chart uses for its category labels.
868
+ */
869
+ get visibleTicks() {
870
+ if (this.chart.orientation === 'horizontal') {
871
+ return this.chart.xLabels.map((label, i) => ({ label, y: this.chart.xFor(i) }));
872
+ }
873
+ return this.chart.ticks;
874
+ }
818
875
  get labelClass() {
819
876
  return cn('fill-muted-foreground text-xs tabular-nums', this.class);
820
877
  }
821
878
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartYAxisComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
822
879
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChartYAxisComponent, isStandalone: true, selector: "svg:g[tolle-chart-y-axis]", inputs: { offset: "offset", class: "class" }, usesInheritance: true, ngImport: i0, template: `
823
880
  <svg:text
824
- *ngFor="let tick of chart.ticks; trackBy: trackByIndex"
881
+ *ngFor="let tick of visibleTicks; trackBy: trackByIndex"
825
882
  [attr.x]="labelX"
826
883
  [attr.y]="tick.y"
827
884
  text-anchor="end"
@@ -839,7 +896,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
839
896
  changeDetection: ChangeDetectionStrategy.OnPush,
840
897
  template: `
841
898
  <svg:text
842
- *ngFor="let tick of chart.ticks; trackBy: trackByIndex"
899
+ *ngFor="let tick of visibleTicks; trackBy: trackByIndex"
843
900
  [attr.x]="labelX"
844
901
  [attr.y]="tick.y"
845
902
  text-anchor="end"
@@ -1033,6 +1090,24 @@ export function barPath(x, width, yBase, yValue, radius) {
1033
1090
  ' Q ' + right + ' ' + yValue + ' ' + right + ' ' + corner +
1034
1091
  ' L ' + right + ' ' + yBase + ' Z');
1035
1092
  }
1093
+ /**
1094
+ * `barPath()` transposed for horizontal bars: fixed vertical extent
1095
+ * `[y, y+height]`, variable horizontal extent `[xBase, xValue]`, rounded at
1096
+ * the `xValue` (data) end.
1097
+ */
1098
+ export function barPathHorizontal(y, height, xBase, xValue, radius) {
1099
+ const width = Math.abs(xBase - xValue);
1100
+ const r = Math.max(0, Math.min(radius, height / 2, width));
1101
+ const bottom = y + height;
1102
+ const sign = xValue >= xBase ? 1 : -1;
1103
+ const corner = xValue - sign * r;
1104
+ return ('M ' + xBase + ' ' + y +
1105
+ ' L ' + corner + ' ' + y +
1106
+ ' Q ' + xValue + ' ' + y + ' ' + xValue + ' ' + (y + r) +
1107
+ ' L ' + xValue + ' ' + (bottom - r) +
1108
+ ' Q ' + xValue + ' ' + bottom + ' ' + corner + ' ' + bottom +
1109
+ ' L ' + xBase + ' ' + bottom + ' Z');
1110
+ }
1036
1111
  /**
1037
1112
  * A bar mark for one series. Grouped beside its siblings by default, stacked
1038
1113
  * when the container's `stacked` is set. The data end carries a 4px radius, the
@@ -1065,12 +1140,19 @@ export class ChartBarComponent extends ChartChild {
1065
1140
  get color() {
1066
1141
  return this.chart.colorFor(this.seriesKey);
1067
1142
  }
1068
- /** Geometry for every bar this series contributes. */
1143
+ /**
1144
+ * Geometry for every bar this series contributes. `x`/`width` are the bar's
1145
+ * footprint on the category axis and `yBase`/`yValue` its extent on the
1146
+ * value axis — physical x/y when vertical (the original meaning), but
1147
+ * transposed (x holds a vertical footprint, yBase/yValue hold horizontal
1148
+ * positions) when the chart is horizontal, same as `ChartService.yFor()`.
1149
+ */
1069
1150
  get bars() {
1070
1151
  const out = [];
1071
1152
  const seriesCount = Math.max(1, this.chart.series.length);
1072
1153
  const found = this.chart.series.findIndex((item) => item.key === this.seriesKey);
1073
1154
  const slotIndex = found < 0 ? 0 : found;
1155
+ const horizontal = this.chart.orientation === 'horizontal';
1074
1156
  for (let i = 0; i < this.chart.count; i++) {
1075
1157
  const value = this.chart.valueAt(this.seriesKey, i);
1076
1158
  if (value == null)
@@ -1091,12 +1173,16 @@ export class ChartBarComponent extends ChartChild {
1091
1173
  const yBase = this.chart.yFor(base);
1092
1174
  let yValue = this.chart.yFor(base + value);
1093
1175
  // The gap between stacked segments comes off the data end, so what
1094
- // separates them is surface showing through rather than a stroke.
1176
+ // separates them is surface showing through rather than a stroke. Signed
1177
+ // from the resolved positions (not the raw value) so it holds under
1178
+ // both orientations, whose value axis runs in opposite directions.
1095
1179
  if (this.chart.stacked && Math.abs(yBase - yValue) > this.gap) {
1096
- yValue += value >= 0 ? this.gap : -this.gap;
1180
+ yValue += Math.sign(yBase - yValue) * this.gap;
1097
1181
  }
1098
1182
  out.push({
1099
- d: barPath(x, width, yBase, yValue, this.radius),
1183
+ d: horizontal
1184
+ ? barPathHorizontal(x, width, yBase, yValue, this.radius)
1185
+ : barPath(x, width, yBase, yValue, this.radius),
1100
1186
  active: this.activeIndex === i,
1101
1187
  x,
1102
1188
  width,
@@ -1143,4 +1229,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1143
1229
  }], class: [{
1144
1230
  type: Input
1145
1231
  }] } });
1146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jaGFydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWMsU0FBUyxFQUErQyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMU0sT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQXNDLE1BQU0saUJBQWlCLENBQUM7OztBQUluRixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEI7Ozs7R0FJRztBQUVILE1BQU0sT0FBZ0IsVUFBVTtJQUM5Qjs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVrQixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdCLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUV0RDs7Ozs7T0FLRztJQUNILFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO0lBRWhELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFD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Q0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzt3R0E1RlUsaUJBQWlCOzRGQUFqQixpQkFBaUIsaU5BVGxCOzs7Ozs7O0dBT1QsMkRBVFMsWUFBWTs7NEZBV1gsaUJBQWlCO2tCQWQ3QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxRQUFRLEVBQUU7Ozs7Ozs7R0FPVDtpQkFDRjs4QkFHVSxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLEdBQUc7c0JBQVgsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERpcmVjdGl2ZSwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5JztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5pbXBvcnQgeyBDaGFydFNlcnZpY2UsIHR5cGUgQ2hhcnRTZXJpZXMsIHR5cGUgQ2hhcnRNYXJnaW4gfSBmcm9tICcuL2NoYXJ0LnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSB7IENoYXJ0U2VyaWVzLCBDaGFydE1hcmdpbiwgQ2hhcnRUaWNrLCBDaGFydEJhbmQgfSBmcm9tICcuL2NoYXJ0LnNlcnZpY2UnO1xuXG5sZXQgY2hhcnRJZCA9IDA7XG5cbi8qKlxuICogQmFzZSBmb3IgZXZlcnkgY2hhcnQgcGFydCB0aGF0IGhhcyB0byByZWRyYXcgd2hlbiB0aGUgc2hhcmVkIHNjYWxlcyBjaGFuZ2UuXG4gKiBQYXJ0cyBzdWJzY3JpYmUgdG8gdGhlIHNlcnZpY2UgcmF0aGVyIHRoYW4gcmVhZGluZyB0aGUgY29udGFpbmVyIGNvbXBvbmVudCxcbiAqIHNvIGFuIE9uUHVzaCBjaGlsZCBzdGlsbCB1cGRhdGVzIHdoZW4gdGhlIGNvbnRhaW5lcidzIGlucHV0cyBvciB3aWR0aCBjaGFuZ2UuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYXJ0Q2hpbGQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgc3ViY2xhc3NlcyBrZWVwXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgdGhleSB3ZXJlIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYXJ0ID0gaW5qZWN0KENoYXJ0U2VydmljZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAvKipcbiAgICogSWRlbnRpdHkgZm9yIHRoZSBtYXJrIGAqbmdGb3Jgcy4gVGhlIGNvbGxlY3Rpb25zIGJlaGluZCB0aGVtIGFyZSByZWJ1aWx0IG9uXG4gICAqIGV2ZXJ5IHJlYWQsIHNvIHdpdGhvdXQgdGhpcyBgKm5nRm9yYCBzZWVzIG5ldyBpZGVudGl0aWVzIGVhY2ggcGFzcyBhbmRcbiAgICogcmVwbGFjZXMgZXZlcnkgbm9kZSBpbnN0ZWFkIG9mIHBhdGNoaW5nIGl0LiBNYXJrcyBhcmUgcG9zaXRpb25hbCwgc28gdGhlXG4gICAqIGluZGV4IElTIHRoZSBpZGVudGl0eS5cbiAgICovXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuY2hhcnQubGF5b3V0JC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCkpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqIEhvb2sgZm9yIHBhcnRzIHRoYXQgbmVlZCB0byBpbmZsdWVuY2UgdGhlIHNoYXJlZCBzY2FsZXMgYmVmb3JlIGZpcnN0IHBhaW50LiAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXIoKTogdm9pZCB7fVxufVxuXG4vKipcbiAqIFRoZSBmbG9hdGluZyByZWFkb3V0IGZvciB0aGUgaG92ZXJlZCB4IHBvc2l0aW9uLiBMaXN0cyBldmVyeSBzZXJpZXMgYXQgdGhhdFxuICogeCwgc28gdGhlIHBvaW50ZXIgbmV2ZXIgaGFzIHRvIGxhbmQgb24gYSBwYXJ0aWN1bGFyIGxpbmUgdG8gZ2V0IGEgdmFsdWUuXG4gKiBSZW5kZXJlZCBhdXRvbWF0aWNhbGx5IGJ5IGB0b2xsZS1jaGFydGAgd2hlbiBgaG92ZXJgIGlzIG9uLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1jaGFydC10b29sdGlwJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiaW5kZXggIT09IG51bGxcIlxuICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIlxuICAgICAgW3N0eWxlLmxlZnQucHhdPVwibGVmdFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cInRvcFwiXG4gICAgPlxuICAgICAgPHAgY2xhc3M9XCJtYi0xIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC1mb3JlZ3JvdW5kXCI+e3sgeExhYmVsIH19PC9wPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgdGV4dC14c1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImgtMC41IHctMyBzaHJpbmstMCByb3VuZGVkLWZ1bGxcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJyb3cuY29sb3JcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+e3sgcm93LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1sLWF1dG8gZm9udC1tZWRpdW0gdGFidWxhci1udW1zIHRleHQtZm9yZWdyb3VuZFwiPnt7IHJvdy52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydFRvb2x0aXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIElkZW50aXR5IGZvciBgKm5nRm9yYCwgc28gYSByZWRyYXcgcGF0Y2hlcyBub2RlcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLiAqL1xuICB0cmFja0J5SW5kZXggPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICAvKiogRGlzdGFuY2UgaW4gcHggdGhlIHRvb2x0aXAgc2l0cyBmcm9tIHRoZSBjcm9zc2hhaXIuIEBkZWZhdWx0IDEyICovXG4gIEBJbnB1dCgpIG9mZnNldCA9IDEyO1xuICAvKiogQXNzdW1lZCB0b29sdGlwIHdpZHRoIGluIHB4LCB1c2VkIHRvIGZsaXAgaXQgbmVhciB0aGUgcmlnaHQgZWRnZS4gQGRlZmF1bHQgMTYwICovXG4gIEBJbnB1dCgpIGVzdGltYXRlZFdpZHRoID0gMTYwO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdG9vbHRpcCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnQgPSBpbmplY3QoQ2hhcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgLyoqIFJvdyBpbmRleCB0aGUgdG9vbHRpcCBpcyBkZXNjcmliaW5nLCBvciBudWxsIHdoZW4gbm90aGluZyBpcyBob3ZlcmVkLiAqL1xuICBpbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuY2hhcnQuYWN0aXZlSW5kZXgkLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuY2hhcnQubGF5b3V0JC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCkpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgZ2V0IHhMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmluZGV4ID09PSBudWxsID8gJycgOiB0aGlzLmNoYXJ0LnhMYWJlbHNbdGhpcy5pbmRleF0gPz8gJyc7XG4gIH1cblxuICAvKiogT25lIHJvdyBwZXIgc2VyaWVzOiBjb2xvdXIga2V5LCBsYWJlbCwgYW5kIHRoZSBmb3JtYXR0ZWQgdmFsdWUuICovXG4gIGdldCByb3dzKCk6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICBpZiAoaW5kZXggPT09IG51bGwpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5zZXJpZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY2hhcnQudmFsdWVBdChpdGVtLmtleSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICAgIHZhbHVlOiB2YWx1ZSA9PSBudWxsID8gJ+KAlCcgOiB0aGlzLmNoYXJ0LmZvcm1hdFZhbHVlKHZhbHVlKSxcbiAgICAgICAgY29sb3I6IHRoaXMuY2hhcnQuY29sb3JGb3IoaXRlbS5rZXkpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBsZWZ0KCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuaW5kZXggPT09IG51bGwpIHJldHVybiAwO1xuICAgIGNvbnN0IHggPSB0aGlzLmNoYXJ0LnhGb3IodGhpcy5pbmRleCk7XG4gICAgLy8gRmxpcCB0byB0aGUgbGVmdCBvZiB0aGUgY3Jvc3NoYWlyIHJhdGhlciB0aGFuIG92ZXJmbG93IHRoZSBjb250YWluZXIuXG4gICAgaWYgKHggKyB0aGlzLm9mZnNldCArIHRoaXMuZXN0aW1hdGVkV2lkdGggPiB0aGlzLmNoYXJ0LndpZHRoKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgeCAtIHRoaXMub2Zmc2V0IC0gdGhpcy5lc3RpbWF0ZWRXaWR0aCk7XG4gICAgfVxuICAgIHJldHVybiB4ICsgdGhpcy5vZmZzZXQ7XG4gIH1cblxuICBnZXQgdG9wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQucGxvdFRvcDtcbiAgfVxuXG4gIGdldCBjb21wdXRlZENsYXNzKCkge1xuICAgIHJldHVybiBjbihcbiAgICAgICdwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIHotMTAgbWluLXctWzhyZW1dIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctcG9wb3ZlciBwLTIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgc2hhZG93LW1kJyxcbiAgICAgIHRoaXMuY2xhc3NcbiAgICApO1xuICB9XG59XG5cbmNvbnN0IGNoYXJ0TGVnZW5kVmFyaWFudHMgPSBjdmEoJ2ZsZXggZmxleC13cmFwIGl0ZW1zLWNlbnRlciBnYXAteC00IGdhcC15LTEgcHQtMicsIHtcbiAgdmFyaWFudHM6IHtcbiAgICBhbGlnbjogeyBzdGFydDogJ2p1c3RpZnktc3RhcnQnLCBjZW50ZXI6ICdqdXN0aWZ5LWNlbnRlcicsIGVuZDogJ2p1c3RpZnktZW5kJyB9LFxuICAgIHNpemU6IHsgc206ICd0ZXh0LVsxMXB4XScsIGRlZmF1bHQ6ICd0ZXh0LXhzJyB9LFxuICB9LFxuICBkZWZhdWx0VmFyaWFudHM6IHsgYWxpZ246ICdjZW50ZXInLCBzaXplOiAnZGVmYXVsdCcgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBDaGFydExlZ2VuZFByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBjaGFydExlZ2VuZFZhcmlhbnRzPjtcblxuLyoqXG4gKiBTd2F0Y2ggYW5kIGxhYmVsIHBlciBzZXJpZXMuIFJlbmRlcmVkIGF1dG9tYXRpY2FsbHkgYnkgYHRvbGxlLWNoYXJ0YCB3aGVuZXZlclxuICogdGhlcmUgYXJlIHR3byBvciBtb3JlIHNlcmllcywgc28gaWRlbnRpdHkgaXMgbmV2ZXIgY2FycmllZCBieSBjb2xvdXIgYWxvbmUuXG4gKiBBIHNpbmdsZSBzZXJpZXMgZ2V0cyBubyBsZWdlbmQg4oCUIHRoZSBjaGFydCdzIG93biBsYWJlbCBhbHJlYWR5IG5hbWVzIGl0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1jaGFydC1sZWdlbmQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHVsIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGVudHJ5IG9mIGVudHJpZXM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImgtMiB3LTIgc2hyaW5rLTAgcm91bmRlZC1bMnB4XVwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImVudHJ5LmNvbG9yXCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IGVudHJ5LmxhYmVsIH19PC9zcGFuPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydExlZ2VuZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogSWRlbnRpdHkgZm9yIGAqbmdGb3JgLCBzbyBhIHJlZHJhdyBwYXRjaGVzIG5vZGVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uICovXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIC8qKiBIb3Jpem9udGFsIGFsaWdubWVudCBvZiB0aGUgbGVnZW5kIHJvdy4gQGRlZmF1bHQgJ2NlbnRlcicgKi9cbiAgQElucHV0KCkgYWxpZ246IENoYXJ0TGVnZW5kUHJvcHNbJ2FsaWduJ10gPSAnY2VudGVyJztcbiAgLyoqIFRleHQgc2l6ZSBvZiB0aGUgbGVnZW5kLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgc2l6ZTogQ2hhcnRMZWdlbmRQcm9wc1snc2l6ZSddID0gJ2RlZmF1bHQnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgbGVnZW5kIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydCA9IGluamVjdChDaGFydFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuY2hhcnQubGF5b3V0JC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCkpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqIE9uZSBlbnRyeSBwZXIgc2VyaWVzLCBjb2xvdXJlZCBieSBzZXJpZXMgaWRlbnRpdHkuICovXG4gIGdldCBlbnRyaWVzKCk6IHsgbGFiZWw6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0LnNlcmllcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgIGNvbG9yOiB0aGlzLmNoYXJ0LmNvbG9yRm9yKGl0ZW0ua2V5KSxcbiAgICB9KSk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY2hhcnRMZWdlbmRWYXJpYW50cyh7IGFsaWduOiB0aGlzLmFsaWduLCBzaXplOiB0aGlzLnNpemUgfSksIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbmNvbnN0IGNoYXJ0VGFibGVWYXJpYW50cyA9IGN2YSgndy1mdWxsIHRleHQtbGVmdCB0ZXh0LXhzJywge1xuICB2YXJpYW50czoge1xuICAgIHZpc2libGU6IHtcbiAgICAgIHRydWU6ICdtdC00IGJvcmRlci1jb2xsYXBzZScsXG4gICAgICBmYWxzZTogJ3NyLW9ubHknLFxuICAgIH0sXG4gIH0sXG4gIGRlZmF1bHRWYXJpYW50czogeyB2aXNpYmxlOiBmYWxzZSB9LFxufSk7XG5cbmV4cG9ydCB0eXBlIENoYXJ0VGFibGVQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgY2hhcnRUYWJsZVZhcmlhbnRzPjtcblxuLyoqXG4gKiBUaGUgY2hhcnQncyBkYXRhIGFzIGEgcmVhbCBgPHRhYmxlPmAuIFZpc3VhbGx5IGhpZGRlbiBieSBkZWZhdWx0IGFuZCBwb2ludGVkXG4gKiBhdCBieSB0aGUgc3ZnJ3MgYGFyaWEtZGVzY3JpYmVkYnlgLCBzbyBldmVyeSB2YWx1ZSB0aGUgY2hhcnQgZW5jb2RlcyBpblxuICogY29sb3VyIHN0YXlzIHJlYWNoYWJsZSB3aXRob3V0IHNlZWluZyBvciBob3ZlcmluZyBpdC4gU2V0IGB2aXNpYmxlYCB0byBzaG93IGl0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1jaGFydC10YWJsZScsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFthdHRyLmlkXT1cInRhYmxlSWQgfHwgbnVsbFwiPlxuICAgICAgPHRhYmxlIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCI+XG4gICAgICAgIDxjYXB0aW9uIGNsYXNzPVwic3Itb25seVwiPnt7IGNhcHRpb24gfX08L2NhcHRpb24+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIiBjbGFzcz1cImJvcmRlci1iIGJvcmRlci1ib3JkZXIgcHgtMiBweS0xIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgICB7eyB4SGVhZGVyIH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNoYXJ0LnNlcmllczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICAgICAgc2NvcGU9XCJjb2xcIlxuICAgICAgICAgICAgICBjbGFzcz1cImJvcmRlci1iIGJvcmRlci1ib3JkZXIgcHgtMiBweS0xIGZvbnQtbWVkaXVtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGl0ZW0ubGFiZWwgfX1cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcm93IG9mIHJvd3M7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwicm93XCIgY2xhc3M9XCJib3JkZXItYiBib3JkZXItYm9yZGVyIHB4LTIgcHktMSBmb250LW5vcm1hbCB0ZXh0LWZvcmVncm91bmRcIj5cbiAgICAgICAgICAgICAge3sgcm93LmxhYmVsIH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdy5jZWxsczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXItYiBib3JkZXItYm9yZGVyIHB4LTIgcHktMSB0YWJ1bGFyLW51bXMgdGV4dC1mb3JlZ3JvdW5kXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgY2VsbCB9fVxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHRoZSBjb21wb25lbnQga2VlcHNcbiAgICogcmVuZGVyaW5nIHRoZSBjbGFzcyBpdCB3YXMgYm9ybiB3aXRoLlxuICAgKi9cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogSWRlbnRpdHkgZm9yIGAqbmdGb3JgLCBzbyBhIHJlZHJhdyBwYXRjaGVzIG5vZGVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uICovXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIC8qKiBTaG93cyB0aGUgdGFibGUgaW5zdGVhZCBvZiBoaWRpbmcgaXQgZnJvbSBzaWdodGVkIHJlYWRlcnMuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIHZpc2libGUgPSBmYWxzZTtcbiAgLyoqIElkIGFwcGxpZWQgdG8gdGhlIHdyYXBwZXIsIGZvciB0aGUgY2hhcnQncyBgYXJpYS1kZXNjcmliZWRieWAuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIHRhYmxlSWQgPSAnJztcbiAgLyoqIENvbHVtbiBoZWFkZXIgZm9yIHRoZSB4IGNhdGVnb3J5LiBAZGVmYXVsdCAnQ2F0ZWdvcnknICovXG4gIEBJbnB1dCgpIHhIZWFkZXIgPSAnQ2F0ZWdvcnknO1xuICAvKiogQWNjZXNzaWJsZSBjYXB0aW9uIGZvciB0aGUgdGFibGUuIEBkZWZhdWx0ICdDaGFydCBkYXRhJyAqL1xuICBASW5wdXQoKSBjYXB0aW9uID0gJ0NoYXJ0IGRhdGEnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgdGFibGUgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2hhcnQgPSBpbmplY3QoQ2hhcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmNoYXJ0LmxheW91dCQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBPbmUgcm93IHBlciB4IHBvc2l0aW9uLCB3aXRoIGEgZm9ybWF0dGVkIGNlbGwgcGVyIHNlcmllcy4gKi9cbiAgZ2V0IHJvd3MoKTogeyBsYWJlbDogc3RyaW5nOyBjZWxsczogc3RyaW5nW10gfVtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC54TGFiZWxzLm1hcCgobGFiZWwsIGkpID0+ICh7XG4gICAgICBsYWJlbCxcbiAgICAgIGNlbGxzOiB0aGlzLmNoYXJ0LnNlcmllcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNoYXJ0LnZhbHVlQXQoaXRlbS5rZXksIGkpO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICfigJQnIDogdGhpcy5jaGFydC5mb3JtYXRWYWx1ZSh2YWx1ZSk7XG4gICAgICB9KSxcbiAgICB9KSk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY2hhcnRUYWJsZVZhcmlhbnRzKHsgdmlzaWJsZTogdGhpcy52aXNpYmxlIH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuXG5jb25zdCBjaGFydFZhcmlhbnRzID0gY3ZhKCdyZWxhdGl2ZSB3LWZ1bGwnLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgdmFyaWFudDoge1xuICAgICAgZGVmYXVsdDogJycsXG4gICAgICBjYXJkOiAncm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1iYWNrZ3JvdW5kIHAtNCcsXG4gICAgfSxcbiAgICBkZW5zaXR5OiB7XG4gICAgICBkZWZhdWx0OiAnJyxcbiAgICAgIGNvbXBhY3Q6ICd0ZXh0LXhzJyxcbiAgICB9LFxuICB9LFxuICBkZWZhdWx0VmFyaWFudHM6IHsgdmFyaWFudDogJ2RlZmF1bHQnLCBkZW5zaXR5OiAnZGVmYXVsdCcgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBDaGFydFByb3BzID0gVmFyaWFudFByb3BzPHR5cGVvZiBjaGFydFZhcmlhbnRzPjtcblxuLyoqXG4gKiBDb250YWluZXIgZm9yIGEgaGFuZC1yb2xsZWQgU1ZHIGNoYXJ0LiBPd25zIHRoZSByZXNwb25zaXZlIGA8c3ZnPmAsIHRoZVxuICogc2hhcmVkIHNjYWxlcyAodmlhIHRoZSBgQ2hhcnRTZXJ2aWNlYCBpdCBwcm92aWRlcyksIHRoZSBob3ZlciBsYXllciwgdGhlXG4gKiBsZWdlbmQgYW5kIHRoZSBhY2Nlc3NpYmxlIHRhYmxlIGZhbGxiYWNrLlxuICpcbiAqIE1hcmtzIGFuZCBheGVzIGFyZSBwcm9qZWN0ZWQgYXMgU1ZHIGNoaWxkcmVuLiBUaGV5IHVzZSBhdHRyaWJ1dGUgc2VsZWN0b3JzIG9uXG4gKiBgc3ZnOmdgIHJhdGhlciB0aGFuIGVsZW1lbnQgc2VsZWN0b3JzLCBiZWNhdXNlIGEgY3VzdG9tIGVsZW1lbnQgaXMgY3JlYXRlZCBpblxuICogdGhlIEhUTUwgbmFtZXNwYWNlIGFuZCBhbiBIVE1MIGVsZW1lbnQgaW5zaWRlIGFuIGA8c3ZnPmAgbmV2ZXIgcmVuZGVycyBpdHNcbiAqIFNWRyBzdWJ0cmVlOlxuICpcbiAqIGBgYGh0bWxcbiAqIDx0b2xsZS1jaGFydCBbZGF0YV09XCJyb3dzXCIgW3Nlcmllc109XCJzZXJpZXNcIiB4S2V5PVwibW9udGhcIiBhcmlhTGFiZWw9XCJSZXZlbnVlXCI+XG4gKiAgIDxzdmc6ZyB0b2xsZS1jaGFydC1ncmlkPjwvc3ZnOmc+XG4gKiAgIDxzdmc6ZyB0b2xsZS1jaGFydC15LWF4aXM+PC9zdmc6Zz5cbiAqICAgPHN2ZzpnIHRvbGxlLWNoYXJ0LXgtYXhpcz48L3N2ZzpnPlxuICogICA8c3ZnOmcgdG9sbGUtY2hhcnQtbGluZSBzZXJpZXNLZXk9XCJyZXZlbnVlXCIgY3VydmU9XCJzbW9vdGhcIj48L3N2ZzpnPlxuICogPC90b2xsZS1jaGFydD5cbiAqIGBgYFxuICpcbiAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZWNvbmRhcnkgeS1heGlzOiB0d28gbWVhc3VyZXMgb24gdHdvIHNjYWxlcyBpbiBvbmVcbiAqIGZyYW1lIGxldCB0aGUgYXV0aG9yIGNob29zZSB3aGVyZSB0aGUgbGluZXMgY3Jvc3MsIHNvIHRoZSByZWFkZXIgc2VlcyBhXG4gKiByZWxhdGlvbnNoaXAgdGhlIGRhdGEgZG9lcyBub3QgY29udGFpbi4gVXNlIHR3byBjaGFydHMsIHNtYWxsIG11bHRpcGxlcywgb3JcbiAqIGluZGV4IGJvdGggc2VyaWVzIHRvIGEgY29tbW9uIGJhc2UgaW5zdGVhZC5cbiAqIEBuZXdcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtY2hhcnQnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBDaGFydFRvb2x0aXBDb21wb25lbnQsIENoYXJ0TGVnZW5kQ29tcG9uZW50LCBDaGFydFRhYmxlQ29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbQ2hhcnRTZXJ2aWNlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIHctZnVsbFwiICNwbG90PlxuICAgICAgICA8c3ZnXG4gICAgICAgICAgcm9sZT1cImltZ1wiXG4gICAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgICAgICBbYXR0ci52aWV3Qm94XT1cInZpZXdCb3hcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsIHx8IG51bGxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwidGFibGVJZFwiXG4gICAgICAgICAgY2xhc3M9XCJibG9jayB3LWZ1bGwgb3ZlcmZsb3ctdmlzaWJsZVwiXG4gICAgICAgICAgKHBvaW50ZXJsZWF2ZSk9XCJvblBvaW50ZXJMZWF2ZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx0aXRsZT57eyBhcmlhTGFiZWwgfX08L3RpdGxlPlxuICAgICAgICAgIDxkZXNjPnt7IGRlc2NyaXB0aW9uIHx8IGFyaWFMYWJlbCB9fTwvZGVzYz5cblxuICAgICAgICAgIDxzdmc6Zz5cbiAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICA8L3N2ZzpnPlxuXG4gICAgICAgICAgPHN2ZzpsaW5lXG4gICAgICAgICAgICAqbmdJZj1cImNyb3NzaGFpclggIT09IG51bGxcIlxuICAgICAgICAgICAgW2F0dHIueDFdPVwiY3Jvc3NoYWlyWFwiXG4gICAgICAgICAgICBbYXR0ci54Ml09XCJjcm9zc2hhaXJYXCJcbiAgICAgICAgICAgIFthdHRyLnkxXT1cImNoYXJ0LnBsb3RUb3BcIlxuICAgICAgICAgICAgW2F0dHIueTJdPVwiY2hhcnQucGxvdEJvdHRvbVwiXG4gICAgICAgICAgICBjbGFzcz1cInBvaW50ZXItZXZlbnRzLW5vbmUgc3Ryb2tlLWJvcmRlclwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICA+PC9zdmc6bGluZT5cblxuICAgICAgICAgIDxzdmc6cmVjdFxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGJhbmQgb2YgaGl0QmFuZHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgICBbYXR0ci54XT1cImJhbmQuc3RhcnRcIlxuICAgICAgICAgICAgW2F0dHIueV09XCJjaGFydC5wbG90VG9wXCJcbiAgICAgICAgICAgIFthdHRyLndpZHRoXT1cImJhbmQud2lkdGhcIlxuICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImNoYXJ0LnBsb3RIZWlnaHRcIlxuICAgICAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwib25FbnRlckJhbmQoaSlcIlxuICAgICAgICAgID48L3N2ZzpyZWN0PlxuICAgICAgICA8L3N2Zz5cblxuICAgICAgICA8dG9sbGUtY2hhcnQtdG9vbHRpcCAqbmdJZj1cImhvdmVyXCI+PC90b2xsZS1jaGFydC10b29sdGlwPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDx0b2xsZS1jaGFydC1sZWdlbmQgKm5nSWY9XCJzZXJpZXMubGVuZ3RoID4gMVwiPjwvdG9sbGUtY2hhcnQtbGVnZW5kPlxuXG4gICAgICA8dG9sbGUtY2hhcnQtdGFibGUgW3RhYmxlSWRdPVwidGFibGVJZFwiIFt2aXNpYmxlXT1cInNob3dUYWJsZVwiIFt4SGVhZGVyXT1cInhIZWFkZXJcIj48L3RvbGxlLWNoYXJ0LXRhYmxlPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogSWRlbnRpdHkgZm9yIGAqbmdGb3JgLCBzbyBhIHJlZHJhdyBwYXRjaGVzIG5vZGVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uICovXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIC8qKiBSb3dzIHRvIHBsb3QsIGluIHggb3JkZXIuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5bXSA9IFtdO1xuICAvKiogU2VyaWVzIHRvIGRyYXcsIGluIHRoZSBvcmRlciB0aGV5IHRha2UgcGFsZXR0ZSBzdGVwcyBgLS1jaGFydC0xYC4uYC0tY2hhcnQtNWAuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIHNlcmllczogQ2hhcnRTZXJpZXNbXSA9IFtdO1xuICAvKiogUm93IGtleSBob2xkaW5nIGVhY2ggcm93J3MgeCBjYXRlZ29yeSBsYWJlbC4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgeEtleSA9ICcnO1xuICAvKiogSGVpZ2h0IG9mIHRoZSBjaGFydCBpbiBweC4gQGRlZmF1bHQgMjYwICovXG4gIEBJbnB1dCgpIGhlaWdodCA9IDI2MDtcbiAgLyoqIFNwYWNlIHJlc2VydmVkIGFyb3VuZCB0aGUgcGxvdCBmb3IgYXhpcyBsYWJlbHMuIEBkZWZhdWx0IHsgdG9wOiA4LCByaWdodDogOCwgYm90dG9tOiAyNCwgbGVmdDogNDQgfSAqL1xuICBASW5wdXQoKSBtYXJnaW46IENoYXJ0TWFyZ2luID0geyB0b3A6IDgsIHJpZ2h0OiA4LCBib3R0b206IDI0LCBsZWZ0OiA0NCB9O1xuICAvKiogQWNjZXNzaWJsZSBuYW1lIGZvciB0aGUgY2hhcnQsIHVzZWQgYXMgdGhlIHN2ZyBgPHRpdGxlPmAuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbCA9ICcnO1xuICAvKiogTG9uZ2VyIHN1bW1hcnkgdXNlZCBhcyB0aGUgc3ZnIGA8ZGVzYz5gLiBGYWxscyBiYWNrIHRvIGBhcmlhTGFiZWxgLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICcnO1xuICAvKiogU3RhY2tzIG1hcmtzIG9uIGEgc2hhcmVkIGJhc2VsaW5lIGluc3RlYWQgb2YgZ3JvdXBpbmcgdGhlbS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgc3RhY2tlZCA9IGZhbHNlO1xuICAvKiogUmVuZGVycyB0aGUgY3Jvc3NoYWlyLCBoaXQgbGF5ZXIgYW5kIHNoYXJlZCB0b29sdGlwLiBAZGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIGhvdmVyID0gdHJ1ZTtcbiAgLyoqIFNob3dzIHRoZSBkYXRhIHRhYmxlIGluc3RlYWQgb2YgbGVhdmluZyBpdCB2aXN1YWxseSBoaWRkZW4uIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIHNob3dUYWJsZSA9IGZhbHNlO1xuICAvKiogQ29sdW1uIGhlYWRlciB0aGUgdGFibGUgZmFsbGJhY2sgZ2l2ZXMgdGhlIHggY2F0ZWdvcnkuIEBkZWZhdWx0ICdDYXRlZ29yeScgKi9cbiAgQElucHV0KCkgeEhlYWRlciA9ICdDYXRlZ29yeSc7XG4gIC8qKiBWaXN1YWwgdHJlYXRtZW50IG9mIHRoZSBjaGFydCBmcmFtZS4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IENoYXJ0UHJvcHNbJ3ZhcmlhbnQnXSA9ICdkZWZhdWx0JztcbiAgLyoqIFRleHQgZGVuc2l0eSBvZiB0aGUgY2hhcnQgY2hyb21lLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgZGVuc2l0eTogQ2hhcnRQcm9wc1snZGVuc2l0eSddID0gJ2RlZmF1bHQnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgY2hhcnQgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICAvKiogRW1pdHRlZCB3aXRoIHRoZSBob3ZlcmVkIHJvdyBpbmRleCwgb3IgbnVsbCB3aGVuIHRoZSBwb2ludGVyIGxlYXZlcy4gKi9cbiAgQE91dHB1dCgpIGFjdGl2ZUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3Bsb3QnKSBwbG90UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYXJ0ID0gaW5qZWN0KENoYXJ0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgLyoqIFdpZHRoIHVzZWQgdW50aWwgdGhlIGNvbnRhaW5lciBoYXMgYmVlbiBtZWFzdXJlZC4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IGZhbGxiYWNrV2lkdGggPSA2MDA7XG5cbiAgLyoqIElkIG9mIHRoZSB0YWJsZSBmYWxsYmFjaywgcmVmZXJlbmNlZCBieSB0aGUgc3ZnJ3MgYGFyaWEtZGVzY3JpYmVkYnlgLiAqL1xuICByZWFkb25seSB0YWJsZUlkID0gJ2NoYXJ0LXRhYmxlLScgKyBjaGFydElkKys7XG5cbiAgLyoqIFggb2YgdGhlIGNyb3NzaGFpciwgb3IgbnVsbCB3aGVuIG5vdGhpbmcgaXMgaG92ZXJlZCBvciB0aGUgc2NhbGUgaXMgYmFuZGVkLiAqL1xuICBjcm9zc2hhaXJYOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuY2hhcnQubGF5b3V0JC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCkpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5jaGFydC5hY3RpdmVJbmRleCQuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAvLyBCYXJzIGNhcnJ5IHRoZWlyIG93biBob3ZlciBzdGF0ZTsgYSBjcm9zc2hhaXIgYmVsb25ncyB0byBwb2ludCBzY2FsZXMuXG4gICAgICAgIHRoaXMuY3Jvc3NoYWlyWCA9XG4gICAgICAgICAgaW5kZXggIT0gbnVsbCAmJiB0aGlzLmNoYXJ0Lm1vZGUgPT09ICdwb2ludCcgPyB0aGlzLmNoYXJ0LnhGb3IoaW5kZXgpIDogbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleENoYW5nZS5lbWl0KGluZGV4KTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goKTtcbiAgXG4gICAgLy8gQSBib3VuZCBgY2xhc3NgIGlucHV0IGlzIHdyaXR0ZW4gdGhyb3VnaCBBbmd1bGFyJ3Mgc3R5bGluZyBwYXRoLFxuICAgIC8vIHdoaWNoIGRvZXMgbm90IG1hcmsgYW4gT25QdXNoIHZpZXcgZGlydHkgb24gaXRzIG93bi5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5wbG90UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghaG9zdCkgcmV0dXJuO1xuICAgIHRoaXMubWVhc3VyZShob3N0KTtcblxuICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgdGhpcy5tZWFzdXJlKGhvc3QpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGhvc3QpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZWFzdXJlKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3Qgd2lkdGggPSBob3N0LmNsaWVudFdpZHRoIHx8IENoYXJ0Q29tcG9uZW50LmZhbGxiYWNrV2lkdGg7XG4gICAgaWYgKHdpZHRoID09PSB0aGlzLmNoYXJ0LndpZHRoKSByZXR1cm47XG4gICAgdGhpcy5jaGFydC5jb25maWd1cmUoeyB3aWR0aCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcHVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0LmNvbmZpZ3VyZSh7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEgPz8gW10sXG4gICAgICBzZXJpZXM6IHRoaXMuc2VyaWVzID8/IFtdLFxuICAgICAgeEtleTogdGhpcy54S2V5LFxuICAgICAgc3RhY2tlZDogdGhpcy5zdGFja2VkLFxuICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgIG1hcmdpbjogdGhpcy5tYXJnaW4sXG4gICAgICB3aWR0aDogdGhpcy5jaGFydC53aWR0aCB8fCBDaGFydENvbXBvbmVudC5mYWxsYmFja1dpZHRoLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHZpZXdCb3goKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJzAgMCAnICsgKHRoaXMuY2hhcnQud2lkdGggfHwgQ2hhcnRDb21wb25lbnQuZmFsbGJhY2tXaWR0aCkgKyAnICcgKyB0aGlzLmhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgY2F0Y2htZW50IHJlY3QgcGVyIHggcG9zaXRpb24sIGRlbGliZXJhdGVseSB3aWRlciB0aGFuIHRoZSBtYXJrcyBpdFxuICAgKiBjb3ZlcnMg4oCUIHJlYWRlcnMgYWltIGF0IGEgY2F0ZWdvcnksIG5ldmVyIGF0IGEgMnB4IGxpbmUgb3IgYW4gOHB4IGRvdC5cbiAgICovXG4gIGdldCBoaXRCYW5kcygpIHtcbiAgICBpZiAoIXRoaXMuaG92ZXIpIHJldHVybiBbXTtcbiAgICByZXR1cm4gdGhpcy5kYXRhLm1hcCgoXywgaSkgPT4gdGhpcy5jaGFydC5oaXRCYW5kRm9yKGkpKTtcbiAgfVxuXG4gIG9uRW50ZXJCYW5kKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0LnNldEFjdGl2ZUluZGV4KGluZGV4KTtcbiAgfVxuXG4gIG9uUG9pbnRlckxlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnQuc2V0QWN0aXZlSW5kZXgobnVsbCk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY2hhcnRWYXJpYW50cyh7IHZhcmlhbnQ6IHRoaXMudmFyaWFudCwgZGVuc2l0eTogdGhpcy5kZW5zaXR5IH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuXG4vKiogSG9yaXpvbnRhbCBydWxlcyBhdCB0aGUgeSB0aWNrcywgd2l0aCBvcHRpb25hbCB2ZXJ0aWNhbCBydWxlcyBhdCB0aGUgeCBwb3NpdGlvbnMuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdmc6Z1t0b2xsZS1jaGFydC1ncmlkXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3ZnOmxpbmVcbiAgICAgICpuZ0Zvcj1cImxldCB0aWNrIG9mIGNoYXJ0LnRpY2tzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxuICAgICAgW2F0dHIueDFdPVwiY2hhcnQucGxvdExlZnRcIlxuICAgICAgW2F0dHIueDJdPVwiY2hhcnQucGxvdFJpZ2h0XCJcbiAgICAgIFthdHRyLnkxXT1cInRpY2sueVwiXG4gICAgICBbYXR0ci55Ml09XCJ0aWNrLnlcIlxuICAgICAgW2NsYXNzXT1cImxpbmVDbGFzc1wiXG4gICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICA+PC9zdmc6bGluZT5cbiAgICA8c3ZnOmxpbmVcbiAgICAgICpuZ0Zvcj1cImxldCB4IG9mIHZlcnRpY2FsWHM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICBbYXR0ci54MV09XCJ4XCJcbiAgICAgIFthdHRyLngyXT1cInhcIlxuICAgICAgW2F0dHIueTFdPVwiY2hhcnQucGxvdFRvcFwiXG4gICAgICBbYXR0ci55Ml09XCJjaGFydC5wbG90Qm90dG9tXCJcbiAgICAgIFtjbGFzc109XCJsaW5lQ2xhc3NcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgPjwvc3ZnOmxpbmU+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENoYXJ0R3JpZENvbXBvbmVudCBleHRlbmRzIENoYXJ0Q2hpbGQge1xuICAvKiogQWxzbyBkcmF3cyBhIHJ1bGUgYXQgZXZlcnkgeCBwb3NpdGlvbi4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgdmVydGljYWwgPSBmYWxzZTtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gZWFjaCBydWxlIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgZ2V0IHZlcnRpY2FsWHMoKTogbnVtYmVyW10ge1xuICAgIGlmICghdGhpcy52ZXJ0aWNhbCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiB0aGlzLmNoYXJ0LnhMYWJlbHMubWFwKChfLCBpKSA9PiB0aGlzLmNoYXJ0LnhGb3IoaSkpO1xuICB9XG5cbiAgZ2V0IGxpbmVDbGFzcygpOiBzdHJpbmcge1xuICAgIC8vIFJlY2Vzc2l2ZSBieSBkZXNpZ246IGEgZ3JpZCBpcyBhIHJlYWRpbmcgYWlkLCBuZXZlciBhIG1hcmsuXG4gICAgcmV0dXJuIGNuKCdzdHJva2UtYm9yZGVyIG9wYWNpdHktNjAnLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuXG4vKiogWC1heGlzIHRpY2sgbGFiZWxzLCB0aGlubmVkIHNvIHRoZXkgbmV2ZXIgY29sbGlkZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N2ZzpnW3RvbGxlLWNoYXJ0LXgtYXhpc10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2Zzp0ZXh0XG4gICAgICAqbmdGb3I9XCJsZXQgdGljayBvZiB2aXNpYmxlVGlja3M7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICBbYXR0ci54XT1cInRpY2sueFwiXG4gICAgICBbYXR0ci55XT1cImxhYmVsWVwiXG4gICAgICB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiXG4gICAgICBkb21pbmFudC1iYXNlbGluZT1cImhhbmdpbmdcIlxuICAgICAgW2NsYXNzXT1cImxhYmVsQ2xhc3NcIlxuICAgID57eyB0aWNrLmxhYmVsIH19PC9zdmc6dGV4dD5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRYQXhpc0NvbXBvbmVudCBleHRlbmRzIENoYXJ0Q2hpbGQge1xuICAvKiogQXBwcm94aW1hdGUgcHggcGVyIGNoYXJhY3RlciwgdXNlZCB0byBkZWNpZGUgd2hlbiBsYWJlbHMgd291bGQgY29sbGlkZS4gQGRlZmF1bHQgNyAqL1xuICBASW5wdXQoKSBjaGFyV2lkdGggPSA3O1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byBlYWNoIGxhYmVsIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqXG4gICAqIERyYXcgZXZlcnkgbnRoIGxhYmVsLiBEZXJpdmVkIGZyb20gdGhlIHdpZGVzdCBsYWJlbCBhbmQgdGhlIHNwYWNlIGVhY2ggb25lXG4gICAqIGdldHMsIHNvIGEgZGVuc2UgYXhpcyB0aGlucyBvdXQgaW5zdGVhZCBvZiBvdmVycHJpbnRpbmcgaXRzZWxmLlxuICAgKi9cbiAgZ2V0IHN0cmlkZSgpOiBudW1iZXIge1xuICAgIGNvbnN0IGxhYmVscyA9IHRoaXMuY2hhcnQueExhYmVscztcbiAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDE7XG4gICAgY29uc3Qgd2lkZXN0ID0gbGFiZWxzLnJlZHVjZSgobWF4LCBsYWJlbCkgPT4gTWF0aC5tYXgobWF4LCBsYWJlbC5sZW5ndGgpLCAwKTtcbiAgICBjb25zdCBuZWVkZWQgPSB3aWRlc3QgKiB0aGlzLmNoYXJXaWR0aCArIDg7XG4gICAgY29uc3QgcGVyTGFiZWwgPSB0aGlzLmNoYXJ0LnBsb3RXaWR0aCAvIGxhYmVscy5sZW5ndGg7XG4gICAgaWYgKHBlckxhYmVsIDw9IDApIHJldHVybiAxO1xuICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmNlaWwobmVlZGVkIC8gcGVyTGFiZWwpKTtcbiAgfVxuXG4gIGdldCB2aXNpYmxlVGlja3MoKTogeyB4OiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBzdHJpZGUgPSB0aGlzLnN0cmlkZTtcbiAgICByZXR1cm4gdGhpcy5jaGFydC54TGFiZWxzXG4gICAgICAubWFwKChsYWJlbCwgaSkgPT4gKHsgbGFiZWwsIHg6IHRoaXMuY2hhcnQueEZvcihpKSwgaSB9KSlcbiAgICAgIC5maWx0ZXIoKHRpY2spID0+IHRpY2suaSAlIHN0cmlkZSA9PT0gMCk7XG4gIH1cblxuICBnZXQgbGFiZWxZKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQucGxvdEJvdHRvbSArIDg7XG4gIH1cblxuICBnZXQgbGFiZWxDbGFzcygpOiBzdHJpbmcge1xuICAgIC8vIFRleHQgd2VhcnMgYSB0ZXh0IHRva2VuLCBuZXZlciB0aGUgc2VyaWVzIGNvbG91ci5cbiAgICByZXR1cm4gY24oJ2ZpbGwtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXhzJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cblxuLyoqIFktYXhpcyB0aWNrIGxhYmVscyBhdCB0aGUgbmljZSB0aWNrIHZhbHVlcy4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N2ZzpnW3RvbGxlLWNoYXJ0LXktYXhpc10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2Zzp0ZXh0XG4gICAgICAqbmdGb3I9XCJsZXQgdGljayBvZiBjaGFydC50aWNrczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgIFthdHRyLnhdPVwibGFiZWxYXCJcbiAgICAgIFthdHRyLnldPVwidGljay55XCJcbiAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgIGRvbWluYW50LWJhc2VsaW5lPVwibWlkZGxlXCJcbiAgICAgIFtjbGFzc109XCJsYWJlbENsYXNzXCJcbiAgICA+e3sgdGljay5sYWJlbCB9fTwvc3ZnOnRleHQ+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENoYXJ0WUF4aXNDb21wb25lbnQgZXh0ZW5kcyBDaGFydENoaWxkIHtcbiAgLyoqIEdhcCBpbiBweCBiZXR3ZWVuIHRoZSBsYWJlbHMgYW5kIHRoZSBwbG90IGVkZ2UuIEBkZWZhdWx0IDggKi9cbiAgQElucHV0KCkgb2Zmc2V0ID0gODtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gZWFjaCBsYWJlbCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIGdldCBsYWJlbFgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5wbG90TGVmdCAtIHRoaXMub2Zmc2V0O1xuICB9XG5cbiAgZ2V0IGxhYmVsQ2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gY24oJ2ZpbGwtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXhzIHRhYnVsYXItbnVtcycsIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBBIGxpbmUgbWFyayBmb3Igb25lIHNlcmllcywgb3B0aW9uYWxseSBtb25vdG9uZS1zbW9vdGhlZCBhbmQgZG90dGVkLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3ZnOmdbdG9sbGUtY2hhcnQtbGluZV0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2ZzpwYXRoXG4gICAgICBbYXR0ci5kXT1cInBhdGhcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cImNvbG9yXCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICBbY2xhc3NdPVwiY2xhc3NcIlxuICAgID48L3N2ZzpwYXRoPlxuICAgIDxzdmc6Y2lyY2xlXG4gICAgICAqbmdGb3I9XCJsZXQgcG9pbnQgb2YgZG90czsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgIFthdHRyLmN4XT1cInBvaW50LnhcIlxuICAgICAgW2F0dHIuY3ldPVwicG9pbnQueVwiXG4gICAgICBbYXR0ci5yXT1cImRvdFJhZGl1c1wiXG4gICAgICBbYXR0ci5maWxsXT1cImNvbG9yXCJcbiAgICAgIGNsYXNzPVwic3Ryb2tlLWJhY2tncm91bmRcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgPjwvc3ZnOmNpcmNsZT5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRMaW5lQ29tcG9uZW50IGV4dGVuZHMgQ2hhcnRDaGlsZCB7XG4gIC8qKiBLZXkgb2YgdGhlIHNlcmllcyB0byBkcmF3LiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBzZXJpZXNLZXkgPSAnJztcbiAgLyoqIEludGVycG9sYXRpb24gYmV0d2VlbiBwb2ludHM7IHNtb290aCBpcyBtb25vdG9uZSBjdWJpYywgc28gaXQgbmV2ZXIgb3ZlcnNob290cy4gQGRlZmF1bHQgJ2xpbmVhcicgKi9cbiAgQElucHV0KCkgY3VydmU6ICdsaW5lYXInIHwgJ3Ntb290aCcgPSAnbGluZWFyJztcbiAgLyoqIERyYXdzIGEgbWFya2VyIGF0IGV2ZXJ5IHBvaW50LiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSBzaG93RG90cyA9IGZhbHNlO1xuICAvKiogTWFya2VyIHJhZGl1cyBpbiBweDsgNCBnaXZlcyB0aGUgOHB4IG1pbmltdW0gZGlhbWV0ZXIuIEBkZWZhdWx0IDQgKi9cbiAgQElucHV0KCkgZG90UmFkaXVzID0gNDtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHBhdGggdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgcGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnZlID09PSAnc21vb3RoJ1xuICAgICAgPyB0aGlzLmNoYXJ0LnNtb290aFBhdGgodGhpcy5zZXJpZXNLZXkpXG4gICAgICA6IHRoaXMuY2hhcnQubGluZVBhdGgodGhpcy5zZXJpZXNLZXkpO1xuICB9XG5cbiAgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQuY29sb3JGb3IodGhpcy5zZXJpZXNLZXkpO1xuICB9XG5cbiAgZ2V0IGRvdHMoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgaW5kZXg6IG51bWJlciB9W10ge1xuICAgIHJldHVybiB0aGlzLnNob3dEb3RzID8gdGhpcy5jaGFydC5wb2ludHNGb3IodGhpcy5zZXJpZXNLZXkpIDogW107XG4gIH1cbn1cblxuLyoqIEEgZmlsbGVkIGFyZWEgZm9yIG9uZSBzZXJpZXM6IGEgbG93LW9wYWNpdHkgd2FzaCB1bmRlciBhIDJweCBzdHJva2UuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdmc6Z1t0b2xsZS1jaGFydC1hcmVhXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3ZnOnBhdGhcbiAgICAgIFthdHRyLmRdPVwiYXJlYVBhdGhcIlxuICAgICAgW2F0dHIuZmlsbF09XCJjb2xvclwiXG4gICAgICBbYXR0ci5maWxsLW9wYWNpdHldPVwiZmlsbE9wYWNpdHlcIlxuICAgICAgc3Ryb2tlPVwibm9uZVwiXG4gICAgPjwvc3ZnOnBhdGg+XG4gICAgPHN2ZzpwYXRoXG4gICAgICBbYXR0ci5kXT1cImxpbmVQYXRoXCJcbiAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgIFthdHRyLnN0cm9rZV09XCJjb2xvclwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgW2NsYXNzXT1cImNsYXNzXCJcbiAgICA+PC9zdmc6cGF0aD5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRBcmVhQ29tcG9uZW50IGV4dGVuZHMgQ2hhcnRDaGlsZCB7XG4gIC8qKiBLZXkgb2YgdGhlIHNlcmllcyB0byBkcmF3LiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBzZXJpZXNLZXkgPSAnJztcbiAgLyoqIEludGVycG9sYXRpb24gYmV0d2VlbiBwb2ludHMuIEBkZWZhdWx0ICdsaW5lYXInICovXG4gIEBJbnB1dCgpIGN1cnZlOiAnbGluZWFyJyB8ICdzbW9vdGgnID0gJ2xpbmVhcic7XG4gIC8qKiBPcGFjaXR5IG9mIHRoZSBmaWxsIOKAlCBhIHdhc2gsIG5ldmVyIGEgc2F0dXJhdGVkIGJsb2NrLiBAZGVmYXVsdCAwLjEgKi9cbiAgQElucHV0KCkgZmlsbE9wYWNpdHkgPSAwLjE7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIHRoZSBzdHJva2UgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICAvKiogQW4gYXJlYSBpcyBhbmNob3JlZCB0byBhIGJhc2VsaW5lLCBzbyB6ZXJvIGhhcyB0byBiZSBpbiB0aGUgZG9tYWluLiAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydC5yZXF1aXJlWmVybygpO1xuICB9XG5cbiAgZ2V0IGFyZWFQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQuYXJlYVBhdGgodGhpcy5zZXJpZXNLZXksIHRoaXMuY3VydmUgPT09ICdzbW9vdGgnKTtcbiAgfVxuXG4gIGdldCBsaW5lUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnZlID09PSAnc21vb3RoJ1xuICAgICAgPyB0aGlzLmNoYXJ0LnNtb290aFBhdGgodGhpcy5zZXJpZXNLZXkpXG4gICAgICA6IHRoaXMuY2hhcnQubGluZVBhdGgodGhpcy5zZXJpZXNLZXkpO1xuICB9XG5cbiAgZ2V0IGNvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQuY29sb3JGb3IodGhpcy5zZXJpZXNLZXkpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGEgYmFyIHdob3NlIGRhdGEgZW5kIGlzIHJvdW5kZWQgYW5kIHdob3NlIGJhc2VsaW5lIGVuZCBzdGF5cyBzcXVhcmUuXG4gKiBIYW5kbGVzIGJvdGggZGlyZWN0aW9ucywgc28gYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgZG93bndhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXJQYXRoKFxuICB4OiBudW1iZXIsXG4gIHdpZHRoOiBudW1iZXIsXG4gIHlCYXNlOiBudW1iZXIsXG4gIHlWYWx1ZTogbnVtYmVyLFxuICByYWRpdXM6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnMoeUJhc2UgLSB5VmFsdWUpO1xuICBjb25zdCByID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ocmFkaXVzLCB3aWR0aCAvIDIsIGhlaWdodCkpO1xuICBjb25zdCByaWdodCA9IHggKyB3aWR0aDtcbiAgLy8gV2hpY2ggd2F5IHRoZSBjb3JuZXIgY3VydmVzIGRlcGVuZHMgb24gd2hpY2ggc2lkZSBvZiB0aGUgYmFzZWxpbmUgd2UgYXJlLlxuICBjb25zdCBzaWduID0geVZhbHVlIDw9IHlCYXNlID8gMSA6IC0xO1xuICBjb25zdCBjb3JuZXIgPSB5VmFsdWUgKyBzaWduICogcjtcblxuICByZXR1cm4gKFxuICAgICdNICcgKyB4ICsgJyAnICsgeUJhc2UgK1xuICAgICcgTCAnICsgeCArICcgJyArIGNvcm5lciArXG4gICAgJyBRICcgKyB4ICsgJyAnICsgeVZhbHVlICsgJyAnICsgKHggKyByKSArICcgJyArIHlWYWx1ZSArXG4gICAgJyBMICcgKyAocmlnaHQgLSByKSArICcgJyArIHlWYWx1ZSArXG4gICAgJyBRICcgKyByaWdodCArICcgJyArIHlWYWx1ZSArICcgJyArIHJpZ2h0ICsgJyAnICsgY29ybmVyICtcbiAgICAnIEwgJyArIHJpZ2h0ICsgJyAnICsgeUJhc2UgKyAnIFonXG4gICk7XG59XG5cbi8qKlxuICogQSBiYXIgbWFyayBmb3Igb25lIHNlcmllcy4gR3JvdXBlZCBiZXNpZGUgaXRzIHNpYmxpbmdzIGJ5IGRlZmF1bHQsIHN0YWNrZWRcbiAqIHdoZW4gdGhlIGNvbnRhaW5lcidzIGBzdGFja2VkYCBpcyBzZXQuIFRoZSBkYXRhIGVuZCBjYXJyaWVzIGEgNHB4IHJhZGl1cywgdGhlXG4gKiBiYXNlbGluZSBlbmQgc3RheXMgc3F1YXJlLCBhbmQgbmVpZ2hib3VycyBhcmUgc2VwYXJhdGVkIGJ5IHN1cmZhY2UsIG5vdCBpbmsuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N2ZzpnW3RvbGxlLWNoYXJ0LWJhcl0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2ZzpwYXRoXG4gICAgICAqbmdGb3I9XCJsZXQgYmFyIG9mIGJhcnM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICBbYXR0ci5kXT1cImJhci5kXCJcbiAgICAgIFthdHRyLmZpbGxdPVwiY29sb3JcIlxuICAgICAgW2F0dHIuZmlsbC1vcGFjaXR5XT1cImJhci5hY3RpdmUgPyAxIDogMC44NVwiXG4gICAgPjwvc3ZnOnBhdGg+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENoYXJ0QmFyQ29tcG9uZW50IGV4dGVuZHMgQ2hhcnRDaGlsZCB7XG4gIC8qKiBLZXkgb2YgdGhlIHNlcmllcyB0byBkcmF3LiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBzZXJpZXNLZXkgPSAnJztcbiAgLyoqIENvcm5lciByYWRpdXMgb24gdGhlIGRhdGEgZW5kIGluIHB4LiBAZGVmYXVsdCA0ICovXG4gIEBJbnB1dCgpIHJhZGl1cyA9IDQ7XG4gIC8qKiBMYXJnZXN0IGJhciB0aGlja25lc3MgaW4gcHg7IGEgd2lkZXIgYmFuZCBiZWNvbWVzIGFpciwgbm90IGEgZmF0dGVyIGJhci4gQGRlZmF1bHQgMjQgKi9cbiAgQElucHV0KCkgbWF4V2lkdGggPSAyNDtcbiAgLyoqIEdhcCBpbiBweCBiZXR3ZWVuIGFkamFjZW50IGJhcnMgYW5kIGJldHdlZW4gc3RhY2tlZCBzZWdtZW50cy4gQGRlZmF1bHQgMiAqL1xuICBASW5wdXQoKSBnYXAgPSAyO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byBlYWNoIGJhciB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIC8qKiBJbmRleCBjdXJyZW50bHkgaG92ZXJlZCwgc28gdGhlIGJhciB1bmRlciB0aGUgcG9pbnRlciBjYW4gbGlmdC4gKi9cbiAgYWN0aXZlSW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBCYXJzIG5lZWQgYSBiYW5kIHNjYWxlIGFuZCBhIHplcm8gYmFzZWxpbmU7IGJvdGggYmVsb25nIHRvIHRoZSB3aG9sZSBjaGFydC4gKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlZ2lzdGVyKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnQudXNlQmFuZFNjYWxlKCk7XG4gIH1cblxuICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmNoYXJ0LmFjdGl2ZUluZGV4JC5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXQgY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5jb2xvckZvcih0aGlzLnNlcmllc0tleSk7XG4gIH1cblxuICAvKiogR2VvbWV0cnkgZm9yIGV2ZXJ5IGJhciB0aGlzIHNlcmllcyBjb250cmlidXRlcy4gKi9cbiAgZ2V0IGJhcnMoKToge1xuICAgIGQ6IHN0cmluZztcbiAgICBhY3RpdmU6IGJvb2xlYW47XG4gICAgeDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgeUJhc2U6IG51bWJlcjtcbiAgICB5VmFsdWU6IG51bWJlcjtcbiAgfVtdIHtcbiAgICBjb25zdCBvdXQ6IHtcbiAgICAgIGQ6IHN0cmluZztcbiAgICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICAgIHg6IG51bWJlcjtcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICB5QmFzZTogbnVtYmVyO1xuICAgICAgeVZhbHVlOiBudW1iZXI7XG4gICAgfVtdID0gW107XG4gICAgY29uc3Qgc2VyaWVzQ291bnQgPSBNYXRoLm1heCgxLCB0aGlzLmNoYXJ0LnNlcmllcy5sZW5ndGgpO1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5jaGFydC5zZXJpZXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmtleSA9PT0gdGhpcy5zZXJpZXNLZXkpO1xuICAgIGNvbnN0IHNsb3RJbmRleCA9IGZvdW5kIDwgMCA/IDAgOiBmb3VuZDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFydC5jb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY2hhcnQudmFsdWVBdCh0aGlzLnNlcmllc0tleSwgaSk7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGJhbmQgPSB0aGlzLmNoYXJ0LmJhbmRGb3IoaSk7XG4gICAgICBsZXQgeDogbnVtYmVyO1xuICAgICAgbGV0IHdpZHRoOiBudW1iZXI7XG5cbiAgICAgIGlmICh0aGlzLmNoYXJ0LnN0YWNrZWQpIHtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1pbih0aGlzLm1heFdpZHRoLCBiYW5kLndpZHRoKTtcbiAgICAgICAgeCA9IGJhbmQuY2VudHJlIC0gd2lkdGggLyAyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2xvdCA9IGJhbmQud2lkdGggLyBzZXJpZXNDb3VudDtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1pbih0aGlzLm1heFdpZHRoLCBNYXRoLm1heCgxLCBzbG90IC0gdGhpcy5nYXApKTtcbiAgICAgICAgeCA9IGJhbmQuc3RhcnQgKyBzbG90ICogc2xvdEluZGV4ICsgKHNsb3QgLSB3aWR0aCkgLyAyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5jaGFydC5zdGFja2VkID8gdGhpcy5jaGFydC5zdGFja0Jhc2UodGhpcy5zZXJpZXNLZXksIGkpIDogMDtcbiAgICAgIGNvbnN0IHlCYXNlID0gdGhpcy5jaGFydC55Rm9yKGJhc2UpO1xuICAgICAgbGV0IHlWYWx1ZSA9IHRoaXMuY2hhcnQueUZvcihiYXNlICsgdmFsdWUpO1xuXG4gICAgICAvLyBUaGUgZ2FwIGJldHdlZW4gc3RhY2tlZCBzZWdtZW50cyBjb21lcyBvZmYgdGhlIGRhdGEgZW5kLCBzbyB3aGF0XG4gICAgICAvLyBzZXBhcmF0ZXMgdGhlbSBpcyBzdXJmYWNlIHNob3dpbmcgdGhyb3VnaCByYXRoZXIgdGhhbiBhIHN0cm9rZS5cbiAgICAgIGlmICh0aGlzLmNoYXJ0LnN0YWNrZWQgJiYgTWF0aC5hYnMoeUJhc2UgLSB5VmFsdWUpID4gdGhpcy5nYXApIHtcbiAgICAgICAgeVZhbHVlICs9IHZhbHVlID49IDAgPyB0aGlzLmdhcCA6IC10aGlzLmdhcDtcbiAgICAgIH1cblxuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBkOiBiYXJQYXRoKHgsIHdpZHRoLCB5QmFzZSwgeVZhbHVlLCB0aGlzLnJhZGl1cyksXG4gICAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVJbmRleCA9PT0gaSxcbiAgICAgICAgeCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIHlCYXNlLFxuICAgICAgICB5VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuIl19
1232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9jaGFydC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQWMsU0FBUyxFQUErQyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMU0sT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBcUIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQTZELE1BQU0saUJBQWlCLENBQUM7OztBQUkxRyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFFaEI7Ozs7R0FJRztBQUVILE1BQU0sT0FBZ0IsVUFBVTtJQUM5Qjs7OztPQUlHO0lBQ0gsV0FBVztRQUNULElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVrQixLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdCLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNoQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUV0RDs7Ozs7T0FLRztJQUNILFlBQVksR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO0lBRWhELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFD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QUFDLEdBQUcsQ0FBQztZQUNqRCxDQUFDO1lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDUCxDQUFDLEVBQUUsVUFBVTtvQkFDWCxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQ3pELENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxLQUFLLENBQUM7Z0JBQzlCLENBQUM7Z0JBQ0QsS0FBSztnQkFDTCxLQUFLO2dCQUNMLE1BQU07YUFDUCxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO3dHQXZHVSxpQkFBaUI7NEZBQWpCLGlCQUFpQixpTkFUbEI7Ozs7Ozs7R0FPVCwyREFUUyxZQUFZOzs0RkFXWCxpQkFBaUI7a0JBZDdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztvQkFDdkIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRTs7Ozs7OztHQU9UO2lCQUNGOzhCQUdVLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRGlyZWN0aXZlLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7IENoYXJ0U2VydmljZSwgdHlwZSBDaGFydFNlcmllcywgdHlwZSBDaGFydE1hcmdpbiwgdHlwZSBDaGFydE9yaWVudGF0aW9uIH0gZnJvbSAnLi9jaGFydC5zZXJ2aWNlJztcblxuZXhwb3J0IHR5cGUgeyBDaGFydFNlcmllcywgQ2hhcnRNYXJnaW4sIENoYXJ0VGljaywgQ2hhcnRCYW5kLCBDaGFydE9yaWVudGF0aW9uIH0gZnJvbSAnLi9jaGFydC5zZXJ2aWNlJztcblxubGV0IGNoYXJ0SWQgPSAwO1xuXG4vKipcbiAqIEJhc2UgZm9yIGV2ZXJ5IGNoYXJ0IHBhcnQgdGhhdCBoYXMgdG8gcmVkcmF3IHdoZW4gdGhlIHNoYXJlZCBzY2FsZXMgY2hhbmdlLlxuICogUGFydHMgc3Vic2NyaWJlIHRvIHRoZSBzZXJ2aWNlIHJhdGhlciB0aGFuIHJlYWRpbmcgdGhlIGNvbnRhaW5lciBjb21wb25lbnQsXG4gKiBzbyBhbiBPblB1c2ggY2hpbGQgc3RpbGwgdXBkYXRlcyB3aGVuIHRoZSBjb250YWluZXIncyBpbnB1dHMgb3Igd2lkdGggY2hhbmdlLlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGFydENoaWxkIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBBbmd1bGFyIHdyaXRlcyBhIGJvdW5kIGBjbGFzc2AgaW5wdXQgdGhyb3VnaCBpdHMgc3R5bGluZyBwYXRoLCB3aGljaCBkb2VzXG4gICAqIG5vdCBtYXJrIGFuIE9uUHVzaCBjb21wb25lbnQgZGlydHkg4oCUIHdpdGhvdXQgdGhpcyBob29rIHN1YmNsYXNzZXMga2VlcFxuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIHRoZXkgd2VyZSBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBjaGFydCA9IGluamVjdChDaGFydFNlcnZpY2UpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgLyoqXG4gICAqIElkZW50aXR5IGZvciB0aGUgbWFyayBgKm5nRm9yYHMuIFRoZSBjb2xsZWN0aW9ucyBiZWhpbmQgdGhlbSBhcmUgcmVidWlsdCBvblxuICAgKiBldmVyeSByZWFkLCBzbyB3aXRob3V0IHRoaXMgYCpuZ0ZvcmAgc2VlcyBuZXcgaWRlbnRpdGllcyBlYWNoIHBhc3MgYW5kXG4gICAqIHJlcGxhY2VzIGV2ZXJ5IG5vZGUgaW5zdGVhZCBvZiBwYXRjaGluZyBpdC4gTWFya3MgYXJlIHBvc2l0aW9uYWwsIHNvIHRoZVxuICAgKiBpbmRleCBJUyB0aGUgaWRlbnRpdHkuXG4gICAqL1xuICB0cmFja0J5SW5kZXggPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmNoYXJ0LmxheW91dCQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBIb29rIGZvciBwYXJ0cyB0aGF0IG5lZWQgdG8gaW5mbHVlbmNlIHRoZSBzaGFyZWQgc2NhbGVzIGJlZm9yZSBmaXJzdCBwYWludC4gKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyKCk6IHZvaWQge31cbn1cblxuLyoqXG4gKiBUaGUgZmxvYXRpbmcgcmVhZG91dCBmb3IgdGhlIGhvdmVyZWQgeCBwb3NpdGlvbi4gTGlzdHMgZXZlcnkgc2VyaWVzIGF0IHRoYXRcbiAqIHgsIHNvIHRoZSBwb2ludGVyIG5ldmVyIGhhcyB0byBsYW5kIG9uIGEgcGFydGljdWxhciBsaW5lIHRvIGdldCBhIHZhbHVlLlxuICogUmVuZGVyZWQgYXV0b21hdGljYWxseSBieSBgdG9sbGUtY2hhcnRgIHdoZW4gYGhvdmVyYCBpcyBvbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtY2hhcnQtdG9vbHRpcCcsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImluZGV4ICE9PSBudWxsXCJcbiAgICAgIHJvbGU9XCJzdGF0dXNcIlxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgIFtjbGFzc109XCJjb21wdXRlZENsYXNzXCJcbiAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImxlZnRcIlxuICAgICAgW3N0eWxlLnRvcC5weF09XCJ0b3BcIlxuICAgID5cbiAgICAgIDxwIGNsYXNzPVwibWItMSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiPnt7IHhMYWJlbCB9fTwvcD5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQteHNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoLTAuNSB3LTMgc2hyaW5rLTAgcm91bmRlZC1mdWxsXCIgW3N0eWxlLmJhY2tncm91bmRdPVwicm93LmNvbG9yXCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtbC1hdXRvIGZvbnQtbWVkaXVtIHRhYnVsYXItbnVtcyB0ZXh0LWZvcmVncm91bmRcIj57eyByb3cudmFsdWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRUb29sdGlwQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIEFuZ3VsYXIgd3JpdGVzIGEgYm91bmQgYGNsYXNzYCBpbnB1dCB0aHJvdWdoIGl0cyBzdHlsaW5nIHBhdGgsIHdoaWNoIGRvZXNcbiAgICogbm90IG1hcmsgYW4gT25QdXNoIGNvbXBvbmVudCBkaXJ0eSDigJQgd2l0aG91dCB0aGlzIGhvb2sgdGhlIGNvbXBvbmVudCBrZWVwc1xuICAgKiByZW5kZXJpbmcgdGhlIGNsYXNzIGl0IHdhcyBib3JuIHdpdGguXG4gICAqL1xuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBJZGVudGl0eSBmb3IgYCpuZ0ZvcmAsIHNvIGEgcmVkcmF3IHBhdGNoZXMgbm9kZXMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlbS4gKi9cbiAgdHJhY2tCeUluZGV4ID0gKGluZGV4OiBudW1iZXIpOiBudW1iZXIgPT4gaW5kZXg7XG5cbiAgLyoqIERpc3RhbmNlIGluIHB4IHRoZSB0b29sdGlwIHNpdHMgZnJvbSB0aGUgY3Jvc3NoYWlyLiBAZGVmYXVsdCAxMiAqL1xuICBASW5wdXQoKSBvZmZzZXQgPSAxMjtcbiAgLyoqIEFzc3VtZWQgdG9vbHRpcCB3aWR0aCBpbiBweCwgdXNlZCB0byBmbGlwIGl0IG5lYXIgdGhlIHJpZ2h0IGVkZ2UuIEBkZWZhdWx0IDE2MCAqL1xuICBASW5wdXQoKSBlc3RpbWF0ZWRXaWR0aCA9IDE2MDtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHRvb2x0aXAgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0ID0gaW5qZWN0KENoYXJ0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8qKiBSb3cgaW5kZXggdGhlIHRvb2x0aXAgaXMgZGVzY3JpYmluZywgb3IgbnVsbCB3aGVuIG5vdGhpbmcgaXMgaG92ZXJlZC4gKi9cbiAgaW5kZXg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLmNoYXJ0LmFjdGl2ZUluZGV4JC5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmNoYXJ0LmxheW91dCQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGdldCB4TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gbnVsbCA/ICcnIDogdGhpcy5jaGFydC54TGFiZWxzW3RoaXMuaW5kZXhdID8/ICcnO1xuICB9XG5cbiAgLyoqIE9uZSByb3cgcGVyIHNlcmllczogY29sb3VyIGtleSwgbGFiZWwsIGFuZCB0aGUgZm9ybWF0dGVkIHZhbHVlLiAqL1xuICBnZXQgcm93cygpOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgaWYgKGluZGV4ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQuc2VyaWVzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNoYXJ0LnZhbHVlQXQoaXRlbS5rZXksIGluZGV4KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICB2YWx1ZTogdmFsdWUgPT0gbnVsbCA/ICfigJQnIDogdGhpcy5jaGFydC5mb3JtYXRWYWx1ZSh2YWx1ZSksXG4gICAgICAgIGNvbG9yOiB0aGlzLmNoYXJ0LmNvbG9yRm9yKGl0ZW0ua2V5KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGVmdCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmluZGV4ID09PSBudWxsKSByZXR1cm4gMDtcbiAgICBjb25zdCB4ID0gdGhpcy5jaGFydC54Rm9yKHRoaXMuaW5kZXgpO1xuICAgIC8vIEZsaXAgdG8gdGhlIGxlZnQgb2YgdGhlIGNyb3NzaGFpciByYXRoZXIgdGhhbiBvdmVyZmxvdyB0aGUgY29udGFpbmVyLlxuICAgIGlmICh4ICsgdGhpcy5vZmZzZXQgKyB0aGlzLmVzdGltYXRlZFdpZHRoID4gdGhpcy5jaGFydC53aWR0aCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHggLSB0aGlzLm9mZnNldCAtIHRoaXMuZXN0aW1hdGVkV2lkdGgpO1xuICAgIH1cbiAgICByZXR1cm4geCArIHRoaXMub2Zmc2V0O1xuICB9XG5cbiAgZ2V0IHRvcCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0LnBsb3RUb3A7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAncG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSB6LTEwIG1pbi13LVs4cmVtXSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLXBvcG92ZXIgcC0yIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIHNoYWRvdy1tZCcsXG4gICAgICB0aGlzLmNsYXNzXG4gICAgKTtcbiAgfVxufVxuXG5jb25zdCBjaGFydExlZ2VuZFZhcmlhbnRzID0gY3ZhKCdmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLXgtNCBnYXAteS0xIHB0LTInLCB7XG4gIHZhcmlhbnRzOiB7XG4gICAgYWxpZ246IHsgc3RhcnQ6ICdqdXN0aWZ5LXN0YXJ0JywgY2VudGVyOiAnanVzdGlmeS1jZW50ZXInLCBlbmQ6ICdqdXN0aWZ5LWVuZCcgfSxcbiAgICBzaXplOiB7IHNtOiAndGV4dC1bMTFweF0nLCBkZWZhdWx0OiAndGV4dC14cycgfSxcbiAgfSxcbiAgZGVmYXVsdFZhcmlhbnRzOiB7IGFsaWduOiAnY2VudGVyJywgc2l6ZTogJ2RlZmF1bHQnIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgQ2hhcnRMZWdlbmRQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgY2hhcnRMZWdlbmRWYXJpYW50cz47XG5cbi8qKlxuICogU3dhdGNoIGFuZCBsYWJlbCBwZXIgc2VyaWVzLiBSZW5kZXJlZCBhdXRvbWF0aWNhbGx5IGJ5IGB0b2xsZS1jaGFydGAgd2hlbmV2ZXJcbiAqIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBzZXJpZXMsIHNvIGlkZW50aXR5IGlzIG5ldmVyIGNhcnJpZWQgYnkgY29sb3VyIGFsb25lLlxuICogQSBzaW5nbGUgc2VyaWVzIGdldHMgbm8gbGVnZW5kIOKAlCB0aGUgY2hhcnQncyBvd24gbGFiZWwgYWxyZWFkeSBuYW1lcyBpdC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtY2hhcnQtbGVnZW5kJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDx1bCBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgPGxpICpuZ0Zvcj1cImxldCBlbnRyeSBvZiBlbnRyaWVzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjVcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoLTIgdy0yIHNocmluay0wIHJvdW5kZWQtWzJweF1cIiBbc3R5bGUuYmFja2dyb3VuZF09XCJlbnRyeS5jb2xvclwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmRcIj57eyBlbnRyeS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRMZWdlbmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIElkZW50aXR5IGZvciBgKm5nRm9yYCwgc28gYSByZWRyYXcgcGF0Y2hlcyBub2RlcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLiAqL1xuICB0cmFja0J5SW5kZXggPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICAvKiogSG9yaXpvbnRhbCBhbGlnbm1lbnQgb2YgdGhlIGxlZ2VuZCByb3cuIEBkZWZhdWx0ICdjZW50ZXInICovXG4gIEBJbnB1dCgpIGFsaWduOiBDaGFydExlZ2VuZFByb3BzWydhbGlnbiddID0gJ2NlbnRlcic7XG4gIC8qKiBUZXh0IHNpemUgb2YgdGhlIGxlZ2VuZC4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHNpemU6IENoYXJ0TGVnZW5kUHJvcHNbJ3NpemUnXSA9ICdkZWZhdWx0JztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIGxlZ2VuZCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhcnQgPSBpbmplY3QoQ2hhcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmNoYXJ0LmxheW91dCQuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKiBPbmUgZW50cnkgcGVyIHNlcmllcywgY29sb3VyZWQgYnkgc2VyaWVzIGlkZW50aXR5LiAqL1xuICBnZXQgZW50cmllcygpOiB7IGxhYmVsOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5zZXJpZXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgbGFiZWw6IGl0ZW0ubGFiZWwsXG4gICAgICBjb2xvcjogdGhpcy5jaGFydC5jb2xvckZvcihpdGVtLmtleSksXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGNoYXJ0TGVnZW5kVmFyaWFudHMoeyBhbGlnbjogdGhpcy5hbGlnbiwgc2l6ZTogdGhpcy5zaXplIH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuXG5jb25zdCBjaGFydFRhYmxlVmFyaWFudHMgPSBjdmEoJ3ctZnVsbCB0ZXh0LWxlZnQgdGV4dC14cycsIHtcbiAgdmFyaWFudHM6IHtcbiAgICB2aXNpYmxlOiB7XG4gICAgICB0cnVlOiAnbXQtNCBib3JkZXItY29sbGFwc2UnLFxuICAgICAgZmFsc2U6ICdzci1vbmx5JyxcbiAgICB9LFxuICB9LFxuICBkZWZhdWx0VmFyaWFudHM6IHsgdmlzaWJsZTogZmFsc2UgfSxcbn0pO1xuXG5leHBvcnQgdHlwZSBDaGFydFRhYmxlUHJvcHMgPSBWYXJpYW50UHJvcHM8dHlwZW9mIGNoYXJ0VGFibGVWYXJpYW50cz47XG5cbi8qKlxuICogVGhlIGNoYXJ0J3MgZGF0YSBhcyBhIHJlYWwgYDx0YWJsZT5gLiBWaXN1YWxseSBoaWRkZW4gYnkgZGVmYXVsdCBhbmQgcG9pbnRlZFxuICogYXQgYnkgdGhlIHN2ZydzIGBhcmlhLWRlc2NyaWJlZGJ5YCwgc28gZXZlcnkgdmFsdWUgdGhlIGNoYXJ0IGVuY29kZXMgaW5cbiAqIGNvbG91ciBzdGF5cyByZWFjaGFibGUgd2l0aG91dCBzZWVpbmcgb3IgaG92ZXJpbmcgaXQuIFNldCBgdmlzaWJsZWAgdG8gc2hvdyBpdC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtY2hhcnQtdGFibGUnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbYXR0ci5pZF09XCJ0YWJsZUlkIHx8IG51bGxcIj5cbiAgICAgIDx0YWJsZSBbY2xhc3NdPVwiY29tcHV0ZWRDbGFzc1wiPlxuICAgICAgICA8Y2FwdGlvbiBjbGFzcz1cInNyLW9ubHlcIj57eyBjYXB0aW9uIH19PC9jYXB0aW9uPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJib3JkZXItYiBib3JkZXItYm9yZGVyIHB4LTIgcHktMSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgICAgICAgICAge3sgeEhlYWRlciB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjaGFydC5zZXJpZXM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJib3JkZXItYiBib3JkZXItYm9yZGVyIHB4LTIgcHktMSBmb250LW1lZGl1bSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBpdGVtLmxhYmVsIH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiIGNsYXNzPVwiYm9yZGVyLWIgYm9yZGVyLWJvcmRlciBweC0yIHB5LTEgZm9udC1ub3JtYWwgdGV4dC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICAgIHt7IHJvdy5sYWJlbCB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3cuY2VsbHM7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYm9yZGVyLWIgYm9yZGVyLWJvcmRlciBweC0yIHB5LTEgdGFidWxhci1udW1zIHRleHQtZm9yZWdyb3VuZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGNlbGwgfX1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENoYXJ0VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQW5ndWxhciB3cml0ZXMgYSBib3VuZCBgY2xhc3NgIGlucHV0IHRocm91Z2ggaXRzIHN0eWxpbmcgcGF0aCwgd2hpY2ggZG9lc1xuICAgKiBub3QgbWFyayBhbiBPblB1c2ggY29tcG9uZW50IGRpcnR5IOKAlCB3aXRob3V0IHRoaXMgaG9vayB0aGUgY29tcG9uZW50IGtlZXBzXG4gICAqIHJlbmRlcmluZyB0aGUgY2xhc3MgaXQgd2FzIGJvcm4gd2l0aC5cbiAgICovXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIElkZW50aXR5IGZvciBgKm5nRm9yYCwgc28gYSByZWRyYXcgcGF0Y2hlcyBub2RlcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLiAqL1xuICB0cmFja0J5SW5kZXggPSAoaW5kZXg6IG51bWJlcik6IG51bWJlciA9PiBpbmRleDtcblxuICAvKiogU2hvd3MgdGhlIHRhYmxlIGluc3RlYWQgb2YgaGlkaW5nIGl0IGZyb20gc2lnaHRlZCByZWFkZXJzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICBASW5wdXQoKSB2aXNpYmxlID0gZmFsc2U7XG4gIC8qKiBJZCBhcHBsaWVkIHRvIHRoZSB3cmFwcGVyLCBmb3IgdGhlIGNoYXJ0J3MgYGFyaWEtZGVzY3JpYmVkYnlgLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSB0YWJsZUlkID0gJyc7XG4gIC8qKiBDb2x1bW4gaGVhZGVyIGZvciB0aGUgeCBjYXRlZ29yeS4gQGRlZmF1bHQgJ0NhdGVnb3J5JyAqL1xuICBASW5wdXQoKSB4SGVhZGVyID0gJ0NhdGVnb3J5JztcbiAgLyoqIEFjY2Vzc2libGUgY2FwdGlvbiBmb3IgdGhlIHRhYmxlLiBAZGVmYXVsdCAnQ2hhcnQgZGF0YScgKi9cbiAgQElucHV0KCkgY2FwdGlvbiA9ICdDaGFydCBkYXRhJztcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHRhYmxlIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYXJ0ID0gaW5qZWN0KENoYXJ0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5jaGFydC5sYXlvdXQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKiogT25lIHJvdyBwZXIgeCBwb3NpdGlvbiwgd2l0aCBhIGZvcm1hdHRlZCBjZWxsIHBlciBzZXJpZXMuICovXG4gIGdldCByb3dzKCk6IHsgbGFiZWw6IHN0cmluZzsgY2VsbHM6IHN0cmluZ1tdIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQueExhYmVscy5tYXAoKGxhYmVsLCBpKSA9PiAoe1xuICAgICAgbGFiZWwsXG4gICAgICBjZWxsczogdGhpcy5jaGFydC5zZXJpZXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jaGFydC52YWx1ZUF0KGl0ZW0ua2V5LCBpKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAn4oCUJyA6IHRoaXMuY2hhcnQuZm9ybWF0VmFsdWUodmFsdWUpO1xuICAgICAgfSksXG4gICAgfSkpO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKGNoYXJ0VGFibGVWYXJpYW50cyh7IHZpc2libGU6IHRoaXMudmlzaWJsZSB9KSwgdGhpcy5jbGFzcyk7XG4gIH1cbn1cblxuY29uc3QgY2hhcnRWYXJpYW50cyA9IGN2YSgncmVsYXRpdmUgdy1mdWxsJywge1xuICB2YXJpYW50czoge1xuICAgIHZhcmlhbnQ6IHtcbiAgICAgIGRlZmF1bHQ6ICcnLFxuICAgICAgY2FyZDogJ3JvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctYmFja2dyb3VuZCBwLTQnLFxuICAgIH0sXG4gICAgZGVuc2l0eToge1xuICAgICAgZGVmYXVsdDogJycsXG4gICAgICBjb21wYWN0OiAndGV4dC14cycsXG4gICAgfSxcbiAgfSxcbiAgZGVmYXVsdFZhcmlhbnRzOiB7IHZhcmlhbnQ6ICdkZWZhdWx0JywgZGVuc2l0eTogJ2RlZmF1bHQnIH0sXG59KTtcblxuZXhwb3J0IHR5cGUgQ2hhcnRQcm9wcyA9IFZhcmlhbnRQcm9wczx0eXBlb2YgY2hhcnRWYXJpYW50cz47XG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBhIGhhbmQtcm9sbGVkIFNWRyBjaGFydC4gT3ducyB0aGUgcmVzcG9uc2l2ZSBgPHN2Zz5gLCB0aGVcbiAqIHNoYXJlZCBzY2FsZXMgKHZpYSB0aGUgYENoYXJ0U2VydmljZWAgaXQgcHJvdmlkZXMpLCB0aGUgaG92ZXIgbGF5ZXIsIHRoZVxuICogbGVnZW5kIGFuZCB0aGUgYWNjZXNzaWJsZSB0YWJsZSBmYWxsYmFjay5cbiAqXG4gKiBNYXJrcyBhbmQgYXhlcyBhcmUgcHJvamVjdGVkIGFzIFNWRyBjaGlsZHJlbi4gVGhleSB1c2UgYXR0cmlidXRlIHNlbGVjdG9ycyBvblxuICogYHN2ZzpnYCByYXRoZXIgdGhhbiBlbGVtZW50IHNlbGVjdG9ycywgYmVjYXVzZSBhIGN1c3RvbSBlbGVtZW50IGlzIGNyZWF0ZWQgaW5cbiAqIHRoZSBIVE1MIG5hbWVzcGFjZSBhbmQgYW4gSFRNTCBlbGVtZW50IGluc2lkZSBhbiBgPHN2Zz5gIG5ldmVyIHJlbmRlcnMgaXRzXG4gKiBTVkcgc3VidHJlZTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8dG9sbGUtY2hhcnQgW2RhdGFdPVwicm93c1wiIFtzZXJpZXNdPVwic2VyaWVzXCIgeEtleT1cIm1vbnRoXCIgYXJpYUxhYmVsPVwiUmV2ZW51ZVwiPlxuICogICA8c3ZnOmcgdG9sbGUtY2hhcnQtZ3JpZD48L3N2ZzpnPlxuICogICA8c3ZnOmcgdG9sbGUtY2hhcnQteS1heGlzPjwvc3ZnOmc+XG4gKiAgIDxzdmc6ZyB0b2xsZS1jaGFydC14LWF4aXM+PC9zdmc6Zz5cbiAqICAgPHN2ZzpnIHRvbGxlLWNoYXJ0LWxpbmUgc2VyaWVzS2V5PVwicmV2ZW51ZVwiIGN1cnZlPVwic21vb3RoXCI+PC9zdmc6Zz5cbiAqIDwvdG9sbGUtY2hhcnQ+XG4gKiBgYGBcbiAqXG4gKiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2Vjb25kYXJ5IHktYXhpczogdHdvIG1lYXN1cmVzIG9uIHR3byBzY2FsZXMgaW4gb25lXG4gKiBmcmFtZSBsZXQgdGhlIGF1dGhvciBjaG9vc2Ugd2hlcmUgdGhlIGxpbmVzIGNyb3NzLCBzbyB0aGUgcmVhZGVyIHNlZXMgYVxuICogcmVsYXRpb25zaGlwIHRoZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4uIFVzZSB0d28gY2hhcnRzLCBzbWFsbCBtdWx0aXBsZXMsIG9yXG4gKiBpbmRleCBib3RoIHNlcmllcyB0byBhIGNvbW1vbiBiYXNlIGluc3RlYWQuXG4gKiBAbmV3XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLWNoYXJ0JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgQ2hhcnRUb29sdGlwQ29tcG9uZW50LCBDaGFydExlZ2VuZENvbXBvbmVudCwgQ2hhcnRUYWJsZUNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0NoYXJ0U2VydmljZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNvbXB1dGVkQ2xhc3NcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSB3LWZ1bGxcIiAjcGxvdD5cbiAgICAgICAgPHN2Z1xuICAgICAgICAgIHJvbGU9XCJpbWdcIlxuICAgICAgICAgIHdpZHRoPVwiMTAwJVwiXG4gICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICAgICAgW2F0dHIudmlld0JveF09XCJ2aWV3Qm94XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCB8fCBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInRhYmxlSWRcIlxuICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdy1mdWxsIG92ZXJmbG93LXZpc2libGVcIlxuICAgICAgICAgIChwb2ludGVybGVhdmUpPVwib25Qb2ludGVyTGVhdmUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8dGl0bGU+e3sgYXJpYUxhYmVsIH19PC90aXRsZT5cbiAgICAgICAgICA8ZGVzYz57eyBkZXNjcmlwdGlvbiB8fCBhcmlhTGFiZWwgfX08L2Rlc2M+XG5cbiAgICAgICAgICA8c3ZnOmc+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgPC9zdmc6Zz5cblxuICAgICAgICAgIDxzdmc6bGluZVxuICAgICAgICAgICAgKm5nSWY9XCJjcm9zc2hhaXJYICE9PSBudWxsXCJcbiAgICAgICAgICAgIFthdHRyLngxXT1cImNyb3NzaGFpclhcIlxuICAgICAgICAgICAgW2F0dHIueDJdPVwiY3Jvc3NoYWlyWFwiXG4gICAgICAgICAgICBbYXR0ci55MV09XCJjaGFydC5wbG90VG9wXCJcbiAgICAgICAgICAgIFthdHRyLnkyXT1cImNoYXJ0LnBsb3RCb3R0b21cIlxuICAgICAgICAgICAgY2xhc3M9XCJwb2ludGVyLWV2ZW50cy1ub25lIHN0cm9rZS1ib3JkZXJcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgPjwvc3ZnOmxpbmU+XG5cbiAgICAgICAgICA8c3ZnOnJlY3RcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGhpdFJlY3RzOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxuICAgICAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgIChwb2ludGVyZW50ZXIpPVwib25FbnRlckJhbmQoaSlcIlxuICAgICAgICAgID48L3N2ZzpyZWN0PlxuICAgICAgICA8L3N2Zz5cblxuICAgICAgICA8dG9sbGUtY2hhcnQtdG9vbHRpcCAqbmdJZj1cImhvdmVyXCI+PC90b2xsZS1jaGFydC10b29sdGlwPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDx0b2xsZS1jaGFydC1sZWdlbmQgKm5nSWY9XCJzZXJpZXMubGVuZ3RoID4gMVwiPjwvdG9sbGUtY2hhcnQtbGVnZW5kPlxuXG4gICAgICA8dG9sbGUtY2hhcnQtdGFibGUgW3RhYmxlSWRdPVwidGFibGVJZFwiIFt2aXNpYmxlXT1cInNob3dUYWJsZVwiIFt4SGVhZGVyXT1cInhIZWFkZXJcIj48L3RvbGxlLWNoYXJ0LXRhYmxlPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKiogSWRlbnRpdHkgZm9yIGAqbmdGb3JgLCBzbyBhIHJlZHJhdyBwYXRjaGVzIG5vZGVzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uICovXG4gIHRyYWNrQnlJbmRleCA9IChpbmRleDogbnVtYmVyKTogbnVtYmVyID0+IGluZGV4O1xuXG4gIC8qKiBSb3dzIHRvIHBsb3QsIGluIHggb3JkZXIuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5bXSA9IFtdO1xuICAvKiogU2VyaWVzIHRvIGRyYXcsIGluIHRoZSBvcmRlciB0aGV5IHRha2UgcGFsZXR0ZSBzdGVwcyBgLS1jaGFydC0xYC4uYC0tY2hhcnQtNWAuIEBkZWZhdWx0IFtdICovXG4gIEBJbnB1dCgpIHNlcmllczogQ2hhcnRTZXJpZXNbXSA9IFtdO1xuICAvKiogUm93IGtleSBob2xkaW5nIGVhY2ggcm93J3MgeCBjYXRlZ29yeSBsYWJlbC4gQGRlZmF1bHQgJycgKi9cbiAgQElucHV0KCkgeEtleSA9ICcnO1xuICAvKiogSGVpZ2h0IG9mIHRoZSBjaGFydCBpbiBweC4gQGRlZmF1bHQgMjYwICovXG4gIEBJbnB1dCgpIGhlaWdodCA9IDI2MDtcbiAgLyoqIFNwYWNlIHJlc2VydmVkIGFyb3VuZCB0aGUgcGxvdCBmb3IgYXhpcyBsYWJlbHMuIEBkZWZhdWx0IHsgdG9wOiA4LCByaWdodDogOCwgYm90dG9tOiAyNCwgbGVmdDogNDQgfSAqL1xuICBASW5wdXQoKSBtYXJnaW46IENoYXJ0TWFyZ2luID0geyB0b3A6IDgsIHJpZ2h0OiA4LCBib3R0b206IDI0LCBsZWZ0OiA0NCB9O1xuICAvKiogQWNjZXNzaWJsZSBuYW1lIGZvciB0aGUgY2hhcnQsIHVzZWQgYXMgdGhlIHN2ZyBgPHRpdGxlPmAuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbCA9ICcnO1xuICAvKiogTG9uZ2VyIHN1bW1hcnkgdXNlZCBhcyB0aGUgc3ZnIGA8ZGVzYz5gLiBGYWxscyBiYWNrIHRvIGBhcmlhTGFiZWxgLiBAZGVmYXVsdCAnJyAqL1xuICBASW5wdXQoKSBkZXNjcmlwdGlvbiA9ICcnO1xuICAvKiogU3RhY2tzIG1hcmtzIG9uIGEgc2hhcmVkIGJhc2VsaW5lIGluc3RlYWQgb2YgZ3JvdXBpbmcgdGhlbS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgc3RhY2tlZCA9IGZhbHNlO1xuICAvKipcbiAgICogV2hpY2ggcGh5c2ljYWwgYXhpcyBjYXJyaWVzIHRoZSBjYXRlZ29yeSB2cyB0aGUgdmFsdWUuIE9ubHkgYmFycyBzdXBwb3J0XG4gICAqICdob3Jpem9udGFsJyDigJQgbGluZS9hcmVhIG1hcmtzIHN0YXkgdmVydGljYWwgcmVnYXJkbGVzcy4gQGRlZmF1bHQgJ3ZlcnRpY2FsJ1xuICAgKi9cbiAgQElucHV0KCkgb3JpZW50YXRpb246IENoYXJ0T3JpZW50YXRpb24gPSAndmVydGljYWwnO1xuICAvKiogUmVuZGVycyB0aGUgY3Jvc3NoYWlyLCBoaXQgbGF5ZXIgYW5kIHNoYXJlZCB0b29sdGlwLiBAZGVmYXVsdCB0cnVlICovXG4gIEBJbnB1dCgpIGhvdmVyID0gdHJ1ZTtcbiAgLyoqIFNob3dzIHRoZSBkYXRhIHRhYmxlIGluc3RlYWQgb2YgbGVhdmluZyBpdCB2aXN1YWxseSBoaWRkZW4uIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIHNob3dUYWJsZSA9IGZhbHNlO1xuICAvKiogQ29sdW1uIGhlYWRlciB0aGUgdGFibGUgZmFsbGJhY2sgZ2l2ZXMgdGhlIHggY2F0ZWdvcnkuIEBkZWZhdWx0ICdDYXRlZ29yeScgKi9cbiAgQElucHV0KCkgeEhlYWRlciA9ICdDYXRlZ29yeSc7XG4gIC8qKiBWaXN1YWwgdHJlYXRtZW50IG9mIHRoZSBjaGFydCBmcmFtZS4gQGRlZmF1bHQgJ2RlZmF1bHQnICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IENoYXJ0UHJvcHNbJ3ZhcmlhbnQnXSA9ICdkZWZhdWx0JztcbiAgLyoqIFRleHQgZGVuc2l0eSBvZiB0aGUgY2hhcnQgY2hyb21lLiBAZGVmYXVsdCAnZGVmYXVsdCcgKi9cbiAgQElucHV0KCkgZGVuc2l0eTogQ2hhcnRQcm9wc1snZGVuc2l0eSddID0gJ2RlZmF1bHQnO1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgY2hhcnQgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICAvKiogRW1pdHRlZCB3aXRoIHRoZSBob3ZlcmVkIHJvdyBpbmRleCwgb3IgbnVsbCB3aGVuIHRoZSBwb2ludGVyIGxlYXZlcy4gKi9cbiAgQE91dHB1dCgpIGFjdGl2ZUluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXIgfCBudWxsPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3Bsb3QnKSBwbG90UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYXJ0ID0gaW5qZWN0KENoYXJ0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgLyoqIFdpZHRoIHVzZWQgdW50aWwgdGhlIGNvbnRhaW5lciBoYXMgYmVlbiBtZWFzdXJlZC4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IGZhbGxiYWNrV2lkdGggPSA2MDA7XG5cbiAgLyoqIElkIG9mIHRoZSB0YWJsZSBmYWxsYmFjaywgcmVmZXJlbmNlZCBieSB0aGUgc3ZnJ3MgYGFyaWEtZGVzY3JpYmVkYnlgLiAqL1xuICByZWFkb25seSB0YWJsZUlkID0gJ2NoYXJ0LXRhYmxlLScgKyBjaGFydElkKys7XG5cbiAgLyoqIFggb2YgdGhlIGNyb3NzaGFpciwgb3IgbnVsbCB3aGVuIG5vdGhpbmcgaXMgaG92ZXJlZCBvciB0aGUgc2NhbGUgaXMgYmFuZGVkLiAqL1xuICBjcm9zc2hhaXJYOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuY2hhcnQubGF5b3V0JC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jZHIubWFya0ZvckNoZWNrKCkpKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5jaGFydC5hY3RpdmVJbmRleCQuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAvLyBCYXJzIGNhcnJ5IHRoZWlyIG93biBob3ZlciBzdGF0ZTsgYSBjcm9zc2hhaXIgYmVsb25ncyB0byBwb2ludCBzY2FsZXMuXG4gICAgICAgIHRoaXMuY3Jvc3NoYWlyWCA9XG4gICAgICAgICAgaW5kZXggIT0gbnVsbCAmJiB0aGlzLmNoYXJ0Lm1vZGUgPT09ICdwb2ludCcgPyB0aGlzLmNoYXJ0LnhGb3IoaW5kZXgpIDogbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleENoYW5nZS5lbWl0KGluZGV4KTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2goKTtcbiAgXG4gICAgLy8gQSBib3VuZCBgY2xhc3NgIGlucHV0IGlzIHdyaXR0ZW4gdGhyb3VnaCBBbmd1bGFyJ3Mgc3R5bGluZyBwYXRoLFxuICAgIC8vIHdoaWNoIGRvZXMgbm90IG1hcmsgYW4gT25QdXNoIHZpZXcgZGlydHkgb24gaXRzIG93bi5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5wbG90UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghaG9zdCkgcmV0dXJuO1xuICAgIHRoaXMubWVhc3VyZShob3N0KTtcblxuICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgdGhpcy5tZWFzdXJlKGhvc3QpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKGhvc3QpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZWFzdXJlKGhvc3Q6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgY29uc3Qgd2lkdGggPSBob3N0LmNsaWVudFdpZHRoIHx8IENoYXJ0Q29tcG9uZW50LmZhbGxiYWNrV2lkdGg7XG4gICAgaWYgKHdpZHRoID09PSB0aGlzLmNoYXJ0LndpZHRoKSByZXR1cm47XG4gICAgdGhpcy5jaGFydC5jb25maWd1cmUoeyB3aWR0aCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcHVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0LmNvbmZpZ3VyZSh7XG4gICAgICBkYXRhOiB0aGlzLmRhdGEgPz8gW10sXG4gICAgICBzZXJpZXM6IHRoaXMuc2VyaWVzID8/IFtdLFxuICAgICAgeEtleTogdGhpcy54S2V5LFxuICAgICAgc3RhY2tlZDogdGhpcy5zdGFja2VkLFxuICAgICAgb3JpZW50YXRpb246IHRoaXMub3JpZW50YXRpb24sXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgbWFyZ2luOiB0aGlzLm1hcmdpbixcbiAgICAgIHdpZHRoOiB0aGlzLmNoYXJ0LndpZHRoIHx8IENoYXJ0Q29tcG9uZW50LmZhbGxiYWNrV2lkdGgsXG4gICAgfSk7XG4gIH1cblxuICBnZXQgdmlld0JveCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnMCAwICcgKyAodGhpcy5jaGFydC53aWR0aCB8fCBDaGFydENvbXBvbmVudC5mYWxsYmFja1dpZHRoKSArICcgJyArIHRoaXMuaGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIE9uZSBjYXRjaG1lbnQgcmVjdCBwZXIgeCBwb3NpdGlvbiwgZGVsaWJlcmF0ZWx5IHdpZGVyIHRoYW4gdGhlIG1hcmtzIGl0XG4gICAqIGNvdmVycyDigJQgcmVhZGVycyBhaW0gYXQgYSBjYXRlZ29yeSwgbmV2ZXIgYXQgYSAycHggbGluZSBvciBhbiA4cHggZG90LlxuICAgKiBTcGFucyB0aGUgZnVsbCBwbG90IGluIHRoZSBjcm9zcyBkaXJlY3Rpb246IGZ1bGwgaGVpZ2h0IGluIGEgdmVydGljYWxcbiAgICogY2hhcnQsIGZ1bGwgd2lkdGggaW4gYSBob3Jpem9udGFsIG9uZS5cbiAgICovXG4gIGdldCBoaXRSZWN0cygpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9W10ge1xuICAgIGlmICghdGhpcy5ob3ZlcikgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGhvcml6b250YWwgPSB0aGlzLmNoYXJ0Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5tYXAoKF8sIGkpID0+IHtcbiAgICAgIGNvbnN0IGJhbmQgPSB0aGlzLmNoYXJ0LmhpdEJhbmRGb3IoaSk7XG4gICAgICByZXR1cm4gaG9yaXpvbnRhbFxuICAgICAgICA/IHsgeDogdGhpcy5jaGFydC5wbG90TGVmdCwgeTogYmFuZC5zdGFydCwgd2lkdGg6IHRoaXMuY2hhcnQucGxvdFdpZHRoLCBoZWlnaHQ6IGJhbmQud2lkdGggfVxuICAgICAgICA6IHsgeDogYmFuZC5zdGFydCwgeTogdGhpcy5jaGFydC5wbG90VG9wLCB3aWR0aDogYmFuZC53aWR0aCwgaGVpZ2h0OiB0aGlzLmNoYXJ0LnBsb3RIZWlnaHQgfTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRW50ZXJCYW5kKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0LnNldEFjdGl2ZUluZGV4KGluZGV4KTtcbiAgfVxuXG4gIG9uUG9pbnRlckxlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnQuc2V0QWN0aXZlSW5kZXgobnVsbCk7XG4gIH1cblxuICBnZXQgY29tcHV0ZWRDbGFzcygpIHtcbiAgICByZXR1cm4gY24oY2hhcnRWYXJpYW50cyh7IHZhcmlhbnQ6IHRoaXMudmFyaWFudCwgZGVuc2l0eTogdGhpcy5kZW5zaXR5IH0pLCB0aGlzLmNsYXNzKTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1bGVzIGF0IHRoZSB2YWx1ZSB0aWNrcywgd2l0aCBvcHRpb25hbCBydWxlcyBhdCB0aGUgY2F0ZWdvcnkgcG9zaXRpb25zLlxuICogT3JpZW50YXRpb24tYXdhcmU6IGluIGEgaG9yaXpvbnRhbCBjaGFydCB0aGUgdmFsdWUgcnVsZXMgcnVuIHZlcnRpY2FsbHkgYW5kXG4gKiB0aGUgKG9wdGlvbmFsKSBjYXRlZ29yeSBydWxlcyBydW4gaG9yaXpvbnRhbGx5IOKAlCB0aGUgdHJhbnNwb3NlIG9mIGFcbiAqIHZlcnRpY2FsIGNoYXJ0J3MgZ3JpZC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3ZnOmdbdG9sbGUtY2hhcnQtZ3JpZF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2ZzpsaW5lXG4gICAgICAqbmdGb3I9XCJsZXQgbGluZSBvZiB2YWx1ZUxpbmVzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxuICAgICAgW2F0dHIueDFdPVwibGluZS54MVwiXG4gICAgICBbYXR0ci54Ml09XCJsaW5lLngyXCJcbiAgICAgIFthdHRyLnkxXT1cImxpbmUueTFcIlxuICAgICAgW2F0dHIueTJdPVwibGluZS55MlwiXG4gICAgICBbY2xhc3NdPVwibGluZUNsYXNzXCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgID48L3N2ZzpsaW5lPlxuICAgIDxzdmc6bGluZVxuICAgICAgKm5nRm9yPVwibGV0IGxpbmUgb2YgY2F0ZWdvcnlMaW5lczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgIFthdHRyLngxXT1cImxpbmUueDFcIlxuICAgICAgW2F0dHIueDJdPVwibGluZS54MlwiXG4gICAgICBbYXR0ci55MV09XCJsaW5lLnkxXCJcbiAgICAgIFthdHRyLnkyXT1cImxpbmUueTJcIlxuICAgICAgW2NsYXNzXT1cImxpbmVDbGFzc1wiXG4gICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICA+PC9zdmc6bGluZT5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRHcmlkQ29tcG9uZW50IGV4dGVuZHMgQ2hhcnRDaGlsZCB7XG4gIC8qKiBBbHNvIGRyYXdzIGEgcnVsZSBhdCBldmVyeSBjYXRlZ29yeSBwb3NpdGlvbi4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgdmVydGljYWwgPSBmYWxzZTtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gZWFjaCBydWxlIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIFJ1bGVzIGF0IGVhY2ggdmFsdWUgdGljaywgc3Bhbm5pbmcgdGhlIHBsb3QgaW4gdGhlIGNyb3NzIGRpcmVjdGlvbi4gKi9cbiAgZ2V0IHZhbHVlTGluZXMoKTogeyB4MTogbnVtYmVyOyB5MTogbnVtYmVyOyB4MjogbnVtYmVyOyB5MjogbnVtYmVyIH1bXSB7XG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuY2hhcnQub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJztcbiAgICByZXR1cm4gdGhpcy5jaGFydC50aWNrcy5tYXAoKHRpY2spID0+XG4gICAgICBob3Jpem9udGFsXG4gICAgICAgID8geyB4MTogdGljay55LCB4MjogdGljay55LCB5MTogdGhpcy5jaGFydC5wbG90VG9wLCB5MjogdGhpcy5jaGFydC5wbG90Qm90dG9tIH1cbiAgICAgICAgOiB7IHgxOiB0aGlzLmNoYXJ0LnBsb3RMZWZ0LCB4MjogdGhpcy5jaGFydC5wbG90UmlnaHQsIHkxOiB0aWNrLnksIHkyOiB0aWNrLnkgfVxuICAgICk7XG4gIH1cblxuICAvKiogUnVsZXMgYXQgZWFjaCBjYXRlZ29yeSBwb3NpdGlvbiwgb25seSB3aGVuIGB2ZXJ0aWNhbGAgaXMgc2V0LiAqL1xuICBnZXQgY2F0ZWdvcnlMaW5lcygpOiB7IHgxOiBudW1iZXI7IHkxOiBudW1iZXI7IHgyOiBudW1iZXI7IHkyOiBudW1iZXIgfVtdIHtcbiAgICBpZiAoIXRoaXMudmVydGljYWwpIHJldHVybiBbXTtcbiAgICBjb25zdCBob3Jpem9udGFsID0gdGhpcy5jaGFydC5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuICAgIHJldHVybiB0aGlzLmNoYXJ0LnhMYWJlbHMubWFwKChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBwb3MgPSB0aGlzLmNoYXJ0LnhGb3IoaSk7XG4gICAgICByZXR1cm4gaG9yaXpvbnRhbFxuICAgICAgICA/IHsgeDE6IHRoaXMuY2hhcnQucGxvdExlZnQsIHgyOiB0aGlzLmNoYXJ0LnBsb3RSaWdodCwgeTE6IHBvcywgeTI6IHBvcyB9XG4gICAgICAgIDogeyB4MTogcG9zLCB4MjogcG9zLCB5MTogdGhpcy5jaGFydC5wbG90VG9wLCB5MjogdGhpcy5jaGFydC5wbG90Qm90dG9tIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXQgbGluZUNsYXNzKCk6IHN0cmluZyB7XG4gICAgLy8gUmVjZXNzaXZlIGJ5IGRlc2lnbjogYSBncmlkIGlzIGEgcmVhZGluZyBhaWQsIG5ldmVyIGEgbWFyay5cbiAgICByZXR1cm4gY24oJ3N0cm9rZS1ib3JkZXIgb3BhY2l0eS02MCcsIHRoaXMuY2xhc3MpO1xuICB9XG59XG5cbi8qKiBYLWF4aXMgdGljayBsYWJlbHMsIHRoaW5uZWQgc28gdGhleSBuZXZlciBjb2xsaWRlLiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3ZnOmdbdG9sbGUtY2hhcnQteC1heGlzXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3ZnOnRleHRcbiAgICAgICpuZ0Zvcj1cImxldCB0aWNrIG9mIHZpc2libGVUaWNrczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgIFthdHRyLnldPVwibGFiZWxZXCJcbiAgICAgIHRleHQtYW5jaG9yPVwibWlkZGxlXCJcbiAgICAgIGRvbWluYW50LWJhc2VsaW5lPVwiaGFuZ2luZ1wiXG4gICAgICBbY2xhc3NdPVwibGFiZWxDbGFzc1wiXG4gICAgPnt7IHRpY2subGFiZWwgfX08L3N2Zzp0ZXh0PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydFhBeGlzQ29tcG9uZW50IGV4dGVuZHMgQ2hhcnRDaGlsZCB7XG4gIC8qKlxuICAgKiBBcHByb3hpbWF0ZSBweCBwZXIgY2hhcmFjdGVyLCB1c2VkIHRvIGRlY2lkZSB3aGVuIGNhdGVnb3J5IGxhYmVscyB3b3VsZFxuICAgKiBjb2xsaWRlLiBPbmx5IGNvbnN1bHRlZCBpbiB0aGUgdmVydGljYWwgb3JpZW50YXRpb24uIEBkZWZhdWx0IDdcbiAgICovXG4gIEBJbnB1dCgpIGNoYXJXaWR0aCA9IDc7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIGVhY2ggbGFiZWwgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICAvKipcbiAgICogRHJhdyBldmVyeSBudGggbGFiZWwuIERlcml2ZWQgZnJvbSB0aGUgd2lkZXN0IGxhYmVsIGFuZCB0aGUgc3BhY2UgZWFjaCBvbmVcbiAgICogZ2V0cywgc28gYSBkZW5zZSBheGlzIHRoaW5zIG91dCBpbnN0ZWFkIG9mIG92ZXJwcmludGluZyBpdHNlbGYuXG4gICAqL1xuICBnZXQgc3RyaWRlKCk6IG51bWJlciB7XG4gICAgY29uc3QgbGFiZWxzID0gdGhpcy5jaGFydC54TGFiZWxzO1xuICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSByZXR1cm4gMTtcbiAgICBjb25zdCB3aWRlc3QgPSBsYWJlbHMucmVkdWNlKChtYXgsIGxhYmVsKSA9PiBNYXRoLm1heChtYXgsIGxhYmVsLmxlbmd0aCksIDApO1xuICAgIGNvbnN0IG5lZWRlZCA9IHdpZGVzdCAqIHRoaXMuY2hhcldpZHRoICsgODtcbiAgICBjb25zdCBwZXJMYWJlbCA9IHRoaXMuY2hhcnQucGxvdFdpZHRoIC8gbGFiZWxzLmxlbmd0aDtcbiAgICBpZiAocGVyTGFiZWwgPD0gMCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguY2VpbChuZWVkZWQgLyBwZXJMYWJlbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcnRpY2FsIG9yaWVudGF0aW9uOiBjYXRlZ29yeSBsYWJlbHMsIHRoaW5uZWQgc28gdGhleSBuZXZlciBjb2xsaWRlXG4gICAqICh0b2RheSdzIGJlaGF2aW91cikuIEhvcml6b250YWwgb3JpZW50YXRpb246IHRoaXMgaXMgdGhlIGJvdHRvbSBheGlzJ1xuICAgKiBwaHlzaWNhbCBwb3NpdGlvbiwgd2hpY2ggYSBob3Jpem9udGFsIGNoYXJ0IHVzZXMgZm9yIGl0cyB2YWx1ZSB0aWNrcy5cbiAgICovXG4gIGdldCB2aXNpYmxlVGlja3MoKTogeyB4OiBudW1iZXI7IGxhYmVsOiBzdHJpbmcgfVtdIHtcbiAgICBpZiAodGhpcy5jaGFydC5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFydC50aWNrcy5tYXAoKHRpY2spID0+ICh7IHg6IHRpY2sueSwgbGFiZWw6IHRpY2subGFiZWwgfSkpO1xuICAgIH1cbiAgICBjb25zdCBzdHJpZGUgPSB0aGlzLnN0cmlkZTtcbiAgICByZXR1cm4gdGhpcy5jaGFydC54TGFiZWxzXG4gICAgICAubWFwKChsYWJlbCwgaSkgPT4gKHsgbGFiZWwsIHg6IHRoaXMuY2hhcnQueEZvcihpKSwgaSB9KSlcbiAgICAgIC5maWx0ZXIoKHRpY2spID0+IHRpY2suaSAlIHN0cmlkZSA9PT0gMCk7XG4gIH1cblxuICBnZXQgbGFiZWxZKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQucGxvdEJvdHRvbSArIDg7XG4gIH1cblxuICBnZXQgbGFiZWxDbGFzcygpOiBzdHJpbmcge1xuICAgIC8vIFRleHQgd2VhcnMgYSB0ZXh0IHRva2VuLCBuZXZlciB0aGUgc2VyaWVzIGNvbG91ci5cbiAgICByZXR1cm4gY24oJ2ZpbGwtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXhzJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cblxuLyoqIFktYXhpcyB0aWNrIGxhYmVscyBhdCB0aGUgbmljZSB0aWNrIHZhbHVlcy4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N2ZzpnW3RvbGxlLWNoYXJ0LXktYXhpc10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2Zzp0ZXh0XG4gICAgICAqbmdGb3I9XCJsZXQgdGljayBvZiB2aXNpYmxlVGlja3M7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICBbYXR0ci54XT1cImxhYmVsWFwiXG4gICAgICBbYXR0ci55XT1cInRpY2sueVwiXG4gICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICBkb21pbmFudC1iYXNlbGluZT1cIm1pZGRsZVwiXG4gICAgICBbY2xhc3NdPVwibGFiZWxDbGFzc1wiXG4gICAgPnt7IHRpY2subGFiZWwgfX08L3N2Zzp0ZXh0PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydFlBeGlzQ29tcG9uZW50IGV4dGVuZHMgQ2hhcnRDaGlsZCB7XG4gIC8qKiBHYXAgaW4gcHggYmV0d2VlbiB0aGUgbGFiZWxzIGFuZCB0aGUgcGxvdCBlZGdlLiBAZGVmYXVsdCA4ICovXG4gIEBJbnB1dCgpIG9mZnNldCA9IDg7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIGVhY2ggbGFiZWwgdmlhIGBjbigpYCAobGFzdC13aW5zKS4gKi9cbiAgQElucHV0KCkgY2xhc3MgPSAnJztcblxuICBnZXQgbGFiZWxYKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQucGxvdExlZnQgLSB0aGlzLm9mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJ0aWNhbCBvcmllbnRhdGlvbjogdmFsdWUgdGlja3MgKHRvZGF5J3MgYmVoYXZpb3VyKS4gSG9yaXpvbnRhbFxuICAgKiBvcmllbnRhdGlvbjogdGhpcyBpcyB0aGUgbGVmdCBheGlzJyBwaHlzaWNhbCBwb3NpdGlvbiwgd2hpY2ggYVxuICAgKiBob3Jpem9udGFsIGNoYXJ0IHVzZXMgZm9yIGl0cyBjYXRlZ29yeSBsYWJlbHMuXG4gICAqL1xuICBnZXQgdmlzaWJsZVRpY2tzKCk6IHsgeTogbnVtYmVyOyBsYWJlbDogc3RyaW5nIH1bXSB7XG4gICAgaWYgKHRoaXMuY2hhcnQub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuY2hhcnQueExhYmVscy5tYXAoKGxhYmVsLCBpKSA9PiAoeyBsYWJlbCwgeTogdGhpcy5jaGFydC54Rm9yKGkpIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hhcnQudGlja3M7XG4gIH1cblxuICBnZXQgbGFiZWxDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBjbignZmlsbC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQteHMgdGFidWxhci1udW1zJywgdGhpcy5jbGFzcyk7XG4gIH1cbn1cblxuLyoqIEEgbGluZSBtYXJrIGZvciBvbmUgc2VyaWVzLCBvcHRpb25hbGx5IG1vbm90b25lLXNtb290aGVkIGFuZCBkb3R0ZWQuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdmc6Z1t0b2xsZS1jaGFydC1saW5lXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3ZnOnBhdGhcbiAgICAgIFthdHRyLmRdPVwicGF0aFwiXG4gICAgICBmaWxsPVwibm9uZVwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwiY29sb3JcIlxuICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgIFtjbGFzc109XCJjbGFzc1wiXG4gICAgPjwvc3ZnOnBhdGg+XG4gICAgPHN2ZzpjaXJjbGVcbiAgICAgICpuZ0Zvcj1cImxldCBwb2ludCBvZiBkb3RzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIlxuICAgICAgW2F0dHIuY3hdPVwicG9pbnQueFwiXG4gICAgICBbYXR0ci5jeV09XCJwb2ludC55XCJcbiAgICAgIFthdHRyLnJdPVwiZG90UmFkaXVzXCJcbiAgICAgIFthdHRyLmZpbGxdPVwiY29sb3JcIlxuICAgICAgY2xhc3M9XCJzdHJva2UtYmFja2dyb3VuZFwiXG4gICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICA+PC9zdmc6Y2lyY2xlPlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydExpbmVDb21wb25lbnQgZXh0ZW5kcyBDaGFydENoaWxkIHtcbiAgLyoqIEtleSBvZiB0aGUgc2VyaWVzIHRvIGRyYXcuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIHNlcmllc0tleSA9ICcnO1xuICAvKiogSW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHBvaW50czsgc21vb3RoIGlzIG1vbm90b25lIGN1YmljLCBzbyBpdCBuZXZlciBvdmVyc2hvb3RzLiBAZGVmYXVsdCAnbGluZWFyJyAqL1xuICBASW5wdXQoKSBjdXJ2ZTogJ2xpbmVhcicgfCAnc21vb3RoJyA9ICdsaW5lYXInO1xuICAvKiogRHJhd3MgYSBtYXJrZXIgYXQgZXZlcnkgcG9pbnQuIEBkZWZhdWx0IGZhbHNlICovXG4gIEBJbnB1dCgpIHNob3dEb3RzID0gZmFsc2U7XG4gIC8qKiBNYXJrZXIgcmFkaXVzIGluIHB4OyA0IGdpdmVzIHRoZSA4cHggbWluaW11bSBkaWFtZXRlci4gQGRlZmF1bHQgNCAqL1xuICBASW5wdXQoKSBkb3RSYWRpdXMgPSA0O1xuICAvKiogRXh0cmEgVGFpbHdpbmQgY2xhc3NlcyBtZXJnZWQgb250byB0aGUgcGF0aCB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIGdldCBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VydmUgPT09ICdzbW9vdGgnXG4gICAgICA/IHRoaXMuY2hhcnQuc21vb3RoUGF0aCh0aGlzLnNlcmllc0tleSlcbiAgICAgIDogdGhpcy5jaGFydC5saW5lUGF0aCh0aGlzLnNlcmllc0tleSk7XG4gIH1cblxuICBnZXQgY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5jb2xvckZvcih0aGlzLnNlcmllc0tleSk7XG4gIH1cblxuICBnZXQgZG90cygpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBpbmRleDogbnVtYmVyIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0RvdHMgPyB0aGlzLmNoYXJ0LnBvaW50c0Zvcih0aGlzLnNlcmllc0tleSkgOiBbXTtcbiAgfVxufVxuXG4vKiogQSBmaWxsZWQgYXJlYSBmb3Igb25lIHNlcmllczogYSBsb3ctb3BhY2l0eSB3YXNoIHVuZGVyIGEgMnB4IHN0cm9rZS4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N2ZzpnW3RvbGxlLWNoYXJ0LWFyZWFdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzdmc6cGF0aFxuICAgICAgW2F0dHIuZF09XCJhcmVhUGF0aFwiXG4gICAgICBbYXR0ci5maWxsXT1cImNvbG9yXCJcbiAgICAgIFthdHRyLmZpbGwtb3BhY2l0eV09XCJmaWxsT3BhY2l0eVwiXG4gICAgICBzdHJva2U9XCJub25lXCJcbiAgICA+PC9zdmc6cGF0aD5cbiAgICA8c3ZnOnBhdGhcbiAgICAgIFthdHRyLmRdPVwibGluZVBhdGhcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgW2F0dHIuc3Ryb2tlXT1cImNvbG9yXCJcbiAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxuICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICBbY2xhc3NdPVwiY2xhc3NcIlxuICAgID48L3N2ZzpwYXRoPlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydEFyZWFDb21wb25lbnQgZXh0ZW5kcyBDaGFydENoaWxkIHtcbiAgLyoqIEtleSBvZiB0aGUgc2VyaWVzIHRvIGRyYXcuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIHNlcmllc0tleSA9ICcnO1xuICAvKiogSW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHBvaW50cy4gQGRlZmF1bHQgJ2xpbmVhcicgKi9cbiAgQElucHV0KCkgY3VydmU6ICdsaW5lYXInIHwgJ3Ntb290aCcgPSAnbGluZWFyJztcbiAgLyoqIE9wYWNpdHkgb2YgdGhlIGZpbGwg4oCUIGEgd2FzaCwgbmV2ZXIgYSBzYXR1cmF0ZWQgYmxvY2suIEBkZWZhdWx0IDAuMSAqL1xuICBASW5wdXQoKSBmaWxsT3BhY2l0eSA9IDAuMTtcbiAgLyoqIEV4dHJhIFRhaWx3aW5kIGNsYXNzZXMgbWVyZ2VkIG9udG8gdGhlIHN0cm9rZSB2aWEgYGNuKClgIChsYXN0LXdpbnMpLiAqL1xuICBASW5wdXQoKSBjbGFzcyA9ICcnO1xuXG4gIC8qKiBBbiBhcmVhIGlzIGFuY2hvcmVkIHRvIGEgYmFzZWxpbmUsIHNvIHplcm8gaGFzIHRvIGJlIGluIHRoZSBkb21haW4uICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZWdpc3RlcigpOiB2b2lkIHtcbiAgICB0aGlzLmNoYXJ0LnJlcXVpcmVaZXJvKCk7XG4gIH1cblxuICBnZXQgYXJlYVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5hcmVhUGF0aCh0aGlzLnNlcmllc0tleSwgdGhpcy5jdXJ2ZSA9PT0gJ3Ntb290aCcpO1xuICB9XG5cbiAgZ2V0IGxpbmVQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VydmUgPT09ICdzbW9vdGgnXG4gICAgICA/IHRoaXMuY2hhcnQuc21vb3RoUGF0aCh0aGlzLnNlcmllc0tleSlcbiAgICAgIDogdGhpcy5jaGFydC5saW5lUGF0aCh0aGlzLnNlcmllc0tleSk7XG4gIH1cblxuICBnZXQgY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydC5jb2xvckZvcih0aGlzLnNlcmllc0tleSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBiYXIgd2hvc2UgZGF0YSBlbmQgaXMgcm91bmRlZCBhbmQgd2hvc2UgYmFzZWxpbmUgZW5kIHN0YXlzIHNxdWFyZS5cbiAqIEhhbmRsZXMgYm90aCBkaXJlY3Rpb25zLCBzbyBhIG5lZ2F0aXZlIHZhbHVlIHJvdW5kcyBkb3dud2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhclBhdGgoXG4gIHg6IG51bWJlcixcbiAgd2lkdGg6IG51bWJlcixcbiAgeUJhc2U6IG51bWJlcixcbiAgeVZhbHVlOiBudW1iZXIsXG4gIHJhZGl1czogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyh5QmFzZSAtIHlWYWx1ZSk7XG4gIGNvbnN0IHIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihyYWRpdXMsIHdpZHRoIC8gMiwgaGVpZ2h0KSk7XG4gIGNvbnN0IHJpZ2h0ID0geCArIHdpZHRoO1xuICAvLyBXaGljaCB3YXkgdGhlIGNvcm5lciBjdXJ2ZXMgZGVwZW5kcyBvbiB3aGljaCBzaWRlIG9mIHRoZSBiYXNlbGluZSB3ZSBhcmUuXG4gIGNvbnN0IHNpZ24gPSB5VmFsdWUgPD0geUJhc2UgPyAxIDogLTE7XG4gIGNvbnN0IGNvcm5lciA9IHlWYWx1ZSArIHNpZ24gKiByO1xuXG4gIHJldHVybiAoXG4gICAgJ00gJyArIHggKyAnICcgKyB5QmFzZSArXG4gICAgJyBMICcgKyB4ICsgJyAnICsgY29ybmVyICtcbiAgICAnIFEgJyArIHggKyAnICcgKyB5VmFsdWUgKyAnICcgKyAoeCArIHIpICsgJyAnICsgeVZhbHVlICtcbiAgICAnIEwgJyArIChyaWdodCAtIHIpICsgJyAnICsgeVZhbHVlICtcbiAgICAnIFEgJyArIHJpZ2h0ICsgJyAnICsgeVZhbHVlICsgJyAnICsgcmlnaHQgKyAnICcgKyBjb3JuZXIgK1xuICAgICcgTCAnICsgcmlnaHQgKyAnICcgKyB5QmFzZSArICcgWidcbiAgKTtcbn1cblxuLyoqXG4gKiBgYmFyUGF0aCgpYCB0cmFuc3Bvc2VkIGZvciBob3Jpem9udGFsIGJhcnM6IGZpeGVkIHZlcnRpY2FsIGV4dGVudFxuICogYFt5LCB5K2hlaWdodF1gLCB2YXJpYWJsZSBob3Jpem9udGFsIGV4dGVudCBgW3hCYXNlLCB4VmFsdWVdYCwgcm91bmRlZCBhdFxuICogdGhlIGB4VmFsdWVgIChkYXRhKSBlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXJQYXRoSG9yaXpvbnRhbChcbiAgeTogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgeEJhc2U6IG51bWJlcixcbiAgeFZhbHVlOiBudW1iZXIsXG4gIHJhZGl1czogbnVtYmVyXG4pOiBzdHJpbmcge1xuICBjb25zdCB3aWR0aCA9IE1hdGguYWJzKHhCYXNlIC0geFZhbHVlKTtcbiAgY29uc3QgciA9IE1hdGgubWF4KDAsIE1hdGgubWluKHJhZGl1cywgaGVpZ2h0IC8gMiwgd2lkdGgpKTtcbiAgY29uc3QgYm90dG9tID0geSArIGhlaWdodDtcbiAgY29uc3Qgc2lnbiA9IHhWYWx1ZSA+PSB4QmFzZSA/IDEgOiAtMTtcbiAgY29uc3QgY29ybmVyID0geFZhbHVlIC0gc2lnbiAqIHI7XG5cbiAgcmV0dXJuIChcbiAgICAnTSAnICsgeEJhc2UgKyAnICcgKyB5ICtcbiAgICAnIEwgJyArIGNvcm5lciArICcgJyArIHkgK1xuICAgICcgUSAnICsgeFZhbHVlICsgJyAnICsgeSArICcgJyArIHhWYWx1ZSArICcgJyArICh5ICsgcikgK1xuICAgICcgTCAnICsgeFZhbHVlICsgJyAnICsgKGJvdHRvbSAtIHIpICtcbiAgICAnIFEgJyArIHhWYWx1ZSArICcgJyArIGJvdHRvbSArICcgJyArIGNvcm5lciArICcgJyArIGJvdHRvbSArXG4gICAgJyBMICcgKyB4QmFzZSArICcgJyArIGJvdHRvbSArICcgWidcbiAgKTtcbn1cblxuLyoqXG4gKiBBIGJhciBtYXJrIGZvciBvbmUgc2VyaWVzLiBHcm91cGVkIGJlc2lkZSBpdHMgc2libGluZ3MgYnkgZGVmYXVsdCwgc3RhY2tlZFxuICogd2hlbiB0aGUgY29udGFpbmVyJ3MgYHN0YWNrZWRgIGlzIHNldC4gVGhlIGRhdGEgZW5kIGNhcnJpZXMgYSA0cHggcmFkaXVzLCB0aGVcbiAqIGJhc2VsaW5lIGVuZCBzdGF5cyBzcXVhcmUsIGFuZCBuZWlnaGJvdXJzIGFyZSBzZXBhcmF0ZWQgYnkgc3VyZmFjZSwgbm90IGluay5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3ZnOmdbdG9sbGUtY2hhcnQtYmFyXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3ZnOnBhdGhcbiAgICAgICpuZ0Zvcj1cImxldCBiYXIgb2YgYmFyczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCJcbiAgICAgIFthdHRyLmRdPVwiYmFyLmRcIlxuICAgICAgW2F0dHIuZmlsbF09XCJjb2xvclwiXG4gICAgICBbYXR0ci5maWxsLW9wYWNpdHldPVwiYmFyLmFjdGl2ZSA/IDEgOiAwLjg1XCJcbiAgICA+PC9zdmc6cGF0aD5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRCYXJDb21wb25lbnQgZXh0ZW5kcyBDaGFydENoaWxkIHtcbiAgLyoqIEtleSBvZiB0aGUgc2VyaWVzIHRvIGRyYXcuIEBkZWZhdWx0ICcnICovXG4gIEBJbnB1dCgpIHNlcmllc0tleSA9ICcnO1xuICAvKiogQ29ybmVyIHJhZGl1cyBvbiB0aGUgZGF0YSBlbmQgaW4gcHguIEBkZWZhdWx0IDQgKi9cbiAgQElucHV0KCkgcmFkaXVzID0gNDtcbiAgLyoqIExhcmdlc3QgYmFyIHRoaWNrbmVzcyBpbiBweDsgYSB3aWRlciBiYW5kIGJlY29tZXMgYWlyLCBub3QgYSBmYXR0ZXIgYmFyLiBAZGVmYXVsdCAyNCAqL1xuICBASW5wdXQoKSBtYXhXaWR0aCA9IDI0O1xuICAvKiogR2FwIGluIHB4IGJldHdlZW4gYWRqYWNlbnQgYmFycyBhbmQgYmV0d2VlbiBzdGFja2VkIHNlZ21lbnRzLiBAZGVmYXVsdCAyICovXG4gIEBJbnB1dCgpIGdhcCA9IDI7XG4gIC8qKiBFeHRyYSBUYWlsd2luZCBjbGFzc2VzIG1lcmdlZCBvbnRvIGVhY2ggYmFyIHZpYSBgY24oKWAgKGxhc3Qtd2lucykuICovXG4gIEBJbnB1dCgpIGNsYXNzID0gJyc7XG5cbiAgLyoqIEluZGV4IGN1cnJlbnRseSBob3ZlcmVkLCBzbyB0aGUgYmFyIHVuZGVyIHRoZSBwb2ludGVyIGNhbiBsaWZ0LiAqL1xuICBhY3RpdmVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEJhcnMgbmVlZCBhIGJhbmQgc2NhbGUgYW5kIGEgemVybyBiYXNlbGluZTsgYm90aCBiZWxvbmcgdG8gdGhlIHdob2xlIGNoYXJ0LiAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcmVnaXN0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydC51c2VCYW5kU2NhbGUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuY2hhcnQuYWN0aXZlSW5kZXgkLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IGluZGV4O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNoYXJ0LmNvbG9yRm9yKHRoaXMuc2VyaWVzS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW9tZXRyeSBmb3IgZXZlcnkgYmFyIHRoaXMgc2VyaWVzIGNvbnRyaWJ1dGVzLiBgeGAvYHdpZHRoYCBhcmUgdGhlIGJhcidzXG4gICAqIGZvb3RwcmludCBvbiB0aGUgY2F0ZWdvcnkgYXhpcyBhbmQgYHlCYXNlYC9geVZhbHVlYCBpdHMgZXh0ZW50IG9uIHRoZVxuICAgKiB2YWx1ZSBheGlzIOKAlCBwaHlzaWNhbCB4L3kgd2hlbiB2ZXJ0aWNhbCAodGhlIG9yaWdpbmFsIG1lYW5pbmcpLCBidXRcbiAgICogdHJhbnNwb3NlZCAoeCBob2xkcyBhIHZlcnRpY2FsIGZvb3RwcmludCwgeUJhc2UveVZhbHVlIGhvbGQgaG9yaXpvbnRhbFxuICAgKiBwb3NpdGlvbnMpIHdoZW4gdGhlIGNoYXJ0IGlzIGhvcml6b250YWwsIHNhbWUgYXMgYENoYXJ0U2VydmljZS55Rm9yKClgLlxuICAgKi9cbiAgZ2V0IGJhcnMoKToge1xuICAgIGQ6IHN0cmluZztcbiAgICBhY3RpdmU6IGJvb2xlYW47XG4gICAgeDogbnVtYmVyO1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgeUJhc2U6IG51bWJlcjtcbiAgICB5VmFsdWU6IG51bWJlcjtcbiAgfVtdIHtcbiAgICBjb25zdCBvdXQ6IHtcbiAgICAgIGQ6IHN0cmluZztcbiAgICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICAgIHg6IG51bWJlcjtcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICB5QmFzZTogbnVtYmVyO1xuICAgICAgeVZhbHVlOiBudW1iZXI7XG4gICAgfVtdID0gW107XG4gICAgY29uc3Qgc2VyaWVzQ291bnQgPSBNYXRoLm1heCgxLCB0aGlzLmNoYXJ0LnNlcmllcy5sZW5ndGgpO1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5jaGFydC5zZXJpZXMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmtleSA9PT0gdGhpcy5zZXJpZXNLZXkpO1xuICAgIGNvbnN0IHNsb3RJbmRleCA9IGZvdW5kIDwgMCA/IDAgOiBmb3VuZDtcbiAgICBjb25zdCBob3Jpem9udGFsID0gdGhpcy5jaGFydC5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoYXJ0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jaGFydC52YWx1ZUF0KHRoaXMuc2VyaWVzS2V5LCBpKTtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgYmFuZCA9IHRoaXMuY2hhcnQuYmFuZEZvcihpKTtcbiAgICAgIGxldCB4OiBudW1iZXI7XG4gICAgICBsZXQgd2lkdGg6IG51bWJlcjtcblxuICAgICAgaWYgKHRoaXMuY2hhcnQuc3RhY2tlZCkge1xuICAgICAgICB3aWR0aCA9IE1hdGgubWluKHRoaXMubWF4V2lkdGgsIGJhbmQud2lkdGgpO1xuICAgICAgICB4ID0gYmFuZC5jZW50cmUgLSB3aWR0aCAvIDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzbG90ID0gYmFuZC53aWR0aCAvIHNlcmllc0NvdW50O1xuICAgICAgICB3aWR0aCA9IE1hdGgubWluKHRoaXMubWF4V2lkdGgsIE1hdGgubWF4KDEsIHNsb3QgLSB0aGlzLmdhcCkpO1xuICAgICAgICB4ID0gYmFuZC5zdGFydCArIHNsb3QgKiBzbG90SW5kZXggKyAoc2xvdCAtIHdpZHRoKSAvIDI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2UgPSB0aGlzLmNoYXJ0LnN0YWNrZWQgPyB0aGlzLmNoYXJ0LnN0YWNrQmFzZSh0aGlzLnNlcmllc0tleSwgaSkgOiAwO1xuICAgICAgY29uc3QgeUJhc2UgPSB0aGlzLmNoYXJ0LnlGb3IoYmFzZSk7XG4gICAgICBsZXQgeVZhbHVlID0gdGhpcy5jaGFydC55Rm9yKGJhc2UgKyB2YWx1ZSk7XG5cbiAgICAgIC8vIFRoZSBnYXAgYmV0d2VlbiBzdGFja2VkIHNlZ21lbnRzIGNvbWVzIG9mZiB0aGUgZGF0YSBlbmQsIHNvIHdoYXRcbiAgICAgIC8vIHNlcGFyYXRlcyB0aGVtIGlzIHN1cmZhY2Ugc2hvd2luZyB0aHJvdWdoIHJhdGhlciB0aGFuIGEgc3Ryb2tlLiBTaWduZWRcbiAgICAgIC8vIGZyb20gdGhlIHJlc29sdmVkIHBvc2l0aW9ucyAobm90IHRoZSByYXcgdmFsdWUpIHNvIGl0IGhvbGRzIHVuZGVyXG4gICAgICAvLyBib3RoIG9yaWVudGF0aW9ucywgd2hvc2UgdmFsdWUgYXhpcyBydW5zIGluIG9wcG9zaXRlIGRpcmVjdGlvbnMuXG4gICAgICBpZiAodGhpcy5jaGFydC5zdGFja2VkICYmIE1hdGguYWJzKHlCYXNlIC0geVZhbHVlKSA+IHRoaXMuZ2FwKSB7XG4gICAgICAgIHlWYWx1ZSArPSBNYXRoLnNpZ24oeUJhc2UgLSB5VmFsdWUpICogdGhpcy5nYXA7XG4gICAgICB9XG5cbiAgICAgIG91dC5wdXNoKHtcbiAgICAgICAgZDogaG9yaXpvbnRhbFxuICAgICAgICAgID8gYmFyUGF0aEhvcml6b250YWwoeCwgd2lkdGgsIHlCYXNlLCB5VmFsdWUsIHRoaXMucmFkaXVzKVxuICAgICAgICAgIDogYmFyUGF0aCh4LCB3aWR0aCwgeUJhc2UsIHlWYWx1ZSwgdGhpcy5yYWRpdXMpLFxuICAgICAgICBhY3RpdmU6IHRoaXMuYWN0aXZlSW5kZXggPT09IGksXG4gICAgICAgIHgsXG4gICAgICAgIHdpZHRoLFxuICAgICAgICB5QmFzZSxcbiAgICAgICAgeVZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn1cbiJdfQ==