@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
286 lines • 32.5 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, EventEmitter, Injector, Input, Output } from '@angular/core';
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
import { SmeInternalFormFieldComponent } from '../form-field.component';
import * as i0 from "@angular/core";
import * as i1 from "../../../../directives/autofocus/autofocus.directive";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "../../../../directives/disabled/disabled.directive";
import * as i5 from "../../../tooltip/tooltip.directive";
import * as i6 from "../../validation-alert/validation-alert.component";
import * as i7 from "../../form-field-layout/form-field-layout.component";
const _c0 = ["type", "search"];
function SearchFormFieldComponent_ng_container_3_button_1_Template(rf, ctx) { if (rf & 1) {
const _r7 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 9);
i0.ɵɵlistener("click", function SearchFormFieldComponent_ng_container_3_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r6 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r6.executeDeliberateSearch()); });
i0.ɵɵelement(1, "span", 10);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("smeDisabled", ctx_r4.loadingOrDisabled)("title", ctx_r4.searchButtonText);
i0.ɵɵattribute("aria-label", ctx_r4.searchButtonText);
} }
function SearchFormFieldComponent_ng_container_3_button_2_Template(rf, ctx) { if (rf & 1) {
const _r9 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 11);
i0.ɵɵlistener("click", function SearchFormFieldComponent_ng_container_3_button_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r8.executeDeliberateSearch()); });
i0.ɵɵelement(1, "span", 12);
i0.ɵɵelementStart(2, "span");
i0.ɵɵtext(3);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r5 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("smeDisabled", ctx_r5.loadingOrDisabled);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(ctx_r5.searchButtonText);
} }
function SearchFormFieldComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, SearchFormFieldComponent_ng_container_3_button_1_Template, 2, 3, "button", 7);
i0.ɵɵtemplate(2, SearchFormFieldComponent_ng_container_3_button_2_Template, 4, 2, "button", 8);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r0.emphasizeSearchButton);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.emphasizeSearchButton);
} }
function SearchFormFieldComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
const _r11 = i0.ɵɵgetCurrentView();
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "span", 13);
i0.ɵɵlistener("click", function SearchFormFieldComponent_ng_container_4_Template_span_click_1_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r10.iconClick($event)); });
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} }
function SearchFormFieldComponent_span_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 14);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r2.count ? ctx_r2.strings.MsftSmeShell.Angular.Form.SearchField.count.format(ctx_r2.count) : ctx_r2.strings.MsftSmeShell.Angular.Form.SearchField.count.format(0), " ");
} }
function SearchFormFieldComponent_span_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 14);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r3.strings.MsftSmeShell.Angular.Form.SearchField.Searching.label, " ");
} }
/**
* Accessible search field implementation of .sme-searchbox
*/
export class SearchFormFieldComponent extends SmeInternalFormFieldComponent {
/**
* Initializes a new instance of the SearchFormFieldComponent
*/
constructor(injector) {
super(injector);
/**
* Input binding for whether the user is currently searching in the field. Defaults to false
*/
this.searching = false;
/**
* Input binding for whether to trim leading/trailing whitespace in a search. Defaults to true.
*/
this.trimSearch = true;
/**
* Input binding for whether to emphasize the search button. Defaults to false.
*/
this.emphasizeSearchButton = false;
/**
* Input binding for whether to disable the button and not handle clicks on it.
*/
this.disableSearchButton = false;
/**
* Output binding for the event emitted from typing into the search field, or executing a deliberate search
*/
this.search = new EventEmitter();
/**
* Output binding for event emitted on key press on the search box
*/
this.keyDownEvent = new EventEmitter();
/**
* Output binding for event emitted when focus leaves search box
*/
this.blurEvent = new EventEmitter();
/**
* Output binding for the event emitted from hitting the search button or the enter key
*/
this.deliberateSearch = new EventEmitter();
this.hideHeader = true;
this.searchButtonText = this.strings.MsftSmeShell.Angular.Common.search;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'SearchFormFieldComponent';
}
/**
* Implementation of angular OnInit interface
*/
ngOnInit() {
super.ngOnInit();
this.setAttribute('role', 'search');
}
/**
* Emits the updated search value, after a default debounce time
*/
executeSearch() {
if (this.trimSearch) {
this.search.emit(this.value ? this.value.trim() : this.value);
}
else {
this.search.emit(this.value);
}
}
/**
* Emits the updated deliberate search value, after a default debounce time
*/
executeDeliberateSearch() {
if (this.trimSearch) {
this.deliberateSearch.emit(this.value ? this.value.trim() : this.value);
}
else {
this.deliberateSearch.emit(this.value);
}
}
/**
* Emits events on key press and while focus is on the search box
*/
onKeyDown(event) {
this.keyDownEvent.emit(event);
}
/**
* Emits event when focus leaves the search box
*/
onBlur(event) {
this.blurEvent.emit(event);
}
/**
* Handles the enter key on the search input
*/
onEnterKeyDown($event) {
$event.preventDefault();
$event.stopPropagation();
this.executeSearch();
this.executeDeliberateSearch();
return false;
}
/**
* Handles the click event for the search icon.
*/
iconClick($event) {
$event.preventDefault();
$event.stopPropagation();
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
labelSpan: '',
countSpan: '',
detailsSpan: ''
};
}
}
/** @nocollapse */ SearchFormFieldComponent.ɵfac = function SearchFormFieldComponent_Factory(t) { return new (t || SearchFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ SearchFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: SearchFormFieldComponent, selectors: [["sme-form-field", "type", "search"]], inputs: { count: "count", searching: "searching", trimSearch: "trimSearch", emphasizeSearchButton: "emphasizeSearchButton", searchButtonText: "searchButtonText", disableSearchButton: "disableSearchButton" }, outputs: { search: "search", keyDownEvent: "keyDownEvent", blurEvent: "blurEvent", deliberateSearch: "deliberateSearch" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 11, vars: 17, consts: [[3, "formField"], [1, "sme-searchbox", "sme-searchbox-button-icon"], ["type", "search", 3, "required", "autofocus", "disabled", "ngModel", "placeholder", "ngModelChange", "keydown.Enter", "keydown", "blur"], [4, "ngIf"], [1, "sme-screen-reader", 3, "id"], ["aria-live", "polite", "aria-relevant", "all", 4, "ngIf"], [3, "alert"], ["type", "button", "class", "sme-button-trigger sme-button-auto-width sme-form-field-height", "data-uta-id", "search-button", 3, "smeDisabled", "title", "click", 4, "ngIf"], ["type", "button", "class", "sme-button-primary sme-button-auto-width sme-form-field-height", "data-uta-id", "search-button", 3, "smeDisabled", "click", 4, "ngIf"], ["type", "button", "data-uta-id", "search-button", 1, "sme-button-trigger", "sme-button-auto-width", "sme-form-field-height", 3, "smeDisabled", "title", "click"], [1, "sme-icon", "sme-icon-search", "sme-icon-size-xxs"], ["type", "button", "data-uta-id", "search-button", 1, "sme-button-primary", "sme-button-auto-width", "sme-form-field-height", 3, "smeDisabled", "click"], [1, "sme-icon", "sme-icon-search", "sme-margin-right-xs", "sme-icon-size-xxs"], [1, "sme-icon", "sme-icon-search", "sme-margin-right-xs", "sme-icon-size-xxs", 3, "click"], ["aria-live", "polite", "aria-relevant", "all"]], template: function SearchFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "div", 1)(2, "input", 2);
i0.ɵɵlistener("ngModelChange", function SearchFormFieldComponent_Template_input_ngModelChange_2_listener($event) { return ctx.value = $event; })("ngModelChange", function SearchFormFieldComponent_Template_input_ngModelChange_2_listener() { return ctx.executeSearch(); })("keydown.Enter", function SearchFormFieldComponent_Template_input_keydown_Enter_2_listener($event) { return ctx.onEnterKeyDown($event); })("keydown", function SearchFormFieldComponent_Template_input_keydown_2_listener($event) { return ctx.onKeyDown($event); })("blur", function SearchFormFieldComponent_Template_input_blur_2_listener($event) { return ctx.onBlur($event); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(3, SearchFormFieldComponent_ng_container_3_Template, 3, 2, "ng-container", 3);
i0.ɵɵtemplate(4, SearchFormFieldComponent_ng_container_4_Template, 2, 0, "ng-container", 3);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "span", 4);
i0.ɵɵtext(6);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(7, "span", 4);
i0.ɵɵtemplate(8, SearchFormFieldComponent_span_8_Template, 2, 1, "span", 5);
i0.ɵɵtemplate(9, SearchFormFieldComponent_span_9_Template, 2, 1, "span", 5);
i0.ɵɵelementEnd();
i0.ɵɵelement(10, "sme-validation-alert", 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("formField", ctx);
i0.ɵɵadvance(1);
i0.ɵɵclassProp("sme-disabled", ctx.loadingOrDisabled);
i0.ɵɵadvance(1);
i0.ɵɵproperty("required", ctx.required)("autofocus", ctx.autofocus)("disabled", ctx.loadingOrDisabled)("ngModel", ctx.value)("placeholder", ctx.placeholder);
i0.ɵɵattribute("aria-labelledby", ctx.idBag.labelSpan);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx.disableSearchButton);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.disableSearchButton);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx.idBag.labelSpan);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx.label);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx.idBag.countSpan);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx.searching);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.searching);
i0.ɵɵadvance(1);
i0.ɵɵproperty("alert", ctx.alert);
} }, dependencies: [i1.AutofocusDirective, i2.NgIf, i3.DefaultValueAccessor, i3.NgControlStatus, i3.RequiredValidator, i3.NgModel, i4.DisabledDirective, i5.TooltipDirective, i6.ValidationAlertComponent, i7.FormFieldLayoutComponent], encapsulation: 2 });
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "executeSearch", null);
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "executeDeliberateSearch", null);
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "onKeyDown", null);
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [FocusEvent]),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "onBlur", null);
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SearchFormFieldComponent, [{
type: Component,
args: [{ selector: 'sme-form-field[type="search"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <div class=\"sme-searchbox sme-searchbox-button-icon\" [class.sme-disabled]=\"loadingOrDisabled\">\r\n <input type=\"search\" [attr.aria-labelledby]=\"idBag.labelSpan\" [required]=\"required\" [autofocus]=\"autofocus\"\r\n [disabled]=\"loadingOrDisabled\" [(ngModel)]=\"value\" [placeholder]=\"placeholder\" (ngModelChange)=\"executeSearch()\"\r\n (keydown.Enter)=\"onEnterKeyDown($event)\" (keydown)=\"onKeyDown($event)\" (blur)=\"onBlur($event)\">\r\n <ng-container *ngIf=\"!disableSearchButton\">\r\n <button *ngIf=\"!emphasizeSearchButton\" type=\"button\"\r\n class=\"sme-button-trigger sme-button-auto-width sme-form-field-height\" (click)=\"executeDeliberateSearch()\"\r\n [smeDisabled]=\"loadingOrDisabled\" [attr.aria-label]=\"searchButtonText\" [title]=\"searchButtonText\"\r\n data-uta-id=\"search-button\">\r\n <span class=\"sme-icon sme-icon-search sme-icon-size-xxs\"></span>\r\n </button>\r\n <button *ngIf=\"emphasizeSearchButton\" type=\"button\"\r\n class=\"sme-button-primary sme-button-auto-width sme-form-field-height\" (click)=\"executeDeliberateSearch()\"\r\n [smeDisabled]=\"loadingOrDisabled\" data-uta-id=\"search-button\">\r\n <span class=\"sme-icon sme-icon-search sme-margin-right-xs sme-icon-size-xxs\"></span>\r\n <span>{{searchButtonText}}</span>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"disableSearchButton\">\r\n <span class=\"sme-icon sme-icon-search sme-margin-right-xs sme-icon-size-xxs\" (click)=\"iconClick($event)\"></span>\r\n </ng-container>\r\n </div>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.labelSpan\">{{label}}</span>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.countSpan\">\r\n <span *ngIf=\"!searching\" aria-live=\"polite\" aria-relevant=\"all\">\r\n {{ count ? strings.MsftSmeShell.Angular.Form.SearchField.count.format(count) :\r\n strings.MsftSmeShell.Angular.Form.SearchField.count.format(0) }}\r\n </span>\r\n <span *ngIf=\"searching\" aria-live=\"polite\" aria-relevant=\"all\">\r\n {{strings.MsftSmeShell.Angular.Form.SearchField.Searching.label}}\r\n </span>\r\n </span>\r\n\r\n <sme-validation-alert [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }]
}], function () { return [{ type: i0.Injector }]; }, { count: [{
type: Input
}], searching: [{
type: Input
}], trimSearch: [{
type: Input
}], emphasizeSearchButton: [{
type: Input
}], searchButtonText: [{
type: Input
}], disableSearchButton: [{
type: Input
}], search: [{
type: Output
}], keyDownEvent: [{
type: Output
}], blurEvent: [{
type: Output
}], deliberateSearch: [{
type: Output
}], executeSearch: [], executeDeliberateSearch: [], onKeyDown: [], onBlur: [] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZm9ybS9mb3JtLWZpZWxkL3NlYXJjaC9zZWFyY2gtZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvc2VhcmNoL3NlYXJjaC1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztJQ0lsRSxpQ0FHOEI7SUFGMkMsd0xBQVMsZUFBQSxnQ0FBeUIsQ0FBQSxJQUFDO0lBRzFHLDJCQUFnRTtJQUNsRSxpQkFBUzs7O0lBSFAsc0RBQWlDLGtDQUFBO0lBQUMscURBQW9DOzs7O0lBSXhFLGtDQUVnRTtJQURTLHdMQUFTLGVBQUEsZ0NBQXlCLENBQUEsSUFBQztJQUUxRywyQkFBb0Y7SUFDcEYsNEJBQU07SUFBQSxZQUFvQjtJQUFBLGlCQUFPLEVBQUE7OztJQUZqQyxzREFBaUM7SUFFM0IsZUFBb0I7SUFBcEIsNkNBQW9COzs7SUFYOUIsNkJBQTJDO0lBQ3pDLDhGQUtTO0lBQ1QsOEZBS1M7SUFDWCwwQkFBZTs7O0lBWkosZUFBNEI7SUFBNUIsb0RBQTRCO0lBTTVCLGVBQTJCO0lBQTNCLG1EQUEyQjs7OztJQU90Qyw2QkFBMEM7SUFDeEMsZ0NBQXlHO0lBQTVCLG9MQUFTLGVBQUEseUJBQWlCLENB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Ozs7dUVBT1Y7QUFLRDtJQUFDLFFBQVEsRUFBRTs7cUNBQ2EsYUFBYTs7eURBRXBDO0FBS0Q7SUFBQyxRQUFRLEVBQUU7O3FDQUNVLFVBQVU7O3NEQUU5Qjt1RkE5SFEsd0JBQXdCO2NBSnBDLFNBQVM7MkJBQ0ksK0JBQStCOzJEQWdCbEMsS0FBSztrQkFEWCxLQUFLO1lBT0MsU0FBUztrQkFEZixLQUFLO1lBT0MsVUFBVTtrQkFEaEIsS0FBSztZQU9DLHFCQUFxQjtrQkFEM0IsS0FBSztZQU9DLGdCQUFnQjtrQkFEdEIsS0FBSztZQU9DLG1CQUFtQjtrQkFEekIsS0FBSztZQU9DLE1BQU07a0JBRFosTUFBTTtZQU9BLFlBQVk7a0JBRGxCLE1BQU07WUFPQSxTQUFTO2tCQURmLE1BQU07WUFPQSxnQkFBZ0I7a0JBRHRCLE1BQU07WUEwQkEsYUFBYSxNQVliLHVCQUF1QixNQVl2QixTQUFTLE1BUVQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERlYm91bmNlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMvZGVib3VuY2UuZGVjb3JhdG9ycyc7XHJcbmltcG9ydCB7IFNtZUludGVybmFsRm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1maWVsZC5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIEFjY2Vzc2libGUgc2VhcmNoIGZpZWxkIGltcGxlbWVudGF0aW9uIG9mIC5zbWUtc2VhcmNoYm94XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWZvcm0tZmllbGRbdHlwZT1cInNlYXJjaFwiXScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZWFyY2hGb3JtRmllbGRDb21wb25lbnQgZXh0ZW5kcyBTbWVJbnRlcm5hbEZvcm1GaWVsZENvbXBvbmVudDxhbnk+IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciB0aGUgbnVtYmVyIG9mIHNlYXJjaCByZXN1bHRzIGZvdW5kXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgY291bnQ/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3Igd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgc2VhcmNoaW5nIGluIHRoZSBmaWVsZC4gRGVmYXVsdHMgdG8gZmFsc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWFyY2hpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciB3aGV0aGVyIHRvIHRyaW0gbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlIGluIGEgc2VhcmNoLiBEZWZhdWx0cyB0byB0cnVlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHRyaW1TZWFyY2ggPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIElucHV0IGJpbmRpbmcgZm9yIHdoZXRoZXIgdG8gZW1waGFzaXplIHRoZSBzZWFyY2ggYnV0dG9uLiBEZWZhdWx0cyB0byBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlbXBoYXNpemVTZWFyY2hCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciB0aGUgc2VhcmNoIGJ1dHRvbiB0ZXh0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VhcmNoQnV0dG9uVGV4dDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIElucHV0IGJpbmRpbmcgZm9yIHdoZXRoZXIgdG8gZGlzYWJsZSB0aGUgYnV0dG9uIGFuZCBub3QgaGFuZGxlIGNsaWNrcyBvbiBpdC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkaXNhYmxlU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgT3V0cHV0IGJpbmRpbmcgZm9yIHRoZSBldmVudCBlbWl0dGVkIGZyb20gdHlwaW5nIGludG8gdGhlIHNlYXJjaCBmaWVsZCwgb3IgZXhlY3V0aW5nIGEgZGVsaWJlcmF0ZSBzZWFyY2hcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgc2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3V0cHV0IGJpbmRpbmcgZm9yIGV2ZW50IGVtaXR0ZWQgb24ga2V5IHByZXNzIG9uIHRoZSBzZWFyY2ggYm94XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGtleURvd25FdmVudDogRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3V0cHV0IGJpbmRpbmcgZm9yIGV2ZW50IGVtaXR0ZWQgd2hlbiBmb2N1cyBsZWF2ZXMgc2VhcmNoIGJveFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBibHVyRXZlbnQ6IEV2ZW50RW1pdHRlcjxGb2N1c0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqICBPdXRwdXQgYmluZGluZyBmb3IgdGhlIGV2ZW50IGVtaXR0ZWQgZnJvbSBoaXR0aW5nIHRoZSBzZWFyY2ggYnV0dG9uIG9yIHRoZSBlbnRlciBrZXlcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZGVsaWJlcmF0ZVNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTZWFyY2hGb3JtRmllbGRDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5oaWRlSGVhZGVyID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNlYXJjaEJ1dHRvblRleHQgPSB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuQ29tbW9uLnNlYXJjaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZ3VsYXIgT25Jbml0IGludGVyZmFjZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdzZWFyY2gnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRzIHRoZSB1cGRhdGVkIHNlYXJjaCB2YWx1ZSwgYWZ0ZXIgYSBkZWZhdWx0IGRlYm91bmNlIHRpbWVcclxuICAgICAqL1xyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyBleGVjdXRlU2VhcmNoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyaW1TZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2guZW1pdCh0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS50cmltKCkgOiB0aGlzLnZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaC5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRzIHRoZSB1cGRhdGVkIGRlbGliZXJhdGUgc2VhcmNoIHZhbHVlLCBhZnRlciBhIGRlZmF1bHQgZGVib3VuY2UgdGltZVxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHVibGljIGV4ZWN1dGVEZWxpYmVyYXRlU2VhcmNoKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyaW1TZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxpYmVyYXRlU2VhcmNoLmVtaXQodGhpcy52YWx1ZSA/IHRoaXMudmFsdWUudHJpbSgpIDogdGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWxpYmVyYXRlU2VhcmNoLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdHMgZXZlbnRzIG9uIGtleSBwcmVzcyBhbmQgd2hpbGUgZm9jdXMgaXMgb24gdGhlIHNlYXJjaCBib3hcclxuICAgICAqL1xyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICB0aGlzLmtleURvd25FdmVudC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRzIGV2ZW50IHdoZW4gZm9jdXMgbGVhdmVzIHRoZSBzZWFyY2ggYm94XHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgb25CbHVyKGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5ibHVyRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGVzIHRoZSBlbnRlciBrZXkgb24gdGhlIHNlYXJjaCBpbnB1dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FbnRlcktleURvd24oJGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICB0aGlzLmV4ZWN1dGVTZWFyY2goKTtcclxuICAgICAgICB0aGlzLmV4ZWN1dGVEZWxpYmVyYXRlU2VhcmNoKCk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB0aGUgY2xpY2sgZXZlbnQgZm9yIHRoZSBzZWFyY2ggaWNvbi5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGljb25DbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsYWJlbFNwYW46ICcnLFxyXG4gICAgICAgICAgICBjb3VudFNwYW46ICcnLFxyXG4gICAgICAgICAgICBkZXRhaWxzU3BhbjogJydcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiIsIjxzbWUtZm9ybS1maWVsZC1sYXlvdXQgW2Zvcm1GaWVsZF09XCJ0aGlzXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS1zZWFyY2hib3ggc21lLXNlYXJjaGJveC1idXR0b24taWNvblwiIFtjbGFzcy5zbWUtZGlzYWJsZWRdPVwibG9hZGluZ09yRGlzYWJsZWRcIj5cclxuICAgIDxpbnB1dCB0eXBlPVwic2VhcmNoXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmxhYmVsU3BhblwiIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFthdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdPckRpc2FibGVkXCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiIChuZ01vZGVsQ2hhbmdlKT1cImV4ZWN1dGVTZWFyY2goKVwiXHJcbiAgICAgIChrZXlkb3duLkVudGVyKT1cIm9uRW50ZXJLZXlEb3duKCRldmVudClcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRpc2FibGVTZWFyY2hCdXR0b25cIj5cclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlbXBoYXNpemVTZWFyY2hCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cInNtZS1idXR0b24tdHJpZ2dlciBzbWUtYnV0dG9uLWF1dG8td2lkdGggc21lLWZvcm0tZmllbGQtaGVpZ2h0XCIgKGNsaWNrKT1cImV4ZWN1dGVEZWxpYmVyYXRlU2VhcmNoKClcIlxyXG4gICAgICAgIFtzbWVEaXNhYmxlZF09XCJsb2FkaW5nT3JEaXNhYmxlZFwiIFthdHRyLmFyaWEtbGFiZWxdPVwic2VhcmNoQnV0dG9uVGV4dFwiIFt0aXRsZV09XCJzZWFyY2hCdXR0b25UZXh0XCJcclxuICAgICAgICBkYXRhLXV0YS1pZD1cInNlYXJjaC1idXR0b25cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNlYXJjaCBzbWUtaWNvbi1zaXplLXh4c1wiPjwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxidXR0b24gKm5nSWY9XCJlbXBoYXNpemVTZWFyY2hCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICBjbGFzcz1cInNtZS1idXR0b24tcHJpbWFyeSBzbWUtYnV0dG9uLWF1dG8td2lkdGggc21lLWZvcm0tZmllbGQtaGVpZ2h0XCIgKGNsaWNrKT1cImV4ZWN1dGVEZWxpYmVyYXRlU2VhcmNoKClcIlxyXG4gICAgICAgIFtzbWVEaXNhYmxlZF09XCJsb2FkaW5nT3JEaXNhYmxlZFwiIGRhdGEtdXRhLWlkPVwic2VhcmNoLWJ1dHRvblwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2VhcmNoIHNtZS1tYXJnaW4tcmlnaHQteHMgc21lLWljb24tc2l6ZS14eHNcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3tzZWFyY2hCdXR0b25UZXh0fX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGlzYWJsZVNlYXJjaEJ1dHRvblwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNlYXJjaCBzbWUtbWFyZ2luLXJpZ2h0LXhzIHNtZS1pY29uLXNpemUteHhzXCIgKGNsaWNrKT1cImljb25DbGljaygkZXZlbnQpXCI+PC9zcGFuPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPHNwYW4gY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlclwiIFtpZF09XCJpZEJhZy5sYWJlbFNwYW5cIj57e2xhYmVsfX08L3NwYW4+XHJcbiAgPHNwYW4gY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlclwiIFtpZF09XCJpZEJhZy5jb3VudFNwYW5cIj5cclxuICAgIDxzcGFuICpuZ0lmPVwiIXNlYXJjaGluZ1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtcmVsZXZhbnQ9XCJhbGxcIj5cclxuICAgICAge3sgY291bnQgPyBzdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uU2VhcmNoRmllbGQuY291bnQuZm9ybWF0KGNvdW50KSA6XHJcbiAgICAgIHN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5TZWFyY2hGaWVsZC5jb3VudC5mb3JtYXQoMCkgfX1cclxuICAgIDwvc3Bhbj5cclxuICAgIDxzcGFuICpuZ0lmPVwic2VhcmNoaW5nXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1yZWxldmFudD1cImFsbFwiPlxyXG4gICAgICB7e3N0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5TZWFyY2hGaWVsZC5TZWFyY2hpbmcubGFiZWx9fVxyXG4gICAgPC9zcGFuPlxyXG4gIDwvc3Bhbj5cclxuXHJcbiAgPHNtZS12YWxpZGF0aW9uLWFsZXJ0IFthbGVydF09XCJhbGVydFwiPjwvc21lLXZhbGlkYXRpb24tYWxlcnQ+XHJcbjwvc21lLWZvcm0tZmllbGQtbGF5b3V0PlxyXG4iXX0=