@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
274 lines • 42.1 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ElementRef, Injector, Input, ViewChild } from '@angular/core';
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator';
import { SearchType } from '@microsoft/windows-admin-center-sdk/core/data/active-directory/models/search-type';
import { Net } from '@microsoft/windows-admin-center-sdk/core/data/net';
import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
import { DataTableMultipleSelectMode } from '../../data-table';
import { SmeInternalFormFieldComponent } from '../../form/form-field/form-field.component';
import { ValidationAlertSeverity } from '../../form/validation-alert/validation-alert';
import { ActiveDirectoryService } from '../active-directory.service';
import * as i0 from "@angular/core";
import * as i1 from "../active-directory.service";
import * as i2 from "../../../directives/autofocus/autofocus.directive";
import * as i3 from "@angular/common";
import * as i4 from "../../data-table/data-table.component";
import * as i5 from "../../data-table/data-table-column.component";
import * as i6 from "@angular/forms";
import * as i7 from "../../loading-wheel/loading-wheel.component";
import * as i8 from "../../master-view/master-view.component";
import * as i9 from "../../form/validation-alert/validation-alert.component";
import * as i10 from "../../form/form-field-layout/form-field-layout.component";
const _c0 = ["searchButton"];
const _c1 = ["type", "adsearch"];
function ActiveDirectorySearchFormFieldComponent_p_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "p");
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r0.notAvailableMessage);
} }
function ActiveDirectorySearchFormFieldComponent_div_2_sme_loading_wheel_6_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-loading-wheel", 11);
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("message", ctx_r3.searchActiveDirectoryMessage);
} }
function ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_7_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-alert", 12);
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("alert", ctx_r4.directorySearchError);
} }
function ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template(rf, ctx) { if (rf & 1) {
const _r10 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "sme-master-view", 13);
i0.ɵɵlistener("clearSelection", function ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template_sme_master_view_clearSelection_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.value = []); });
i0.ɵɵelementStart(1, "sme-data-table", 14, 15);
i0.ɵɵlistener("selectionChange", function ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template_sme_data_table_selectionChange_1_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r11 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r11.value = $event); });
i0.ɵɵelement(3, "sme-data-table-column", 16, 17)(5, "sme-data-table-column", 18)(6, "sme-data-table-column", 19);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const _r7 = i0.ɵɵreference(2);
const _r8 = i0.ɵɵreference(4);
const ctx_r5 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("showGroup", false)("showFilter", false)("showRefresh", false)("selection", ctx_r5.value)("total", _r7.renderedItems.length);
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("selectionMode", ctx_r5.selectionMode);
i0.ɵɵproperty("items", ctx_r5.accounts)("selection", ctx_r5.value)("scrollable", true)("defaultSortColumn", _r8)("defaultSortMode", 1);
i0.ɵɵadvance(2);
i0.ɵɵpropertyInterpolate("header", ctx_r5.resultNameColumnHeader);
i0.ɵɵadvance(2);
i0.ɵɵpropertyInterpolate("header", ctx_r5.resultTypeColumnHeader);
i0.ɵɵadvance(1);
i0.ɵɵpropertyInterpolate("header", ctx_r5.resultLoginNameColumnHeader);
} }
function ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-alert", 12);
} if (rf & 2) {
const ctx_r6 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("alert", ctx_r6.directorySearchSizeLimitWarning);
} }
function ActiveDirectorySearchFormFieldComponent_div_2_Template(rf, ctx) { if (rf & 1) {
const _r13 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 3)(1, "div", 4)(2, "input", 5);
i0.ɵɵlistener("ngModelChange", function ActiveDirectorySearchFormFieldComponent_div_2_Template_input_ngModelChange_2_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.searchString = $event); })("keydown.enter", function ActiveDirectorySearchFormFieldComponent_div_2_Template_input_keydown_enter_2_listener() { i0.ɵɵrestoreView(_r13); const ctx_r14 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r14.searchFromActiveDirectory()); });
i0.ɵɵelementEnd();
i0.ɵɵelementStart(3, "button", 6, 7);
i0.ɵɵlistener("click", function ActiveDirectorySearchFormFieldComponent_div_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r13); const ctx_r15 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r15.searchFromActiveDirectory()); });
i0.ɵɵtext(5);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(6, ActiveDirectorySearchFormFieldComponent_div_2_sme_loading_wheel_6_Template, 1, 1, "sme-loading-wheel", 8);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(7, ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_7_Template, 1, 1, "sme-alert", 9);
i0.ɵɵtemplate(8, ActiveDirectorySearchFormFieldComponent_div_2_sme_master_view_8_Template, 7, 14, "sme-master-view", 10);
i0.ɵɵtemplate(9, ActiveDirectorySearchFormFieldComponent_div_2_sme_alert_9_Template, 1, 1, "sme-alert", 9);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngModel", ctx_r1.searchString)("placeholder", ctx_r1.searchPlaceHolder)("autofocus", ctx_r1.autofocus);
i0.ɵɵattribute("aria-label", ctx_r1.searchPlaceHolder);
i0.ɵɵadvance(1);
i0.ɵɵproperty("disabled", !ctx_r1.searchString || ctx_r1.searchingAdInProgress);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx_r1.searchButtonLabel);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.searchingAdInProgress);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.directorySearchError);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.showAccountList);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r1.showSizeLimitWarning);
} }
/**
* Form field for selecting ad objects from a search query
*/
export class ActiveDirectorySearchFormFieldComponent extends SmeInternalFormFieldComponent {
/**
* Initializes a new instance of the ActiveDirectoryFormFieldFormFieldComponent
*/
constructor(injector, ADService) {
super(injector);
this.ADService = ADService;
/**
* Indicates that multiple selections are allowed
* Default is true
*/
this.multiple = true;
this.directorySearchError = null;
this.searchOn = SearchType.Any;
this.searchButtonLabel = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Button.Search.Label;
this.searchPlaceHolder = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Button.Search.PlaceHolder;
this.resultNameColumnHeader = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ResultTable.NameColumnHeader;
this.resultTypeColumnHeader = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ResultTable.TypeColumnHeader;
this.resultLoginNameColumnHeader = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ResultTable.LoginNameColumnHeader;
this.notAvailableMessage = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.ActiveDirectorySearchNotAvailable.message;
this.searchActiveDirectoryMessage = '';
this.searchString = '';
this.searchingAdInProgress = false;
this.showAccountList = false;
this.showSizeLimitWarning = false;
this.accounts = [];
this.directorySearchSizeLimitWarning = {
message: '',
severity: ValidationAlertSeverity.Warning
};
this.subscriptions.push(this.ADService.isGatewayDomainJoined.subscribe(domainJoined => this.isGatewayDomainJoined = domainJoined));
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'ActiveDirectorySearchFormFieldComponent';
}
get selectionMode() {
return this.multiple ? DataTableMultipleSelectMode.Multiple : DataTableMultipleSelectMode.Single;
}
ngOnDestroy() {
super.ngOnDestroy();
if (this.searchADSubscription && !this.searchADSubscription.closed) {
this.searchADSubscription.unsubscribe();
}
}
/**
* search computer list from active directory through gateway api
*/
searchFromActiveDirectory() {
// initial values
this.showAccountList = false;
this.showSizeLimitWarning = false;
this.searchingAdInProgress = true;
this.directorySearchError = null;
this.accounts = [];
const searchStr = this.searchString;
this.searchActiveDirectoryMessage =
this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Search.Progress.format(searchStr);
if (this.searchADSubscription && !this.searchADSubscription.closed) {
this.searchADSubscription.unsubscribe();
}
const options = {
searchString: searchStr,
searchOn: this.searchOn,
sizeLimit: this.ADService.defaultDirectorySearchSizeLimit
};
this.searchADSubscription = this.ADService.search(options).subscribe({
next: (response) => {
if (response.length > 0) {
this.accounts = response;
this.showSizeLimitWarning = response.length === options.sizeLimit;
if (this.showSizeLimitWarning) {
const format = this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.SizeLimit.Warning;
this.directorySearchSizeLimitWarning.message = format.format(options.sizeLimit);
}
}
this.showAccountList = true;
this.searchingAdInProgress = false;
this.yieldFocusOnSearchButton();
},
error: (error) => {
this.directorySearchError = {
message: this.strings.MsftSmeShell.Angular.ActiveDirectoryFormField.Error.message
.format(searchStr, Net.getErrorMessage(error)),
severity: ValidationAlertSeverity.Error
};
this.showAccountList = false;
this.searchingAdInProgress = false;
this.yieldFocusOnSearchButton();
}
});
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
detailsSpan: ''
};
}
/**
* Focus on search button
*/
yieldFocusOnSearchButton() {
if (this.searchButtonRef && Dom.isFocusable(this.searchButtonRef.nativeElement)) {
this.searchButtonRef.nativeElement.focus();
}
}
}
/** @nocollapse */ ActiveDirectorySearchFormFieldComponent.ɵfac = function ActiveDirectorySearchFormFieldComponent_Factory(t) { return new (t || ActiveDirectorySearchFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.ActiveDirectoryService)); };
/** @nocollapse */ ActiveDirectorySearchFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: ActiveDirectorySearchFormFieldComponent, selectors: [["sme-form-field", "type", "adsearch"]], viewQuery: function ActiveDirectorySearchFormFieldComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchButtonRef = _t.first);
} }, inputs: { multiple: "multiple", notAvailableMessage: "notAvailableMessage", searchButtonLabel: "searchButtonLabel", searchPlaceHolder: "searchPlaceHolder", resultNameColumnHeader: "resultNameColumnHeader", resultTypeColumnHeader: "resultTypeColumnHeader", searchOn: "searchOn" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c1, decls: 3, vars: 3, consts: [[3, "formField"], [4, "ngIf"], ["class", "sme-arrange-stack-v sme-layout-absolute-phone-up sme-position-inset-none", 4, "ngIf"], [1, "sme-arrange-stack-v", "sme-layout-absolute-phone-up", "sme-position-inset-none"], [1, "sme-layout-relative", "sme-position-flex-none", "sme-padding-top-sm", "sme-arrange-stack-h"], ["type", "text", 1, "sme-position-flex-auto", 3, "ngModel", "placeholder", "autofocus", "ngModelChange", "keydown.enter"], ["type", "button", 1, "sme-layout-relative", "sme-position-left-xs", "sme-layout-inline-block", "sme-button-primary", 3, "disabled", "click"], ["searchButton", ""], ["size", "medium", 3, "message", 4, "ngIf"], [3, "alert", 4, "ngIf"], ["class", "sme-layout-relative-all-screens sme-position-flex-auto", "dataTableMinWidth", "sm", 3, "showGroup", "showFilter", "showRefresh", "selection", "total", "clearSelection", 4, "ngIf"], ["size", "medium", 3, "message"], [3, "alert"], ["dataTableMinWidth", "sm", 1, "sme-layout-relative-all-screens", "sme-position-flex-auto", 3, "showGroup", "showFilter", "showRefresh", "selection", "total", "clearSelection"], [3, "items", "selectionMode", "selection", "scrollable", "defaultSortColumn", "defaultSortMode", "selectionChange"], ["smeDataTable", ""], ["field", "name", "sortable", "true", 3, "header"], ["defaultSortColumn", ""], ["field", "type", "sortable", "true", 3, "header"], ["field", "loginName", "sortable", "true", 3, "header"]], template: function ActiveDirectorySearchFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-form-field-layout", 0);
i0.ɵɵtemplate(1, ActiveDirectorySearchFormFieldComponent_p_1_Template, 2, 1, "p", 1);
i0.ɵɵtemplate(2, ActiveDirectorySearchFormFieldComponent_div_2_Template, 10, 10, "div", 2);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("formField", ctx);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx.isGatewayDomainJoined);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.isGatewayDomainJoined);
} }, dependencies: [i2.AutofocusDirective, i3.NgIf, i4.DataTableComponent, i5.DataTableColumnComponent, i6.DefaultValueAccessor, i6.NgControlStatus, i6.NgModel, i7.LoadingWheelComponent, i8.MasterViewComponent, i9.ValidationAlertComponent, i10.FormFieldLayoutComponent], encapsulation: 2 });
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], ActiveDirectorySearchFormFieldComponent.prototype, "searchFromActiveDirectory", null);
__decorate([
Yield(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], ActiveDirectorySearchFormFieldComponent.prototype, "yieldFocusOnSearchButton", null);
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActiveDirectorySearchFormFieldComponent, [{
type: Component,
args: [{ selector: 'sme-form-field[type="adSearch"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <p *ngIf=\"!isGatewayDomainJoined\">{{notAvailableMessage}}</p>\r\n <div *ngIf=\"isGatewayDomainJoined\" class=\"sme-arrange-stack-v sme-layout-absolute-phone-up sme-position-inset-none\">\r\n <div class=\"sme-layout-relative sme-position-flex-none sme-padding-top-sm sme-arrange-stack-h\">\r\n <input class=\"sme-position-flex-auto\" type=\"text\" [(ngModel)]=\"searchString\" [placeholder]=\"searchPlaceHolder\"\r\n [autofocus]=\"autofocus\" [attr.aria-label]=\"searchPlaceHolder\" (keydown.enter)=\"searchFromActiveDirectory()\">\r\n <button #searchButton type=\"button\" class=\"sme-layout-relative sme-position-left-xs sme-layout-inline-block sme-button-primary\"\r\n [disabled]=\"!searchString || searchingAdInProgress\" (click)=\"searchFromActiveDirectory()\">{{searchButtonLabel}}</button>\r\n <sme-loading-wheel *ngIf=\"searchingAdInProgress\" size=\"medium\" [message]=\"searchActiveDirectoryMessage\"></sme-loading-wheel>\r\n </div>\r\n <sme-alert *ngIf=\"directorySearchError\" [alert]=\"directorySearchError\"></sme-alert>\r\n <sme-master-view *ngIf=\"showAccountList\" class=\"sme-layout-relative-all-screens sme-position-flex-auto\" [showGroup]=\"false\" [showFilter]=\"false\"\r\n [showRefresh]=\"false\" [selection]=\"value\" [total]=\"smeDataTable.renderedItems.length\" (clearSelection)=\"value=[]\"\r\n dataTableMinWidth=\"sm\">\r\n <sme-data-table #smeDataTable [items]=\"accounts\" selectionMode=\"{{selectionMode}}\" [(selection)]=\"value\" [scrollable]=\"true\"\r\n [defaultSortColumn]=\"defaultSortColumn\" [defaultSortMode]=\"1\">\r\n <sme-data-table-column #defaultSortColumn field=\"name\" header=\"{{resultNameColumnHeader}}\" sortable=\"true\"></sme-data-table-column>\r\n <sme-data-table-column field=\"type\" header=\"{{resultTypeColumnHeader}}\" sortable=\"true\"></sme-data-table-column>\r\n <sme-data-table-column field=\"loginName\" header=\"{{resultLoginNameColumnHeader}}\" sortable=\"true\"></sme-data-table-column>\r\n </sme-data-table>\r\n </sme-master-view>\r\n <sme-alert *ngIf=\"showSizeLimitWarning\" [alert]=\"directorySearchSizeLimitWarning\"></sme-alert>\r\n </div>\r\n</sme-form-field-layout>\r\n" }]
}], function () { return [{ type: i0.Injector }, { type: i1.ActiveDirectoryService }]; }, { searchButtonRef: [{
type: ViewChild,
args: ['searchButton']
}], multiple: [{
type: Input
}], notAvailableMessage: [{
type: Input
}], searchButtonLabel: [{
type: Input
}], searchPlaceHolder: [{
type: Input
}], resultNameColumnHeader: [{
type: Input
}], resultTypeColumnHeader: [{
type: Input
}], searchOn: [{
type: Input
}], searchFromActiveDirectory: [], yieldFocusOnSearchButton: [] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlLWRpcmVjdG9yeS1zZWFyY2gtZm9ybS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9hY3RpdmUtZGlyZWN0b3J5L3NlYXJjaC1mb3JtLWZpZWxkL2FjdGl2ZS1kaXJlY3Rvcnktc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvYWN0aXZlLWRpcmVjdG9yeS9zZWFyY2gtZm9ybS1maWVsZC9hY3RpdmUtZGlyZWN0b3J5LXNlYXJjaC1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBR2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtRkFBbUYsQ0FBQztBQUMvRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDeEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBR3ZFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9ELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzNGLE9BQU8sRUFBbUIsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN4RyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0lDWm5FLHlCQUFrQztJQUFBLFlB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RDtRQUM3RCwwRkFvQk07UUFDUixpQkFBd0I7O1FBdkJELCtCQUFrQjtRQUNuQyxlQUE0QjtRQUE1QixpREFBNEI7UUFDMUIsZUFBMkI7UUFBM0IsZ0RBQTJCOztBRCtJL0I7SUFBQyxRQUFRLEVBQUU7Ozs7d0ZBK0NWO0FBZUQ7SUFBQyxLQUFLLEVBQUU7Ozs7dUZBS1A7dUZBOUxRLHVDQUF1QztjQUpuRCxTQUFTOzJCQUNJLGlDQUFpQztnR0FZcEMsZUFBZTtrQkFEckIsU0FBUzttQkFBQyxjQUFjO1lBZWxCLFFBQVE7a0JBRGQsS0FBSztZQVNDLG1CQUFtQjtrQkFEekIsS0FBSztZQVFDLGlCQUFpQjtrQkFEdkIsS0FBSztZQVFDLGlCQUFpQjtrQkFEdkIsS0FBSztZQVFDLHNCQUFzQjtrQkFENUIsS0FBSztZQVFDLHNCQUFzQjtrQkFENUIsS0FBSztZQWNDLFFBQVE7a0JBRGQsS0FBSztZQXFEQyx5QkFBeUIsTUE4RHhCLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IEFjY291bnRJbmZvIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2FjdGl2ZS1kaXJlY3RvcnkvbW9kZWxzL2FjY291bnQtaW5mbyc7XHJcbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlYXJjaE9wdGlvbnMgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvYWN0aXZlLWRpcmVjdG9yeS9tb2RlbHMvYWN0aXZlLWRpcmVjdG9yeS1zZWFyY2gtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFNlYXJjaFR5cGUgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvYWN0aXZlLWRpcmVjdG9yeS9tb2RlbHMvc2VhcmNoLXR5cGUnO1xyXG5pbXBvcnQgeyBOZXQgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvbmV0JztcclxuaW1wb3J0IHsgRG9tIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kb20vZG9tJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEFqYXhFcnJvciB9IGZyb20gJ3J4anMvYWpheCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZSB9IGZyb20gJy4uLy4uL2RhdGEtdGFibGUnO1xyXG5pbXBvcnQgeyBTbWVJbnRlcm5hbEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Zvcm0vZm9ybS1maWVsZC9mb3JtLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25BbGVydCwgVmFsaWRhdGlvbkFsZXJ0U2V2ZXJpdHkgfSBmcm9tICcuLi8uLi9mb3JtL3ZhbGlkYXRpb24tYWxlcnQvdmFsaWRhdGlvbi1hbGVydCc7XHJcbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9hY3RpdmUtZGlyZWN0b3J5LnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIEZvcm0gZmllbGQgZm9yIHNlbGVjdGluZyBhZCBvYmplY3RzIGZyb20gYSBzZWFyY2ggcXVlcnlcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtZm9ybS1maWVsZFt0eXBlPVwiYWRTZWFyY2hcIl0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FjdGl2ZS1kaXJlY3Rvcnktc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBY3RpdmVEaXJlY3RvcnlTZWFyY2hGb3JtRmllbGRDb21wb25lbnQgZXh0ZW5kcyBTbWVJbnRlcm5hbEZvcm1GaWVsZENvbXBvbmVudDxBY2NvdW50SW5mb1tdPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICBwdWJsaWMgc2VhcmNoaW5nQWRJblByb2dyZXNzOiBib29sZWFuO1xyXG4gICAgcHVibGljIHNlYXJjaEFjdGl2ZURpcmVjdG9yeU1lc3NhZ2U6IHN0cmluZztcclxuICAgIHB1YmxpYyBzaG93QWNjb3VudExpc3Q6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgc2hvd1NpemVMaW1pdFdhcm5pbmc6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgYWNjb3VudHM6IEFjY291bnRJbmZvW107XHJcbiAgICBwdWJsaWMgaXNHYXRld2F5RG9tYWluSm9pbmVkOiBib29sZWFuO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaEJ1dHRvbicpXHJcbiAgICBwdWJsaWMgc2VhcmNoQnV0dG9uUmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdBY3RpdmVEaXJlY3RvcnlTZWFyY2hGb3JtRmllbGRDb21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHRoYXQgbXVsdGlwbGUgc2VsZWN0aW9ucyBhcmUgYWxsb3dlZFxyXG4gICAgICogRGVmYXVsdCBpcyB0cnVlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgbXVsdGlwbGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgbWVzc2FnZSBmb3IgdGhlIEFjdGl2ZSBEaXJlY3RvcnkgaXMgbm90IGF2YWlsYWJsZS5cclxuICAgICAqIEluIG5vdCBwcm92aWRlLCB1c2UgdGhlIGRlZmF1bHQgb25lXHJcbiAgICAgKiBAZXhhbXBsZSBcIlNlYXJjaCBpbiBBY3RpdmUgRGlyZWN0b3J5IGlzIG5vdCBhdmFpbGFibGVcIlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG5vdEF2YWlsYWJsZU1lc3NhZ2U/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdGV4dCBmb3IgdGhlIHNlYXJjaCBidXR0b24gaW4gdGhlIGNvbnRyb2wuXHJcbiAgICAgKiBAZXhhbXBsZSBcIlNlYXJjaFwiXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VhcmNoQnV0dG9uTGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcGxhY2UgaG9sZGVyIGluIHNlYXJjaCB0ZXh0IGJveC5cclxuICAgICAqIEBleGFtcGxlIGVudGVyIGFueSB0ZXh0IGZvciBjb21wdXRlciwgdXNlciBvciBncm91cFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlYXJjaFBsYWNlSG9sZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBzZWFyY2ggcmVzdWx0IHRhYmxlIE5hbWUgY29sdW1uLlxyXG4gICAgICogQGV4YW1wbGUgXCJOYW1lXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZXN1bHROYW1lQ29sdW1uSGVhZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBzZWFyY2ggcmVzdWx0IHRhYmxlIFR5cGUgY29sdW1uLlxyXG4gICAgICogQGV4YW1wbGUgXCJUeXBlXCJcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZXN1bHRUeXBlQ29sdW1uSGVhZGVyPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRleHQgZm9yIHRoZSBzZWFyY2ggcmVzdWx0IHRhYmxlIFR5cGUgY29sdW1uLlxyXG4gICAgICogQGV4YW1wbGUgXCJMb2dpbiBOYW1lXCJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc3VsdExvZ2luTmFtZUNvbHVtbkhlYWRlcj86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHNlYXJjaCBjbGFzcyZjYXRlZ29yeS5cclxuICAgICAqIEBleGFtcGxlIFNlYXJjaFR5cGUuQ29tcHV0ZXJcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWFyY2hPbj86IFNlYXJjaFR5cGUgfCBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHNlYXJjaFN0cmluZztcclxuXHJcbiAgICBwdWJsaWMgZGlyZWN0b3J5U2VhcmNoU2l6ZUxpbWl0V2FybmluZzogVmFsaWRhdGlvbkFsZXJ0O1xyXG4gICAgcHVibGljIGRpcmVjdG9yeVNlYXJjaEVycm9yOiBWYWxpZGF0aW9uQWxlcnQgPSBudWxsO1xyXG5cclxuICAgIHB1YmxpYyBnZXQgc2VsZWN0aW9uTW9kZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlID8gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk11bHRpcGxlIDogRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNpbmdsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNraW5nIG1lbWJlciBmb3IgYWQgc2VhcmNoXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2VhcmNoQURTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBBY3RpdmVEaXJlY3RvcnlGb3JtRmllbGRGb3JtRmllbGRDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBwdWJsaWMgQURTZXJ2aWNlOiBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoT24gPSBTZWFyY2hUeXBlLkFueTtcclxuICAgICAgICB0aGlzLnNlYXJjaEJ1dHRvbkxhYmVsID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5CdXR0b24uU2VhcmNoLkxhYmVsO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoUGxhY2VIb2xkZXIgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWN0aXZlRGlyZWN0b3J5Rm9ybUZpZWxkLkJ1dHRvbi5TZWFyY2guUGxhY2VIb2xkZXI7XHJcbiAgICAgICAgdGhpcy5yZXN1bHROYW1lQ29sdW1uSGVhZGVyID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5SZXN1bHRUYWJsZS5OYW1lQ29sdW1uSGVhZGVyO1xyXG4gICAgICAgIHRoaXMucmVzdWx0VHlwZUNvbHVtbkhlYWRlciA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BY3RpdmVEaXJlY3RvcnlGb3JtRmllbGQuUmVzdWx0VGFibGUuVHlwZUNvbHVtbkhlYWRlcjtcclxuICAgICAgICB0aGlzLnJlc3VsdExvZ2luTmFtZUNvbHVtbkhlYWRlciA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BY3RpdmVEaXJlY3RvcnlGb3JtRmllbGQuUmVzdWx0VGFibGUuTG9naW5OYW1lQ29sdW1uSGVhZGVyO1xyXG4gICAgICAgIHRoaXMubm90QXZhaWxhYmxlTWVzc2FnZSA9IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5BY3RpdmVEaXJlY3RvcnlGb3JtRmllbGQuQWN0aXZlRGlyZWN0b3J5U2VhcmNoTm90QXZhaWxhYmxlLm1lc3NhZ2U7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hBY3RpdmVEaXJlY3RvcnlNZXNzYWdlID0gJyc7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTdHJpbmcgPSAnJztcclxuICAgICAgICB0aGlzLnNlYXJjaGluZ0FkSW5Qcm9ncmVzcyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2hvd0FjY291bnRMaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93U2l6ZUxpbWl0V2FybmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuYWNjb3VudHMgPSBbXTtcclxuICAgICAgICB0aGlzLmRpcmVjdG9yeVNlYXJjaFNpemVMaW1pdFdhcm5pbmcgPSB7XHJcbiAgICAgICAgICAgIG1lc3NhZ2U6ICcnLFxyXG4gICAgICAgICAgICBzZXZlcml0eTogVmFsaWRhdGlvbkFsZXJ0U2V2ZXJpdHkuV2FybmluZ1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5BRFNlcnZpY2UuaXNHYXRld2F5RG9tYWluSm9pbmVkLnN1YnNjcmliZShkb21haW5Kb2luZWQgPT4gdGhpcy5pc0dhdGV3YXlEb21haW5Kb2luZWQgPSBkb21haW5Kb2luZWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hBRFN1YnNjcmlwdGlvbiAmJiAhdGhpcy5zZWFyY2hBRFN1YnNjcmlwdGlvbi5jbG9zZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hBRFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHNlYXJjaCBjb21wdXRlciBsaXN0IGZyb20gYWN0aXZlIGRpcmVjdG9yeSB0aHJvdWdoIGdhdGV3YXkgYXBpXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgc2VhcmNoRnJvbUFjdGl2ZURpcmVjdG9yeSgpIHtcclxuICAgICAgICAvLyBpbml0aWFsIHZhbHVlc1xyXG4gICAgICAgIHRoaXMuc2hvd0FjY291bnRMaXN0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zaG93U2l6ZUxpbWl0V2FybmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoaW5nQWRJblByb2dyZXNzID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRpcmVjdG9yeVNlYXJjaEVycm9yID0gbnVsbDtcclxuICAgICAgICB0aGlzLmFjY291bnRzID0gW107XHJcbiAgICAgICAgY29uc3Qgc2VhcmNoU3RyID0gdGhpcy5zZWFyY2hTdHJpbmc7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hBY3RpdmVEaXJlY3RvcnlNZXNzYWdlID1cclxuICAgICAgICAgICAgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5TZWFyY2guUHJvZ3Jlc3MuZm9ybWF0KHNlYXJjaFN0cik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaEFEU3Vic2NyaXB0aW9uICYmICF0aGlzLnNlYXJjaEFEU3Vic2NyaXB0aW9uLmNsb3NlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEFEU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBvcHRpb25zOiBBY3RpdmVEaXJlY3RvcnlTZWFyY2hPcHRpb25zID0ge1xyXG4gICAgICAgICAgICBzZWFyY2hTdHJpbmc6IHNlYXJjaFN0cixcclxuICAgICAgICAgICAgc2VhcmNoT246IHRoaXMuc2VhcmNoT24sXHJcbiAgICAgICAgICAgIHNpemVMaW1pdDogdGhpcy5BRFNlcnZpY2UuZGVmYXVsdERpcmVjdG9yeVNlYXJjaFNpemVMaW1pdFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuc2VhcmNoQURTdWJzY3JpcHRpb24gPSB0aGlzLkFEU2VydmljZS5zZWFyY2gob3B0aW9ucykuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBBY2NvdW50SW5mb1tdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjb3VudHMgPSByZXNwb25zZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dTaXplTGltaXRXYXJuaW5nID0gcmVzcG9uc2UubGVuZ3RoID09PSBvcHRpb25zLnNpemVMaW1pdDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93U2l6ZUxpbWl0V2FybmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQWN0aXZlRGlyZWN0b3J5Rm9ybUZpZWxkLlNpemVMaW1pdC5XYXJuaW5nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdG9yeVNlYXJjaFNpemVMaW1pdFdhcm5pbmcubWVzc2FnZSA9IGZvcm1hdC5mb3JtYXQob3B0aW9ucy5zaXplTGltaXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FjY291bnRMaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoaW5nQWRJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnlpZWxkRm9jdXNPblNlYXJjaEJ1dHRvbigpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yOiBBamF4RXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0b3J5U2VhcmNoRXJyb3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkFjdGl2ZURpcmVjdG9yeUZvcm1GaWVsZC5FcnJvci5tZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoc2VhcmNoU3RyLCBOZXQuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSksXHJcbiAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6IFZhbGlkYXRpb25BbGVydFNldmVyaXR5LkVycm9yXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QWNjb3VudExpc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoaW5nQWRJblByb2dyZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnlpZWxkRm9jdXNPblNlYXJjaEJ1dHRvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXRhaWxzU3BhbjogJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgb24gc2VhcmNoIGJ1dHRvblxyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSB5aWVsZEZvY3VzT25TZWFyY2hCdXR0b24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoQnV0dG9uUmVmICYmIERvbS5pc0ZvY3VzYWJsZSh0aGlzLnNlYXJjaEJ1dHRvblJlZi5uYXRpdmVFbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaEJ1dHRvblJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxzbWUtZm9ybS1maWVsZC1sYXlvdXQgW2Zvcm1GaWVsZF09XCJ0aGlzXCI+XHJcbiAgPHAgKm5nSWY9XCIhaXNHYXRld2F5RG9tYWluSm9pbmVkXCI+e3tub3RBdmFpbGFibGVNZXNzYWdlfX08L3A+XHJcbiAgPGRpdiAqbmdJZj1cImlzR2F0ZXdheURvbWFpbkpvaW5lZFwiIGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2stdiBzbWUtbGF5b3V0LWFic29sdXRlLXBob25lLXVwIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1yZWxhdGl2ZSBzbWUtcG9zaXRpb24tZmxleC1ub25lIHNtZS1wYWRkaW5nLXRvcC1zbSBzbWUtYXJyYW5nZS1zdGFjay1oXCI+XHJcbiAgICAgIDxpbnB1dCBjbGFzcz1cInNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIiB0eXBlPVwidGV4dFwiICBbKG5nTW9kZWwpXT1cInNlYXJjaFN0cmluZ1wiIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hQbGFjZUhvbGRlclwiXHJcbiAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInNlYXJjaFBsYWNlSG9sZGVyXCIgKGtleWRvd24uZW50ZXIpPVwic2VhcmNoRnJvbUFjdGl2ZURpcmVjdG9yeSgpXCI+XHJcbiAgICAgIDxidXR0b24gI3NlYXJjaEJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJzbWUtbGF5b3V0LXJlbGF0aXZlIHNtZS1wb3NpdGlvbi1sZWZ0LXhzIHNtZS1sYXlvdXQtaW5saW5lLWJsb2NrIHNtZS1idXR0b24tcHJpbWFyeVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWFyY2hTdHJpbmcgfHwgc2VhcmNoaW5nQWRJblByb2dyZXNzXCIgKGNsaWNrKT1cInNlYXJjaEZyb21BY3RpdmVEaXJlY3RvcnkoKVwiPnt7c2VhcmNoQnV0dG9uTGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJzZWFyY2hpbmdBZEluUHJvZ3Jlc3NcIiBzaXplPVwibWVkaXVtXCIgW21lc3NhZ2VdPVwic2VhcmNoQWN0aXZlRGlyZWN0b3J5TWVzc2FnZVwiPjwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxzbWUtYWxlcnQgKm5nSWY9XCJkaXJlY3RvcnlTZWFyY2hFcnJvclwiIFthbGVydF09XCJkaXJlY3RvcnlTZWFyY2hFcnJvclwiPjwvc21lLWFsZXJ0PlxyXG4gICAgPHNtZS1tYXN0ZXItdmlldyAqbmdJZj1cInNob3dBY2NvdW50TGlzdFwiIGNsYXNzPVwic21lLWxheW91dC1yZWxhdGl2ZS1hbGwtc2NyZWVucyBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCIgW3Nob3dHcm91cF09XCJmYWxzZVwiIFtzaG93RmlsdGVyXT1cImZhbHNlXCJcclxuICAgICAgW3Nob3dSZWZyZXNoXT1cImZhbHNlXCIgW3NlbGVjdGlvbl09XCJ2YWx1ZVwiIFt0b3RhbF09XCJzbWVEYXRhVGFibGUucmVuZGVyZWRJdGVtcy5sZW5ndGhcIiAoY2xlYXJTZWxlY3Rpb24pPVwidmFsdWU9W11cIlxyXG4gICAgICBkYXRhVGFibGVNaW5XaWR0aD1cInNtXCI+XHJcbiAgICAgIDxzbWUtZGF0YS10YWJsZSAjc21lRGF0YVRhYmxlIFtpdGVtc109XCJhY2NvdW50c1wiIHNlbGVjdGlvbk1vZGU9XCJ7e3NlbGVjdGlvbk1vZGV9fVwiIFsoc2VsZWN0aW9uKV09XCJ2YWx1ZVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgICAgIFtkZWZhdWx0U29ydENvbHVtbl09XCJkZWZhdWx0U29ydENvbHVtblwiIFtkZWZhdWx0U29ydE1vZGVdPVwiMVwiPlxyXG4gICAgICAgIDxzbWUtZGF0YS10YWJsZS1jb2x1bW4gI2RlZmF1bHRTb3J0Q29sdW1uIGZpZWxkPVwibmFtZVwiIGhlYWRlcj1cInt7cmVzdWx0TmFtZUNvbHVtbkhlYWRlcn19XCIgc29ydGFibGU9XCJ0cnVlXCI+PC9zbWUtZGF0YS10YWJsZS1jb2x1bW4+XHJcbiAgICAgICAgPHNtZS1kYXRhLXRhYmxlLWNvbHVtbiBmaWVsZD1cInR5cGVcIiBoZWFkZXI9XCJ7e3Jlc3VsdFR5cGVDb2x1bW5IZWFkZXJ9fVwiIHNvcnRhYmxlPVwidHJ1ZVwiPjwvc21lLWRhdGEtdGFibGUtY29sdW1uPlxyXG4gICAgICAgIDxzbWUtZGF0YS10YWJsZS1jb2x1bW4gZmllbGQ9XCJsb2dpbk5hbWVcIiBoZWFkZXI9XCJ7e3Jlc3VsdExvZ2luTmFtZUNvbHVtbkhlYWRlcn19XCIgc29ydGFibGU9XCJ0cnVlXCI+PC9zbWUtZGF0YS10YWJsZS1jb2x1bW4+XHJcbiAgICAgIDwvc21lLWRhdGEtdGFibGU+XHJcbiAgICA8L3NtZS1tYXN0ZXItdmlldz5cclxuICAgIDxzbWUtYWxlcnQgKm5nSWY9XCJzaG93U2l6ZUxpbWl0V2FybmluZ1wiIFthbGVydF09XCJkaXJlY3RvcnlTZWFyY2hTaXplTGltaXRXYXJuaW5nXCI+PC9zbWUtYWxlcnQ+XHJcbiAgPC9kaXY+XHJcbjwvc21lLWZvcm0tZmllbGQtbGF5b3V0PlxyXG4iXX0=