@rivet-health/design-system 5.1.2 → 5.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,17 +9,21 @@ export class LegendItemComponent {
9
9
  this.colorToken = '';
10
10
  this.style = 'solid';
11
11
  this.visibility = 'visible';
12
+ this.clickable = false;
12
13
  this.itemClick = new EventEmitter();
13
14
  }
14
15
  get backgroundColor() {
15
16
  return `var(${this.colorToken})`;
16
17
  }
18
+ isLegendItemClickable() {
19
+ return this.clickable && this.visibility !== 'locked';
20
+ }
17
21
  }
18
22
  LegendItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LegendItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
19
- LegendItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: LegendItemComponent, selector: "riv-legend-item", inputs: { label: "label", colorToken: "colorToken", style: "style", visibility: "visibility", iconTooltip: "iconTooltip" }, outputs: { itemClick: "itemClick" }, ngImport: i0, template: "<button (click)=\"itemClick.emit()\" [rivTooltip]=\"iconTooltip\" type=\"button\">\n <i\n *ngIf=\"visibility === 'visible'\"\n [class.striped]=\"style === 'striped'\"\n [style.background-color]=\"backgroundColor\"\n ></i>\n <riv-icon\n *ngIf=\"visibility === 'hidden'\"\n name=\"EyeOff\"\n [size]=\"16\"\n ></riv-icon>\n <riv-icon *ngIf=\"visibility === 'locked'\" name=\"Lock\" [size]=\"16\"></riv-icon>\n</button>\n<span [class.low-contrast]=\"visibility === 'hidden' || visibility === 'locked'\">\n {{ label }}\n</span>\n", styles: [":host{display:inline-flex;align-items:center;gap:var(--size-small)}i{width:var(--size-large);height:var(--size-large)}i.striped{background-image:repeating-linear-gradient(315deg,transparent 0px,transparent 2.5px,var(--white-100) 2.5px,var(--white-100) 3.5px,transparent 3.5px,transparent 6px)}span{color:var(--type-light-low-contrast);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}button{display:inline-flex}riv-icon,span.low-contrast{color:var(--type-light-disabled)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "directive", type: i3.TooltipDirective, selector: "[rivTooltip]", inputs: ["rivTooltip", "rivTooltipTheme", "rivTooltipMaxWidth", "rivTooltipPreferredPosition", "rivTooltipCloseDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
23
+ LegendItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: LegendItemComponent, selector: "riv-legend-item", inputs: { label: "label", colorToken: "colorToken", style: "style", visibility: "visibility", iconTooltip: "iconTooltip", clickable: "clickable" }, outputs: { itemClick: "itemClick" }, ngImport: i0, template: "<button\n (click)=\"isLegendItemClickable() ? itemClick.emit() : null\"\n [rivTooltip]=\"iconTooltip\"\n type=\"button\"\n [disabled]=\"visibility === 'locked'\"\n [class.clickable]=\"clickable\"\n>\n <i\n *ngIf=\"visibility === 'visible'\"\n [class.striped]=\"style === 'striped'\"\n [style.background-color]=\"backgroundColor\"\n class=\"opacity-hover\"\n ></i>\n <i\n *ngIf=\"visibility === 'hidden'\"\n class=\"hidden-legend-item opacity-hover\"\n [class.striped]=\"style === 'striped'\"\n [style.border-color]=\"backgroundColor\"\n [style.--background-color-hover]=\"backgroundColor\"\n ></i>\n <riv-icon *ngIf=\"visibility === 'locked'\" name=\"Lock\" [size]=\"16\"></riv-icon>\n\n <span\n [class.low-contrast]=\"visibility === 'hidden' || visibility === 'locked'\"\n >\n {{ label }}\n </span>\n</button>\n", styles: [":host{display:inline-flex;align-items:center;gap:var(--size-small)}i{width:var(--size-large);height:var(--size-large)}i.striped{background-image:repeating-linear-gradient(315deg,transparent 0px,transparent 2.5px,var(--white-100) 2.5px,var(--white-100) 3.5px,transparent 3.5px,transparent 6px)}span{color:var(--type-light-low-contrast);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}button{display:inline-flex;gap:var(--size-small);align-items:center;cursor:default}.hidden-legend-item{border-width:var(--border-width);border-style:solid;background-color:transparent}button:hover.clickable .hidden-legend-item{background-color:var(--background-color-hover)}button:not([disabled]).clickable:hover{cursor:pointer}button:not([disabled]).clickable:hover .opacity-hover{opacity:.6}button[disabled]{cursor:not-allowed}button[disabled] .low-contrast{color:var(--type-light-disabled)}button:not(:hover) .low-contrast{color:var(--type-light-disabled)}button:not(.clickable):hover .low-contrast{color:var(--type-light-disabled)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "riv-icon", inputs: ["name", "size", "customSize", "strokeWidth"] }, { kind: "directive", type: i3.TooltipDirective, selector: "[rivTooltip]", inputs: ["rivTooltip", "rivTooltipTheme", "rivTooltipMaxWidth", "rivTooltipPreferredPosition", "rivTooltipCloseDelay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
20
24
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LegendItemComponent, decorators: [{
21
25
  type: Component,
22
- args: [{ selector: 'riv-legend-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button (click)=\"itemClick.emit()\" [rivTooltip]=\"iconTooltip\" type=\"button\">\n <i\n *ngIf=\"visibility === 'visible'\"\n [class.striped]=\"style === 'striped'\"\n [style.background-color]=\"backgroundColor\"\n ></i>\n <riv-icon\n *ngIf=\"visibility === 'hidden'\"\n name=\"EyeOff\"\n [size]=\"16\"\n ></riv-icon>\n <riv-icon *ngIf=\"visibility === 'locked'\" name=\"Lock\" [size]=\"16\"></riv-icon>\n</button>\n<span [class.low-contrast]=\"visibility === 'hidden' || visibility === 'locked'\">\n {{ label }}\n</span>\n", styles: [":host{display:inline-flex;align-items:center;gap:var(--size-small)}i{width:var(--size-large);height:var(--size-large)}i.striped{background-image:repeating-linear-gradient(315deg,transparent 0px,transparent 2.5px,var(--white-100) 2.5px,var(--white-100) 3.5px,transparent 3.5px,transparent 6px)}span{color:var(--type-light-low-contrast);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}button{display:inline-flex}riv-icon,span.low-contrast{color:var(--type-light-disabled)}\n"] }]
26
+ args: [{ selector: 'riv-legend-item', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n (click)=\"isLegendItemClickable() ? itemClick.emit() : null\"\n [rivTooltip]=\"iconTooltip\"\n type=\"button\"\n [disabled]=\"visibility === 'locked'\"\n [class.clickable]=\"clickable\"\n>\n <i\n *ngIf=\"visibility === 'visible'\"\n [class.striped]=\"style === 'striped'\"\n [style.background-color]=\"backgroundColor\"\n class=\"opacity-hover\"\n ></i>\n <i\n *ngIf=\"visibility === 'hidden'\"\n class=\"hidden-legend-item opacity-hover\"\n [class.striped]=\"style === 'striped'\"\n [style.border-color]=\"backgroundColor\"\n [style.--background-color-hover]=\"backgroundColor\"\n ></i>\n <riv-icon *ngIf=\"visibility === 'locked'\" name=\"Lock\" [size]=\"16\"></riv-icon>\n\n <span\n [class.low-contrast]=\"visibility === 'hidden' || visibility === 'locked'\"\n >\n {{ label }}\n </span>\n</button>\n", styles: [":host{display:inline-flex;align-items:center;gap:var(--size-small)}i{width:var(--size-large);height:var(--size-large)}i.striped{background-image:repeating-linear-gradient(315deg,transparent 0px,transparent 2.5px,var(--white-100) 2.5px,var(--white-100) 3.5px,transparent 3.5px,transparent 6px)}span{color:var(--type-light-low-contrast);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}button{display:inline-flex;gap:var(--size-small);align-items:center;cursor:default}.hidden-legend-item{border-width:var(--border-width);border-style:solid;background-color:transparent}button:hover.clickable .hidden-legend-item{background-color:var(--background-color-hover)}button:not([disabled]).clickable:hover{cursor:pointer}button:not([disabled]).clickable:hover .opacity-hover{opacity:.6}button[disabled]{cursor:not-allowed}button[disabled] .low-contrast{color:var(--type-light-disabled)}button:not(:hover) .low-contrast{color:var(--type-light-disabled)}button:not(.clickable):hover .low-contrast{color:var(--type-light-disabled)}\n"] }]
23
27
  }], propDecorators: { label: [{
24
28
  type: Input
25
29
  }], colorToken: [{
@@ -30,6 +34,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
30
34
  type: Input
31
35
  }], iconTooltip: [{
32
36
  type: Input
37
+ }], clickable: [{
38
+ type: Input
33
39
  }], itemClick: [{
34
40
  type: Output
35
41
  }] } });
@@ -37,4 +43,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
37
43
  LegendItemComponent.Styles = ['solid', 'striped'];
38
44
  LegendItemComponent.Visibilities = ['visible', 'hidden', 'locked'];
39
45
  })(LegendItemComponent || (LegendItemComponent = {}));
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9sZWdlbmQtaXRlbS9sZWdlbmQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2QixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBUUUsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUduQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBR3hCLFVBQUssR0FBOEIsT0FBTyxDQUFDO1FBRzNDLGVBQVUsR0FBbUMsU0FBUyxDQUFDO1FBVXZELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBQ2hDO0lBTkMsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUM7SUFDbkMsQ0FBQzs7Z0hBbEJVLG1CQUFtQjtvR0FBbkIsbUJBQW1CLHdOQ2RoQyxzaUJBZ0JBOzJGREZhLG1CQUFtQjtrQkFOL0IsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTTs4QkFJL0MsS0FBSztzQkFESixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFRTixTQUFTO3NCQURSLE1BQU07O0FBSVQsV0FBaUIsbUJBQW1CO0lBQ3JCLDBCQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFVLENBQUM7SUFHdkMsZ0NBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFFdkUsQ0FBQyxFQU5nQixtQkFBbUIsS0FBbkIsbUJBQW1CLFFBTW5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWxlZ2VuZC1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xlZ2VuZC1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGVnZW5kLWl0ZW0uY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGVnZW5kSXRlbUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICBjb2xvclRva2VuOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICBzdHlsZTogTGVnZW5kSXRlbUNvbXBvbmVudC5TdHlsZSA9ICdzb2xpZCc7XG5cbiAgQElucHV0KClcbiAgdmlzaWJpbGl0eTogTGVnZW5kSXRlbUNvbXBvbmVudC5WaXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXG4gIEBJbnB1dCgpXG4gIGljb25Ub29sdGlwPzogc3RyaW5nO1xuXG4gIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHZhcigke3RoaXMuY29sb3JUb2tlbn0pYDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGVnZW5kSXRlbUNvbXBvbmVudCB7XG4gIGV4cG9ydCBjb25zdCBTdHlsZXMgPSBbJ3NvbGlkJywgJ3N0cmlwZWQnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgU3R5bGUgPSAodHlwZW9mIFN0eWxlcylbbnVtYmVyXTtcblxuICBleHBvcnQgY29uc3QgVmlzaWJpbGl0aWVzID0gWyd2aXNpYmxlJywgJ2hpZGRlbicsICdsb2NrZWQnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgVmlzaWJpbGl0eSA9ICh0eXBlb2YgVmlzaWJpbGl0aWVzKVtudW1iZXJdO1xufVxuIiwiPGJ1dHRvbiAoY2xpY2spPVwiaXRlbUNsaWNrLmVtaXQoKVwiIFtyaXZUb29sdGlwXT1cImljb25Ub29sdGlwXCIgdHlwZT1cImJ1dHRvblwiPlxuICA8aVxuICAgICpuZ0lmPVwidmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnXCJcbiAgICBbY2xhc3Muc3RyaXBlZF09XCJzdHlsZSA9PT0gJ3N0cmlwZWQnXCJcbiAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJiYWNrZ3JvdW5kQ29sb3JcIlxuICA+PC9pPlxuICA8cml2LWljb25cbiAgICAqbmdJZj1cInZpc2liaWxpdHkgPT09ICdoaWRkZW4nXCJcbiAgICBuYW1lPVwiRXllT2ZmXCJcbiAgICBbc2l6ZV09XCIxNlwiXG4gID48L3Jpdi1pY29uPlxuICA8cml2LWljb24gKm5nSWY9XCJ2aXNpYmlsaXR5ID09PSAnbG9ja2VkJ1wiIG5hbWU9XCJMb2NrXCIgW3NpemVdPVwiMTZcIj48L3Jpdi1pY29uPlxuPC9idXR0b24+XG48c3BhbiBbY2xhc3MubG93LWNvbnRyYXN0XT1cInZpc2liaWxpdHkgPT09ICdoaWRkZW4nIHx8IHZpc2liaWxpdHkgPT09ICdsb2NrZWQnXCI+XG4gIHt7IGxhYmVsIH19XG48L3NwYW4+XG4iXX0=
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9sZWdlbmQtaXRlbS9sZWdlbmQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2xlZ2VuZC1pdGVtL2xlZ2VuZC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2QixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBUUUsVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUduQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBR3hCLFVBQUssR0FBOEIsT0FBTyxDQUFDO1FBRzNDLGVBQVUsR0FBbUMsU0FBUyxDQUFDO1FBVXZELGNBQVMsR0FBWSxLQUFLLENBQUM7UUFHM0IsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7S0FLaEM7SUFiQyxJQUFJLGVBQWU7UUFDakIsT0FBTyxPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBUUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsQ0FBQztJQUN4RCxDQUFDOztnSEE1QlUsbUJBQW1CO29HQUFuQixtQkFBbUIsZ1BDZGhDLDQxQkE0QkE7MkZEZGEsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNOzhCQUkvQyxLQUFLO3NCQURKLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLEtBQUs7c0JBREosS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQVFOLFNBQVM7c0JBRFIsS0FBSztnQkFJTixTQUFTO3NCQURSLE1BQU07O0FBUVQsV0FBaUIsbUJBQW1CO0lBQ3JCLDBCQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFVLENBQUM7SUFHdkMsZ0NBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFFdkUsQ0FBQyxFQU5nQixtQkFBbUIsS0FBbkIsbUJBQW1CLFFBTW5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LWxlZ2VuZC1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xlZ2VuZC1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGVnZW5kLWl0ZW0uY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGVnZW5kSXRlbUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICBjb2xvclRva2VuOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICBzdHlsZTogTGVnZW5kSXRlbUNvbXBvbmVudC5TdHlsZSA9ICdzb2xpZCc7XG5cbiAgQElucHV0KClcbiAgdmlzaWJpbGl0eTogTGVnZW5kSXRlbUNvbXBvbmVudC5WaXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuXG4gIEBJbnB1dCgpXG4gIGljb25Ub29sdGlwPzogc3RyaW5nO1xuXG4gIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHZhcigke3RoaXMuY29sb3JUb2tlbn0pYDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGNsaWNrYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBpdGVtQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgaXNMZWdlbmRJdGVtQ2xpY2thYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsaWNrYWJsZSAmJiB0aGlzLnZpc2liaWxpdHkgIT09ICdsb2NrZWQnO1xuICB9XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgTGVnZW5kSXRlbUNvbXBvbmVudCB7XG4gIGV4cG9ydCBjb25zdCBTdHlsZXMgPSBbJ3NvbGlkJywgJ3N0cmlwZWQnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgU3R5bGUgPSAodHlwZW9mIFN0eWxlcylbbnVtYmVyXTtcblxuICBleHBvcnQgY29uc3QgVmlzaWJpbGl0aWVzID0gWyd2aXNpYmxlJywgJ2hpZGRlbicsICdsb2NrZWQnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgVmlzaWJpbGl0eSA9ICh0eXBlb2YgVmlzaWJpbGl0aWVzKVtudW1iZXJdO1xufVxuIiwiPGJ1dHRvblxuICAoY2xpY2spPVwiaXNMZWdlbmRJdGVtQ2xpY2thYmxlKCkgPyBpdGVtQ2xpY2suZW1pdCgpIDogbnVsbFwiXG4gIFtyaXZUb29sdGlwXT1cImljb25Ub29sdGlwXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIFtkaXNhYmxlZF09XCJ2aXNpYmlsaXR5ID09PSAnbG9ja2VkJ1wiXG4gIFtjbGFzcy5jbGlja2FibGVdPVwiY2xpY2thYmxlXCJcbj5cbiAgPGlcbiAgICAqbmdJZj1cInZpc2liaWxpdHkgPT09ICd2aXNpYmxlJ1wiXG4gICAgW2NsYXNzLnN0cmlwZWRdPVwic3R5bGUgPT09ICdzdHJpcGVkJ1wiXG4gICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcbiAgICBjbGFzcz1cIm9wYWNpdHktaG92ZXJcIlxuICA+PC9pPlxuICA8aVxuICAgICpuZ0lmPVwidmlzaWJpbGl0eSA9PT0gJ2hpZGRlbidcIlxuICAgIGNsYXNzPVwiaGlkZGVuLWxlZ2VuZC1pdGVtIG9wYWNpdHktaG92ZXJcIlxuICAgIFtjbGFzcy5zdHJpcGVkXT1cInN0eWxlID09PSAnc3RyaXBlZCdcIlxuICAgIFtzdHlsZS5ib3JkZXItY29sb3JdPVwiYmFja2dyb3VuZENvbG9yXCJcbiAgICBbc3R5bGUuLS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyXT1cImJhY2tncm91bmRDb2xvclwiXG4gID48L2k+XG4gIDxyaXYtaWNvbiAqbmdJZj1cInZpc2liaWxpdHkgPT09ICdsb2NrZWQnXCIgbmFtZT1cIkxvY2tcIiBbc2l6ZV09XCIxNlwiPjwvcml2LWljb24+XG5cbiAgPHNwYW5cbiAgICBbY2xhc3MubG93LWNvbnRyYXN0XT1cInZpc2liaWxpdHkgPT09ICdoaWRkZW4nIHx8IHZpc2liaWxpdHkgPT09ICdsb2NrZWQnXCJcbiAgPlxuICAgIHt7IGxhYmVsIH19XG4gIDwvc3Bhbj5cbjwvYnV0dG9uPlxuIl19
@@ -18,7 +18,7 @@ export class StackedRowComponent {
18
18
  // Width helps determine the size of the viewbox this graph is displaying in.
19
19
  this.width$ = new BehaviorSubject(960);
20
20
  // Height helps determine the size of the viewbox this graph is displaying in.
21
- this.height$ = new BehaviorSubject(256);
21
+ this.height$ = new BehaviorSubject(null);
22
22
  // ValueFormatter determines how we style the values in a metric and the x-axis
23
23
  this.valueFormatter = v => v.toString();
24
24
  this.zeroStateMessage$ = new BehaviorSubject('No data to display.');
@@ -28,13 +28,43 @@ export class StackedRowComponent {
28
28
  | X Axis Labels |
29
29
  Row Name | Rectangles | Totals
30
30
  */
31
+ this.RECTANGLE_HEIGHTS = {
32
+ MIN_HEIGHT: 12,
33
+ MAX_HEIGHT: 42, // Sets the largest size a row can expand to
34
+ };
31
35
  this.SECTION_HEIGHTS = {
32
36
  // Space reserved for the x-axis labels
33
37
  X_AXIS_LABEL: 14,
34
38
  // Height of each row
35
- PER_ROW: 20,
36
- // Heigh of each rectangle
37
- PER_RECTANGLE: 8,
39
+ PER_ROW: () => {
40
+ //Only use height if specified
41
+ if (this.input.length && this.height) {
42
+ let rowHeight = (this.height -
43
+ this.SECTION_HEIGHTS.X_AXIS_LABEL -
44
+ this.SECTION_PADDING.OUTER_TOP_BOTTOM -
45
+ this.SECTION_PADDING.RECTANGLE_TO_ROW) /
46
+ this.input.length -
47
+ this.SECTION_PADDING.BETWEEN_ROW; // calculate base row height
48
+ // Clamping the row height between the min and max heights
49
+ return Math.min(Math.max(rowHeight, this.RECTANGLE_HEIGHTS.MIN_HEIGHT), this.RECTANGLE_HEIGHTS.MAX_HEIGHT);
50
+ }
51
+ return this.RECTANGLE_HEIGHTS.MIN_HEIGHT; // Default if no input
52
+ },
53
+ // Max Height of each rectangle
54
+ PER_RECTANGLE: () => {
55
+ //Only use height if specified
56
+ if (this.input.length && this.height) {
57
+ let rectangleHeight = (this.height -
58
+ this.SECTION_HEIGHTS.X_AXIS_LABEL -
59
+ this.SECTION_PADDING.OUTER_TOP_BOTTOM -
60
+ this.SECTION_PADDING.RECTANGLE_TO_ROW) /
61
+ this.input.length -
62
+ this.SECTION_PADDING.BETWEEN_ROW; // calculate base rectangle height
63
+ // Clamping the rectangle height between the min and max heights
64
+ return Math.min(Math.max(rectangleHeight, this.RECTANGLE_HEIGHTS.MIN_HEIGHT), this.RECTANGLE_HEIGHTS.MAX_HEIGHT);
65
+ }
66
+ return this.RECTANGLE_HEIGHTS.MIN_HEIGHT; // Default if no input
67
+ },
38
68
  };
39
69
  this.SECTION_WIDTHS = {
40
70
  // Space reserved for the name at the start of the row
@@ -52,33 +82,45 @@ export class StackedRowComponent {
52
82
  RECTANGLE_TO_ROW: 6,
53
83
  };
54
84
  // The number of X-axis segments to create, with labels at the start of each segment.
55
- this.X_TICK_COUNT = 8;
85
+ this.X_TICK_COUNT_MAX = 8;
86
+ this.X_TICK_COUNT_MIN = 3;
87
+ this.X_TICK_MAX_WIDTH = 900;
88
+ this.X_TICK_MIN_WIDTH = 400;
56
89
  this.drawData$ = combineLatest([
57
90
  this.input$,
58
91
  this.width$,
59
92
  this.height$,
60
93
  ]).pipe(map(([input, width, height]) => {
61
- return this.getDrawnData(input, width, height);
94
+ return this.getDrawnData(input, width, height
95
+ ? height
96
+ : this.SECTION_HEIGHTS.X_AXIS_LABEL +
97
+ this.SECTION_PADDING.OUTER_TOP_BOTTOM +
98
+ this.SECTION_PADDING.RECTANGLE_TO_ROW +
99
+ (this.SECTION_HEIGHTS.PER_ROW() +
100
+ this.SECTION_PADDING.BETWEEN_ROW) *
101
+ input.length);
62
102
  }), shareReplay({ refCount: true, bufferSize: 1 }));
63
103
  // Lets us know whether to display the zero data state
64
104
  this.empty$ = this.input$.pipe(map(input => input.every(stack => stack.data.length === 0)), shareReplay({ refCount: true, bufferSize: 1 }));
65
105
  // What rectangle we are currently hovering over
66
106
  this.hoveredRectangle$ = new BehaviorSubject(null);
107
+ // What band we are currently hovering over
108
+ this.hoveredBand$ = new BehaviorSubject(null);
67
109
  // Create the metric to display based on the currently hovered rectangle
68
- this.callout$ = this.hoveredRectangle$.pipe(map(hoveredRectangle => {
69
- if (!hoveredRectangle)
110
+ this.callout$ = combineLatest([this.hoveredBand$, this.drawData$]).pipe(map(([hoveredBand, drawData]) => {
111
+ if (!hoveredBand || !drawData)
70
112
  return null;
71
- const { target } = hoveredRectangle.event;
113
+ const { target } = hoveredBand.event;
72
114
  if (!target)
73
115
  return null;
74
116
  const anchor = target.getBoundingClientRect();
75
- const { rowName, stackedRowElement } = hoveredRectangle.rectangle;
76
- const metric = {
77
- rowName: rowName,
78
- elementLabel: stackedRowElement.label,
79
- value: this.valueFormatter(stackedRowElement.value),
80
- };
81
- return { anchor, metric };
117
+ const metrics = drawData.rects
118
+ .filter(rect => rect.rowName === hoveredBand.rowName)
119
+ .map(rect => ({
120
+ label: rect.stackedRowElement.label,
121
+ value: this.valueFormatter(rect.stackedRowElement.value),
122
+ }));
123
+ return { anchor, metrics };
82
124
  }), shareReplay({ refCount: true, bufferSize: 1 }));
83
125
  }
84
126
  set input(v) {
@@ -122,7 +164,7 @@ export class StackedRowComponent {
122
164
  // The y-index of the top of the current row
123
165
  getTopOfRow(rowIndex) {
124
166
  const spaceAboveRows = this.SECTION_PADDING.OUTER_TOP_BOTTOM + this.SECTION_HEIGHTS.X_AXIS_LABEL;
125
- const aboveRows = rowIndex * this.SECTION_HEIGHTS.PER_ROW;
167
+ const aboveRows = rowIndex * this.SECTION_HEIGHTS.PER_ROW();
126
168
  const aboveRowPaddings = rowIndex * this.SECTION_PADDING.BETWEEN_ROW;
127
169
  const allAboveRows = aboveRows + aboveRowPaddings;
128
170
  return spaceAboveRows + allAboveRows;
@@ -143,14 +185,20 @@ export class StackedRowComponent {
143
185
  const xScale = scaleLinear()
144
186
  .domain([0, domainMax])
145
187
  .range([this.locationOfXAxisZero(), this.locationOfXAxisEnd(width)]);
146
- const xTicks = xScale.ticks(this.X_TICK_COUNT);
188
+ // Setup a linear scale for tick count based on width
189
+ const tickScale = scaleLinear()
190
+ .domain([this.X_TICK_MIN_WIDTH, this.X_TICK_MAX_WIDTH])
191
+ .range([this.X_TICK_COUNT_MIN, this.X_TICK_COUNT_MAX])
192
+ .clamp(true); // Ensures the scale does not go beyond the defined range
193
+ const xtickCountAdjusted = Math.round(tickScale(width));
194
+ const xTicks = xScale.ticks(xtickCountAdjusted);
147
195
  const rects = this.createRectanglesFromRows(rowsForDisplay, xScale);
148
196
  const rowNamesToDraw = this.getRowNamesToDraw(rowsForDisplay);
149
197
  const rowTotalsToDraw = this.getRowTotalsToDraw(rowsForDisplay, width);
150
198
  const legendItems = getLegendItems(rowsForDisplay, keysInOrder);
151
199
  return {
152
200
  legendItems: legendItems,
153
- rowHeight: this.SECTION_HEIGHTS.PER_RECTANGLE,
201
+ rowHeight: this.SECTION_HEIGHTS.PER_RECTANGLE(),
154
202
  rects: rects,
155
203
  rowNames: rowNamesToDraw,
156
204
  rowTotals: rowTotalsToDraw,
@@ -166,7 +214,7 @@ export class StackedRowComponent {
166
214
  currentRow.elementsButStacked.forEach((currentElement, _) => {
167
215
  const topOfRow = this.getTopOfRow(rowIndex);
168
216
  const rectangleWidth = xScale(currentElement.topline) - xScale(currentElement.baseline);
169
- const rectangleHeight = this.SECTION_HEIGHTS.PER_RECTANGLE;
217
+ const rectangleHeight = this.SECTION_HEIGHTS.PER_RECTANGLE();
170
218
  const rectangleX = xScale(currentElement.baseline);
171
219
  const rectangleY = topOfRow + this.SECTION_PADDING.RECTANGLE_TO_ROW;
172
220
  const fill = `var(${currentElement.colorToken})`;
@@ -191,7 +239,7 @@ export class StackedRowComponent {
191
239
  // The row name looks right if its base is at the base of the associated rectangle
192
240
  const rowLabelY = this.getTopOfRow(rowIndex) +
193
241
  this.SECTION_PADDING.RECTANGLE_TO_ROW +
194
- this.SECTION_HEIGHTS.PER_RECTANGLE;
242
+ this.SECTION_HEIGHTS.PER_RECTANGLE() / 2;
195
243
  return {
196
244
  label: row.rowName,
197
245
  x: rowLabelX,
@@ -206,7 +254,7 @@ export class StackedRowComponent {
206
254
  // The row totals looks right if its base is at the base of the associated rectangle
207
255
  const rowLabelY = this.getTopOfRow(rowIndex) +
208
256
  this.SECTION_PADDING.RECTANGLE_TO_ROW +
209
- this.SECTION_HEIGHTS.PER_RECTANGLE;
257
+ this.SECTION_HEIGHTS.PER_RECTANGLE() / 2;
210
258
  return {
211
259
  label: this.valueFormatter(row.rowTotal),
212
260
  x: rowLabelX,
@@ -216,10 +264,10 @@ export class StackedRowComponent {
216
264
  }
217
265
  }
218
266
  StackedRowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedRowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
219
- StackedRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of draw.rects\">\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredRectangle$ | async) !== null &&\n (hoveredRectangle$ | async)?.rectangle?.rowName !== rect.rowName\n \"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n <rect\n *ngIf=\"rect.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 (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-title\">{{ callout.metric.rowName }}</div>\n <div class=\"callout-metric\">\n <div class=\"callout-label\">{{ callout.metric.elementLabel }}</div>\n <div class=\"callout-metric-value\">{{ callout.metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{display:grid;padding:var(--size-medium) var(--size-xlarge);gap:var(--size-xsmall)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall)}.callout-title{font-size:var(--type-3-font-size);line-height:var(--type-3-line-height-2)}.callout-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.callout-metric-value{font-size:var(--type-4-font-size);line-height:var(--type-4-line-height-1)}\n"], dependencies: [{ 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: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip"], outputs: ["itemClick"] }, { kind: "directive", type: i5.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i6.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
267
+ StackedRowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: StackedRowComponent, selector: "riv-stacked-row", inputs: { input: "input", width: "width", height: "height", valueFormatter: "valueFormatter", zeroStateMessage: "zeroStateMessage" }, ngImport: i0, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.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 </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ 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: "directive", type: i3.CalloutDirective, selector: "[riv-callout]" }, { kind: "component", type: i4.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable"], outputs: ["itemClick"] }, { kind: "directive", type: i5.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i6.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
220
268
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: StackedRowComponent, decorators: [{
221
269
  type: Component,
222
- args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g *ngFor=\"let rect of draw.rects\">\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredRectangle$ | async) !== null &&\n (hoveredRectangle$ | async)?.rectangle?.rowName !== rect.rowName\n \"\n (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n <rect\n *ngIf=\"rect.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 (mouseenter)=\"\n hoveredRectangle$.next({ rectangle: rect, event: $event })\n \"\n (mouseleave)=\"hoveredRectangle$.next(null)\"\n ></rect>\n </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-title\">{{ callout.metric.rowName }}</div>\n <div class=\"callout-metric\">\n <div class=\"callout-label\">{{ callout.metric.elementLabel }}</div>\n <div class=\"callout-metric-value\">{{ callout.metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{display:grid;padding:var(--size-medium) var(--size-xlarge);gap:var(--size-xsmall)}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall)}.callout-title{font-size:var(--type-3-font-size);line-height:var(--type-3-line-height-2)}.callout-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.callout-metric-value{font-size:var(--type-4-font-size);line-height:var(--type-4-line-height-1)}\n"] }]
270
+ args: [{ selector: 'riv-stacked-row', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"!(empty$ | async); else zeroState\" class=\"container\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n *ngIf=\"drawData$ | async; let draw\"\n [attr.viewBox]=\"draw.viewBox\"\n >\n <defs>\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"draw.rowHeight\"\n [attr.height]=\"draw.rowHeight\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"0\"\n [attr.x2]=\"draw.rowHeight\"\n [attr.y2]=\"draw.rowHeight\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <g *ngFor=\"let rowNameToDraw of draw.rowNames\">\n <text\n rivSVGTextTruncate\n [text]=\"rowNameToDraw.label\"\n [width]=\"SECTION_WIDTHS.ROW_NAME\"\n class=\"row-title\"\n [attr.x]=\"rowNameToDraw.x\"\n [attr.y]=\"rowNameToDraw.y\"\n ></text>\n </g>\n <g *ngFor=\"let tick of draw.xTicks\">\n <rect\n class=\"tick\"\n [attr.x]=\"draw.xScale(tick)\"\n y=\"0\"\n width=\"1\"\n height=\"100%\"\n ></rect>\n <text\n class=\"tick-label\"\n [attr.x]=\"draw.xScale(tick)\"\n [attr.y]=\"locationOfXAxisTick()\"\n dx=\"4\"\n dy=\"-4\"\n >\n {{ valueFormatter(tick) }}\n </text>\n </g>\n <g\n *ngFor=\"let rect of draw.rects\"\n (mouseenter)=\"hoveredBand$.next({ rowName: rect.rowName, event: $event })\"\n (mouseleave)=\"hoveredBand$.next(null)\"\n >\n <rect\n class=\"row\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"rect.fill\"\n [class.blurred]=\"\n (hoveredBand$ | async) !== null &&\n (hoveredBand$ | async)?.rowName !== rect.rowName\n \"\n ></rect>\n <rect\n *ngIf=\"rect.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 </g>\n <g *ngFor=\"let rowTotalToDraw of draw.rowTotals\">\n <text\n class=\"row-total\"\n [attr.x]=\"rowTotalToDraw.x\"\n [attr.y]=\"rowTotalToDraw.y\"\n text-anchor=\"end\"\n >\n {{ rowTotalToDraw.label }}\n </text>\n </g>\n </svg>\n <legend *ngIf=\"drawData$ | async; let draw\">\n <riv-legend-item\n *ngFor=\"let item of draw.legendItems\"\n [label]=\"item.label\"\n [colorToken]=\"item.colorToken\"\n [style]=\"item.style ? item.style : 'solid'\"\n ></riv-legend-item>\n </legend>\n</div>\n\n<ng-container *ngIf=\"callout$ | async; let callout\">\n <riv-callout\n *riv-callout\n [anchor]=\"callout.anchor\"\n [isModal]=\"false\"\n [preferredPosition]=\"'bottom-center'\"\n [allowedPositions]=\"[\n 'center-right',\n 'center-left',\n 'top-center',\n 'bottom-center'\n ]\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-metric\" *ngFor=\"let metric of callout.metrics\">\n <div>{{ metric.label }}</div>\n <div class=\"callout-metric-value\">{{ metric.value }}</div>\n </div>\n </div>\n </riv-callout>\n</ng-container>\n\n<ng-template #zeroState>\n <riv-zero-state [message]=\"zeroStateMessage\"></riv-zero-state>\n</ng-template>\n", styles: [".tick{fill:var(--gray-20)}.tick-label{font-size:var(--type-0-font-size);line-height:var(--type-0-line-height-0);fill:var(--type-light-low-contrast)}.row-title{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2)}.row-total{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);fill:var(--type-light-low-contrast)}.row{transition:opacity var(--short-transition)}.row.blurred{opacity:.4}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline}.callout-content{padding:var(--size-large);display:grid;gap:var(--size-medium);grid-template-columns:1fr 1fr}.callout-metric{display:flex;flex-direction:column;gap:var(--size-xsmall);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-metric-value{font-weight:var(--font-weight-heavy)}\n"] }]
223
271
  }], propDecorators: { input: [{
224
272
  type: Input
225
273
  }], width: [{
@@ -231,4 +279,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
231
279
  }], zeroStateMessage: [{
232
280
  type: Input
233
281
  }] } });
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEQsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFLTCxXQUFXLEVBQ1gsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixvQkFBb0IsR0FDckIsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7QUFRL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQU8zQixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBT0UsK0VBQStFO1FBQzlELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FDM0MsRUFBRSxDQUNILENBQUM7UUFTRiw2RUFBNkU7UUFDNUQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLEdBQUcsQ0FBQyxDQUFDO1FBUzNELDhFQUE4RTtRQUM3RCxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQVMsR0FBRyxDQUFDLENBQUM7UUFTNUQsK0VBQStFO1FBRXhFLG1CQUFjLEdBQTBCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWhELHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUN0RCxxQkFBcUIsQ0FDdEIsQ0FBQztRQVNGOzs7OztVQUtFO1FBQ08sb0JBQWUsR0FBRztZQUN6Qix1Q0FBdUM7WUFDdkMsWUFBWSxFQUFFLEVBQUU7WUFDaEIscUJBQXFCO1lBQ3JCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsMEJBQTBCO1lBQzFCLGFBQWEsRUFBRSxDQUFDO1NBQ2pCLENBQUM7UUFFTyxtQkFBYyxHQUFHO1lBQ3hCLHNEQUFzRDtZQUN0RCxRQUFRLEVBQUUsR0FBRztZQUNiLHNEQUFzRDtZQUN0RCxlQUFlLEVBQUUsRUFBRTtTQUNwQixDQUFDO1FBRU8sb0JBQWUsR0FBRztZQUN6QiwyREFBMkQ7WUFDM0QsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLG9FQUFvRTtZQUNwRSxXQUFXLEVBQUUsQ0FBQztZQUNkLCtEQUErRDtZQUMvRCxnQkFBZ0IsRUFBRSxDQUFDO1NBQ3BCLENBQUM7UUFFRixxRkFBcUY7UUFDNUUsaUJBQVksR0FBRyxDQUFDLENBQUM7UUF5SmpCLGNBQVMsR0FBMEMsYUFBYSxDQUFDO1lBQ3hFLElBQUksQ0FBQyxNQUFNO1lBQ1gsSUFBSSxDQUFDLE1BQU07WUFDWCxJQUFJLENBQUMsT0FBTztTQUNiLENBQUMsQ0FBQyxJQUFJLENBQ0wsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLEVBQ0YsV0FBVyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FDL0MsQ0FBQztRQUVGLHNEQUFzRDtRQUM3QyxXQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUMzRCxXQUFXLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUMvQyxDQUFDO1FBRUYsZ0RBQWdEO1FBQ3ZDLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUd0QyxJQUFJLENBQUMsQ0FBQztRQUVoQix3RUFBd0U7UUFDL0QsYUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzdDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFFbkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQztZQUMxQyxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQztZQUN6QixNQUFNLE1BQU0sR0FBb0IsTUFBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFFaEUsTUFBTSxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUVsRSxNQUFNLE1BQU0sR0FBa0I7Z0JBQzVCLE9BQU8sRUFBRSxPQUFPO2dCQUNoQixZQUFZLEVBQUUsaUJBQWlCLENBQUMsS0FBSztnQkFDckMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO2FBQ3BELENBQUM7WUFFRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxFQUNGLFdBQVcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQy9DLENBQUM7S0FDSDtJQWpSQyxJQUNXLEtBQUssQ0FBQyxDQUFpQztRQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBVyxLQUFLO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFJRCxJQUNXLEtBQUssQ0FBQyxDQUFTO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUlELElBQ1csTUFBTSxDQUFDLENBQVM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBU0QsSUFDVyxnQkFBZ0IsQ0FBQyxDQUFTO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFxQ0QsaUVBQWlFO0lBQ2pFLG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7SUFDOUUsQ0FBQztJQUNELDZFQUE2RTtJQUM3RSxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWU7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN4QyxPQUFPLEtBQUssR0FBRyxZQUFZLENBQUM7SUFDOUIsQ0FBQztJQUNELGtDQUFrQztJQUNsQyxtQkFBbUI7UUFDakIsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQzFFLENBQUM7SUFDSixDQUFDO0lBQ0QsNENBQTRDO0lBQzVDLFdBQVcsQ0FBQyxRQUFnQjtRQUMxQixNQUFNLGNBQWMsR0FDbEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztRQUU1RSxNQUFNLFNBQVMsR0FBVyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUM7UUFDbEUsTUFBTSxnQkFBZ0IsR0FDcEIsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFXLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztRQUUxRCxPQUFPLGNBQWMsR0FBRyxZQUFZLENBQUM7SUFDdkMsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxZQUFZLENBQ1YsU0FBeUMsRUFDekMsS0FBYSxFQUNiLE1BQWM7UUFFZCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNLE9BQU8sR0FBRyxPQUFPLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUV6QyxNQUFNLFdBQVcsR0FBc0IsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sZ0JBQWdCLEdBQ3BCLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMvQyxNQUFNLGNBQWMsR0FBcUIsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3hFLE9BQU8saUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxtRkFBbUY7UUFDbkYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQXVDLFdBQVcsRUFBRTthQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDdEIsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUvQyxNQUFNLEtBQUssR0FBbUIsSUFBSSxDQUFDLHdCQUF3QixDQUN6RCxjQUFjLEVBQ2QsTUFBTSxDQUNQLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBZSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUUsTUFBTSxlQUFlLEdBQWUsSUFBSSxDQUFDLGtCQUFrQixDQUN6RCxjQUFjLEVBQ2QsS0FBSyxDQUNOLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWhFLE9BQU87WUFDTCxXQUFXLEVBQUUsV0FBVztZQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhO1lBQzdDLEtBQUssRUFBRSxLQUFLO1lBQ1osUUFBUSxFQUFFLGNBQWM7WUFDeEIsU0FBUyxFQUFFLGVBQWU7WUFDMUIsT0FBTyxFQUFFLE9BQU87WUFDaEIsTUFBTSxFQUFFLE1BQU07WUFDZCxNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsbURBQW1EO0lBQ25ELHdCQUF3QixDQUN0QixXQUE2QixFQUM3QixNQUEwQztRQUUxQyxNQUFNLFVBQVUsR0FBbUIsRUFBRSxDQUFDO1FBQ3RDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDM0MsVUFBVSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUQsTUFBTSxRQUFRLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFFcEQsTUFBTSxjQUFjLEdBQ2xCLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxlQUFlLEdBQVcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7Z0JBRW5FLE1BQU0sVUFBVSxHQUFXLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzNELE1BQU0sVUFBVSxHQUNkLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUVuRCxNQUFNLElBQUksR0FBRyxPQUFPLGNBQWMsQ0FBQyxVQUFVLEdBQUcsQ0FBQztnQkFFakQsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDZCxDQUFDLEVBQUUsVUFBVTtvQkFDYixDQUFDLEVBQUUsVUFBVTtvQkFDYixLQUFLLEVBQUUsY0FBYztvQkFDckIsTUFBTSxFQUFFLGVBQWU7b0JBQ3ZCLElBQUksRUFBRSxJQUFJO29CQUNWLE9BQU8sRUFBRSxjQUFjLENBQUMsS0FBSyxLQUFLLFNBQVM7b0JBQzNDLE9BQU8sRUFBRSxVQUFVLENBQUMsT0FBTztvQkFDM0IsaUJBQWlCLEVBQUUsY0FBYztpQkFDbEMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsaUJBQWlCLENBQUMsV0FBNkI7UUFDN0MsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7WUFDeEQsa0ZBQWtGO1lBQ2xGLE1BQU0sU0FBUyxHQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO2dCQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQjtnQkFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUM7WUFFckMsT0FBTztnQkFDTCxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU87Z0JBQ2xCLENBQUMsRUFBRSxTQUFTO2dCQUNaLENBQUMsRUFBRSxTQUFTO2FBQ2IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDRDQUE0QztJQUM1QyxrQkFBa0IsQ0FBQyxXQUE2QixFQUFFLEtBQWE7UUFDN0QsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQ2hFLG9GQUFvRjtZQUNwRixNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0I7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO1lBRXJDLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFDeEMsQ0FBQyxFQUFFLFNBQVM7Z0JBQ1osQ0FBQyxFQUFFLFNBQVM7YUFDYixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztnSEF4T1UsbUJBQW1CO29HQUFuQixtQkFBbUIsNkxDbkNoQyw4dEhBa0lBOzJGRC9GYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBUXBDLEtBQUs7c0JBRGYsS0FBSztnQkFXSyxLQUFLO3NCQURmLEtBQUs7Z0JBV0ssTUFBTTtzQkFEaEIsS0FBSztnQkFVQyxjQUFjO3NCQURwQixLQUFLO2dCQU9LLGdCQUFnQjtzQkFEMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbnRlcm5TZXQgfSBmcm9tICdkMy1hcnJheSc7XG5pbXBvcnQgeyBTY2FsZUxpbmVhciwgc2NhbGVMaW5lYXIgfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIG1hcCxcbiAgc2hhcmVSZXBsYXksXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgUm93RGlzcGxheUluZm8sXG4gIFJvd0xhYmVsLFxuICBSb3dSZWN0YW5nbGUsXG4gIFN0YWNrZWRSb3dEcmF3RGF0YSxcbiAgZ2V0S2V5T3JkZXIsXG4gIGdldExlZ2VuZEl0ZW1zLFxuICBnZXRSb3dEaXNwbGF5SW5mbyxcbiAgc3RhbmRhcmRpemVSb3dTdGFja3MsXG59IGZyb20gJy4vc3RhY2tlZC1yb3cuaGVscGVycyc7XG5cbnR5cGUgQ2FsbG91dE1ldHJpYyA9IHtcbiAgcm93TmFtZTogc3RyaW5nO1xuICBlbGVtZW50TGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn07XG5cbi8vIFRPRE86IG9uY2Ugd2UgdXBncmFkZSB0byBBbmd1bGFyIDE2LCB0aGlzIGNvbXBvbmVudCBjYW4gYmUgY2xlYW5lZCB1cCB3aXRoXG4vLyBzaWduYWxzIGluc3RlYWQgb2YgUnhKUy5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3Jpdi1zdGFja2VkLXJvdycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N0YWNrZWQtcm93LmNvbXBvbmVudC5jc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFN0YWNrZWRSb3dDb21wb25lbnQge1xuICAvLyBUaGlzIGlzIHRoZSBsaXN0IG9mIHJvd3Mgd2Ugd2lsbCBkaXNwbGF5LCBpbiB0aGUgb3JkZXIgd2Ugd2lsbCBkaXNwbGF5IHRoZW0uXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10+KFxuICAgIFtdLFxuICApO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGlucHV0KHY6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSkge1xuICAgIHRoaXMuaW5wdXQkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBpbnB1dCgpOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10ge1xuICAgIHJldHVybiB0aGlzLmlucHV0JC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gV2lkdGggaGVscHMgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSB2aWV3Ym94IHRoaXMgZ3JhcGggaXMgZGlzcGxheWluZyBpbi5cbiAgcHJpdmF0ZSByZWFkb25seSB3aWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oOTYwKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB3aWR0aCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoJC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIEhlaWdodCBoZWxwcyBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIHZpZXdib3ggdGhpcyBncmFwaCBpcyBkaXNwbGF5aW5nIGluLlxuICBwcml2YXRlIHJlYWRvbmx5IGhlaWdodCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMjU2KTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoZWlnaHQodjogbnVtYmVyKSB7XG4gICAgdGhpcy5oZWlnaHQkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5oZWlnaHQkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBWYWx1ZUZvcm1hdHRlciBkZXRlcm1pbmVzIGhvdyB3ZSBzdHlsZSB0aGUgdmFsdWVzIGluIGEgbWV0cmljIGFuZCB0aGUgeC1heGlzXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZUZvcm1hdHRlcjogKHY6IG51bWJlcikgPT4gc3RyaW5nID0gdiA9PiB2LnRvU3RyaW5nKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB6ZXJvU3RhdGVNZXNzYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcbiAgICAnTm8gZGF0YSB0byBkaXNwbGF5LicsXG4gICk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgemVyb1N0YXRlTWVzc2FnZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLnplcm9TdGF0ZU1lc3NhZ2UkLm5leHQodik7XG4gIH1cbiAgcHVibGljIGdldCB6ZXJvU3RhdGVNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8qXG4gICAgVGhlIGxheW91dCB3ZSBhcmUgc2hvb3RpbmcgZm9yIGlzOlxuXG4gICAgICAgICAgICAgIHwgICBYIEF4aXMgTGFiZWxzICB8XG4gICAgUm93IE5hbWUgIHwgICBSZWN0YW5nbGVzICAgICB8ICAgVG90YWxzXG4gICovXG4gIHJlYWRvbmx5IFNFQ1RJT05fSEVJR0hUUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHgtYXhpcyBsYWJlbHNcbiAgICBYX0FYSVNfTEFCRUw6IDE0LFxuICAgIC8vIEhlaWdodCBvZiBlYWNoIHJvd1xuICAgIFBFUl9ST1c6IDIwLFxuICAgIC8vIEhlaWdoIG9mIGVhY2ggcmVjdGFuZ2xlXG4gICAgUEVSX1JFQ1RBTkdMRTogOCxcbiAgfTtcblxuICByZWFkb25seSBTRUNUSU9OX1dJRFRIUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIG5hbWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSByb3dcbiAgICBST1dfTkFNRTogMTAwLFxuICAgIC8vIFNwYWNlIHJlc2VydmVkIGZvciB0aGUgdG90YWxzIGF0IHRoZSBlbmQgb2YgdGhlIHJvd1xuICAgIFJPV19UT1RBTF9MQUJFTDogNzIsXG4gIH07XG5cbiAgcmVhZG9ubHkgU0VDVElPTl9QQURESU5HID0ge1xuICAgIC8vIFBhZGRpbmcgYmV0d2VlbiBlYWNoIGVkZ2Ugb2YgdGhlIHZpZXdib3ggYW5kIHRoZSBjb250ZW50XG4gICAgT1VURVJfVE9QX0JPVFRPTTogNCxcbiAgICBPVVRFUl9MRUZUX1JJR0hUOiA0LFxuICAgIC8vIFBhZGRpbmcgYmV0d2VlbiB0aGUgYm90dG9tIG9mIG9uZSByb3cgYW5kIHRoZSB0b3Agb2YgdGhlIG5leHQgcm93XG4gICAgQkVUV0VFTl9ST1c6IDQsXG4gICAgLy8gU3BhY2UgYmV0d2VlbiB0aGUgcm93IGFuZCB0aGUgdG9wIG9mIGEgcmVjdGFuZ2xlIGluIHRoYXQgcm93XG4gICAgUkVDVEFOR0xFX1RPX1JPVzogNixcbiAgfTtcblxuICAvLyBUaGUgbnVtYmVyIG9mIFgtYXhpcyBzZWdtZW50cyB0byBjcmVhdGUsIHdpdGggbGFiZWxzIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNlZ21lbnQuXG4gIHJlYWRvbmx5IFhfVElDS19DT1VOVCA9IDg7XG5cbiAgLy8gWmVybyBvbiB0aGUgWCBheGlzIGlzIGFmdGVyIHRoZSBsZWZ0IHBhZGRpbmcgYW5kIHRoZSByb3cgbmFtZS5cbiAgbG9jYXRpb25PZlhBeGlzWmVybygpIHtcbiAgICByZXR1cm4gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVCArIHRoaXMuU0VDVElPTl9XSURUSFMuUk9XX05BTUU7XG4gIH1cbiAgLy8gVGhlIGVuZCBvZiB0aGUgWCBheGlzIGlzIHJpZ2h0IGJlZm9yZSB0aGUgcm93IHRvdGFsIGFuZCB0aGUgcmlnaHQgcGFkZGluZy5cbiAgbG9jYXRpb25PZlhBeGlzRW5kKHdpZHRoOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZU9uUmlnaHQ6IG51bWJlciA9XG4gICAgICB0aGlzLlNFQ1RJT05fV0lEVEhTLlJPV19UT1RBTF9MQUJFTCArXG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgIHJldHVybiB3aWR0aCAtIHNwYWNlT25SaWdodDtcbiAgfVxuICAvLyBUaGUgeS1pbmRleCBvZiB0aGUgeC1heGlzIHRpY2tzXG4gIGxvY2F0aW9uT2ZYQXhpc1RpY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUxcbiAgICApO1xuICB9XG4gIC8vIFRoZSB5LWluZGV4IG9mIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgcm93XG4gIGdldFRvcE9mUm93KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZUFib3ZlUm93czogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUw7XG5cbiAgICBjb25zdCBhYm92ZVJvd3M6IG51bWJlciA9IHJvd0luZGV4ICogdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JPVztcbiAgICBjb25zdCBhYm92ZVJvd1BhZGRpbmdzOiBudW1iZXIgPVxuICAgICAgcm93SW5kZXggKiB0aGlzLlNFQ1RJT05fUEFERElORy5CRVRXRUVOX1JPVztcbiAgICBjb25zdCBhbGxBYm92ZVJvd3M6IG51bWJlciA9IGFib3ZlUm93cyArIGFib3ZlUm93UGFkZGluZ3M7XG5cbiAgICByZXR1cm4gc3BhY2VBYm92ZVJvd3MgKyBhbGxBYm92ZVJvd3M7XG4gIH1cblxuICAvLyBDYWxjdWxhdGUgYWxsIHRoZSB2YWx1ZXMgd2UgbmVlZCBmb3IgZGlzcGxheWluZyB0aGUgZ3JhcGggb24gc2NyZWVuLlxuICBnZXREcmF3bkRhdGEoXG4gICAgcm93U3RhY2tzOiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10sXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSB7XG4gICAgaWYgKHJvd1N0YWNrcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHZpZXdCb3ggPSBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWA7XG5cbiAgICBjb25zdCBrZXlzSW5PcmRlcjogSW50ZXJuU2V0PHN0cmluZz4gPSBnZXRLZXlPcmRlcihyb3dTdGFja3MpO1xuICAgIGNvbnN0IHN0YW5kYXJkaXplZFJvd3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSA9XG4gICAgICBzdGFuZGFyZGl6ZVJvd1N0YWNrcyhyb3dTdGFja3MsIGtleXNJbk9yZGVyKTtcbiAgICBjb25zdCByb3dzRm9yRGlzcGxheTogUm93RGlzcGxheUluZm9bXSA9IHN0YW5kYXJkaXplZFJvd3MubWFwKHN0YWNrRGF0YSA9PiB7XG4gICAgICByZXR1cm4gZ2V0Um93RGlzcGxheUluZm8oc3RhY2tEYXRhKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBkb21haW4gc2hvdWxkIGJlIHRoZSBoaWdoZXN0IHRvdGFsIHZhbHVlIGZyb20gdGhlIHJvd3MuXG4gICAgY29uc3QgZG9tYWluTWF4ID0gTWF0aC5tYXgoMCwgLi4ucm93c0ZvckRpc3BsYXkubWFwKHJvdyA9PiByb3cucm93VG90YWwpKTtcbiAgICBjb25zdCB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4gPSBzY2FsZUxpbmVhcigpXG4gICAgICAuZG9tYWluKFswLCBkb21haW5NYXhdKVxuICAgICAgLnJhbmdlKFt0aGlzLmxvY2F0aW9uT2ZYQXhpc1plcm8oKSwgdGhpcy5sb2NhdGlvbk9mWEF4aXNFbmQod2lkdGgpXSk7XG4gICAgY29uc3QgeFRpY2tzID0geFNjYWxlLnRpY2tzKHRoaXMuWF9USUNLX0NPVU5UKTtcblxuICAgIGNvbnN0IHJlY3RzOiBSb3dSZWN0YW5nbGVbXSA9IHRoaXMuY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB4U2NhbGUsXG4gICAgKTtcblxuICAgIGNvbnN0IHJvd05hbWVzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dOYW1lc1RvRHJhdyhyb3dzRm9yRGlzcGxheSk7XG4gICAgY29uc3Qgcm93VG90YWxzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHdpZHRoLFxuICAgICk7XG5cbiAgICBjb25zdCBsZWdlbmRJdGVtcyA9IGdldExlZ2VuZEl0ZW1zKHJvd3NGb3JEaXNwbGF5LCBrZXlzSW5PcmRlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVnZW5kSXRlbXM6IGxlZ2VuZEl0ZW1zLFxuICAgICAgcm93SGVpZ2h0OiB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFLFxuICAgICAgcmVjdHM6IHJlY3RzLFxuICAgICAgcm93TmFtZXM6IHJvd05hbWVzVG9EcmF3LFxuICAgICAgcm93VG90YWxzOiByb3dUb3RhbHNUb0RyYXcsXG4gICAgICB2aWV3Qm94OiB2aWV3Qm94LFxuICAgICAgeFNjYWxlOiB4U2NhbGUsXG4gICAgICB4VGlja3M6IHhUaWNrcyxcbiAgICB9O1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgZm9yIGFsbCB0aGUgcmVjdGFuZ2xlcyBmb3IgYWxsIHRoZSByb3dzXG4gIGNyZWF0ZVJlY3RhbmdsZXNGcm9tUm93cyhcbiAgICBkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSxcbiAgICB4U2NhbGU6IFNjYWxlTGluZWFyPG51bWJlciwgbnVtYmVyLCBuZXZlcj4sXG4gICk6IFJvd1JlY3RhbmdsZVtdIHtcbiAgICBjb25zdCByZWN0YW5nbGVzOiBSb3dSZWN0YW5nbGVbXSA9IFtdO1xuICAgIGRpc3BsYXlSb3dzLmZvckVhY2goKGN1cnJlbnRSb3csIHJvd0luZGV4KSA9PiB7XG4gICAgICBjdXJyZW50Um93LmVsZW1lbnRzQnV0U3RhY2tlZC5mb3JFYWNoKChjdXJyZW50RWxlbWVudCwgXykgPT4ge1xuICAgICAgICBjb25zdCB0b3BPZlJvdzogbnVtYmVyID0gdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCk7XG5cbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlV2lkdGg6IG51bWJlciA9XG4gICAgICAgICAgeFNjYWxlKGN1cnJlbnRFbGVtZW50LnRvcGxpbmUpIC0geFNjYWxlKGN1cnJlbnRFbGVtZW50LmJhc2VsaW5lKTtcbiAgICAgICAgY29uc3QgcmVjdGFuZ2xlSGVpZ2h0OiBudW1iZXIgPSB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFO1xuXG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVg6IG51bWJlciA9IHhTY2FsZShjdXJyZW50RWxlbWVudC5iYXNlbGluZSk7XG4gICAgICAgIGNvbnN0IHJlY3RhbmdsZVk6IG51bWJlciA9XG4gICAgICAgICAgdG9wT2ZSb3cgKyB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XO1xuXG4gICAgICAgIGNvbnN0IGZpbGwgPSBgdmFyKCR7Y3VycmVudEVsZW1lbnQuY29sb3JUb2tlbn0pYDtcblxuICAgICAgICByZWN0YW5nbGVzLnB1c2goe1xuICAgICAgICAgIHg6IHJlY3RhbmdsZVgsXG4gICAgICAgICAgeTogcmVjdGFuZ2xlWSxcbiAgICAgICAgICB3aWR0aDogcmVjdGFuZ2xlV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiByZWN0YW5nbGVIZWlnaHQsXG4gICAgICAgICAgZmlsbDogZmlsbCxcbiAgICAgICAgICBzdHJpcGVkOiBjdXJyZW50RWxlbWVudC5zdHlsZSA9PT0gJ3N0cmlwZWQnLFxuICAgICAgICAgIHJvd05hbWU6IGN1cnJlbnRSb3cucm93TmFtZSxcbiAgICAgICAgICBzdGFja2VkUm93RWxlbWVudDogY3VycmVudEVsZW1lbnQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlY3RhbmdsZXM7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBvbiB0aGUgcm93IG5hbWVzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd05hbWVzVG9EcmF3KGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdKTogUm93TGFiZWxbXSB7XG4gICAgcmV0dXJuIGRpc3BsYXlSb3dzLm1hcCgocm93LCByb3dJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgcm93TGFiZWxYID0gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICAgIC8vIFRoZSByb3cgbmFtZSBsb29rcyByaWdodCBpZiBpdHMgYmFzZSBpcyBhdCB0aGUgYmFzZSBvZiB0aGUgYXNzb2NpYXRlZCByZWN0YW5nbGVcbiAgICAgIGNvbnN0IHJvd0xhYmVsWSA9XG4gICAgICAgIHRoaXMuZ2V0VG9wT2ZSb3cocm93SW5kZXgpICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVyArXG4gICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlBFUl9SRUNUQU5HTEU7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiByb3cucm93TmFtZSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgb24gdGhlIHJvdyB0b3RhbHMgd2UgYXJlIGRyYXdpbmdcbiAgZ2V0Um93VG90YWxzVG9EcmF3KGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLCB3aWR0aDogbnVtYmVyKTogUm93TGFiZWxbXSB7XG4gICAgcmV0dXJuIGRpc3BsYXlSb3dzLm1hcCgocm93LCByb3dJbmRleCkgPT4ge1xuICAgICAgY29uc3Qgcm93TGFiZWxYID0gd2lkdGggLSB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgICAgLy8gVGhlIHJvdyB0b3RhbHMgbG9va3MgcmlnaHQgaWYgaXRzIGJhc2UgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIGFzc29jaWF0ZWQgcmVjdGFuZ2xlXG4gICAgICBjb25zdCByb3dMYWJlbFkgPVxuICAgICAgICB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogdGhpcy52YWx1ZUZvcm1hdHRlcihyb3cucm93VG90YWwpLFxuICAgICAgICB4OiByb3dMYWJlbFgsXG4gICAgICAgIHk6IHJvd0xhYmVsWSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICByZWFkb25seSBkcmF3RGF0YSQ6IE9ic2VydmFibGU8U3RhY2tlZFJvd0RyYXdEYXRhIHwgbnVsbD4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLmlucHV0JCxcbiAgICB0aGlzLndpZHRoJCxcbiAgICB0aGlzLmhlaWdodCQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbaW5wdXQsIHdpZHRoLCBoZWlnaHRdKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXREcmF3bkRhdGEoaW5wdXQsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgLy8gTGV0cyB1cyBrbm93IHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgemVybyBkYXRhIHN0YXRlXG4gIHJlYWRvbmx5IGVtcHR5JCA9IHRoaXMuaW5wdXQkLnBpcGUoXG4gICAgbWFwKGlucHV0ID0+IGlucHV0LmV2ZXJ5KHN0YWNrID0+IHN0YWNrLmRhdGEubGVuZ3RoID09PSAwKSksXG4gICAgc2hhcmVSZXBsYXkoeyByZWZDb3VudDogdHJ1ZSwgYnVmZmVyU2l6ZTogMSB9KSxcbiAgKTtcblxuICAvLyBXaGF0IHJlY3RhbmdsZSB3ZSBhcmUgY3VycmVudGx5IGhvdmVyaW5nIG92ZXJcbiAgcmVhZG9ubHkgaG92ZXJlZFJlY3RhbmdsZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtcbiAgICByZWN0YW5nbGU6IFJvd1JlY3RhbmdsZTtcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENyZWF0ZSB0aGUgbWV0cmljIHRvIGRpc3BsYXkgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBob3ZlcmVkIHJlY3RhbmdsZVxuICByZWFkb25seSBjYWxsb3V0JCA9IHRoaXMuaG92ZXJlZFJlY3RhbmdsZSQucGlwZShcbiAgICBtYXAoaG92ZXJlZFJlY3RhbmdsZSA9PiB7XG4gICAgICBpZiAoIWhvdmVyZWRSZWN0YW5nbGUpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZFJlY3RhbmdsZS5ldmVudDtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbnVsbDtcbiAgICAgIGNvbnN0IGFuY2hvciA9ICg8U1ZHUmVjdEVsZW1lbnQ+dGFyZ2V0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgY29uc3QgeyByb3dOYW1lLCBzdGFja2VkUm93RWxlbWVudCB9ID0gaG92ZXJlZFJlY3RhbmdsZS5yZWN0YW5nbGU7XG5cbiAgICAgIGNvbnN0IG1ldHJpYzogQ2FsbG91dE1ldHJpYyA9IHtcbiAgICAgICAgcm93TmFtZTogcm93TmFtZSxcbiAgICAgICAgZWxlbWVudExhYmVsOiBzdGFja2VkUm93RWxlbWVudC5sYWJlbCxcbiAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVGb3JtYXR0ZXIoc3RhY2tlZFJvd0VsZW1lbnQudmFsdWUpLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHsgYW5jaG9yLCBtZXRyaWMgfTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFN0YWNrZWRSb3dDb21wb25lbnQge1xuICAvLyBBIHNwZWNpZmljYWxseSBjb2xvcmVkIHNlY3Rpb24gb2Ygb25lIHJvdy5cbiAgZXhwb3J0IHR5cGUgUm93RWxlbWVudCA9IHtcbiAgICBsYWJlbDogc3RyaW5nOyAvLyBMZWdlbmQgZWxlbWVudCBuYW1lXG4gICAgdmFsdWU6IG51bWJlcjtcbiAgICBjb2xvclRva2VuOiBzdHJpbmc7XG4gICAgc3R5bGU/OiAnc29saWQnIHwgJ3N0cmlwZWQnO1xuICB9O1xuICAvLyBUaGUgaW5wdXQgdGhhdCBkZXRlcm1pbmVzIG9uZSByb3cuXG4gIGV4cG9ydCB0eXBlIFJvd1N0YWNrID0ge1xuICAgIHJvd05hbWU6IHN0cmluZztcbiAgICBkYXRhOiBSb3dFbGVtZW50W107XG4gIH07XG59XG4iLCI8ZGl2ICpuZ0lmPVwiIShlbXB0eSQgfCBhc3luYyk7IGVsc2UgemVyb1N0YXRlXCIgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgPHN2Z1xuICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCJcbiAgICBbYXR0ci52aWV3Qm94XT1cImRyYXcudmlld0JveFwiXG4gID5cbiAgICA8ZGVmcz5cbiAgICAgIDxwYXR0ZXJuXG4gICAgICAgIGlkPVwic3RyaXBlc1wiXG4gICAgICAgIHg9XCIwXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgID5cbiAgICAgICAgPGxpbmVcbiAgICAgICAgICBbYXR0ci54MV09XCIwXCJcbiAgICAgICAgICBbYXR0ci55MV09XCIwXCJcbiAgICAgICAgICBbYXR0ci54Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgW2F0dHIueTJdPVwiZHJhdy5yb3dIZWlnaHRcIlxuICAgICAgICAgIHN0cm9rZT1cInZhcigtLXdoaXRlLTEwMClcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9wYXR0ZXJuPlxuICAgIDwvZGVmcz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgcm93TmFtZVRvRHJhdyBvZiBkcmF3LnJvd05hbWVzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICByaXZTVkdUZXh0VHJ1bmNhdGVcbiAgICAgICAgW3RleHRdPVwicm93TmFtZVRvRHJhdy5sYWJlbFwiXG4gICAgICAgIFt3aWR0aF09XCJTRUNUSU9OX1dJRFRIUy5ST1dfTkFNRVwiXG4gICAgICAgIGNsYXNzPVwicm93LXRpdGxlXCJcbiAgICAgICAgW2F0dHIueF09XCJyb3dOYW1lVG9EcmF3LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJvd05hbWVUb0RyYXcueVwiXG4gICAgICA+PC90ZXh0PlxuICAgIDwvZz5cbiAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkcmF3LnhUaWNrc1wiPlxuICAgICAgPHJlY3RcbiAgICAgICAgY2xhc3M9XCJ0aWNrXCJcbiAgICAgICAgW2F0dHIueF09XCJkcmF3LnhTY2FsZSh0aWNrKVwiXG4gICAgICAgIHk9XCIwXCJcbiAgICAgICAgd2lkdGg9XCIxXCJcbiAgICAgICAgaGVpZ2h0PVwiMTAwJVwiXG4gICAgICA+PC9yZWN0PlxuICAgICAgPHRleHRcbiAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgW2F0dHIueF09XCJkcmF3LnhTY2FsZSh0aWNrKVwiXG4gICAgICAgIFthdHRyLnldPVwibG9jYXRpb25PZlhBeGlzVGljaygpXCJcbiAgICAgICAgZHg9XCI0XCJcbiAgICAgICAgZHk9XCItNFwiXG4gICAgICA+XG4gICAgICAgIHt7IHZhbHVlRm9ybWF0dGVyKHRpY2spIH19XG4gICAgICA8L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCByZWN0IG9mIGRyYXcucmVjdHNcIj5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkUmVjdGFuZ2xlJCB8IGFzeW5jKSAhPT0gbnVsbCAmJlxuICAgICAgICAgIChob3ZlcmVkUmVjdGFuZ2xlJCB8IGFzeW5jKT8ucmVjdGFuZ2xlPy5yb3dOYW1lICE9PSByZWN0LnJvd05hbWVcbiAgICAgICAgXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiXG4gICAgICAgICAgaG92ZXJlZFJlY3RhbmdsZSQubmV4dCh7IHJlY3RhbmdsZTogcmVjdCwgZXZlbnQ6ICRldmVudCB9KVxuICAgICAgICBcIlxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkUmVjdGFuZ2xlJC5uZXh0KG51bGwpXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJcbiAgICAgICAgICBob3ZlcmVkUmVjdGFuZ2xlJC5uZXh0KHsgcmVjdGFuZ2xlOiByZWN0LCBldmVudDogJGV2ZW50IH0pXG4gICAgICAgIFwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyZWRSZWN0YW5nbGUkLm5leHQobnVsbClcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd1RvdGFsVG9EcmF3IG9mIGRyYXcucm93VG90YWxzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInJvdy10b3RhbFwiXG4gICAgICAgIFthdHRyLnhdPVwicm93VG90YWxUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93VG90YWxUb0RyYXcueVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgID5cbiAgICAgICAge3sgcm93VG90YWxUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCI+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZHJhdy5sZWdlbmRJdGVtc1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3N0eWxlXT1cIml0ZW0uc3R5bGUgPyBpdGVtLnN0eWxlIDogJ3NvbGlkJ1wiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInY2VudGVyLXJpZ2h0J1wiXG4gICAgW2FsbG93ZWRQb3NpdGlvbnNdPVwiW1xuICAgICAgJ2NlbnRlci1yaWdodCcsXG4gICAgICAnY2VudGVyLWxlZnQnLFxuICAgICAgJ3RvcC1jZW50ZXInLFxuICAgICAgJ2JvdHRvbS1jZW50ZXInXG4gICAgXVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC10aXRsZVwiPnt7IGNhbGxvdXQubWV0cmljLnJvd05hbWUgfX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LW1ldHJpY1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1sYWJlbFwiPnt7IGNhbGxvdXQubWV0cmljLmVsZW1lbnRMYWJlbCB9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsbG91dC1tZXRyaWMtdmFsdWVcIj57eyBjYWxsb3V0Lm1ldHJpYy52YWx1ZSB9fTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvcml2LWNhbGxvdXQ+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICN6ZXJvU3RhdGU+XG4gIDxyaXYtemVyby1zdGF0ZSBbbWVzc2FnZV09XCJ6ZXJvU3RhdGVNZXNzYWdlXCI+PC9yaXYtemVyby1zdGF0ZT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tlZC1yb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9zdGFja2VkLXJvdy9zdGFja2VkLXJvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL3N0YWNrZWQtcm93L3N0YWNrZWQtcm93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFFLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEQsT0FBTyxFQUNMLGVBQWUsRUFFZixhQUFhLEVBQ2IsR0FBRyxFQUNILFdBQVcsR0FDWixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFLTCxXQUFXLEVBQ1gsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixvQkFBb0IsR0FDckIsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7QUFRL0IsNkVBQTZFO0FBQzdFLDJCQUEyQjtBQU8zQixNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBT0UsK0VBQStFO1FBQzlELFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FDM0MsRUFBRSxDQUNILENBQUM7UUFTRiw2RUFBNkU7UUFDNUQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFTLEdBQUcsQ0FBQyxDQUFDO1FBUzNELDhFQUE4RTtRQUM3RCxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBU3BFLCtFQUErRTtRQUV4RSxtQkFBYyxHQUEwQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoRCxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FDdEQscUJBQXFCLENBQ3RCLENB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R0FBbkIsbUJBQW1CLDZMQ25DaEMsMDhHQTZIQTsyRkQxRmEsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLGlCQUFpQixtQkFHVix1QkFBdUIsQ0FBQyxNQUFNOzhCQVFwQyxLQUFLO3NCQURmLEtBQUs7Z0JBV0ssS0FBSztzQkFEZixLQUFLO2dCQVdLLE1BQU07c0JBRGhCLEtBQUs7Z0JBVUMsY0FBYztzQkFEcEIsS0FBSztnQkFPSyxnQkFBZ0I7c0JBRDFCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW50ZXJuU2V0IH0gZnJvbSAnZDMtYXJyYXknO1xuaW1wb3J0IHsgU2NhbGVMaW5lYXIsIHNjYWxlTGluZWFyIH0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjb21iaW5lTGF0ZXN0LFxuICBtYXAsXG4gIHNoYXJlUmVwbGF5LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFJvd0Rpc3BsYXlJbmZvLFxuICBSb3dMYWJlbCxcbiAgUm93UmVjdGFuZ2xlLFxuICBTdGFja2VkUm93RHJhd0RhdGEsXG4gIGdldEtleU9yZGVyLFxuICBnZXRMZWdlbmRJdGVtcyxcbiAgZ2V0Um93RGlzcGxheUluZm8sXG4gIHN0YW5kYXJkaXplUm93U3RhY2tzLFxufSBmcm9tICcuL3N0YWNrZWQtcm93LmhlbHBlcnMnO1xuXG50eXBlIENhbGxvdXRNZXRyaWMgPSB7XG4gIHJvd05hbWU6IHN0cmluZztcbiAgZWxlbWVudExhYmVsOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59O1xuXG4vLyBUT0RPOiBvbmNlIHdlIHVwZ3JhZGUgdG8gQW5ndWxhciAxNiwgdGhpcyBjb21wb25lbnQgY2FuIGJlIGNsZWFuZWQgdXAgd2l0aFxuLy8gc2lnbmFscyBpbnN0ZWFkIG9mIFJ4SlMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtc3RhY2tlZC1yb3cnLFxuICB0ZW1wbGF0ZVVybDogJy4vc3RhY2tlZC1yb3cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdGFja2VkLXJvdy5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTdGFja2VkUm93Q29tcG9uZW50IHtcbiAgLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiByb3dzIHdlIHdpbGwgZGlzcGxheSwgaW4gdGhlIG9yZGVyIHdlIHdpbGwgZGlzcGxheSB0aGVtLlxuICBwcml2YXRlIHJlYWRvbmx5IGlucHV0JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdPihcbiAgICBbXSxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbnB1dCh2OiBTdGFja2VkUm93Q29tcG9uZW50LlJvd1N0YWNrW10pIHtcbiAgICB0aGlzLmlucHV0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaW5wdXQoKTogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdIHtcbiAgICByZXR1cm4gdGhpcy5pbnB1dCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFdpZHRoIGhlbHBzIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgdmlld2JveCB0aGlzIGdyYXBoIGlzIGRpc3BsYXlpbmcgaW4uXG4gIHByaXZhdGUgcmVhZG9ubHkgd2lkdGgkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDk2MCk7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgd2lkdGgodjogbnVtYmVyKSB7XG4gICAgdGhpcy53aWR0aCQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgkLmdldFZhbHVlKCk7XG4gIH1cblxuICAvLyBIZWlnaHQgaGVscHMgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSB2aWV3Ym94IHRoaXMgZ3JhcGggaXMgZGlzcGxheWluZyBpbi5cbiAgcHJpdmF0ZSByZWFkb25seSBoZWlnaHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXIgfCBudWxsPihudWxsKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBoZWlnaHQodjogbnVtYmVyIHwgbnVsbCkge1xuICAgIHRoaXMuaGVpZ2h0JC5uZXh0KHYpO1xuICB9XG4gIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmhlaWdodCQuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIC8vIFZhbHVlRm9ybWF0dGVyIGRldGVybWluZXMgaG93IHdlIHN0eWxlIHRoZSB2YWx1ZXMgaW4gYSBtZXRyaWMgYW5kIHRoZSB4LWF4aXNcbiAgQElucHV0KClcbiAgcHVibGljIHZhbHVlRm9ybWF0dGVyOiAodjogbnVtYmVyKSA9PiBzdHJpbmcgPSB2ID0+IHYudG9TdHJpbmcoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHplcm9TdGF0ZU1lc3NhZ2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KFxuICAgICdObyBkYXRhIHRvIGRpc3BsYXkuJyxcbiAgKTtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB6ZXJvU3RhdGVNZXNzYWdlKHY6IHN0cmluZykge1xuICAgIHRoaXMuemVyb1N0YXRlTWVzc2FnZSQubmV4dCh2KTtcbiAgfVxuICBwdWJsaWMgZ2V0IHplcm9TdGF0ZU1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy56ZXJvU3RhdGVNZXNzYWdlJC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLypcbiAgICBUaGUgbGF5b3V0IHdlIGFyZSBzaG9vdGluZyBmb3IgaXM6XG5cbiAgICAgICAgICAgICAgfCAgIFggQXhpcyBMYWJlbHMgIHxcbiAgICBSb3cgTmFtZSAgfCAgIFJlY3RhbmdsZXMgICAgIHwgICBUb3RhbHNcbiAgKi9cbiAgcmVhZG9ubHkgUkVDVEFOR0xFX0hFSUdIVFMgPSB7XG4gICAgTUlOX0hFSUdIVDogMTIsIC8vIFNldHMgdGhlIHNtYWxsZXN0IHNpemUgYSByb3cgY2FuIHNocmluayB0b1xuICAgIE1BWF9IRUlHSFQ6IDQyLCAvLyBTZXRzIHRoZSBsYXJnZXN0IHNpemUgYSByb3cgY2FuIGV4cGFuZCB0b1xuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fSEVJR0hUUyA9IHtcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHgtYXhpcyBsYWJlbHNcbiAgICBYX0FYSVNfTEFCRUw6IDE0LFxuICAgIC8vIEhlaWdodCBvZiBlYWNoIHJvd1xuICAgIFBFUl9ST1c6ICgpOiBudW1iZXIgPT4ge1xuICAgICAgLy9Pbmx5IHVzZSBoZWlnaHQgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAodGhpcy5pbnB1dC5sZW5ndGggJiYgdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgbGV0IHJvd0hlaWdodCA9XG4gICAgICAgICAgKHRoaXMuaGVpZ2h0IC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTCAtXG4gICAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NIC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cpIC9cbiAgICAgICAgICAgIHRoaXMuaW5wdXQubGVuZ3RoIC1cbiAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5CRVRXRUVOX1JPVzsgLy8gY2FsY3VsYXRlIGJhc2Ugcm93IGhlaWdodFxuICAgICAgICAvLyBDbGFtcGluZyB0aGUgcm93IGhlaWdodCBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCBoZWlnaHRzXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgICBNYXRoLm1heChyb3dIZWlnaHQsIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCksXG4gICAgICAgICAgdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hULFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVDsgLy8gRGVmYXVsdCBpZiBubyBpbnB1dFxuICAgIH0sXG4gICAgLy8gTWF4IEhlaWdodCBvZiBlYWNoIHJlY3RhbmdsZVxuICAgIFBFUl9SRUNUQU5HTEU6ICgpOiBudW1iZXIgPT4ge1xuICAgICAgLy9Pbmx5IHVzZSBoZWlnaHQgaWYgc3BlY2lmaWVkXG4gICAgICBpZiAodGhpcy5pbnB1dC5sZW5ndGggJiYgdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgbGV0IHJlY3RhbmdsZUhlaWdodCA9XG4gICAgICAgICAgKHRoaXMuaGVpZ2h0IC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9IRUlHSFRTLlhfQVhJU19MQUJFTCAtXG4gICAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NIC1cbiAgICAgICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cpIC9cbiAgICAgICAgICAgIHRoaXMuaW5wdXQubGVuZ3RoIC1cbiAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5CRVRXRUVOX1JPVzsgLy8gY2FsY3VsYXRlIGJhc2UgcmVjdGFuZ2xlIGhlaWdodFxuICAgICAgICAvLyBDbGFtcGluZyB0aGUgcmVjdGFuZ2xlIGhlaWdodCBiZXR3ZWVuIHRoZSBtaW4gYW5kIG1heCBoZWlnaHRzXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihcbiAgICAgICAgICBNYXRoLm1heChyZWN0YW5nbGVIZWlnaHQsIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVCksXG4gICAgICAgICAgdGhpcy5SRUNUQU5HTEVfSEVJR0hUUy5NQVhfSEVJR0hULFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuUkVDVEFOR0xFX0hFSUdIVFMuTUlOX0hFSUdIVDsgLy8gRGVmYXVsdCBpZiBubyBpbnB1dFxuICAgIH0sXG4gIH07XG5cbiAgcmVhZG9ubHkgU0VDVElPTl9XSURUSFMgPSB7XG4gICAgLy8gU3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSBuYW1lIGF0IHRoZSBzdGFydCBvZiB0aGUgcm93XG4gICAgUk9XX05BTUU6IDEwMCxcbiAgICAvLyBTcGFjZSByZXNlcnZlZCBmb3IgdGhlIHRvdGFscyBhdCB0aGUgZW5kIG9mIHRoZSByb3dcbiAgICBST1dfVE9UQUxfTEFCRUw6IDcyLFxuICB9O1xuXG4gIHJlYWRvbmx5IFNFQ1RJT05fUEFERElORyA9IHtcbiAgICAvLyBQYWRkaW5nIGJldHdlZW4gZWFjaCBlZGdlIG9mIHRoZSB2aWV3Ym94IGFuZCB0aGUgY29udGVudFxuICAgIE9VVEVSX1RPUF9CT1RUT006IDQsXG4gICAgT1VURVJfTEVGVF9SSUdIVDogNCxcbiAgICAvLyBQYWRkaW5nIGJldHdlZW4gdGhlIGJvdHRvbSBvZiBvbmUgcm93IGFuZCB0aGUgdG9wIG9mIHRoZSBuZXh0IHJvd1xuICAgIEJFVFdFRU5fUk9XOiA0LFxuICAgIC8vIFNwYWNlIGJldHdlZW4gdGhlIHJvdyBhbmQgdGhlIHRvcCBvZiBhIHJlY3RhbmdsZSBpbiB0aGF0IHJvd1xuICAgIFJFQ1RBTkdMRV9UT19ST1c6IDYsXG4gIH07XG5cbiAgLy8gVGhlIG51bWJlciBvZiBYLWF4aXMgc2VnbWVudHMgdG8gY3JlYXRlLCB3aXRoIGxhYmVscyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzZWdtZW50LlxuICByZWFkb25seSBYX1RJQ0tfQ09VTlRfTUFYID0gODtcbiAgcmVhZG9ubHkgWF9USUNLX0NPVU5UX01JTiA9IDM7XG4gIHJlYWRvbmx5IFhfVElDS19NQVhfV0lEVEggPSA5MDA7XG4gIHJlYWRvbmx5IFhfVElDS19NSU5fV0lEVEggPSA0MDA7XG5cbiAgLy8gWmVybyBvbiB0aGUgWCBheGlzIGlzIGFmdGVyIHRoZSBsZWZ0IHBhZGRpbmcgYW5kIHRoZSByb3cgbmFtZS5cbiAgbG9jYXRpb25PZlhBeGlzWmVybygpIHtcbiAgICByZXR1cm4gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVCArIHRoaXMuU0VDVElPTl9XSURUSFMuUk9XX05BTUU7XG4gIH1cbiAgLy8gVGhlIGVuZCBvZiB0aGUgWCBheGlzIGlzIHJpZ2h0IGJlZm9yZSB0aGUgcm93IHRvdGFsIGFuZCB0aGUgcmlnaHQgcGFkZGluZy5cbiAgbG9jYXRpb25PZlhBeGlzRW5kKHdpZHRoOiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZU9uUmlnaHQ6IG51bWJlciA9XG4gICAgICB0aGlzLlNFQ1RJT05fV0lEVEhTLlJPV19UT1RBTF9MQUJFTCArXG4gICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9MRUZUX1JJR0hUO1xuICAgIHJldHVybiB3aWR0aCAtIHNwYWNlT25SaWdodDtcbiAgfVxuICAvLyBUaGUgeS1pbmRleCBvZiB0aGUgeC1heGlzIHRpY2tzXG4gIGxvY2F0aW9uT2ZYQXhpc1RpY2soKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUxcbiAgICApO1xuICB9XG4gIC8vIFRoZSB5LWluZGV4IG9mIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgcm93XG4gIGdldFRvcE9mUm93KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBzcGFjZUFib3ZlUm93czogbnVtYmVyID1cbiAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX1RPUF9CT1RUT00gKyB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUw7XG5cbiAgICBjb25zdCBhYm92ZVJvd3M6IG51bWJlciA9IHJvd0luZGV4ICogdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JPVygpO1xuICAgIGNvbnN0IGFib3ZlUm93UGFkZGluZ3M6IG51bWJlciA9XG4gICAgICByb3dJbmRleCAqIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XO1xuICAgIGNvbnN0IGFsbEFib3ZlUm93czogbnVtYmVyID0gYWJvdmVSb3dzICsgYWJvdmVSb3dQYWRkaW5ncztcblxuICAgIHJldHVybiBzcGFjZUFib3ZlUm93cyArIGFsbEFib3ZlUm93cztcbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSBhbGwgdGhlIHZhbHVlcyB3ZSBuZWVkIGZvciBkaXNwbGF5aW5nIHRoZSBncmFwaCBvbiBzY3JlZW4uXG4gIGdldERyYXduRGF0YShcbiAgICByb3dTdGFja3M6IFN0YWNrZWRSb3dDb21wb25lbnQuUm93U3RhY2tbXSxcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApIHtcbiAgICBpZiAocm93U3RhY2tzLmxlbmd0aCA9PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgdmlld0JveCA9IGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YDtcblxuICAgIGNvbnN0IGtleXNJbk9yZGVyOiBJbnRlcm5TZXQ8c3RyaW5nPiA9IGdldEtleU9yZGVyKHJvd1N0YWNrcyk7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkUm93czogU3RhY2tlZFJvd0NvbXBvbmVudC5Sb3dTdGFja1tdID1cbiAgICAgIHN0YW5kYXJkaXplUm93U3RhY2tzKHJvd1N0YWNrcywga2V5c0luT3JkZXIpO1xuICAgIGNvbnN0IHJvd3NGb3JEaXNwbGF5OiBSb3dEaXNwbGF5SW5mb1tdID0gc3RhbmRhcmRpemVkUm93cy5tYXAoc3RhY2tEYXRhID0+IHtcbiAgICAgIHJldHVybiBnZXRSb3dEaXNwbGF5SW5mbyhzdGFja0RhdGEpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGRvbWFpbiBzaG91bGQgYmUgdGhlIGhpZ2hlc3QgdG90YWwgdmFsdWUgZnJvbSB0aGUgcm93cy5cbiAgICBjb25zdCBkb21haW5NYXggPSBNYXRoLm1heCgwLCAuLi5yb3dzRm9yRGlzcGxheS5tYXAocm93ID0+IHJvdy5yb3dUb3RhbCkpO1xuICAgIGNvbnN0IHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPiA9IHNjYWxlTGluZWFyKClcbiAgICAgIC5kb21haW4oWzAsIGRvbWFpbk1heF0pXG4gICAgICAucmFuZ2UoW3RoaXMubG9jYXRpb25PZlhBeGlzWmVybygpLCB0aGlzLmxvY2F0aW9uT2ZYQXhpc0VuZCh3aWR0aCldKTtcblxuICAgIC8vIFNldHVwIGEgbGluZWFyIHNjYWxlIGZvciB0aWNrIGNvdW50IGJhc2VkIG9uIHdpZHRoXG4gICAgY29uc3QgdGlja1NjYWxlID0gc2NhbGVMaW5lYXIoKVxuICAgICAgLmRvbWFpbihbdGhpcy5YX1RJQ0tfTUlOX1dJRFRILCB0aGlzLlhfVElDS19NQVhfV0lEVEhdKVxuICAgICAgLnJhbmdlKFt0aGlzLlhfVElDS19DT1VOVF9NSU4sIHRoaXMuWF9USUNLX0NPVU5UX01BWF0pXG4gICAgICAuY2xhbXAodHJ1ZSk7IC8vIEVuc3VyZXMgdGhlIHNjYWxlIGRvZXMgbm90IGdvIGJleW9uZCB0aGUgZGVmaW5lZCByYW5nZVxuXG4gICAgY29uc3QgeHRpY2tDb3VudEFkanVzdGVkID0gTWF0aC5yb3VuZCh0aWNrU2NhbGUod2lkdGgpKTtcbiAgICBjb25zdCB4VGlja3MgPSB4U2NhbGUudGlja3MoeHRpY2tDb3VudEFkanVzdGVkKTtcblxuICAgIGNvbnN0IHJlY3RzOiBSb3dSZWN0YW5nbGVbXSA9IHRoaXMuY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgICAgcm93c0ZvckRpc3BsYXksXG4gICAgICB4U2NhbGUsXG4gICAgKTtcblxuICAgIGNvbnN0IHJvd05hbWVzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dOYW1lc1RvRHJhdyhyb3dzRm9yRGlzcGxheSk7XG4gICAgY29uc3Qgcm93VG90YWxzVG9EcmF3OiBSb3dMYWJlbFtdID0gdGhpcy5nZXRSb3dUb3RhbHNUb0RyYXcoXG4gICAgICByb3dzRm9yRGlzcGxheSxcbiAgICAgIHdpZHRoLFxuICAgICk7XG5cbiAgICBjb25zdCBsZWdlbmRJdGVtcyA9IGdldExlZ2VuZEl0ZW1zKHJvd3NGb3JEaXNwbGF5LCBrZXlzSW5PcmRlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVnZW5kSXRlbXM6IGxlZ2VuZEl0ZW1zLFxuICAgICAgcm93SGVpZ2h0OiB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFKCksXG4gICAgICByZWN0czogcmVjdHMsXG4gICAgICByb3dOYW1lczogcm93TmFtZXNUb0RyYXcsXG4gICAgICByb3dUb3RhbHM6IHJvd1RvdGFsc1RvRHJhdyxcbiAgICAgIHZpZXdCb3g6IHZpZXdCb3gsXG4gICAgICB4U2NhbGU6IHhTY2FsZSxcbiAgICAgIHhUaWNrczogeFRpY2tzLFxuICAgIH07XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmb3IgYWxsIHRoZSByZWN0YW5nbGVzIGZvciBhbGwgdGhlIHJvd3NcbiAgY3JlYXRlUmVjdGFuZ2xlc0Zyb21Sb3dzKFxuICAgIGRpc3BsYXlSb3dzOiBSb3dEaXNwbGF5SW5mb1tdLFxuICAgIHhTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXIsIG5ldmVyPixcbiAgKTogUm93UmVjdGFuZ2xlW10ge1xuICAgIGNvbnN0IHJlY3RhbmdsZXM6IFJvd1JlY3RhbmdsZVtdID0gW107XG4gICAgZGlzcGxheVJvd3MuZm9yRWFjaCgoY3VycmVudFJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRSb3cuZWxlbWVudHNCdXRTdGFja2VkLmZvckVhY2goKGN1cnJlbnRFbGVtZW50LCBfKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvcE9mUm93OiBudW1iZXIgPSB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4KTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVXaWR0aDogbnVtYmVyID1cbiAgICAgICAgICB4U2NhbGUoY3VycmVudEVsZW1lbnQudG9wbGluZSkgLSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVIZWlnaHQ6IG51bWJlciA9IHRoaXMuU0VDVElPTl9IRUlHSFRTLlBFUl9SRUNUQU5HTEUoKTtcblxuICAgICAgICBjb25zdCByZWN0YW5nbGVYOiBudW1iZXIgPSB4U2NhbGUoY3VycmVudEVsZW1lbnQuYmFzZWxpbmUpO1xuICAgICAgICBjb25zdCByZWN0YW5nbGVZOiBudW1iZXIgPVxuICAgICAgICAgIHRvcE9mUm93ICsgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVztcblxuICAgICAgICBjb25zdCBmaWxsID0gYHZhcigke2N1cnJlbnRFbGVtZW50LmNvbG9yVG9rZW59KWA7XG5cbiAgICAgICAgcmVjdGFuZ2xlcy5wdXNoKHtcbiAgICAgICAgICB4OiByZWN0YW5nbGVYLFxuICAgICAgICAgIHk6IHJlY3RhbmdsZVksXG4gICAgICAgICAgd2lkdGg6IHJlY3RhbmdsZVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVjdGFuZ2xlSGVpZ2h0LFxuICAgICAgICAgIGZpbGw6IGZpbGwsXG4gICAgICAgICAgc3RyaXBlZDogY3VycmVudEVsZW1lbnQuc3R5bGUgPT09ICdzdHJpcGVkJyxcbiAgICAgICAgICByb3dOYW1lOiBjdXJyZW50Um93LnJvd05hbWUsXG4gICAgICAgICAgc3RhY2tlZFJvd0VsZW1lbnQ6IGN1cnJlbnRFbGVtZW50LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiByZWN0YW5nbGVzO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgb24gdGhlIHJvdyBuYW1lcyB3ZSBhcmUgZHJhd2luZ1xuICBnZXRSb3dOYW1lc1RvRHJhdyhkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSk6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHRoaXMuU0VDVElPTl9QQURESU5HLk9VVEVSX0xFRlRfUklHSFQ7XG4gICAgICAvLyBUaGUgcm93IG5hbWUgbG9va3MgcmlnaHQgaWYgaXRzIGJhc2UgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIGFzc29jaWF0ZWQgcmVjdGFuZ2xlXG4gICAgICBjb25zdCByb3dMYWJlbFkgPVxuICAgICAgICB0aGlzLmdldFRvcE9mUm93KHJvd0luZGV4KSArXG4gICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLlJFQ1RBTkdMRV9UT19ST1cgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUkVDVEFOR0xFKCkgLyAyO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogcm93LnJvd05hbWUsXG4gICAgICAgIHg6IHJvd0xhYmVsWCxcbiAgICAgICAgeTogcm93TGFiZWxZLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIG9uIHRoZSByb3cgdG90YWxzIHdlIGFyZSBkcmF3aW5nXG4gIGdldFJvd1RvdGFsc1RvRHJhdyhkaXNwbGF5Um93czogUm93RGlzcGxheUluZm9bXSwgd2lkdGg6IG51bWJlcik6IFJvd0xhYmVsW10ge1xuICAgIHJldHVybiBkaXNwbGF5Um93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHJvd0xhYmVsWCA9IHdpZHRoIC0gdGhpcy5TRUNUSU9OX1BBRERJTkcuT1VURVJfTEVGVF9SSUdIVDtcbiAgICAgIC8vIFRoZSByb3cgdG90YWxzIGxvb2tzIHJpZ2h0IGlmIGl0cyBiYXNlIGlzIGF0IHRoZSBiYXNlIG9mIHRoZSBhc3NvY2lhdGVkIHJlY3RhbmdsZVxuICAgICAgY29uc3Qgcm93TGFiZWxZID1cbiAgICAgICAgdGhpcy5nZXRUb3BPZlJvdyhyb3dJbmRleCkgK1xuICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5SRUNUQU5HTEVfVE9fUk9XICtcbiAgICAgICAgdGhpcy5TRUNUSU9OX0hFSUdIVFMuUEVSX1JFQ1RBTkdMRSgpIC8gMjtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IHRoaXMudmFsdWVGb3JtYXR0ZXIocm93LnJvd1RvdGFsKSxcbiAgICAgICAgeDogcm93TGFiZWxYLFxuICAgICAgICB5OiByb3dMYWJlbFksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcmVhZG9ubHkgZHJhd0RhdGEkOiBPYnNlcnZhYmxlPFN0YWNrZWRSb3dEcmF3RGF0YSB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5pbnB1dCQsXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5oZWlnaHQkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW2lucHV0LCB3aWR0aCwgaGVpZ2h0XSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJhd25EYXRhKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodFxuICAgICAgICAgID8gaGVpZ2h0XG4gICAgICAgICAgOiB0aGlzLlNFQ1RJT05fSEVJR0hUUy5YX0FYSVNfTEFCRUwgK1xuICAgICAgICAgICAgICB0aGlzLlNFQ1RJT05fUEFERElORy5PVVRFUl9UT1BfQk9UVE9NICtcbiAgICAgICAgICAgICAgdGhpcy5TRUNUSU9OX1BBRERJTkcuUkVDVEFOR0xFX1RPX1JPVyArXG4gICAgICAgICAgICAgICh0aGlzLlNFQ1RJT05fSEVJR0hUUy5QRVJfUk9XKCkgK1xuICAgICAgICAgICAgICAgIHRoaXMuU0VDVElPTl9QQURESU5HLkJFVFdFRU5fUk9XKSAqXG4gICAgICAgICAgICAgICAgaW5wdXQubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheSh7IHJlZkNvdW50OiB0cnVlLCBidWZmZXJTaXplOiAxIH0pLFxuICApO1xuXG4gIC8vIExldHMgdXMga25vdyB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIHplcm8gZGF0YSBzdGF0ZVxuICByZWFkb25seSBlbXB0eSQgPSB0aGlzLmlucHV0JC5waXBlKFxuICAgIG1hcChpbnB1dCA9PiBpbnB1dC5ldmVyeShzdGFjayA9PiBzdGFjay5kYXRhLmxlbmd0aCA9PT0gMCkpLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG5cbiAgLy8gV2hhdCByZWN0YW5nbGUgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRSZWN0YW5nbGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgcmVjdGFuZ2xlOiBSb3dSZWN0YW5nbGU7XG4gICAgZXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBXaGF0IGJhbmQgd2UgYXJlIGN1cnJlbnRseSBob3ZlcmluZyBvdmVyXG4gIHJlYWRvbmx5IGhvdmVyZWRCYW5kJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIHJvd05hbWU6IHN0cmluZztcbiAgICBldmVudDogTW91c2VFdmVudDtcbiAgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIENyZWF0ZSB0aGUgbWV0cmljIHRvIGRpc3BsYXkgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBob3ZlcmVkIHJlY3RhbmdsZVxuICByZWFkb25seSBjYWxsb3V0JCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaG92ZXJlZEJhbmQkLCB0aGlzLmRyYXdEYXRhJF0pLnBpcGUoXG4gICAgbWFwKChbaG92ZXJlZEJhbmQsIGRyYXdEYXRhXSkgPT4ge1xuICAgICAgaWYgKCFob3ZlcmVkQmFuZCB8fCAhZHJhd0RhdGEpIHJldHVybiBudWxsO1xuXG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gaG92ZXJlZEJhbmQuZXZlbnQ7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBhbmNob3IgPSAoPFNWR1JlY3RFbGVtZW50PnRhcmdldCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIHR5cGUgTWV0cmljID0geyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH07XG4gICAgICBjb25zdCBtZXRyaWNzOiBNZXRyaWNbXSA9IGRyYXdEYXRhLnJlY3RzXG4gICAgICAgIC5maWx0ZXIocmVjdCA9PiByZWN0LnJvd05hbWUgPT09IGhvdmVyZWRCYW5kLnJvd05hbWUpXG4gICAgICAgIC5tYXAocmVjdCA9PiAoe1xuICAgICAgICAgIGxhYmVsOiByZWN0LnN0YWNrZWRSb3dFbGVtZW50LmxhYmVsLFxuICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlRm9ybWF0dGVyKHJlY3Quc3RhY2tlZFJvd0VsZW1lbnQudmFsdWUpLFxuICAgICAgICB9KSk7XG5cbiAgICAgIHJldHVybiB7IGFuY2hvciwgbWV0cmljcyB9O1xuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KHsgcmVmQ291bnQ6IHRydWUsIGJ1ZmZlclNpemU6IDEgfSksXG4gICk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tlZFJvd0NvbXBvbmVudCB7XG4gIC8vIEEgc3BlY2lmaWNhbGx5IGNvbG9yZWQgc2VjdGlvbiBvZiBvbmUgcm93LlxuICBleHBvcnQgdHlwZSBSb3dFbGVtZW50ID0ge1xuICAgIGxhYmVsOiBzdHJpbmc7IC8vIExlZ2VuZCBlbGVtZW50IG5hbWVcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIGNvbG9yVG9rZW46IHN0cmluZztcbiAgICBzdHlsZT86ICdzb2xpZCcgfCAnc3RyaXBlZCc7XG4gIH07XG4gIC8vIFRoZSBpbnB1dCB0aGF0IGRldGVybWluZXMgb25lIHJvdy5cbiAgZXhwb3J0IHR5cGUgUm93U3RhY2sgPSB7XG4gICAgcm93TmFtZTogc3RyaW5nO1xuICAgIGRhdGE6IFJvd0VsZW1lbnRbXTtcbiAgfTtcbn1cbiIsIjxkaXYgKm5nSWY9XCIhKGVtcHR5JCB8IGFzeW5jKTsgZWxzZSB6ZXJvU3RhdGVcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8c3ZnXG4gICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgKm5nSWY9XCJkcmF3RGF0YSQgfCBhc3luYzsgbGV0IGRyYXdcIlxuICAgIFthdHRyLnZpZXdCb3hdPVwiZHJhdy52aWV3Qm94XCJcbiAgPlxuICAgIDxkZWZzPlxuICAgICAgPHBhdHRlcm5cbiAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgeD1cIjBcIlxuICAgICAgICB5PVwiMFwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgPlxuICAgICAgICA8bGluZVxuICAgICAgICAgIFthdHRyLngxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLnkxXT1cIjBcIlxuICAgICAgICAgIFthdHRyLngyXT1cImRyYXcucm93SGVpZ2h0XCJcbiAgICAgICAgICBbYXR0ci55Ml09XCJkcmF3LnJvd0hlaWdodFwiXG4gICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgID48L2xpbmU+XG4gICAgICA8L3BhdHRlcm4+XG4gICAgPC9kZWZzPlxuICAgIDxnICpuZ0Zvcj1cImxldCByb3dOYW1lVG9EcmF3IG9mIGRyYXcucm93TmFtZXNcIj5cbiAgICAgIDx0ZXh0XG4gICAgICAgIHJpdlNWR1RleHRUcnVuY2F0ZVxuICAgICAgICBbdGV4dF09XCJyb3dOYW1lVG9EcmF3LmxhYmVsXCJcbiAgICAgICAgW3dpZHRoXT1cIlNFQ1RJT05fV0lEVEhTLlJPV19OQU1FXCJcbiAgICAgICAgY2xhc3M9XCJyb3ctdGl0bGVcIlxuICAgICAgICBbYXR0ci54XT1cInJvd05hbWVUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93TmFtZVRvRHJhdy55XCJcbiAgICAgID48L3RleHQ+XG4gICAgPC9nPlxuICAgIDxnICpuZ0Zvcj1cImxldCB0aWNrIG9mIGRyYXcueFRpY2tzXCI+XG4gICAgICA8cmVjdFxuICAgICAgICBjbGFzcz1cInRpY2tcIlxuICAgICAgICBbYXR0ci54XT1cImRyYXcueFNjYWxlKHRpY2spXCJcbiAgICAgICAgeT1cIjBcIlxuICAgICAgICB3aWR0aD1cIjFcIlxuICAgICAgICBoZWlnaHQ9XCIxMDAlXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInRpY2stbGFiZWxcIlxuICAgICAgICBbYXR0ci54XT1cImRyYXcueFNjYWxlKHRpY2spXCJcbiAgICAgICAgW2F0dHIueV09XCJsb2NhdGlvbk9mWEF4aXNUaWNrKClcIlxuICAgICAgICBkeD1cIjRcIlxuICAgICAgICBkeT1cIi00XCJcbiAgICAgID5cbiAgICAgICAge3sgdmFsdWVGb3JtYXR0ZXIodGljaykgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gICAgPGdcbiAgICAgICpuZ0Zvcj1cImxldCByZWN0IG9mIGRyYXcucmVjdHNcIlxuICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZEJhbmQkLm5leHQoeyByb3dOYW1lOiByZWN0LnJvd05hbWUsIGV2ZW50OiAkZXZlbnQgfSlcIlxuICAgICAgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZEJhbmQkLm5leHQobnVsbClcIlxuICAgID5cbiAgICAgIDxyZWN0XG4gICAgICAgIGNsYXNzPVwicm93XCJcbiAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICBbYXR0ci5maWxsXT1cInJlY3QuZmlsbFwiXG4gICAgICAgIFtjbGFzcy5ibHVycmVkXT1cIlxuICAgICAgICAgIChob3ZlcmVkQmFuZCQgfCBhc3luYykgIT09IG51bGwgJiZcbiAgICAgICAgICAoaG92ZXJlZEJhbmQkIHwgYXN5bmMpPy5yb3dOYW1lICE9PSByZWN0LnJvd05hbWVcbiAgICAgICAgXCJcbiAgICAgID48L3JlY3Q+XG4gICAgICA8cmVjdFxuICAgICAgICAqbmdJZj1cInJlY3Quc3RyaXBlZFwiXG4gICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgPjwvcmVjdD5cbiAgICA8L2c+XG4gICAgPGcgKm5nRm9yPVwibGV0IHJvd1RvdGFsVG9EcmF3IG9mIGRyYXcucm93VG90YWxzXCI+XG4gICAgICA8dGV4dFxuICAgICAgICBjbGFzcz1cInJvdy10b3RhbFwiXG4gICAgICAgIFthdHRyLnhdPVwicm93VG90YWxUb0RyYXcueFwiXG4gICAgICAgIFthdHRyLnldPVwicm93VG90YWxUb0RyYXcueVwiXG4gICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgID5cbiAgICAgICAge3sgcm93VG90YWxUb0RyYXcubGFiZWwgfX1cbiAgICAgIDwvdGV4dD5cbiAgICA8L2c+XG4gIDwvc3ZnPlxuICA8bGVnZW5kICpuZ0lmPVwiZHJhd0RhdGEkIHwgYXN5bmM7IGxldCBkcmF3XCI+XG4gICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZHJhdy5sZWdlbmRJdGVtc1wiXG4gICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICBbY29sb3JUb2tlbl09XCJpdGVtLmNvbG9yVG9rZW5cIlxuICAgICAgW3N0eWxlXT1cIml0ZW0uc3R5bGUgPyBpdGVtLnN0eWxlIDogJ3NvbGlkJ1wiXG4gICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICA8L2xlZ2VuZD5cbjwvZGl2PlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiY2FsbG91dCQgfCBhc3luYzsgbGV0IGNhbGxvdXRcIj5cbiAgPHJpdi1jYWxsb3V0XG4gICAgKnJpdi1jYWxsb3V0XG4gICAgW2FuY2hvcl09XCJjYWxsb3V0LmFuY2hvclwiXG4gICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInYm90dG9tLWNlbnRlcidcIlxuICAgIFthbGxvd2VkUG9zaXRpb25zXT1cIltcbiAgICAgICdjZW50ZXItcmlnaHQnLFxuICAgICAgJ2NlbnRlci1sZWZ0JyxcbiAgICAgICd0b3AtY2VudGVyJyxcbiAgICAgICdib3R0b20tY2VudGVyJ1xuICAgIF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljXCIgKm5nRm9yPVwibGV0IG1ldHJpYyBvZiBjYWxsb3V0Lm1ldHJpY3NcIj5cbiAgICAgICAgPGRpdj57eyBtZXRyaWMubGFiZWwgfX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtbWV0cmljLXZhbHVlXCI+e3sgbWV0cmljLnZhbHVlIH19PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9yaXYtY2FsbG91dD5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3plcm9TdGF0ZT5cbiAgPHJpdi16ZXJvLXN0YXRlIFttZXNzYWdlXT1cInplcm9TdGF0ZU1lc3NhZ2VcIj48L3Jpdi16ZXJvLXN0YXRlPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==