@rivet-health/design-system 36.2.1 → 37.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -22,6 +22,7 @@ export class ChartComponent {
22
22
  x: [],
23
23
  ys: [],
24
24
  });
25
+ this.colorIndices = new Map();
25
26
  this.toggleLegend$ = new Subject();
26
27
  // toggledLegend$ is just a set of boolean
27
28
  // values for which legends have been toggled.
@@ -40,14 +41,14 @@ export class ChartComponent {
40
41
  }
41
42
  const hiddenData = {
42
43
  ...data,
43
- ys: data.ys.map(y => ({
44
+ ys: data.ys.map((y, index) => ({
44
45
  ...y,
45
46
  // if toggled, flip the hidden boolean
46
- hidden: toggledLegends[y.label] ? !y.hidden : y.hidden,
47
+ hidden: toggledLegends[`y-${index}`] ? !y.hidden : y.hidden,
47
48
  })),
48
- supplementaryYs: data.supplementaryYs?.map(y => ({
49
+ supplementaryYs: data.supplementaryYs?.map((y, index) => ({
49
50
  ...y,
50
- hidden: toggledLegends[y.label] ? !y.hidden : y.hidden,
51
+ hidden: toggledLegends[`supp-${index}`] ? !y.hidden : y.hidden,
51
52
  })),
52
53
  };
53
54
  const viewBox = config.type == 'donut'
@@ -153,12 +154,16 @@ export class ChartComponent {
153
154
  }
154
155
  set data(d) {
155
156
  this.data$.next(d);
157
+ this.colorIndices = Chart.calculateColorIndices(d);
156
158
  }
157
159
  get data() {
158
160
  return this.data$.value;
159
161
  }
160
- toggleLegend(label) {
161
- this.toggleLegend$.next(label);
162
+ getItemKey(item, index) {
163
+ return 'supplementalIndex' in item ? `supp-${index}` : `y-${index}`;
164
+ }
165
+ toggleLegend(item, index) {
166
+ this.toggleLegend$.next(this.getItemKey(item, index));
162
167
  }
163
168
  mousemove($event, hover) {
164
169
  if (!hover) {
@@ -196,7 +201,7 @@ export class ChartComponent {
196
201
  if (!this.hover) {
197
202
  return false;
198
203
  }
199
- const yIndex = this.hover.yIndex;
204
+ // If hovering a supplementary value specifically, check if it's clickable
200
205
  if (this.hover.isSuppValue && this.hover.suppYIndex != null) {
201
206
  const suppYIndex = this.hover.suppYIndex;
202
207
  const supplementaryYs = this.data.supplementaryYs;
@@ -207,17 +212,27 @@ export class ChartComponent {
207
212
  }
208
213
  return supplementaryYs[suppYIndex]?.clickable === true;
209
214
  }
215
+ // For grouped tooltips, check if any visible item is clickable
216
+ const yIndex = this.hover.yIndex;
210
217
  if (this.config.groupedTooltip) {
218
+ // Check if the main Y value is clickable
211
219
  if (this.data.ys[yIndex]?.clickable === true) {
212
220
  return true;
213
221
  }
214
- return (this.data.supplementaryYs?.some(y => y.associatedYIndex === yIndex && y.clickable === true) ?? false);
215
222
  }
223
+ // Single item tooltip: check if the hovered Y value is clickable
216
224
  return this.data.ys[yIndex]?.clickable === true;
217
225
  }
218
226
  varColor(colors, index) {
219
227
  return `var(${colors[index % colors.length]})`;
220
228
  }
229
+ getItemColor(item, itemIndex) {
230
+ // Use index to get the original item (drawData$ maintains same indices as this.data)
231
+ const originalItem = 'supplementalIndex' in item
232
+ ? this.data.supplementaryYs[itemIndex]
233
+ : this.data.ys[itemIndex];
234
+ return Chart.getColor(originalItem, this.colorIndices, this.config.colors);
235
+ }
221
236
  moreClick() {
222
237
  this.lockShowMoreTooltip = !this.lockShowMoreTooltip;
223
238
  }
@@ -233,10 +248,10 @@ export class ChartComponent {
233
248
  }
234
249
  }
235
250
  ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ChartComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
236
- ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ChartComponent, selector: "riv-chart", inputs: { config: "config", data: "data" }, outputs: { chartClicked: "chartClicked" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "moreTextContainer", first: true, predicate: ["moreTextContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n>\n <ng-container *ngIf=\"drawData$ | async; let d\">\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n width=\"100%\"\n [attr.height]=\"height\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"10\"\n [attr.y2]=\"10\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"height - 4\">\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"12\">\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"height - 16\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"width\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"leftLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"rightLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"width\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <g *ngIf=\"!!hover && !(config.type === 'horizontal-bar')\">\n <line\n class=\"tick-line\"\n [attr.x1]=\"hover.x\"\n [attr.x2]=\"hover.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n class=\"data-label\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"hover?.tooltip as tooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"tooltip?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div *ngIf=\"tooltip.date\" class=\"callout-row\">\n {{ tooltip.date }}\n </div>\n <div class=\"callout-row\" *ngFor=\"let metric of tooltip.metrics\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend>\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"config.colors[i % config.colors.length]\"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"\n config.colors[item.associatedYIndex % config.colors.length]\n \"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"config.colors[i % config.colors.length]\"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"\n config.colors[item.associatedYIndex % config.colors.length]\n \"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"config.zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{color:var(--type-light-high-contrast);font-size:var(--type-1-font-size)}.waterfall-line{stroke:var(--gray-60)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "component", type: i4.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "directive", type: i5.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i6.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i7.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i8.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
251
+ ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ChartComponent, selector: "riv-chart", inputs: { config: "config", data: "data" }, outputs: { chartClicked: "chartClicked" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "moreTextContainer", first: true, predicate: ["moreTextContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n>\n <ng-container *ngIf=\"drawData$ | async; let d\">\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n width=\"100%\"\n [attr.height]=\"height\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"10\"\n [attr.y2]=\"10\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"height - 4\">\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"12\">\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"height - 16\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"width\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"leftLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"rightLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"width\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <g *ngIf=\"!!hover && !(config.type === 'horizontal-bar')\">\n <line\n class=\"tick-line\"\n [attr.x1]=\"hover.x\"\n [attr.x2]=\"hover.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n class=\"data-label\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"hover?.tooltip as tooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"tooltip?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div *ngIf=\"tooltip.date\" class=\"callout-row\">\n {{ tooltip.date }}\n </div>\n <div class=\"callout-row\" *ngFor=\"let metric of tooltip.metrics\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend>\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"getItemColor(item, i)\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"config.zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{color:var(--type-light-high-contrast);font-size:var(--type-1-font-size)}.waterfall-line{stroke:var(--gray-60)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "component", type: i4.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "directive", type: i5.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i6.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i7.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i8.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
237
252
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ChartComponent, decorators: [{
238
253
  type: Component,
239
- args: [{ selector: 'riv-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n>\n <ng-container *ngIf=\"drawData$ | async; let d\">\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n width=\"100%\"\n [attr.height]=\"height\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"10\"\n [attr.y2]=\"10\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"height - 4\">\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"12\">\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"height - 16\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"width\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"leftLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"rightLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"width\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <g *ngIf=\"!!hover && !(config.type === 'horizontal-bar')\">\n <line\n class=\"tick-line\"\n [attr.x1]=\"hover.x\"\n [attr.x2]=\"hover.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n class=\"data-label\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"hover?.tooltip as tooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"tooltip?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div *ngIf=\"tooltip.date\" class=\"callout-row\">\n {{ tooltip.date }}\n </div>\n <div class=\"callout-row\" *ngFor=\"let metric of tooltip.metrics\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend>\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"config.colors[i % config.colors.length]\"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"\n config.colors[item.associatedYIndex % config.colors.length]\n \"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"config.colors[i % config.colors.length]\"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"\n config.colors[item.associatedYIndex % config.colors.length]\n \"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item.label)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"config.zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{color:var(--type-light-high-contrast);font-size:var(--type-1-font-size)}.waterfall-line{stroke:var(--gray-60)}\n"] }]
254
+ args: [{ selector: 'riv-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"(empty$ | async) === false; else zeroState\"\n>\n <ng-container *ngIf=\"drawData$ | async; let d\">\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n width=\"100%\"\n [attr.height]=\"height\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"10\"\n [attr.y2]=\"10\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"height - 4\">\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text class=\"tick-label\" [attr.x]=\"tick.x\" [attr.y]=\"12\">\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"height - 16\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"width\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"leftLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"rightLabelMaxSize\"\n class=\"tick-label\"\n [attr.y]=\"tick.y - 4\"\n [attr.x]=\"width\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <g *ngIf=\"!!hover && !(config.type === 'horizontal-bar')\">\n <line\n class=\"tick-line\"\n [attr.x1]=\"hover.x\"\n [attr.x2]=\"hover.x\"\n y1=\"0\"\n [attr.y2]=\"height - 16\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <circle\n class=\"marker\"\n *ngIf=\"\n !!hover && (config.groupedTooltip || i === hover.visibleYIndex)\n \"\n [attr.cx]=\"hover.x\"\n [attr.cy]=\"hover.ys[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n class=\"data-label\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"hover?.tooltip as tooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"tooltip?.anchor ?? null\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div *ngIf=\"tooltip.date\" class=\"callout-row\">\n {{ tooltip.date }}\n </div>\n <div class=\"callout-row\" *ngFor=\"let metric of tooltip.metrics\">\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend>\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"getItemColor(item, i)\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"config.zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{color:var(--type-light-high-contrast);font-size:var(--type-1-font-size)}.waterfall-line{stroke:var(--gray-60)}\n"] }]
240
255
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { container: [{
241
256
  type: ViewChild,
242
257
  args: ['container']
@@ -250,4 +265,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
250
265
  }], chartClicked: [{
251
266
  type: Output
252
267
  }] } });
253
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9jaGFydC9jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxPQUFPLEdBQ1IsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7Ozs7O0FBUWhDLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLFlBQTZCLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBS25ELFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQVFuQyxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFRaEMsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFlLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQVNqRSxVQUFLLEdBQUcsSUFBSSxlQUFlLENBQWE7WUFDdEMsSUFBSSxFQUFFLFlBQVk7WUFDbEIsQ0FBQyxFQUFFLEVBQUU7WUFDTCxFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUMsQ0FBQztRQWFILGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztR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VSxpQkFBaUI7c0JBQWhELFNBQVM7dUJBQUMsbUJBQW1CO2dCQW9CMUIsTUFBTTtzQkFEVCxLQUFLO2dCQWNGLElBQUk7c0JBRFAsS0FBSztnQkErRk4sWUFBWTtzQkFEWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICBzY2FuLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hhcnQgfSBmcm9tICcuL2NoYXJ0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhcnQuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyPzogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbW9yZVRleHRDb250YWluZXInKSBtb3JlVGV4dENvbnRhaW5lcj86IEVsZW1lbnRSZWY7XG5cbiAgaGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMzAwKTtcbiAgc2V0IGhlaWdodCh3OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlaWdodCQubmV4dCh3KTtcbiAgfVxuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQudmFsdWU7XG4gIH1cblxuICB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDApO1xuICBzZXQgd2lkdGgodzogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh3KTtcbiAgfVxuICBnZXQgd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgkLnZhbHVlO1xuICB9XG5cbiAgY29uZmlnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhcnQuQ29uZmlnPihDaGFydC5kZWZhdWx0Q29uZmlnKTtcbiAgQElucHV0KClcbiAgc2V0IGNvbmZpZyhjOiBDaGFydC5Db25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyQubmV4dChjKTtcbiAgfVxuICBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZyQudmFsdWU7XG4gIH1cblxuICBkYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhcnQuRGF0YT4oe1xuICAgIHR5cGU6ICd0aW1lc2VyaWVzJyxcbiAgICB4OiBbXSxcbiAgICB5czogW10sXG4gIH0pO1xuICBASW5wdXQoKVxuICBzZXQgZGF0YShkOiBDaGFydC5EYXRhKSB7XG4gICAgdGhpcy5kYXRhJC5uZXh0KGQpO1xuICB9XG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGEkLnZhbHVlO1xuICB9XG5cbiAgdG9nZ2xlTGVnZW5kKGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnRvZ2dsZUxlZ2VuZCQubmV4dChsYWJlbCk7XG4gIH1cblxuICB0b2dnbGVMZWdlbmQkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIHRvZ2dsZWRMZWdlbmQkIGlzIGp1c3QgYSBzZXQgb2YgYm9vbGVhblxuICAvLyB2YWx1ZXMgZm9yIHdoaWNoIGxlZ2VuZHMgaGF2ZSBiZWVuIHRvZ2dsZWQuXG4gIC8vIFdlIGRvbid0IGtub3cgaWYgdGhvc2UgbGVnZW5kcyB3aGVyZSBhbHJlYWR5XG4gIC8vIGhpZGRlbiBvciBub3QsIHdlIGp1c3Qga25vdyB3aGV0aGVyIHRoZXkgaGF2ZVxuICAvLyBiZWVuIHRvZ2dsZWQuXG4gIHRvZ2dsZWRMZWdlbmRzJCA9IHRoaXMudG9nZ2xlTGVnZW5kJC5waXBlKFxuICAgIHNjYW48c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oXG4gICAgICAoYWNjLCB2YWx1ZSkgPT4gKHsgLi4uYWNjLCBbdmFsdWVdOiAhYWNjW3ZhbHVlXSB9KSxcbiAgICAgIHt9LFxuICAgICksXG4gICAgc3RhcnRXaXRoPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICk7XG5cbiAgZHJhd0RhdGEkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5jb25maWckLFxuICAgIHRoaXMuZGF0YSQsXG4gICAgdGhpcy50b2dnbGVkTGVnZW5kcyQsXG4gIF0pLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnJlbnQpID0+IGlzRXF1YWwocHJldiwgY3VycmVudCkpLFxuICAgIG1hcCgoW3dpZHRoLCBjb25maWcsIGRhdGEsIHRvZ2dsZWRMZWdlbmRzXSkgPT4ge1xuICAgICAgaWYgKHdpZHRoID09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBoaWRkZW5EYXRhID0ge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICB5czogZGF0YS55cy5tYXAoeSA9PiAoe1xuICAgICAgICAgIC4uLnksXG4gICAgICAgICAgLy8gaWYgdG9nZ2xlZCwgZmxpcCB0aGUgaGlkZGVuIGJvb2xlYW5cbiAgICAgICAgICBoaWRkZW46IHRvZ2dsZWRMZWdlbmRzW3kubGFiZWxdID8gIXkuaGlkZGVuIDogeS5oaWRkZW4sXG4gICAgICAgIH0pKSxcbiAgICAgICAgc3VwcGxlbWVudGFyeVlzOiBkYXRhLnN1cHBsZW1lbnRhcnlZcz8ubWFwKHkgPT4gKHtcbiAgICAgICAgICAuLi55LFxuICAgICAgICAgIGhpZGRlbjogdG9nZ2xlZExlZ2VuZHNbeS5sYWJlbF0gPyAheS5oaWRkZW4gOiB5LmhpZGRlbixcbiAgICAgICAgfSkpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHZpZXdCb3ggPVxuICAgICAgICBjb25maWcudHlwZSA9PSAnZG9udXQnXG4gICAgICAgICAgPyBgJHstdGhpcy5oZWlnaHQgLyAyfSAkey10aGlzLmhlaWdodCAvIDJ9XG4gICAgICAgICAgICAgICR7dGhpcy5oZWlnaHR9ICR7dGhpcy5oZWlnaHR9YFxuICAgICAgICAgIDogYDAgMCAke3dpZHRofSAke3RoaXMuaGVpZ2h0fWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2aWV3Qm94LFxuICAgICAgICBkYXRhOiBoaWRkZW5EYXRhLFxuICAgICAgICAuLi5DaGFydC5jaGFydChjb25maWcsIGhpZGRlbkRhdGEsIHtcbiAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIGVtcHR5JCA9IHRoaXMuZGF0YSQucGlwZShcbiAgICBtYXAoXG4gICAgICBkID0+IChkLngubGVuZ3RoID09IDAgJiYgdGhpcy5jb25maWcudHlwZSAhPSAnZG9udXQnKSB8fCBkLnlzLmxlbmd0aCA9PSAwLFxuICAgICksXG4gICk7XG5cbiAgaG92ZXI6IFJldHVyblR5cGU8Q2hhcnQuSG92ZXI+IHwgbnVsbCA9IG51bGw7XG5cbiAgbW91c2Vtb3ZlKCRldmVudDogTW91c2VFdmVudCwgaG92ZXI/OiBDaGFydC5Ib3Zlcikge1xuICAgIGlmICghaG92ZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoY29udGFpbmVyRWwgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5ob3ZlciA9IGhvdmVyKHtcbiAgICAgIHJlY3QsXG4gICAgICB4OiAkZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICAgIHk6ICRldmVudC5jbGllbnRZIC0gcmVjdC50b3AsXG4gICAgfSk7XG4gIH1cblxuICBtb3VzZWxlYXZlKCRldmVudDogTW91c2VFdmVudCkge1xuICAgIHRoaXMuaG92ZXIgPSBudWxsO1xuICB9XG5cbiAgQE91dHB1dCgpXG4gIGNoYXJ0Q2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHhJbmRleDogbnVtYmVyO1xuICAgIHlJbmRleDogbnVtYmVyO1xuICAgIHN1cHBZSW5kZXg/OiBudW1iZXI7XG4gIH0+KCk7XG5cbiAgY2xpY2soKSB7XG4gICAgaWYgKHRoaXMuaG92ZXIgJiYgdGhpcy5pc0hvdmVyQ2xpY2thYmxlKSB7XG4gICAgICB0aGlzLmNoYXJ0Q2xpY2tlZC5lbWl0KHtcbiAgICAgICAgeEluZGV4OiB0aGlzLmhvdmVyLnhJbmRleCxcbiAgICAgICAgeUluZGV4OiB0aGlzLmhvdmVyLnlJbmRleCxcbiAgICAgICAgLi4uKHRoaXMuaG92ZXIuaXNTdXBwVmFsdWUgJiZcbiAgICAgICAgdGhpcy5ob3Zlci5zdXBwWUluZGV4ICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICB0aGlzLmhvdmVyLnN1cHBZSW5kZXggPj0gMFxuICAgICAgICAgID8geyBzdXBwWUluZGV4OiB0aGlzLmhvdmVyLnN1cHBZSW5kZXggfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmhvdmVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNIb3ZlckNsaWNrYWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaG92ZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeUluZGV4ID0gdGhpcy5ob3Zlci55SW5kZXg7XG4gICAgaWYgKHRoaXMuaG92ZXIuaXNTdXBwVmFsdWUgJiYgdGhpcy5ob3Zlci5zdXBwWUluZGV4ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHN1cHBZSW5kZXggPSB0aGlzLmhvdmVyLnN1cHBZSW5kZXg7XG4gICAgICBjb25zdCBzdXBwbGVtZW50YXJ5WXMgPSB0aGlzLmRhdGEuc3VwcGxlbWVudGFyeVlzO1xuICAgICAgaWYgKFxuICAgICAgICAhc3VwcGxlbWVudGFyeVlzIHx8XG4gICAgICAgIHN1cHBZSW5kZXggPCAwIHx8XG4gICAgICAgIHN1cHBZSW5kZXggPj0gc3VwcGxlbWVudGFyeVlzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBwbGVtZW50YXJ5WXNbc3VwcFlJbmRleF0/LmNsaWNrYWJsZSA9PT0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29uZmlnLmdyb3VwZWRUb29sdGlwKSB7XG4gICAgICBpZiAodGhpcy5kYXRhLnlzW3lJbmRleF0/LmNsaWNrYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuZGF0YS5zdXBwbGVtZW50YXJ5WXM/LnNvbWUoXG4gICAgICAgICAgeSA9PiB5LmFzc29jaWF0ZWRZSW5kZXggPT09IHlJbmRleCAmJiB5LmNsaWNrYWJsZSA9PT0gdHJ1ZSxcbiAgICAgICAgKSA/PyBmYWxzZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGF0YS55c1t5SW5kZXhdPy5jbGlja2FibGUgPT09IHRydWU7XG4gIH1cblxuICB2YXJDb2xvcihjb2xvcnM6IHN0cmluZ1tdLCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGB2YXIoJHtjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXX0pYDtcbiAgfVxuXG4gIHNob3dNb3JlVG9vbHRpcCA9IGZhbHNlO1xuICBsb2NrU2hvd01vcmVUb29sdGlwID0gZmFsc2U7XG5cbiAgbW9yZVRleHRXaWR0aCA9IDUwO1xuICBiYXNlTGVnZW5kSXRlbVdpZHRoID0gNDA7XG4gIHdpZHRoUGVyTGV0dGVyID0gNi41O1xuICBsZWZ0TGFiZWxNYXhTaXplID0gQ2hhcnQuTEVGVF9QQURESU5HX0xBQkVMX01BWDtcbiAgcmlnaHRMYWJlbE1heFNpemUgPSBDaGFydC5SSUdIVF9QQURESU5HO1xuXG4gIGZpcnN0SGlkZGVuTGVnZW5kSXRlbUluZGV4JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuY29uZmlnJCxcbiAgICB0aGlzLmRhdGEkLFxuICBdKS5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyZW50KSA9PiBpc0VxdWFsKHByZXYsIGN1cnJlbnQpKSxcbiAgICBtYXAoKFt3aWR0aCwgY29uZmlnLCBkYXRhXSkgPT4ge1xuICAgICAgaWYgKCFjb25maWcudHJ1bmNhdGVMZWdlbmQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhSW5kZXg6IGRhdGEueXMubGVuZ3RoLFxuICAgICAgICAgIHN1cHBJbmRleDogZGF0YS5zdXBwbGVtZW50YXJ5WXM/Lmxlbmd0aCA/PyAwLFxuICAgICAgICAgIGhpZGRlbkNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBsZXQgd2lkdGhSdW5uaW5nVG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkYXRhLnlzW2ldLnNob3dMZWdlbmRJdGVtID09PSBmYWxzZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZEl0ZW1XaWR0aCA9XG4gICAgICAgICAgdGhpcy5iYXNlTGVnZW5kSXRlbVdpZHRoICtcbiAgICAgICAgICBkYXRhLnlzW2ldLmxhYmVsLmxlbmd0aCAqIHRoaXMud2lkdGhQZXJMZXR0ZXI7XG4gICAgICAgIGlmICh3aWR0aFJ1bm5pbmdUb3RhbCArIGluZEl0ZW1XaWR0aCA+PSB3aWR0aCAtIHRoaXMubW9yZVRleHRXaWR0aCkge1xuICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1lzQ291bnQgPSBkYXRhLnlzXG4gICAgICAgICAgICAuc2xpY2UoaSlcbiAgICAgICAgICAgIC5maWx0ZXIoeSA9PiB5LnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZSkubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHN1cHBZc0NvdW50ID1cbiAgICAgICAgICAgIGRhdGEuc3VwcGxlbWVudGFyeVlzPy5maWx0ZXIoeSA9PiB5LnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgLmxlbmd0aCA/PyAwO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhSW5kZXg6IGksXG4gICAgICAgICAgICBzdXBwSW5kZXg6IDAsXG4gICAgICAgICAgICBoaWRkZW5Db3VudDogcmVtYWluaW5nWXNDb3VudCArIHN1cHBZc0NvdW50LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgd2lkdGhSdW5uaW5nVG90YWwgKz0gaW5kSXRlbVdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3VwcGxlbWVudGFyeVlzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5zdXBwbGVtZW50YXJ5WXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZGF0YS5zdXBwbGVtZW50YXJ5WXNbaV0uc2hvd0xlZ2VuZEl0ZW0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5kSXRlbVdpZHRoID1cbiAgICAgICAgICAgIHRoaXMuYmFzZUxlZ2VuZEl0ZW1XaWR0aCArXG4gICAgICAgICAgICBkYXRhLnN1cHBsZW1lbnRhcnlZc1tpXS5sYWJlbC5sZW5ndGggKiB0aGlzLndpZHRoUGVyTGV0dGVyO1xuICAgICAgICAgIGlmICh3aWR0aFJ1bm5pbmdUb3RhbCArIGluZEl0ZW1XaWR0aCA+PSB3aWR0aCAtIHRoaXMubW9yZVRleHRXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU3VwcFlzQ291bnQgPSBkYXRhLnN1cHBsZW1lbnRhcnlZc1xuICAgICAgICAgICAgICAuc2xpY2UoaSlcbiAgICAgICAgICAgICAgLmZpbHRlcih5ID0+IHkuc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlKS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhSW5kZXg6IGRhdGEueXMubGVuZ3RoLFxuICAgICAgICAgICAgICBzdXBwSW5kZXg6IGksXG4gICAgICAgICAgICAgIGhpZGRlbkNvdW50OiByZW1haW5pbmdTdXBwWXNDb3VudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpZHRoUnVubmluZ1RvdGFsICs9IGluZEl0ZW1XaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YUluZGV4OiBkYXRhLnlzLmxlbmd0aCxcbiAgICAgICAgc3VwcEluZGV4OiBkYXRhLnN1cHBsZW1lbnRhcnlZcz8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGhpZGRlbkNvdW50OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIG1vcmVDbGljaygpIHtcbiAgICB0aGlzLmxvY2tTaG93TW9yZVRvb2x0aXAgPSAhdGhpcy5sb2NrU2hvd01vcmVUb29sdGlwO1xuICB9XG5cbiAgY2xvc2VIYW5kbGVyKCkge1xuICAgIHRoaXMubG9ja1Nob3dNb3JlVG9vbHRpcCA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbW91c2VvdmVyTGVnZW5kKCkge1xuICAgIHRoaXMuc2hvd01vcmVUb29sdGlwID0gdHJ1ZTtcbiAgfVxuXG4gIG1vdXNlbGVhdmVMZWdlbmQoKSB7XG4gICAgdGhpcy5zaG93TW9yZVRvb2x0aXAgPSBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbiAgKm5nSWY9XCIoZW1wdHkkIHwgYXN5bmMpID09PSBmYWxzZTsgZWxzZSB6ZXJvU3RhdGVcIlxuPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkXCI+XG4gICAgPGRpdlxuICAgICAgKG1vdXNlbW92ZSk9XCJtb3VzZW1vdmUoJGV2ZW50LCBkLmhvdmVyKVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZWxlYXZlKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cImNsaWNrKClcIlxuICAgICAgI2NvbnRhaW5lclxuICAgICAgY2xhc3M9XCJzdWItY29udGFpbmVyXCJcbiAgICAgIFtjbGFzcy5jbGlja2FibGVdPVwiaXNIb3ZlckNsaWNrYWJsZVwiXG4gICAgPlxuICAgICAgPHN2ZzpzdmdcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgIFthdHRyLnZpZXdCb3hdPVwiZC52aWV3Qm94XCJcbiAgICAgICAgd2lkdGg9XCIxMDAlXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICA+XG4gICAgICAgIDxkZWZzPlxuICAgICAgICAgIDwhLS0gU3RyaXBlIHBhdHRlcm4gLS0+XG4gICAgICAgICAgPHBhdHRlcm5cbiAgICAgICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgICAgICB4PVwiMFwiXG4gICAgICAgICAgICB5PVwiMFwiXG4gICAgICAgICAgICBbYXR0ci53aWR0aF09XCIxMFwiXG4gICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwiMTBcIlxuICAgICAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgIFthdHRyLngxXT1cIjBcIlxuICAgICAgICAgICAgICBbYXR0ci55MV09XCIwXCJcbiAgICAgICAgICAgICAgW2F0dHIueDJdPVwiMTBcIlxuICAgICAgICAgICAgICBbYXR0ci55Ml09XCIxMFwiXG4gICAgICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICAgID48L2xpbmU+XG4gICAgICAgICAgPC9wYXR0ZXJuPlxuICAgICAgICA8L2RlZnM+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhKGNvbmZpZy50eXBlID09PSAnaG9yaXpvbnRhbC1iYXInKVwiPlxuICAgICAgICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueFRpY2tzXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIj5cbiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPVwidGljay1sYWJlbFwiIFthdHRyLnhdPVwidGljay54XCIgW2F0dHIueV09XCJoZWlnaHQgLSA0XCI+XG4gICAgICAgICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLnR5cGUgPT09ICdob3Jpem9udGFsLWJhcidcIj5cbiAgICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhUaWNrc1wiIHRleHQtYW5jaG9yPVwibGVmdFwiPlxuICAgICAgICAgICAgPHRleHQgY2xhc3M9XCJ0aWNrLWxhYmVsXCIgW2F0dHIueF09XCJ0aWNrLnhcIiBbYXR0ci55XT1cIjEyXCI+XG4gICAgICAgICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgIGNsYXNzPVwidGljay1saW5lXCJcbiAgICAgICAgICAgICAgW2F0dHIueDFdPVwidGljay54XCJcbiAgICAgICAgICAgICAgW2F0dHIueDJdPVwidGljay54XCJcbiAgICAgICAgICAgICAgeTE9XCIwXCJcbiAgICAgICAgICAgICAgW2F0dHIueTJdPVwiaGVpZ2h0IC0gMTZcIlxuICAgICAgICAgICAgPjwvbGluZT5cbiAgICAgICAgICAgIDx0ZXh0XG4gICAgICAgICAgICAgICpuZ0lmPVwidGljay5zZWNvbmRhcnlMYWJlbFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJoZWlnaHQgLSAxNlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHRpY2suc2Vjb25kYXJ5TGFiZWwgfX1cbiAgICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnlUaWNrc1wiPlxuICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAqbmdJZj1cIiEoY29uZmlnLnR5cGUgPT09ICdob3Jpem9udGFsLWJhcicpXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGljay1saW5lXCJcbiAgICAgICAgICAgIFthdHRyLnkxXT1cInRpY2sueVwiXG4gICAgICAgICAgICBbYXR0ci55Ml09XCJ0aWNrLnlcIlxuICAgICAgICAgICAgeDE9XCIwXCJcbiAgICAgICAgICAgIFthdHRyLngyXT1cIndpZHRoXCJcbiAgICAgICAgICA+PC9saW5lPlxuICAgICAgICAgIDx0ZXh0XG4gICAgICAgICAgICByaXZTVkdUZXh0VHJ1bmNhdGVcbiAgICAgICAgICAgIFt0ZXh0XT1cInRpY2subGFiZWxcIlxuICAgICAgICAgICAgW3dpZHRoXT1cImxlZnRMYWJlbE1heFNpemVcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgICAgIFthdHRyLnldPVwidGljay55IC0gNFwiXG4gICAgICAgICAgICBbYXR0ci54XT1cIjBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICpuZ0lmPVwidGljay5zZWNvbmRhcnlMYWJlbFwiXG4gICAgICAgICAgICByaXZTVkdUZXh0VHJ1bmNhdGVcbiAgICAgICAgICAgIFt0ZXh0XT1cInRpY2suc2Vjb25kYXJ5TGFiZWxcIlxuICAgICAgICAgICAgW3dpZHRoXT1cInJpZ2h0TGFiZWxNYXhTaXplXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci55XT1cInRpY2sueSAtIDRcIlxuICAgICAgICAgICAgW2F0dHIueF09XCJ3aWR0aFwiXG4gICAgICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdGljay5zZWNvbmRhcnlMYWJlbCB9fVxuICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdJZj1cIiEhaG92ZXIgJiYgIShjb25maWcudHlwZSA9PT0gJ2hvcml6b250YWwtYmFyJylcIj5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxpbmVcIlxuICAgICAgICAgICAgW2F0dHIueDFdPVwiaG92ZXIueFwiXG4gICAgICAgICAgICBbYXR0ci54Ml09XCJob3Zlci54XCJcbiAgICAgICAgICAgIHkxPVwiMFwiXG4gICAgICAgICAgICBbYXR0ci55Ml09XCJoZWlnaHQgLSAxNlwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI0XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBiYXIgb2YgZC5iYXJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVjdCBvZiBiYXI7IGxldCBqID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkZWZzICpuZ0lmPVwicmVjdC5wYXR0ZXJuID09PSAnZG90cydcIj5cbiAgICAgICAgICAgICAgPHBhdHRlcm5cbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZG90cy0nICsgaSArICctJyArIGpcIlxuICAgICAgICAgICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiNFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICBjeD1cIjJcIlxuICAgICAgICAgICAgICAgICAgY3k9XCIyXCJcbiAgICAgICAgICAgICAgICAgIHI9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgICAgICAgID48L2NpcmNsZT5cbiAgICAgICAgICAgICAgPC9wYXR0ZXJuPlxuICAgICAgICAgICAgPC9kZWZzPlxuXG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwiXG4gICAgICAgICAgICAgICAgcmVjdC5wYXR0ZXJuID09PSAnZG90cydcbiAgICAgICAgICAgICAgICAgID8gJ3VybCgjZG90cy0nICsgaSArICctJyArIGogKyAnKSdcbiAgICAgICAgICAgICAgICAgIDogdmFyQ29sb3IoZC5jb2xvcnMsIGkpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9yZWN0PlxuICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgKm5nSWY9XCJyZWN0LnBhdHRlcm4gPT09ICdzdHJpcGVkJ1wiXG4gICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgICAgICAgPjwvcmVjdD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgYmFyIG9mIGQuaG9yaXpvbnRhbEJhcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbmRCYXIgb2YgYmFyOyBsZXQgaiA9IGluZGV4XCI+XG4gICAgICAgICAgICA8ZGVmcyAqbmdJZj1cImluZEJhci5wYXR0ZXJuID09PSAnZG90cydcIj5cbiAgICAgICAgICAgICAgPHBhdHRlcm5cbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZG90cy0nICsgaSArICctJyArIGpcIlxuICAgICAgICAgICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci54XT1cImluZEJhci54XCJcbiAgICAgICAgICAgICAgICBbYXR0ci55XT1cImluZEJhci55XCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjRcIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICAgICAgY3g9XCIyXCJcbiAgICAgICAgICAgICAgICAgIGN5PVwiMlwiXG4gICAgICAgICAgICAgICAgICByPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICAgICAgICA+PC9jaXJjbGU+XG4gICAgICAgICAgICAgIDwvcGF0dGVybj5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIFthdHRyLmRdPVwiaW5kQmFyLmhvcml6b250YWxCYXJcIlxuICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cIlxuICAgICAgICAgICAgICAgIGluZEJhci5wYXR0ZXJuID09PSAnZG90cydcbiAgICAgICAgICAgICAgICAgID8gJ3VybCgjZG90cy0nICsgaSArICctJyArIGogKyAnKSdcbiAgICAgICAgICAgICAgICAgIDogdmFyQ29sb3IoZC5jb2xvcnMsIGkpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJcbiAgICAgICAgICAgICAgICBpbmRCYXIucGF0dGVybiA9PT0gJ2RvdHMnID8gJ25vbmUnIDogdmFyQ29sb3IoZC5jb2xvcnMsIGkpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJpbmRCYXIucGF0dGVybiA9PT0gJ2RvdHMnID8gMCA6IDJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICpuZ0lmPVwiaW5kQmFyLnBhdHRlcm4gPT09ICdzdHJpcGVkJ1wiXG4gICAgICAgICAgICAgIFthdHRyLmRdPVwiaW5kQmFyLmhvcml6b250YWxCYXJcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGxpbmUgb2YgZC5saW5lczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBbYXR0ci5kXT1cImxpbmUubGluZVwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWxpbmVjYXBdPVwiXG4gICAgICAgICAgICAgIGxpbmUucGF0dGVybiA9PT0gJ2RvdHMnID8gJ3JvdW5kJyA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZS1saW5lam9pbl09XCJcbiAgICAgICAgICAgICAgbGluZS5wYXR0ZXJuID09PSAnZG90cycgPyAncm91bmQnIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hhcnJheV09XCJcbiAgICAgICAgICAgICAgbGluZS5wYXR0ZXJuID09PSAnc3RyaXBlZCdcbiAgICAgICAgICAgICAgICA/ICcxMCAxMCdcbiAgICAgICAgICAgICAgICA6IGxpbmUucGF0dGVybiA9PT0gJ2RvdHMnXG4gICAgICAgICAgICAgICAgPyAnMC4yNSA3J1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L3BhdGg+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGxpbmVTaW5nbGVQb2ludEZhbGxiYWNrIG9mIGQuY2lyY2xlczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgIGNsYXNzPVwibWFya2VyXCJcbiAgICAgICAgICAgIFthdHRyLmN4XT1cImxpbmVTaW5nbGVQb2ludEZhbGxiYWNrLmN4XCJcbiAgICAgICAgICAgIFthdHRyLmN5XT1cImxpbmVTaW5nbGVQb2ludEZhbGxiYWNrLmN5XCJcbiAgICAgICAgICAgIHI9XCIzLjVcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICA+PC9jaXJjbGU+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGxpbmUgb2YgZC5saW5lczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgIGNsYXNzPVwibWFya2VyXCJcbiAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICEhaG92ZXIgJiYgKGNvbmZpZy5ncm91cGVkVG9vbHRpcCB8fCBpID09PSBob3Zlci52aXNpYmxlWUluZGV4KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFthdHRyLmN4XT1cImhvdmVyLnhcIlxuICAgICAgICAgICAgW2F0dHIuY3ldPVwiaG92ZXIueXNbaV1cIlxuICAgICAgICAgICAgcj1cIjMuNVwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgID48L2NpcmNsZT5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgYXJlYSBvZiBkLmFyZWFzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHBhdGggW2F0dHIuZF09XCJhcmVhLmFyZWFcIiBbYXR0ci5maWxsXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgKm5nSWY9XCJhcmVhLnBhdHRlcm4gPT09ICdzdHJpcGVkJ1wiXG4gICAgICAgICAgICBbYXR0ci5kXT1cImFyZWEuYXJlYVwiXG4gICAgICAgICAgICBmaWxsPVwidXJsKCNzdHJpcGVzKVwiXG4gICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgYXJlYSBvZiBkLmFyZWFzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgY2xhc3M9XCJtYXJrZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgISFob3ZlciAmJiAoY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT09IGhvdmVyLnZpc2libGVZSW5kZXgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuY3hdPVwiaG92ZXIueFwiXG4gICAgICAgICAgICBbYXR0ci5jeV09XCJob3Zlci55c1tpXVwiXG4gICAgICAgICAgICByPVwiMy41XCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCB3TGluZSBvZiBkLndhdGVyZmFsbExpbmVzXCI+XG4gICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgIGNsYXNzPVwid2F0ZXJmYWxsLWxpbmVcIlxuICAgICAgICAgICAgW2F0dHIueDFdPVwid0xpbmUueDFcIlxuICAgICAgICAgICAgW2F0dHIueDJdPVwid0xpbmUueDJcIlxuICAgICAgICAgICAgW2F0dHIueTFdPVwid0xpbmUueTFcIlxuICAgICAgICAgICAgW2F0dHIueTJdPVwid0xpbmUueTJcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiNlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9nPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBwYXRoIG9mIGQuYXJjczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW2F0dHIuZF09XCJwYXRoXCJcbiAgICAgICAgICBbYXR0ci5maWxsXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgID48L3BhdGg+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBkYXRhTGFiZWwgb2YgZC5kYXRhTGFiZWxzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnNob3dEYXRhTGFiZWxzICYmIGRhdGFMYWJlbC5sYWJlbFwiXG4gICAgICAgICAgICBjbGFzcz1cImRhdGEtbGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIueV09XCJkYXRhTGFiZWwueVBvc1wiXG4gICAgICAgICAgICBbYXR0ci54XT1cImRhdGFMYWJlbC54UG9zXCJcbiAgICAgICAgICAgIFthdHRyLnRleHQtYW5jaG9yXT1cImRhdGFMYWJlbC5hbmNob3JcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGRhdGFMYWJlbC5sYWJlbCB9fVxuICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhTGFiZWwubGluZSAmJiBjb25maWcuc2hvd0RhdGFMYWJlbHNcIlxuICAgICAgICAgICAgW2F0dHIueTFdPVwiZGF0YUxhYmVsLmxpbmUueTFcIlxuICAgICAgICAgICAgW2F0dHIueTJdPVwiZGF0YUxhYmVsLmxpbmUueTJcIlxuICAgICAgICAgICAgW2F0dHIueDFdPVwiZGF0YUxhYmVsLmxpbmUueDFcIlxuICAgICAgICAgICAgW2F0dHIueDJdPVwiZGF0YUxhYmVsLmxpbmUueDJcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICA+PC9saW5lPlxuICAgICAgICA8L2c+XG4gICAgICA8L3N2Zzpzdmc+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnR5cGUgPT09ICdkb251dCdcIiBjbGFzcz1cImRvbnV0LWRpc3BsYXlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvbnV0LXZhbHVlXCIgW25nQ2xhc3NdPVwiY29uZmlnLmRvbnV0RGlzcGxheUluZm8uc2l6ZVwiPlxuICAgICAgICAgIHt7IGNvbmZpZy5kb251dERpc3BsYXlJbmZvLmRpc3BsYXlWYWx1ZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvbnV0LWxhYmVsXCI+XG4gICAgICAgICAge3sgY29uZmlnLmRvbnV0RGlzcGxheUluZm8uZGlzcGxheUxhYmVsIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaG92ZXI/LnRvb2x0aXAgYXMgdG9vbHRpcFwiPlxuICAgICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgICAqcml2LW92ZXJsYXlcbiAgICAgICAgICBbYW5jaG9yXT1cInRvb2x0aXA/LmFuY2hvciA/PyBudWxsXCJcbiAgICAgICAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgICAgICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIidjZW50ZXItcmlnaHQnXCJcbiAgICAgICAgICBbdGhlbWVdPVwiJ2xpZ2h0J1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9vbHRpcC5kYXRlXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgICAgICB7eyB0b29sdGlwLmRhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtcm93XCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiB0b29sdGlwLm1ldHJpY3NcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZXJpZXMtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJtZXRyaWMuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIm1ldHJpYy5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBtZXRyaWMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgbWV0cmljLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvcml2LWNhbGxvdXQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bGVnZW5kPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpcnN0SGlkZGVuTGVnZW5kSXRlbUluZGV4JCB8IGFzeW5jOyBsZXQgZmlcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkLmRhdGEueXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAqbmdJZj1cImkgPCBmaS5kYXRhSW5kZXggJiYgaXRlbS5zaG93TGVnZW5kSXRlbSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgICAgICAgW3N0eWxlXT1cIml0ZW0ucGF0dGVybiB8fCAnc29saWQnXCJcbiAgICAgICAgICAgIFt2aXNpYmlsaXR5XT1cIml0ZW0uaGlkZGVuID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIlxuICAgICAgICAgICAgW2NsaWNrYWJsZV09XCJjb25maWcuYWxsb3dMZWdlbmRUb2dnbGVcIlxuICAgICAgICAgICAgW3Nob3dDaGVja1doZW5DbGlja2FibGVdPVwiaXRlbS5wYXR0ZXJuICE9PSAnZG90cydcIlxuICAgICAgICAgICAgW2NvbG9yVG9rZW5dPVwiY29uZmlnLmNvbG9yc1tpICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdXCJcbiAgICAgICAgICAgIChpdGVtQ2xpY2spPVwidG9nZ2xlTGVnZW5kKGl0ZW0ubGFiZWwpXCJcbiAgICAgICAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZC5kYXRhLnN1cHBsZW1lbnRhcnlZczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAqbmdJZj1cImkgPCBmaS5zdXBwSW5kZXggJiYgaXRlbS5zaG93TGVnZW5kSXRlbSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgICAgICAgW3N0eWxlXT1cIml0ZW0ucGF0dGVybiB8fCAnc29saWQnXCJcbiAgICAgICAgICAgIFt2aXNpYmlsaXR5XT1cIml0ZW0uaGlkZGVuID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIlxuICAgICAgICAgICAgW2NsaWNrYWJsZV09XCJjb25maWcuYWxsb3dMZWdlbmRUb2dnbGVcIlxuICAgICAgICAgICAgW3Nob3dDaGVja1doZW5DbGlja2FibGVdPVwiaXRlbS5wYXR0ZXJuICE9PSAnZG90cydcIlxuICAgICAgICAgICAgW2NvbG9yVG9rZW5dPVwiXG4gICAgICAgICAgICAgIGNvbmZpZy5jb2xvcnNbaXRlbS5hc3NvY2lhdGVkWUluZGV4ICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbS5sYWJlbClcIlxuICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjbW9yZVRleHRDb250YWluZXJcbiAgICAgICAgICBjbGFzcz1cIm1vcmUtdGV4dC1jb250YWluZXJcIlxuICAgICAgICAgIChtb3VzZW92ZXIpPVwibW91c2VvdmVyTGVnZW5kKClcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlbGVhdmVMZWdlbmQoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm1vcmVDbGljaygpXCJcbiAgICAgICAgICAqbmdJZj1cImZpLmhpZGRlbkNvdW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIHJpdkxpbmsgY2xhc3M9XCJtb3JlLXRleHRcIj5cbiAgICAgICAgICAgICtcbiAgICAgICAgICAgIHt7IGZpLmhpZGRlbkNvdW50IH19IG1vcmVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd01vcmVUb29sdGlwIHx8IGxvY2tTaG93TW9yZVRvb2x0aXBcIj5cbiAgICAgICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgICAgICpyaXYtb3ZlcmxheVxuICAgICAgICAgICAgW2FuY2hvcl09XCJtb3JlVGV4dENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudFwiXG4gICAgICAgICAgICBbaXNNb2RhbF09XCJsb2NrU2hvd01vcmVUb29sdGlwXCJcbiAgICAgICAgICAgIChjbG9zZSk9XCJjbG9zZUhhbmRsZXIoKVwiXG4gICAgICAgICAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1yaWdodCdcIlxuICAgICAgICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgICAgICAgW3Nob3dDYXJldF09XCJmYWxzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10b29sdGlwXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZC5kYXRhLnlzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpID49IGZpLmRhdGFJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xpY2thYmxlXT1cImNvbmZpZy5hbGxvd0xlZ2VuZFRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd0NoZWNrV2hlbkNsaWNrYWJsZV09XCJpdGVtLnBhdHRlcm4gIT09ICdkb3RzJ1wiXG4gICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJjb25maWcuY29sb3JzW2kgJSBjb25maWcuY29sb3JzLmxlbmd0aF1cIlxuICAgICAgICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbS5sYWJlbClcIlxuICAgICAgICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkLmRhdGEuc3VwcGxlbWVudGFyeVlzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSA+PSBmaS5zdXBwSW5kZXggJiYgaXRlbS5zaG93TGVnZW5kSXRlbSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIml0ZW0ucGF0dGVybiB8fCAnc29saWQnXCJcbiAgICAgICAgICAgICAgICAgIFt2aXNpYmlsaXR5XT1cIml0ZW0uaGlkZGVuID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yVG9rZW5dPVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb2xvcnNbaXRlbS5hc3NvY2lhdGVkWUluZGV4ICUgY29uZmlnLmNvbG9ycy5sZW5ndGhdXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgW2NsaWNrYWJsZV09XCJjb25maWcuYWxsb3dMZWdlbmRUb2dnbGVcIlxuICAgICAgICAgICAgICAgICAgW3Nob3dDaGVja1doZW5DbGlja2FibGVdPVwiaXRlbS5wYXR0ZXJuICE9PSAnZG90cydcIlxuICAgICAgICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbS5sYWJlbClcIlxuICAgICAgICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3Jpdi1jYWxsb3V0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbGVnZW5kPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlIFttZXNzYWdlXT1cImNvbmZpZy56ZXJvU3RhdGVNZXNzYWdlXCI+PC9yaXYtemVyby1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9jaGFydC9jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixHQUFHLEVBQ0gsSUFBSSxFQUNKLFNBQVMsRUFDVCxPQUFPLEdBQ1IsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7Ozs7Ozs7O0FBUWhDLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLFlBQTZCLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBS25ELFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQVFuQyxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFRaEMsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFlLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQVNqRSxVQUFLLEdBQUcsSUFBSSxlQUFlLENBQWE7WUFDdEMsSUFBSSxFQUFFLFlBQVk7WUFDbEIsQ0FBQyxFQUFFLEVBQUU7WUFDTCxFQUFFLEVBQUUsRUFBRTtTQUNQLENBQUMsQ0FBQztRQUVLLGlCQUFZLEdBQUcsSUFBSSxHQUFHLEVBRzNCLENBQUM7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QUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQTZFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3ZELENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7OzJHQWxUVSxjQUFjOytGQUFkLGNBQWMseVZDNUIzQix5MGRBa2FBOzJGRHRZYSxjQUFjO2tCQU4xQixTQUFTOytCQUNFLFdBQVcsbUJBR0osdUJBQXVCLENBQUMsTUFBTTt3R0FLdkIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNVLGlCQUFpQjtzQkFBaEQsU0FBUzt1QkFBQyxtQkFBbUI7Z0JBb0IxQixNQUFNO3NCQURULEtBQUs7Z0JBb0JGLElBQUk7c0JBRFAsS0FBSztnQkF3R04sWUFBWTtzQkFEWCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgbWFwLFxuICBzY2FuLFxuICBzdGFydFdpdGgsXG4gIFN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2hhcnQgfSBmcm9tICcuL2NoYXJ0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhcnQuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhcnRDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyPzogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbW9yZVRleHRDb250YWluZXInKSBtb3JlVGV4dENvbnRhaW5lcj86IEVsZW1lbnRSZWY7XG5cbiAgaGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMzAwKTtcbiAgc2V0IGhlaWdodCh3OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlaWdodCQubmV4dCh3KTtcbiAgfVxuICBnZXQgaGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQudmFsdWU7XG4gIH1cblxuICB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDApO1xuICBzZXQgd2lkdGgodzogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh3KTtcbiAgfVxuICBnZXQgd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgkLnZhbHVlO1xuICB9XG5cbiAgY29uZmlnJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhcnQuQ29uZmlnPihDaGFydC5kZWZhdWx0Q29uZmlnKTtcbiAgQElucHV0KClcbiAgc2V0IGNvbmZpZyhjOiBDaGFydC5Db25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyQubmV4dChjKTtcbiAgfVxuICBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZyQudmFsdWU7XG4gIH1cblxuICBkYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhcnQuRGF0YT4oe1xuICAgIHR5cGU6ICd0aW1lc2VyaWVzJyxcbiAgICB4OiBbXSxcbiAgICB5czogW10sXG4gIH0pO1xuXG4gIHByaXZhdGUgY29sb3JJbmRpY2VzID0gbmV3IE1hcDxcbiAgICBDaGFydC5EYXRhWSB8IENoYXJ0LlN1cHBsZW1lbnRhcnlEYXRhWSxcbiAgICBudW1iZXJcbiAgPigpO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhKGQ6IENoYXJ0LkRhdGEpIHtcbiAgICB0aGlzLmRhdGEkLm5leHQoZCk7XG4gICAgdGhpcy5jb2xvckluZGljZXMgPSBDaGFydC5jYWxjdWxhdGVDb2xvckluZGljZXMoZCk7XG4gIH1cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSQudmFsdWU7XG4gIH1cblxuICBnZXRJdGVtS2V5KFxuICAgIGl0ZW06IENoYXJ0LkRhdGFZIHwgQ2hhcnQuU3VwcGxlbWVudGFyeURhdGFZLFxuICAgIGluZGV4OiBudW1iZXIsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdzdXBwbGVtZW50YWxJbmRleCcgaW4gaXRlbSA/IGBzdXBwLSR7aW5kZXh9YCA6IGB5LSR7aW5kZXh9YDtcbiAgfVxuXG4gIHRvZ2dsZUxlZ2VuZChpdGVtOiBDaGFydC5EYXRhWSB8IENoYXJ0LlN1cHBsZW1lbnRhcnlEYXRhWSwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMudG9nZ2xlTGVnZW5kJC5uZXh0KHRoaXMuZ2V0SXRlbUtleShpdGVtLCBpbmRleCkpO1xuICB9XG5cbiAgdG9nZ2xlTGVnZW5kJCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICAvLyB0b2dnbGVkTGVnZW5kJCBpcyBqdXN0IGEgc2V0IG9mIGJvb2xlYW5cbiAgLy8gdmFsdWVzIGZvciB3aGljaCBsZWdlbmRzIGhhdmUgYmVlbiB0b2dnbGVkLlxuICAvLyBXZSBkb24ndCBrbm93IGlmIHRob3NlIGxlZ2VuZHMgd2hlcmUgYWxyZWFkeVxuICAvLyBoaWRkZW4gb3Igbm90LCB3ZSBqdXN0IGtub3cgd2hldGhlciB0aGV5IGhhdmVcbiAgLy8gYmVlbiB0b2dnbGVkLlxuICB0b2dnbGVkTGVnZW5kcyQgPSB0aGlzLnRvZ2dsZUxlZ2VuZCQucGlwZShcbiAgICBzY2FuPHN0cmluZywgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KFxuICAgICAgKGFjYywgdmFsdWUpID0+ICh7IC4uLmFjYywgW3ZhbHVlXTogIWFjY1t2YWx1ZV0gfSksXG4gICAgICB7fSxcbiAgICApLFxuICAgIHN0YXJ0V2l0aDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pLFxuICApO1xuXG4gIGRyYXdEYXRhJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuY29uZmlnJCxcbiAgICB0aGlzLmRhdGEkLFxuICAgIHRoaXMudG9nZ2xlZExlZ2VuZHMkLFxuICBdKS5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyZW50KSA9PiBpc0VxdWFsKHByZXYsIGN1cnJlbnQpKSxcbiAgICBtYXAoKFt3aWR0aCwgY29uZmlnLCBkYXRhLCB0b2dnbGVkTGVnZW5kc10pID0+IHtcbiAgICAgIGlmICh3aWR0aCA9PSAwKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgaGlkZGVuRGF0YSA9IHtcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgeXM6IGRhdGEueXMubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAuLi55LFxuICAgICAgICAgIC8vIGlmIHRvZ2dsZWQsIGZsaXAgdGhlIGhpZGRlbiBib29sZWFuXG4gICAgICAgICAgaGlkZGVuOiB0b2dnbGVkTGVnZW5kc1tgeS0ke2luZGV4fWBdID8gIXkuaGlkZGVuIDogeS5oaWRkZW4sXG4gICAgICAgIH0pKSxcbiAgICAgICAgc3VwcGxlbWVudGFyeVlzOiBkYXRhLnN1cHBsZW1lbnRhcnlZcz8ubWFwKCh5LCBpbmRleCkgPT4gKHtcbiAgICAgICAgICAuLi55LFxuICAgICAgICAgIGhpZGRlbjogdG9nZ2xlZExlZ2VuZHNbYHN1cHAtJHtpbmRleH1gXSA/ICF5LmhpZGRlbiA6IHkuaGlkZGVuLFxuICAgICAgICB9KSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB2aWV3Qm94ID1cbiAgICAgICAgY29uZmlnLnR5cGUgPT0gJ2RvbnV0J1xuICAgICAgICAgID8gYCR7LXRoaXMuaGVpZ2h0IC8gMn0gJHstdGhpcy5oZWlnaHQgLyAyfVxuICAgICAgICAgICAgICAke3RoaXMuaGVpZ2h0fSAke3RoaXMuaGVpZ2h0fWBcbiAgICAgICAgICA6IGAwIDAgJHt3aWR0aH0gJHt0aGlzLmhlaWdodH1gO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmlld0JveCxcbiAgICAgICAgZGF0YTogaGlkZGVuRGF0YSxcbiAgICAgICAgLi4uQ2hhcnQuY2hhcnQoY29uZmlnLCBoaWRkZW5EYXRhLCB7XG4gICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9KSxcbiAgKTtcblxuICBlbXB0eSQgPSB0aGlzLmRhdGEkLnBpcGUoXG4gICAgbWFwKFxuICAgICAgZCA9PiAoZC54Lmxlbmd0aCA9PSAwICYmIHRoaXMuY29uZmlnLnR5cGUgIT0gJ2RvbnV0JykgfHwgZC55cy5sZW5ndGggPT0gMCxcbiAgICApLFxuICApO1xuXG4gIGhvdmVyOiBSZXR1cm5UeXBlPENoYXJ0LkhvdmVyPiB8IG51bGwgPSBudWxsO1xuXG4gIG1vdXNlbW92ZSgkZXZlbnQ6IE1vdXNlRXZlbnQsIGhvdmVyPzogQ2hhcnQuSG92ZXIpIHtcbiAgICBpZiAoIWhvdmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5jb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKGNvbnRhaW5lckVsID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjdCA9IGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuaG92ZXIgPSBob3Zlcih7XG4gICAgICByZWN0LFxuICAgICAgeDogJGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgICB5OiAkZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wLFxuICAgIH0pO1xuICB9XG5cbiAgbW91c2VsZWF2ZSgkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmhvdmVyID0gbnVsbDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBjaGFydENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICB4SW5kZXg6IG51bWJlcjtcbiAgICB5SW5kZXg6IG51bWJlcjtcbiAgICBzdXBwWUluZGV4PzogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNsaWNrKCkge1xuICAgIGlmICh0aGlzLmhvdmVyICYmIHRoaXMuaXNIb3ZlckNsaWNrYWJsZSkge1xuICAgICAgdGhpcy5jaGFydENsaWNrZWQuZW1pdCh7XG4gICAgICAgIHhJbmRleDogdGhpcy5ob3Zlci54SW5kZXgsXG4gICAgICAgIHlJbmRleDogdGhpcy5ob3Zlci55SW5kZXgsXG4gICAgICAgIC4uLih0aGlzLmhvdmVyLmlzU3VwcFZhbHVlICYmXG4gICAgICAgIHRoaXMuaG92ZXIuc3VwcFlJbmRleCAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgdGhpcy5ob3Zlci5zdXBwWUluZGV4ID49IDBcbiAgICAgICAgICA/IHsgc3VwcFlJbmRleDogdGhpcy5ob3Zlci5zdXBwWUluZGV4IH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5ob3ZlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzSG92ZXJDbGlja2FibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhvdmVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgaG92ZXJpbmcgYSBzdXBwbGVtZW50YXJ5IHZhbHVlIHNwZWNpZmljYWxseSwgY2hlY2sgaWYgaXQncyBjbGlja2FibGVcbiAgICBpZiAodGhpcy5ob3Zlci5pc1N1cHBWYWx1ZSAmJiB0aGlzLmhvdmVyLnN1cHBZSW5kZXggIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3VwcFlJbmRleCA9IHRoaXMuaG92ZXIuc3VwcFlJbmRleDtcbiAgICAgIGNvbnN0IHN1cHBsZW1lbnRhcnlZcyA9IHRoaXMuZGF0YS5zdXBwbGVtZW50YXJ5WXM7XG4gICAgICBpZiAoXG4gICAgICAgICFzdXBwbGVtZW50YXJ5WXMgfHxcbiAgICAgICAgc3VwcFlJbmRleCA8IDAgfHxcbiAgICAgICAgc3VwcFlJbmRleCA+PSBzdXBwbGVtZW50YXJ5WXMubGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN1cHBsZW1lbnRhcnlZc1tzdXBwWUluZGV4XT8uY2xpY2thYmxlID09PSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZvciBncm91cGVkIHRvb2x0aXBzLCBjaGVjayBpZiBhbnkgdmlzaWJsZSBpdGVtIGlzIGNsaWNrYWJsZVxuICAgIGNvbnN0IHlJbmRleCA9IHRoaXMuaG92ZXIueUluZGV4O1xuICAgIGlmICh0aGlzLmNvbmZpZy5ncm91cGVkVG9vbHRpcCkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG1haW4gWSB2YWx1ZSBpcyBjbGlja2FibGVcbiAgICAgIGlmICh0aGlzLmRhdGEueXNbeUluZGV4XT8uY2xpY2thYmxlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNpbmdsZSBpdGVtIHRvb2x0aXA6IGNoZWNrIGlmIHRoZSBob3ZlcmVkIFkgdmFsdWUgaXMgY2xpY2thYmxlXG4gICAgcmV0dXJuIHRoaXMuZGF0YS55c1t5SW5kZXhdPy5jbGlja2FibGUgPT09IHRydWU7XG4gIH1cblxuICB2YXJDb2xvcihjb2xvcnM6IHN0cmluZ1tdLCBpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGB2YXIoJHtjb2xvcnNbaW5kZXggJSBjb2xvcnMubGVuZ3RoXX0pYDtcbiAgfVxuXG4gIGdldEl0ZW1Db2xvcihcbiAgICBpdGVtOiBDaGFydC5EYXRhWSB8IENoYXJ0LlN1cHBsZW1lbnRhcnlEYXRhWSxcbiAgICBpdGVtSW5kZXg6IG51bWJlcixcbiAgKTogc3RyaW5nIHtcbiAgICAvLyBVc2UgaW5kZXggdG8gZ2V0IHRoZSBvcmlnaW5hbCBpdGVtIChkcmF3RGF0YSQgbWFpbnRhaW5zIHNhbWUgaW5kaWNlcyBhcyB0aGlzLmRhdGEpXG4gICAgY29uc3Qgb3JpZ2luYWxJdGVtID1cbiAgICAgICdzdXBwbGVtZW50YWxJbmRleCcgaW4gaXRlbVxuICAgICAgICA/IHRoaXMuZGF0YS5zdXBwbGVtZW50YXJ5WXMhW2l0ZW1JbmRleF1cbiAgICAgICAgOiB0aGlzLmRhdGEueXNbaXRlbUluZGV4XTtcblxuICAgIHJldHVybiBDaGFydC5nZXRDb2xvcihvcmlnaW5hbEl0ZW0sIHRoaXMuY29sb3JJbmRpY2VzLCB0aGlzLmNvbmZpZy5jb2xvcnMpO1xuICB9XG5cbiAgc2hvd01vcmVUb29sdGlwID0gZmFsc2U7XG4gIGxvY2tTaG93TW9yZVRvb2x0aXAgPSBmYWxzZTtcblxuICBtb3JlVGV4dFdpZHRoID0gNTA7XG4gIGJhc2VMZWdlbmRJdGVtV2lkdGggPSA0MDtcbiAgd2lkdGhQZXJMZXR0ZXIgPSA2LjU7XG4gIGxlZnRMYWJlbE1heFNpemUgPSBDaGFydC5MRUZUX1BBRERJTkdfTEFCRUxfTUFYO1xuICByaWdodExhYmVsTWF4U2l6ZSA9IENoYXJ0LlJJR0hUX1BBRERJTkc7XG5cbiAgZmlyc3RIaWRkZW5MZWdlbmRJdGVtSW5kZXgkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5jb25maWckLFxuICAgIHRoaXMuZGF0YSQsXG4gIF0pLnBpcGUoXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnJlbnQpID0+IGlzRXF1YWwocHJldiwgY3VycmVudCkpLFxuICAgIG1hcCgoW3dpZHRoLCBjb25maWcsIGRhdGFdKSA9PiB7XG4gICAgICBpZiAoIWNvbmZpZy50cnVuY2F0ZUxlZ2VuZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGFJbmRleDogZGF0YS55cy5sZW5ndGgsXG4gICAgICAgICAgc3VwcEluZGV4OiBkYXRhLnN1cHBsZW1lbnRhcnlZcz8ubGVuZ3RoID8/IDAsXG4gICAgICAgICAgaGlkZGVuQ291bnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxldCB3aWR0aFJ1bm5pbmdUb3RhbCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEueXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGRhdGEueXNbaV0uc2hvd0xlZ2VuZEl0ZW0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kSXRlbVdpZHRoID1cbiAgICAgICAgICB0aGlzLmJhc2VMZWdlbmRJdGVtV2lkdGggK1xuICAgICAgICAgIGRhdGEueXNbaV0ubGFiZWwubGVuZ3RoICogdGhpcy53aWR0aFBlckxldHRlcjtcbiAgICAgICAgaWYgKHdpZHRoUnVubmluZ1RvdGFsICsgaW5kSXRlbVdpZHRoID49IHdpZHRoIC0gdGhpcy5tb3JlVGV4dFdpZHRoKSB7XG4gICAgICAgICAgY29uc3QgcmVtYWluaW5nWXNDb3VudCA9IGRhdGEueXNcbiAgICAgICAgICAgIC5zbGljZShpKVxuICAgICAgICAgICAgLmZpbHRlcih5ID0+IHkuc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3Qgc3VwcFlzQ291bnQgPVxuICAgICAgICAgICAgZGF0YS5zdXBwbGVtZW50YXJ5WXM/LmZpbHRlcih5ID0+IHkuc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlKVxuICAgICAgICAgICAgICAubGVuZ3RoID8/IDA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGFJbmRleDogaSxcbiAgICAgICAgICAgIHN1cHBJbmRleDogMCxcbiAgICAgICAgICAgIGhpZGRlbkNvdW50OiByZW1haW5pbmdZc0NvdW50ICsgc3VwcFlzQ291bnQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB3aWR0aFJ1bm5pbmdUb3RhbCArPSBpbmRJdGVtV2lkdGg7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5zdXBwbGVtZW50YXJ5WXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnN1cHBsZW1lbnRhcnlZcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChkYXRhLnN1cHBsZW1lbnRhcnlZc1tpXS5zaG93TGVnZW5kSXRlbSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBpbmRJdGVtV2lkdGggPVxuICAgICAgICAgICAgdGhpcy5iYXNlTGVnZW5kSXRlbVdpZHRoICtcbiAgICAgICAgICAgIGRhdGEuc3VwcGxlbWVudGFyeVlzW2ldLmxhYmVsLmxlbmd0aCAqIHRoaXMud2lkdGhQZXJMZXR0ZXI7XG4gICAgICAgICAgaWYgKHdpZHRoUnVubmluZ1RvdGFsICsgaW5kSXRlbVdpZHRoID49IHdpZHRoIC0gdGhpcy5tb3JlVGV4dFdpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCByZW1haW5pbmdTdXBwWXNDb3VudCA9IGRhdGEuc3VwcGxlbWVudGFyeVlzXG4gICAgICAgICAgICAgIC5zbGljZShpKVxuICAgICAgICAgICAgICAuZmlsdGVyKHkgPT4geS5zaG93TGVnZW5kSXRlbSAhPT0gZmFsc2UpLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGRhdGFJbmRleDogZGF0YS55cy5sZW5ndGgsXG4gICAgICAgICAgICAgIHN1cHBJbmRleDogaSxcbiAgICAgICAgICAgICAgaGlkZGVuQ291bnQ6IHJlbWFpbmluZ1N1cHBZc0NvdW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd2lkdGhSdW5uaW5nVG90YWwgKz0gaW5kSXRlbVdpZHRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhSW5kZXg6IGRhdGEueXMubGVuZ3RoLFxuICAgICAgICBzdXBwSW5kZXg6IGRhdGEuc3VwcGxlbWVudGFyeVlzPy5sZW5ndGggPz8gMCxcbiAgICAgICAgaGlkZGVuQ291bnQ6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSksXG4gICk7XG5cbiAgbW9yZUNsaWNrKCkge1xuICAgIHRoaXMubG9ja1Nob3dNb3JlVG9vbHRpcCA9ICF0aGlzLmxvY2tTaG93TW9yZVRvb2x0aXA7XG4gIH1cblxuICBjbG9zZUhhbmRsZXIoKSB7XG4gICAgdGhpcy5sb2NrU2hvd01vcmVUb29sdGlwID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBtb3VzZW92ZXJMZWdlbmQoKSB7XG4gICAgdGhpcy5zaG93TW9yZVRvb2x0aXAgPSB0cnVlO1xuICB9XG5cbiAgbW91c2VsZWF2ZUxlZ2VuZCgpIHtcbiAgICB0aGlzLnNob3dNb3JlVG9vbHRpcCA9IGZhbHNlO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiY29udGFpbmVyXCJcbiAgKHJpdkNsaWVudFNpemUpPVwid2lkdGggPSAkZXZlbnQud2lkdGhcIlxuICAqbmdJZj1cIihlbXB0eSQgfCBhc3luYykgPT09IGZhbHNlOyBlbHNlIHplcm9TdGF0ZVwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRcIj5cbiAgICA8ZGl2XG4gICAgICAobW91c2Vtb3ZlKT1cIm1vdXNlbW92ZSgkZXZlbnQsIGQuaG92ZXIpXCJcbiAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlbGVhdmUoJGV2ZW50KVwiXG4gICAgICAoY2xpY2spPVwiY2xpY2soKVwiXG4gICAgICAjY29udGFpbmVyXG4gICAgICBjbGFzcz1cInN1Yi1jb250YWluZXJcIlxuICAgICAgW2NsYXNzLmNsaWNrYWJsZV09XCJpc0hvdmVyQ2xpY2thYmxlXCJcbiAgICA+XG4gICAgICA8c3ZnOnN2Z1xuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgW2F0dHIudmlld0JveF09XCJkLnZpZXdCb3hcIlxuICAgICAgICB3aWR0aD1cIjEwMCVcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgID5cbiAgICAgICAgPGRlZnM+XG4gICAgICAgICAgPCEtLSBTdHJpcGUgcGF0dGVybiAtLT5cbiAgICAgICAgICA8cGF0dGVyblxuICAgICAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICAgIHk9XCIwXCJcbiAgICAgICAgICAgIFthdHRyLndpZHRoXT1cIjEwXCJcbiAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCIxMFwiXG4gICAgICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgW2F0dHIueDFdPVwiMFwiXG4gICAgICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgICAgICBbYXR0ci54Ml09XCIxMFwiXG4gICAgICAgICAgICAgIFthdHRyLnkyXT1cIjEwXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgICAgPjwvbGluZT5cbiAgICAgICAgICA8L3BhdHRlcm4+XG4gICAgICAgIDwvZGVmcz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoY29uZmlnLnR5cGUgPT09ICdob3Jpem9udGFsLWJhcicpXCI+XG4gICAgICAgICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54VGlja3NcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiPlxuICAgICAgICAgICAgPHRleHQgY2xhc3M9XCJ0aWNrLWxhYmVsXCIgW2F0dHIueF09XCJ0aWNrLnhcIiBbYXR0ci55XT1cImhlaWdodCAtIDRcIj5cbiAgICAgICAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWcudHlwZSA9PT0gJ2hvcml6b250YWwtYmFyJ1wiPlxuICAgICAgICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueFRpY2tzXCIgdGV4dC1hbmNob3I9XCJsZWZ0XCI+XG4gICAgICAgICAgICA8dGV4dCBjbGFzcz1cInRpY2stbGFiZWxcIiBbYXR0ci54XT1cInRpY2sueFwiIFthdHRyLnldPVwiMTJcIj5cbiAgICAgICAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxpbmVcIlxuICAgICAgICAgICAgICBbYXR0ci54MV09XCJ0aWNrLnhcIlxuICAgICAgICAgICAgICBbYXR0ci54Ml09XCJ0aWNrLnhcIlxuICAgICAgICAgICAgICB5MT1cIjBcIlxuICAgICAgICAgICAgICBbYXR0ci55Ml09XCJoZWlnaHQgLSAxNlwiXG4gICAgICAgICAgICA+PC9saW5lPlxuICAgICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICAgKm5nSWY9XCJ0aWNrLnNlY29uZGFyeUxhYmVsXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cImhlaWdodCAtIDE2XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdGljay5zZWNvbmRhcnlMYWJlbCB9fVxuICAgICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGQueVRpY2tzXCI+XG4gICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICpuZ0lmPVwiIShjb25maWcudHlwZSA9PT0gJ2hvcml6b250YWwtYmFyJylcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxpbmVcIlxuICAgICAgICAgICAgW2F0dHIueTFdPVwidGljay55XCJcbiAgICAgICAgICAgIFthdHRyLnkyXT1cInRpY2sueVwiXG4gICAgICAgICAgICB4MT1cIjBcIlxuICAgICAgICAgICAgW2F0dHIueDJdPVwid2lkdGhcIlxuICAgICAgICAgID48L2xpbmU+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgIHJpdlNWR1RleHRUcnVuY2F0ZVxuICAgICAgICAgICAgW3RleHRdPVwidGljay5sYWJlbFwiXG4gICAgICAgICAgICBbd2lkdGhdPVwibGVmdExhYmVsTWF4U2l6ZVwiXG4gICAgICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIueV09XCJ0aWNrLnkgLSA0XCJcbiAgICAgICAgICAgIFthdHRyLnhdPVwiMFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdGljay5sYWJlbCB9fVxuICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICA8dGV4dFxuICAgICAgICAgICAgKm5nSWY9XCJ0aWNrLnNlY29uZGFyeUxhYmVsXCJcbiAgICAgICAgICAgIHJpdlNWR1RleHRUcnVuY2F0ZVxuICAgICAgICAgICAgW3RleHRdPVwidGljay5zZWNvbmRhcnlMYWJlbFwiXG4gICAgICAgICAgICBbd2lkdGhdPVwicmlnaHRMYWJlbE1heFNpemVcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgICAgIFthdHRyLnldPVwidGljay55IC0gNFwiXG4gICAgICAgICAgICBbYXR0ci54XT1cIndpZHRoXCJcbiAgICAgICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0aWNrLnNlY29uZGFyeUxhYmVsIH19XG4gICAgICAgICAgPC90ZXh0PlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0lmPVwiISFob3ZlciAmJiAhKGNvbmZpZy50eXBlID09PSAnaG9yaXpvbnRhbC1iYXInKVwiPlxuICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICBjbGFzcz1cInRpY2stbGluZVwiXG4gICAgICAgICAgICBbYXR0ci54MV09XCJob3Zlci54XCJcbiAgICAgICAgICAgIFthdHRyLngyXT1cImhvdmVyLnhcIlxuICAgICAgICAgICAgeTE9XCIwXCJcbiAgICAgICAgICAgIFthdHRyLnkyXT1cImhlaWdodCAtIDE2XCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT1cIjRcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGJhciBvZiBkLmJhcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZWN0IG9mIGJhcjsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgICAgPGRlZnMgKm5nSWY9XCJyZWN0LnBhdHRlcm4gPT09ICdkb3RzJ1wiPlxuICAgICAgICAgICAgICA8cGF0dGVyblxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidkb3RzLScgKyBpICsgJy0nICsgalwiXG4gICAgICAgICAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgICAgICAgICAgd2lkdGg9XCI0XCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgIGN4PVwiMlwiXG4gICAgICAgICAgICAgICAgICBjeT1cIjJcIlxuICAgICAgICAgICAgICAgICAgcj1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICAgICAgICA8L3BhdHRlcm4+XG4gICAgICAgICAgICA8L2RlZnM+XG5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJcbiAgICAgICAgICAgICAgICByZWN0LnBhdHRlcm4gPT09ICdkb3RzJ1xuICAgICAgICAgICAgICAgICAgPyAndXJsKCNkb3RzLScgKyBpICsgJy0nICsgaiArICcpJ1xuICAgICAgICAgICAgICAgICAgOiB2YXJDb2xvcihkLmNvbG9ycywgaSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L3JlY3Q+XG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICAqbmdJZj1cInJlY3QucGF0dGVybiA9PT0gJ3N0cmlwZWQnXCJcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICAgICAgICBmaWxsPVwidXJsKCNzdHJpcGVzKVwiXG4gICAgICAgICAgICA+PC9yZWN0PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBiYXIgb2YgZC5ob3Jpem9udGFsQmFyczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGluZEJhciBvZiBiYXI7IGxldCBqID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkZWZzICpuZ0lmPVwiaW5kQmFyLnBhdHRlcm4gPT09ICdkb3RzJ1wiPlxuICAgICAgICAgICAgICA8cGF0dGVyblxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidkb3RzLScgKyBpICsgJy0nICsgalwiXG4gICAgICAgICAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgICAgICAgICAgIFthdHRyLnhdPVwiaW5kQmFyLnhcIlxuICAgICAgICAgICAgICAgIFthdHRyLnldPVwiaW5kQmFyLnlcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiNFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICBjeD1cIjJcIlxuICAgICAgICAgICAgICAgICAgY3k9XCIyXCJcbiAgICAgICAgICAgICAgICAgIHI9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgICAgICAgID48L2NpcmNsZT5cbiAgICAgICAgICAgICAgPC9wYXR0ZXJuPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgW2F0dHIuZF09XCJpbmRCYXIuaG9yaXpvbnRhbEJhclwiXG4gICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwiXG4gICAgICAgICAgICAgICAgaW5kQmFyLnBhdHRlcm4gPT09ICdkb3RzJ1xuICAgICAgICAgICAgICAgICAgPyAndXJsKCNkb3RzLScgKyBpICsgJy0nICsgaiArICcpJ1xuICAgICAgICAgICAgICAgICAgOiB2YXJDb2xvcihkLmNvbG9ycywgaSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cIlxuICAgICAgICAgICAgICAgIGluZEJhci5wYXR0ZXJuID09PSAnZG90cycgPyAnbm9uZScgOiB2YXJDb2xvcihkLmNvbG9ycywgaSlcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cImluZEJhci5wYXR0ZXJuID09PSAnZG90cycgPyAwIDogMlwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgKm5nSWY9XCJpbmRCYXIucGF0dGVybiA9PT0gJ3N0cmlwZWQnXCJcbiAgICAgICAgICAgICAgW2F0dHIuZF09XCJpbmRCYXIuaG9yaXpvbnRhbEJhclwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgICAgICBmaWxsPVwidXJsKCNzdHJpcGVzKVwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjBcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgbGluZSBvZiBkLmxpbmVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIFthdHRyLmRdPVwibGluZS5saW5lXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2UtbGluZWNhcF09XCJcbiAgICAgICAgICAgICAgbGluZS5wYXR0ZXJuID09PSAnZG90cycgPyAncm91bmQnIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWxpbmVqb2luXT1cIlxuICAgICAgICAgICAgICBsaW5lLnBhdHRlcm4gPT09ICdkb3RzJyA/ICdyb3VuZCcgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cIlxuICAgICAgICAgICAgICBsaW5lLnBhdHRlcm4gPT09ICdzdHJpcGVkJ1xuICAgICAgICAgICAgICAgID8gJzEwIDEwJ1xuICAgICAgICAgICAgICAgIDogbGluZS5wYXR0ZXJuID09PSAnZG90cydcbiAgICAgICAgICAgICAgICA/ICcwLjI1IDcnXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgbGluZVNpbmdsZVBvaW50RmFsbGJhY2sgb2YgZC5jaXJjbGVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgY2xhc3M9XCJtYXJrZXJcIlxuICAgICAgICAgICAgW2F0dHIuY3hdPVwibGluZVNpbmdsZVBvaW50RmFsbGJhY2suY3hcIlxuICAgICAgICAgICAgW2F0dHIuY3ldPVwibGluZVNpbmdsZVBvaW50RmFsbGJhY2suY3lcIlxuICAgICAgICAgICAgcj1cIjMuNVwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgID48L2NpcmNsZT5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgbGluZSBvZiBkLmxpbmVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgY2xhc3M9XCJtYXJrZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgISFob3ZlciAmJiAoY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT09IGhvdmVyLnZpc2libGVZSW5kZXgpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuY3hdPVwiaG92ZXIueFwiXG4gICAgICAgICAgICBbYXR0ci5jeV09XCJob3Zlci55c1tpXVwiXG4gICAgICAgICAgICByPVwiMy41XCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBhcmVhIG9mIGQuYXJlYXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8cGF0aCBbYXR0ci5kXT1cImFyZWEuYXJlYVwiIFthdHRyLmZpbGxdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCI+PC9wYXRoPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAqbmdJZj1cImFyZWEucGF0dGVybiA9PT0gJ3N0cmlwZWQnXCJcbiAgICAgICAgICAgIFthdHRyLmRdPVwiYXJlYS5hcmVhXCJcbiAgICAgICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBhcmVhIG9mIGQuYXJlYXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICBjbGFzcz1cIm1hcmtlclwiXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAhIWhvdmVyICYmIChjb25maWcuZ3JvdXBlZFRvb2x0aXAgfHwgaSA9PT0gaG92ZXIudmlzaWJsZVlJbmRleClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbYXR0ci5jeF09XCJob3Zlci54XCJcbiAgICAgICAgICAgIFthdHRyLmN5XT1cImhvdmVyLnlzW2ldXCJcbiAgICAgICAgICAgIHI9XCIzLjVcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICA+PC9jaXJjbGU+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IHdMaW5lIG9mIGQud2F0ZXJmYWxsTGluZXNcIj5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgY2xhc3M9XCJ3YXRlcmZhbGwtbGluZVwiXG4gICAgICAgICAgICBbYXR0ci54MV09XCJ3TGluZS54MVwiXG4gICAgICAgICAgICBbYXR0ci54Ml09XCJ3TGluZS54MlwiXG4gICAgICAgICAgICBbYXR0ci55MV09XCJ3TGluZS55MVwiXG4gICAgICAgICAgICBbYXR0ci55Ml09XCJ3TGluZS55MlwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI2XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhdGggb2YgZC5hcmNzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBbYXR0ci5kXT1cInBhdGhcIlxuICAgICAgICAgIFthdHRyLmZpbGxdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGRhdGFMYWJlbCBvZiBkLmRhdGFMYWJlbHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8dGV4dFxuICAgICAgICAgICAgKm5nSWY9XCJjb25maWcuc2hvd0RhdGFMYWJlbHMgJiYgZGF0YUxhYmVsLmxhYmVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZGF0YS1sYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci55XT1cImRhdGFMYWJlbC55UG9zXCJcbiAgICAgICAgICAgIFthdHRyLnhdPVwiZGF0YUxhYmVsLnhQb3NcIlxuICAgICAgICAgICAgW2F0dHIudGV4dC1hbmNob3JdPVwiZGF0YUxhYmVsLmFuY2hvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZGF0YUxhYmVsLmxhYmVsIH19XG4gICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAqbmdJZj1cImRhdGFMYWJlbC5saW5lICYmIGNvbmZpZy5zaG93RGF0YUxhYmVsc1wiXG4gICAgICAgICAgICBbYXR0ci55MV09XCJkYXRhTGFiZWwubGluZS55MVwiXG4gICAgICAgICAgICBbYXR0ci55Ml09XCJkYXRhTGFiZWwubGluZS55MlwiXG4gICAgICAgICAgICBbYXR0ci54MV09XCJkYXRhTGFiZWwubGluZS54MVwiXG4gICAgICAgICAgICBbYXR0ci54Ml09XCJkYXRhTGFiZWwubGluZS54MlwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgID48L2xpbmU+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnOnN2Zz5cbiAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcudHlwZSA9PT0gJ2RvbnV0J1wiIGNsYXNzPVwiZG9udXQtZGlzcGxheVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG9udXQtdmFsdWVcIiBbbmdDbGFzc109XCJjb25maWcuZG9udXREaXNwbGF5SW5mby5zaXplXCI+XG4gICAgICAgICAge3sgY29uZmlnLmRvbnV0RGlzcGxheUluZm8uZGlzcGxheVZhbHVlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG9udXQtbGFiZWxcIj5cbiAgICAgICAgICB7eyBjb25maWcuZG9udXREaXNwbGF5SW5mby5kaXNwbGF5TGFiZWwgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJob3Zlcj8udG9vbHRpcCBhcyB0b29sdGlwXCI+XG4gICAgICAgIDxyaXYtY2FsbG91dFxuICAgICAgICAgICpyaXYtb3ZlcmxheVxuICAgICAgICAgIFthbmNob3JdPVwidG9vbHRpcD8uYW5jaG9yID8/IG51bGxcIlxuICAgICAgICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICAgICAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2NlbnRlci1yaWdodCdcIlxuICAgICAgICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ0b29sdGlwLmRhdGVcIiBjbGFzcz1cImNhbGxvdXQtcm93XCI+XG4gICAgICAgICAgICAgIHt7IHRvb2x0aXAuZGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1yb3dcIiAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIHRvb2x0aXAubWV0cmljc1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cIm1ldHJpYy5jb2xvclwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwibWV0cmljLnBhdHRlcm4gfHwgJ3NvbGlkJ1wiXG4gICAgICAgICAgICAgICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1ldHJpYy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBtZXRyaWMudmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9yaXYtY2FsbG91dD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxsZWdlbmQ+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlyc3RIaWRkZW5MZWdlbmRJdGVtSW5kZXgkIHwgYXN5bmM7IGxldCBmaVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGQuZGF0YS55czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICpuZ0lmPVwiaSA8IGZpLmRhdGFJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICBbY2xpY2thYmxlXT1cImNvbmZpZy5hbGxvd0xlZ2VuZFRvZ2dsZVwiXG4gICAgICAgICAgICBbc2hvd0NoZWNrV2hlbkNsaWNrYWJsZV09XCJpdGVtLnBhdHRlcm4gIT09ICdkb3RzJ1wiXG4gICAgICAgICAgICBbY29sb3JUb2tlbl09XCJnZXRJdGVtQ29sb3IoaXRlbSwgaSlcIlxuICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbSwgaSlcIlxuICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkLmRhdGEuc3VwcGxlbWVudGFyeVlzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICpuZ0lmPVwiaSA8IGZpLnN1cHBJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICBbY2xpY2thYmxlXT1cImNvbmZpZy5hbGxvd0xlZ2VuZFRvZ2dsZVwiXG4gICAgICAgICAgICBbc2hvd0NoZWNrV2hlbkNsaWNrYWJsZV09XCJpdGVtLnBhdHRlcm4gIT09ICdkb3RzJ1wiXG4gICAgICAgICAgICBbY29sb3JUb2tlbl09XCJnZXRJdGVtQ29sb3IoaXRlbSwgaSlcIlxuICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbSwgaSlcIlxuICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjbW9yZVRleHRDb250YWluZXJcbiAgICAgICAgICBjbGFzcz1cIm1vcmUtdGV4dC1jb250YWluZXJcIlxuICAgICAgICAgIChtb3VzZW92ZXIpPVwibW91c2VvdmVyTGVnZW5kKClcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlbGVhdmVMZWdlbmQoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm1vcmVDbGljaygpXCJcbiAgICAgICAgICAqbmdJZj1cImZpLmhpZGRlbkNvdW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIHJpdkxpbmsgY2xhc3M9XCJtb3JlLXRleHRcIj5cbiAgICAgICAgICAgICtcbiAgICAgICAgICAgIHt7IGZpLmhpZGRlbkNvdW50IH19IG1vcmVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd01vcmVUb29sdGlwIHx8IGxvY2tTaG93TW9yZVRvb2x0aXBcIj5cbiAgICAgICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgICAgICpyaXYtb3ZlcmxheVxuICAgICAgICAgICAgW2FuY2hvcl09XCJtb3JlVGV4dENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudFwiXG4gICAgICAgICAgICBbaXNNb2RhbF09XCJsb2NrU2hvd01vcmVUb29sdGlwXCJcbiAgICAgICAgICAgIChjbG9zZSk9XCJjbG9zZUhhbmRsZXIoKVwiXG4gICAgICAgICAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1yaWdodCdcIlxuICAgICAgICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgICAgICAgW3Nob3dDYXJldF09XCJmYWxzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10b29sdGlwXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZC5kYXRhLnlzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpID49IGZpLmRhdGFJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xpY2thYmxlXT1cImNvbmZpZy5hbGxvd0xlZ2VuZFRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd0NoZWNrV2hlbkNsaWNrYWJsZV09XCJpdGVtLnBhdHRlcm4gIT09ICdkb3RzJ1wiXG4gICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJnZXRJdGVtQ29sb3IoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkLmRhdGEuc3VwcGxlbWVudGFyeVlzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSA+PSBmaS5zdXBwSW5kZXggJiYgaXRlbS5zaG93TGVnZW5kSXRlbSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIml0ZW0ucGF0dGVybiB8fCAnc29saWQnXCJcbiAgICAgICAgICAgICAgICAgIFt2aXNpYmlsaXR5XT1cIml0ZW0uaGlkZGVuID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yVG9rZW5dPVwiZ2V0SXRlbUNvbG9yKGl0ZW0sIGkpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGlja2FibGVdPVwiY29uZmlnLmFsbG93TGVnZW5kVG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93Q2hlY2tXaGVuQ2xpY2thYmxlXT1cIml0ZW0ucGF0dGVybiAhPT0gJ2RvdHMnXCJcbiAgICAgICAgICAgICAgICAgIChpdGVtQ2xpY2spPVwidG9nZ2xlTGVnZW5kKGl0ZW0sIGkpXCJcbiAgICAgICAgICAgICAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9yaXYtY2FsbG91dD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2xlZ2VuZD5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZSBbbWVzc2FnZV09XCJjb25maWcuemVyb1N0YXRlTWVzc2FnZVwiPjwvcml2LXplcm8tc3RhdGU+XG48L25nLXRlbXBsYXRlPlxuIl19