@ecodev/natural 58.0.0 → 58.0.2
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.
- package/esm2022/lib/modules/avatar/component/avatar.component.mjs +3 -3
- package/esm2022/lib/modules/avatar/service/avatar.service.mjs +8 -10
- package/esm2022/lib/modules/file/component/file.component.mjs +4 -4
- package/esm2022/lib/modules/fixed-button/fixed-button.component.mjs +2 -2
- package/esm2022/lib/modules/search/dropdown-container/dropdown-container.component.mjs +2 -2
- package/esm2022/lib/modules/search/facet-selector/facet-selector.component.mjs +2 -2
- package/esm2022/lib/modules/search/group/group.component.mjs +2 -2
- package/esm2022/lib/modules/search/input/input.component.mjs +2 -2
- package/esm2022/lib/modules/search/search/search.component.mjs +2 -2
- package/esm2022/lib/modules/sidenav/sidenav-container/sidenav-container.component.mjs +2 -2
- package/esm2022/lib/modules/sidenav/sidenav-content/sidenav-content.component.mjs +2 -2
- package/esm2022/lib/modules/table-button/table-button.component.mjs +2 -2
- package/esm2022/lib/services/abstract-model.service.mjs +8 -8
- package/fesm2022/ecodev-natural.mjs +37 -39
- package/fesm2022/ecodev-natural.mjs.map +1 -1
- package/lib/modules/file/component/file.component.d.ts +2 -2
- package/lib/services/abstract-model.service.d.ts +1 -1
- package/package.json +1 -1
- package/src/lib/modules/panels/_panels.external.scss +10 -10
- package/src/lib/modules/search/input/_input.theme.scss +3 -3
- package/src/lib/modules/sidenav/_sidenav.theme.scss +1 -1
- package/src/lib/styles/_table.scss +1 -1
|
@@ -42,11 +42,11 @@ export class NaturalTableButtonComponent {
|
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NaturalTableButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
45
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: NaturalTableButtonComponent, isStandalone: true, selector: "natural-table-button", inputs: { queryParams: "queryParams", queryParamsHandling: "queryParamsHandling", label: "label", icon: "icon", href: "href", navigate: "navigate", fragment: "fragment", preserveFragment: "preserveFragment", disabled: "disabled", raised: "raised", color: "color" }, outputs: { buttonClick: "buttonClick" }, usesOnChanges: true, ngImport: i0, template: "<!-- Because directives can't be applied conditionally (routerLink, mat-button and mat-icon-button), we have to use different elements -->\n\n<!-- Edge case of a button without any kind of link at all -->\n@if (type === 'none') {\n <span>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n @if (label) {\n <span>{{ label }}</span>\n }\n </span>\n}\n\n@if (!raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-icon-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-icon-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n\n@if (raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-raised-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" [disabled]=\"disabled\" (click)=\"buttonClick.emit($event)\" mat-raised-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a\n [color]=\"color\"\n [disabled]=\"disabled\"\n (click)=\"buttonClick.emit($event)\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-raised-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a\n [attr.href]=\"href\"\n [color]=\"color\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n target=\"_blank\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n", styles: ["natural-table-button{flex:1;
|
|
45
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: NaturalTableButtonComponent, isStandalone: true, selector: "natural-table-button", inputs: { queryParams: "queryParams", queryParamsHandling: "queryParamsHandling", label: "label", icon: "icon", href: "href", navigate: "navigate", fragment: "fragment", preserveFragment: "preserveFragment", disabled: "disabled", raised: "raised", color: "color" }, outputs: { buttonClick: "buttonClick" }, usesOnChanges: true, ngImport: i0, template: "<!-- Because directives can't be applied conditionally (routerLink, mat-button and mat-icon-button), we have to use different elements -->\n\n<!-- Edge case of a button without any kind of link at all -->\n@if (type === 'none') {\n <span>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n @if (label) {\n <span>{{ label }}</span>\n }\n </span>\n}\n\n@if (!raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-icon-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-icon-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n\n@if (raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-raised-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" [disabled]=\"disabled\" (click)=\"buttonClick.emit($event)\" mat-raised-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a\n [color]=\"color\"\n [disabled]=\"disabled\"\n (click)=\"buttonClick.emit($event)\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-raised-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a\n [attr.href]=\"href\"\n [color]=\"color\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n target=\"_blank\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n", styles: ["natural-table-button{display:flex;flex:1;flex-direction:row;justify-content:flex-start;align-items:center}natural-table-button mat-icon:not(:last-child){margin-right:5px}natural-table-button a.mat-mdc-button{display:flex;flex:1;flex-direction:row;justify-content:flex-start;align-items:center}natural-table-button a.mat-mdc-button .mdc-button__label{display:flex;flex-direction:row;align-items:center}natural-table-button>span{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;padding:0 8px}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NaturalIconDirective, selector: "mat-icon[naturalIcon]", inputs: ["naturalIcon", "size"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i2.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
46
46
|
}
|
|
47
47
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: NaturalTableButtonComponent, decorators: [{
|
|
48
48
|
type: Component,
|
|
49
|
-
args: [{ selector: 'natural-table-button', encapsulation: ViewEncapsulation.None, standalone: true, imports: [MatIconModule, NaturalIconDirective, MatButtonModule, RouterLink], template: "<!-- Because directives can't be applied conditionally (routerLink, mat-button and mat-icon-button), we have to use different elements -->\n\n<!-- Edge case of a button without any kind of link at all -->\n@if (type === 'none') {\n <span>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n @if (label) {\n <span>{{ label }}</span>\n }\n </span>\n}\n\n@if (!raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-icon-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-icon-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n\n@if (raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-raised-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" [disabled]=\"disabled\" (click)=\"buttonClick.emit($event)\" mat-raised-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a\n [color]=\"color\"\n [disabled]=\"disabled\"\n (click)=\"buttonClick.emit($event)\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-raised-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a\n [attr.href]=\"href\"\n [color]=\"color\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n target=\"_blank\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n", styles: ["natural-table-button{flex:1;
|
|
49
|
+
args: [{ selector: 'natural-table-button', encapsulation: ViewEncapsulation.None, standalone: true, imports: [MatIconModule, NaturalIconDirective, MatButtonModule, RouterLink], template: "<!-- Because directives can't be applied conditionally (routerLink, mat-button and mat-icon-button), we have to use different elements -->\n\n<!-- Edge case of a button without any kind of link at all -->\n@if (type === 'none') {\n <span>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n @if (label) {\n <span>{{ label }}</span>\n }\n </span>\n}\n\n@if (!raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a (click)=\"buttonClick.emit($event)\" [disabled]=\"disabled\" mat-icon-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-icon-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n\n@if (raised) {\n <!-- App routed link with label... -->\n @if (type === 'routerLink' && label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-raised-button\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'routerLink' && !label) {\n <a\n [color]=\"color\"\n [queryParams]=\"queryParams\"\n [queryParamsHandling]=\"queryParamsHandling\"\n [routerLink]=\"navigate\"\n [fragment]=\"fragment\"\n [preserveFragment]=\"preserveFragment\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- Click with label... -->\n @if (type === 'click' && label) {\n <a [color]=\"color\" [disabled]=\"disabled\" (click)=\"buttonClick.emit($event)\" mat-raised-button>\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'click' && !label) {\n <a\n [color]=\"color\"\n [disabled]=\"disabled\"\n (click)=\"buttonClick.emit($event)\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n <!-- External link with label... -->\n @if (type === 'href' && label) {\n <a [attr.href]=\"href\" [color]=\"color\" [disabled]=\"disabled\" mat-raised-button target=\"_blank\">\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n <span>{{ label }}</span>\n </a>\n }\n <!-- ... and without label -->\n @if (type === 'href' && !label) {\n <a\n [attr.href]=\"href\"\n [color]=\"color\"\n [disabled]=\"disabled\"\n mat-icon-button\n class=\"mat-elevation-z4\"\n target=\"_blank\"\n >\n @if (icon) {\n <mat-icon [naturalIcon]=\"icon\" />\n }\n </a>\n }\n}\n", styles: ["natural-table-button{display:flex;flex:1;flex-direction:row;justify-content:flex-start;align-items:center}natural-table-button mat-icon:not(:last-child){margin-right:5px}natural-table-button a.mat-mdc-button{display:flex;flex:1;flex-direction:row;justify-content:flex-start;align-items:center}natural-table-button a.mat-mdc-button .mdc-button__label{display:flex;flex-direction:row;align-items:center}natural-table-button>span{display:flex;flex-direction:row;justify-content:flex-start;align-items:center;padding:0 8px}\n"] }]
|
|
50
50
|
}], propDecorators: { queryParams: [{
|
|
51
51
|
type: Input
|
|
52
52
|
}], queryParamsHandling: [{
|
|
@@ -10,7 +10,8 @@ import { NaturalDebounceService } from './debounce.service';
|
|
|
10
10
|
import { deepClone } from '../modules/search/classes/utils';
|
|
11
11
|
import { inject } from '@angular/core';
|
|
12
12
|
export class NaturalAbstractModelService {
|
|
13
|
-
|
|
13
|
+
#plural;
|
|
14
|
+
constructor(name, oneQuery, allQuery, createMutation, updateMutation, deleteMutation, plural = null) {
|
|
14
15
|
this.name = name;
|
|
15
16
|
this.oneQuery = oneQuery;
|
|
16
17
|
this.allQuery = allQuery;
|
|
@@ -23,6 +24,7 @@ export class NaturalAbstractModelService {
|
|
|
23
24
|
this.creatingCache = new Map();
|
|
24
25
|
this.apollo = inject(Apollo);
|
|
25
26
|
this.naturalDebounceService = inject(NaturalDebounceService);
|
|
27
|
+
this.#plural = plural ?? makePlural(this.name);
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
30
|
* List of individual fields validators
|
|
@@ -360,12 +362,11 @@ export class NaturalAbstractModelService {
|
|
|
360
362
|
* This is used for the unique validator
|
|
361
363
|
*/
|
|
362
364
|
count(queryVariablesManager) {
|
|
363
|
-
const
|
|
364
|
-
const queryName = 'Count' + upperCaseFirstLetter(plural);
|
|
365
|
+
const queryName = 'Count' + upperCaseFirstLetter(this.#plural);
|
|
365
366
|
const filterType = upperCaseFirstLetter(this.name) + 'Filter';
|
|
366
367
|
const query = gql `
|
|
367
368
|
query ${queryName} ($filter: ${filterType}) {
|
|
368
|
-
count: ${plural} (filter: $filter, pagination: {pageSize: 0, pageIndex: 0}) {
|
|
369
|
+
count: ${this.#plural} (filter: $filter, pagination: {pageSize: 0, pageIndex: 0}) {
|
|
369
370
|
length
|
|
370
371
|
}
|
|
371
372
|
}`;
|
|
@@ -408,8 +409,7 @@ export class NaturalAbstractModelService {
|
|
|
408
409
|
* This is used to extract only the array of fetched objects out of the entire fetched data
|
|
409
410
|
*/
|
|
410
411
|
mapAll() {
|
|
411
|
-
|
|
412
|
-
return map(result => result.data[plural]); // See https://github.com/apollographql/apollo-client/issues/5662
|
|
412
|
+
return map(result => result.data[this.#plural]); // See https://github.com/apollographql/apollo-client/issues/5662
|
|
413
413
|
}
|
|
414
414
|
/**
|
|
415
415
|
* This is used to extract only the created object out of the entire fetched data
|
|
@@ -429,7 +429,7 @@ export class NaturalAbstractModelService {
|
|
|
429
429
|
* This is used to extract only flag when deleting an object
|
|
430
430
|
*/
|
|
431
431
|
mapDelete(result) {
|
|
432
|
-
const name = 'delete' +
|
|
432
|
+
const name = 'delete' + upperCaseFirstLetter(this.#plural);
|
|
433
433
|
return result.data[name]; // See https://github.com/apollographql/apollo-client/issues/5662
|
|
434
434
|
}
|
|
435
435
|
/**
|
|
@@ -498,4 +498,4 @@ export class NaturalAbstractModelService {
|
|
|
498
498
|
}
|
|
499
499
|
}
|
|
500
500
|
}
|
|
501
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFpQixNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBYyxhQUFhLEVBQXdCLE1BQU0scUJBQXFCLENBQUM7QUFDdEYsT0FBTyxFQUFvQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRXBILE9BQU8sRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNoRCxPQUFPLEVBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFtQixNQUFNLE1BQU0sQ0FBQztBQUNyRyxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVHLE9BQU8sRUFBQyw0QkFBNEIsRUFBaUIsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRixPQUFPLEVBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXBGLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRTFELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBY3JDLE1BQU0sT0FBZ0IsMkJBQTJCO0lBbUI3QyxZQUN1QixJQUFZLEVBQ1osUUFBNkIs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Q0FBQztZQUM5QixNQUFNLElBQUksS0FBSyxDQUNYLDhHQUE4RyxDQUNqSCxDQUFDO1FBQ04sQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLEVBQVU7UUFDakMsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxJQUFJLENBQ3hDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFDLEVBQUUsRUFBRSxFQUFFLEVBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQ3pFLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsS0FBMEI7UUFDOUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQ3BHLENBQUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Fwb2xsbywgZ3FsLCBNdXRhdGlvblJlc3VsdH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXInO1xuaW1wb3J0IHtGZXRjaFJlc3VsdCwgTmV0d29ya1N0YXR1cywgV2F0Y2hRdWVyeUZldGNoUG9saWN5fSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBBc3luY1ZhbGlkYXRvckZuLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRvckZufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0RvY3VtZW50Tm9kZX0gZnJvbSAnZ3JhcGhxbCc7XG5pbXBvcnQge2RlZmF1bHRzLCBtZXJnZSwgcGlja30gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgY29tYmluZUxhdGVzdCwgRU1QVFksIGZpcnN0LCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgT3BlcmF0b3JGdW5jdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFrZVdoaWxlLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlciwgUXVlcnlWYXJpYWJsZXN9IGZyb20gJy4uL2NsYXNzZXMvcXVlcnktdmFyaWFibGUtbWFuYWdlcic7XG5pbXBvcnQge0xpdGVyYWx9IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcbmltcG9ydCB7bWFrZVBsdXJhbCwgcmVsYXRpb25zVG9JZHMsIHVwcGVyQ2FzZUZpcnN0TGV0dGVyfSBmcm9tICcuLi9jbGFzc2VzL3V0aWxpdHknO1xuaW1wb3J0IHtQYWdpbmF0ZWREYXRhfSBmcm9tICcuLi9jbGFzc2VzL2RhdGEtc291cmNlJztcbmltcG9ydCB7TmF0dXJhbERlYm91bmNlU2VydmljZX0gZnJvbSAnLi9kZWJvdW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7QXBvbGxvUXVlcnlSZXN1bHR9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2NvcmUvdHlwZXMnO1xuaW1wb3J0IHtkZWVwQ2xvbmV9IGZyb20gJy4uL21vZHVsZXMvc2VhcmNoL2NsYXNzZXMvdXRpbHMnO1xuaW1wb3J0IHtpbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgdHlwZSBGb3JtVmFsaWRhdG9ycyA9IFJlY29yZDxzdHJpbmcsIFZhbGlkYXRvckZuW10+O1xuXG5leHBvcnQgdHlwZSBGb3JtQXN5bmNWYWxpZGF0b3JzID0gUmVjb3JkPHN0cmluZywgQXN5bmNWYWxpZGF0b3JGbltdPjtcblxuZXhwb3J0IHR5cGUgVmFyaWFibGVzV2l0aElucHV0ID0ge1xuICAgIGlucHV0OiBMaXRlcmFsO1xufTtcblxuZXhwb3J0IHR5cGUgRm9ybUNvbnRyb2xzID0gUmVjb3JkPHN0cmluZywgQWJzdHJhY3RDb250cm9sPjtcblxuZXhwb3J0IHR5cGUgV2l0aElkPFQ+ID0ge2lkOiBzdHJpbmd9ICYgVDtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5hdHVyYWxBYnN0cmFjdE1vZGVsU2VydmljZTxcbiAgICBUb25lLFxuICAgIFZvbmUgZXh0ZW5kcyB7aWQ6IHN0cmluZ30sXG4gICAgVGFsbCBleHRlbmRzIFBhZ2luYXRlZERhdGE8TGl0ZXJhbD4sXG4gICAgVmFsbCBleHRlbmRzIFF1ZXJ5VmFyaWFibGVzLFxuICAgIFRjcmVhdGUsXG4gICAgVmNyZWF0ZSBleHRlbmRzIFZhcmlhYmxlc1dpdGhJbnB1dCxcbiAgICBUdXBkYXRlLFxuICAgIFZ1cGRhdGUgZXh0ZW5kcyB7aWQ6IHN0cmluZzsgaW5wdXQ6IExpdGVyYWx9LFxuICAgIFRkZWxldGUsXG4gICAgVmRlbGV0ZSBleHRlbmRzIHtpZHM6IHN0cmluZ1tdfSxcbj4ge1xuICAgIC8qKlxuICAgICAqIFN0b3JlIHRoZSBjcmVhdGlvbiBtdXRhdGlvbnMgdGhhdCBhcmUgcGVuZGluZ1xuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRpbmdDYWNoZSA9IG5ldyBNYXA8VmNyZWF0ZVsnaW5wdXQnXSB8IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPiwgT2JzZXJ2YWJsZTxUY3JlYXRlPj4oKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBvbGxvID0gaW5qZWN0KEFwb2xsbyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hdHVyYWxEZWJvdW5jZVNlcnZpY2UgPSBpbmplY3QoTmF0dXJhbERlYm91bmNlU2VydmljZSk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBvbmVRdWVyeTogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFsbFF1ZXJ5OiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlTXV0YXRpb246IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSB1cGRhdGVNdXRhdGlvbjogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlbGV0ZU11dGF0aW9uOiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICkge31cblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCBmaWVsZHMgdmFsaWRhdG9yc1xuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgZ2V0Rm9ybVZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogRm9ybVZhbGlkYXRvcnMge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIGFzeW5jIGZpZWxkcyB2YWxpZGF0b3JzXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBnZXRGb3JtQXN5bmNWYWxpZGF0b3JzKG1vZGVsPzogTGl0ZXJhbCk6IEZvcm1Bc3luY1ZhbGlkYXRvcnMge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBncm91cGVkIGZpZWxkcyB2YWxpZGF0b3JzIChsaWtlIHBhc3N3b3JkICsgY29uZmlybSBwYXNzd29yZClcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIGdldEZvcm1Hcm91cFZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogVmFsaWRhdG9yRm5bXSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGFzeW5jIGdyb3VwIGZpZWxkcyB2YWxpZGF0b3JzIChsaWtlIHVuaXF1ZSBjb25zdHJhaW50IG9uIG11bHRpcGxlIGNvbHVtbnMpXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBnZXRGb3JtR3JvdXBBc3luY1ZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogQXN5bmNWYWxpZGF0b3JGbltdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtQ29uZmlnKG1vZGVsOiBMaXRlcmFsKTogRm9ybUNvbnRyb2xzIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gey4uLnRoaXMuZ2V0RGVmYXVsdEZvclNlcnZlcigpLCAuLi50aGlzLmdldEZvcm1FeHRyYUZpZWxkRGVmYXVsdFZhbHVlcygpfTtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuZ2V0Rm9ybVZhbGlkYXRvcnMobW9kZWwpO1xuICAgICAgICBjb25zdCBhc3luY1ZhbGlkYXRvcnMgPSB0aGlzLmdldEZvcm1Bc3luY1ZhbGlkYXRvcnMobW9kZWwpO1xuICAgICAgICBjb25zdCBjb250cm9sczogRm9ybUNvbnRyb2xzID0ge307XG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gbW9kZWwucGVybWlzc2lvbnMgPyAhbW9kZWwucGVybWlzc2lvbnMudXBkYXRlIDogZmFsc2U7XG5cbiAgICAgICAgaWYgKG1vZGVsLmlkKSB7XG4gICAgICAgICAgICBjb250cm9scy5pZCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woe3ZhbHVlOiBtb2RlbC5pZCwgZGlzYWJsZWQ6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbmZpZ3VyZSBmb3JtIGZvciBlYWNoIGZpZWxkIG9mIG1vZGVsXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kZWxba2V5XSAhPT0gdW5kZWZpbmVkID8gbW9kZWxba2V5XSA6IHZhbHVlc1trZXldO1xuICAgICAgICAgICAgY29uc3QgZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdHlwZW9mIHZhbGlkYXRvcnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWxpZGF0b3JzW2tleV0gOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0b3IgPSB0eXBlb2YgYXN5bmNWYWxpZGF0b3JzW2tleV0gIT09ICd1bmRlZmluZWQnID8gYXN5bmNWYWxpZGF0b3JzW2tleV0gOiBudWxsO1xuXG4gICAgICAgICAgICBjb250cm9sc1trZXldID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChmb3JtU3RhdGUsIHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlndXJlIGZvcm0gZm9yIGV4dHJhIHZhbGlkYXRvcnMgdGhhdCBhcmUgbm90IG9uIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsaWRhdG9ycykpIHtcbiAgICAgICAgICAgIGlmICghY29udHJvbHNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1vZGVsW2tleV0gPyBtb2RlbFtrZXldIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb250cm9sc1trZXldID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbChmb3JtU3RhdGUsIHZhbGlkYXRvcnNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbHNba2V5XSAmJiBhc3luY1ZhbGlkYXRvcnNba2V5XSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0uc2V0QXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKGZvcm1TdGF0ZSwgbnVsbCwgYXN5bmNWYWxpZGF0b3JzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRyb2xzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSB0aGUgZmluYWwgRm9ybUdyb3VwIGZvciB0aGUgb2JqZWN0LCBpbmNsdWRpbmcgYWxsIHZhbGlkYXRvcnNcbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCAqKm5vdCoqIGJlIG92ZXJyaWRkZW4sIGJ1dCBpbnN0ZWFkIGBnZXRGb3JtQ29uZmlnYCxcbiAgICAgKiBgZ2V0Rm9ybUdyb3VwVmFsaWRhdG9yc2AsIGBnZXRGb3JtR3JvdXBBc3luY1ZhbGlkYXRvcnNgIG1pZ2h0IGJlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGb3JtR3JvdXAobW9kZWw6IExpdGVyYWwpOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICAgICAgY29uc3QgZm9ybUNvbmZpZyA9IHRoaXMuZ2V0Rm9ybUNvbmZpZyhkZWVwQ2xvbmUobW9kZWwpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVbnR5cGVkRm9ybUdyb3VwKGZvcm1Db25maWcsIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IHRoaXMuZ2V0Rm9ybUdyb3VwVmFsaWRhdG9ycyhtb2RlbCksXG4gICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnM6IHRoaXMuZ2V0Rm9ybUdyb3VwQXN5bmNWYWxpZGF0b3JzKG1vZGVsKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgc2luZ2xlIG9iamVjdFxuICAgICAqXG4gICAgICogSWYgYXZhaWxhYmxlIGl0IHdpbGwgZW1pdCBvYmplY3QgZnJvbSBjYWNoZSBpbW1lZGlhdGVseSwgdGhlbiBpdFxuICAgICAqIHdpbGwgKiphbHdheXMqKiBmZXRjaCBmcm9tIG5ldHdvcmsgYW5kIHRoZW4gdGhlIG9ic2VydmFibGUgd2lsbCBiZSBjb21wbGV0ZWQuXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCBzdWJzY3JpYmUgdG8gc3RhcnQgZ2V0dGluZyByZXN1bHRzIChhbmQgZmV0Y2ggZnJvbSBuZXR3b3JrKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T25lKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRvbmU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI3ByZXBhcmVPbmVRdWVyeShpZCwgJ2NhY2hlLWFuZC1uZXR3b3JrJykucGlwZShcbiAgICAgICAgICAgIHRha2VXaGlsZShyZXN1bHQgPT4gcmVzdWx0Lm5ldHdvcmtTdGF0dXMgIT09IE5ldHdvcmtTdGF0dXMucmVhZHksIHRydWUpLFxuICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiAocmVzdWx0LmRhdGEgYXMgTGl0ZXJhbClbdGhpcy5uYW1lXSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2F0Y2ggYSBzaW5nbGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBJZiBhdmFpbGFibGUgaXQgd2lsbCBlbWl0IG9iamVjdCBmcm9tIGNhY2hlIGltbWVkaWF0ZWx5LCB0aGVuIGl0XG4gICAgICogd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yaywgYW5kIHRoZW4ga2VlcCB3YXRjaGluZyB0aGUgY2FjaGUgZm9yZXZlci5cbiAgICAgKlxuICAgICAqIFlvdSBtdXN0IHN1YnNjcmliZSB0byBzdGFydCBnZXR0aW5nIHJlc3VsdHMgKGFuZCBmZXRjaCBmcm9tIG5ldHdvcmspLlxuICAgICAqXG4gICAgICogWW91ICoqTVVTVCoqIHVuc3Vic2NyaWJlLlxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaE9uZShpZDogc3RyaW5nLCBmZXRjaFBvbGljeTogV2F0Y2hRdWVyeUZldGNoUG9saWN5ID0gJ2NhY2hlLWFuZC1uZXR3b3JrJyk6IE9ic2VydmFibGU8VG9uZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJlcGFyZU9uZVF1ZXJ5KGlkLCBmZXRjaFBvbGljeSkucGlwZShtYXAocmVzdWx0ID0+IChyZXN1bHQuZGF0YSBhcyBMaXRlcmFsKVt0aGlzLm5hbWVdKSk7XG4gICAgfVxuXG4gICAgI3ByZXBhcmVPbmVRdWVyeShpZDogc3RyaW5nLCBmZXRjaFBvbGljeTogV2F0Y2hRdWVyeUZldGNoUG9saWN5KTogT2JzZXJ2YWJsZTxBcG9sbG9RdWVyeVJlc3VsdDx1bmtub3duPj4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKGlkKTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5vbmVRdWVyeSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFibGVzRm9yT25lKGlkKS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKHZhcmlhYmxlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5vbmVRdWVyeSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG8ud2F0Y2hRdWVyeTx1bmtub3duLCBWb25lPih7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLm9uZVF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6IGZldGNoUG9saWN5LFxuICAgICAgICAgICAgICAgICAgICBuZXh0RmV0Y2hQb2xpY3k6ICdjYWNoZS1vbmx5JyxcbiAgICAgICAgICAgICAgICB9KS52YWx1ZUNoYW5nZXM7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpbHRlcihyZXN1bHQgPT4gISFyZXN1bHQuZGF0YSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgY29sbGVjdGlvbiBvZiBvYmplY3RzXG4gICAgICpcbiAgICAgKiBJdCB3aWxsICoqYWx3YXlzKiogZmV0Y2ggZnJvbSBuZXR3b3JrIGFuZCB0aGVuIHRoZSBvYnNlcnZhYmxlIHdpbGwgYmUgY29tcGxldGVkLlxuICAgICAqIE5vIGNhY2hlIGlzIGV2ZXIgdXNlZCwgc28gaXQncyBzbG93IGJ1dCBjb3JyZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGwocXVlcnlWYXJpYWJsZXNNYW5hZ2VyOiBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KTogT2JzZXJ2YWJsZTxUYWxsPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKS5waXBlKFxuICAgICAgICAgICAgZmlyc3QoKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcChwYXJ0aWFsVmFyaWFibGVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICAgICAgICAgIC8vIENvcHkgbWFuYWdlciB0byBwcmV2ZW50IHRvIGFwcGx5IGludGVybmFsIHZhcmlhYmxlcyB0byBleHRlcm5hbCBRdWVyeVZhcmlhYmxlc01hbmFnZXJcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4ocXVlcnlWYXJpYWJsZXNNYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICBtYW5hZ2VyLm1lcmdlKCdwYXJ0aWFsLXZhcmlhYmxlcycsIHBhcnRpYWxWYXJpYWJsZXMpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvLnF1ZXJ5PHVua25vd24sIFZhbGw+KHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMuYWxsUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy5tYXBBbGwoKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHNcbiAgICAgKlxuICAgICAqIEV2ZXJ5IHRpbWUgdGhlIG9ic2VydmFibGUgdmFyaWFibGVzIGNoYW5nZSwgYW5kIHRoZXkgYXJlIG5vdCB1bmRlZmluZWQsXG4gICAgICogaXQgd2lsbCByZXR1cm4gcmVzdWx0IGZyb20gY2FjaGUsIHRoZW4gaXQgd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yayxcbiAgICAgKiBhbmQgdGhlbiBrZWVwIHdhdGNoaW5nIHRoZSBjYWNoZSBmb3JldmVyLlxuICAgICAqXG4gICAgICogWW91IG11c3Qgc3Vic2NyaWJlIHRvIHN0YXJ0IGdldHRpbmcgcmVzdWx0cyAoYW5kIGZldGNoIGZyb20gbmV0d29yaykuXG4gICAgICpcbiAgICAgKiBZb3UgKipNVVNUKiogdW5zdWJzY3JpYmUuXG4gICAgICovXG4gICAgcHVibGljIHdhdGNoQWxsKFxuICAgICAgICBxdWVyeVZhcmlhYmxlc01hbmFnZXI6IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4sXG4gICAgICAgIGZldGNoUG9saWN5OiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3kgPSAnY2FjaGUtYW5kLW5ldHdvcmsnLFxuICAgICk6IE9ic2VydmFibGU8VGFsbD4ge1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmFsbFF1ZXJ5KTtcblxuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdCh7XG4gICAgICAgICAgICB2YXJpYWJsZXM6IHF1ZXJ5VmFyaWFibGVzTWFuYWdlci52YXJpYWJsZXMucGlwZShcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdmVyeSBmYXN0IHZhcmlhYmxlIGNoYW5nZXNcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjApLFxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHZhcmlhYmxlcyB0byBiZSBkZWZpbmVkIHRvIHByZXZlbnQgZHVwbGljYXRlIHF1ZXJ5OiB3aXRoIGFuZCB3aXRob3V0IHZhcmlhYmxlc1xuICAgICAgICAgICAgICAgIC8vIE51bGwgaXMgYWNjZXB0ZWQgdmFsdWUgZm9yIFwibm8gdmFyaWFibGVzXCJcbiAgICAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGVzID0+IHR5cGVvZiB2YXJpYWJsZXMgIT09ICd1bmRlZmluZWQnKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBwYXJ0aWFsVmFyaWFibGVzOiB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKSxcbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEFwcGx5IHBhcnRpYWwgdmFyaWFibGVzIGZyb20gc2VydmljZVxuICAgICAgICAgICAgICAgIC8vIENvcHkgbWFuYWdlciB0byBwcmV2ZW50IHRvIGFwcGx5IGludGVybmFsIHZhcmlhYmxlcyB0byBleHRlcm5hbCBRdWVyeVZhcmlhYmxlc01hbmFnZXJcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gbmV3IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4ocXVlcnlWYXJpYWJsZXNNYW5hZ2VyKTtcbiAgICAgICAgICAgICAgICBtYW5hZ2VyLm1lcmdlKCdwYXJ0aWFsLXZhcmlhYmxlcycsIHJlc3VsdC5wYXJ0aWFsVmFyaWFibGVzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAgICAgICAgIC53YXRjaFF1ZXJ5PHVua25vd24sIFZhbGw+KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLmFsbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiBtYW5hZ2VyLnZhcmlhYmxlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoUG9saWN5OiBmZXRjaFBvbGljeSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBFTVBUWSksXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIociA9PiAhIXIuZGF0YSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcEFsbCgpLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbnMgYWxsb3cgdG8gcXVpY2tseSBjcmVhdGUgb3IgdXBkYXRlIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBNYW5hZ2VzIGEgXCJjcmVhdGlvbiBpcyBwZW5kaW5nXCIgc3RhdHVzLCBhbmQgdXBkYXRlIHdoZW4gY3JlYXRpb24gaXMgcmVhZHkuXG4gICAgICogVXNlcyByZWd1bGFyIHVwZGF0ZS91cGRhdGVOb3cgYW5kIGNyZWF0ZSBtZXRob2RzLlxuICAgICAqIFVzZWQgbWFpbmx5IHdoZW4gZWRpdGluZyBtdWx0aXBsZSBvYmplY3RzIGluIHNhbWUgY29udHJvbGxlciAobGlrZSBpbiBlZGl0YWJsZSBhcnJheXMpXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yVXBkYXRlKFxuICAgICAgICBvYmplY3Q6IFZjcmVhdGVbJ2lucHV0J10gfCBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4sXG4gICAgICAgIG5vdyA9IGZhbHNlLFxuICAgICk6IE9ic2VydmFibGU8VGNyZWF0ZSB8IFR1cGRhdGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3QpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmNyZWF0ZU11dGF0aW9uKTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy51cGRhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgLy8gSWYgY3JlYXRpb24gaXMgcGVuZGluZywgbGlzdGVuIHRvIGNyZWF0aW9uIG9ic2VydmFibGUgYW5kIHdoZW4gcmVhZHksIGZpcmUgdXBkYXRlXG4gICAgICAgIGNvbnN0IHBlbmRpbmdDcmVhdGlvbiA9IHRoaXMuY3JlYXRpbmdDYWNoZS5nZXQob2JqZWN0KTtcbiAgICAgICAgaWYgKHBlbmRpbmdDcmVhdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHBlbmRpbmdDcmVhdGlvbi5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChjcmVhdGVkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAoY3JlYXRlZCBhcyBXaXRoSWQ8VGNyZWF0ZT4pLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKG9iamVjdCBhcyBWY3JlYXRlWydpbnB1dCddKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb2JqZWN0IGhhcyBJZCwganVzdCBzYXZlIGl0XG4gICAgICAgIGlmICgnaWQnIGluIG9iamVjdCAmJiBvYmplY3QuaWQpIHtcbiAgICAgICAgICAgIGlmIChub3cpIHtcbiAgICAgICAgICAgICAgICAvLyB1c2VkIG1haW5seSBmb3IgdGVzdHMsIGJlY2F1c2UgbG9kYXNoIGRlYm91bmNlZCB1c2VkIGluIHVwZGF0ZSgpIGRvZXMgbm90IHdvcmsgZmluZSB3aXRoIGZha2VBc3luYyBhbmQgdGljaygpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlTm93KG9iamVjdCBhcyBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUob2JqZWN0IGFzIFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBvYmplY3Qgd2FzIG5vdCBzYXZpbmcsIGFuZCBoYXMgbm8gSUQsIGNyZWF0ZSBpdFxuICAgICAgICBjb25zdCBjcmVhdGlvbiA9IHRoaXMuY3JlYXRlKG9iamVjdCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGluZ0NhY2hlLmRlbGV0ZShvYmplY3QpOyAvLyByZW1vdmUgZnJvbSBjYWNoZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gc3RvcmVzIGNyZWF0aW5nIG9ic2VydmFibGUgaW4gYSBjYWNoZSByZXBsYXlhYmxlIHZlcnNpb24gb2YgdGhlIG9ic2VydmFibGUsXG4gICAgICAgIC8vIHNvIHNldmVyYWwgdXBkYXRlKCkgY2FuIHN1YnNjcmliZSB0byB0aGUgc2FtZSBjcmVhdGlvblxuICAgICAgICB0aGlzLmNyZWF0aW5nQ2FjaGUuc2V0KG9iamVjdCwgY3JlYXRpb24ucGlwZShzaGFyZVJlcGxheSgpKSk7XG5cbiAgICAgICAgcmV0dXJuIGNyZWF0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBvYmplY3QgaW4gREIgYW5kIHRoZW4gcmVmZXRjaCB0aGUgbGlzdCBvZiBvYmplY3RzXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZShvYmplY3Q6IFZjcmVhdGVbJ2lucHV0J10pOiBPYnNlcnZhYmxlPFRjcmVhdGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3QpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLmNyZWF0ZU11dGF0aW9uKTtcblxuICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSBtZXJnZShcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAge2lucHV0OiB0aGlzLmdldElucHV0KG9iamVjdCwgdHJ1ZSl9LFxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yQ3JlYXRpb24ob2JqZWN0KSxcbiAgICAgICAgKSBhcyBWY3JlYXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUY3JlYXRlLCBWY3JlYXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMuY3JlYXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwQ3JlYXRpb24ocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIG9iamVjdCwgYWZ0ZXIgYSBzaG9ydCBkZWJvdW5jZVxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGUob2JqZWN0OiBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4pOiBPYnNlcnZhYmxlPFR1cGRhdGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3QpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLnVwZGF0ZU11dGF0aW9uKTtcblxuICAgICAgICAvLyBLZWVwIGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSBkZWJvdW5jZWQgdXBkYXRlIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IGlkID0gb2JqZWN0LmlkO1xuXG4gICAgICAgIHJldHVybiB0aGlzLm5hdHVyYWxEZWJvdW5jZVNlcnZpY2UuZGVib3VuY2UodGhpcywgaWQsIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIG9iamVjdCBpbW1lZGlhdGVseSB3aGVuIHN1YnNjcmliaW5nXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZU5vdyhvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkOiBvYmplY3QuaWQsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHRoaXMuZ2V0SW5wdXQob2JqZWN0LCBmYWxzZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yVXBkYXRlKG9iamVjdCksXG4gICAgICAgICkgYXMgVnVwZGF0ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgIC5tdXRhdGU8VHVwZGF0ZSwgVnVwZGF0ZT4oe1xuICAgICAgICAgICAgICAgIG11dGF0aW9uOiB0aGlzLnVwZGF0ZU11dGF0aW9uLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwb2xsby5jbGllbnQucmVGZXRjaE9ic2VydmFibGVRdWVyaWVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcFVwZGF0ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgb2JqZWN0cyBhbmQgdGhlbiByZWZldGNoIHRoZSBsaXN0IG9mIG9iamVjdHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlKG9iamVjdHM6IHtpZDogc3RyaW5nfVtdKTogT2JzZXJ2YWJsZTxUZGVsZXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0cyk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuZGVsZXRlTXV0YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IGlkcyA9IG9iamVjdHMubWFwKG8gPT4ge1xuICAgICAgICAgICAgLy8gQ2FuY2VsIHBlbmRpbmcgdXBkYXRlXG4gICAgICAgICAgICB0aGlzLm5hdHVyYWxEZWJvdW5jZVNlcnZpY2UuY2FuY2VsT25lKHRoaXMsIG8uaWQpO1xuXG4gICAgICAgICAgICByZXR1cm4gby5pZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGlkczogaWRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckRlbGV0ZShvYmplY3RzKSxcbiAgICAgICAgKSBhcyBWZGVsZXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUZGVsZXRlLCBWZGVsZXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMuZGVsZXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gRGVsYXkgdGhlIG9ic2VydmFibGUgdW50aWwgQXBvbGxvIHJlZmV0Y2ggaXMgY29tcGxldGVkXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZFJlc3VsdCA9IHRoaXMubWFwRGVsZXRlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy5hcG9sbG8uY2xpZW50LnJlRmV0Y2hPYnNlcnZhYmxlUXVlcmllcygpKS5waXBlKG1hcCgoKSA9PiBtYXBwZWRSZXN1bHQpKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgdGhlIGlkIGlzIHByb3ZpZGVkLCByZXNvbHZlcyBhbiBvYnNlcnZhYmxlIG1vZGVsLiBUaGUgb2JzZXJ2YWJsZSBtb2RlbCB3aWxsIG9ubHkgYmUgZW1pdHRlZCBhZnRlciB3ZSBhcmUgc3VyZVxuICAgICAqIHRoYXQgQXBvbGxvIGNhY2hlIGlzIGZyZXNoIGFuZCB3YXJtLiBUaGVuIHRoZSBjb21wb25lbnQgY2FuIHN1YnNjcmliZSB0byB0aGUgb2JzZXJ2YWJsZSBtb2RlbCB0byBnZXQgdGhlIG1vZGVsXG4gICAgICogaW1tZWRpYXRlbHkgZnJvbSBBcG9sbG8gY2FjaGUgYW5kIGFueSBzdWJzZXF1ZW50cyBmdXR1cmUgbXV0YXRpb25zIHRoYXQgbWF5IGhhcHBlbiB0byBBcG9sbG8gY2FjaGUuXG4gICAgICpcbiAgICAgKiBXaXRob3V0IGlkLCByZXR1cm5zIGRlZmF1bHQgdmFsdWVzLCBpbiBvcmRlciB0byBzaG93IGEgY3JlYXRpb24gZm9ybS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZShpZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxPYnNlcnZhYmxlPFRvbmUgfCBWY3JlYXRlWydpbnB1dCddPj4ge1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9ubHlOZXR3b3JrID0gdGhpcy53YXRjaE9uZShpZCwgJ25ldHdvcmstb25seScpLnBpcGUoZmlyc3QoKSk7XG4gICAgICAgICAgICBjb25zdCBvbmx5Q2FjaGUgPSB0aGlzLndhdGNoT25lKGlkLCAnY2FjaGUtZmlyc3QnKTtcblxuICAgICAgICAgICAgLy8gSW4gdGhlb3J5LCB3ZSBjYW4gcmVseSBvbiBBcG9sbG8gQ2FjaGUgdG8gcmV0dXJuIGEgcmVzdWx0IGluc3RhbnRseS4gSXQgaXMgdmVyeSBmYXN0IGluZGVlZCxcbiAgICAgICAgICAgIC8vIGJ1dCBpdCBpcyBzdGlsbCBhc3luY2hyb25vdXMsIHNvIHRoZXJlIG1heSBiZSBhIHZlcnkgc2hvcnQgdGltZSB3aGVuIHdlIGRvbid0IGhhdmUgdGhlIG1vZGVsXG4gICAgICAgICAgICAvLyBhdmFpbGFibGUuIFRvIGZpeCB0aGF0LCB3ZSBjYW4gcmVseSBvbiBSeEpTLCB3aGljaCBpcyBhYmxlIHRvIGVtaXQgc3luY2hyb25vdXNseSB0aGUgdmFsdWUgd2UganVzdFxuICAgICAgICAgICAgLy8gZ290IGZyb20gc2VydmVyLiBPbmNlIEFwb2xsbyBDbGllbnQgbW92ZXMgdG8gUnhKUyAoaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWZlYXR1cmUtcmVxdWVzdHMvaXNzdWVzLzM3NSksXG4gICAgICAgICAgICAvLyB3ZSBjb3VsZCB0cnkgdG8gcmVtb3ZlIGBzdGFydFdpdGgoKWAuXG4gICAgICAgICAgICByZXR1cm4gb25seU5ldHdvcmsucGlwZShtYXAoZmlyc3RWYWx1ZSA9PiBvbmx5Q2FjaGUucGlwZShzdGFydFdpdGgoZmlyc3RWYWx1ZSkpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb2Yob2YodGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBvYmplY3QgdGhhdCBtYXRjaCB0aGUgR3JhcGhRTCBpbnB1dCB0eXBlLlxuICAgICAqIEl0IGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggbWFudWFsbHkgZmlsbGVkIGRhdGEgYW5kIGFkZCB1bmNvbXBsZXRlZCBkYXRhIChsaWtlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgZW1wdHkgc3RyaW5ncylcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5wdXQob2JqZWN0OiBMaXRlcmFsLCBmb3JDcmVhdGlvbjogYm9vbGVhbik6IFZjcmVhdGVbJ2lucHV0J10gfCBWdXBkYXRlWydpbnB1dCddIHtcbiAgICAgICAgLy8gQ29udmVydCByZWxhdGlvbnMgdG8gdGhlaXIgSURzIGZvciBtdXRhdGlvblxuICAgICAgICBvYmplY3QgPSByZWxhdGlvbnNUb0lkcyhvYmplY3QpO1xuXG4gICAgICAgIC8vIFBpY2sgb25seSBhdHRyaWJ1dGVzIHRoYXQgd2UgY2FuIGZpbmQgaW4gdGhlIGVtcHR5IG9iamVjdFxuICAgICAgICAvLyBJbiBvdGhlciB3b3JkcywgcHJldmVudCB0byBzZWxlY3QgZGF0YSB0aGF0IGhhcyB1bndhbnRlZCBhdHRyaWJ1dGVzXG4gICAgICAgIGNvbnN0IGVtcHR5T2JqZWN0ID0gdGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCk7XG4gICAgICAgIGxldCBpbnB1dCA9IHBpY2sob2JqZWN0LCBPYmplY3Qua2V5cyhlbXB0eU9iamVjdCkpO1xuXG4gICAgICAgIC8vIENvbXBsZXRlIGEgcG90ZW50aWFsbHkgdW5jb21wbGV0ZWQgb2JqZWN0IHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgaWYgKGZvckNyZWF0aW9uKSB7XG4gICAgICAgICAgICBpbnB1dCA9IGRlZmF1bHRzKGlucHV0LCBlbXB0eU9iamVjdCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBtYXRjaGluZyB0aGUgcXVlcnkuIEl0IG1heSBuZXZlciBjb21wbGV0ZS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHVuaXF1ZSB2YWxpZGF0b3JcbiAgICAgKi9cbiAgICBwdWJsaWMgY291bnQocXVlcnlWYXJpYWJsZXNNYW5hZ2VyOiBOYXR1cmFsUXVlcnlWYXJpYWJsZXNNYW5hZ2VyPFZhbGw+KTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3QgcGx1cmFsID0gbWFrZVBsdXJhbCh0aGlzLm5hbWUpO1xuICAgICAgICBjb25zdCBxdWVyeU5hbWUgPSAnQ291bnQnICsgdXBwZXJDYXNlRmlyc3RMZXR0ZXIocGx1cmFsKTtcbiAgICAgICAgY29uc3QgZmlsdGVyVHlwZSA9IHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSkgKyAnRmlsdGVyJztcblxuICAgICAgICBjb25zdCBxdWVyeSA9IGdxbGBcbiAgICAgICAgICAgIHF1ZXJ5ICR7cXVlcnlOYW1lfSAoJGZpbHRlcjogJHtmaWx0ZXJUeXBlfSkge1xuICAgICAgICAgICAgY291bnQ6ICR7cGx1cmFsfSAoZmlsdGVyOiAkZmlsdGVyLCBwYWdpbmF0aW9uOiB7cGFnZVNpemU6IDAsIHBhZ2VJbmRleDogMH0pIHtcbiAgICAgICAgICAgIGxlbmd0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAocGFydGlhbFZhcmlhYmxlcyA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ29weSBtYW5hZ2VyIHRvIHByZXZlbnQgdG8gYXBwbHkgaW50ZXJuYWwgdmFyaWFibGVzIHRvIGV4dGVybmFsIFF1ZXJ5VmFyaWFibGVzTWFuYWdlclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPihxdWVyeVZhcmlhYmxlc01hbmFnZXIpO1xuICAgICAgICAgICAgICAgIG1hbmFnZXIubWVyZ2UoJ3BhcnRpYWwtdmFyaWFibGVzJywgcGFydGlhbFZhcmlhYmxlcyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG8ucXVlcnk8e2NvdW50OiB7bGVuZ3RoOiBudW1iZXJ9fSwgVmFsbD4oe1xuICAgICAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiByZXN1bHQuZGF0YS5jb3VudC5sZW5ndGgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBlbXB0eSBvYmplY3Qgd2l0aCBzb21lIGRlZmF1bHQgdmFsdWVzIGZyb20gc2VydmVyIHBlcnNwZWN0aXZlXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VmdWwgd2hlbiBzaG93aW5nIGEgZm9ybSBmb3IgY3JlYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGVmYXVsdEZvclNlcnZlcigpOiBWY3JlYXRlWydpbnB1dCddIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFlvdSBwcm9iYWJseSAqKnNob3VsZCBub3QqKiB1c2UgdGhpcy5cbiAgICAgKlxuICAgICAqIElmIHlvdSBhcmUgdHJ5aW5nIHRvICpjYWxsKiB0aGlzIG1ldGhvZCwgaW5zdGVhZCB5b3UgcHJvYmFibHkgd2FudCB0byBjYWxsIGBnZXREZWZhdWx0Rm9yU2VydmVyKClgIHRvIGdldCBkZWZhdWx0XG4gICAgICogdmFsdWVzIGZvciBhIG1vZGVsLCBvciBgZ2V0Rm9ybUNvbmZpZygpYCB0byBnZXQgYSBjb25maWd1cmVkIGZvcm0gdGhhdCBpbmNsdWRlcyBleHRyYSBmb3JtIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIElmIHlvdSBhcmUgdHJ5aW5nIHRvICpvdmVycmlkZSogdGhpcyBtZXRob2QsIGluc3RlYWQgeW91IHByb2JhYmx5IHdhbnQgdG8gb3ZlcnJpZGUgYGdldERlZmF1bHRGb3JTZXJ2ZXIoKWAuXG4gICAgICpcbiAgICAgKiBUaGUgb25seSBhbmQgKip2ZXJ5IHJhcmUqKiByZWFzb24gdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaXMgaWYgdGhlIGNsaWVudCBuZWVkcyBleHRyYSBmb3JtIGZpZWxkcyB0aGF0IGNhbm5vdCBiZVxuICAgICAqIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIgKG5vdCBwYXJ0IG9mIGBYWFhJbnB1dGAgdHlwZSkgYW5kIHRoYXQgYXJlIHN0cmljdGx5IGZvciB0aGUgY2xpZW50IGZvcm0gbmVlZHMuIEluIHRoYXQgY2FzZSxcbiAgICAgKiB0aGVuIHlvdSBjYW4gcmV0dXJuIGRlZmF1bHQgdmFsdWVzIGZvciB0aG9zZSBleHRyYSBmb3JtIGZpZWxkcywgYW5kIHRoZSBmb3JtIHJldHVybmVkIGJ5IGBnZXRGb3JtQ29uZmlnKClgIHdpbGxcbiAgICAgKiBpbmNsdWRlIHRob3NlIGV4dHJhIGZpZWxkcy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybUV4dHJhRmllbGREZWZhdWx0VmFsdWVzKCk6IExpdGVyYWwge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3Qgb25seSB0aGUgYXJyYXkgb2YgZmV0Y2hlZCBvYmplY3RzIG91dCBvZiB0aGUgZW50aXJlIGZldGNoZWQgZGF0YVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBBbGwoKTogT3BlcmF0b3JGdW5jdGlvbjxGZXRjaFJlc3VsdDx1bmtub3duPiwgVGFsbD4ge1xuICAgICAgICBjb25zdCBwbHVyYWwgPSBtYWtlUGx1cmFsKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiBtYXAocmVzdWx0ID0+IChyZXN1bHQuZGF0YSBhcyBhbnkpW3BsdXJhbF0pOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IG9ubHkgdGhlIGNyZWF0ZWQgb2JqZWN0IG91dCBvZiB0aGUgZW50aXJlIGZldGNoZWQgZGF0YVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBDcmVhdGlvbihyZXN1bHQ6IE11dGF0aW9uUmVzdWx0PHVua25vd24+KTogVGNyZWF0ZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAnY3JlYXRlJyArIHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0LmRhdGEgYXMgYW55KVtuYW1lXTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IHRoZSB1cGRhdGVkIG9iamVjdCBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwVXBkYXRlKHJlc3VsdDogTXV0YXRpb25SZXN1bHQ8dW5rbm93bj4pOiBUdXBkYXRlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICd1cGRhdGUnICsgdXBwZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy5uYW1lKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQuZGF0YSBhcyBhbnkpW25hbWVdOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgdXNlZCB0byBleHRyYWN0IG9ubHkgZmxhZyB3aGVuIGRlbGV0aW5nIGFuIG9iamVjdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBEZWxldGUocmVzdWx0OiBNdXRhdGlvblJlc3VsdDx1bmtub3duPik6IFRkZWxldGUge1xuICAgICAgICBjb25zdCBuYW1lID0gJ2RlbGV0ZScgKyBtYWtlUGx1cmFsKHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSkpO1xuICAgICAgICByZXR1cm4gKHJlc3VsdC5kYXRhIGFzIGFueSlbbmFtZV07IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9hcG9sbG8tY2xpZW50L2lzc3Vlcy81NjYyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhZGRpdGlvbmFsIHZhcmlhYmxlcyB0byBiZSB1c2VkIHdoZW4gZ2V0dGluZyBhIHNpbmdsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRCwgYW5kIGlzIG5lZWRlZCB0byBnZXQgYXBwcm9wcmlhdGUgYWNjZXNzIHJpZ2h0c1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yT25lKCk6IE9ic2VydmFibGU8UGFydGlhbDxWb25lPj4ge1xuICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGdldHRpbmcgbXVsdGlwbGUgb2JqZWN0c1xuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElELCBidXQgaXQgY291bGQgYmUgc29tZXRoaW5nIGVsc2UgdG8gZnVydGhlciBmaWx0ZXIgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JBbGwoKTogT2JzZXJ2YWJsZTxQYXJ0aWFsPFZhbGw+PiB7XG4gICAgICAgIHJldHVybiBvZih7fSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhZGRpdGlvbmFsIHZhcmlhYmxlcyB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYW4gb2JqZWN0XG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIHNpdGUgb3Igc3RhdGUgSURcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JDcmVhdGlvbihvYmplY3Q6IExpdGVyYWwpOiBQYXJ0aWFsPFZjcmVhdGU+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIHVwZGF0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yVXBkYXRlKG9iamVjdDogTGl0ZXJhbCk6IFBhcnRpYWw8VnVwZGF0ZT4ge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiBkZWxldGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckRlbGV0ZShvYmplY3RzOiBMaXRlcmFsW10pOiBQYXJ0aWFsPFZkZWxldGU+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRocm93IGV4Y2VwdGlvbiB0byBwcmV2ZW50IGV4ZWN1dGluZyBxdWVyaWVzIHdpdGggaW52YWxpZCB2YXJpYWJsZXNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdGhyb3dJZk9ic2VydmFibGUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdDYW5ub3QgdXNlIE9ic2VydmFibGUgYXMgdmFyaWFibGVzLiBJbnN0ZWFkIHlvdSBzaG91bGQgdXNlIC5zdWJzY3JpYmUoKSB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aCBhIHJlYWwgdmFsdWUnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1lcmdlIGdpdmVuIElEIHdpdGggYWRkaXRpb25hbCBwYXJ0aWFsIHZhcmlhYmxlcyBpZiB0aGVyZSBpcyBhbnlcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhcmlhYmxlc0Zvck9uZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxWb25lPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JPbmUoKS5waXBlKFxuICAgICAgICAgICAgbWFwKHBhcnRpYWxWYXJpYWJsZXMgPT4gbWVyZ2Uoe30sIHtpZDogaWR9IGFzIFZvbmUsIHBhcnRpYWxWYXJpYWJsZXMpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaHJvdyBleGNlcHRpb24gdG8gcHJldmVudCBleGVjdXRpbmcgbnVsbCBxdWVyaWVzXG4gICAgICovXG4gICAgcHJpdmF0ZSB0aHJvd0lmTm90UXVlcnkocXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwpOiBhc3NlcnRzIHF1ZXJ5IHtcbiAgICAgICAgaWYgKCFxdWVyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIHF1ZXJ5IGZvciB0aGlzIG1ldGhvZCB3YXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhpcyBzZXJ2aWNlIGNvbnN0cnVjdG9yJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
501
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtbW9kZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwvc3JjL2xpYi9zZXJ2aWNlcy9hYnN0cmFjdC1tb2RlbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFpQixNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sRUFBYyxhQUFhLEVBQXdCLE1BQU0scUJBQXFCLENBQUM7QUFDdEYsT0FBTyxFQUFvQyxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBYyxNQUFNLGdCQUFnQixDQUFDO0FBRXBILE9BQU8sRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNoRCxPQUFPLEVBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFtQixNQUFNLE1BQU0sQ0FBQztBQUNyRyxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVHLE9BQU8sRUFBQyw0QkFBNEIsRUFBaUIsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRixPQUFPLEVBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXBGLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRTFELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUMxRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBY3JDLE1BQU0sT0FBZ0IsMkJBQTJCO0lBa0JwQyxPQUFPLENBQVM7SUFFekIsWUFDdUIs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VSxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FDWCw4R0FBOEcsQ0FDakgsQ0FBQztRQUNOLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxrQkFBa0IsQ0FBQyxFQUFVO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsSUFBSSxDQUN4QyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBQyxFQUFFLEVBQUUsRUFBRSxFQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUN6RSxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLEtBQTBCO1FBQzlDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcG9sbG8sIGdxbCwgTXV0YXRpb25SZXN1bHR9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7RmV0Y2hSZXN1bHQsIE5ldHdvcmtTdGF0dXMsIFdhdGNoUXVlcnlGZXRjaFBvbGljeX0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JGbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtEb2N1bWVudE5vZGV9IGZyb20gJ2dyYXBocWwnO1xuaW1wb3J0IHtkZWZhdWx0cywgbWVyZ2UsIHBpY2t9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGNvbWJpbmVMYXRlc3QsIEVNUFRZLCBmaXJzdCwgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIE9wZXJhdG9yRnVuY3Rpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VXaGlsZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge05hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXIsIFF1ZXJ5VmFyaWFibGVzfSBmcm9tICcuLi9jbGFzc2VzL3F1ZXJ5LXZhcmlhYmxlLW1hbmFnZXInO1xuaW1wb3J0IHtMaXRlcmFsfSBmcm9tICcuLi90eXBlcy90eXBlcyc7XG5pbXBvcnQge21ha2VQbHVyYWwsIHJlbGF0aW9uc1RvSWRzLCB1cHBlckNhc2VGaXJzdExldHRlcn0gZnJvbSAnLi4vY2xhc3Nlcy91dGlsaXR5JztcbmltcG9ydCB7UGFnaW5hdGVkRGF0YX0gZnJvbSAnLi4vY2xhc3Nlcy9kYXRhLXNvdXJjZSc7XG5pbXBvcnQge05hdHVyYWxEZWJvdW5jZVNlcnZpY2V9IGZyb20gJy4vZGVib3VuY2Uuc2VydmljZSc7XG5pbXBvcnQge0Fwb2xsb1F1ZXJ5UmVzdWx0fSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlL3R5cGVzJztcbmltcG9ydCB7ZGVlcENsb25lfSBmcm9tICcuLi9tb2R1bGVzL3NlYXJjaC9jbGFzc2VzL3V0aWxzJztcbmltcG9ydCB7aW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgRm9ybVZhbGlkYXRvcnMgPSBSZWNvcmQ8c3RyaW5nLCBWYWxpZGF0b3JGbltdPjtcblxuZXhwb3J0IHR5cGUgRm9ybUFzeW5jVmFsaWRhdG9ycyA9IFJlY29yZDxzdHJpbmcsIEFzeW5jVmFsaWRhdG9yRm5bXT47XG5cbmV4cG9ydCB0eXBlIFZhcmlhYmxlc1dpdGhJbnB1dCA9IHtcbiAgICBpbnB1dDogTGl0ZXJhbDtcbn07XG5cbmV4cG9ydCB0eXBlIEZvcm1Db250cm9scyA9IFJlY29yZDxzdHJpbmcsIEFic3RyYWN0Q29udHJvbD47XG5cbmV4cG9ydCB0eXBlIFdpdGhJZDxUPiA9IHtpZDogc3RyaW5nfSAmIFQ7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOYXR1cmFsQWJzdHJhY3RNb2RlbFNlcnZpY2U8XG4gICAgVG9uZSxcbiAgICBWb25lIGV4dGVuZHMge2lkOiBzdHJpbmd9LFxuICAgIFRhbGwgZXh0ZW5kcyBQYWdpbmF0ZWREYXRhPExpdGVyYWw+LFxuICAgIFZhbGwgZXh0ZW5kcyBRdWVyeVZhcmlhYmxlcyxcbiAgICBUY3JlYXRlLFxuICAgIFZjcmVhdGUgZXh0ZW5kcyBWYXJpYWJsZXNXaXRoSW5wdXQsXG4gICAgVHVwZGF0ZSxcbiAgICBWdXBkYXRlIGV4dGVuZHMge2lkOiBzdHJpbmc7IGlucHV0OiBMaXRlcmFsfSxcbiAgICBUZGVsZXRlLFxuICAgIFZkZWxldGUgZXh0ZW5kcyB7aWRzOiBzdHJpbmdbXX0sXG4+IHtcbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGUgY3JlYXRpb24gbXV0YXRpb25zIHRoYXQgYXJlIHBlbmRpbmdcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0aW5nQ2FjaGUgPSBuZXcgTWFwPFZjcmVhdGVbJ2lucHV0J10gfCBXaXRoSWQ8VnVwZGF0ZVsnaW5wdXQnXT4sIE9ic2VydmFibGU8VGNyZWF0ZT4+KCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwb2xsbyA9IGluamVjdChBcG9sbG8pO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBuYXR1cmFsRGVib3VuY2VTZXJ2aWNlID0gaW5qZWN0KE5hdHVyYWxEZWJvdW5jZVNlcnZpY2UpO1xuICAgIHJlYWRvbmx5ICNwbHVyYWw6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9uZVF1ZXJ5OiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWxsUXVlcnk6IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBjcmVhdGVNdXRhdGlvbjogRG9jdW1lbnROb2RlIHwgbnVsbCxcbiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHVwZGF0ZU11dGF0aW9uOiBEb2N1bWVudE5vZGUgfCBudWxsLFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVsZXRlTXV0YXRpb246IERvY3VtZW50Tm9kZSB8IG51bGwsXG4gICAgICAgIHBsdXJhbDogc3RyaW5nIHwgbnVsbCA9IG51bGwsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuI3BsdXJhbCA9IHBsdXJhbCA/PyBtYWtlUGx1cmFsKHRoaXMubmFtZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIGZpZWxkcyB2YWxpZGF0b3JzXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBnZXRGb3JtVmFsaWRhdG9ycyhtb2RlbD86IExpdGVyYWwpOiBGb3JtVmFsaWRhdG9ycyB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgYXN5bmMgZmllbGRzIHZhbGlkYXRvcnNcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIGdldEZvcm1Bc3luY1ZhbGlkYXRvcnMobW9kZWw/OiBMaXRlcmFsKTogRm9ybUFzeW5jVmFsaWRhdG9ycyB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGdyb3VwZWQgZmllbGRzIHZhbGlkYXRvcnMgKGxpa2UgcGFzc3dvcmQgKyBjb25maXJtIHBhc3N3b3JkKVxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgZ2V0Rm9ybUdyb3VwVmFsaWRhdG9ycyhtb2RlbD86IExpdGVyYWwpOiBWYWxpZGF0b3JGbltdIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgYXN5bmMgZ3JvdXAgZmllbGRzIHZhbGlkYXRvcnMgKGxpa2UgdW5pcXVlIGNvbnN0cmFpbnQgb24gbXVsdGlwbGUgY29sdW1ucylcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIGdldEZvcm1Hcm91cEFzeW5jVmFsaWRhdG9ycyhtb2RlbD86IExpdGVyYWwpOiBBc3luY1ZhbGlkYXRvckZuW10ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1Db25maWcobW9kZWw6IExpdGVyYWwpOiBGb3JtQ29udHJvbHMge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB7Li4udGhpcy5nZXREZWZhdWx0Rm9yU2VydmVyKCksIC4uLnRoaXMuZ2V0Rm9ybUV4dHJhRmllbGREZWZhdWx0VmFsdWVzKCl9O1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gdGhpcy5nZXRGb3JtVmFsaWRhdG9ycyhtb2RlbCk7XG4gICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IHRoaXMuZ2V0Rm9ybUFzeW5jVmFsaWRhdG9ycyhtb2RlbCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzOiBGb3JtQ29udHJvbHMgPSB7fTtcbiAgICAgICAgY29uc3QgZGlzYWJsZWQgPSBtb2RlbC5wZXJtaXNzaW9ucyA/ICFtb2RlbC5wZXJtaXNzaW9ucy51cGRhdGUgOiBmYWxzZTtcblxuICAgICAgICBpZiAobW9kZWwuaWQpIHtcbiAgICAgICAgICAgIGNvbnRyb2xzLmlkID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCh7dmFsdWU6IG1vZGVsLmlkLCBkaXNhYmxlZDogdHJ1ZX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlndXJlIGZvcm0gZm9yIGVhY2ggZmllbGQgb2YgbW9kZWxcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModmFsdWVzKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2RlbFtrZXldICE9PSB1bmRlZmluZWQgPyBtb2RlbFtrZXldIDogdmFsdWVzW2tleV07XG4gICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSB0eXBlb2YgdmFsaWRhdG9yc1trZXldICE9PSAndW5kZWZpbmVkJyA/IHZhbGlkYXRvcnNba2V5XSA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBhc3luY1ZhbGlkYXRvciA9IHR5cGVvZiBhc3luY1ZhbGlkYXRvcnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcgPyBhc3luY1ZhbGlkYXRvcnNba2V5XSA6IG51bGw7XG5cbiAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKGZvcm1TdGF0ZSwgdmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25maWd1cmUgZm9ybSBmb3IgZXh0cmEgdmFsaWRhdG9ycyB0aGF0IGFyZSBub3Qgb24gYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWxpZGF0b3JzKSkge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbW9kZWxba2V5XSA/IG1vZGVsW2tleV0gOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGNvbnRyb2xzW2tleV0gPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKGZvcm1TdGF0ZSwgdmFsaWRhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFzeW5jVmFsaWRhdG9ycykpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sc1trZXldICYmIGFzeW5jVmFsaWRhdG9yc1trZXldKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbHNba2V5XS5zZXRBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzW2tleV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtb2RlbFtrZXldID8gbW9kZWxba2V5XSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29udHJvbHNba2V5XSA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZm9ybVN0YXRlLCBudWxsLCBhc3luY1ZhbGlkYXRvcnNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29udHJvbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHRoZSBmaW5hbCBGb3JtR3JvdXAgZm9yIHRoZSBvYmplY3QsIGluY2x1ZGluZyBhbGwgdmFsaWRhdG9yc1xuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkICoqbm90KiogYmUgb3ZlcnJpZGRlbiwgYnV0IGluc3RlYWQgYGdldEZvcm1Db25maWdgLFxuICAgICAqIGBnZXRGb3JtR3JvdXBWYWxpZGF0b3JzYCwgYGdldEZvcm1Hcm91cEFzeW5jVmFsaWRhdG9yc2AgbWlnaHQgYmUuXG4gICAgICovXG4gICAgcHVibGljIGdldEZvcm1Hcm91cChtb2RlbDogTGl0ZXJhbCk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgICAgICBjb25zdCBmb3JtQ29uZmlnID0gdGhpcy5nZXRGb3JtQ29uZmlnKGRlZXBDbG9uZShtb2RlbCkpO1xuICAgICAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtR3JvdXAoZm9ybUNvbmZpZywge1xuICAgICAgICAgICAgdmFsaWRhdG9yczogdGhpcy5nZXRGb3JtR3JvdXBWYWxpZGF0b3JzKG1vZGVsKSxcbiAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9yczogdGhpcy5nZXRGb3JtR3JvdXBBc3luY1ZhbGlkYXRvcnMobW9kZWwpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzaW5nbGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBJZiBhdmFpbGFibGUgaXQgd2lsbCBlbWl0IG9iamVjdCBmcm9tIGNhY2hlIGltbWVkaWF0ZWx5LCB0aGVuIGl0XG4gICAgICogd2lsbCAqKmFsd2F5cyoqIGZldGNoIGZyb20gbmV0d29yayBhbmQgdGhlbiB0aGUgb2JzZXJ2YWJsZSB3aWxsIGJlIGNvbXBsZXRlZC5cbiAgICAgKlxuICAgICAqIFlvdSBtdXN0IHN1YnNjcmliZSB0byBzdGFydCBnZXR0aW5nIHJlc3VsdHMgKGFuZCBmZXRjaCBmcm9tIG5ldHdvcmspLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPbmUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8VG9uZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jcHJlcGFyZU9uZVF1ZXJ5KGlkLCAnY2FjaGUtYW5kLW5ldHdvcmsnKS5waXBlKFxuICAgICAgICAgICAgdGFrZVdoaWxlKHJlc3VsdCA9PiByZXN1bHQubmV0d29ya1N0YXR1cyAhPT0gTmV0d29ya1N0YXR1cy5yZWFkeSwgdHJ1ZSksXG4gICAgICAgICAgICBtYXAocmVzdWx0ID0+IChyZXN1bHQuZGF0YSBhcyBMaXRlcmFsKVt0aGlzLm5hbWVdKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBhIHNpbmdsZSBvYmplY3RcbiAgICAgKlxuICAgICAqIElmIGF2YWlsYWJsZSBpdCB3aWxsIGVtaXQgb2JqZWN0IGZyb20gY2FjaGUgaW1tZWRpYXRlbHksIHRoZW4gaXRcbiAgICAgKiB3aWxsICoqYWx3YXlzKiogZmV0Y2ggZnJvbSBuZXR3b3JrLCBhbmQgdGhlbiBrZWVwIHdhdGNoaW5nIHRoZSBjYWNoZSBmb3JldmVyLlxuICAgICAqXG4gICAgICogWW91IG11c3Qgc3Vic2NyaWJlIHRvIHN0YXJ0IGdldHRpbmcgcmVzdWx0cyAoYW5kIGZldGNoIGZyb20gbmV0d29yaykuXG4gICAgICpcbiAgICAgKiBZb3UgKipNVVNUKiogdW5zdWJzY3JpYmUuXG4gICAgICovXG4gICAgcHVibGljIHdhdGNoT25lKGlkOiBzdHJpbmcsIGZldGNoUG9saWN5OiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3kgPSAnY2FjaGUtYW5kLW5ldHdvcmsnKTogT2JzZXJ2YWJsZTxUb25lPiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNwcmVwYXJlT25lUXVlcnkoaWQsIGZldGNoUG9saWN5KS5waXBlKG1hcChyZXN1bHQgPT4gKHJlc3VsdC5kYXRhIGFzIExpdGVyYWwpW3RoaXMubmFtZV0pKTtcbiAgICB9XG5cbiAgICAjcHJlcGFyZU9uZVF1ZXJ5KGlkOiBzdHJpbmcsIGZldGNoUG9saWN5OiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3kpOiBPYnNlcnZhYmxlPEFwb2xsb1F1ZXJ5UmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUoaWQpO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLm9uZVF1ZXJ5KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZXNGb3JPbmUoaWQpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAodmFyaWFibGVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLm9uZVF1ZXJ5KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwb2xsby53YXRjaFF1ZXJ5PHVua25vd24sIFZvbmU+KHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMub25lUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgICAgICAgICAgICAgICAgICBmZXRjaFBvbGljeTogZmV0Y2hQb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgIG5leHRGZXRjaFBvbGljeTogJ2NhY2hlLW9ubHknLFxuICAgICAgICAgICAgICAgIH0pLnZhbHVlQ2hhbmdlcztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlsdGVyKHJlc3VsdCA9PiAhIXJlc3VsdC5kYXRhKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHNcbiAgICAgKlxuICAgICAqIEl0IHdpbGwgKiphbHdheXMqKiBmZXRjaCBmcm9tIG5ldHdvcmsgYW5kIHRoZW4gdGhlIG9ic2VydmFibGUgd2lsbCBiZSBjb21wbGV0ZWQuXG4gICAgICogTm8gY2FjaGUgaXMgZXZlciB1c2VkLCBzbyBpdCdzIHNsb3cgYnV0IGNvcnJlY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldEFsbChxdWVyeVZhcmlhYmxlc01hbmFnZXI6IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4pOiBPYnNlcnZhYmxlPFRhbGw+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5hbGxRdWVyeSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpLnBpcGUoXG4gICAgICAgICAgICBmaXJzdCgpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKHBhcnRpYWxWYXJpYWJsZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ29weSBtYW5hZ2VyIHRvIHByZXZlbnQgdG8gYXBwbHkgaW50ZXJuYWwgdmFyaWFibGVzIHRvIGV4dGVybmFsIFF1ZXJ5VmFyaWFibGVzTWFuYWdlclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPihxdWVyeVZhcmlhYmxlc01hbmFnZXIpO1xuICAgICAgICAgICAgICAgIG1hbmFnZXIubWVyZ2UoJ3BhcnRpYWwtdmFyaWFibGVzJywgcGFydGlhbFZhcmlhYmxlcyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG8ucXVlcnk8dW5rbm93biwgVmFsbD4oe1xuICAgICAgICAgICAgICAgICAgICBxdWVyeTogdGhpcy5hbGxRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiBtYW5hZ2VyLnZhcmlhYmxlcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6ICduZXR3b3JrLW9ubHknLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLm1hcEFsbCgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0c1xuICAgICAqXG4gICAgICogRXZlcnkgdGltZSB0aGUgb2JzZXJ2YWJsZSB2YXJpYWJsZXMgY2hhbmdlLCBhbmQgdGhleSBhcmUgbm90IHVuZGVmaW5lZCxcbiAgICAgKiBpdCB3aWxsIHJldHVybiByZXN1bHQgZnJvbSBjYWNoZSwgdGhlbiBpdCB3aWxsICoqYWx3YXlzKiogZmV0Y2ggZnJvbSBuZXR3b3JrLFxuICAgICAqIGFuZCB0aGVuIGtlZXAgd2F0Y2hpbmcgdGhlIGNhY2hlIGZvcmV2ZXIuXG4gICAgICpcbiAgICAgKiBZb3UgbXVzdCBzdWJzY3JpYmUgdG8gc3RhcnQgZ2V0dGluZyByZXN1bHRzIChhbmQgZmV0Y2ggZnJvbSBuZXR3b3JrKS5cbiAgICAgKlxuICAgICAqIFlvdSAqKk1VU1QqKiB1bnN1YnNjcmliZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hBbGwoXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzTWFuYWdlcjogTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPixcbiAgICAgICAgZmV0Y2hQb2xpY3k6IFdhdGNoUXVlcnlGZXRjaFBvbGljeSA9ICdjYWNoZS1hbmQtbmV0d29yaycsXG4gICAgKTogT2JzZXJ2YWJsZTxUYWxsPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuYWxsUXVlcnkpO1xuXG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHtcbiAgICAgICAgICAgIHZhcmlhYmxlczogcXVlcnlWYXJpYWJsZXNNYW5hZ2VyLnZhcmlhYmxlcy5waXBlKFxuICAgICAgICAgICAgICAgIC8vIElnbm9yZSB2ZXJ5IGZhc3QgdmFyaWFibGUgY2hhbmdlc1xuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgyMCksXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdmFyaWFibGVzIHRvIGJlIGRlZmluZWQgdG8gcHJldmVudCBkdXBsaWNhdGUgcXVlcnk6IHdpdGggYW5kIHdpdGhvdXQgdmFyaWFibGVzXG4gICAgICAgICAgICAgICAgLy8gTnVsbCBpcyBhY2NlcHRlZCB2YWx1ZSBmb3IgXCJubyB2YXJpYWJsZXNcIlxuICAgICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZXMgPT4gdHlwZW9mIHZhcmlhYmxlcyAhPT0gJ3VuZGVmaW5lZCcpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBhcnRpYWxWYXJpYWJsZXM6IHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpLFxuICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgcGFydGlhbCB2YXJpYWJsZXMgZnJvbSBzZXJ2aWNlXG4gICAgICAgICAgICAgICAgLy8gQ29weSBtYW5hZ2VyIHRvIHByZXZlbnQgdG8gYXBwbHkgaW50ZXJuYWwgdmFyaWFibGVzIHRvIGV4dGVybmFsIFF1ZXJ5VmFyaWFibGVzTWFuYWdlclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPihxdWVyeVZhcmlhYmxlc01hbmFnZXIpO1xuICAgICAgICAgICAgICAgIG1hbmFnZXIubWVyZ2UoJ3BhcnRpYWwtdmFyaWFibGVzJywgcmVzdWx0LnBhcnRpYWxWYXJpYWJsZXMpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5hbGxRdWVyeSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG9cbiAgICAgICAgICAgICAgICAgICAgLndhdGNoUXVlcnk8dW5rbm93biwgVmFsbD4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMuYWxsUXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IG1hbmFnZXIudmFyaWFibGVzLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6IGZldGNoUG9saWN5LFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IEVNUFRZKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihyID0+ICEhci5kYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwQWxsKCksXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9ucyBhbGxvdyB0byBxdWlja2x5IGNyZWF0ZSBvciB1cGRhdGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIE1hbmFnZXMgYSBcImNyZWF0aW9uIGlzIHBlbmRpbmdcIiBzdGF0dXMsIGFuZCB1cGRhdGUgd2hlbiBjcmVhdGlvbiBpcyByZWFkeS5cbiAgICAgKiBVc2VzIHJlZ3VsYXIgdXBkYXRlL3VwZGF0ZU5vdyBhbmQgY3JlYXRlIG1ldGhvZHMuXG4gICAgICogVXNlZCBtYWlubHkgd2hlbiBlZGl0aW5nIG11bHRpcGxlIG9iamVjdHMgaW4gc2FtZSBjb250cm9sbGVyIChsaWtlIGluIGVkaXRhYmxlIGFycmF5cylcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlT3JVcGRhdGUoXG4gICAgICAgIG9iamVjdDogVmNyZWF0ZVsnaW5wdXQnXSB8IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPixcbiAgICAgICAgbm93ID0gZmFsc2UsXG4gICAgKTogT2JzZXJ2YWJsZTxUY3JlYXRlIHwgVHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuY3JlYXRlTXV0YXRpb24pO1xuICAgICAgICB0aGlzLnRocm93SWZOb3RRdWVyeSh0aGlzLnVwZGF0ZU11dGF0aW9uKTtcblxuICAgICAgICAvLyBJZiBjcmVhdGlvbiBpcyBwZW5kaW5nLCBsaXN0ZW4gdG8gY3JlYXRpb24gb2JzZXJ2YWJsZSBhbmQgd2hlbiByZWFkeSwgZmlyZSB1cGRhdGVcbiAgICAgICAgY29uc3QgcGVuZGluZ0NyZWF0aW9uID0gdGhpcy5jcmVhdGluZ0NhY2hlLmdldChvYmplY3QpO1xuICAgICAgICBpZiAocGVuZGluZ0NyZWF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gcGVuZGluZ0NyZWF0aW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKGNyZWF0ZWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IChjcmVhdGVkIGFzIFdpdGhJZDxUY3JlYXRlPikuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4ob2JqZWN0IGFzIFZjcmVhdGVbJ2lucHV0J10pLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBvYmplY3QgaGFzIElkLCBqdXN0IHNhdmUgaXRcbiAgICAgICAgaWYgKCdpZCcgaW4gb2JqZWN0ICYmIG9iamVjdC5pZCkge1xuICAgICAgICAgICAgaWYgKG5vdykge1xuICAgICAgICAgICAgICAgIC8vIHVzZWQgbWFpbmx5IGZvciB0ZXN0cywgYmVjYXVzZSBsb2Rhc2ggZGVib3VuY2VkIHVzZWQgaW4gdXBkYXRlKCkgZG9lcyBub3Qgd29yayBmaW5lIHdpdGggZmFrZUFzeW5jIGFuZCB0aWNrKClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVOb3cob2JqZWN0IGFzIFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZShvYmplY3QgYXMgV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG9iamVjdCB3YXMgbm90IHNhdmluZywgYW5kIGhhcyBubyBJRCwgY3JlYXRlIGl0XG4gICAgICAgIGNvbnN0IGNyZWF0aW9uID0gdGhpcy5jcmVhdGUob2JqZWN0KS5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0aW5nQ2FjaGUuZGVsZXRlKG9iamVjdCk7IC8vIHJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBzdG9yZXMgY3JlYXRpbmcgb2JzZXJ2YWJsZSBpbiBhIGNhY2hlIHJlcGxheWFibGUgdmVyc2lvbiBvZiB0aGUgb2JzZXJ2YWJsZSxcbiAgICAgICAgLy8gc28gc2V2ZXJhbCB1cGRhdGUoKSBjYW4gc3Vic2NyaWJlIHRvIHRoZSBzYW1lIGNyZWF0aW9uXG4gICAgICAgIHRoaXMuY3JlYXRpbmdDYWNoZS5zZXQob2JqZWN0LCBjcmVhdGlvbi5waXBlKHNoYXJlUmVwbGF5KCkpKTtcblxuICAgICAgICByZXR1cm4gY3JlYXRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIG9iamVjdCBpbiBEQiBhbmQgdGhlbiByZWZldGNoIHRoZSBsaXN0IG9mIG9iamVjdHNcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlKG9iamVjdDogVmNyZWF0ZVsnaW5wdXQnXSk6IE9ic2VydmFibGU8VGNyZWF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMuY3JlYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IG1lcmdlKFxuICAgICAgICAgICAge30sXG4gICAgICAgICAgICB7aW5wdXQ6IHRoaXMuZ2V0SW5wdXQob2JqZWN0LCB0cnVlKX0sXG4gICAgICAgICAgICB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JDcmVhdGlvbihvYmplY3QpLFxuICAgICAgICApIGFzIFZjcmVhdGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAubXV0YXRlPFRjcmVhdGUsIFZjcmVhdGU+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogdGhpcy5jcmVhdGVNdXRhdGlvbixcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcG9sbG8uY2xpZW50LnJlRmV0Y2hPYnNlcnZhYmxlUXVlcmllcygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXBDcmVhdGlvbihyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0LCBhZnRlciBhIHNob3J0IGRlYm91bmNlXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZShvYmplY3Q6IFdpdGhJZDxWdXBkYXRlWydpbnB1dCddPik6IE9ic2VydmFibGU8VHVwZGF0ZT4ge1xuICAgICAgICB0aGlzLnRocm93SWZPYnNlcnZhYmxlKG9iamVjdCk7XG4gICAgICAgIHRoaXMudGhyb3dJZk5vdFF1ZXJ5KHRoaXMudXBkYXRlTXV0YXRpb24pO1xuXG4gICAgICAgIC8vIEtlZXAgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIGRlYm91bmNlZCB1cGRhdGUgZnVuY3Rpb25cbiAgICAgICAgY29uc3QgaWQgPSBvYmplY3QuaWQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubmF0dXJhbERlYm91bmNlU2VydmljZS5kZWJvdW5jZSh0aGlzLCBpZCwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYW4gb2JqZWN0IGltbWVkaWF0ZWx5IHdoZW4gc3Vic2NyaWJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlTm93KG9iamVjdDogV2l0aElkPFZ1cGRhdGVbJ2lucHV0J10+KTogT2JzZXJ2YWJsZTxUdXBkYXRlPiB7XG4gICAgICAgIHRoaXMudGhyb3dJZk9ic2VydmFibGUob2JqZWN0KTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy51cGRhdGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgICAgICAgICAgICBpbnB1dDogdGhpcy5nZXRJbnB1dChvYmplY3QsIGZhbHNlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aGlzLmdldFBhcnRpYWxWYXJpYWJsZXNGb3JVcGRhdGUob2JqZWN0KSxcbiAgICAgICAgKSBhcyBWdXBkYXRlO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFwb2xsb1xuICAgICAgICAgICAgLm11dGF0ZTxUdXBkYXRlLCBWdXBkYXRlPih7XG4gICAgICAgICAgICAgICAgbXV0YXRpb246IHRoaXMudXBkYXRlTXV0YXRpb24sXG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiB2YXJpYWJsZXMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXBvbGxvLmNsaWVudC5yZUZldGNoT2JzZXJ2YWJsZVF1ZXJpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVXBkYXRlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBvYmplY3RzIGFuZCB0aGVuIHJlZmV0Y2ggdGhlIGxpc3Qgb2Ygb2JqZWN0c1xuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGUob2JqZWN0czoge2lkOiBzdHJpbmd9W10pOiBPYnNlcnZhYmxlPFRkZWxldGU+IHtcbiAgICAgICAgdGhpcy50aHJvd0lmT2JzZXJ2YWJsZShvYmplY3RzKTtcbiAgICAgICAgdGhpcy50aHJvd0lmTm90UXVlcnkodGhpcy5kZWxldGVNdXRhdGlvbik7XG5cbiAgICAgICAgY29uc3QgaWRzID0gb2JqZWN0cy5tYXAobyA9PiB7XG4gICAgICAgICAgICAvLyBDYW5jZWwgcGVuZGluZyB1cGRhdGVcbiAgICAgICAgICAgIHRoaXMubmF0dXJhbERlYm91bmNlU2VydmljZS5jYW5jZWxPbmUodGhpcywgby5pZCk7XG5cbiAgICAgICAgICAgIHJldHVybiBvLmlkO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFyaWFibGVzID0gbWVyZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWRzOiBpZHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yRGVsZXRlKG9iamVjdHMpLFxuICAgICAgICApIGFzIFZkZWxldGU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBvbGxvXG4gICAgICAgICAgICAubXV0YXRlPFRkZWxldGUsIFZkZWxldGU+KHtcbiAgICAgICAgICAgICAgICBtdXRhdGlvbjogdGhpcy5kZWxldGVNdXRhdGlvbixcbiAgICAgICAgICAgICAgICB2YXJpYWJsZXM6IHZhcmlhYmxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyBEZWxheSB0aGUgb2JzZXJ2YWJsZSB1bnRpbCBBcG9sbG8gcmVmZXRjaCBpcyBjb21wbGV0ZWRcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkUmVzdWx0ID0gdGhpcy5tYXBEZWxldGUocmVzdWx0KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmFwb2xsby5jbGllbnQucmVGZXRjaE9ic2VydmFibGVRdWVyaWVzKCkpLnBpcGUobWFwKCgpID0+IG1hcHBlZFJlc3VsdCkpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgaWQgaXMgcHJvdmlkZWQsIHJlc29sdmVzIGFuIG9ic2VydmFibGUgbW9kZWwuIFRoZSBvYnNlcnZhYmxlIG1vZGVsIHdpbGwgb25seSBiZSBlbWl0dGVkIGFmdGVyIHdlIGFyZSBzdXJlXG4gICAgICogdGhhdCBBcG9sbG8gY2FjaGUgaXMgZnJlc2ggYW5kIHdhcm0uIFRoZW4gdGhlIGNvbXBvbmVudCBjYW4gc3Vic2NyaWJlIHRvIHRoZSBvYnNlcnZhYmxlIG1vZGVsIHRvIGdldCB0aGUgbW9kZWxcbiAgICAgKiBpbW1lZGlhdGVseSBmcm9tIEFwb2xsbyBjYWNoZSBhbmQgYW55IHN1YnNlcXVlbnRzIGZ1dHVyZSBtdXRhdGlvbnMgdGhhdCBtYXkgaGFwcGVuIHRvIEFwb2xsbyBjYWNoZS5cbiAgICAgKlxuICAgICAqIFdpdGhvdXQgaWQsIHJldHVybnMgZGVmYXVsdCB2YWx1ZXMsIGluIG9yZGVyIHRvIHNob3cgYSBjcmVhdGlvbiBmb3JtLlxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlKGlkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPE9ic2VydmFibGU8VG9uZSB8IFZjcmVhdGVbJ2lucHV0J10+PiB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgICAgY29uc3Qgb25seU5ldHdvcmsgPSB0aGlzLndhdGNoT25lKGlkLCAnbmV0d29yay1vbmx5JykucGlwZShmaXJzdCgpKTtcbiAgICAgICAgICAgIGNvbnN0IG9ubHlDYWNoZSA9IHRoaXMud2F0Y2hPbmUoaWQsICdjYWNoZS1maXJzdCcpO1xuXG4gICAgICAgICAgICAvLyBJbiB0aGVvcnksIHdlIGNhbiByZWx5IG9uIEFwb2xsbyBDYWNoZSB0byByZXR1cm4gYSByZXN1bHQgaW5zdGFudGx5LiBJdCBpcyB2ZXJ5IGZhc3QgaW5kZWVkLFxuICAgICAgICAgICAgLy8gYnV0IGl0IGlzIHN0aWxsIGFzeW5jaHJvbm91cywgc28gdGhlcmUgbWF5IGJlIGEgdmVyeSBzaG9ydCB0aW1lIHdoZW4gd2UgZG9uJ3QgaGF2ZSB0aGUgbW9kZWxcbiAgICAgICAgICAgIC8vIGF2YWlsYWJsZS4gVG8gZml4IHRoYXQsIHdlIGNhbiByZWx5IG9uIFJ4SlMsIHdoaWNoIGlzIGFibGUgdG8gZW1pdCBzeW5jaHJvbm91c2x5IHRoZSB2YWx1ZSB3ZSBqdXN0XG4gICAgICAgICAgICAvLyBnb3QgZnJvbSBzZXJ2ZXIuIE9uY2UgQXBvbGxvIENsaWVudCBtb3ZlcyB0byBSeEpTIChodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9hcG9sbG8tZmVhdHVyZS1yZXF1ZXN0cy9pc3N1ZXMvMzc1KSxcbiAgICAgICAgICAgIC8vIHdlIGNvdWxkIHRyeSB0byByZW1vdmUgYHN0YXJ0V2l0aCgpYC5cbiAgICAgICAgICAgIHJldHVybiBvbmx5TmV0d29yay5waXBlKG1hcChmaXJzdFZhbHVlID0+IG9ubHlDYWNoZS5waXBlKHN0YXJ0V2l0aChmaXJzdFZhbHVlKSkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvZihvZih0aGlzLmdldERlZmF1bHRGb3JTZXJ2ZXIoKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFuIG9iamVjdCB0aGF0IG1hdGNoIHRoZSBHcmFwaFFMIGlucHV0IHR5cGUuXG4gICAgICogSXQgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCBtYW51YWxseSBmaWxsZWQgZGF0YSBhbmQgYWRkIHVuY29tcGxldGVkIGRhdGEgKGxpa2UgcmVxdWlyZWQgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBlbXB0eSBzdHJpbmdzKVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbnB1dChvYmplY3Q6IExpdGVyYWwsIGZvckNyZWF0aW9uOiBib29sZWFuKTogVmNyZWF0ZVsnaW5wdXQnXSB8IFZ1cGRhdGVbJ2lucHV0J10ge1xuICAgICAgICAvLyBDb252ZXJ0IHJlbGF0aW9ucyB0byB0aGVpciBJRHMgZm9yIG11dGF0aW9uXG4gICAgICAgIG9iamVjdCA9IHJlbGF0aW9uc1RvSWRzKG9iamVjdCk7XG5cbiAgICAgICAgLy8gUGljayBvbmx5IGF0dHJpYnV0ZXMgdGhhdCB3ZSBjYW4gZmluZCBpbiB0aGUgZW1wdHkgb2JqZWN0XG4gICAgICAgIC8vIEluIG90aGVyIHdvcmRzLCBwcmV2ZW50IHRvIHNlbGVjdCBkYXRhIHRoYXQgaGFzIHVud2FudGVkIGF0dHJpYnV0ZXNcbiAgICAgICAgY29uc3QgZW1wdHlPYmplY3QgPSB0aGlzLmdldERlZmF1bHRGb3JTZXJ2ZXIoKTtcbiAgICAgICAgbGV0IGlucHV0ID0gcGljayhvYmplY3QsIE9iamVjdC5rZXlzKGVtcHR5T2JqZWN0KSk7XG5cbiAgICAgICAgLy8gQ29tcGxldGUgYSBwb3RlbnRpYWxseSB1bmNvbXBsZXRlZCBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgICAgICBpZiAoZm9yQ3JlYXRpb24pIHtcbiAgICAgICAgICAgIGlucHV0ID0gZGVmYXVsdHMoaW5wdXQsIGVtcHR5T2JqZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIG1hdGNoaW5nIHRoZSBxdWVyeS4gSXQgbWF5IG5ldmVyIGNvbXBsZXRlLlxuICAgICAqXG4gICAgICogVGhpcyBpcyB1c2VkIGZvciB0aGUgdW5pcXVlIHZhbGlkYXRvclxuICAgICAqL1xuICAgIHB1YmxpYyBjb3VudChxdWVyeVZhcmlhYmxlc01hbmFnZXI6IE5hdHVyYWxRdWVyeVZhcmlhYmxlc01hbmFnZXI8VmFsbD4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCBxdWVyeU5hbWUgPSAnQ291bnQnICsgdXBwZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy4jcGx1cmFsKTtcbiAgICAgICAgY29uc3QgZmlsdGVyVHlwZSA9IHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSkgKyAnRmlsdGVyJztcblxuICAgICAgICBjb25zdCBxdWVyeSA9IGdxbGBcbiAgICAgICAgICAgIHF1ZXJ5ICR7cXVlcnlOYW1lfSAoJGZpbHRlcjogJHtmaWx0ZXJUeXBlfSkge1xuICAgICAgICAgICAgY291bnQ6ICR7dGhpcy4jcGx1cmFsfSAoZmlsdGVyOiAkZmlsdGVyLCBwYWdpbmF0aW9uOiB7cGFnZVNpemU6IDAsIHBhZ2VJbmRleDogMH0pIHtcbiAgICAgICAgICAgIGxlbmd0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWA7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFydGlhbFZhcmlhYmxlc0ZvckFsbCgpLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAocGFydGlhbFZhcmlhYmxlcyA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ29weSBtYW5hZ2VyIHRvIHByZXZlbnQgdG8gYXBwbHkgaW50ZXJuYWwgdmFyaWFibGVzIHRvIGV4dGVybmFsIFF1ZXJ5VmFyaWFibGVzTWFuYWdlclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgTmF0dXJhbFF1ZXJ5VmFyaWFibGVzTWFuYWdlcjxWYWxsPihxdWVyeVZhcmlhYmxlc01hbmFnZXIpO1xuICAgICAgICAgICAgICAgIG1hbmFnZXIubWVyZ2UoJ3BhcnRpYWwtdmFyaWFibGVzJywgcGFydGlhbFZhcmlhYmxlcyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcG9sbG8ucXVlcnk8e2NvdW50OiB7bGVuZ3RoOiBudW1iZXJ9fSwgVmFsbD4oe1xuICAgICAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogbWFuYWdlci52YXJpYWJsZXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGZldGNoUG9saWN5OiAnbmV0d29yay1vbmx5JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHJlc3VsdCA9PiByZXN1bHQuZGF0YS5jb3VudC5sZW5ndGgpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBlbXB0eSBvYmplY3Qgd2l0aCBzb21lIGRlZmF1bHQgdmFsdWVzIGZyb20gc2VydmVyIHBlcnNwZWN0aXZlXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSB1c2VmdWwgd2hlbiBzaG93aW5nIGEgZm9ybSBmb3IgY3JlYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGVmYXVsdEZvclNlcnZlcigpOiBWY3JlYXRlWydpbnB1dCddIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFlvdSBwcm9iYWJseSAqKnNob3VsZCBub3QqKiB1c2UgdGhpcy5cbiAgICAgKlxuICAgICAqIElmIHlvdSBhcmUgdHJ5aW5nIHRvICpjYWxsKiB0aGlzIG1ldGhvZCwgaW5zdGVhZCB5b3UgcHJvYmFibHkgd2FudCB0byBjYWxsIGBnZXREZWZhdWx0Rm9yU2VydmVyKClgIHRvIGdldCBkZWZhdWx0XG4gICAgICogdmFsdWVzIGZvciBhIG1vZGVsLCBvciBgZ2V0Rm9ybUNvbmZpZygpYCB0byBnZXQgYSBjb25maWd1cmVkIGZvcm0gdGhhdCBpbmNsdWRlcyBleHRyYSBmb3JtIGZpZWxkcy5cbiAgICAgKlxuICAgICAqIElmIHlvdSBhcmUgdHJ5aW5nIHRvICpvdmVycmlkZSogdGhpcyBtZXRob2QsIGluc3RlYWQgeW91IHByb2JhYmx5IHdhbnQgdG8gb3ZlcnJpZGUgYGdldERlZmF1bHRGb3JTZXJ2ZXIoKWAuXG4gICAgICpcbiAgICAgKiBUaGUgb25seSBhbmQgKip2ZXJ5IHJhcmUqKiByZWFzb24gdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgaXMgaWYgdGhlIGNsaWVudCBuZWVkcyBleHRyYSBmb3JtIGZpZWxkcyB0aGF0IGNhbm5vdCBiZVxuICAgICAqIGFjY2VwdGVkIGJ5IHRoZSBzZXJ2ZXIgKG5vdCBwYXJ0IG9mIGBYWFhJbnB1dGAgdHlwZSkgYW5kIHRoYXQgYXJlIHN0cmljdGx5IGZvciB0aGUgY2xpZW50IGZvcm0gbmVlZHMuIEluIHRoYXQgY2FzZSxcbiAgICAgKiB0aGVuIHlvdSBjYW4gcmV0dXJuIGRlZmF1bHQgdmFsdWVzIGZvciB0aG9zZSBleHRyYSBmb3JtIGZpZWxkcywgYW5kIHRoZSBmb3JtIHJldHVybmVkIGJ5IGBnZXRGb3JtQ29uZmlnKClgIHdpbGxcbiAgICAgKiBpbmNsdWRlIHRob3NlIGV4dHJhIGZpZWxkcy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9ybUV4dHJhRmllbGREZWZhdWx0VmFsdWVzKCk6IExpdGVyYWwge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3Qgb25seSB0aGUgYXJyYXkgb2YgZmV0Y2hlZCBvYmplY3RzIG91dCBvZiB0aGUgZW50aXJlIGZldGNoZWQgZGF0YVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBBbGwoKTogT3BlcmF0b3JGdW5jdGlvbjxGZXRjaFJlc3VsdDx1bmtub3duPiwgVGFsbD4ge1xuICAgICAgICByZXR1cm4gbWFwKHJlc3VsdCA9PiAocmVzdWx0LmRhdGEgYXMgYW55KVt0aGlzLiNwbHVyYWxdKTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IHRoZSBjcmVhdGVkIG9iamVjdCBvdXQgb2YgdGhlIGVudGlyZSBmZXRjaGVkIGRhdGFcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwQ3JlYXRpb24ocmVzdWx0OiBNdXRhdGlvblJlc3VsdDx1bmtub3duPik6IFRjcmVhdGUge1xuICAgICAgICBjb25zdCBuYW1lID0gJ2NyZWF0ZScgKyB1cHBlckNhc2VGaXJzdExldHRlcih0aGlzLm5hbWUpO1xuICAgICAgICByZXR1cm4gKHJlc3VsdC5kYXRhIGFzIGFueSlbbmFtZV07IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBvbGxvZ3JhcGhxbC9hcG9sbG8tY2xpZW50L2lzc3Vlcy81NjYyXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4dHJhY3Qgb25seSB0aGUgdXBkYXRlZCBvYmplY3Qgb3V0IG9mIHRoZSBlbnRpcmUgZmV0Y2hlZCBkYXRhXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcFVwZGF0ZShyZXN1bHQ6IE11dGF0aW9uUmVzdWx0PHVua25vd24+KTogVHVwZGF0ZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAndXBkYXRlJyArIHVwcGVyQ2FzZUZpcnN0TGV0dGVyKHRoaXMubmFtZSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0LmRhdGEgYXMgYW55KVtuYW1lXTsgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hcG9sbG9ncmFwaHFsL2Fwb2xsby1jbGllbnQvaXNzdWVzLzU2NjJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCBvbmx5IGZsYWcgd2hlbiBkZWxldGluZyBhbiBvYmplY3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbWFwRGVsZXRlKHJlc3VsdDogTXV0YXRpb25SZXN1bHQ8dW5rbm93bj4pOiBUZGVsZXRlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9ICdkZWxldGUnICsgdXBwZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy4jcGx1cmFsKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQuZGF0YSBhcyBhbnkpW25hbWVdOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fwb2xsb2dyYXBocWwvYXBvbGxvLWNsaWVudC9pc3N1ZXMvNTY2MlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGdldHRpbmcgYSBzaW5nbGUgb2JqZWN0XG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIHNpdGUgb3Igc3RhdGUgSUQsIGFuZCBpcyBuZWVkZWQgdG8gZ2V0IGFwcHJvcHJpYXRlIGFjY2VzcyByaWdodHNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0UGFydGlhbFZhcmlhYmxlc0Zvck9uZSgpOiBPYnNlcnZhYmxlPFBhcnRpYWw8Vm9uZT4+IHtcbiAgICAgICAgcmV0dXJuIG9mKHt9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiBnZXR0aW5nIG11bHRpcGxlIG9iamVjdHNcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRCwgYnV0IGl0IGNvdWxkIGJlIHNvbWV0aGluZyBlbHNlIHRvIGZ1cnRoZXIgZmlsdGVyIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yQWxsKCk6IE9ic2VydmFibGU8UGFydGlhbDxWYWxsPj4ge1xuICAgICAgICByZXR1cm4gb2Yoe30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWRkaXRpb25hbCB2YXJpYWJsZXMgdG8gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGFuIG9iamVjdFxuICAgICAqXG4gICAgICogVGhpcyBpcyB0eXBpY2FsbHkgYSBzaXRlIG9yIHN0YXRlIElEXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBnZXRQYXJ0aWFsVmFyaWFibGVzRm9yQ3JlYXRpb24ob2JqZWN0OiBMaXRlcmFsKTogUGFydGlhbDxWY3JlYXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGJlIHVzZWQgd2hlbiB1cGRhdGluZyBhbiBvYmplY3RcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2l0ZSBvciBzdGF0ZSBJRFxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgZ2V0UGFydGlhbFZhcmlhYmxlc0ZvclVwZGF0ZShvYmplY3Q6IExpdGVyYWwpOiBQYXJ0aWFsPFZ1cGRhdGU+IHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhZGRpdGlvbmFsIHZhcmlhYmxlcyB0byBiZSB1c2VkIHdoZW4gZGVsZXRpbmcgYW4gb2JqZWN0XG4gICAgICpcbiAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBhIHNpdGUgb3Igc3RhdGUgSURcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGdldFBhcnRpYWxWYXJpYWJsZXNGb3JEZWxldGUob2JqZWN0czogTGl0ZXJhbFtdKTogUGFydGlhbDxWZGVsZXRlPiB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaHJvdyBleGNlcHRpb24gdG8gcHJldmVudCBleGVjdXRpbmcgcXVlcmllcyB3aXRoIGludmFsaWQgdmFyaWFibGVzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHRocm93SWZPYnNlcnZhYmxlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnQ2Fubm90IHVzZSBPYnNlcnZhYmxlIGFzIHZhcmlhYmxlcy4gSW5zdGVhZCB5b3Ugc2hvdWxkIHVzZSAuc3Vic2NyaWJlKCkgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGggYSByZWFsIHZhbHVlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZSBnaXZlbiBJRCB3aXRoIGFkZGl0aW9uYWwgcGFydGlhbCB2YXJpYWJsZXMgaWYgdGhlcmUgaXMgYW55XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRWYXJpYWJsZXNGb3JPbmUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Vm9uZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXJ0aWFsVmFyaWFibGVzRm9yT25lKCkucGlwZShcbiAgICAgICAgICAgIG1hcChwYXJ0aWFsVmFyaWFibGVzID0+IG1lcmdlKHt9LCB7aWQ6IGlkfSBhcyBWb25lLCBwYXJ0aWFsVmFyaWFibGVzKSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhyb3cgZXhjZXB0aW9uIHRvIHByZXZlbnQgZXhlY3V0aW5nIG51bGwgcXVlcmllc1xuICAgICAqL1xuICAgIHByaXZhdGUgdGhyb3dJZk5vdFF1ZXJ5KHF1ZXJ5OiBEb2N1bWVudE5vZGUgfCBudWxsKTogYXNzZXJ0cyBxdWVyeSB7XG4gICAgICAgIGlmICghcXVlcnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3JhcGhRTCBxdWVyeSBmb3IgdGhpcyBtZXRob2Qgd2FzIG5vdCBjb25maWd1cmVkIGluIHRoaXMgc2VydmljZSBjb25zdHJ1Y3RvcicpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|