@churchillliving/se-ui-toolkit 6.53.683 → 6.53.684
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/components/shared/global-filters/global-filters.component.mjs +12 -3
- package/esm2022/lib/models/grid.model.mjs +1 -1
- package/esm2022/lib/services/grid.service.mjs +2 -1
- package/fesm2022/churchillliving-se-ui-toolkit.mjs +12 -2
- package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
- package/lib/components/shared/global-filters/global-filters.component.d.ts +1 -0
- package/lib/models/grid.model.d.ts +1 -0
- package/package.json +1 -1
|
@@ -258,6 +258,15 @@ export class SeGlobalFilterComponent {
|
|
|
258
258
|
this.gridService.applyFilterEvent = false;
|
|
259
259
|
this.filtersApplied.emit(this.globalFilters);
|
|
260
260
|
}, globalFilter.type === GridFilterControlType.LOOKUP_INPUT ? 250 : 0);
|
|
261
|
+
if (globalFilter.type == 'checkbox') {
|
|
262
|
+
this.updateValue.emit(globalFilter);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
updateValues(globalFilter) {
|
|
266
|
+
setTimeout(() => {
|
|
267
|
+
localStorage.setItem('applyFilter', JSON.stringify(false));
|
|
268
|
+
this.gridService.applyFilterEvent = false;
|
|
269
|
+
}, globalFilter.type === GridFilterControlType.LOOKUP_INPUT ? 250 : 0);
|
|
261
270
|
this.updateValue.emit(globalFilter);
|
|
262
271
|
}
|
|
263
272
|
applyFiltersEvent(globalFilter) {
|
|
@@ -493,11 +502,11 @@ export class SeGlobalFilterComponent {
|
|
|
493
502
|
}
|
|
494
503
|
}
|
|
495
504
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SeGlobalFilterComponent, deps: [{ token: i1.DatePipe }, { token: i2.DynamicDialogRef, optional: true }, { token: i2.DynamicDialogConfig, optional: true }, { token: i3.GridService }, { token: i2.DialogService }, { token: i4.AlertService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
496
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SeGlobalFilterComponent, selector: "se-global-filters", inputs: { globalFilters: "globalFilters", searchGlobalFilterBtn: "searchGlobalFilterBtn", clearGlobalFilterBtn: "clearGlobalFilterBtn", activeTestMode: "activeTestMode" }, outputs: { filtersApplied: "filtersApplied", updateValue: "updateValue" }, viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["rangeCalendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span>\n {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (click)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Radio Button control -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.RADIOBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n\n \n <div [class]=\"globalFilter.displayStyle=='horizontal' ? 'flex flex-wrap gap-3' : 'flex flex-column gap-3' \">\n <div *ngFor=\"let category of globalFilter.data\" class=\"field-checkbox\"> \n <p-radioButton \n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [disabled]=\"globalFilter.disabled\"\n [value]=\"category.key\" \n name=\"pi pi-check\"\n [(ngModel)]=\"globalFilter.value\">\n </p-radioButton>\n <label [for]=\"category.key\" class=\"ml-2\">{{ category.name }}</label>\n </div>\n </div>\n\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n \n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\ntype=\"button\"\nicon=\"pi pi-search\"\nid=\"searchGlobalFilterBtn\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i9.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i10.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "directive", type: i11.InputText, selector: "[pInputText]" }, { kind: "component", type: i12.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i13.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i14.AppFilterMenuComponent, selector: "se-filter-menu", inputs: ["globalFilter"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); }
|
|
505
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SeGlobalFilterComponent, selector: "se-global-filters", inputs: { globalFilters: "globalFilters", searchGlobalFilterBtn: "searchGlobalFilterBtn", clearGlobalFilterBtn: "clearGlobalFilterBtn", activeTestMode: "activeTestMode" }, outputs: { filtersApplied: "filtersApplied", updateValue: "updateValue" }, viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["rangeCalendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span>\n {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (click)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <!-- <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div> -->\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Radio Button control -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.RADIOBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n\n \n <div [class]=\"globalFilter.displayStyle=='horizontal' ? 'flex flex-wrap gap-3' : 'flex flex-column gap-3' \">\n <div *ngFor=\"let category of globalFilter.data\" class=\"field-checkbox\"> \n <p-radioButton \n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [disabled]=\"globalFilter.disabled\"\n [value]=\"category.key\" \n name=\"pi pi-check\"\n [(ngModel)]=\"globalFilter.value\">\n </p-radioButton>\n <label [for]=\"category.key\" class=\"ml-2\">{{ category.name }}</label>\n </div>\n </div>\n\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n \n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\ntype=\"button\"\nicon=\"pi pi-search\"\nid=\"searchGlobalFilterBtn\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i6.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: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i8.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i9.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i10.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "directive", type: i11.InputText, selector: "[pInputText]" }, { kind: "component", type: i12.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i13.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i14.AppFilterMenuComponent, selector: "se-filter-menu", inputs: ["globalFilter"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] }); }
|
|
497
506
|
}
|
|
498
507
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SeGlobalFilterComponent, decorators: [{
|
|
499
508
|
type: Component,
|
|
500
|
-
args: [{ selector: 'se-global-filters', template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span>\n {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (click)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Radio Button control -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.RADIOBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n\n \n <div [class]=\"globalFilter.displayStyle=='horizontal' ? 'flex flex-wrap gap-3' : 'flex flex-column gap-3' \">\n <div *ngFor=\"let category of globalFilter.data\" class=\"field-checkbox\"> \n <p-radioButton \n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [disabled]=\"globalFilter.disabled\"\n [value]=\"category.key\" \n name=\"pi pi-check\"\n [(ngModel)]=\"globalFilter.value\">\n </p-radioButton>\n <label [for]=\"category.key\" class=\"ml-2\">{{ category.name }}</label>\n </div>\n </div>\n\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n \n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\ntype=\"button\"\nicon=\"pi pi-search\"\nid=\"searchGlobalFilterBtn\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"] }]
|
|
509
|
+
args: [{ selector: 'se-global-filters', template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span>\n {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n >\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (click)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <!-- <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div> -->\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" style=\"display: none;\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"pi pi-check\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 mr-2 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Radio Button control -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.RADIOBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n\n \n <div [class]=\"globalFilter.displayStyle=='horizontal' ? 'flex flex-wrap gap-3' : 'flex flex-column gap-3' \">\n <div *ngFor=\"let category of globalFilter.data\" class=\"field-checkbox\"> \n <p-radioButton \n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [disabled]=\"globalFilter.disabled\"\n [value]=\"category.key\" \n name=\"pi pi-check\"\n [(ngModel)]=\"globalFilter.value\">\n </p-radioButton>\n <label [for]=\"category.key\" class=\"ml-2\">{{ category.name }}</label>\n </div>\n </div>\n\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n \n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\ntype=\"button\"\nicon=\"pi pi-search\"\nid=\"searchGlobalFilterBtn\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"] }]
|
|
501
510
|
}], ctorParameters: function () { return [{ type: i1.DatePipe }, { type: i2.DynamicDialogRef, decorators: [{
|
|
502
511
|
type: Optional
|
|
503
512
|
}] }, { type: i2.DynamicDialogConfig, decorators: [{
|
|
@@ -518,4 +527,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
|
|
|
518
527
|
}], activeTestMode: [{
|
|
519
528
|
type: Input
|
|
520
529
|
}] } });
|
|
521
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkL2dsb2JhbC1maWx0ZXJzL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlLXVpLXRvb2xraXQvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC9nbG9iYWwtZmlsdGVycy9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUVMLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsU0FBUyxFQUNULGdCQUFnQixHQUVqQixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBU3BDLE1BQU0sT0FBTyx1QkFBdUI7SUFPbEMsSUFBYSxjQUFjLENBQUUsR0FBTyxJQUFJLElBQUcsR0FBRyxLQUFLLElBQUksRUFBRTtRQUFFLFFBQVEsQ0FBQTtLQUFFLENBQUEsQ0FBQztJQWF0RSxZQUNTLFFBQWtCLEVBQ04sR0FBcUIsRUFDckIsTUFBMkIsRUFDdEMsV0FBd0IsRUFDekIsYUFBNEIsRUFDM0IsWUFBMEIsRUFDMUIsRUFBYztRQU5mLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDTixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUN0QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN6QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FB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QWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDTSxjQUFjO3NCQUExQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ1JlZiwgRHluYW1pY0RpYWxvZ0NvbmZpZywgRGlhbG9nU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQge1xuICBJR2xvYmFsRmlsdGVyLFxuICBHcmlkRmlsdGVyQ29udHJvbFR5cGUsXG4gIEVHcmlkQ29sdW1uVHlwZSxcbiAgYWRkR2xvYmFsRmlsdGVyLFxuICBFRGF5UmFuZ2UsXG4gIEVGaWx0ZXJWYWxpZGF0b3IsXG4gIElHcmlkVXBkYXRlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UtZ2xvYmFsLWZpbHRlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZUdsb2JhbEZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3JhbmdlQ2FsZW5kYXInKSBkYXRlUGlja2VyOiBhbnk7XG4gIEBJbnB1dCgpIGdsb2JhbEZpbHRlcnM6IElHbG9iYWxGaWx0ZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzZWFyY2hHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2xlYXJHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIGZpbHRlcnNBcHBsaWVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHVwZGF0ZVZhbHVlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgc2V0IGFjdGl2ZVRlc3RNb2RlICh2YWw6YW55KSB7IGlmKHZhbCA9PT0gdHJ1ZSkgeyBkZWJ1Z2dlciB9fVxuXG4gIHB1YmxpYyBmaXRlclR5cGVzID0gR3JpZEZpbHRlckNvbnRyb2xUeXBlO1xuICBwdWJsaWMgY29sdW1uVHlwZSA9IEVHcmlkQ29sdW1uVHlwZTtcbiAgcHVibGljIHNob3dEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHN0YXJ0RGF0ZTogRGF0ZTtcbiAgcHVibGljIGVuZERhdGU6IERhdGU7XG5cbiAgc2hvd0lucHV0OiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlcjogYW55ID0gJyc7XG4gIGhpZGVDbGVhckZpbHRlckJ0bjogYm9vbGVhbiA9IHRydWU7XG4gIGNhbGVuZGFyRm9ybWF0OnN0cmluZyA9ICdtbS9kZC95eSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRhdGVwaXBlOiBEYXRlUGlwZSxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcmVmOiBEeW5hbWljRGlhbG9nUmVmLFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcsXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogR3JpZFNlcnZpY2UsXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICApIHsgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25tZW50IG9mIHNlbGVjdGVkIGNvbHVtbnMgb24gcGFnZSBsb2FkXG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5kYXRhKXtcbiAgICAgIHRoaXMuc2hvd0RpYWxvZyA9IHRoaXMuY29uZmlnLmRhdGEub3BlbkRpYWxvZztcbiAgICAgIGlmKHRoaXMuY29uZmlnLmRhdGEuZ2xvYmFsRmlsdGVycyl7XG4gICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVycyA9IHRoaXMuY29uZmlnPy5kYXRhLmdsb2JhbEZpbHRlcnMgYXMgSUdsb2JhbEZpbHRlcltdO1xuICAgICAgfVxuICAgICBcbiAgICAgIC8vIHNldCBCeSBEZWZ1YWx0IENhbGVuZGFyIFJhbmdlXG4gICAgICB0aGlzLnNldERlZnVhbHRDYWxlbmRhclJhbmdlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBzcGxpdGluZyBkYXRlIHJhbmdlIHZhbHVlIGFuZCBhc3NpZ24gdG8gdmFsdWUgYW5kIHZhbHVlVHdvIGluIERhdGVfUmFuZ2UgQ29udHJvbFxuICAgICAgY29uc3QgZGF0ZVJhbmdlRmlsdGVyID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoZmlsdGVyKT0+IGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSk7IFxuICAgICAgZGF0ZVJhbmdlRmlsdGVyPy5mb3JFYWNoKChkYXRlUmFuZ2UpPT57XG4gICAgICBpZihkYXRlUmFuZ2UudmFsdWUgJiYgZGF0ZVJhbmdlLnZhbHVlVHdvKXtcbiAgICAgICAgaWYodHlwZW9mKGRhdGVSYW5nZS52YWx1ZSk9PT0nb2JqZWN0Jyl7XG4gICAgICAgICAgZGF0ZVJhbmdlLnZhbHVlPWRhdGVSYW5nZS52YWx1ZS50b0xvY2FsZURhdGVTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0eXBlb2YoZGF0ZVJhbmdlLnZhbHVlVHdvKT09PSdvYmplY3QnKXtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVUd289ZGF0ZVJhbmdlLnZhbHVlVHdvLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGVSYW5nZS52YWx1ZSA9IChkYXRlUmFuZ2UudmFsdWUgKyBcIi1cIiArIGRhdGVSYW5nZS52YWx1ZVR3byk/LnRvU3RyaW5nKCk/LnNwbGl0KCctJyk7IFxuICAgICAgICB0aGlzLnNldERhdGVSYW5nZUZpbHRlclZhbHVlKGRhdGVSYW5nZSk7XG4gICAgICB9IGVsc2UgaWYoZGF0ZVJhbmdlLnZhbHVlICYmICFkYXRlUmFuZ2UudmFsdWVUd28pe1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhkYXRlUmFuZ2UuZnJvbUZpZWxkLGRhdGVSYW5nZS52YWx1ZSwnZ3RlJyk7XG4gICAgICB9IGVsc2UgaWYoIWRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pe1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhkYXRlUmFuZ2UuZnJvbUZpZWxkLGRhdGVSYW5nZS52YWx1ZVR3bywnZ3RlJyk7XG4gICAgICB9XG4gICAgICB9KVxuICAgICAgLy8gRmlsdHJpbmcgTnVtZXJpYyBSYW5nZSBjb250cm9scyBvbiBnbG9iYWwgZmlsdGVyIFxuICAgICAgY29uc3QgbnVtZXJSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcik9PiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UpO1xuICAgICAgbnVtZXJSYW5nZUZpbHRlci5mb3JFYWNoKChudW1lcmljUmFuZ2UpID0+e1xuICAgICAgICBpZihudW1lcmljUmFuZ2Upe1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShudW1lcmljUmFuZ2UpO1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlVHdvKG51bWVyaWNSYW5nZSk7XG4gICAgICB9XG4gICAgICB9KVxuICAgICAgaWYoISh0aGlzLmdsb2JhbEZpbHRlcnMuc29tZSgoZmlsdGVyKT0+IGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuQ0FMRU5EQVJfUkFOR0UpKSAmJlxuICAgICAgICh0aGlzLmdsb2JhbEZpbHRlcnMuc29tZSgoZmlsdGVyKT0+IGZpbHRlci52YWx1ZSkpXG4gICAgICAgKXtcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcnMoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIDUwMCk7XG4gIH1cblxuICBzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShkYXRlUmFuZ2Upe1xuICAgIGlmKGRhdGVSYW5nZT8udmFsdWU/Lmxlbmd0aCA+IDEpe1xuICAgICAgZGF0ZVJhbmdlLnZhbHVlWzBdID0gbmV3IERhdGUoZGF0ZVJhbmdlLnZhbHVlWzBdKTtcbiAgICAgIGRhdGVSYW5nZS52YWx1ZVsxXSA9IG5ldyBEYXRlKGRhdGVSYW5nZS52YWx1ZVsxXSk7XG4gICAgICB0aGlzLnNlbGVjdERhdGUoZGF0ZVJhbmdlLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIFxuICBjb250YWluc1doaXRlc3BhY2Uoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5pbmNsdWRlcygnICcpO1xuICB9XG5cbiAgYWRkU3BhY2VzYXRmaXJzdCh4KSB7XG4gICAgcmV0dXJuIFwiIFwiICsgeDtcbiAgfVxuXG4gIGFkZFNwYWNlc2F0bGFzdCh4KSB7XG4gICAgcmV0dXJuIHggKyBcIiBcIlxuICB9XG5cbiAgLy8gY2hhbmdlIGNhbGVuZGFyIGZvcm1hdCBvbiBydW4gdGltZSBpZiB1c2VyIHR5cGUgZGF0ZSBvbiB0aGUgY2FsZW5kYXIgZmllbGQuXG4gIGNhbGVuZGFyRm9jdXNFdmVudChnbG9iYWxGaWx0ZXI6SUdsb2JhbEZpbHRlciwgZXZlbnQ/OiBhbnkpe1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0KVswXT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoYTogYW55KSA9PiB7XG4gICAgICBsZXQgeWVhciA9IGE/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XG4gICAgICB5ZWFyID0geWVhcj8udG9TdHJpbmcoKS5zcGxpdChcIiBcIilbMF07XG5cbiAgICAgIGxldCBkYXRlUmFuZ2VWYWx1ZSA9IGE/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCctJykgPyBhPy50YXJnZXQ/LnZhbHVlPy5zcGxpdCgnLScpIDogJyc7XG4gICAgICAvLyBhZGRpbmcgc3BhY2UgYmV0d2VlbiBmcm9tIGFuZCB0byBkYXRlIGluIGRhdGUgcmFuZ2UgZmlsdGVyXG4gICAgICBpZiAoZGF0ZVJhbmdlVmFsdWUubGVuZ3RoID09IDIgJiYgZGF0ZVJhbmdlVmFsdWVbMV0uc3BsaXQoJy8nKS5sZW5ndGggPT0gMyAmJiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSB8fCAhdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSkge1xuICAgICAgICAgIGxldCBmcm9tRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRsYXN0KGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZVswXSA9IGZyb21EYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSB7XG4gICAgICAgICAgbGV0IHRvRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRmaXJzdChkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgZGF0ZVJhbmdlVmFsdWVbMV0gPSB0b0RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsdWUgPSBkYXRlUmFuZ2VWYWx1ZVswXSArICctJyArIGRhdGVSYW5nZVZhbHVlWzFdXG4gICAgICAgIGEudGFyZ2V0LnZhbHVlID0gYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmKHllYXI/Lmxlbmd0aCA9PT0gNCl7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkNBTEVOREFSKXtcbiAgICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShhLnRhcmdldC52YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZih5ZWFyPy5sZW5ndGgpe1xuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB5ZWFyVmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZT8udG9TdHJpbmcoKT8uc3BsaXQoJy8nKVs0XTtcbiAgICBpZigoIWdsb2JhbEZpbHRlci52YWx1ZSB8fCB5ZWFyVmFsdWUgPT0gdW5kZWZpbmVkIHx8IHllYXJWYWx1ZT8udG9TdHJpbmcoKT8ubGVuZ3RoID09PSAxKSAmJiBnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0Upe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuICBjaGVja0lmRmlsdGVyUmVxdWlyZWQoZmlsdGVyOklHbG9iYWxGaWx0ZXIpe1xuICAgIGlmKGZpbHRlci52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FRmlsdGVyVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWx0ZXIucmVxdWlyZWRGaWVsZD10cnVlO1xuICAgIH0gICAgXG4gIH1cbiAgY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKHJlbW92ZUVycm9yOmJvb2xlYW4gPSBmYWxzZSk6Ym9vbGVhbntcbiAgICBsZXQgdmFsaWQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIGlmKHRoaXMuZ2xvYmFsRmlsdGVycyAmJiB0aGlzLmdsb2JhbEZpbHRlcnMubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKT0+e1xuICAgICAgICBpZihmaWx0ZXIudmFsaWRhdGlvbnMgJiYgZmlsdGVyLnZhbGlkYXRpb25zLmxlbmd0aCA+IDAgJiYgZmlsdGVyLnZhbGlkYXRpb25zWzBdLnR5cGUgPT09IEVGaWx0ZXJWYWxpZGF0b3IuUkVRVUlSRUQgJiYgIWZpbHRlci52YWx1ZSAmJiAhcmVtb3ZlRXJyb3Ipe1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICBmaWx0ZXIuZXJyb3JNZXNzYWdlID0gZmlsdGVyLmRpc3BsYXlUZXh0K1wiIGlzIHJlcXVpcmVkXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVyLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpe1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyKT0+e1xuICAgICAgdGhpcy5jaGVja0lmRmlsdGVyUmVxdWlyZWQoZmlsdGVyKTtcbiAgICAgIGlmKGZpbHRlci52YWx1ZSAmJiAoZmlsdGVyLmhpZGRlbiA9PT0gZmFsc2UgfHwgZmlsdGVyLmhpZGRlbiA9PT0gdW5kZWZpbmVkKSl7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRXZlbnQoZmlsdGVyKTtcbiAgICAgIH1cbiAgICAgfSlcbiAgICAvLyBzZXQgQnkgRGVmdWFsdCBDYWxlbmRhciBSYW5nZVxuICAgIHRoaXMuc2V0RGVmdWFsdENhbGVuZGFyUmFuZ2UoZmFsc2UpO1xuICAgIGNvbnN0IGdpcmRDbGVhckZpbHRlckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgJ2NsZWFyR3JpZEZpbHRlclZhbHVlc0J1dHRvbidcbiAgICApO1xuICAgIGlmKGdpcmRDbGVhckZpbHRlckJ0bil7XG4gICAgICBpZihnaXJkQ2xlYXJGaWx0ZXJCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24nKSl7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICAgIH1lbHNle1xuICAgICAgICB0aGlzLmhpZGVDbGVhckZpbHRlckJ0biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1lbHNle1xuICAgICAgdGhpcy5oaWRlQ2xlYXJGaWx0ZXJCdG4gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlVHdvKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlciwgc2VuZFJlcXVlc3Q6Ym9vbGVhbiA9IGZhbHNlKXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudG9GaWVsZCl7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLCdsdGUnLCBnbG9iYWxGaWx0ZXIpO1xuICAgIH1cbiAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIG1hdGNoU2FtZUZpZWxkcyhmaWVsZDogc3RyaW5nLHZhbHVlOmFueSwgb3BlcmF0b3I6c3RyaW5nLCBudW1lclJhbmdlRmlsdGVyOiBhbnkgPSB7fSl7XG4gICAgICBpZihmaWVsZCl7XG4gICAgICAgIGlmKG51bWVyUmFuZ2VGaWx0ZXIgJiYgbnVtZXJSYW5nZUZpbHRlcj8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcgJiYgdmFsdWUpe1xuICAgICAgICAgIGNvbnN0IGRpZ2l0SW5mbyA9IG51bWVyUmFuZ2VGaWx0ZXI/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgIGlmKGRpZ2l0SW5mbyl7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKGRpZ2l0SW5mbyk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWVsZCA9PT0gZmlsdGVyLmZpZWxkKTtcbiAgICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzW2luZGV4XSA9IHtmaWVsZDogZmllbGQsIG1hdGNoTW9kZTonYW5kJywgb3BlcmF0b3I6IG9wZXJhdG9yLCB2YWx1ZTogdmFsdWV9OyAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMucHVzaCh7ZmllbGQ6IGZpZWxkLCBtYXRjaE1vZGU6J2FuZCcsIG9wZXJhdG9yOiBvcGVyYXRvciwgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIHNlbmRSZXF1ZXN0OmJvb2xlYW4gPSBmYWxzZSkge1xuICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCl7IFxuICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCxnbG9iYWxGaWx0ZXIudmFsdWUsJ2d0ZScsIGdsb2JhbEZpbHRlcik7XG4gICAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9XG4gICAgIH1cbiAgXG4gIH1cbiAgbG9va3VwQ2xlYXJWYWx1ZShnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYgKGdsb2JhbEZpbHRlcikge1xuXG4gICAgICBnbG9iYWxGaWx0ZXIudmFsdWU/Z2xvYmFsRmlsdGVyLnZhbHVlPScnOicnXG4gICAgICBnbG9iYWxGaWx0ZXIudmFsdWVUd28/Z2xvYmFsRmlsdGVyLnZhbHVlVHdvPScnOicnXG4gICAgIC8vIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dD9nbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQ9Jyc6JydcbiAgICAgIC8vIGNvbHVtbi5kaXNwbGF5RmllbGQ/cm93W2NvbHVtbi5kaXNwbGF5RmllbGRdID0gJyc6JydcbiAgICAgIC8vIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8udGV4dD8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddLnRleHQ9Jyc6JydcbiAgICAgIC8vIHJvd1tjb2x1bW4uZmllbGRdID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgLy8gY29sdW1uLmZpbHRlclZhbHVlID0gJyc7XG4gICAgICAvL3RoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uKTtcbiAgICB9XG4gICAvLyB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgLy8gaWYgKGNvbHVtbi5vbkNoYW5nZSkge1xuICAgIC8vICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcbiAgIC8vIH1cbiAgfVxuXG4gIHNldERhdGVSYW5nZVZhbHVlKGdsb2JhbEZpbHRlcjogYW55LCBjbGVhclZhbHVlOiBib29sZWFuID1mYWxzZSkge1xuICAgIGlmKGdsb2JhbEZpbHRlci52YWx1ZT8ubGVuZ3RoID4gMCl7XG4gICAgICBjb25zdCBmcm9tRGF0ZVZhbHVlID0gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVswXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICk7XG4gICAgICBjb25zdCB0b0RhdGVWYWx1ZSA9IHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWVbMV0sXG4gICAgICAgIGdsb2JhbEZpbHRlci5mb3JtYXQgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknXG4gICAgICApO1xuICAgICAgaWYgKGZyb21EYXRlVmFsdWUgJiYgdG9EYXRlVmFsdWUgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCAmJiBnbG9iYWxGaWx0ZXIudG9GaWVsZCkge1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIuZnJvbUZpZWxkLGZyb21EYXRlVmFsdWUsJ2d0ZScpO1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCx0b0RhdGVWYWx1ZSwnbHRlJyk7XG4gICAgICB9XG4gICAgfWVsc2UgaWYoY2xlYXJWYWx1ZSl7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIuZnJvbUZpZWxkLCBudWxsLCAnZ3RlJyk7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgbnVsbCwgJ2x0ZScpO1xuICAgIH1cbiAgfVxuXG5cbiAgb25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcil7XG4gICAgaWYgKGdsb2JhbEZpbHRlciAmJiBnbG9iYWxGaWx0ZXIub25Gb2N1c091dCkge1xuICAgICAgZ2xvYmFsRmlsdGVyLm9uRm9jdXNPdXQoZ2xvYmFsRmlsdGVyKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeShmYWxzZSkpO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQodGhpcy5nbG9iYWxGaWx0ZXJzKTtcbiAgICAgIH0sZ2xvYmFsRmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5MT09LVVBfSU5QVVQgPyAgMjUwIDogMCk7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlLmVtaXQoZ2xvYmFsRmlsdGVyKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyc0V2ZW50KGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcil7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeShmYWxzZSkpO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQodGhpcy5nbG9iYWxGaWx0ZXJzKTtcbiAgICB9LGdsb2JhbEZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuTE9PS1VQX0lOUFVUID8gIDI1MCA6IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IHNlbGVjdGVkIGZpbHRlcnNcbiAgICovXG4gIGFwcGx5RmlsdGVycyhmaWx0ZXJFdmVudDogYm9vbGVhbj0gdHJ1ZSwgZ2xvYmFsRmlsdGVyOmFueSA9IHt9KSB7XG4gICAgaWYoZ2xvYmFsRmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKXtcbiAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICB9IFxuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZpbHRlckV2ZW50O1xuICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICBjb25zdCBpbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KChmaWx0ZXIpPT4gZmlsdGVyLmZpZWxkICYmIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSApXG4gICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICBnbG9iYWxGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICBpZiAodGhpcy5zaG93RGlhbG9nKSB7XG4gICAgICB0aGlzLnJlZi5jbG9zZShnbG9iYWxGaWx0ZXJzKTtcbiAgICB9IGVsc2UgXG4gICAgaWYoIXRoaXMuY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKCkpe1xuICAgICAgdGhpcy5jaGVja0ZpbHRlclZhbGlkYXRpb24odHJ1ZSk7XG4gICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IEJ5IERlZnVhbHQgQ2FsZW5kYXIgUmFuZ2UgXG4gIHNldERlZnVhbHRDYWxlbmRhclJhbmdlKGNoZWNrOiBib29sZWFuID0gdHJ1ZSl7XG4gICAgaWYodGhpcy5nbG9iYWxGaWx0ZXJzICYmIHRoaXMuZ2xvYmFsRmlsdGVycy5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMuZ2xvYmFsRmlsdGVycy5mb3JFYWNoKChmaWx0ZXIpPT57XG4gICAgICAgIGlmKGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuQ0FMRU5EQVJfUkFOR0Upe1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaG93TmV4dChmaWx0ZXIsIGNoZWNrKTtcbiAgICAgICAgICB9LCAxMDApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzaG93TmV4dChmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGNoZWNrOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgbGV0IG5leHRWYWx1ZTogc3RyaW5nO1xuICAgIGxldCBkYXlSYW5nZTogRURheVJhbmdlID0gZmlsdGVyLmRheVJhbmdlXG4gICAgICA/IGZpbHRlci5kYXlSYW5nZVxuICAgICAgOiBFRGF5UmFuZ2UuV0VFSztcbiAgICBzd2l0Y2ggKGRheVJhbmdlKSB7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5EQVk6XG4gICAgICAgIG5leHRWYWx1ZSA9IHRoaXMuc2V0RGF5RmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuTU9OVEg6XG4gICAgICAgIG5leHRWYWx1ZSA9IHRoaXMuc2V0TW9udGhGaWx0ZXIoZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5ZRUFSOlxuICAgICAgICBuZXh0VmFsdWUgPSB0aGlzLnNldFllYXJGaWx0ZXIoZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyB3ZWVrXG4gICAgICAgIG5leHRWYWx1ZSA9IHRoaXMuc2V0V2Vla0ZpbHRlcihmaWx0ZXIsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGNoZWNrO1xuICAgIHRoaXMuZmlsdGVyc0FwcGxpZWQuZW1pdCh0aGlzLmdsb2JhbEZpbHRlcnMpO1xuICAgIHJldHVybiBuZXh0VmFsdWU7XG4gIH1cblxuICBzaG93UHJldmlvdXMoZmlsdGVyOiBJR2xvYmFsRmlsdGVyKTogc3RyaW5nIHtcbiAgICBsZXQgcHJldmlvdXNWYWx1ZTogc3RyaW5nO1xuICAgIGxldCBkYXlSYW5nZTogRURheVJhbmdlID0gZmlsdGVyLmRheVJhbmdlXG4gICAgICA/IGZpbHRlci5kYXlSYW5nZVxuICAgICAgOiBFRGF5UmFuZ2UuV0VFSztcbiAgICBzd2l0Y2ggKGRheVJhbmdlKSB7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5EQVk6XG4gICAgICAgIHByZXZpb3VzVmFsdWUgPSB0aGlzLnNldERheUZpbHRlcihmaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5NT05USDpcbiAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0TW9udGhGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuWUVBUjpcbiAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0WWVhckZpbHRlcihmaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyB3ZWVrXG4gICAgICAgIHByZXZpb3VzVmFsdWUgPSB0aGlzLnNldFdlZWtGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSB0cnVlO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQodGhpcy5nbG9iYWxGaWx0ZXJzKTtcbiAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbiAgfVxuXG4gIHNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXI6IElHbG9iYWxGaWx0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAoZmlsdGVyLnZhbHVlID1cbiAgICAgIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgICAgZmlsdGVyLmZvcm1hdCA/IGZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICkgK1xuICAgICAgJ3wnICtcbiAgICAgIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLmVuZERhdGUsXG4gICAgICAgIGZpbHRlci5mb3JtYXQgPyBmaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknXG4gICAgICApKTtcbiAgfVxuXG4gIHNldERhdGVWYWx1ZShmaWx0ZXI6IGFueSkge1xuICAgIGxldCB2YWx1ZTogRGF0ZTtcbiAgICBpZiAoZmlsdGVyLnZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKGZpbHRlci52YWx1ZS5zcGxpdCgnfCcpWzBdKTtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5zZXRNb250aCh2YWx1ZS5nZXRNb250aCgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERheUZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcblxuICAgIGlmIChpc05leHQpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RGF0ZSgpICsgMVxuICAgICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50RGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgLSAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGN1cnJlbnREYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgKyAxXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0WWVhckZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcbiAgICB2YXIgZmlyc3REYXRlT2ZZZWFyID0gbmV3IERhdGUoY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG5cbiAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSArIDEsIDAsIDEpXG4gICAgICAgIDogZmlyc3REYXRlT2ZZZWFyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpXG4gICAgICAgIDogZmlyc3REYXRlT2ZZZWFyO1xuICAgIH1cblxuICAgIHRoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksIDExLCAzMSk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDYWxlbmRhclJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKTtcbiAgfVxuXG4gIHNldE1vbnRoRmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIHZhciBmaXJzdERhdGVPZk1vbnRoID0gbmV3IERhdGUoXG4gICAgICBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgY3VycmVudERhdGUuZ2V0TW9udGgoKSxcbiAgICAgIDFcbiAgICApO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICAgICAgMVxuICAgICAgICAgIClcbiAgICAgICAgOiBmaXJzdERhdGVPZk1vbnRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSAtIDEsXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mTW9udGg7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUoXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAwXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0V2Vla0ZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcbiAgICBsZXQgZmlyc3REYXkgPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5zZXREYXRlKGZpbHRlci52YWx1ZSA/IGN1cnJlbnREYXRlLmdldERhdGUoKSA6IGN1cnJlbnREYXRlLmdldERhdGUoKSAtIGN1cnJlbnREYXRlLmdldERheSgpICsgMSkpO1xuICAgIGxldCB3ZWVrU2Vjb25kcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldFRpbWUoKSArIHdlZWtTZWNvbmRzKVxuICAgICAgICA6IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRUaW1lKCkgLSB3ZWVrU2Vjb25kcylcbiAgICAgICAgOiBuZXcgRGF0ZShmaXJzdERheS5nZXRUaW1lKCkgLSB3ZWVrU2Vjb25kcyk7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0VGltZSgpICsgNiAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcik7XG4gIH1cblxuICAgIC8qKlxuICAgKiBvcGVuIGRpYWxvZyBvbiBsb29rdXBDb250cm9sIGZpZWxkXG4gICAqL1xuICAgICBzZWxlY3RMb29rdXBGaWVsZChnbG9iYWxGaWx0ZXJzOiBJR2xvYmFsRmlsdGVyKSB7ICAgICAgIFxuICAgICAgdGhpcy5ncmlkU2VydmljZS5zZXRMb29rVXBGaWx0ZXIoZ2xvYmFsRmlsdGVycywgdGhpcy5kaWFsb2dTZXJ2aWNlLCB0cnVlKTtcbiAgICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBmaWx0ZXIgdmFsdWVzXG4gICAqL1xuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXJzLm1hcCgoaXRlbTogYW55KSA9PiAoaXRlbS52YWx1ZSA9IG51bGwpKTtcbiAgICBjb25zdCBjbGVhckdyaWRGaWx0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xlYXJHcmlkRmlsdGVyVmFsdWVzQnV0dG9uJylcbiAgICBpZihjbGVhckdyaWRGaWx0ZXIpe1xuICAgICAgY2xlYXJHcmlkRmlsdGVyLmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgIC8qKlxuICAgKiBDbGVhciB2YWx1ZXMgb2YgRGF0ZSBSYW5nZSBGaWx0ZXJcbiAgICovXG4gICAgY2xlYXJEYXRlUmFuZ2VWYWx1ZShmaWx0ZXI6IGFueSl7XG4gICAgICB0aGlzLnNldERhdGVSYW5nZVZhbHVlKGZpbHRlciwgdHJ1ZSlcbiAgICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGRpYWxvZyB3aXRob3V0IGFwcGx5aW5nIGZpbHRlcnNcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsZWFyRmlsdGVycygpO1xuICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gIH1cbiAgcmFuZ2VEYXRlY2xvc2UoZ2xvYmFsRmlsdGVyOiBhbnkpIHtcbiAgICB0aGlzLmRhdGVQaWNrZXIuaGlkZU92ZXJsYXkoKTtcbiAgICB0aGlzLmRhdGVQaWNrZXIub3ZlcmxheVZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmRhdGVQaWNrZXIuZGF0ZXBpY2tlckNsaWNrID0gdHJ1ZTtcbiAgICBjb25zdCBpZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0KTtcbiAgICBpZC5mb2N1cygpO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5kYXRlcGlja2VyQ2xpY2sgPSB0cnVlO1xuXG4gIH1cblxuICBmaWx0ZXJJbnB1dCgpIHtcbiAgICB0aGlzLnNob3dJbnB1dCA9ICF0aGlzLnNob3dJbnB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VkIHRoZSBjYWxlbmRhciBpbnB1dFxuICAgKi9cbiAgc2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXI6IGFueSwgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlKXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudmFsdWU/Lmxlbmd0aCA+IDEgJiYgZ2xvYmFsRmlsdGVyLnZhbHVlWzFdICE9PSBudWxsKXtcbiAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICAgIGlmKGZvY3VzZWQgPT10cnVlKXtcbiAgICAgIHRoaXMucmFuZ2VEYXRlY2xvc2UoZ2xvYmFsRmlsdGVyKTsgXG4gICAgICB9XG4gICAgfVxuICAgIGlmKGZvY3VzZWQpe1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2xvYmFsRmlsdGVyLmZpZWxkKT8uZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgdGFiRm9jdXNFdmVudChnbG9iYWxGaWx0ZXI6IGFueSkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgJy4nK2dsb2JhbEZpbHRlci5maWVsZFxuICAgICk7XG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgY2xhc3NOYW1lLmNsaWNrKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtY29tcG9uZW50LXdyYXBwZXItZGl2XCI+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmhpZGRlbiA/ICdnbG9iYWxGaWx0ZXJIaWRkZW4nIDogZ2xvYmFsRmlsdGVyLmNvbHVtbiA/ICdjb2wtJyArIGdsb2JhbEZpbHRlci5jb2x1bW4gOiAnY29sLTMnXCJcbiAgICAqbmdGb3I9XCJsZXQgZ2xvYmFsRmlsdGVyIG9mIGdsb2JhbEZpbHRlcnNcIlxuICA+XG4gICAgPGRpdiBbbmdTd2l0Y2hdPVwiZ2xvYmFsRmlsdGVyLnR5cGVcIj5cbiAgICAgIDwhLS0gQ2FsZW5kYXIgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkNBTEVOREFSXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHkgJyArIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dDogJ2ZsZXgtZ3Jvdy0xIG1yLTIgZ3Jvdy0xICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdC1EYXRlJ1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cInNlbGVjdERhdGUoZ2xvYmFsRmlsdGVyLCB0cnVlKVwiXG4gICAgICAgICAgICAgIFtpbnB1dElkXT1cImdsb2JhbEZpbHRlci5maWVsZFwiXG4gICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCJcbiAgICAgICAgICAgICAgKG9uQ2xvc2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChrZXl1cCk9XCJjYWxlbmRhckZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIENhbGVuZGFyIFJhbmdlIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkNBTEVOREFSX1JBTkdFXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1ByZXZpb3VzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBsYWJlbD1cIlByZXZpb3VzIHt7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgICAgIH19IDw8XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBnbG9iYWxGaWx0ZXIuY29sb3IgPyBnbG9iYWxGaWx0ZXIuY29sb3IgOiAnJ31cIiAtLT5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5wcmVmaXg9PT10cnVlIHx8IGdsb2JhbEZpbHRlci5wcmVmaXg9PT11bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgICB7eyAgZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA/IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgOiAnJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgc3RhcnREYXRlXG4gICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgOiAoZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eScpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHRvXG4gICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgZW5kRGF0ZVxuICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgIDogKGdsb2JhbEZpbHRlci5mb3JtYXQgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5wcmVmaXg9PT1mYWxzZVwiPlxuICAgICAgICAgICAgICAgIHt7IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgPyBnbG9iYWxGaWx0ZXIubGFiZWxUZXh0IDogJyd9fVxuICAgICAgICAgICAgICA8L3NwYW4+PC9sYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd05leHQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTmV4dCB7e1xuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5kYXlSYW5nZSA/IGdsb2JhbEZpbHRlci5kYXlSYW5nZSA6ICdXZWVrJ1xuICAgICAgICAgICAgICB9fSA+PlwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8IS0tIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogZ2xvYmFsRmlsdGVyLmNvbG9yID8gZ2xvYmFsRmlsdGVyLmNvbG9yIDogJyd9XCIgLS0+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBDaGVja2JveCBDb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0hFQ0tCT1hcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknOiAnZmxleCBhbGlnbi1pdGVtcy1jZW50ZXInXCJcbiAgICAgICAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICA+PC9wLWNoZWNrYm94PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gU3BhY2VyIENvbnRyb2wgLS0+XG4gICAgICA8c3BhbiAqbmdJZj1cIiFnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLlNQQUNFUlwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgW2NsYXNzXT1cIlxuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmNvbHVtblxuICAgICAgICAgICAgICAgID8gJ2NvbC0nICsgZ2xvYmFsRmlsdGVyLmNvbHVtblxuICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gRHJvcGRvd24gQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkRST1BET1dOXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICBbbmFtZV09XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgW3Nob3dDbGVhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cImdsb2JhbEZpbHRlci5maWVsZFwiXG4gICAgICAgICAgICAoa2V5dXAuVGFiKT1cInRhYkZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImdsb2JhbEZpbHRlci5kYXRhIHx8IFtdXCJcbiAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnbG9iYWxGaWx0ZXIub3B0aW9uTGFiZWxcIlxuICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImdsb2JhbEZpbHRlci5vcHRpb25WYWx1ZVwiXG4gICAgICAgICAgICBbZmlsdGVyXT1cImdsb2JhbEZpbHRlci5hbGxvd1NlYXJjaFwiXG4gICAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBJbnB1dCBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuSU5QVVRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWNJbnB1dCBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLk5VTUVSSUNJTlBVVFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIERhdGUgUmFuZ2UgQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkRBVEVfUkFOR0VcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8cC1jYWxlbmRhciBcbiAgICAgICAgICAgICNyYW5nZUNhbGVuZGFyXG4gICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcblxuICAgICAgICAgICAgW2lucHV0SWRdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHkgJyArIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCA6ICdmbGV4LWdyb3ctMSBtci0yIGdyb3ctMSAnICsgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCIgXG4gICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwicmFuZ2VcIiBcbiAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXIsIHRydWUpXCJcbiAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCJcbiAgICAgICAgICAgIChvbkNsb3NlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChvbkNsaWNrT3V0c2lkZSk9XCJzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChvbkJsdXIpPVwic2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAoa2V5dXApPVwiY2FsZW5kYXJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAob25DbGVhckNsaWNrKT1cImNsZWFyRGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnModHJ1ZSwgZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBcbiAgICAgICAgICAgID48L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICA8IS0tIHRvZGF5QnV0dG9uU3R5bGVDbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICBjbGVhckJ1dHRvblN0eWxlQ2xhc3M9XCJtbC1hdXRvXCIgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWMgUmFuZ2UgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5OVU1FUklDX1JBTkdFXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBtci0yXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyLHRydWUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgIGdyb3ctMSBpbnB1dC1udW1iZXInXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG8tbnVtZXJpYyBtci0yXCI+VG88L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVUd29cIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgbXItMiBncm93LTEgaW5wdXQtbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVUd28oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZVR3byhnbG9iYWxGaWx0ZXIsdHJ1ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE11bHRpU2VsZWN0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTVVMVElTRUxFQ1RcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2xvYmFsRmlsdGVyLmRhdGFcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgICA8IS0tIFJhZGlvIEJ1dHRvbiBjb250cm9sIC0tPlxuICAgICAgIDwhLS0gPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLlJBRElPQlVUVE9OXCJcblxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICBcbiAgICAgICAgIDxkaXYgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVN0eWxlPT0naG9yaXpvbnRhbCcgPyAnZmxleCBmbGV4LXdyYXAgZ2FwLTMnIDogJ2ZsZXggZmxleC1jb2x1bW4gZ2FwLTMnIFwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGdsb2JhbEZpbHRlci5kYXRhXCIgY2xhc3M9XCJmaWVsZC1jaGVja2JveFwiPiAgICAgIFxuICAgICAgICAgICAgICA8cC1yYWRpb0J1dHRvbiBcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiY2F0ZWdvcnkua2V5XCIgXG4gICAgICAgICAgICAgIG5hbWU9XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCI+XG4gICAgICAgICAgICA8L3AtcmFkaW9CdXR0b24+XG4gICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImNhdGVnb3J5LmtleVwiIGNsYXNzPVwibWwtMlwiPnt7IGNhdGVnb3J5Lm5hbWUgfX08L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPiAtLT5cblxuXG4gICAgICAgICA8IS0tIFNlbGVjdCBCdXR0b24gY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5TRUxFQ1RCVVRUT05cIlxuXG4gICAgICAgID5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgIFtvcHRpb25zXT1cImdsb2JhbEZpbHRlci5kYXRhXCJcbiAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVN0eWxlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgIFxuICAgICAgICA+XG4gICAgICAgIDwhLS0gPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT5cbiAgICAgICAgICA8aSBbY2xhc3NdPVwiaXRlbS5pY29uXCI+PC9pPlxuICAgICAgPC9uZy10ZW1wbGF0ZT4gLS0+XG4gICAgICA8L3Atc2VsZWN0QnV0dG9uPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cblxuXG4gICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkxPT0tVUF9JTlBVVFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXIgbG9va3VwLWZpbHRlci13cmFwcGVyIGdsb2JhbEZpbHRlcnNcIj4gXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIFtpZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXI/LnZhbHVlVHdvPy50ZXh0ID8gZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLnRleHQgOiBnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdsb2JhbEZpbHRlci5maWVsZFwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChrZXl1cC5UYWIpPVwic2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGxvb2t1cC1pbnB1dFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlclwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHQgbG9va3VwLWlucHV0LWljb24gZ2xvYmFsLWZpbHRlclwiPjwvaT5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRpcmVjdC13cmFwcGVyLWNsb3NlLWljb24tbG9va3VwXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImxvb2t1cENsZWFyVmFsdWUoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICAgICAgICAgICAgIFxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPCEtLSA8c3Bhbj5cbiAgPGkgIGljb249XCJwaSBwaS10aW1lc1wiPjwvaT5cbjwvc3Bhbj4gLS0+XG5cbjwhLS0gQXBwbHkgYnV0dG9uIC0tPlxuXG48YnV0dG9uXG5wQnV0dG9uXG50eXBlPVwiYnV0dG9uXCJcbmljb249XCJwaSBwaS1zZWFyY2hcIlxuaWQ9XCJzZWFyY2hHbG9iYWxGaWx0ZXJCdG5cIlxuKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCJcbmNsYXNzPVwiZ2xvYmFsLXNlYXJjaCBhbGlnbi1nbG9iYWxGaWx0ZXItYnRuIGdsb2JhbC1idG4gaGlkZS1maWx0ZXItYnV0dG9uXCJcbj48L2J1dHRvbj5cblxuPCEtLSBDbG9zZSBidXR0b24gLS0+XG48YnV0dG9uXG5wQnV0dG9uXG5pZD1cImNsZWFyR2xvYmFsRmlsdGVyQnRuXCJcbnR5cGU9XCJidXR0b25cIlxuaWNvbj1cInBpIHBpLXJlcGxheVwiXG4oY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIlxuY2xhc3M9XCJoaWRlLWZpbHRlci1idXR0b25cIlxuPjwvYnV0dG9uPlxuIl19
|
|
530
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkL2dsb2JhbC1maWx0ZXJzL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlLXVpLXRvb2xraXQvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC9nbG9iYWwtZmlsdGVycy9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFaEgsT0FBTyxFQUVMLHFCQUFxQixFQUNyQixlQUFlLEVBRWYsU0FBUyxFQUNULGdCQUFnQixHQUVqQixNQUFNLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBU3BDLE1BQU0sT0FBTyx1QkFBdUI7SUFPbEMsSUFBYSxjQUFjLENBQUUsR0FBTyxJQUFJLElBQUcsR0FBRyxLQUFLLElBQUksRUFBRTtRQUFFLFFBQVEsQ0FBQTtLQUFFLENBQUEsQ0FBQztJQWF0RSxZQUNTLFFBQWtCLEVBQ04sR0FBcUIsRUFDckIsTUFBMkIsRUFDdEMsV0FBd0IsRUFDekIsYUFBNEIsRUFDM0IsWUFBMEIsRUFDMUIsRUFBYztRQU5mLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDTixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUN0QyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN6QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FB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QVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQ25ELEdBQUcsR0FBQyxZQUFZLENBQUMsS0FBSyxDQUN2QixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUU7WUFDYixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDbkI7SUFDSCxDQUFDO2lJQXRqQlUsdUJBQXVCO3FIQUF2Qix1QkFBdUIsa2JDcEJwQywwMnNCQStmQTs7MkZEM2VhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxtQkFBbUI7OzBCQTBCMUIsUUFBUTs7MEJBQ1IsUUFBUTtzSkF0QmlCLFVBQVU7c0JBQXJDLFNBQVM7dUJBQUMsZUFBZTtnQkFDakIsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDTSxjQUFjO3NCQUExQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ1JlZiwgRHluYW1pY0RpYWxvZ0NvbmZpZywgRGlhbG9nU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQge1xuICBJR2xvYmFsRmlsdGVyLFxuICBHcmlkRmlsdGVyQ29udHJvbFR5cGUsXG4gIEVHcmlkQ29sdW1uVHlwZSxcbiAgYWRkR2xvYmFsRmlsdGVyLFxuICBFRGF5UmFuZ2UsXG4gIEVGaWx0ZXJWYWxpZGF0b3IsXG4gIElHcmlkVXBkYXRlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ3JpZC5tb2RlbCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hbGVydC5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2UtZ2xvYmFsLWZpbHRlcnMnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBTZUdsb2JhbEZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ3JhbmdlQ2FsZW5kYXInKSBkYXRlUGlja2VyOiBhbnk7XG4gIEBJbnB1dCgpIGdsb2JhbEZpbHRlcnM6IElHbG9iYWxGaWx0ZXJbXSA9IFtdO1xuICBASW5wdXQoKSBzZWFyY2hHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY2xlYXJHbG9iYWxGaWx0ZXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgQE91dHB1dCgpIGZpbHRlcnNBcHBsaWVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHVwZGF0ZVZhbHVlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgc2V0IGFjdGl2ZVRlc3RNb2RlICh2YWw6YW55KSB7IGlmKHZhbCA9PT0gdHJ1ZSkgeyBkZWJ1Z2dlciB9fVxuXG4gIHB1YmxpYyBmaXRlclR5cGVzID0gR3JpZEZpbHRlckNvbnRyb2xUeXBlO1xuICBwdWJsaWMgY29sdW1uVHlwZSA9IEVHcmlkQ29sdW1uVHlwZTtcbiAgcHVibGljIHNob3dEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHN0YXJ0RGF0ZTogRGF0ZTtcbiAgcHVibGljIGVuZERhdGU6IERhdGU7XG5cbiAgc2hvd0lucHV0OiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlcjogYW55ID0gJyc7XG4gIGhpZGVDbGVhckZpbHRlckJ0bjogYm9vbGVhbiA9IHRydWU7XG4gIGNhbGVuZGFyRm9ybWF0OnN0cmluZyA9ICdtbS9kZC95eSc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRhdGVwaXBlOiBEYXRlUGlwZSxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcmVmOiBEeW5hbWljRGlhbG9nUmVmLFxuICAgIEBPcHRpb25hbCgpIHB1YmxpYyBjb25maWc6IER5bmFtaWNEaWFsb2dDb25maWcsXG4gICAgcHJpdmF0ZSBncmlkU2VydmljZTogR3JpZFNlcnZpY2UsXG4gICAgcHVibGljIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICApIHsgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25tZW50IG9mIHNlbGVjdGVkIGNvbHVtbnMgb24gcGFnZSBsb2FkXG4gICAqL1xuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5kYXRhKXtcbiAgICAgIHRoaXMuc2hvd0RpYWxvZyA9IHRoaXMuY29uZmlnLmRhdGEub3BlbkRpYWxvZztcbiAgICAgIGlmKHRoaXMuY29uZmlnLmRhdGEuZ2xvYmFsRmlsdGVycyl7XG4gICAgICAgIHRoaXMuZ2xvYmFsRmlsdGVycyA9IHRoaXMuY29uZmlnPy5kYXRhLmdsb2JhbEZpbHRlcnMgYXMgSUdsb2JhbEZpbHRlcltdO1xuICAgICAgfVxuICAgICBcbiAgICAgIC8vIHNldCBCeSBEZWZ1YWx0IENhbGVuZGFyIFJhbmdlXG4gICAgICB0aGlzLnNldERlZnVhbHRDYWxlbmRhclJhbmdlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBzcGxpdGluZyBkYXRlIHJhbmdlIHZhbHVlIGFuZCBhc3NpZ24gdG8gdmFsdWUgYW5kIHZhbHVlVHdvIGluIERhdGVfUmFuZ2UgQ29udHJvbFxuICAgICAgY29uc3QgZGF0ZVJhbmdlRmlsdGVyID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoZmlsdGVyKT0+IGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSk7IFxuICAgICAgZGF0ZVJhbmdlRmlsdGVyPy5mb3JFYWNoKChkYXRlUmFuZ2UpPT57XG4gICAgICBpZihkYXRlUmFuZ2UudmFsdWUgJiYgZGF0ZVJhbmdlLnZhbHVlVHdvKXtcbiAgICAgICAgaWYodHlwZW9mKGRhdGVSYW5nZS52YWx1ZSk9PT0nb2JqZWN0Jyl7XG4gICAgICAgICAgZGF0ZVJhbmdlLnZhbHVlPWRhdGVSYW5nZS52YWx1ZS50b0xvY2FsZURhdGVTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0eXBlb2YoZGF0ZVJhbmdlLnZhbHVlVHdvKT09PSdvYmplY3QnKXtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVUd289ZGF0ZVJhbmdlLnZhbHVlVHdvLnRvTG9jYWxlRGF0ZVN0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGVSYW5nZS52YWx1ZSA9IChkYXRlUmFuZ2UudmFsdWUgKyBcIi1cIiArIGRhdGVSYW5nZS52YWx1ZVR3byk/LnRvU3RyaW5nKCk/LnNwbGl0KCctJyk7IFxuICAgICAgICB0aGlzLnNldERhdGVSYW5nZUZpbHRlclZhbHVlKGRhdGVSYW5nZSk7XG4gICAgICB9IGVsc2UgaWYoZGF0ZVJhbmdlLnZhbHVlICYmICFkYXRlUmFuZ2UudmFsdWVUd28pe1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhkYXRlUmFuZ2UuZnJvbUZpZWxkLGRhdGVSYW5nZS52YWx1ZSwnZ3RlJyk7XG4gICAgICB9IGVsc2UgaWYoIWRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pe1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhkYXRlUmFuZ2UuZnJvbUZpZWxkLGRhdGVSYW5nZS52YWx1ZVR3bywnZ3RlJyk7XG4gICAgICB9XG4gICAgICB9KVxuICAgICAgLy8gRmlsdHJpbmcgTnVtZXJpYyBSYW5nZSBjb250cm9scyBvbiBnbG9iYWwgZmlsdGVyIFxuICAgICAgY29uc3QgbnVtZXJSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcik9PiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UpO1xuICAgICAgbnVtZXJSYW5nZUZpbHRlci5mb3JFYWNoKChudW1lcmljUmFuZ2UpID0+e1xuICAgICAgICBpZihudW1lcmljUmFuZ2Upe1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShudW1lcmljUmFuZ2UpO1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlVHdvKG51bWVyaWNSYW5nZSk7XG4gICAgICB9XG4gICAgICB9KVxuICAgICAgaWYoISh0aGlzLmdsb2JhbEZpbHRlcnMuc29tZSgoZmlsdGVyKT0+IGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuQ0FMRU5EQVJfUkFOR0UpKSAmJlxuICAgICAgICh0aGlzLmdsb2JhbEZpbHRlcnMuc29tZSgoZmlsdGVyKT0+IGZpbHRlci52YWx1ZSkpXG4gICAgICAgKXtcbiAgICAgICAgdGhpcy5hcHBseUZpbHRlcnMoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIDUwMCk7XG4gIH1cblxuICBzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShkYXRlUmFuZ2Upe1xuICAgIGlmKGRhdGVSYW5nZT8udmFsdWU/Lmxlbmd0aCA+IDEpe1xuICAgICAgZGF0ZVJhbmdlLnZhbHVlWzBdID0gbmV3IERhdGUoZGF0ZVJhbmdlLnZhbHVlWzBdKTtcbiAgICAgIGRhdGVSYW5nZS52YWx1ZVsxXSA9IG5ldyBEYXRlKGRhdGVSYW5nZS52YWx1ZVsxXSk7XG4gICAgICB0aGlzLnNlbGVjdERhdGUoZGF0ZVJhbmdlLCBmYWxzZSk7XG4gICAgfVxuICB9XG4gIFxuICBjb250YWluc1doaXRlc3BhY2Uoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5pbmNsdWRlcygnICcpO1xuICB9XG5cbiAgYWRkU3BhY2VzYXRmaXJzdCh4KSB7XG4gICAgcmV0dXJuIFwiIFwiICsgeDtcbiAgfVxuXG4gIGFkZFNwYWNlc2F0bGFzdCh4KSB7XG4gICAgcmV0dXJuIHggKyBcIiBcIlxuICB9XG5cbiAgLy8gY2hhbmdlIGNhbGVuZGFyIGZvcm1hdCBvbiBydW4gdGltZSBpZiB1c2VyIHR5cGUgZGF0ZSBvbiB0aGUgY2FsZW5kYXIgZmllbGQuXG4gIGNhbGVuZGFyRm9jdXNFdmVudChnbG9iYWxGaWx0ZXI6SUdsb2JhbEZpbHRlciwgZXZlbnQ/OiBhbnkpe1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0KVswXT8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoYTogYW55KSA9PiB7XG4gICAgICBsZXQgeWVhciA9IGE/LnRhcmdldD8udmFsdWU/LnRvU3RyaW5nKCk/LnNwbGl0KCcvJylbMl07XG4gICAgICB5ZWFyID0geWVhcj8udG9TdHJpbmcoKS5zcGxpdChcIiBcIilbMF07XG5cbiAgICAgIGxldCBkYXRlUmFuZ2VWYWx1ZSA9IGE/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCctJykgPyBhPy50YXJnZXQ/LnZhbHVlPy5zcGxpdCgnLScpIDogJyc7XG4gICAgICAvLyBhZGRpbmcgc3BhY2UgYmV0d2VlbiBmcm9tIGFuZCB0byBkYXRlIGluIGRhdGUgcmFuZ2UgZmlsdGVyXG4gICAgICBpZiAoZGF0ZVJhbmdlVmFsdWUubGVuZ3RoID09IDIgJiYgZGF0ZVJhbmdlVmFsdWVbMV0uc3BsaXQoJy8nKS5sZW5ndGggPT0gMyAmJiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSB8fCAhdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSkge1xuICAgICAgICAgIGxldCBmcm9tRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRsYXN0KGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZVswXSA9IGZyb21EYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSB7XG4gICAgICAgICAgbGV0IHRvRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRmaXJzdChkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgZGF0ZVJhbmdlVmFsdWVbMV0gPSB0b0RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsdWUgPSBkYXRlUmFuZ2VWYWx1ZVswXSArICctJyArIGRhdGVSYW5nZVZhbHVlWzFdXG4gICAgICAgIGEudGFyZ2V0LnZhbHVlID0gYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmKHllYXI/Lmxlbmd0aCA9PT0gNCl7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkNBTEVOREFSKXtcbiAgICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShhLnRhcmdldC52YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZih5ZWFyPy5sZW5ndGgpe1xuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB5ZWFyVmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZT8udG9TdHJpbmcoKT8uc3BsaXQoJy8nKVs0XTtcbiAgICBpZigoIWdsb2JhbEZpbHRlci52YWx1ZSB8fCB5ZWFyVmFsdWUgPT0gdW5kZWZpbmVkIHx8IHllYXJWYWx1ZT8udG9TdHJpbmcoKT8ubGVuZ3RoID09PSAxKSAmJiBnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0Upe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuICBjaGVja0lmRmlsdGVyUmVxdWlyZWQoZmlsdGVyOklHbG9iYWxGaWx0ZXIpe1xuICAgIGlmKGZpbHRlci52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FRmlsdGVyVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWx0ZXIucmVxdWlyZWRGaWVsZD10cnVlO1xuICAgIH0gICAgXG4gIH1cbiAgY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKHJlbW92ZUVycm9yOmJvb2xlYW4gPSBmYWxzZSk6Ym9vbGVhbntcbiAgICBsZXQgdmFsaWQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIGlmKHRoaXMuZ2xvYmFsRmlsdGVycyAmJiB0aGlzLmdsb2JhbEZpbHRlcnMubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKT0+e1xuICAgICAgICBpZihmaWx0ZXIudmFsaWRhdGlvbnMgJiYgZmlsdGVyLnZhbGlkYXRpb25zLmxlbmd0aCA+IDAgJiYgZmlsdGVyLnZhbGlkYXRpb25zWzBdLnR5cGUgPT09IEVGaWx0ZXJWYWxpZGF0b3IuUkVRVUlSRUQgJiYgIWZpbHRlci52YWx1ZSAmJiAhcmVtb3ZlRXJyb3Ipe1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICBmaWx0ZXIuZXJyb3JNZXNzYWdlID0gZmlsdGVyLmRpc3BsYXlUZXh0K1wiIGlzIHJlcXVpcmVkXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVyLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpe1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyKT0+e1xuICAgICAgdGhpcy5jaGVja0lmRmlsdGVyUmVxdWlyZWQoZmlsdGVyKTtcbiAgICAgIGlmKGZpbHRlci52YWx1ZSAmJiAoZmlsdGVyLmhpZGRlbiA9PT0gZmFsc2UgfHwgZmlsdGVyLmhpZGRlbiA9PT0gdW5kZWZpbmVkKSl7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzRXZlbnQoZmlsdGVyKTtcbiAgICAgIH1cbiAgICAgfSlcbiAgICAvLyBzZXQgQnkgRGVmdWFsdCBDYWxlbmRhciBSYW5nZVxuICAgIHRoaXMuc2V0RGVmdWFsdENhbGVuZGFyUmFuZ2UoZmFsc2UpO1xuICAgIGNvbnN0IGdpcmRDbGVhckZpbHRlckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxuICAgICAgJ2NsZWFyR3JpZEZpbHRlclZhbHVlc0J1dHRvbidcbiAgICApO1xuICAgIGlmKGdpcmRDbGVhckZpbHRlckJ0bil7XG4gICAgICBpZihnaXJkQ2xlYXJGaWx0ZXJCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRlLWNsZWFyLWZpbHRlci1idXR0b24nKSl7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICAgIH1lbHNle1xuICAgICAgICB0aGlzLmhpZGVDbGVhckZpbHRlckJ0biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1lbHNle1xuICAgICAgdGhpcy5oaWRlQ2xlYXJGaWx0ZXJCdG4gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlVHdvKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlciwgc2VuZFJlcXVlc3Q6Ym9vbGVhbiA9IGZhbHNlKXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudG9GaWVsZCl7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLCdsdGUnLCBnbG9iYWxGaWx0ZXIpO1xuICAgIH1cbiAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIG1hdGNoU2FtZUZpZWxkcyhmaWVsZDogc3RyaW5nLHZhbHVlOmFueSwgb3BlcmF0b3I6c3RyaW5nLCBudW1lclJhbmdlRmlsdGVyOiBhbnkgPSB7fSl7XG4gICAgICBpZihmaWVsZCl7XG4gICAgICAgIGlmKG51bWVyUmFuZ2VGaWx0ZXIgJiYgbnVtZXJSYW5nZUZpbHRlcj8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcgJiYgdmFsdWUpe1xuICAgICAgICAgIGNvbnN0IGRpZ2l0SW5mbyA9IG51bWVyUmFuZ2VGaWx0ZXI/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgIGlmKGRpZ2l0SW5mbyl7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKGRpZ2l0SW5mbyk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWVsZCA9PT0gZmlsdGVyLmZpZWxkKTtcbiAgICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzW2luZGV4XSA9IHtmaWVsZDogZmllbGQsIG1hdGNoTW9kZTonYW5kJywgb3BlcmF0b3I6IG9wZXJhdG9yLCB2YWx1ZTogdmFsdWV9OyAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMucHVzaCh7ZmllbGQ6IGZpZWxkLCBtYXRjaE1vZGU6J2FuZCcsIG9wZXJhdG9yOiBvcGVyYXRvciwgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIHNlbmRSZXF1ZXN0OmJvb2xlYW4gPSBmYWxzZSkge1xuICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCl7IFxuICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCxnbG9iYWxGaWx0ZXIudmFsdWUsJ2d0ZScsIGdsb2JhbEZpbHRlcik7XG4gICAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9XG4gICAgIH1cbiAgXG4gIH1cbiAgbG9va3VwQ2xlYXJWYWx1ZShnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYgKGdsb2JhbEZpbHRlcikge1xuXG4gICAgICBnbG9iYWxGaWx0ZXIudmFsdWU/Z2xvYmFsRmlsdGVyLnZhbHVlPScnOicnXG4gICAgICBnbG9iYWxGaWx0ZXIudmFsdWVUd28/Z2xvYmFsRmlsdGVyLnZhbHVlVHdvPScnOicnXG4gICAgIC8vIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dD9nbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQ9Jyc6JydcbiAgICAgIC8vIGNvbHVtbi5kaXNwbGF5RmllbGQ/cm93W2NvbHVtbi5kaXNwbGF5RmllbGRdID0gJyc6JydcbiAgICAgIC8vIHJvd1tjb2x1bW4uZmllbGQrJ19vYmonXT8udGV4dD8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddLnRleHQ9Jyc6JydcbiAgICAgIC8vIHJvd1tjb2x1bW4uZmllbGRdID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgLy8gY29sdW1uLmZpbHRlclZhbHVlID0gJyc7XG4gICAgICAvL3RoaXMuc2V0RmlsdGVyRm9jdXNPdXQoY29sdW1uKTtcbiAgICB9XG4gICAvLyB0aGlzLmJyb3dzZXJDbG9zZUV2ZW50KHRydWUpO1xuICAgLy8gaWYgKGNvbHVtbi5vbkNoYW5nZSkge1xuICAgIC8vICBjb2x1bW4ub25DaGFuZ2Uocm93KTtcbiAgIC8vIH1cbiAgfVxuXG4gIHNldERhdGVSYW5nZVZhbHVlKGdsb2JhbEZpbHRlcjogYW55LCBjbGVhclZhbHVlOiBib29sZWFuID1mYWxzZSkge1xuICAgIGlmKGdsb2JhbEZpbHRlci52YWx1ZT8ubGVuZ3RoID4gMCl7XG4gICAgICBjb25zdCBmcm9tRGF0ZVZhbHVlID0gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVswXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICk7XG4gICAgICBjb25zdCB0b0RhdGVWYWx1ZSA9IHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWVbMV0sXG4gICAgICAgIGdsb2JhbEZpbHRlci5mb3JtYXQgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknXG4gICAgICApO1xuICAgICAgaWYgKGZyb21EYXRlVmFsdWUgJiYgdG9EYXRlVmFsdWUgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCAmJiBnbG9iYWxGaWx0ZXIudG9GaWVsZCkge1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIuZnJvbUZpZWxkLGZyb21EYXRlVmFsdWUsJ2d0ZScpO1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCx0b0RhdGVWYWx1ZSwnbHRlJyk7XG4gICAgICB9XG4gICAgfWVsc2UgaWYoY2xlYXJWYWx1ZSl7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIuZnJvbUZpZWxkLCBudWxsLCAnZ3RlJyk7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgbnVsbCwgJ2x0ZScpO1xuICAgIH1cbiAgfVxuXG5cbiAgb25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcil7XG4gICAgaWYgKGdsb2JhbEZpbHRlciAmJiBnbG9iYWxGaWx0ZXIub25Gb2N1c091dCkge1xuICAgICAgZ2xvYmFsRmlsdGVyLm9uRm9jdXNPdXQoZ2xvYmFsRmlsdGVyKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeShmYWxzZSkpO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQodGhpcy5nbG9iYWxGaWx0ZXJzKTtcbiAgICAgIH0sZ2xvYmFsRmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5MT09LVVBfSU5QVVQgPyAgMjUwIDogMCk7XG4gICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PSAnY2hlY2tib3gnKXtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZS5lbWl0KGdsb2JhbEZpbHRlcik7XG4gICAgICB9XG4gIH1cbiAgdXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcil7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeShmYWxzZSkpO1xuICAgICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gZmFsc2U7XG4gICAgICB9LGdsb2JhbEZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuTE9PS1VQX0lOUFVUID8gIDI1MCA6IDApO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZS5lbWl0KGdsb2JhbEZpbHRlcik7XG4gIH1cblxuICBhcHBseUZpbHRlcnNFdmVudChnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIpe1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcbiAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZhbHNlO1xuICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KHRoaXMuZ2xvYmFsRmlsdGVycyk7XG4gICAgfSxnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkxPT0tVUF9JTlBVVCA/ICAyNTAgOiAwKTtcbiAgfVxuICAvKipcbiAgICogQXBwbHkgc2VsZWN0ZWQgZmlsdGVyc1xuICAgKi9cbiAgYXBwbHlGaWx0ZXJzKGZpbHRlckV2ZW50OiBib29sZWFuPSB0cnVlLCBnbG9iYWxGaWx0ZXI6YW55ID0ge30pIHtcbiAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0Upe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShnbG9iYWxGaWx0ZXIpO1xuICAgIH0gXG4gICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gZmlsdGVyRXZlbnQ7XG4gICAgY29uc3QgZ2xvYmFsRmlsdGVycyA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKHgpID0+IHguZmllbGQpO1xuICAgIGNvbnN0IGluZGV4ID0gZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWx0ZXIuZmllbGQgJiYgZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFIClcbiAgICBpZihpbmRleCA+IC0xKXtcbiAgICAgIGdsb2JhbEZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xuICAgIGlmICh0aGlzLnNob3dEaWFsb2cpIHtcbiAgICAgIHRoaXMucmVmLmNsb3NlKGdsb2JhbEZpbHRlcnMpO1xuICAgIH0gZWxzZSBcbiAgICBpZighdGhpcy5jaGVja0ZpbHRlclZhbGlkYXRpb24oKSl7XG4gICAgICB0aGlzLmNoZWNrRmlsdGVyVmFsaWRhdGlvbih0cnVlKTtcbiAgICAgIHRoaXMuZmlsdGVyc0FwcGxpZWQuZW1pdChnbG9iYWxGaWx0ZXJzKTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgQnkgRGVmdWFsdCBDYWxlbmRhciBSYW5nZSBcbiAgc2V0RGVmdWFsdENhbGVuZGFyUmFuZ2UoY2hlY2s6IGJvb2xlYW4gPSB0cnVlKXtcbiAgICBpZih0aGlzLmdsb2JhbEZpbHRlcnMgJiYgdGhpcy5nbG9iYWxGaWx0ZXJzLmxlbmd0aCA+IDApe1xuICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzLmZvckVhY2goKGZpbHRlcik9PntcbiAgICAgICAgaWYoZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5DQUxFTkRBUl9SQU5HRSl7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNob3dOZXh0KGZpbHRlciwgY2hlY2spO1xuICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNob3dOZXh0KGZpbHRlcjogSUdsb2JhbEZpbHRlciwgY2hlY2s6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBsZXQgbmV4dFZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGRheVJhbmdlOiBFRGF5UmFuZ2UgPSBmaWx0ZXIuZGF5UmFuZ2VcbiAgICAgID8gZmlsdGVyLmRheVJhbmdlXG4gICAgICA6IEVEYXlSYW5nZS5XRUVLO1xuICAgIHN3aXRjaCAoZGF5UmFuZ2UpIHtcbiAgICAgIGNhc2UgRURheVJhbmdlLkRBWTpcbiAgICAgICAgbmV4dFZhbHVlID0gdGhpcy5zZXREYXlGaWx0ZXIoZmlsdGVyLCB0cnVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5NT05USDpcbiAgICAgICAgbmV4dFZhbHVlID0gdGhpcy5zZXRNb250aEZpbHRlcihmaWx0ZXIsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLllFQVI6XG4gICAgICAgIG5leHRWYWx1ZSA9IHRoaXMuc2V0WWVhckZpbHRlcihmaWx0ZXIsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHdlZWtcbiAgICAgICAgbmV4dFZhbHVlID0gdGhpcy5zZXRXZWVrRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh0cnVlKSk7XG4gICAgdGhpcy5ncmlkU2VydmljZS5hcHBseUZpbHRlckV2ZW50ID0gY2hlY2s7XG4gICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KHRoaXMuZ2xvYmFsRmlsdGVycyk7XG4gICAgcmV0dXJuIG5leHRWYWx1ZTtcbiAgfVxuXG4gIHNob3dQcmV2aW91cyhmaWx0ZXI6IElHbG9iYWxGaWx0ZXIpOiBzdHJpbmcge1xuICAgIGxldCBwcmV2aW91c1ZhbHVlOiBzdHJpbmc7XG4gICAgbGV0IGRheVJhbmdlOiBFRGF5UmFuZ2UgPSBmaWx0ZXIuZGF5UmFuZ2VcbiAgICAgID8gZmlsdGVyLmRheVJhbmdlXG4gICAgICA6IEVEYXlSYW5nZS5XRUVLO1xuICAgIHN3aXRjaCAoZGF5UmFuZ2UpIHtcbiAgICAgIGNhc2UgRURheVJhbmdlLkRBWTpcbiAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0RGF5RmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLk1PTlRIOlxuICAgICAgICBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZXRNb250aEZpbHRlcihmaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5ZRUFSOlxuICAgICAgICBwcmV2aW91c1ZhbHVlID0gdGhpcy5zZXRZZWFyRmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIHdlZWtcbiAgICAgICAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0V2Vla0ZpbHRlcihmaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IHRydWU7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xuICAgIHRoaXMuZmlsdGVyc0FwcGxpZWQuZW1pdCh0aGlzLmdsb2JhbEZpbHRlcnMpO1xuICAgIHJldHVybiBwcmV2aW91c1ZhbHVlO1xuICB9XG5cbiAgc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcjogSUdsb2JhbEZpbHRlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIChmaWx0ZXIudmFsdWUgPVxuICAgICAgdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMuc3RhcnREYXRlLFxuICAgICAgICBmaWx0ZXIuZm9ybWF0ID8gZmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5J1xuICAgICAgKSArXG4gICAgICAnfCcgK1xuICAgICAgdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIHRoaXMuZW5kRGF0ZSxcbiAgICAgICAgZmlsdGVyLmZvcm1hdCA/IGZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICkpO1xuICB9XG5cbiAgc2V0RGF0ZVZhbHVlKGZpbHRlcjogYW55KSB7XG4gICAgbGV0IHZhbHVlOiBEYXRlO1xuICAgIGlmIChmaWx0ZXIudmFsdWUpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoZmlsdGVyLnZhbHVlLnNwbGl0KCd8JylbMF0pO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlLnNldE1vbnRoKHZhbHVlLmdldE1vbnRoKCkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGF5RmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgKyAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGN1cnJlbnREYXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldERhdGUoKSAtIDFcbiAgICAgICAgICApXG4gICAgICAgIDogY3VycmVudERhdGU7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUoXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSxcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldERhdGUoKSArIDFcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcik7XG4gIH1cblxuICBzZXRZZWFyRmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIHZhciBmaXJzdERhdGVPZlllYXIgPSBuZXcgRGF0ZShjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAxKTtcblxuICAgIGlmIChpc05leHQpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpICsgMSwgMCwgMSlcbiAgICAgICAgOiBmaXJzdERhdGVPZlllYXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpIC0gMSwgMCwgMSlcbiAgICAgICAgOiBmaXJzdERhdGVPZlllYXI7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSwgMTEsIDMxKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0TW9udGhGaWx0ZXIoZmlsdGVyOiBJR2xvYmFsRmlsdGVyLCBpc05leHQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHZhciBjdXJyZW50RGF0ZSA9IHRoaXMuc2V0RGF0ZVZhbHVlKGZpbHRlcik7XG4gICAgdmFyIGZpcnN0RGF0ZU9mTW9udGggPSBuZXcgRGF0ZShcbiAgICAgIGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICBjdXJyZW50RGF0ZS5nZXRNb250aCgpLFxuICAgICAgMVxuICAgICk7XG5cbiAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mTW9udGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpIC0gMSxcbiAgICAgICAgICAgIDFcbiAgICAgICAgICApXG4gICAgICAgIDogZmlyc3REYXRlT2ZNb250aDtcbiAgICB9XG5cbiAgICB0aGlzLmVuZERhdGUgPSBuZXcgRGF0ZShcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpICsgMSxcbiAgICAgIDBcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuc2V0Q2FsZW5kYXJSYW5nZUZpbHRlclZhbHVlKGZpbHRlcik7XG4gIH1cblxuICBzZXRXZWVrRmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBsZXQgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIGxldCBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLnNldERhdGUoZmlsdGVyLnZhbHVlID8gY3VycmVudERhdGUuZ2V0RGF0ZSgpIDogY3VycmVudERhdGUuZ2V0RGF0ZSgpIC0gY3VycmVudERhdGUuZ2V0RGF5KCkgKyAxKSk7XG4gICAgbGV0IHdlZWtTZWNvbmRzID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbiAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0VGltZSgpICsgd2Vla1NlY29uZHMpXG4gICAgICAgIDogbmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldFRpbWUoKSAtIHdlZWtTZWNvbmRzKVxuICAgICAgICA6IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSAtIHdlZWtTZWNvbmRzKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZERhdGUgPSBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDYWxlbmRhclJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIG9wZW4gZGlhbG9nIG9uIGxvb2t1cENvbnRyb2wgZmllbGRcbiAgICovXG4gICAgIHNlbGVjdExvb2t1cEZpZWxkKGdsb2JhbEZpbHRlcnM6IElHbG9iYWxGaWx0ZXIpIHsgICAgICAgXG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLnNldExvb2tVcEZpbHRlcihnbG9iYWxGaWx0ZXJzLCB0aGlzLmRpYWxvZ1NlcnZpY2UsIHRydWUpO1xuICAgIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGZpbHRlciB2YWx1ZXNcbiAgICovXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnMubWFwKChpdGVtOiBhbnkpID0+IChpdGVtLnZhbHVlID0gbnVsbCkpO1xuICAgIGNvbnN0IGNsZWFyR3JpZEZpbHRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbGVhckdyaWRGaWx0ZXJWYWx1ZXNCdXR0b24nKVxuICAgIGlmKGNsZWFyR3JpZEZpbHRlcil7XG4gICAgICBjbGVhckdyaWRGaWx0ZXIuY2xpY2soKTtcbiAgICB9XG4gIH1cblxuICAgLyoqXG4gICAqIENsZWFyIHZhbHVlcyBvZiBEYXRlIFJhbmdlIEZpbHRlclxuICAgKi9cbiAgICBjbGVhckRhdGVSYW5nZVZhbHVlKGZpbHRlcjogYW55KXtcbiAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVmFsdWUoZmlsdGVyLCB0cnVlKVxuICAgIH1cblxuICAvKipcbiAgICogQ2xvc2UgZGlhbG9nIHdpdGhvdXQgYXBwbHlpbmcgZmlsdGVyc1xuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xlYXJGaWx0ZXJzKCk7XG4gICAgdGhpcy5yZWYuY2xvc2UoKTtcbiAgfVxuICByYW5nZURhdGVjbG9zZShnbG9iYWxGaWx0ZXI6IGFueSkge1xuICAgIHRoaXMuZGF0ZVBpY2tlci5oaWRlT3ZlcmxheSgpO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5kYXRlcGlja2VyQ2xpY2sgPSB0cnVlO1xuICAgIGNvbnN0IGlkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQpO1xuICAgIGlkLmZvY3VzKCk7XG4gICAgdGhpcy5kYXRlUGlja2VyLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kYXRlUGlja2VyLmRhdGVwaWNrZXJDbGljayA9IHRydWU7XG5cbiAgfVxuXG4gIGZpbHRlcklucHV0KCkge1xuICAgIHRoaXMuc2hvd0lucHV0ID0gIXRoaXMuc2hvd0lucHV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzZWQgdGhlIGNhbGVuZGFyIGlucHV0XG4gICAqL1xuICBzZWxlY3REYXRlKGdsb2JhbEZpbHRlcjogYW55LCBmb2N1c2VkOiBib29sZWFuID0gZmFsc2Upe1xuICAgIGlmKGdsb2JhbEZpbHRlci52YWx1ZT8ubGVuZ3RoID4gMSAmJiBnbG9iYWxGaWx0ZXIudmFsdWVbMV0gIT09IG51bGwpe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIpO1xuICAgICAgaWYoZm9jdXNlZCA9PXRydWUpe1xuICAgICAgdGhpcy5yYW5nZURhdGVjbG9zZShnbG9iYWxGaWx0ZXIpOyBcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoZm9jdXNlZCl7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnbG9iYWxGaWx0ZXIuZmllbGQpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuICB0YWJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcjogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicrZ2xvYmFsRmlsdGVyLmZpZWxkXG4gICAgKTtcbiAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUuY2xpY2soKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1jb21wb25lbnQtd3JhcHBlci1kaXZcIj5cbiAgPGRpdlxuICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuaGlkZGVuID8gJ2dsb2JhbEZpbHRlckhpZGRlbicgOiBnbG9iYWxGaWx0ZXIuY29sdW1uID8gJ2NvbC0nICsgZ2xvYmFsRmlsdGVyLmNvbHVtbiA6ICdjb2wtMydcIlxuICAgICpuZ0Zvcj1cImxldCBnbG9iYWxGaWx0ZXIgb2YgZ2xvYmFsRmlsdGVyc1wiXG4gID5cbiAgICA8ZGl2IFtuZ1N3aXRjaF09XCJnbG9iYWxGaWx0ZXIudHlwZVwiPlxuICAgICAgPCEtLSBDYWxlbmRhciBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0FMRU5EQVJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSAnICsgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0OiAnZmxleC1ncm93LTEgbXItMiBncm93LTEgJyArIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0LURhdGUnXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXIsIHRydWUpXCJcbiAgICAgICAgICAgICAgW2lucHV0SWRdPVwiZ2xvYmFsRmlsdGVyLmZpZWxkXCJcbiAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIlxuICAgICAgICAgICAgICAob25DbG9zZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgIFtzaG93QnV0dG9uQmFyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGtleXVwKT1cImNhbGVuZGFyRm9jdXNFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gQ2FsZW5kYXIgUmFuZ2UgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0FMRU5EQVJfUkFOR0VcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzaG93UHJldmlvdXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUHJldmlvdXMge3tcbiAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgPyBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgOiAnV2VlaydcbiAgICAgICAgICAgICAgfX0gPDxcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGdsb2JhbEZpbHRlci5jb2xvciA/IGdsb2JhbEZpbHRlci5jb2xvciA6ICcnfVwiIC0tPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnByZWZpeD09PXRydWUgfHwgZ2xvYmFsRmlsdGVyLnByZWZpeD09PXVuZGVmaW5lZFwiPlxuICAgICAgICAgICAgICAgIHt7ICBnbG9iYWxGaWx0ZXIubGFiZWxUZXh0ID8gZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA6ICcnIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICBzdGFydERhdGVcbiAgICAgICAgICAgICAgICAgIHwgZGF0ZVxuICAgICAgICAgICAgICAgICAgICA6IChnbG9iYWxGaWx0ZXIuZm9ybWF0ID8gZ2xvYmFsRmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5JylcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgdG9cbiAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICBlbmREYXRlXG4gICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgOiAoZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eScpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnByZWZpeD09PWZhbHNlXCI+XG4gICAgICAgICAgICAgICAge3sgZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA/IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgOiAnJ319XG4gICAgICAgICAgICAgIDwvc3Bhbj48L2xhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzaG93TmV4dChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJOZXh0IHt7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgICAgIH19ID4+XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBnbG9iYWxGaWx0ZXIuY29sb3IgPyBnbG9iYWxGaWx0ZXIuY29sb3IgOiAnJ31cIiAtLT5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIENoZWNrYm94IENvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIiAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5DSEVDS0JPWFwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSc6ICdmbGV4IGFsaWduLWl0ZW1zLWNlbnRlcidcIlxuICAgICAgICAgICAgW2JpbmFyeV09XCJ0cnVlXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgIChvbkNoYW5nZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgID48L3AtY2hlY2tib3g+XG4gICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5TUEFDRVJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5jb2x1bW5cbiAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGdsb2JhbEZpbHRlci5jb2x1bW5cbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIERyb3Bkb3duIENvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIiAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5EUk9QRE9XTlwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgW25hbWVdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc3R5bGVDbGFzc109XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgKGtleXVwLlRhYik9XCJ0YWJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICBbb3B0aW9uc109XCJnbG9iYWxGaWx0ZXIuZGF0YSB8fCBbXVwiXG4gICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiZ2xvYmFsRmlsdGVyLm9wdGlvbkxhYmVsXCJcbiAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJnbG9iYWxGaWx0ZXIub3B0aW9uVmFsdWVcIlxuICAgICAgICAgICAgW2ZpbHRlcl09XCJnbG9iYWxGaWx0ZXIuYWxsb3dTZWFyY2hcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICA+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cblxuICAgICAgPCEtLSBJbnB1dCBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuSU5QVVRcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWNJbnB1dCBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLk5VTUVSSUNJTlBVVFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIERhdGUgUmFuZ2UgQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkRBVEVfUkFOR0VcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8cC1jYWxlbmRhciBcbiAgICAgICAgICAgICNyYW5nZUNhbGVuZGFyXG4gICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcblxuICAgICAgICAgICAgW2lucHV0SWRdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHkgJyArIGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCA6ICdmbGV4LWdyb3ctMSBtci0yIGdyb3ctMSAnICsgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0XCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCIgXG4gICAgICAgICAgICBzZWxlY3Rpb25Nb2RlPVwicmFuZ2VcIiBcbiAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXIsIHRydWUpXCJcbiAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCJcbiAgICAgICAgICAgIChvbkNsb3NlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChvbkNsaWNrT3V0c2lkZSk9XCJzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChvbkJsdXIpPVwic2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAoa2V5dXApPVwiY2FsZW5kYXJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlciwgJGV2ZW50KVwiXG4gICAgICAgICAgICAob25DbGVhckNsaWNrKT1cImNsZWFyRGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnModHJ1ZSwgZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBcbiAgICAgICAgICAgID48L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICA8IS0tIHRvZGF5QnV0dG9uU3R5bGVDbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICBjbGVhckJ1dHRvblN0eWxlQ2xhc3M9XCJtbC1hdXRvXCIgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWMgUmFuZ2UgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5OVU1FUklDX1JBTkdFXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBtci0yXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyLHRydWUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgIGdyb3ctMSBpbnB1dC1udW1iZXInXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG8tbnVtZXJpYyBtci0yXCI+VG88L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVUd29cIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgbXItMiBncm93LTEgaW5wdXQtbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVUd28oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZVR3byhnbG9iYWxGaWx0ZXIsdHJ1ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE11bHRpU2VsZWN0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTVVMVElTRUxFQ1RcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2xvYmFsRmlsdGVyLmRhdGFcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgICA8IS0tIFJhZGlvIEJ1dHRvbiBjb250cm9sIC0tPlxuICAgICAgIDwhLS0gPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLlJBRElPQlVUVE9OXCJcblxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICBcbiAgICAgICAgIDxkaXYgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVN0eWxlPT0naG9yaXpvbnRhbCcgPyAnZmxleCBmbGV4LXdyYXAgZ2FwLTMnIDogJ2ZsZXggZmxleC1jb2x1bW4gZ2FwLTMnIFwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGdsb2JhbEZpbHRlci5kYXRhXCIgY2xhc3M9XCJmaWVsZC1jaGVja2JveFwiPiAgICAgIFxuICAgICAgICAgICAgICA8cC1yYWRpb0J1dHRvbiBcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiY2F0ZWdvcnkua2V5XCIgXG4gICAgICAgICAgICAgIG5hbWU9XCJwaSBwaS1jaGVja1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCI+XG4gICAgICAgICAgICA8L3AtcmFkaW9CdXR0b24+XG4gICAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImNhdGVnb3J5LmtleVwiIGNsYXNzPVwibWwtMlwiPnt7IGNhdGVnb3J5Lm5hbWUgfX08L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPiAtLT5cblxuXG4gICAgICAgICA8IS0tIFNlbGVjdCBCdXR0b24gY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5TRUxFQ1RCVVRUT05cIlxuXG4gICAgICAgID5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgIFtvcHRpb25zXT1cImdsb2JhbEZpbHRlci5kYXRhXCJcbiAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVN0eWxlXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgIFxuICAgICAgICA+XG4gICAgICAgIDwhLS0gPG5nLXRlbXBsYXRlIGxldC1pdGVtIHBUZW1wbGF0ZT5cbiAgICAgICAgICA8aSBbY2xhc3NdPVwiaXRlbS5pY29uXCI+PC9pPlxuICAgICAgPC9uZy10ZW1wbGF0ZT4gLS0+XG4gICAgICA8L3Atc2VsZWN0QnV0dG9uPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cblxuXG4gICAgICA8IS0tIExvb2t1cCBDb250cm9sIEZpZWxkIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIlxuICAgICAgICAgICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkxPT0tVUF9JTlBVVFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXIgbG9va3VwLWZpbHRlci13cmFwcGVyIGdsb2JhbEZpbHRlcnNcIj4gXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIFtpZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXI/LnZhbHVlVHdvPy50ZXh0ID8gZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLnRleHQgOiBnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAoYmx1cik9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIFtuYW1lXT1cImdsb2JhbEZpbHRlci5maWVsZFwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RMb29rdXBGaWVsZChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIChrZXl1cC5UYWIpPVwic2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGxvb2t1cC1pbnB1dFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlclwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWNoZXZyb24tcmlnaHQgbG9va3VwLWlucHV0LWljb24gZ2xvYmFsLWZpbHRlclwiPjwvaT5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlyZWN0LXdyYXBwZXItY2xvc2UtaWNvbi1sb29rdXBcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibG9va3VwQ2xlYXJWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXRpbWVzXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgICAgICAgICAgICAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48IS0tIDxzcGFuPlxuICA8aSAgaWNvbj1cInBpIHBpLXRpbWVzXCI+PC9pPlxuPC9zcGFuPiAtLT5cblxuPCEtLSBBcHBseSBidXR0b24gLS0+XG5cbjxidXR0b25cbnBCdXR0b25cbnR5cGU9XCJidXR0b25cIlxuaWNvbj1cInBpIHBpLXNlYXJjaFwiXG5pZD1cInNlYXJjaEdsb2JhbEZpbHRlckJ0blwiXG4oY2xpY2spPVwiYXBwbHlGaWx0ZXJzKClcIlxuY2xhc3M9XCJnbG9iYWwtc2VhcmNoIGFsaWduLWdsb2JhbEZpbHRlci1idG4gZ2xvYmFsLWJ0biBoaWRlLWZpbHRlci1idXR0b25cIlxuPjwvYnV0dG9uPlxuXG48IS0tIENsb3NlIGJ1dHRvbiAtLT5cbjxidXR0b25cbnBCdXR0b25cbmlkPVwiY2xlYXJHbG9iYWxGaWx0ZXJCdG5cIlxudHlwZT1cImJ1dHRvblwiXG5pY29uPVwicGkgcGktcmVwbGF5XCJcbihjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG5jbGFzcz1cImhpZGUtZmlsdGVyLWJ1dHRvblwiXG4+PC9idXR0b24+XG4iXX0=
|