kitsng-form-factory 0.4.34 → 0.4.35
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/kitsng-form-factory/components/kitsng-form-fields/lookup-multi-select/lookup-multi-select.component.mjs +12 -12
- package/esm2022/lib/kitsng-form-factory/components/kitsng-form-fields/lookup-select/lookup-select.component.mjs +11 -13
- package/fesm2022/kitsng-form-factory.mjs +58 -58
- package/fesm2022/kitsng-form-factory.mjs.map +1 -1
- package/lib/kitsng-form-factory/components/kitsng-form-fields/lookup-multi-select/lookup-multi-select.component.d.ts +1 -1
- package/lib/kitsng-form-factory/components/kitsng-form-fields/lookup-select/lookup-select.component.d.ts +1 -1
- package/package.json +1 -1
|
@@ -4,14 +4,13 @@ import * as i0 from "@angular/core";
|
|
|
4
4
|
import * as i1 from "../../../core/services/lookup-list.service";
|
|
5
5
|
import * as i2 from "@angular/common";
|
|
6
6
|
import * as i3 from "@angular/forms";
|
|
7
|
-
import * as i4 from "primeng/
|
|
8
|
-
import * as i5 from "primeng/
|
|
9
|
-
import * as i6 from "primeng/
|
|
10
|
-
import * as i7 from "primeng/
|
|
11
|
-
import * as i8 from "
|
|
12
|
-
import * as i9 from "../
|
|
13
|
-
import * as i10 from "
|
|
14
|
-
import * as i11 from "@ngx-translate/core";
|
|
7
|
+
import * as i4 from "primeng/api";
|
|
8
|
+
import * as i5 from "primeng/multiselect";
|
|
9
|
+
import * as i6 from "primeng/button";
|
|
10
|
+
import * as i7 from "primeng/progressspinner";
|
|
11
|
+
import * as i8 from "../form-element-layout/form-element-layout.component";
|
|
12
|
+
import * as i9 from "../field-errors/field-errors.component";
|
|
13
|
+
import * as i10 from "@ngx-translate/core";
|
|
15
14
|
export class LookupMultiSelectComponent {
|
|
16
15
|
constructor(lookupListService) {
|
|
17
16
|
this.lookupListService = lookupListService;
|
|
@@ -191,7 +190,8 @@ export class LookupMultiSelectComponent {
|
|
|
191
190
|
}
|
|
192
191
|
});
|
|
193
192
|
}
|
|
194
|
-
|
|
193
|
+
onFilter(event) {
|
|
194
|
+
this.filterWord = event.filter;
|
|
195
195
|
this.applyFilter();
|
|
196
196
|
}
|
|
197
197
|
applyFilter() {
|
|
@@ -245,11 +245,11 @@ export class LookupMultiSelectComponent {
|
|
|
245
245
|
this.destroy$.complete();
|
|
246
246
|
}
|
|
247
247
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LookupMultiSelectComponent, deps: [{ token: i1.LookupListService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
248
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LookupMultiSelectComponent, selector: "app-lookup-multi-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, field: { classPropertyName: "field", publicName: "field", isSignal: false, isRequired: false, transformFunction: null }, _formControl: { classPropertyName: "_formControl", publicName: "_formControl", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { handleChange: "handleChange", modelChange: "modelChange" }, viewQueries: [{ propertyName: "multiSelect", first: true, predicate: ["multiSelect"], descendants: true }], ngImport: i0, template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <p-multiSelect\n #multiSelect\n [options]=\"multiSelectOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [resetFilterOnHide]=\"true\"\n (onPanelHide)=\"resetFilter()\"\n [readonly]=\"options().readonly ?? false\"\n [showToggleAll]=\"options().showToggleAll ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n [display]=\"options().display ?? 'chip'\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().filter) {\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n
|
|
248
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LookupMultiSelectComponent, selector: "app-lookup-multi-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, field: { classPropertyName: "field", publicName: "field", isSignal: false, isRequired: false, transformFunction: null }, _formControl: { classPropertyName: "_formControl", publicName: "_formControl", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { handleChange: "handleChange", modelChange: "modelChange" }, viewQueries: [{ propertyName: "multiSelect", first: true, predicate: ["multiSelect"], descendants: true }], ngImport: i0, template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <p-multiSelect\n #multiSelect\n [options]=\"multiSelectOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [autofocusFilter]=\"options().autofocusFilter ?? true\"\n [autofocus]=\"options().autofocus ?? false\"\n [resetFilterOnHide]=\"true\"\n (onPanelHide)=\"resetFilter()\"\n (onFilter)=\"onFilter($event)\"\n [readonly]=\"options().readonly ?? false\"\n [showToggleAll]=\"options().showToggleAll ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n [display]=\"options().display ?? 'chip'\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().filter && options().filterTemplate) {\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n <ng-template\n [ngTemplateOutlet]=\"options().filterTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: field,\n formControl: _formControl,\n options: options(),\n refresh: loadMore.bind(this),\n formGroup: _formControl.parent\n }\">\n </ng-template>\n </ng-template>\n }\n <ng-template pTemplate=\"empty\">\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n @if (!loadingOptions) {\n @if (totalItems > (tempOptions.length || 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center\">\n <p-button type=\"button\" styleClass=\"p-button-outlined p-button-link\" label=\"Load More\" icon=\"pi pi-spinner\" (onClick)=\"loadMore()\"></p-button>\n </div>\n }\n } @else {\n @if (!firstTime && ((multiSelect?.options?.length || 0) > 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center text-primary fw-medium py-3 gap-2\">\n <i class=\"pi pi-spinner-dotted pi-spin \"></i>\n <span>{{'Loading Options'|translate}}...</span>\n </div>\n }\n }\n </ng-template>\n </p-multiSelect>\n <app-field-errors\n [customErrorMessages]=\"options()?.errorMessages || {}\"\n [controlName]=\"options()?.formControlName\"\n [errors]=\"getErrors()\"\n [errorMessage]=\"options().errorMessage || ''\"\n [showErrors]=\"(_formControl.dirty || _formControl.touched) && !loadingOptions\"></app-field-errors>\n</ng-template>\n\n <ng-template #emptyTemplate>\n <div class=\"text-center\">\n @if (loadingOptions) {\n <div>\n <p-progressSpinner styleClass=\"w-4rem h-4rem\"></p-progressSpinner>\n <p>{{'Loading Options'|translate}}</p>\n </div>\n } @else if (loadingError) {\n <div>\n <p>{{'Failed to load options.'|translate}}</p>\n <p-button\n label=\"Retry\"\n icon=\"pi pi-refresh\"\n (onClick)=\"getOptions()\"\n styleClass=\"p-button-outlined p-button-danger\" />\n </div>\n } @else {\n <p>\n {{'No Options Found'|translate}}\n </p>\n }\n </div>\n </ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i7.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i8.FormElementLayoutComponent, selector: "app-form-element-layout", inputs: ["options", "field", "controlTemplateRef", "formControlRef", "customTemplate"] }, { kind: "component", type: i9.FieldErrorsComponent, selector: "app-field-errors", inputs: ["errors", "errorMessage", "controlName", "customErrorMessages", "showErrors"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
|
|
249
249
|
}
|
|
250
250
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LookupMultiSelectComponent, decorators: [{
|
|
251
251
|
type: Component,
|
|
252
|
-
args: [{ selector: 'app-lookup-multi-select', template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <p-multiSelect\n #multiSelect\n [options]=\"multiSelectOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [resetFilterOnHide]=\"true\"\n (onPanelHide)=\"resetFilter()\"\n [readonly]=\"options().readonly ?? false\"\n [showToggleAll]=\"options().showToggleAll ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n [display]=\"options().display ?? 'chip'\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().filter) {\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n
|
|
252
|
+
args: [{ selector: 'app-lookup-multi-select', template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <p-multiSelect\n #multiSelect\n [options]=\"multiSelectOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [autofocusFilter]=\"options().autofocusFilter ?? true\"\n [autofocus]=\"options().autofocus ?? false\"\n [resetFilterOnHide]=\"true\"\n (onPanelHide)=\"resetFilter()\"\n (onFilter)=\"onFilter($event)\"\n [readonly]=\"options().readonly ?? false\"\n [showToggleAll]=\"options().showToggleAll ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n [display]=\"options().display ?? 'chip'\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().filter && options().filterTemplate) {\n <ng-template pTemplate=\"filter\" let-options=\"options\">\n <ng-template\n [ngTemplateOutlet]=\"options().filterTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: field,\n formControl: _formControl,\n options: options(),\n refresh: loadMore.bind(this),\n formGroup: _formControl.parent\n }\">\n </ng-template>\n </ng-template>\n }\n <ng-template pTemplate=\"empty\">\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n @if (!loadingOptions) {\n @if (totalItems > (tempOptions.length || 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center\">\n <p-button type=\"button\" styleClass=\"p-button-outlined p-button-link\" label=\"Load More\" icon=\"pi pi-spinner\" (onClick)=\"loadMore()\"></p-button>\n </div>\n }\n } @else {\n @if (!firstTime && ((multiSelect?.options?.length || 0) > 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center text-primary fw-medium py-3 gap-2\">\n <i class=\"pi pi-spinner-dotted pi-spin \"></i>\n <span>{{'Loading Options'|translate}}...</span>\n </div>\n }\n }\n </ng-template>\n </p-multiSelect>\n <app-field-errors\n [customErrorMessages]=\"options()?.errorMessages || {}\"\n [controlName]=\"options()?.formControlName\"\n [errors]=\"getErrors()\"\n [errorMessage]=\"options().errorMessage || ''\"\n [showErrors]=\"(_formControl.dirty || _formControl.touched) && !loadingOptions\"></app-field-errors>\n</ng-template>\n\n <ng-template #emptyTemplate>\n <div class=\"text-center\">\n @if (loadingOptions) {\n <div>\n <p-progressSpinner styleClass=\"w-4rem h-4rem\"></p-progressSpinner>\n <p>{{'Loading Options'|translate}}</p>\n </div>\n } @else if (loadingError) {\n <div>\n <p>{{'Failed to load options.'|translate}}</p>\n <p-button\n label=\"Retry\"\n icon=\"pi pi-refresh\"\n (onClick)=\"getOptions()\"\n styleClass=\"p-button-outlined p-button-danger\" />\n </div>\n } @else {\n <p>\n {{'No Options Found'|translate}}\n </p>\n }\n </div>\n </ng-template>\n" }]
|
|
253
253
|
}], ctorParameters: () => [{ type: i1.LookupListService }], propDecorators: { field: [{
|
|
254
254
|
type: Input
|
|
255
255
|
}], handleChange: [{
|
|
@@ -260,4 +260,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
260
260
|
type: ViewChild,
|
|
261
261
|
args: ['multiSelect']
|
|
262
262
|
}] } });
|
|
263
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLW11bHRpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXRzbmctZm9ybS1mYWN0b3J5L3NyYy9saWIva2l0c25nLWZvcm0tZmFjdG9yeS9jb21wb25lbnRzL2tpdHNuZy1mb3JtLWZpZWxkcy9sb29rdXAtbXVsdGktc2VsZWN0L2xvb2t1cC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0c25nLWZvcm0tZmFjdG9yeS9zcmMvbGliL2tpdHNuZy1mb3JtLWZhY3RvcnkvY29tcG9uZW50cy9raXRzbmctZm9ybS1maWVsZHMvbG9va3VwLW11bHRpLXNlbGVjdC9sb29rdXAtbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFZbEUsTUFBTSxPQUFPLDBCQUEwQjtJQThDckMsWUFBb0IsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUE3Q3hEOzs7V0FHRztRQUNILFdBQU0sR0FBUSxFQUFFLENBQUM7UUFDakI7OztXQUdHO1FBQ0gsWUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQU8sQ0FBQztRQUVoQzs7O1dBR0c7UUFDTyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFakQsZ0JBQVcsR0FBRyxNQUFNLEVBS2hCLENBQUM7UUFFTCxtQkFBYyxHQUFHLElB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QUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOzhHQXRUVSwwQkFBMEI7a0dBQTFCLDBCQUEwQixrb0JDeEJ2Qyw4OUhBK0ZBOzsyRkR2RWEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNFLHlCQUF5QjtzRkFjMUIsS0FBSztzQkFBYixLQUFLO2dCQUtJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0UsWUFBWTtzQkFBcEIsS0FBSztnQkEwQm9CLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgaW5wdXQsXG4gIGNvbXB1dGVkLFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBvdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaW5hbGl6ZSwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMb29rdXBMaXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvbG9va3VwLWxpc3Quc2VydmljZSc7XG5pbXBvcnQge1xuICBLaXRzbmdDb250cm9sRmllbGRPcHRpb25zTW9kZWwsXG4gIEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWwsXG59IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2tpdHNuZy1mb3JtLWZhY3RvcnknO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3QgfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxvb2t1cC1tdWx0aS1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9va3VwLW11bHRpLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIExvb2t1cE11bHRpU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqICogR2VuZXJhbFxuICAgKiBAZXJyb3JzIEZvcm0gY29udHJvbCBlcnJvcnNcbiAgICovXG4gIGVycm9yczogYW55ID0ge307XG4gIC8qKlxuICAgKiAqIElucHV0c1xuICAgKiBAb3B0aW9ucyBDb25maWd1cmF0aW9uIGZvciB0aGlzIGZvcm0gZmllbGRcbiAgICovXG4gIG9wdGlvbnMgPSBpbnB1dC5yZXF1aXJlZDxhbnk+KCk7XG4gIEBJbnB1dCgpIGZpZWxkOiBhbnk7XG4gIC8qKlxuICAgKiAqIE91dHB1dHNcbiAgICogQGhhbmRsZUNoYW5nZSBFdmVudCB3aGVuIGl0ZW0gaW4gZHJvcGRvd24gaXMgc2VsZWN0ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBoYW5kbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCkgX2Zvcm1Db250cm9sITogRm9ybUNvbnRyb2w8YW55PjtcbiAgbW9kZWxDaGFuZ2UgPSBvdXRwdXQ8e1xuICAgIGV2ZW50OiBhbnk7XG4gICAgcGFyZW50Rm9ybUdyb3VwPzogRm9ybUdyb3VwPGFueT4gfCBGb3JtQXJyYXk8YW55PiB8IG51bGw7XG4gICAgc2VsZWN0ZWRPcHRpb24/OiBhbnk7XG4gICAgZmllbGQ/OiBLaXRzbmdGb3JtRmFjdG9yeU1vZGVsO1xuICB9PigpO1xuXG4gIGxvYWRpbmdPcHRpb25zID0gdHJ1ZTtcbiAgbG9hZGluZ0Vycm9yID0gZmFsc2U7XG5cbiAgcGFnZUluZGV4ID0gMTtcbiAgdG90YWxJdGVtcyA9IDA7XG4gIGFsbFRvdGFsSXRlbXMgPSAwO1xuXG4gIGZpbHRlcldvcmQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGZpcnN0VGltZSA9IHRydWU7XG4gIHRlbXBPcHRpb25zOiBhbnlbXSA9IFtdO1xuICAvKipcbiAgICogKiBTZWxlY3RlZCBvcHRpb25zIChmdWxsIG9iamVjdHMpIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWVzXG4gICAqL1xuICBzZWxlY3RlZE9wdGlvbnM6IGFueVtdID0gW107XG5cbiAgcHJpdmF0ZSBfZmlsdGVyT3B0aW9uczogU3ViamVjdDxzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkPiA9IG5ldyBTdWJqZWN0KCk7XG4gIGZpbHRlck9wdGlvbnMkID0gdGhpcy5fZmlsdGVyT3B0aW9ucy5hc09ic2VydmFibGUoKTtcblxuICBAVmlld0NoaWxkKCdtdWx0aVNlbGVjdCcpIG11bHRpU2VsZWN0ITogTXVsdGlTZWxlY3Q7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbG9va3VwTGlzdFNlcnZpY2U6IExvb2t1cExpc3RTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucygpLnZhbHVlID0gdGhpcy5fZm9ybUNvbnRyb2wudmFsdWU7XG4gICAgdGhpcy5nZXRPcHRpb25zKCk7XG5cbiAgICB0aGlzLmZpbHRlck9wdGlvbnMkXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoZmlsdGVyKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyV29yZCA9IGZpbHRlcjtcbiAgICAgICAgdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldEVycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUNvbnRyb2wuZXJyb3JzO1xuICB9XG5cbiAgbmdNb2RlbENoYW5nZShldmVudDogYW55KSB7XG4gICAgbGV0IG9wdGlvbnNMaXN0OiBhbnlbXSA9IFtdO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPT0gJycgfHxcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPT0gbnVsbCB8fFxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIG9wdGlvbnNMaXN0ID0gW1xuICAgICAgICAuLi50aGlzLnRlbXBPcHRpb25zLFxuICAgICAgICAuLi50aGlzLm9wdGlvbnMoKT8ubXVsdGlTZWxlY3RPcHRpb25zLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9uc0xpc3QgPSB0aGlzLm9wdGlvbnMoKT8ubXVsdGlTZWxlY3RPcHRpb25zO1xuICAgIH1cbiAgICBjb25zdCBvcHRpb25zID0gZXZlbnQ/Lm1hcCgob3A6IGFueSkgPT5cbiAgICAgIG9wdGlvbnNMaXN0LmZpbmQoXG4gICAgICAgIChjbzogYW55KSA9PiBjb1t0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgPz8gJ2lkJ10gPT0gb3BcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gdXBkYXRlIHNlbGVjdGVkT3B0aW9ucyBwcm9wZXJ0eSB3aXRoIHRoZSBmdWxsIG9wdGlvbiBvYmplY3RzXG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSBvcHRpb25zID8/IFtdO1xuXG4gICAgdGhpcy5tb2RlbENoYW5nZS5lbWl0KHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIHBhcmVudEZvcm1Hcm91cDogdGhpcy5fZm9ybUNvbnRyb2wucGFyZW50LFxuICAgICAgc2VsZWN0ZWRPcHRpb246IG9wdGlvbnMsXG4gICAgICBmaWVsZDogdGhpcy5maWVsZCxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMoKT8ubmdNb2RlbENoYW5nZSkge1xuICAgICAgdGhpcy5vcHRpb25zKCk/Lm5nTW9kZWxDaGFuZ2U/LihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuX2Zvcm1Db250cm9sLnBhcmVudCBhcyBGb3JtR3JvdXAsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHRoaXMuZmllbGRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5vbk9wdGlvbkNoYW5nZShvcHRpb25zKTtcbiAgfVxuXG4gIG9uT3B0aW9uQ2hhbmdlKGU6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMoKT8ub25PcHRpb25TZWxlY3RlZCkge1xuICAgICAgdGhpcy5vcHRpb25zKCk/Lm9uT3B0aW9uU2VsZWN0ZWQ/LihlKTtcbiAgICB9XG4gIH1cblxuICBtdWx0aVNlbGVjdE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKT8ubXVsdGlTZWxlY3RPcHRpb25zID8/IFtdKTtcblxuICBnZXRPcHRpb25zKCkge1xuICAgIHRoaXMubG9hZGluZ09wdGlvbnMgPSB0cnVlO1xuICAgIHRoaXMubG9hZGluZ0Vycm9yID0gZmFsc2U7XG5cbiAgICBsZXQgcTogYW55ID0ge1xuICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLm9wdGlvbnMoKT8ucGFnZVNpemUgPz8gMTAwLFxuICAgICAgLi4uKHRoaXMub3B0aW9ucygpPy5xdWVyeSA/PyB7fSksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmZpbHRlcldvcmQpIHFbJ3NlYXJjaCddID0gdGhpcy5maWx0ZXJXb3JkO1xuXG4gICAgdGhpcy5sb29rdXBMaXN0U2VydmljZVxuICAgICAgLmdldExvb2t1cExpc3RzPGFueT4oXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlCYXNlVXJsISxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LmVudGl0eSEsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBxLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8ubW9kdWxlLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8udmVyc2lvbixcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LnBhdGggPz8gJ3BhZ2UnLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8ubWVtb3J5Q2FjaGUgPz8gZmFsc2VcbiAgICAgIClcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmxvYWRpbmdPcHRpb25zID0gZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXNwb25zZT8uZGF0YT8ucGFnZUluZm8/LnRvdGFsSXRlbXM7XG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMgfHwgdGhpcy5wYWdlSW5kZXggPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucy5wdXNoKFxuICAgICAgICAgICAgLi4uKHJlc3BvbnNlLmRhdGE/Lml0ZW1zPy5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgLi4uaXRlbS5rdixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pID8/IFtdKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLmZpcnN0VGltZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucygpPy52YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLl9mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMoKT8udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hbGxUb3RhbEl0ZW1zID0gcmVzcG9uc2U/LmRhdGE/LnBhZ2VJbmZvPy50b3RhbEl0ZW1zO1xuICAgICAgICAgICAgdGhpcy5maXJzdFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zID0gdGhpcy5kZWR1cGxpY2F0ZShcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucygpPy5tdWx0aVNlbGVjdE9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZSAmJlxuICAgICAgICAgICAgKHRoaXMuZmlsdGVyV29yZCA9PSAnJyB8fFxuICAgICAgICAgICAgICB0aGlzLmZpbHRlcldvcmQgPT0gbnVsbCB8fFxuICAgICAgICAgICAgICB0aGlzLmZpbHRlcldvcmQgPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5lbnN1cmVTZWxlY3RlZE9wdGlvbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcldvcmQpIHtcbiAgICAgICAgICAgIHRoaXMudGVtcE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGVtcE9wdGlvbnMgPSB0aGlzLmRlZHVwbGljYXRlKFtcbiAgICAgICAgICAgICAgLi4udGhpcy50ZW1wT3B0aW9ucyxcbiAgICAgICAgICAgICAgLi4udGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMgPSB0aGlzLmRlZHVwbGljYXRlKFtcbiAgICAgICAgICAgICAgLi4udGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zLFxuICAgICAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkT3B0aW9uc1xuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9wdGlvbnM6JywgZXJyKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdFcnJvciA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZU92ZXJsYXlEcm9wZG93bm9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMubXVsdGlTZWxlY3Q/Lm9wdGlvbnMpIHtcbiAgICAgIHRoaXMubXVsdGlTZWxlY3Qub3B0aW9ucyA9IHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucztcbiAgICB9XG4gIH1cbiAgZW5zdXJlU2VsZWN0ZWRPcHRpb25zKCkge1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gdGhpcy5fZm9ybUNvbnRyb2wudmFsdWUgfHwgW107XG4gICAgc2VsZWN0ZWRWYWx1ZXMuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucz8uc29tZShcbiAgICAgICAgKG9wOiBhbnkpID0+IG9wW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PSB2YWxcbiAgICAgICk7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICB0aGlzLmdldE9wdGlvbkJ5SWQodmFsKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBwb3B1bGF0ZSBzZWxlY3RlZE9wdGlvbnMgd2l0aCBhbnkgY3VycmVudGx5IGF2YWlsYWJsZSBmdWxsIG9wdGlvbiBvYmplY3RzXG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbnMgPSAoc2VsZWN0ZWRWYWx1ZXMgfHwgW10pXG4gICAgICAubWFwKCh2YWw6IGFueSkgPT5cbiAgICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zPy5maW5kKFxuICAgICAgICAgIChvcDogYW55KSA9PiBvcFt0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgPz8gJ2lkJ10gPT0gdmFsXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoKG86IGFueSkgPT4gISFvKTtcbiAgfVxuXG4gIGdldE9wdGlvbkJ5SWQoaWQ6IGFueSkge1xuICAgIHRoaXMubG9va3VwTGlzdFNlcnZpY2VcbiAgICAgIC5nZXRCeUlkKFxuICAgICAgICBpZCxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LmVudGl0eSEsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5tb2R1bGUsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy52ZXJzaW9uLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8uYXBpQmFzZVVybFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgICAgICAgLi4udmFsdWUua3YsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4udGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zLFxuICAgICAgICAgIF07XG4gICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5RHJvcGRvd25vcHRpb25zKCk7XG4gICAgICAgICAgdGhpcy50ZW1wT3B0aW9ucyA9IHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucztcbiAgICAgICAgICAvLyB1cGRhdGUgc2VsZWN0ZWRPcHRpb25zIGluIGNhc2UgdGhpcyB3YXMgb25lIG9mIHRoZSBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucyA9ICh0aGlzLl9mb3JtQ29udHJvbD8udmFsdWUgfHwgW10pXG4gICAgICAgICAgICAubWFwKCh2YWw6IGFueSkgPT5cbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zPy5maW5kKFxuICAgICAgICAgICAgICAgIChvcDogYW55KSA9PiBvcFt0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgPz8gJ2lkJ10gPT0gdmFsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoKG86IGFueSkgPT4gISFvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBmaWx0ZXJPcHRpb25zKCkge1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZmlsdGVyV29yZCA9PSAnJyB8fFxuICAgICAgdGhpcy5maWx0ZXJXb3JkID09IG51bGwgfHxcbiAgICAgIHRoaXMuZmlsdGVyV29yZCA9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucyA9IHRoaXMudGVtcE9wdGlvbnM7XG4gICAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLmFsbFRvdGFsSXRlbXM7XG4gICAgICB0aGlzLnVwZGF0ZU92ZXJsYXlEcm9wZG93bm9wdGlvbnMoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5hbGxUb3RhbEl0ZW1zID4gdGhpcy50ZW1wT3B0aW9ucy5sZW5ndGggfHxcbiAgICAgICghdGhpcy5hbGxUb3RhbEl0ZW1zICYmIHRoaXMub3B0aW9ucygpLnBhdGggIT09ICdhbGwnKVxuICAgICkge1xuICAgICAgdGhpcy5wYWdlSW5kZXggPSAxO1xuICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zID0gW107XG4gICAgICB0aGlzLmxvYWRpbmdPcHRpb25zID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2ZpbHRlck9wdGlvbnMubmV4dCh0aGlzLmZpbHRlcldvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXl3b3JkID0gKHRoaXMuZmlsdGVyV29yZCA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBmaWx0ZXJCeSA9IHRoaXMub3B0aW9ucygpLmZpbHRlckJ5ID8/ICd0ZXh0JztcbiAgICAgIHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucyA9IHRoaXMudGVtcE9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+e1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbj8uW2ZpbHRlckJ5XTtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyhrZXl3b3JkKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy51cGRhdGVPdmVybGF5RHJvcGRvd25vcHRpb25zKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgZGVkdXBsaWNhdGUoYXJyOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBrZXkgPSB0aGlzLm9wdGlvbnMoKS5vcHRpb25WYWx1ZSA/PyAnaWQnO1xuXG4gICAgcmV0dXJuIGFyci5maWx0ZXIoXG4gICAgICAoaXRlbSwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgIGluZGV4ID09PSBzZWxmLmZpbmRJbmRleCgodCkgPT4gdFtrZXldID09PSBpdGVtW2tleV0pXG4gICAgKTtcbiAgfVxuICByZXNldEZpbHRlcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZpbHRlcldvcmQgIT0gJycgJiZcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSBudWxsICYmXG4gICAgICB0aGlzLmZpbHRlcldvcmQgIT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aGlzLmZpbHRlcldvcmQgPSAnJztcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBsb2FkTW9yZSgpIHtcbiAgICB0aGlzLnBhZ2VJbmRleCsrO1xuICAgIHRoaXMuZ2V0T3B0aW9ucygpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGFwcC1mb3JtLWVsZW1lbnQtbGF5b3V0XG4gIFtvcHRpb25zXT1cIm9wdGlvbnMoKVwiXG4gIFtmaWVsZF09XCJmaWVsZFwiXG4gIFtjb250cm9sVGVtcGxhdGVSZWZdPVwiY29udHJvbFRlbXBsYXRlXCJcbiAgW2Zvcm1Db250cm9sUmVmXT1cIl9mb3JtQ29udHJvbFwiXG4+PC9hcHAtZm9ybS1lbGVtZW50LWxheW91dD5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFRlbXBsYXRlPlxuICA8cC1tdWx0aVNlbGVjdFxuICAgICNtdWx0aVNlbGVjdFxuICAgIFtvcHRpb25zXT1cIm11bHRpU2VsZWN0T3B0aW9ucygpXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiKG9wdGlvbnMoKS5wbGFjZWhvbGRlcj8/JycpIHwgdHJhbnNsYXRlXCJcbiAgICBbZm9ybUNvbnRyb2xdPVwiX2Zvcm1Db250cm9sXCJcbiAgICBbb3B0aW9uTGFiZWxdPVwib3B0aW9ucygpLm9wdGlvbkxhYmVsID8/ICd0ZXh0J1wiXG4gICAgW29wdGlvblZhbHVlXT1cIm9wdGlvbnMoKS5vcHRpb25WYWx1ZSA/PyAnaWQnXCJcbiAgICBbb3B0aW9uR3JvdXBMYWJlbF09XCJvcHRpb25zKCkub3B0aW9uR3JvdXBMYWJlbCA/PyAndGV4dCdcIlxuICAgIFtvcHRpb25Hcm91cENoaWxkcmVuXT1cIm9wdGlvbnMoKS5vcHRpb25Hcm91cENoaWxkcmVuID8/ICdpdGVtcydcIlxuICAgIFtncm91cF09XCJvcHRpb25zKCkuZ3JvdXAgPz8gZmFsc2VcIlxuICAgIHN0eWxlQ2xhc3M9XCJ7e29wdGlvbnMoKS5jbGFzcyA/PyAndy1mdWxsJ319XCJcbiAgICBbc2hvd0NsZWFyXT1cIm9wdGlvbnMoKS5zaG93Q2xlYXIgPz8gZmFsc2VcIlxuICAgIFthcHBlbmRUb109XCJvcHRpb25zKCkuYXBwZW5kVG8gPz8gJ2JvZHknXCJcbiAgICBbZmlsdGVyXT1cIm9wdGlvbnMoKS5maWx0ZXIgPz8gZmFsc2VcIlxuICAgIFtmaWx0ZXJCeV09XCJvcHRpb25zKCkuZmlsdGVyQnkgPz8gJ3RleHQnXCJcbiAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgKG9uUGFuZWxIaWRlKT1cInJlc2V0RmlsdGVyKClcIlxuICAgIFtyZWFkb25seV09XCJvcHRpb25zKCkucmVhZG9ubHkgPz8gZmFsc2VcIlxuICAgIFtzaG93VG9nZ2xlQWxsXT1cIm9wdGlvbnMoKS5zaG93VG9nZ2xlQWxsID8/IGZhbHNlXCJcbiAgICBbbmdDbGFzc109XCJ7J25nLWludmFsaWQgbmctZGlydHknOiAoX2Zvcm1Db250cm9sLmVycm9ycyAmJiAoX2Zvcm1Db250cm9sLmRpcnR5IHx8IF9mb3JtQ29udHJvbC50b3VjaGVkKSAmJiAhbG9hZGluZ09wdGlvbnMpID8/IGZhbHNlfVwiXG4gICAgW2Rpc3BsYXldPVwib3B0aW9ucygpLmRpc3BsYXkgPz8gJ2NoaXAnXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJuZ01vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICAgICAgQGlmIChvcHRpb25zKCkuZmlsdGVyKSB7XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiZmlsdGVyXCIgbGV0LW9wdGlvbnM9XCJvcHRpb25zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1pbnB1dGdyb3VwLWFkZG9uXCI+PGkgY2xhc3M9XCJwaSBwaS1zZWFyY2hcIj48L2k+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgcElucHV0VGV4dFxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggSXRlbVwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlcldvcmRcIlxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICAgICAgICAoa2V5dXApPVwiZmlsdGVyT3B0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVtcHR5VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICAgICAgICAgIEBpZiAoIWxvYWRpbmdPcHRpb25zKSB7XG4gICAgICAgICAgICAgIEBpZiAodG90YWxJdGVtcyA+ICh0ZW1wT3B0aW9ucy5sZW5ndGggfHwgMCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWxpbmtcIiBsYWJlbD1cIkxvYWQgTW9yZVwiIGljb249XCJwaSBwaS1zcGlubmVyXCIgKG9uQ2xpY2spPVwibG9hZE1vcmUoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBAaWYgKCFmaXJzdFRpbWUgJiYgKChtdWx0aVNlbGVjdD8ub3B0aW9ucz8ubGVuZ3RoIHx8IDApID4gMCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdGV4dC1wcmltYXJ5IGZ3LW1lZGl1bSBweS0zIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXNwaW5uZXItZG90dGVkIHBpLXNwaW4gXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3snTG9hZGluZyBPcHRpb25zJ3x0cmFuc2xhdGV9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC1tdWx0aVNlbGVjdD5cbiAgPGFwcC1maWVsZC1lcnJvcnNcbiAgICBbY3VzdG9tRXJyb3JNZXNzYWdlc109XCJvcHRpb25zKCk/LmVycm9yTWVzc2FnZXMgfHwge31cIlxuICAgIFtjb250cm9sTmFtZV09XCJvcHRpb25zKCk/LmZvcm1Db250cm9sTmFtZVwiXG4gICAgW2Vycm9yc109XCJnZXRFcnJvcnMoKVwiXG4gICAgW2Vycm9yTWVzc2FnZV09XCJvcHRpb25zKCkuZXJyb3JNZXNzYWdlIHx8ICcnXCJcbiAgICBbc2hvd0Vycm9yc109XCIoX2Zvcm1Db250cm9sLmRpcnR5IHx8IF9mb3JtQ29udHJvbC50b3VjaGVkKSAmJiAhbG9hZGluZ09wdGlvbnNcIj48L2FwcC1maWVsZC1lcnJvcnM+XG48L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZW1wdHlUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgIEBpZiAobG9hZGluZ09wdGlvbnMpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3R5bGVDbGFzcz1cInctNHJlbSBoLTRyZW1cIj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICAgIDxwPnt7J0xvYWRpbmcgT3B0aW9ucyd8dHJhbnNsYXRlfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAobG9hZGluZ0Vycm9yKSB7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHA+e3snRmFpbGVkIHRvIGxvYWQgb3B0aW9ucy4nfHRyYW5zbGF0ZX19PC9wPlxuICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgbGFiZWw9XCJSZXRyeVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktcmVmcmVzaFwiXG4gICAgICAgICAgICAob25DbGljayk9XCJnZXRPcHRpb25zKClcIlxuICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWRhbmdlclwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt7J05vIE9wdGlvbnMgRm91bmQnfHRyYW5zbGF0ZX19XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLW11bHRpLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXRzbmctZm9ybS1mYWN0b3J5L3NyYy9saWIva2l0c25nLWZvcm0tZmFjdG9yeS9jb21wb25lbnRzL2tpdHNuZy1mb3JtLWZpZWxkcy9sb29rdXAtbXVsdGktc2VsZWN0L2xvb2t1cC1tdWx0aS1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0c25nLWZvcm0tZmFjdG9yeS9zcmMvbGliL2tpdHNuZy1mb3JtLWZhY3RvcnkvY29tcG9uZW50cy9raXRzbmctZm9ybS1maWVsZHMvbG9va3VwLW11bHRpLXNlbGVjdC9sb29rdXAtbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7OztBQVlsRSxNQUFNLE9BQU8sMEJBQTBCO0lBOENyQyxZQUFvQixpQkFBb0M7UUFBcEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQTdDeEQ7OztXQUdHO1FBQ0gsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUNqQjs7O1dBR0c7UUFDSCxZQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBTyxDQUFDO1FBRWhDOzs7V0FHRztRQUNPLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVqRCxnQkFBVyxHQUFHLE1BQU0sRUFLaEIsQ0FBQztRQUVMLG1CQUFjLEdBQUcsSUFB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QUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OEdBdlRVLDBCQUEwQjtrR0FBMUIsMEJBQTBCLGtvQkN4QnZDLHduSUFrR0E7OzJGRDFFYSwwQkFBMEI7a0JBSnRDLFNBQVM7K0JBQ0UseUJBQXlCO3NGQWMxQixLQUFLO3NCQUFiLEtBQUs7Z0JBS0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDRSxZQUFZO3NCQUFwQixLQUFLO2dCQTBCb0IsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBpbnB1dCxcbiAgY29tcHV0ZWQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBFdmVudEVtaXR0ZXIsXG4gIG91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbmFsaXplLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvb2t1cExpc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9sb29rdXAtbGlzdC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEtpdHNuZ0NvbnRyb2xGaWVsZE9wdGlvbnNNb2RlbCxcbiAgS2l0c25nRm9ybUZhY3RvcnlNb2RlbCxcbn0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMva2l0c25nLWZvcm0tZmFjdG9yeSc7XG5pbXBvcnQgeyBNdWx0aVNlbGVjdCB9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbG9va3VwLW11bHRpLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29rdXAtbXVsdGktc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTG9va3VwTXVsdGlTZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvKipcbiAgICogKiBHZW5lcmFsXG4gICAqIEBlcnJvcnMgRm9ybSBjb250cm9sIGVycm9yc1xuICAgKi9cbiAgZXJyb3JzOiBhbnkgPSB7fTtcbiAgLyoqXG4gICAqICogSW5wdXRzXG4gICAqIEBvcHRpb25zIENvbmZpZ3VyYXRpb24gZm9yIHRoaXMgZm9ybSBmaWVsZFxuICAgKi9cbiAgb3B0aW9ucyA9IGlucHV0LnJlcXVpcmVkPGFueT4oKTtcbiAgQElucHV0KCkgZmllbGQ6IGFueTtcbiAgLyoqXG4gICAqICogT3V0cHV0c1xuICAgKiBAaGFuZGxlQ2hhbmdlIEV2ZW50IHdoZW4gaXRlbSBpbiBkcm9wZG93biBpcyBzZWxlY3RlZFxuICAgKi9cbiAgQE91dHB1dCgpIGhhbmRsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoKSBfZm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDxhbnk+O1xuICBtb2RlbENoYW5nZSA9IG91dHB1dDx7XG4gICAgZXZlbnQ6IGFueTtcbiAgICBwYXJlbnRGb3JtR3JvdXA/OiBGb3JtR3JvdXA8YW55PiB8IEZvcm1BcnJheTxhbnk+IHwgbnVsbDtcbiAgICBzZWxlY3RlZE9wdGlvbj86IGFueTtcbiAgICBmaWVsZD86IEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWw7XG4gIH0+KCk7XG5cbiAgbG9hZGluZ09wdGlvbnMgPSB0cnVlO1xuICBsb2FkaW5nRXJyb3IgPSBmYWxzZTtcblxuICBwYWdlSW5kZXggPSAxO1xuICB0b3RhbEl0ZW1zID0gMDtcbiAgYWxsVG90YWxJdGVtcyA9IDA7XG5cbiAgZmlsdGVyV29yZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcbiAgZmlyc3RUaW1lID0gdHJ1ZTtcbiAgdGVtcE9wdGlvbnM6IGFueVtdID0gW107XG4gIC8qKlxuICAgKiAqIFNlbGVjdGVkIG9wdGlvbnMgKGZ1bGwgb2JqZWN0cykgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBzZWxlY3RlZCB2YWx1ZXNcbiAgICovXG4gIHNlbGVjdGVkT3B0aW9uczogYW55W10gPSBbXTtcblxuICBwcml2YXRlIF9maWx0ZXJPcHRpb25zOiBTdWJqZWN0PHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgZmlsdGVyT3B0aW9ucyQgPSB0aGlzLl9maWx0ZXJPcHRpb25zLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIEBWaWV3Q2hpbGQoJ211bHRpU2VsZWN0JykgbXVsdGlTZWxlY3QhOiBNdWx0aVNlbGVjdDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBsb29rdXBMaXN0U2VydmljZTogTG9va3VwTGlzdFNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zKCkudmFsdWUgPSB0aGlzLl9mb3JtQ29udHJvbC52YWx1ZTtcbiAgICB0aGlzLmdldE9wdGlvbnMoKTtcblxuICAgIHRoaXMuZmlsdGVyT3B0aW9ucyRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSg1MDApLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChmaWx0ZXIpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJXb3JkID0gZmlsdGVyO1xuICAgICAgICB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0RXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtQ29udHJvbC5lcnJvcnM7XG4gIH1cblxuICBuZ01vZGVsQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBsZXQgb3B0aW9uc0xpc3Q6IGFueVtdID0gW107XG4gICAgaWYgKFxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9PSAnJyB8fFxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9PSBudWxsIHx8XG4gICAgICB0aGlzLmZpbHRlcldvcmQgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgb3B0aW9uc0xpc3QgPSBbXG4gICAgICAgIC4uLnRoaXMudGVtcE9wdGlvbnMsXG4gICAgICAgIC4uLnRoaXMub3B0aW9ucygpPy5tdWx0aVNlbGVjdE9wdGlvbnMsXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zTGlzdCA9IHRoaXMub3B0aW9ucygpPy5tdWx0aVNlbGVjdE9wdGlvbnM7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSBldmVudD8ubWFwKChvcDogYW55KSA9PlxuICAgICAgb3B0aW9uc0xpc3QuZmluZChcbiAgICAgICAgKGNvOiBhbnkpID0+IGNvW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PSBvcFxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyB1cGRhdGUgc2VsZWN0ZWRPcHRpb25zIHByb3BlcnR5IHdpdGggdGhlIGZ1bGwgb3B0aW9uIG9iamVjdHNcbiAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucyA9IG9wdGlvbnMgPz8gW107XG5cbiAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQoe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgcGFyZW50Rm9ybUdyb3VwOiB0aGlzLl9mb3JtQ29udHJvbC5wYXJlbnQsXG4gICAgICBzZWxlY3RlZE9wdGlvbjogb3B0aW9ucyxcbiAgICAgIGZpZWxkOiB0aGlzLmZpZWxkLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucygpPy5uZ01vZGVsQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMoKT8ubmdNb2RlbENoYW5nZT8uKFxuICAgICAgICBldmVudCxcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRyb2wucGFyZW50IGFzIEZvcm1Hcm91cCxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgdGhpcy5maWVsZFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uT3B0aW9uQ2hhbmdlKG9wdGlvbnMpO1xuICB9XG5cbiAgb25PcHRpb25DaGFuZ2UoZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpPy5vbk9wdGlvblNlbGVjdGVkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMoKT8ub25PcHRpb25TZWxlY3RlZD8uKGUpO1xuICAgIH1cbiAgfVxuXG4gIG11bHRpU2VsZWN0T3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3B0aW9ucygpPy5tdWx0aVNlbGVjdE9wdGlvbnMgPz8gW10pO1xuXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgdGhpcy5sb2FkaW5nT3B0aW9ucyA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nRXJyb3IgPSBmYWxzZTtcblxuICAgIGxldCBxOiBhbnkgPSB7XG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcGFnZVNpemU6IHRoaXMub3B0aW9ucygpPy5wYWdlU2l6ZSA/PyAxMDAsXG4gICAgICAuLi4odGhpcy5vcHRpb25zKCk/LnF1ZXJ5ID8/IHt9KSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuZmlsdGVyV29yZCkgcVsnc2VhcmNoJ10gPSB0aGlzLmZpbHRlcldvcmQ7XG5cbiAgICB0aGlzLmxvb2t1cExpc3RTZXJ2aWNlXG4gICAgICAuZ2V0TG9va3VwTGlzdHM8YW55PihcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LmFwaUJhc2VVcmwhLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8uZW50aXR5ISxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHEsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5tb2R1bGUsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy52ZXJzaW9uLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8ucGF0aCA/PyAncGFnZScsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5tZW1vcnlDYWNoZSA/PyBmYWxzZVxuICAgICAgKVxuICAgICAgLnBpcGUoZmluYWxpemUoKCkgPT4gKHRoaXMubG9hZGluZ09wdGlvbnMgPSBmYWxzZSkpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlc3BvbnNlPy5kYXRhPy5wYWdlSW5mbz8udG90YWxJdGVtcztcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucyB8fCB0aGlzLnBhZ2VJbmRleCA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zLnB1c2goXG4gICAgICAgICAgICAuLi4ocmVzcG9uc2UuZGF0YT8uaXRlbXM/Lm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgICAgICAuLi5pdGVtLmt2LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkgPz8gW10pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zPy5sZW5ndGggPiAwICYmIHRoaXMuZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKCk/LnZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucygpPy52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFsbFRvdGFsSXRlbXMgPSByZXNwb25zZT8uZGF0YT8ucGFnZUluZm8/LnRvdGFsSXRlbXM7XG4gICAgICAgICAgICB0aGlzLmZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMgPSB0aGlzLmRlZHVwbGljYXRlKFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm11bHRpU2VsZWN0T3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5fZm9ybUNvbnRyb2w/LnZhbHVlICYmXG4gICAgICAgICAgICAodGhpcy5maWx0ZXJXb3JkID09ICcnIHx8XG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyV29yZCA9PSBudWxsIHx8XG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyV29yZCA9PSB1bmRlZmluZWQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVNlbGVjdGVkT3B0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyV29yZCkge1xuICAgICAgICAgICAgdGhpcy50ZW1wT3B0aW9ucyA9IHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZW1wT3B0aW9ucyA9IHRoaXMuZGVkdXBsaWNhdGUoW1xuICAgICAgICAgICAgICAuLi50aGlzLnRlbXBPcHRpb25zLFxuICAgICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMsXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucygpLm11bHRpU2VsZWN0T3B0aW9ucyA9IHRoaXMuZGVkdXBsaWNhdGUoW1xuICAgICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMsXG4gICAgICAgICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRPcHRpb25zXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5RHJvcGRvd25vcHRpb25zKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgb3B0aW9uczonLCBlcnIpO1xuICAgICAgICAgIHRoaXMubG9hZGluZ0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5tdWx0aVNlbGVjdD8ub3B0aW9ucykge1xuICAgICAgdGhpcy5tdWx0aVNlbGVjdC5vcHRpb25zID0gdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zO1xuICAgIH1cbiAgfVxuICBlbnN1cmVTZWxlY3RlZE9wdGlvbnMoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSB0aGlzLl9mb3JtQ29udHJvbC52YWx1ZSB8fCBbXTtcbiAgICBzZWxlY3RlZFZhbHVlcy5mb3JFYWNoKCh2YWw6IGFueSkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zPy5zb21lKFxuICAgICAgICAob3A6IGFueSkgPT4gb3BbdGhpcy5vcHRpb25zKCk/Lm9wdGlvblZhbHVlID8/ICdpZCddID09IHZhbFxuICAgICAgKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uQnlJZCh2YWwpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHBvcHVsYXRlIHNlbGVjdGVkT3B0aW9ucyB3aXRoIGFueSBjdXJyZW50bHkgYXZhaWxhYmxlIGZ1bGwgb3B0aW9uIG9iamVjdHNcbiAgICB0aGlzLnNlbGVjdGVkT3B0aW9ucyA9IChzZWxlY3RlZFZhbHVlcyB8fCBbXSlcbiAgICAgIC5tYXAoKHZhbDogYW55KSA9PlxuICAgICAgICB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnM/LmZpbmQoXG4gICAgICAgICAgKG9wOiBhbnkpID0+IG9wW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PSB2YWxcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLmZpbHRlcigobzogYW55KSA9PiAhIW8pO1xuICB9XG5cbiAgZ2V0T3B0aW9uQnlJZChpZDogYW55KSB7XG4gICAgdGhpcy5sb29rdXBMaXN0U2VydmljZVxuICAgICAgLmdldEJ5SWQoXG4gICAgICAgIGlkLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8uZW50aXR5ISxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm1vZHVsZSxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LnZlcnNpb24sXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlCYXNlVXJsXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAuLi52YWx1ZS5rdixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMsXG4gICAgICAgICAgXTtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU92ZXJsYXlEcm9wZG93bm9wdGlvbnMoKTtcbiAgICAgICAgICB0aGlzLnRlbXBPcHRpb25zID0gdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zO1xuICAgICAgICAgIC8vIHVwZGF0ZSBzZWxlY3RlZE9wdGlvbnMgaW4gY2FzZSB0aGlzIHdhcyBvbmUgb2YgdGhlIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zID0gKHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZSB8fCBbXSlcbiAgICAgICAgICAgIC5tYXAoKHZhbDogYW55KSA9PlxuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKG9wOiBhbnkpID0+IG9wW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PSB2YWxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmZpbHRlcigobzogYW55KSA9PiAhIW8pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG9uRmlsdGVyKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpbHRlcldvcmQgPSBldmVudC5maWx0ZXI7XG4gICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXIoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5maWx0ZXJXb3JkID09ICcnIHx8XG4gICAgICB0aGlzLmZpbHRlcldvcmQgPT0gbnVsbCB8fFxuICAgICAgdGhpcy5maWx0ZXJXb3JkID09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zID0gdGhpcy50ZW1wT3B0aW9ucztcbiAgICAgIHRoaXMudG90YWxJdGVtcyA9IHRoaXMuYWxsVG90YWxJdGVtcztcbiAgICAgIHRoaXMudXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmFsbFRvdGFsSXRlbXMgPiB0aGlzLnRlbXBPcHRpb25zLmxlbmd0aCB8fFxuICAgICAgKCF0aGlzLmFsbFRvdGFsSXRlbXMgJiYgdGhpcy5vcHRpb25zKCkucGF0aCAhPT0gJ2FsbCcpXG4gICAgKSB7XG4gICAgICB0aGlzLnBhZ2VJbmRleCA9IDE7XG4gICAgICB0aGlzLm9wdGlvbnMoKS5tdWx0aVNlbGVjdE9wdGlvbnMgPSBbXTtcbiAgICAgIHRoaXMubG9hZGluZ09wdGlvbnMgPSB0cnVlO1xuICAgICAgdGhpcy5fZmlsdGVyT3B0aW9ucy5uZXh0KHRoaXMuZmlsdGVyV29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleXdvcmQgPSAodGhpcy5maWx0ZXJXb3JkID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGZpbHRlckJ5ID0gdGhpcy5vcHRpb25zKCkuZmlsdGVyQnkgPz8gJ3RleHQnO1xuICAgICAgdGhpcy5vcHRpb25zKCkubXVsdGlTZWxlY3RPcHRpb25zID0gdGhpcy50ZW1wT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT57XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9uPy5bZmlsdGVyQnldO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgLmluY2x1ZGVzKGtleXdvcmQpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnVwZGF0ZU92ZXJsYXlEcm9wZG93bm9wdGlvbnMoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBkZWR1cGxpY2F0ZShhcnI6IGFueVtdKTogYW55W10ge1xuICAgIGNvbnN0IGtleSA9IHRoaXMub3B0aW9ucygpLm9wdGlvblZhbHVlID8/ICdpZCc7XG5cbiAgICByZXR1cm4gYXJyLmZpbHRlcihcbiAgICAgIChpdGVtLCBpbmRleCwgc2VsZikgPT5cbiAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KCh0KSA9PiB0W2tleV0gPT09IGl0ZW1ba2V5XSlcbiAgICApO1xuICB9XG4gIHJlc2V0RmlsdGVyKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSAnJyAmJlxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZmlsdGVyV29yZCA9ICcnO1xuICAgICAgdGhpcy5hcHBseUZpbHRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRNb3JlKCkge1xuICAgIHRoaXMucGFnZUluZGV4Kys7XG4gICAgdGhpcy5nZXRPcHRpb25zKCk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8YXBwLWZvcm0tZWxlbWVudC1sYXlvdXRcbiAgW29wdGlvbnNdPVwib3B0aW9ucygpXCJcbiAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgW2NvbnRyb2xUZW1wbGF0ZVJlZl09XCJjb250cm9sVGVtcGxhdGVcIlxuICBbZm9ybUNvbnRyb2xSZWZdPVwiX2Zvcm1Db250cm9sXCJcbj48L2FwcC1mb3JtLWVsZW1lbnQtbGF5b3V0PlxuPG5nLXRlbXBsYXRlICNjb250cm9sVGVtcGxhdGU+XG4gIDxwLW11bHRpU2VsZWN0XG4gICAgI211bHRpU2VsZWN0XG4gICAgW29wdGlvbnNdPVwibXVsdGlTZWxlY3RPcHRpb25zKClcIlxuICAgIFtwbGFjZWhvbGRlcl09XCIob3B0aW9ucygpLnBsYWNlaG9sZGVyPz8nJykgfCB0cmFuc2xhdGVcIlxuICAgIFtmb3JtQ29udHJvbF09XCJfZm9ybUNvbnRyb2xcIlxuICAgIFtvcHRpb25MYWJlbF09XCJvcHRpb25zKCkub3B0aW9uTGFiZWwgPz8gJ3RleHQnXCJcbiAgICBbb3B0aW9uVmFsdWVdPVwib3B0aW9ucygpLm9wdGlvblZhbHVlID8/ICdpZCdcIlxuICAgIFtvcHRpb25Hcm91cExhYmVsXT1cIm9wdGlvbnMoKS5vcHRpb25Hcm91cExhYmVsID8/ICd0ZXh0J1wiXG4gICAgW29wdGlvbkdyb3VwQ2hpbGRyZW5dPVwib3B0aW9ucygpLm9wdGlvbkdyb3VwQ2hpbGRyZW4gPz8gJ2l0ZW1zJ1wiXG4gICAgW2dyb3VwXT1cIm9wdGlvbnMoKS5ncm91cCA/PyBmYWxzZVwiXG4gICAgc3R5bGVDbGFzcz1cInt7b3B0aW9ucygpLmNsYXNzID8/ICd3LWZ1bGwnfX1cIlxuICAgIFtzaG93Q2xlYXJdPVwib3B0aW9ucygpLnNob3dDbGVhciA/PyBmYWxzZVwiXG4gICAgW2FwcGVuZFRvXT1cIm9wdGlvbnMoKS5hcHBlbmRUbyA/PyAnYm9keSdcIlxuICAgIFtmaWx0ZXJdPVwib3B0aW9ucygpLmZpbHRlciA/PyBmYWxzZVwiXG4gICAgW2ZpbHRlckJ5XT1cIm9wdGlvbnMoKS5maWx0ZXJCeSA/PyAndGV4dCdcIlxuICAgIFthdXRvZm9jdXNGaWx0ZXJdPVwib3B0aW9ucygpLmF1dG9mb2N1c0ZpbHRlciA/PyB0cnVlXCJcbiAgICBbYXV0b2ZvY3VzXT1cIm9wdGlvbnMoKS5hdXRvZm9jdXMgPz8gZmFsc2VcIlxuICAgIFtyZXNldEZpbHRlck9uSGlkZV09XCJ0cnVlXCJcbiAgICAob25QYW5lbEhpZGUpPVwicmVzZXRGaWx0ZXIoKVwiXG4gICAgKG9uRmlsdGVyKT1cIm9uRmlsdGVyKCRldmVudClcIlxuICAgIFtyZWFkb25seV09XCJvcHRpb25zKCkucmVhZG9ubHkgPz8gZmFsc2VcIlxuICAgIFtzaG93VG9nZ2xlQWxsXT1cIm9wdGlvbnMoKS5zaG93VG9nZ2xlQWxsID8/IGZhbHNlXCJcbiAgICBbbmdDbGFzc109XCJ7J25nLWludmFsaWQgbmctZGlydHknOiAoX2Zvcm1Db250cm9sLmVycm9ycyAmJiAoX2Zvcm1Db250cm9sLmRpcnR5IHx8IF9mb3JtQ29udHJvbC50b3VjaGVkKSAmJiAhbG9hZGluZ09wdGlvbnMpID8/IGZhbHNlfVwiXG4gICAgW2Rpc3BsYXldPVwib3B0aW9ucygpLmRpc3BsYXkgPz8gJ2NoaXAnXCJcbiAgICAobmdNb2RlbENoYW5nZSk9XCJuZ01vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICAgICAgQGlmIChvcHRpb25zKCkuZmlsdGVyICYmIG9wdGlvbnMoKS5maWx0ZXJUZW1wbGF0ZSkge1xuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiIGxldC1vcHRpb25zPVwib3B0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zKCkuZmlsdGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sOiBfZm9ybUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zKCksXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoOiBsb2FkTW9yZS5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiBfZm9ybUNvbnRyb2wucGFyZW50XG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVtcHR5VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICAgICAgICAgIEBpZiAoIWxvYWRpbmdPcHRpb25zKSB7XG4gICAgICAgICAgICAgIEBpZiAodG90YWxJdGVtcyA+ICh0ZW1wT3B0aW9ucy5sZW5ndGggfHwgMCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWxpbmtcIiBsYWJlbD1cIkxvYWQgTW9yZVwiIGljb249XCJwaSBwaS1zcGlubmVyXCIgKG9uQ2xpY2spPVwibG9hZE1vcmUoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBAaWYgKCFmaXJzdFRpbWUgJiYgKChtdWx0aVNlbGVjdD8ub3B0aW9ucz8ubGVuZ3RoIHx8IDApID4gMCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXIgdGV4dC1wcmltYXJ5IGZ3LW1lZGl1bSBweS0zIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLXNwaW5uZXItZG90dGVkIHBpLXNwaW4gXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3snTG9hZGluZyBPcHRpb25zJ3x0cmFuc2xhdGV9fS4uLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvcC1tdWx0aVNlbGVjdD5cbiAgPGFwcC1maWVsZC1lcnJvcnNcbiAgICBbY3VzdG9tRXJyb3JNZXNzYWdlc109XCJvcHRpb25zKCk/LmVycm9yTWVzc2FnZXMgfHwge31cIlxuICAgIFtjb250cm9sTmFtZV09XCJvcHRpb25zKCk/LmZvcm1Db250cm9sTmFtZVwiXG4gICAgW2Vycm9yc109XCJnZXRFcnJvcnMoKVwiXG4gICAgW2Vycm9yTWVzc2FnZV09XCJvcHRpb25zKCkuZXJyb3JNZXNzYWdlIHx8ICcnXCJcbiAgICBbc2hvd0Vycm9yc109XCIoX2Zvcm1Db250cm9sLmRpcnR5IHx8IF9mb3JtQ29udHJvbC50b3VjaGVkKSAmJiAhbG9hZGluZ09wdGlvbnNcIj48L2FwcC1maWVsZC1lcnJvcnM+XG48L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAjZW1wdHlUZW1wbGF0ZT5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgIEBpZiAobG9hZGluZ09wdGlvbnMpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cC1wcm9ncmVzc1NwaW5uZXIgc3R5bGVDbGFzcz1cInctNHJlbSBoLTRyZW1cIj48L3AtcHJvZ3Jlc3NTcGlubmVyPlxuICAgICAgICAgIDxwPnt7J0xvYWRpbmcgT3B0aW9ucyd8dHJhbnNsYXRlfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSBpZiAobG9hZGluZ0Vycm9yKSB7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHA+e3snRmFpbGVkIHRvIGxvYWQgb3B0aW9ucy4nfHRyYW5zbGF0ZX19PC9wPlxuICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgbGFiZWw9XCJSZXRyeVwiXG4gICAgICAgICAgICBpY29uPVwicGkgcGktcmVmcmVzaFwiXG4gICAgICAgICAgICAob25DbGljayk9XCJnZXRPcHRpb25zKClcIlxuICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWRhbmdlclwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxwPlxuICAgICAgICAgIHt7J05vIE9wdGlvbnMgRm91bmQnfHRyYW5zbGF0ZX19XG4gICAgICAgIDwvcD5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
@@ -5,13 +5,12 @@ import * as i1 from "../../../core/services/lookup-list.service";
|
|
|
5
5
|
import * as i2 from "primeng/api";
|
|
6
6
|
import * as i3 from "@angular/common";
|
|
7
7
|
import * as i4 from "@angular/forms";
|
|
8
|
-
import * as i5 from "primeng/
|
|
9
|
-
import * as i6 from "primeng/
|
|
10
|
-
import * as i7 from "primeng/
|
|
11
|
-
import * as i8 from "
|
|
12
|
-
import * as i9 from "../
|
|
13
|
-
import * as i10 from "
|
|
14
|
-
import * as i11 from "@ngx-translate/core";
|
|
8
|
+
import * as i5 from "primeng/dropdown";
|
|
9
|
+
import * as i6 from "primeng/button";
|
|
10
|
+
import * as i7 from "primeng/progressspinner";
|
|
11
|
+
import * as i8 from "../form-element-layout/form-element-layout.component";
|
|
12
|
+
import * as i9 from "../field-errors/field-errors.component";
|
|
13
|
+
import * as i10 from "@ngx-translate/core";
|
|
15
14
|
export class LookupSelectComponent {
|
|
16
15
|
constructor(lookupListService, messageService) {
|
|
17
16
|
this.lookupListService = lookupListService;
|
|
@@ -141,9 +140,8 @@ export class LookupSelectComponent {
|
|
|
141
140
|
},
|
|
142
141
|
});
|
|
143
142
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
this.filterWord = inputElement.value;
|
|
143
|
+
onFilter(event) {
|
|
144
|
+
this.filterWord = event.filter;
|
|
147
145
|
this.applyfilter();
|
|
148
146
|
}
|
|
149
147
|
mappOptions(items) {
|
|
@@ -314,11 +312,11 @@ export class LookupSelectComponent {
|
|
|
314
312
|
this.destroy$.complete();
|
|
315
313
|
}
|
|
316
314
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LookupSelectComponent, deps: [{ token: i1.LookupListService }, { token: i2.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
317
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LookupSelectComponent, selector: "app-lookup-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, field: { classPropertyName: "field", publicName: "field", isSignal: false, isRequired: false, transformFunction: null }, _formControl: { classPropertyName: "_formControl", publicName: "_formControl", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { modelChange: "modelChange", handleChange: "handleChange" }, viewQueries: [{ propertyName: "pdropdown", first: true, predicate: ["pdropdown"], descendants: true }], ngImport: i0, template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <div class=\"{{ options().showCopyButton ? 'd-flex flex align-items-center': '' }}\">\n <div class=\"{{ options().showCopyButton ? 'flex-1': '' }}\">\n <p-dropdown\n #pdropdown\n [options]=\"dropdownOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [resetFilterOnHide]=\"true\"\n (onHide)=\"resetFilter()\"\n [readonly]=\"options().readonly ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().itemTemplate) {\n <ng-template let-option pTemplate=\"item\">\n <ng-template\n [ngTemplateOutlet]=\"options().itemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: option,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().selectedItemTemplate) {\n <ng-template pTemplate=\"selectedItem\">\n <ng-template\n [ngTemplateOutlet]=\"options().selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: _formControl.value,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().filter) {\n <ng-template pTemplate=\"filter\">\n <ng-container *ngIf=\"options().filterTemplate; else defaultFilterTemplate\">\n <ng-template\n [ngTemplateOutlet]=\"options().filterTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: field,\n formControl: _formControl,\n options: options(),\n refresh: refresh.bind(this),\n formGroup: _formControl.parent,\n defaultTemplate: defaultFilterTemplate\n }\">\n </ng-template>\n </ng-container>\n <ng-template #defaultFilterTemplate>\n <div class=\"p-inputgroup\" style=\"width: 100%;\">\n <span class=\"p-inputgroup-addon\"><i class=\"pi pi-search\"></i></span>\n <input\n pInputText\n placeholder=\"Search Item\"\n [(ngModel)]=\"filterWord\"\n [ngModelOptions]=\"{standalone: true}\"\n (keyup)=\"filterOptions($event)\"\n style=\"width: 100%;\" />\n </div>\n </ng-template>\n </ng-template>\n }\n <ng-template pTemplate=\"empty\">\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n @if (!loadingOptions) {\n @if (totalItems > (tempOptions.length || 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center\">\n <p-button type=\"button\" styleClass=\"p-button-outlined p-button-link\" label=\"Load More\" icon=\"pi pi-spinner\" (onClick)=\"loadMore()\"></p-button>\n </div>\n }\n } @else {\n @if (!firstTime && ((pdropdown?.options?.length || 0) > 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center text-primary fw-medium py-3 gap-2\">\n <i class=\"pi pi-spinner-dotted pi-spin \"></i>\n <span>{{'Loading Options'|translate}}...</span>\n </div>\n }\n }\n </ng-template>\n </p-dropdown>\n </div>\n @if (options().showCopyButton) {\n <p-button\n icon=\"pi pi-copy\"\n styleClass=\"p-button-outlined p-button-info border-0\"\n (onClick)=\"copyToClipboard()\"\n [disabled]=\"!_formControl.value || _formControl.value === ''\">\n </p-button>\n }\n </div>\n <app-field-errors\n [customErrorMessages]=\"options()?.errorMessages || {}\"\n [controlName]=\"options()?.formControlName\"\n [errors]=\"getErrors()\"\n [errorMessage]=\"options().errorMessage || ''\"\n [showErrors]=\"(_formControl.dirty || _formControl.touched) && !loadingOptions\"></app-field-errors>\n </ng-template>\n\n <ng-template #emptyTemplate>\n <div class=\"text-center\">\n @if (loadingOptions) {\n <div>\n <p-progressSpinner styleClass=\"w-4rem h-4rem\"></p-progressSpinner>\n <p>{{'Loading Options'|translate}}</p>\n </div>\n } @else if (loadingError) {\n <div>\n <p>{{'Failed to load options.'|translate}}</p>\n <p-button\n label=\"Retry\"\n icon=\"pi pi-refresh\"\n (onClick)=\"getOptions()\"\n styleClass=\"p-button-outlined p-button-danger\" />\n </div>\n } @else {\n <p>\n {{'No Options Found'|translate}}\n </p>\n }\n </div>\n </ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i6.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i8.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i9.FormElementLayoutComponent, selector: "app-form-element-layout", inputs: ["options", "field", "controlTemplateRef", "formControlRef", "customTemplate"] }, { kind: "component", type: i10.FieldErrorsComponent, selector: "app-field-errors", inputs: ["errors", "errorMessage", "controlName", "customErrorMessages", "showErrors"] }, { kind: "pipe", type: i11.TranslatePipe, name: "translate" }] }); }
|
|
315
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: LookupSelectComponent, selector: "app-lookup-select", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, field: { classPropertyName: "field", publicName: "field", isSignal: false, isRequired: false, transformFunction: null }, _formControl: { classPropertyName: "_formControl", publicName: "_formControl", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { modelChange: "modelChange", handleChange: "handleChange" }, viewQueries: [{ propertyName: "pdropdown", first: true, predicate: ["pdropdown"], descendants: true }], ngImport: i0, template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <div class=\"{{ options().showCopyButton ? 'd-flex flex align-items-center': '' }}\">\n <div class=\"{{ options().showCopyButton ? 'flex-1': '' }}\">\n <p-dropdown\n #pdropdown\n [options]=\"dropdownOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [autofocusFilter]=\"options().autofocusFilter ?? true\"\n [autoDisplayFirst]=\"options().autoDisplayFirst ?? false\"\n [autofocus]=\"options().autofocus ?? false\"\n [resetFilterOnHide]=\"true\"\n (onHide)=\"resetFilter()\"\n (onFilter)=\"onFilter($event)\"\n [readonly]=\"options().readonly ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().itemTemplate) {\n <ng-template let-option pTemplate=\"item\">\n <ng-template\n [ngTemplateOutlet]=\"options().itemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: option,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().selectedItemTemplate) {\n <ng-template pTemplate=\"selectedItem\">\n <ng-template\n [ngTemplateOutlet]=\"options().selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: _formControl.value,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().filter && options().filterTemplate) {\n <ng-template pTemplate=\"filter\">\n <ng-template\n [ngTemplateOutlet]=\"options().filterTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: field,\n formControl: _formControl,\n options: options(),\n refresh: refresh.bind(this),\n formGroup: _formControl.parent\n }\">\n </ng-template>\n </ng-template>\n }\n <ng-template pTemplate=\"empty\">\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n @if (!loadingOptions) {\n @if (totalItems > (tempOptions.length || 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center\">\n <p-button type=\"button\" styleClass=\"p-button-outlined p-button-link\" label=\"Load More\" icon=\"pi pi-spinner\" (onClick)=\"loadMore()\"></p-button>\n </div>\n }\n } @else {\n @if (!firstTime && ((pdropdown?.options?.length || 0) > 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center text-primary fw-medium py-3 gap-2\">\n <i class=\"pi pi-spinner-dotted pi-spin \"></i>\n <span>{{'Loading Options'|translate}}...</span>\n </div>\n }\n }\n </ng-template>\n </p-dropdown>\n </div>\n @if (options().showCopyButton) {\n <p-button\n icon=\"pi pi-copy\"\n styleClass=\"p-button-outlined p-button-info border-0\"\n (onClick)=\"copyToClipboard()\"\n [disabled]=\"!_formControl.value || _formControl.value === ''\">\n </p-button>\n }\n </div>\n <app-field-errors\n [customErrorMessages]=\"options()?.errorMessages || {}\"\n [controlName]=\"options()?.formControlName\"\n [errors]=\"getErrors()\"\n [errorMessage]=\"options().errorMessage || ''\"\n [showErrors]=\"(_formControl.dirty || _formControl.touched) && !loadingOptions\"></app-field-errors>\n </ng-template>\n\n <ng-template #emptyTemplate>\n <div class=\"text-center\">\n @if (loadingOptions) {\n <div>\n <p-progressSpinner styleClass=\"w-4rem h-4rem\"></p-progressSpinner>\n <p>{{'Loading Options'|translate}}</p>\n </div>\n } @else if (loadingError) {\n <div>\n <p>{{'Failed to load options.'|translate}}</p>\n <p-button\n label=\"Retry\"\n icon=\"pi pi-refresh\"\n (onClick)=\"getOptions()\"\n styleClass=\"p-button-outlined p-button-danger\" />\n </div>\n } @else {\n <p>\n {{'No Options Found'|translate}}\n </p>\n }\n </div>\n </ng-template>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i6.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i7.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i8.FormElementLayoutComponent, selector: "app-form-element-layout", inputs: ["options", "field", "controlTemplateRef", "formControlRef", "customTemplate"] }, { kind: "component", type: i9.FieldErrorsComponent, selector: "app-field-errors", inputs: ["errors", "errorMessage", "controlName", "customErrorMessages", "showErrors"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
|
|
318
316
|
}
|
|
319
317
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: LookupSelectComponent, decorators: [{
|
|
320
318
|
type: Component,
|
|
321
|
-
args: [{ selector: 'app-lookup-select', template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <div class=\"{{ options().showCopyButton ? 'd-flex flex align-items-center': '' }}\">\n <div class=\"{{ options().showCopyButton ? 'flex-1': '' }}\">\n <p-dropdown\n #pdropdown\n [options]=\"dropdownOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [resetFilterOnHide]=\"true\"\n (onHide)=\"resetFilter()\"\n [readonly]=\"options().readonly ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().itemTemplate) {\n <ng-template let-option pTemplate=\"item\">\n <ng-template\n [ngTemplateOutlet]=\"options().itemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: option,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().selectedItemTemplate) {\n <ng-template pTemplate=\"selectedItem\">\n <ng-template\n [ngTemplateOutlet]=\"options().selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: _formControl.value,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().filter) {\n <ng-template pTemplate=\"filter\">\n <ng-
|
|
319
|
+
args: [{ selector: 'app-lookup-select', template: "<app-form-element-layout\n [options]=\"options()\"\n [field]=\"field\"\n [controlTemplateRef]=\"controlTemplate\"\n [formControlRef]=\"_formControl\"\n></app-form-element-layout>\n<ng-template #controlTemplate>\n <div class=\"{{ options().showCopyButton ? 'd-flex flex align-items-center': '' }}\">\n <div class=\"{{ options().showCopyButton ? 'flex-1': '' }}\">\n <p-dropdown\n #pdropdown\n [options]=\"dropdownOptions()\"\n [placeholder]=\"(options().placeholder??'') | translate\"\n [formControl]=\"_formControl\"\n [optionLabel]=\"options().optionLabel ?? 'text'\"\n [optionValue]=\"options().optionValue ?? 'id'\"\n [optionGroupLabel]=\"options().optionGroupLabel ?? 'text'\"\n [optionGroupChildren]=\"options().optionGroupChildren ?? 'items'\"\n [group]=\"options().group ?? false\"\n styleClass=\"{{options().class ?? 'w-full'}}\"\n [showClear]=\"options().showClear ?? false\"\n [appendTo]=\"options().appendTo ?? 'body'\"\n [filter]=\"options().filter ?? false\"\n [filterBy]=\"options().filterBy ?? 'text'\"\n [autofocusFilter]=\"options().autofocusFilter ?? true\"\n [autoDisplayFirst]=\"options().autoDisplayFirst ?? false\"\n [autofocus]=\"options().autofocus ?? false\"\n [resetFilterOnHide]=\"true\"\n (onHide)=\"resetFilter()\"\n (onFilter)=\"onFilter($event)\"\n [readonly]=\"options().readonly ?? false\"\n [ngClass]=\"{'ng-invalid ng-dirty': (_formControl.errors && (_formControl.dirty || _formControl.touched) && !loadingOptions) ?? false}\"\n (ngModelChange)=\"ngModelChange($event)\"\n >\n @if (options().itemTemplate) {\n <ng-template let-option pTemplate=\"item\">\n <ng-template\n [ngTemplateOutlet]=\"options().itemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: option,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().selectedItemTemplate) {\n <ng-template pTemplate=\"selectedItem\">\n <ng-template\n [ngTemplateOutlet]=\"options().selectedItemTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: _formControl.value,\n field: field,\n formControl: _formControl,\n options: options(),\n formGroup: _formControl.parent,\n }\">\n </ng-template>\n </ng-template>\n }\n @if (options().filter && options().filterTemplate) {\n <ng-template pTemplate=\"filter\">\n <ng-template\n [ngTemplateOutlet]=\"options().filterTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: field,\n formControl: _formControl,\n options: options(),\n refresh: refresh.bind(this),\n formGroup: _formControl.parent\n }\">\n </ng-template>\n </ng-template>\n }\n <ng-template pTemplate=\"empty\">\n <ng-template [ngTemplateOutlet]=\"emptyTemplate\"></ng-template>\n </ng-template>\n <ng-template pTemplate=\"footer\">\n @if (!loadingOptions) {\n @if (totalItems > (tempOptions.length || 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center\">\n <p-button type=\"button\" styleClass=\"p-button-outlined p-button-link\" label=\"Load More\" icon=\"pi pi-spinner\" (onClick)=\"loadMore()\"></p-button>\n </div>\n }\n } @else {\n @if (!firstTime && ((pdropdown?.options?.length || 0) > 0)) {\n <div class=\"flex d-flex align-items-center justify-content-center text-primary fw-medium py-3 gap-2\">\n <i class=\"pi pi-spinner-dotted pi-spin \"></i>\n <span>{{'Loading Options'|translate}}...</span>\n </div>\n }\n }\n </ng-template>\n </p-dropdown>\n </div>\n @if (options().showCopyButton) {\n <p-button\n icon=\"pi pi-copy\"\n styleClass=\"p-button-outlined p-button-info border-0\"\n (onClick)=\"copyToClipboard()\"\n [disabled]=\"!_formControl.value || _formControl.value === ''\">\n </p-button>\n }\n </div>\n <app-field-errors\n [customErrorMessages]=\"options()?.errorMessages || {}\"\n [controlName]=\"options()?.formControlName\"\n [errors]=\"getErrors()\"\n [errorMessage]=\"options().errorMessage || ''\"\n [showErrors]=\"(_formControl.dirty || _formControl.touched) && !loadingOptions\"></app-field-errors>\n </ng-template>\n\n <ng-template #emptyTemplate>\n <div class=\"text-center\">\n @if (loadingOptions) {\n <div>\n <p-progressSpinner styleClass=\"w-4rem h-4rem\"></p-progressSpinner>\n <p>{{'Loading Options'|translate}}</p>\n </div>\n } @else if (loadingError) {\n <div>\n <p>{{'Failed to load options.'|translate}}</p>\n <p-button\n label=\"Retry\"\n icon=\"pi pi-refresh\"\n (onClick)=\"getOptions()\"\n styleClass=\"p-button-outlined p-button-danger\" />\n </div>\n } @else {\n <p>\n {{'No Options Found'|translate}}\n </p>\n }\n </div>\n </ng-template>\n" }]
|
|
322
320
|
}], ctorParameters: () => [{ type: i1.LookupListService }, { type: i2.MessageService }], propDecorators: { field: [{
|
|
323
321
|
type: Input
|
|
324
322
|
}], _formControl: [{
|
|
@@ -329,4 +327,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
329
327
|
type: ViewChild,
|
|
330
328
|
args: ['pdropdown']
|
|
331
329
|
}] } });
|
|
332
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXRzbmctZm9ybS1mYWN0b3J5L3NyYy9saWIva2l0c25nLWZvcm0tZmFjdG9yeS9jb21wb25lbnRzL2tpdHNuZy1mb3JtLWZpZWxkcy9sb29rdXAtc2VsZWN0L2xvb2t1cC1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0c25nLWZvcm0tZmFjdG9yeS9zcmMvbGliL2tpdHNuZy1mb3JtLWZhY3RvcnkvY29tcG9uZW50cy9raXRzbmctZm9ybS1maWVsZHMvbG9va3VwLXNlbGVjdC9sb29rdXAtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUNULEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVbEUsTUFBTSxPQUFPLHFCQUFxQjtJQXdDaEMsWUFDVSxpQkFBb0MsRUFDcEMsY0FBOEI7UUFEOUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUF6Q3hDOzs7V0FHRztRQUNILFdBQU0sR0FBUSxFQUFFLENBQUM7UUFDakI7OztXQUdHO1FBQ0gsWUFBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQU8sQ0FBQztRQUdoQyxnQkFBVyxHQUFHLE1BQU0sRUFLaEIsQ0FBQztRQUNMOzs7V0FHRztRQUNPLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVqRCxjQUFT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LFVBQVU7cUJBQzdDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUM7cUJBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ2IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7d0JBQ3RCLFFBQVEsRUFBRSxPQUFPO3dCQUNqQixPQUFPLEVBQUUsT0FBTzt3QkFDaEIsTUFBTSxFQUFFLG1DQUFtQztxQkFDNUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOzhHQWpYVSxxQkFBcUI7a0dBQXJCLHFCQUFxQix3bkJDdEJsQywrME1Bb0pBOzsyRkQ5SGEscUJBQXFCO2tCQUpqQyxTQUFTOytCQUNFLG1CQUFtQjttSEFjcEIsS0FBSztzQkFBYixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBV0ksWUFBWTtzQkFBckIsTUFBTTtnQkFDaUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgVmlld0NoaWxkLFxuICBpbnB1dCxcbiAgY29tcHV0ZWQsXG4gIG91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbmFsaXplLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvb2t1cExpc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9sb29rdXAtbGlzdC5zZXJ2aWNlJztcbmltcG9ydCB7IERyb3Bkb3duIH0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9raXRzbmctZm9ybS1mYWN0b3J5JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxvb2t1cC1zZWxlY3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbG9va3VwLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIExvb2t1cFNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiAqIEdlbmVyYWxcbiAgICogQGVycm9ycyBGb3JtIGNvbnRyb2wgZXJyb3JzXG4gICAqL1xuICBlcnJvcnM6IGFueSA9IHt9O1xuICAvKipcbiAgICogKiBJbnB1dHNcbiAgICogQG9wdGlvbnMgQ29uZmlndXJhdGlvbiBmb3IgdGhpcyBmb3JtIGZpZWxkXG4gICAqL1xuICBvcHRpb25zID0gaW5wdXQucmVxdWlyZWQ8YW55PigpO1xuICBASW5wdXQoKSBmaWVsZDogYW55O1xuICBASW5wdXQoKSBfZm9ybUNvbnRyb2whOiBGb3JtQ29udHJvbDxhbnk+O1xuICBtb2RlbENoYW5nZSA9IG91dHB1dDx7XG4gICAgZXZlbnQ6IGFueTtcbiAgICBwYXJlbnRGb3JtR3JvdXA/OiBGb3JtR3JvdXA8YW55PiB8IEZvcm1BcnJheTxhbnk+IHwgbnVsbDtcbiAgICBzZWxlY3RlZE9wdGlvbj86IGFueTtcbiAgICBmaWVsZD86IEtpdHNuZ0Zvcm1GYWN0b3J5TW9kZWw7XG4gIH0+KCk7XG4gIC8qKlxuICAgKiAqIE91dHB1dHNcbiAgICogQGhhbmRsZUNoYW5nZSBFdmVudCB3aGVuIGl0ZW0gaW4gZHJvcGRvd24gaXMgc2VsZWN0ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBoYW5kbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQFZpZXdDaGlsZCgncGRyb3Bkb3duJykgcGRyb3Bkb3duITogRHJvcGRvd247XG4gIHBhZ2VJbmRleCA9IDE7XG4gIHRvdGFsSXRlbXMhOiBudW1iZXI7XG4gIGFsbFRvdGFsSXRlbXMhOiBudW1iZXI7XG4gIF9maWx0ZXJPcHRpb25zOiBTdWJqZWN0PHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgZmlsdGVyT3B0aW9ucyQgPSB0aGlzLl9maWx0ZXJPcHRpb25zLmFzT2JzZXJ2YWJsZSgpO1xuICBmaXJzdFRpbWUgPSB0cnVlO1xuICBmaWx0ZXJXb3JkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBsb2FkaW5nT3B0aW9ucyA9IHRydWU7XG4gIHRlbXBPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBjdXJyZW50T3B0aW9uOiBhbnk7XG4gIGRyb3Bkb3duT3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zKCk/LmRyb3Bkb3duT3B0aW9ucyA/PyBbXTtcbiAgfSk7XG4gIGxvYWRpbmdFcnJvciA9IGZhbHNlO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBsb29rdXBMaXN0U2VydmljZTogTG9va3VwTGlzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICogICAgICAgICAgICAgICAgSEVMUEVSU1xuICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucygpLnZhbHVlID0gdGhpcy5fZm9ybUNvbnRyb2wudmFsdWU7XG4gICAgdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgdGhpcy5maWx0ZXJPcHRpb25zJFxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDUwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZmlsdGVyKSA9PiB7XG4gICAgICAgICAgdGhpcy5maWx0ZXJXb3JkID0gZmlsdGVyO1xuICAgICAgICAgIHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cbiAgZ2V0RXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtQ29udHJvbC5lcnJvcnM7XG4gIH1cbiAgbmdNb2RlbENoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zKCk/LmRyb3Bkb3duT3B0aW9ucz8uZmluZChcbiAgICAgIChjbzogYW55KSA9PiBjb1t0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgPz8gJ2lkJ10gPT0gZXZlbnRcbiAgICApO1xuICAgIHRoaXMuY3VycmVudE9wdGlvbiA9IG9wdGlvbjtcbiAgICB0aGlzLm1vZGVsQ2hhbmdlLmVtaXQoe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgcGFyZW50Rm9ybUdyb3VwOiB0aGlzLl9mb3JtQ29udHJvbC5wYXJlbnQsXG4gICAgICBzZWxlY3RlZE9wdGlvbjogb3B0aW9uLFxuICAgICAgZmllbGQ6IHRoaXMuZmllbGQsXG4gICAgfSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpLm5nTW9kZWxDaGFuZ2UpIHtcbiAgICAgIHRoaXMub3B0aW9ucygpPy5uZ01vZGVsQ2hhbmdlPy4oXG4gICAgICAgIGV2ZW50LFxuICAgICAgICB0aGlzLl9mb3JtQ29udHJvbC5wYXJlbnQgYXMgRm9ybUdyb3VwLFxuICAgICAgICBvcHRpb24sXG4gICAgICAgIHRoaXMuZmllbGRcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMub25PcHRpb25DaGFuZ2UoKTtcbiAgfVxuXG4gIG9uT3B0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wdGlvbnMoKT8ub25PcHRpb25TZWxlY3RlZCkge1xuICAgICAgdGhpcy5vcHRpb25zKCk/Lm9uT3B0aW9uU2VsZWN0ZWQ/Lih0aGlzLmN1cnJlbnRPcHRpb24pO1xuICAgIH1cbiAgfVxuICBnZXRPcHRpb25zKCkge1xuICAgIHRoaXMubG9hZGluZ09wdGlvbnMgPSB0cnVlO1xuICAgIHRoaXMubG9hZGluZ0Vycm9yID0gZmFsc2U7XG4gICAgbGV0IHEgPSB7XG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcGFnZVNpemU6IHRoaXMub3B0aW9ucygpPy5wYWdlU2l6ZSA/PyAxMDAsXG4gICAgICAuLi4odGhpcy5vcHRpb25zKCkucXVlcnkgPz8ge30pLFxuICAgIH07XG4gICAgaWYgKFxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9ICcnICYmXG4gICAgICB0aGlzLmZpbHRlcldvcmQgIT0gbnVsbCAmJlxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcVsnc2VhcmNoJ10gPSB0aGlzLmZpbHRlcldvcmQ7XG4gICAgfVxuICAgIHRoaXMubG9va3VwTGlzdFNlcnZpY2VcbiAgICAgIC5nZXRMb29rdXBMaXN0czxhbnk+KFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8uYXBpQmFzZVVybCBhcyBzdHJpbmcsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5lbnRpdHkgYXMgc3RyaW5nLFxuICAgICAgICAodGhpcy5vcHRpb25zKCk/LmxvYWRMb29rdXBGcm9tU2Vzc2lvbiA/PyBmYWxzZSkgJiZcbiAgICAgICAgICB0aGlzLmZpcnN0VGltZSAmJlxuICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMub3B0aW9ucygpLnF1ZXJ5ID8/IHt9KS5sZW5ndGggPT09IDAsXG4gICAgICAgIHEsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5tb2R1bGUsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy52ZXJzaW9uLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8ucGF0aCA/PyAncGFnZScsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5tZW1vcnlDYWNoZSA/PyBmYWxzZSxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm1ldGhvZCB8fCAnUE9TVCcsXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlSZXNwb25zZU1hcHBlciB8fCBudWxsXG4gICAgICApXG4gICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nT3B0aW9ucyA9IGZhbHNlKSkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSByZXNwb25zZT8uZGF0YT8ucGFnZUluZm8/LnRvdGFsSXRlbXM7XG4gICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnMgfHwgdGhpcy5wYWdlSW5kZXggPT0gMSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucy5wdXNoKFxuICAgICAgICAgICAgLi4uKHRoaXMubWFwcE9wdGlvbnMocmVzcG9uc2UuZGF0YT8uaXRlbXMpID8/IFtdKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucz8ubGVuZ3RoID4gMCAmJiB0aGlzLmZpcnN0VGltZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucygpPy52YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLl9mb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLm9wdGlvbnMoKT8udmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hbGxUb3RhbEl0ZW1zID0gcmVzcG9uc2U/LmRhdGE/LnBhZ2VJbmZvPy50b3RhbEl0ZW1zO1xuICAgICAgICAgICAgdGhpcy5maXJzdFRpbWUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zID0gdGhpcy5kZWR1cGxpY2F0ZShcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucygpPy5kcm9wZG93bk9wdGlvbnNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghdGhpcy5maWx0ZXJXb3JkKSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBPcHRpb25zID0gdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBPcHRpb25zID0gdGhpcy5kZWR1cGxpY2F0ZShbXG4gICAgICAgICAgICAgIC4uLnRoaXMudGVtcE9wdGlvbnMsXG4gICAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU92ZXJsYXlEcm9wZG93bm9wdGlvbnMoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9mb3JtQ29udHJvbD8udmFsdWUgJiZcbiAgICAgICAgICAgICh0aGlzLmZpbHRlcldvcmQgPT0gJycgfHxcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJXb3JkID09IG51bGwgfHxcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJXb3JkID09IHVuZGVmaW5lZClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAoY286IGFueSkgPT5cbiAgICAgICAgICAgICAgICBjb1t0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgPz8gJ2lkJ10gPT1cbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtQ29udHJvbD8udmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLmdldE9wdGlvbk9mRGVmYXVsdFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9wdGlvbnM6JywgZXJyb3IpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cbiAgZmlsdGVyT3B0aW9ucyhldmVudDogYW55KSB7XG4gICAgY29uc3QgaW5wdXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgdGhpcy5maWx0ZXJXb3JkID0gaW5wdXRFbGVtZW50LnZhbHVlO1xuICAgIHRoaXMuYXBwbHlmaWx0ZXIoKTtcbiAgfVxuICBtYXBwT3B0aW9ucyhpdGVtczogYW55KXtcbiAgICBsZXQgbWFwcGVkSXRlbXMgPSBpdGVtcz8ubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIC4uLml0ZW0/Lmt2IHx8IHt9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkgPz8gW107XG4gICAgaWYodGhpcy5vcHRpb25zKCk/Lm1hcHBPcHRpb25zKXtcbiAgICAgICAgbWFwcGVkSXRlbXMgPSB0aGlzLm9wdGlvbnMoKT8ubWFwcE9wdGlvbnMobWFwcGVkSXRlbXMpIHx8IFsuLi5tYXBwZWRJdGVtc107XG4gICAgfVxuICAgIHJldHVybiBtYXBwZWRJdGVtcztcbiAgfVxuICBhcHBseWZpbHRlcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZpbHRlcldvcmQgPT0gJycgfHxcbiAgICAgIHRoaXMuZmlsdGVyV29yZCA9PSBudWxsIHx8XG4gICAgICB0aGlzLmZpbHRlcldvcmQgPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnMgPSB0aGlzLnRlbXBPcHRpb25zO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5hbGxUb3RhbEl0ZW1zO1xuICAgICAgdGhpcy51cGRhdGVPdmVybGF5RHJvcGRvd25vcHRpb25zKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuYWxsVG90YWxJdGVtcyA+IHRoaXMudGVtcE9wdGlvbnMubGVuZ3RoIHx8XG4gICAgICAoIXRoaXMuYWxsVG90YWxJdGVtcyAmJiB0aGlzLm9wdGlvbnMoKS5wYXRoICE9PSAnYWxsJylcbiAgICApIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMTtcbiAgICAgIHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucyA9IFtdO1xuICAgICAgdGhpcy5sb2FkaW5nT3B0aW9ucyA9IHRydWU7XG4gICAgICB0aGlzLl9maWx0ZXJPcHRpb25zLm5leHQodGhpcy5maWx0ZXJXb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qga2V5d29yZCA9ICh0aGlzLmZpbHRlcldvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLm9wdGlvbnMoKS5maWx0ZXJCeSA/PyAndGV4dCc7XG4gICAgICB0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnMgPSB0aGlzLnRlbXBPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PntcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb24/LltmaWx0ZXJCeV07XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuaW5jbHVkZXMoa2V5d29yZCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVkdXBsaWNhdGUoYXJyOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gYXJyPy5maWx0ZXIoKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgc2VsZjogYW55KSA9PlxuICAgICAgaW5kZXggPT09IHNlbGY/LmZpbmRJbmRleCgodDogYW55KSA9PiAodD8uaWQgPT09IGl0ZW0/LmlkKSlcbiAgICApO1xuICB9XG4gIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAxO1xuICAgIHRoaXMuZmlyc3RUaW1lID0gdHJ1ZTtcbiAgICB0aGlzLmFsbFRvdGFsSXRlbXMgPSAwO1xuICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zID0gW107XG4gICAgdGhpcy50ZW1wT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMudXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpO1xuICAgIHRoaXMuZ2V0T3B0aW9ucygpO1xuICB9XG4gIHJlc2V0RmlsdGVyKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSAnJyAmJlxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZmlsdGVyV29yZCA9ICcnO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5hbGxUb3RhbEl0ZW1zO1xuICAgICAgdGhpcy5hcHBseWZpbHRlcigpO1xuICAgIH1cbiAgfVxuICBsb2FkTW9yZSgpIHtcbiAgICB0aGlzLnBhZ2VJbmRleCsrO1xuICAgIHRoaXMuZ2V0T3B0aW9ucygpO1xuICB9XG4gIGdldE9wdGlvbk9mRGVmYXVsdFZhbHVlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRPcHRpb24pIHtcbiAgICAgIHRoaXMuYWRkQ3VycmVudE9wdGlvblRvTGlzdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm9wdGlvblZhbHVlID09PSAnaWQnIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5mb3JjZUdldE9wdGlvbkJ5SWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmdldE9wdGlvbkJ5SWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uQnlGaWx0ZXJBbGxMb29rdXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0T3B0aW9uQnlJZCgpIHtcbiAgICB0aGlzLmxvb2t1cExpc3RTZXJ2aWNlXG4gICAgICAuZ2V0QnlJZChcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRyb2w/LnZhbHVlLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8uZW50aXR5IGFzIHN0cmluZyxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm1vZHVsZSxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LnZlcnNpb24sXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlCYXNlVXJsXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb24gPSB0aGlzLm1hcHBPcHRpb25zKFt2YWx1ZV0pPy5bMF0gfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudE9wdGlvblRvTGlzdCgpO1xuICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlKHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cbiAgZ2V0T3B0aW9uQnlGaWx0ZXJBbGxMb29rdXAoKSB7XG4gICAgbGV0IHEgPSB7XG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcGFnZVNpemU6IHRoaXMub3B0aW9ucygpPy5wYWdlU2l6ZSA/PyAxMDAsXG4gICAgICAuLi4odGhpcy5vcHRpb25zKCkucXVlcnkgPz8ge30pLFxuICAgICAgZmlsdGVyczoge1xuICAgICAgICBbdGhpcy5vcHRpb25zKCk/Lm9wdGlvblZhbHVlID8/ICdpZCddOiB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmxvb2t1cExpc3RTZXJ2aWNlXG4gICAgICAuZ2V0TG9va3VwTGlzdHMoXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlCYXNlVXJsIGFzIHN0cmluZyxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LmVudGl0eSBhcyBzdHJpbmcsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBxLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8ubW9kdWxlLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8udmVyc2lvbixcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LnBhdGggPz8gJ2FsbCdcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAodmFsdWUpID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb24gPVxuICAgICAgICAgICAgdGhpcy5tYXBwT3B0aW9ucyh2YWx1ZS5kYXRhPy5pdGVtcylcbiAgICAgICAgICAgID8uZmluZCgoZWw6IGFueSk9PiBlbD8uW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PT0gdGhpcy5fZm9ybUNvbnRyb2w/LnZhbHVlKSB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb24gPSBvcHRpb247XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudE9wdGlvblRvTGlzdCgpO1xuICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UodGhpcy5fZm9ybUNvbnRyb2w/LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG4gIGFkZEN1cnJlbnRPcHRpb25Ub0xpc3QoKSB7XG4gICAgdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICAuLi50aGlzLmN1cnJlbnRPcHRpb24sXG4gICAgICAgIC4uLnRoaXMuY3VycmVudE9wdGlvbj8ua3YsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zLFxuICAgIF07XG4gICAgdGhpcy50ZW1wT3B0aW9ucyA9IHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucztcbiAgICB0aGlzLnVwZGF0ZU92ZXJsYXlEcm9wZG93bm9wdGlvbnMoKTtcbiAgfVxuICB1cGRhdGVPdmVybGF5RHJvcGRvd25vcHRpb25zKCkge1xuICAgIGlmICh0aGlzLnBkcm9wZG93bj8ub3B0aW9ucykge1xuICAgICAgdGhpcy5wZHJvcGRvd24ub3B0aW9ucyA9IHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucztcbiAgICB9XG4gIH1cbiAgY29weVRvQ2xpcGJvYXJkKCkge1xuICAgIGlmICh0aGlzLl9mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMoKT8uZHJvcGRvd25PcHRpb25zPy5maW5kKFxuICAgICAgICAoY286IGFueSkgPT5cbiAgICAgICAgICBjb1t0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgfHwgJ2lkJ10gPT0gdGhpcy5fZm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgY29uc3QgdGV4dFRvQ29weSA9XG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb24/LlsnQ29kZSddID8/XG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb25bdGhpcy5vcHRpb25zKCk/Lm9wdGlvbkxhYmVsIHx8ICd0ZXh0J107XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIGNsaXBib2FyZCBBUElcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgICAgICAgIC53cml0ZVRleHQodGV4dFRvQ29weSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgICAgICAgIHN1bW1hcnk6ICdzdWNjZXNzZnVsJyxcbiAgICAgICAgICAgICAgZGV0YWlsOiAnQ29waWVkIHRvIGNsaXBib2FyZDogJyArIHRleHRUb0NvcHksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICBzdW1tYXJ5OiAnRXJyb3InLFxuICAgICAgICAgICAgICBkZXRhaWw6ICdGYWlsZWQgdG8gY29weSB0ZXh0IHRvIGNsaXBib2FyZC4nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGFwcC1mb3JtLWVsZW1lbnQtbGF5b3V0XG4gIFtvcHRpb25zXT1cIm9wdGlvbnMoKVwiXG4gIFtmaWVsZF09XCJmaWVsZFwiXG4gIFtjb250cm9sVGVtcGxhdGVSZWZdPVwiY29udHJvbFRlbXBsYXRlXCJcbiAgW2Zvcm1Db250cm9sUmVmXT1cIl9mb3JtQ29udHJvbFwiXG4+PC9hcHAtZm9ybS1lbGVtZW50LWxheW91dD5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwie3sgb3B0aW9ucygpLnNob3dDb3B5QnV0dG9uID8gJ2QtZmxleCBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlcic6ICcnIH19XCI+XG4gICAgPGRpdiBjbGFzcz1cInt7IG9wdGlvbnMoKS5zaG93Q29weUJ1dHRvbiA/ICdmbGV4LTEnOiAnJyB9fVwiPlxuICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgI3Bkcm9wZG93blxuICAgICAgICBbb3B0aW9uc109XCJkcm9wZG93bk9wdGlvbnMoKVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCIob3B0aW9ucygpLnBsYWNlaG9sZGVyPz8nJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiX2Zvcm1Db250cm9sXCJcbiAgICAgICAgW29wdGlvbkxhYmVsXT1cIm9wdGlvbnMoKS5vcHRpb25MYWJlbCA/PyAndGV4dCdcIlxuICAgICAgICBbb3B0aW9uVmFsdWVdPVwib3B0aW9ucygpLm9wdGlvblZhbHVlID8/ICdpZCdcIlxuICAgICAgICBbb3B0aW9uR3JvdXBMYWJlbF09XCJvcHRpb25zKCkub3B0aW9uR3JvdXBMYWJlbCA/PyAndGV4dCdcIlxuICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJvcHRpb25zKCkub3B0aW9uR3JvdXBDaGlsZHJlbiA/PyAnaXRlbXMnXCJcbiAgICAgICAgW2dyb3VwXT1cIm9wdGlvbnMoKS5ncm91cCA/PyBmYWxzZVwiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJ7e29wdGlvbnMoKS5jbGFzcyA/PyAndy1mdWxsJ319XCJcbiAgICAgICAgW3Nob3dDbGVhcl09XCJvcHRpb25zKCkuc2hvd0NsZWFyID8/IGZhbHNlXCJcbiAgICAgICAgW2FwcGVuZFRvXT1cIm9wdGlvbnMoKS5hcHBlbmRUbyA/PyAnYm9keSdcIlxuICAgICAgICBbZmlsdGVyXT1cIm9wdGlvbnMoKS5maWx0ZXIgPz8gZmFsc2VcIlxuICAgICAgICBbZmlsdGVyQnldPVwib3B0aW9ucygpLmZpbHRlckJ5ID8/ICd0ZXh0J1wiXG4gICAgICAgIFtyZXNldEZpbHRlck9uSGlkZV09XCJ0cnVlXCJcbiAgICAgICAgKG9uSGlkZSk9XCJyZXNldEZpbHRlcigpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIm9wdGlvbnMoKS5yZWFkb25seSA/PyBmYWxzZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnbmctaW52YWxpZCBuZy1kaXJ0eSc6IChfZm9ybUNvbnRyb2wuZXJyb3JzICYmIChfZm9ybUNvbnRyb2wuZGlydHkgfHwgX2Zvcm1Db250cm9sLnRvdWNoZWQpICYmICFsb2FkaW5nT3B0aW9ucykgPz8gZmFsc2V9XCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibmdNb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICBAaWYgKG9wdGlvbnMoKS5pdGVtVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uIHBUZW1wbGF0ZT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnMoKS5pdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2w6IF9mb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zKCksXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiBfZm9ybUNvbnRyb2wucGFyZW50LFxuICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAob3B0aW9ucygpLnNlbGVjdGVkSXRlbVRlbXBsYXRlKSB7XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zKCkuc2VsZWN0ZWRJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IF9mb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2w6IF9mb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zKCksXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiBfZm9ybUNvbnRyb2wucGFyZW50LFxuICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAob3B0aW9ucygpLmZpbHRlcikge1xuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZpbHRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvcHRpb25zKCkuZmlsdGVyVGVtcGxhdGU7IGVsc2UgZGVmYXVsdEZpbHRlclRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnMoKS5maWx0ZXJUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBmaWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2w6IF9mb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoOiByZWZyZXNoLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogX2Zvcm1Db250cm9sLnBhcmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRlbXBsYXRlOiBkZWZhdWx0RmlsdGVyVGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RmlsdGVyVGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1pbnB1dGdyb3VwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInAtaW5wdXRncm91cC1hZGRvblwiPjxpIGNsYXNzPVwicGkgcGktc2VhcmNoXCI+PC9pPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIEl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJXb3JkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cImZpbHRlck9wdGlvbnMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVtcHR5VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICAgICAgICAgIEBpZiAoIWxvYWRpbmdPcHRpb25zKSB7XG4gICAgICAgICAgICAgIEBpZiAodG90YWxJdGVtcyA+ICh0ZW1wT3B0aW9ucy5sZW5ndGggfHwgMCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWxpbmtcIiBsYWJlbD1cIkxvYWQgTW9yZVwiIGljb249XCJwaSBwaS1zcGlubmVyXCIgKG9uQ2xpY2spPVwibG9hZE1vcmUoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBAaWYgKCFmaXJzdFRpbWUgJiYgKChwZHJvcGRvd24/Lm9wdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDApKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHRleHQtcHJpbWFyeSBmdy1tZWRpdW0gcHktMyBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zcGlubmVyLWRvdHRlZCBwaS1zcGluIFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7J0xvYWRpbmcgT3B0aW9ucyd8dHJhbnNsYXRlfX0uLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAob3B0aW9ucygpLnNob3dDb3B5QnV0dG9uKSB7XG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIGljb249XCJwaSBwaS1jb3B5XCJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24taW5mbyBib3JkZXItMFwiXG4gICAgICAgICAgKG9uQ2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhX2Zvcm1Db250cm9sLnZhbHVlIHx8IF9mb3JtQ29udHJvbC52YWx1ZSA9PT0gJydcIj5cbiAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8YXBwLWZpZWxkLWVycm9yc1xuICAgICAgW2N1c3RvbUVycm9yTWVzc2FnZXNdPVwib3B0aW9ucygpPy5lcnJvck1lc3NhZ2VzIHx8IHt9XCJcbiAgICAgIFtjb250cm9sTmFtZV09XCJvcHRpb25zKCk/LmZvcm1Db250cm9sTmFtZVwiXG4gICAgICBbZXJyb3JzXT1cImdldEVycm9ycygpXCJcbiAgICAgIFtlcnJvck1lc3NhZ2VdPVwib3B0aW9ucygpLmVycm9yTWVzc2FnZSB8fCAnJ1wiXG4gICAgICBbc2hvd0Vycm9yc109XCIoX2Zvcm1Db250cm9sLmRpcnR5IHx8IF9mb3JtQ29udHJvbC50b3VjaGVkKSAmJiAhbG9hZGluZ09wdGlvbnNcIj48L2FwcC1maWVsZC1lcnJvcnM+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICNlbXB0eVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgQGlmIChsb2FkaW5nT3B0aW9ucykge1xuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHlsZUNsYXNzPVwidy00cmVtIGgtNHJlbVwiPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgICAgPHA+e3snTG9hZGluZyBPcHRpb25zJ3x0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChsb2FkaW5nRXJyb3IpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD57eydGYWlsZWQgdG8gbG9hZCBvcHRpb25zLid8dHJhbnNsYXRlfX08L3A+XG4gICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICBsYWJlbD1cIlJldHJ5XCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1yZWZyZXNoXCJcbiAgICAgICAgICAgIChvbkNsaWNrKT1cImdldE9wdGlvbnMoKVwiXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHA+XG4gICAgICAgICAge3snTm8gT3B0aW9ucyBGb3VuZCd8dHJhbnNsYXRlfX1cbiAgICAgICAgPC9wPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuIl19
|
|
330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLXNlbGVjdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXRzbmctZm9ybS1mYWN0b3J5L3NyYy9saWIva2l0c25nLWZvcm0tZmFjdG9yeS9jb21wb25lbnRzL2tpdHNuZy1mb3JtLWZpZWxkcy9sb29rdXAtc2VsZWN0L2xvb2t1cC1zZWxlY3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0c25nLWZvcm0tZmFjdG9yeS9zcmMvbGliL2tpdHNuZy1mb3JtLWZhY3RvcnkvY29tcG9uZW50cy9raXRzbmctZm9ybS1maWVsZHMvbG9va3VwLXNlbGVjdC9sb29rdXAtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUNULEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7OztBQVVsRSxNQUFNLE9BQU8scUJBQXFCO0lBd0NoQyxZQUNVLGlCQUFvQyxFQUNwQyxjQUE4QjtRQUQ5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXpDeEM7OztXQUdHO1FBQ0gsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUNqQjs7O1dBR0c7UUFDSCxZQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBTyxDQUFDO1FBR2hDLGdCQUFXLEdBQUcsTUFBTSxFQUtoQixDQUFDO1FBQ0w7OztXQUdHO1FBQ08saUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRWpELGNBQVMs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RCxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQzt3QkFDdEIsUUFBUSxFQUFFLE9BQU87d0JBQ2pCLE9BQU8sRUFBRSxPQUFPO3dCQUNoQixNQUFNLEVBQUUsbUNBQW1DO3FCQUM1QyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7OEdBaFhVLHFCQUFxQjtrR0FBckIscUJBQXFCLHduQkN0QmxDLG13TEF5SUE7OzJGRG5IYSxxQkFBcUI7a0JBSmpDLFNBQVM7K0JBQ0UsbUJBQW1CO21IQWNwQixLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFXSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNpQixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQsXG4gIGlucHV0LFxuICBjb21wdXRlZCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmluYWxpemUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9va3VwTGlzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2xvb2t1cC1saXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJvcGRvd24gfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgS2l0c25nRm9ybUZhY3RvcnlNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2tpdHNuZy1mb3JtLWZhY3RvcnknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbG9va3VwLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9sb29rdXAtc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTG9va3VwU2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqICogR2VuZXJhbFxuICAgKiBAZXJyb3JzIEZvcm0gY29udHJvbCBlcnJvcnNcbiAgICovXG4gIGVycm9yczogYW55ID0ge307XG4gIC8qKlxuICAgKiAqIElucHV0c1xuICAgKiBAb3B0aW9ucyBDb25maWd1cmF0aW9uIGZvciB0aGlzIGZvcm0gZmllbGRcbiAgICovXG4gIG9wdGlvbnMgPSBpbnB1dC5yZXF1aXJlZDxhbnk+KCk7XG4gIEBJbnB1dCgpIGZpZWxkOiBhbnk7XG4gIEBJbnB1dCgpIF9mb3JtQ29udHJvbCE6IEZvcm1Db250cm9sPGFueT47XG4gIG1vZGVsQ2hhbmdlID0gb3V0cHV0PHtcbiAgICBldmVudDogYW55O1xuICAgIHBhcmVudEZvcm1Hcm91cD86IEZvcm1Hcm91cDxhbnk+IHwgRm9ybUFycmF5PGFueT4gfCBudWxsO1xuICAgIHNlbGVjdGVkT3B0aW9uPzogYW55O1xuICAgIGZpZWxkPzogS2l0c25nRm9ybUZhY3RvcnlNb2RlbDtcbiAgfT4oKTtcbiAgLyoqXG4gICAqICogT3V0cHV0c1xuICAgKiBAaGFuZGxlQ2hhbmdlIEV2ZW50IHdoZW4gaXRlbSBpbiBkcm9wZG93biBpcyBzZWxlY3RlZFxuICAgKi9cbiAgQE91dHB1dCgpIGhhbmRsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAVmlld0NoaWxkKCdwZHJvcGRvd24nKSBwZHJvcGRvd24hOiBEcm9wZG93bjtcbiAgcGFnZUluZGV4ID0gMTtcbiAgdG90YWxJdGVtcyE6IG51bWJlcjtcbiAgYWxsVG90YWxJdGVtcyE6IG51bWJlcjtcbiAgX2ZpbHRlck9wdGlvbnM6IFN1YmplY3Q8c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD4gPSBuZXcgU3ViamVjdCgpO1xuICBmaWx0ZXJPcHRpb25zJCA9IHRoaXMuX2ZpbHRlck9wdGlvbnMuYXNPYnNlcnZhYmxlKCk7XG4gIGZpcnN0VGltZSA9IHRydWU7XG4gIGZpbHRlcldvcmQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIGxvYWRpbmdPcHRpb25zID0gdHJ1ZTtcbiAgdGVtcE9wdGlvbnM6IGFueVtdID0gW107XG4gIGN1cnJlbnRPcHRpb246IGFueTtcbiAgZHJvcGRvd25PcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMoKT8uZHJvcGRvd25PcHRpb25zID8/IFtdO1xuICB9KTtcbiAgbG9hZGluZ0Vycm9yID0gZmFsc2U7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGxvb2t1cExpc3RTZXJ2aWNlOiBMb29rdXBMaXN0U2VydmljZSxcbiAgICBwcml2YXRlIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZVxuICApIHt9XG5cbiAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgKiAgICAgICAgICAgICAgICBIRUxQRVJTXG4gICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zKCkudmFsdWUgPSB0aGlzLl9mb3JtQ29udHJvbC52YWx1ZTtcbiAgICB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICB0aGlzLmZpbHRlck9wdGlvbnMkXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUoNTAwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChmaWx0ZXIpID0+IHtcbiAgICAgICAgICB0aGlzLmZpbHRlcldvcmQgPSBmaWx0ZXI7XG4gICAgICAgICAgdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuICBnZXRFcnJvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1Db250cm9sLmVycm9ycztcbiAgfVxuICBuZ01vZGVsQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCBvcHRpb24gPSB0aGlzLm9wdGlvbnMoKT8uZHJvcGRvd25PcHRpb25zPy5maW5kKFxuICAgICAgKGNvOiBhbnkpID0+IGNvW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PSBldmVudFxuICAgICk7XG4gICAgdGhpcy5jdXJyZW50T3B0aW9uID0gb3B0aW9uO1xuICAgIHRoaXMubW9kZWxDaGFuZ2UuZW1pdCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBwYXJlbnRGb3JtR3JvdXA6IHRoaXMuX2Zvcm1Db250cm9sLnBhcmVudCxcbiAgICAgIHNlbGVjdGVkT3B0aW9uOiBvcHRpb24sXG4gICAgICBmaWVsZDogdGhpcy5maWVsZCxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5vcHRpb25zKCkubmdNb2RlbENoYW5nZSkge1xuICAgICAgdGhpcy5vcHRpb25zKCk/Lm5nTW9kZWxDaGFuZ2U/LihcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRoaXMuX2Zvcm1Db250cm9sLnBhcmVudCBhcyBGb3JtR3JvdXAsXG4gICAgICAgIG9wdGlvbixcbiAgICAgICAgdGhpcy5maWVsZFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5vbk9wdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgb25PcHRpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9ucygpPy5vbk9wdGlvblNlbGVjdGVkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMoKT8ub25PcHRpb25TZWxlY3RlZD8uKHRoaXMuY3VycmVudE9wdGlvbik7XG4gICAgfVxuICB9XG4gIGdldE9wdGlvbnMoKSB7XG4gICAgdGhpcy5sb2FkaW5nT3B0aW9ucyA9IHRydWU7XG4gICAgdGhpcy5sb2FkaW5nRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgcSA9IHtcbiAgICAgIHBhZ2VJbmRleDogdGhpcy5wYWdlSW5kZXgsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5vcHRpb25zKCk/LnBhZ2VTaXplID8/IDEwMCxcbiAgICAgIC4uLih0aGlzLm9wdGlvbnMoKS5xdWVyeSA/PyB7fSksXG4gICAgfTtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZpbHRlcldvcmQgIT0gJycgJiZcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSBudWxsICYmXG4gICAgICB0aGlzLmZpbHRlcldvcmQgIT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBxWydzZWFyY2gnXSA9IHRoaXMuZmlsdGVyV29yZDtcbiAgICB9XG4gICAgdGhpcy5sb29rdXBMaXN0U2VydmljZVxuICAgICAgLmdldExvb2t1cExpc3RzPGFueT4oXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlCYXNlVXJsIGFzIHN0cmluZyxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LmVudGl0eSBhcyBzdHJpbmcsXG4gICAgICAgICh0aGlzLm9wdGlvbnMoKT8ubG9hZExvb2t1cEZyb21TZXNzaW9uID8/IGZhbHNlKSAmJlxuICAgICAgICAgIHRoaXMuZmlyc3RUaW1lICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5vcHRpb25zKCkucXVlcnkgPz8ge30pLmxlbmd0aCA9PT0gMCxcbiAgICAgICAgcSxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm1vZHVsZSxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LnZlcnNpb24sXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5wYXRoID8/ICdwYWdlJyxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm1lbW9yeUNhY2hlID8/IGZhbHNlLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8ubWV0aG9kIHx8ICdQT1NUJyxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LmFwaVJlc3BvbnNlTWFwcGVyIHx8IG51bGxcbiAgICAgIClcbiAgICAgIC5waXBlKGZpbmFsaXplKCgpID0+ICh0aGlzLmxvYWRpbmdPcHRpb25zID0gZmFsc2UpKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudG90YWxJdGVtcyA9IHJlc3BvbnNlPy5kYXRhPy5wYWdlSW5mbz8udG90YWxJdGVtcztcbiAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucyB8fCB0aGlzLnBhZ2VJbmRleCA9PSAxKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zLnB1c2goXG4gICAgICAgICAgICAuLi4odGhpcy5tYXBwT3B0aW9ucyhyZXNwb25zZS5kYXRhPy5pdGVtcykgPz8gW10pXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zPy5sZW5ndGggPiAwICYmIHRoaXMuZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKCk/LnZhbHVlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2Zvcm1Db250cm9sLnNldFZhbHVlKHRoaXMub3B0aW9ucygpPy52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFsbFRvdGFsSXRlbXMgPSByZXNwb25zZT8uZGF0YT8ucGFnZUluZm8/LnRvdGFsSXRlbXM7XG4gICAgICAgICAgICB0aGlzLmZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnMgPSB0aGlzLmRlZHVwbGljYXRlKFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zKCk/LmRyb3Bkb3duT3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcldvcmQpIHtcbiAgICAgICAgICAgIHRoaXMudGVtcE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGVtcE9wdGlvbnMgPSB0aGlzLmRlZHVwbGljYXRlKFtcbiAgICAgICAgICAgICAgLi4udGhpcy50ZW1wT3B0aW9ucyxcbiAgICAgICAgICAgICAgLi4udGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZSAmJlxuICAgICAgICAgICAgKHRoaXMuZmlsdGVyV29yZCA9PSAnJyB8fFxuICAgICAgICAgICAgICB0aGlzLmZpbHRlcldvcmQgPT0gbnVsbCB8fFxuICAgICAgICAgICAgICB0aGlzLmZpbHRlcldvcmQgPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zLmZpbmQoXG4gICAgICAgICAgICAgIChjbzogYW55KSA9PlxuICAgICAgICAgICAgICAgIGNvW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PVxuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9uKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uT2ZEZWZhdWx0VmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdFcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgb3B0aW9uczonLCBlcnJvcik7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgfVxuICBvbkZpbHRlcihldmVudDogYW55KSB7XG4gICAgdGhpcy5maWx0ZXJXb3JkID0gZXZlbnQuZmlsdGVyO1xuICAgIHRoaXMuYXBwbHlmaWx0ZXIoKTtcbiAgfVxuICBtYXBwT3B0aW9ucyhpdGVtczogYW55KXtcbiAgICBsZXQgbWFwcGVkSXRlbXMgPSBpdGVtcz8ubWFwKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgIC4uLml0ZW0/Lmt2IHx8IHt9LFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkgPz8gW107XG4gICAgaWYodGhpcy5vcHRpb25zKCk/Lm1hcHBPcHRpb25zKXtcbiAgICAgICAgbWFwcGVkSXRlbXMgPSB0aGlzLm9wdGlvbnMoKT8ubWFwcE9wdGlvbnMobWFwcGVkSXRlbXMpIHx8IFsuLi5tYXBwZWRJdGVtc107XG4gICAgfVxuICAgIHJldHVybiBtYXBwZWRJdGVtcztcbiAgfVxuICBhcHBseWZpbHRlcigpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmZpbHRlcldvcmQgPT0gJycgfHxcbiAgICAgIHRoaXMuZmlsdGVyV29yZCA9PSBudWxsIHx8XG4gICAgICB0aGlzLmZpbHRlcldvcmQgPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnMgPSB0aGlzLnRlbXBPcHRpb25zO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5hbGxUb3RhbEl0ZW1zO1xuICAgICAgdGhpcy51cGRhdGVPdmVybGF5RHJvcGRvd25vcHRpb25zKCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuYWxsVG90YWxJdGVtcyA+IHRoaXMudGVtcE9wdGlvbnMubGVuZ3RoIHx8XG4gICAgICAoIXRoaXMuYWxsVG90YWxJdGVtcyAmJiB0aGlzLm9wdGlvbnMoKS5wYXRoICE9PSAnYWxsJylcbiAgICApIHtcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gMTtcbiAgICAgIHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucyA9IFtdO1xuICAgICAgdGhpcy5sb2FkaW5nT3B0aW9ucyA9IHRydWU7XG4gICAgICB0aGlzLl9maWx0ZXJPcHRpb25zLm5leHQodGhpcy5maWx0ZXJXb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qga2V5d29yZCA9ICh0aGlzLmZpbHRlcldvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLm9wdGlvbnMoKS5maWx0ZXJCeSA/PyAndGV4dCc7XG4gICAgICB0aGlzLm9wdGlvbnMoKS5kcm9wZG93bk9wdGlvbnMgPSB0aGlzLnRlbXBPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PntcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb24/LltmaWx0ZXJCeV07XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAuaW5jbHVkZXMoa2V5d29yZCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZGVkdXBsaWNhdGUoYXJyOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gYXJyPy5maWx0ZXIoKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgc2VsZjogYW55KSA9PlxuICAgICAgaW5kZXggPT09IHNlbGY/LmZpbmRJbmRleCgodDogYW55KSA9PiAodD8uaWQgPT09IGl0ZW0/LmlkKSlcbiAgICApO1xuICB9XG4gIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5wYWdlSW5kZXggPSAxO1xuICAgIHRoaXMuZmlyc3RUaW1lID0gdHJ1ZTtcbiAgICB0aGlzLmFsbFRvdGFsSXRlbXMgPSAwO1xuICAgIHRoaXMudG90YWxJdGVtcyA9IDA7XG4gICAgdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zID0gW107XG4gICAgdGhpcy50ZW1wT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMudXBkYXRlT3ZlcmxheURyb3Bkb3dub3B0aW9ucygpO1xuICAgIHRoaXMuZ2V0T3B0aW9ucygpO1xuICB9XG4gIHJlc2V0RmlsdGVyKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSAnJyAmJlxuICAgICAgdGhpcy5maWx0ZXJXb3JkICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZmlsdGVyV29yZCAhPSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRoaXMuZmlsdGVyV29yZCA9ICcnO1xuICAgICAgdGhpcy50b3RhbEl0ZW1zID0gdGhpcy5hbGxUb3RhbEl0ZW1zO1xuICAgICAgdGhpcy5hcHBseWZpbHRlcigpO1xuICAgIH1cbiAgfVxuICBsb2FkTW9yZSgpIHtcbiAgICB0aGlzLnBhZ2VJbmRleCsrO1xuICAgIHRoaXMuZ2V0T3B0aW9ucygpO1xuICB9XG4gIGdldE9wdGlvbk9mRGVmYXVsdFZhbHVlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRPcHRpb24pIHtcbiAgICAgIHRoaXMuYWRkQ3VycmVudE9wdGlvblRvTGlzdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgfHxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm9wdGlvblZhbHVlID09PSAnaWQnIHx8XG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5mb3JjZUdldE9wdGlvbkJ5SWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmdldE9wdGlvbkJ5SWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ2V0T3B0aW9uQnlGaWx0ZXJBbGxMb29rdXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0T3B0aW9uQnlJZCgpIHtcbiAgICB0aGlzLmxvb2t1cExpc3RTZXJ2aWNlXG4gICAgICAuZ2V0QnlJZChcbiAgICAgICAgdGhpcy5fZm9ybUNvbnRyb2w/LnZhbHVlLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8uZW50aXR5IGFzIHN0cmluZyxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/Lm1vZHVsZSxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LnZlcnNpb24sXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlCYXNlVXJsXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb24gPSB0aGlzLm1hcHBPcHRpb25zKFt2YWx1ZV0pPy5bMF0gfHwgbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudE9wdGlvblRvTGlzdCgpO1xuICAgICAgICAgICAgdGhpcy5uZ01vZGVsQ2hhbmdlKHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cbiAgZ2V0T3B0aW9uQnlGaWx0ZXJBbGxMb29rdXAoKSB7XG4gICAgbGV0IHEgPSB7XG4gICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgcGFnZVNpemU6IHRoaXMub3B0aW9ucygpPy5wYWdlU2l6ZSA/PyAxMDAsXG4gICAgICAuLi4odGhpcy5vcHRpb25zKCkucXVlcnkgPz8ge30pLFxuICAgICAgZmlsdGVyczoge1xuICAgICAgICBbdGhpcy5vcHRpb25zKCk/Lm9wdGlvblZhbHVlID8/ICdpZCddOiB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuX2Zvcm1Db250cm9sPy52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmxvb2t1cExpc3RTZXJ2aWNlXG4gICAgICAuZ2V0TG9va3VwTGlzdHMoXG4gICAgICAgIHRoaXMub3B0aW9ucygpPy5hcGlCYXNlVXJsIGFzIHN0cmluZyxcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LmVudGl0eSBhcyBzdHJpbmcsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBxLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8ubW9kdWxlLFxuICAgICAgICB0aGlzLm9wdGlvbnMoKT8udmVyc2lvbixcbiAgICAgICAgdGhpcy5vcHRpb25zKCk/LnBhdGggPz8gJ2FsbCdcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAodmFsdWUpID0+IHtcbiAgICAgICAgICBjb25zdCBvcHRpb24gPVxuICAgICAgICAgICAgdGhpcy5tYXBwT3B0aW9ucyh2YWx1ZS5kYXRhPy5pdGVtcylcbiAgICAgICAgICAgID8uZmluZCgoZWw6IGFueSk9PiBlbD8uW3RoaXMub3B0aW9ucygpPy5vcHRpb25WYWx1ZSA/PyAnaWQnXSA9PT0gdGhpcy5fZm9ybUNvbnRyb2w/LnZhbHVlKSB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcHRpb24gPSBvcHRpb247XG4gICAgICAgICAgICAgIHRoaXMuYWRkQ3VycmVudE9wdGlvblRvTGlzdCgpO1xuICAgICAgICAgICAgICB0aGlzLm5nTW9kZWxDaGFuZ2UodGhpcy5fZm9ybUNvbnRyb2w/LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG4gIGFkZEN1cnJlbnRPcHRpb25Ub0xpc3QoKSB7XG4gICAgdGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICAuLi50aGlzLmN1cnJlbnRPcHRpb24sXG4gICAgICAgIC4uLnRoaXMuY3VycmVudE9wdGlvbj8ua3YsXG4gICAgICB9LFxuICAgICAgLi4udGhpcy5vcHRpb25zKCkuZHJvcGRvd25PcHRpb25zLFxuICAgIF07XG4gICAgdGhpcy50ZW1wT3B0aW9ucyA9IHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucztcbiAgICB0aGlzLnVwZGF0ZU92ZXJsYXlEcm9wZG93bm9wdGlvbnMoKTtcbiAgfVxuICB1cGRhdGVPdmVybGF5RHJvcGRvd25vcHRpb25zKCkge1xuICAgIGlmICh0aGlzLnBkcm9wZG93bj8ub3B0aW9ucykge1xuICAgICAgdGhpcy5wZHJvcGRvd24ub3B0aW9ucyA9IHRoaXMub3B0aW9ucygpLmRyb3Bkb3duT3B0aW9ucztcbiAgICB9XG4gIH1cbiAgY29weVRvQ2xpcGJvYXJkKCkge1xuICAgIGlmICh0aGlzLl9mb3JtQ29udHJvbC52YWx1ZSkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSB0aGlzLm9wdGlvbnMoKT8uZHJvcGRvd25PcHRpb25zPy5maW5kKFxuICAgICAgICAoY286IGFueSkgPT5cbiAgICAgICAgICBjb1t0aGlzLm9wdGlvbnMoKT8ub3B0aW9uVmFsdWUgfHwgJ2lkJ10gPT0gdGhpcy5fZm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICk7XG4gICAgICBpZiAoc2VsZWN0ZWRPcHRpb24pIHtcbiAgICAgICAgY29uc3QgdGV4dFRvQ29weSA9XG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb24/LlsnQ29kZSddID8/XG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb25bdGhpcy5vcHRpb25zKCk/Lm9wdGlvbkxhYmVsIHx8ICd0ZXh0J107XG4gICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIGNsaXBib2FyZCBBUElcbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgICAgICAgIC53cml0ZVRleHQodGV4dFRvQ29weSlcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgICAgICAgIHN1bW1hcnk6ICdzdWNjZXNzZnVsJyxcbiAgICAgICAgICAgICAgZGV0YWlsOiAnQ29waWVkIHRvIGNsaXBib2FyZDogJyArIHRleHRUb0NvcHksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICBzdW1tYXJ5OiAnRXJyb3InLFxuICAgICAgICAgICAgICBkZXRhaWw6ICdGYWlsZWQgdG8gY29weSB0ZXh0IHRvIGNsaXBib2FyZC4nLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGFwcC1mb3JtLWVsZW1lbnQtbGF5b3V0XG4gIFtvcHRpb25zXT1cIm9wdGlvbnMoKVwiXG4gIFtmaWVsZF09XCJmaWVsZFwiXG4gIFtjb250cm9sVGVtcGxhdGVSZWZdPVwiY29udHJvbFRlbXBsYXRlXCJcbiAgW2Zvcm1Db250cm9sUmVmXT1cIl9mb3JtQ29udHJvbFwiXG4+PC9hcHAtZm9ybS1lbGVtZW50LWxheW91dD5cbjxuZy10ZW1wbGF0ZSAjY29udHJvbFRlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwie3sgb3B0aW9ucygpLnNob3dDb3B5QnV0dG9uID8gJ2QtZmxleCBmbGV4IGFsaWduLWl0ZW1zLWNlbnRlcic6ICcnIH19XCI+XG4gICAgPGRpdiBjbGFzcz1cInt7IG9wdGlvbnMoKS5zaG93Q29weUJ1dHRvbiA/ICdmbGV4LTEnOiAnJyB9fVwiPlxuICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgI3Bkcm9wZG93blxuICAgICAgICBbb3B0aW9uc109XCJkcm9wZG93bk9wdGlvbnMoKVwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCIob3B0aW9ucygpLnBsYWNlaG9sZGVyPz8nJykgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbZm9ybUNvbnRyb2xdPVwiX2Zvcm1Db250cm9sXCJcbiAgICAgICAgW29wdGlvbkxhYmVsXT1cIm9wdGlvbnMoKS5vcHRpb25MYWJlbCA/PyAndGV4dCdcIlxuICAgICAgICBbb3B0aW9uVmFsdWVdPVwib3B0aW9ucygpLm9wdGlvblZhbHVlID8/ICdpZCdcIlxuICAgICAgICBbb3B0aW9uR3JvdXBMYWJlbF09XCJvcHRpb25zKCkub3B0aW9uR3JvdXBMYWJlbCA/PyAndGV4dCdcIlxuICAgICAgICBbb3B0aW9uR3JvdXBDaGlsZHJlbl09XCJvcHRpb25zKCkub3B0aW9uR3JvdXBDaGlsZHJlbiA/PyAnaXRlbXMnXCJcbiAgICAgICAgW2dyb3VwXT1cIm9wdGlvbnMoKS5ncm91cCA/PyBmYWxzZVwiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJ7e29wdGlvbnMoKS5jbGFzcyA/PyAndy1mdWxsJ319XCJcbiAgICAgICAgW3Nob3dDbGVhcl09XCJvcHRpb25zKCkuc2hvd0NsZWFyID8/IGZhbHNlXCJcbiAgICAgICAgW2FwcGVuZFRvXT1cIm9wdGlvbnMoKS5hcHBlbmRUbyA/PyAnYm9keSdcIlxuICAgICAgICBbZmlsdGVyXT1cIm9wdGlvbnMoKS5maWx0ZXIgPz8gZmFsc2VcIlxuICAgICAgICBbZmlsdGVyQnldPVwib3B0aW9ucygpLmZpbHRlckJ5ID8/ICd0ZXh0J1wiXG4gICAgICAgIFthdXRvZm9jdXNGaWx0ZXJdPVwib3B0aW9ucygpLmF1dG9mb2N1c0ZpbHRlciA/PyB0cnVlXCJcbiAgICAgICAgW2F1dG9EaXNwbGF5Rmlyc3RdPVwib3B0aW9ucygpLmF1dG9EaXNwbGF5Rmlyc3QgPz8gZmFsc2VcIlxuICAgICAgICBbYXV0b2ZvY3VzXT1cIm9wdGlvbnMoKS5hdXRvZm9jdXMgPz8gZmFsc2VcIlxuICAgICAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgICAgIChvbkhpZGUpPVwicmVzZXRGaWx0ZXIoKVwiXG4gICAgICAgIChvbkZpbHRlcik9XCJvbkZpbHRlcigkZXZlbnQpXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIm9wdGlvbnMoKS5yZWFkb25seSA/PyBmYWxzZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnbmctaW52YWxpZCBuZy1kaXJ0eSc6IChfZm9ybUNvbnRyb2wuZXJyb3JzICYmIChfZm9ybUNvbnRyb2wuZGlydHkgfHwgX2Zvcm1Db250cm9sLnRvdWNoZWQpICYmICFsb2FkaW5nT3B0aW9ucykgPz8gZmFsc2V9XCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwibmdNb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICBAaWYgKG9wdGlvbnMoKS5pdGVtVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtb3B0aW9uIHBUZW1wbGF0ZT1cIml0ZW1cIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnMoKS5pdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2w6IF9mb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zKCksXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiBfZm9ybUNvbnRyb2wucGFyZW50LFxuICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAob3B0aW9ucygpLnNlbGVjdGVkSXRlbVRlbXBsYXRlKSB7XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic2VsZWN0ZWRJdGVtXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zKCkuc2VsZWN0ZWRJdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IF9mb3JtQ29udHJvbC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2w6IF9mb3JtQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zKCksXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiBfZm9ybUNvbnRyb2wucGFyZW50LFxuICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAob3B0aW9ucygpLmZpbHRlciAmJiBvcHRpb25zKCkuZmlsdGVyVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJmaWx0ZXJcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9ucygpLmZpbHRlclRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbDogX2Zvcm1Db250cm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9ucygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaDogcmVmcmVzaC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiBfZm9ybUNvbnRyb2wucGFyZW50XG4gICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgfVxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJlbXB0eVwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVtcHR5VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICBwVGVtcGxhdGU9XCJmb290ZXJcIj5cbiAgICAgICAgICAgIEBpZiAoIWxvYWRpbmdPcHRpb25zKSB7XG4gICAgICAgICAgICAgIEBpZiAodG90YWxJdGVtcyA+ICh0ZW1wT3B0aW9ucy5sZW5ndGggfHwgMCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLWxpbmtcIiBsYWJlbD1cIkxvYWQgTW9yZVwiIGljb249XCJwaSBwaS1zcGlubmVyXCIgKG9uQ2xpY2spPVwibG9hZE1vcmUoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICBAaWYgKCFmaXJzdFRpbWUgJiYgKChwZHJvcGRvd24/Lm9wdGlvbnM/Lmxlbmd0aCB8fCAwKSA+IDApKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIHRleHQtcHJpbWFyeSBmdy1tZWRpdW0gcHktMyBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1zcGlubmVyLWRvdHRlZCBwaS1zcGluIFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7J0xvYWRpbmcgT3B0aW9ucyd8dHJhbnNsYXRlfX0uLi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAob3B0aW9ucygpLnNob3dDb3B5QnV0dG9uKSB7XG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIGljb249XCJwaSBwaS1jb3B5XCJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24taW5mbyBib3JkZXItMFwiXG4gICAgICAgICAgKG9uQ2xpY2spPVwiY29weVRvQ2xpcGJvYXJkKClcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhX2Zvcm1Db250cm9sLnZhbHVlIHx8IF9mb3JtQ29udHJvbC52YWx1ZSA9PT0gJydcIj5cbiAgICAgICAgPC9wLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8YXBwLWZpZWxkLWVycm9yc1xuICAgICAgW2N1c3RvbUVycm9yTWVzc2FnZXNdPVwib3B0aW9ucygpPy5lcnJvck1lc3NhZ2VzIHx8IHt9XCJcbiAgICAgIFtjb250cm9sTmFtZV09XCJvcHRpb25zKCk/LmZvcm1Db250cm9sTmFtZVwiXG4gICAgICBbZXJyb3JzXT1cImdldEVycm9ycygpXCJcbiAgICAgIFtlcnJvck1lc3NhZ2VdPVwib3B0aW9ucygpLmVycm9yTWVzc2FnZSB8fCAnJ1wiXG4gICAgICBbc2hvd0Vycm9yc109XCIoX2Zvcm1Db250cm9sLmRpcnR5IHx8IF9mb3JtQ29udHJvbC50b3VjaGVkKSAmJiAhbG9hZGluZ09wdGlvbnNcIj48L2FwcC1maWVsZC1lcnJvcnM+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICNlbXB0eVRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgQGlmIChsb2FkaW5nT3B0aW9ucykge1xuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxwLXByb2dyZXNzU3Bpbm5lciBzdHlsZUNsYXNzPVwidy00cmVtIGgtNHJlbVwiPjwvcC1wcm9ncmVzc1NwaW5uZXI+XG4gICAgICAgICAgPHA+e3snTG9hZGluZyBPcHRpb25zJ3x0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIGlmIChsb2FkaW5nRXJyb3IpIHtcbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8cD57eydGYWlsZWQgdG8gbG9hZCBvcHRpb25zLid8dHJhbnNsYXRlfX08L3A+XG4gICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICBsYWJlbD1cIlJldHJ5XCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1yZWZyZXNoXCJcbiAgICAgICAgICAgIChvbkNsaWNrKT1cImdldE9wdGlvbnMoKVwiXG4gICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tb3V0bGluZWQgcC1idXR0b24tZGFuZ2VyXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPHA+XG4gICAgICAgICAge3snTm8gT3B0aW9ucyBGb3VuZCd8dHJhbnNsYXRlfX1cbiAgICAgICAgPC9wPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuIl19
|