tolga-ng2
Version:
Angular 2/4 components and directives
162 lines • 24.6 kB
JavaScript
import { Component, forwardRef, Input } from '@angular/core';
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class NgsmAutocompleteComponent {
constructor() {
this.defaultTextId = "ngsmAutocompleteDefaultText";
this.isBusy = false;
this.remoteResponse = {
success: true,
results: []
};
this.propagateChange = (_) => { };
}
get loadingClass() {
if (!this.config || !this.config.loadingIcon)
return "asterisk loading icon";
return `${this.config.loadingIcon} loading icon`;
}
ngOnInit() {
//this.ngsmService.log("ngsmAutocomplete", "ngOnInit");
}
ngOnChanges() {
//this.ngsmService.log("ngsmAutocomplete", "ngOnChanges");
if (this.config.id && this.config.url) {
this.defaultTextId = `${this.config.id}-defaultText`;
this.setDisplayValue(this.config.placeholder);
this.init();
}
}
setAutocompleteValidationClass() {
var returnValue = "";
if (this.config.required && !this.selectedItem)
returnValue = "ngsmInvalid";
else if (this.config.required && this.selectedItem)
returnValue = "ngsmValid";
if (this.config.disabled)
returnValue += " disabled";
return returnValue;
}
setIsActiveClass() {
var returnValue = "ngsmAutocompleteMuted";
if (this.selectedItem && this.selectedItem !== null && this.selectedItem !== "" && this.selectedItem.id)
returnValue = "ngsmAutocompleteActive";
return returnValue;
}
setBusy($event) {
let srcElement = $event.srcElement;
let value = srcElement.value;
if (value && value !== null && value.length >= this.config.minchar)
this.isBusy = true;
else
this.isBusy = false;
}
init() {
//this.ngsmService.log("ngsmAutocomplete", `init: id: ${this.config.id}, url ${this.config.url}`);
this.setAutocompleteValidationClass();
let self = this;
setTimeout(function () {
sessionStorage.clear();
$(`#${self.config.id}`).dropdown({
minCharacters: self.config.minchar,
placeholder: self.config.placeholder,
onChange: jQuery.proxy(function (value, text, $selectedItem) {
self.isBusy = false;
let remoteItem = self.remoteResponse.results.filter(p => p.value === +value)[0];
if (remoteItem) {
self.selectedItem = remoteItem.item;
self.setDisplayValue(self.selectedItem[self.config.selectedItemDisplayBy]);
self.propagateChange(self.selectedItem);
}
self.setAutocompleteValidationClass();
}, self),
hideError: true,
saveRemoteData: false,
apiSettings: {
url: `${self.config.url}/{query}`,
method: 'get',
hideError: true,
saveRemoteData: false,
onResponse: function (results) {
self.isBusy = false;
self.remoteResponse = {
success: true,
results: []
};
$.each(results, function (index, item) {
self.remoteResponse.results.push({
value: item[self.config.identifyBy],
name: item[self.config.displayBy],
item: item[self.config.objectBy]
});
});
return self.remoteResponse;
},
onError: function (error) {
this.ngsmAppService.error(`ngsmAutocomplete: Error ${error}`);
}
}
});
}, 250);
}
clear() {
$(`#${this.config.id}`).dropdown('clear');
this.setAutocompleteValidationClass();
this.propagateChange("");
this.selectedItem = {};
this.setDisplayValue(this.config.placeholder);
}
setDisplayValue(value) {
//this.ngsmService.log("ngsmAutocomplete", `new value ${value}`);
let self = this;
setTimeout(function () {
$(`#${self.defaultTextId}`).text(value);
}, 100);
}
get value() {
return this.selectedItem;
}
;
writeValue(value) {
if (this.config.id) {
if (value && value.id) {
this.selectedItem = value;
//this.ngsmService.log("ngsmAutocomplete", `writeValue: selectedItem: ${this.selectedItem}`);
this.setDisplayValue(this.selectedItem[this.config.selectedItemDisplayBy]);
}
else {
this.setDisplayValue(this.config.placeholder);
}
}
else {
this.setDisplayValue("");
}
}
onTouchedCallback() { }
registerOnTouched() { }
registerOnChange(fn) {
this.propagateChange = fn;
}
}
NgsmAutocompleteComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgsmAutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgsmAutocompleteComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NgsmAutocompleteComponent, selector: "ngsm-autocomplete", inputs: { config: "config" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgsmAutocompleteComponent),
multi: true
}
], usesOnChanges: true, ngImport: i0, template: "<div id=\"{{config.id}}\"\r\n class=\"ui selection search dropdown\"\r\n (keyup)=\"setBusy($event)\"\r\n [ngClass]=\"setAutocompleteValidationClass()\">\r\n <div class=\"default text\"\r\n id=\"{{defaultTextId}}\"\r\n [ngClass]=\"setIsActiveClass()\">\r\n {{value}}\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"isBusy && loadingClass\"\r\n class=\"loading-container\">\r\n <i [class]=\"loadingClass\"></i>\r\n</div>\r\n\r\n<!-- <div *ngIf=\"isBusy\"\r\n class=\"ui active inline small loader\">\r\n</div> -->\r\n\r\n<button class=\"ui icon only button btn-delete\"\r\n (click)=\"clear()\"\r\n title=\"{{config.clearMessage}}\"\r\n [disabled]=\"config.disabled\"\r\n *ngIf=\"config.allowClear && selectedItem && selectedItem.id\">\r\n <i class=\"icon trash\"></i>\r\n</button>", styles: [".ngsmAutocompleteMuted{color:gray!important}.ngsmAutocompleteActive{color:#000!important}.ngsmValid{border-left:5px solid #42A948!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.ngsmInvalid{border-left:5px solid #a94442!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.btn-delete{margin-left:3px}.loading-container{display:inline-block;margin-left:3px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NgsmAutocompleteComponent, decorators: [{
type: Component,
args: [{ selector: 'ngsm-autocomplete', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgsmAutocompleteComponent),
multi: true
}
], template: "<div id=\"{{config.id}}\"\r\n class=\"ui selection search dropdown\"\r\n (keyup)=\"setBusy($event)\"\r\n [ngClass]=\"setAutocompleteValidationClass()\">\r\n <div class=\"default text\"\r\n id=\"{{defaultTextId}}\"\r\n [ngClass]=\"setIsActiveClass()\">\r\n {{value}}\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"isBusy && loadingClass\"\r\n class=\"loading-container\">\r\n <i [class]=\"loadingClass\"></i>\r\n</div>\r\n\r\n<!-- <div *ngIf=\"isBusy\"\r\n class=\"ui active inline small loader\">\r\n</div> -->\r\n\r\n<button class=\"ui icon only button btn-delete\"\r\n (click)=\"clear()\"\r\n title=\"{{config.clearMessage}}\"\r\n [disabled]=\"config.disabled\"\r\n *ngIf=\"config.allowClear && selectedItem && selectedItem.id\">\r\n <i class=\"icon trash\"></i>\r\n</button>", styles: [".ngsmAutocompleteMuted{color:gray!important}.ngsmAutocompleteActive{color:#000!important}.ngsmValid{border-left:5px solid #42A948!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.ngsmInvalid{border-left:5px solid #a94442!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.btn-delete{margin-left:3px}.loading-container{display:inline-block;margin-left:3px}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { config: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdzbS1hdXRvY29tcGxldGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9uZ3NtL2NvbXBvbmVudHMvbmdzbS1hdXRvY29tcGxldGUvbmdzbS1hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9uZ3NtL2NvbXBvbmVudHMvbmdzbS1hdXRvY29tcGxldGUvbmdzbS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBZXpFLE1BQU0sT0FBTyx5QkFBeUI7SUFrQnBDO1FBVEEsa0JBQWEsR0FBVyw2QkFBNkIsQ0FBQztRQUV0RCxXQUFNLEdBQVksS0FBSyxDQUFDO1FBRXhCLG1CQUFjLEdBQUc7WUFDZixPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQWlJRixvQkFBZSxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUEvSGxCLENBQUM7SUFkakIsSUFBSSxZQUFZO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVc7WUFBRSxPQUFPLHVCQUF1QixDQUFDO1FBQzdFLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsZUFBZSxDQUFDO0lBQ25ELENBQUM7SUFhRCxRQUFRO1FBQ04sdURBQXVEO0lBQ3pELENBQUM7SUFFRCxXQUFXO1FBQ1QsMERBQTBEO1FBQzFELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FB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Z0IsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7O3NIQXJKVSx5QkFBeUI7MEdBQXpCLHlCQUF5QiwwRUFSekI7UUFDVDtZQUNFLE9BQU8sRUFBRSxpQkFBaUI7WUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQztZQUN4RCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsK0NDZEgsMnhCQTBCUzsyRkRWSSx5QkFBeUI7a0JBWnJDLFNBQVM7K0JBQ0UsbUJBQW1CLGFBR2xCO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDOzRCQUN4RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjswRUFJUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE5nc21BdXRvY29tcGxldGVDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbHMvbmdzbUF1dG9jb21wbGV0ZUNvbmZpZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25nc20tYXV0b2NvbXBsZXRlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmdzbS1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25nc20tYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5jc3MnXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nc21BdXRvY29tcGxldGVDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5nc21BdXRvY29tcGxldGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnOiBOZ3NtQXV0b2NvbXBsZXRlQ29uZmlnO1xyXG5cclxuICBnZXQgbG9hZGluZ0NsYXNzKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmNvbmZpZy5sb2FkaW5nSWNvbikgcmV0dXJuIFwiYXN0ZXJpc2sgbG9hZGluZyBpY29uXCI7XHJcbiAgICByZXR1cm4gYCR7dGhpcy5jb25maWcubG9hZGluZ0ljb259IGxvYWRpbmcgaWNvbmA7XHJcbiAgfVxyXG5cclxuICBkZWZhdWx0VGV4dElkOiBzdHJpbmcgPSBcIm5nc21BdXRvY29tcGxldGVEZWZhdWx0VGV4dFwiO1xyXG4gIHNlbGVjdGVkSXRlbTogYW55O1xyXG4gIGlzQnVzeTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICByZW1vdGVSZXNwb25zZSA9IHtcclxuICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICByZXN1bHRzOiBbXVxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgLy90aGlzLm5nc21TZXJ2aWNlLmxvZyhcIm5nc21BdXRvY29tcGxldGVcIiwgXCJuZ09uSW5pdFwiKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgLy90aGlzLm5nc21TZXJ2aWNlLmxvZyhcIm5nc21BdXRvY29tcGxldGVcIiwgXCJuZ09uQ2hhbmdlc1wiKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5pZCAmJiB0aGlzLmNvbmZpZy51cmwpIHtcclxuICAgICAgdGhpcy5kZWZhdWx0VGV4dElkID0gYCR7dGhpcy5jb25maWcuaWR9LWRlZmF1bHRUZXh0YDtcclxuICAgICAgdGhpcy5zZXREaXNwbGF5VmFsdWUodGhpcy5jb25maWcucGxhY2Vob2xkZXIpO1xyXG4gICAgICB0aGlzLmluaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldEF1dG9jb21wbGV0ZVZhbGlkYXRpb25DbGFzcygpIHtcclxuICAgIHZhciByZXR1cm5WYWx1ZSA9IFwiXCI7XHJcbiAgICBpZiAodGhpcy5jb25maWcucmVxdWlyZWQgJiYgIXRoaXMuc2VsZWN0ZWRJdGVtKSByZXR1cm5WYWx1ZSA9IFwibmdzbUludmFsaWRcIjtcclxuICAgIGVsc2UgaWYgKHRoaXMuY29uZmlnLnJlcXVpcmVkICYmIHRoaXMuc2VsZWN0ZWRJdGVtKSByZXR1cm5WYWx1ZSA9IFwibmdzbVZhbGlkXCI7XHJcbiAgICBpZiAodGhpcy5jb25maWcuZGlzYWJsZWQpIHJldHVyblZhbHVlICs9IFwiIGRpc2FibGVkXCI7XHJcbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXRJc0FjdGl2ZUNsYXNzKCkge1xyXG4gICAgdmFyIHJldHVyblZhbHVlID0gXCJuZ3NtQXV0b2NvbXBsZXRlTXV0ZWRcIjtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbSAhPT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkSXRlbSAhPT0gXCJcIiAmJiB0aGlzLnNlbGVjdGVkSXRlbS5pZCkgcmV0dXJuVmFsdWUgPSBcIm5nc21BdXRvY29tcGxldGVBY3RpdmVcIjtcclxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICB9XHJcblxyXG4gIHNldEJ1c3koJGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBzcmNFbGVtZW50ID0gJGV2ZW50LnNyY0VsZW1lbnQ7XHJcbiAgICBsZXQgdmFsdWUgPSBzcmNFbGVtZW50LnZhbHVlOyAgICBcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGggPj0gdGhpcy5jb25maWcubWluY2hhcikgdGhpcy5pc0J1c3kgPSB0cnVlO1xyXG4gICAgZWxzZSB0aGlzLmlzQnVzeSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIC8vdGhpcy5uZ3NtU2VydmljZS5sb2coXCJuZ3NtQXV0b2NvbXBsZXRlXCIsIGBpbml0OiBpZDogJHt0aGlzLmNvbmZpZy5pZH0sIHVybCAke3RoaXMuY29uZmlnLnVybH1gKTtcclxuICAgIHRoaXMuc2V0QXV0b2NvbXBsZXRlVmFsaWRhdGlvbkNsYXNzKCk7XHJcblxyXG4gICAgbGV0IHNlbGYgPSB0aGlzO1xyXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICg8YW55PiQoYCMke3NlbGYuY29uZmlnLmlkfWApKS5kcm9wZG93bih7XHJcbiAgICAgICAgbWluQ2hhcmFjdGVyczogc2VsZi5jb25maWcubWluY2hhcixcclxuICAgICAgICBwbGFjZWhvbGRlcjogc2VsZi5jb25maWcucGxhY2Vob2xkZXIsXHJcbiAgICAgICAgb25DaGFuZ2U6IGpRdWVyeS5wcm94eShmdW5jdGlvbiAodmFsdWUsIHRleHQsICRzZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgICAgIHNlbGYuaXNCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgICBsZXQgcmVtb3RlSXRlbSA9IHNlbGYucmVtb3RlUmVzcG9uc2UucmVzdWx0cy5maWx0ZXIocCA9PiBwLnZhbHVlID09PSArdmFsdWUpWzBdO1xyXG4gICAgICAgICAgaWYgKHJlbW90ZUl0ZW0pIHtcclxuICAgICAgICAgICAgc2VsZi5zZWxlY3RlZEl0ZW0gPSByZW1vdGVJdGVtLml0ZW07XHJcbiAgICAgICAgICAgIHNlbGYuc2V0RGlzcGxheVZhbHVlKHNlbGYuc2VsZWN0ZWRJdGVtW3NlbGYuY29uZmlnLnNlbGVjdGVkSXRlbURpc3BsYXlCeV0pO1xyXG4gICAgICAgICAgICBzZWxmLnByb3BhZ2F0ZUNoYW5nZShzZWxmLnNlbGVjdGVkSXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBzZWxmLnNldEF1dG9jb21wbGV0ZVZhbGlkYXRpb25DbGFzcygpO1xyXG4gICAgICAgIH0sIHNlbGYpLFxyXG4gICAgICAgIGhpZGVFcnJvcjogdHJ1ZSxcclxuICAgICAgICBzYXZlUmVtb3RlRGF0YTogZmFsc2UsXHJcbiAgICAgICAgYXBpU2V0dGluZ3M6IHtcclxuICAgICAgICAgIHVybDogYCR7c2VsZi5jb25maWcudXJsfS97cXVlcnl9YCxcclxuICAgICAgICAgIG1ldGhvZDogJ2dldCcsXHJcbiAgICAgICAgICBoaWRlRXJyb3I6IHRydWUsXHJcbiAgICAgICAgICBzYXZlUmVtb3RlRGF0YTogZmFsc2UsXHJcbiAgICAgICAgICBvblJlc3BvbnNlOiBmdW5jdGlvbiAocmVzdWx0cykge1xyXG4gICAgICAgICAgICBzZWxmLmlzQnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZWxmLnJlbW90ZVJlc3BvbnNlID0ge1xyXG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICAgICAgcmVzdWx0czogW11cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgJC5lYWNoKHJlc3VsdHMsIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkge1xyXG4gICAgICAgICAgICAgIHNlbGYucmVtb3RlUmVzcG9uc2UucmVzdWx0cy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtW3NlbGYuY29uZmlnLmlkZW50aWZ5QnldLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbVtzZWxmLmNvbmZpZy5kaXNwbGF5QnldLFxyXG4gICAgICAgICAgICAgICAgaXRlbTogaXRlbVtzZWxmLmNvbmZpZy5vYmplY3RCeV1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlbW90ZVJlc3BvbnNlO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG9uRXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLm5nc21BcHBTZXJ2aWNlLmVycm9yKGBuZ3NtQXV0b2NvbXBsZXRlOiBFcnJvciAke2Vycm9yfWApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LCAyNTApO1xyXG5cclxuICB9XHJcblxyXG4gIGNsZWFyKCkge1xyXG4gICAgKDxhbnk+JChgIyR7dGhpcy5jb25maWcuaWR9YCkpLmRyb3Bkb3duKCdjbGVhcicpO1xyXG4gICAgdGhpcy5zZXRBdXRvY29tcGxldGVWYWxpZGF0aW9uQ2xhc3MoKTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKFwiXCIpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB7fTtcclxuICAgIHRoaXMuc2V0RGlzcGxheVZhbHVlKHRoaXMuY29uZmlnLnBsYWNlaG9sZGVyKTtcclxuICB9XHJcblxyXG4gIHNldERpc3BsYXlWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAvL3RoaXMubmdzbVNlcnZpY2UubG9nKFwibmdzbUF1dG9jb21wbGV0ZVwiLCBgbmV3IHZhbHVlICR7dmFsdWV9YCk7XHJcbiAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgKDxhbnk+JChgIyR7c2VsZi5kZWZhdWx0VGV4dElkfWApKS50ZXh0KHZhbHVlKTtcclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtO1xyXG4gIH07XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmlkKSB7XHJcbiAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5pZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdmFsdWU7XHJcbiAgICAgICAgLy90aGlzLm5nc21TZXJ2aWNlLmxvZyhcIm5nc21BdXRvY29tcGxldGVcIiwgYHdyaXRlVmFsdWU6IHNlbGVjdGVkSXRlbTogJHt0aGlzLnNlbGVjdGVkSXRlbX1gKTtcclxuICAgICAgICB0aGlzLnNldERpc3BsYXlWYWx1ZSh0aGlzLnNlbGVjdGVkSXRlbVt0aGlzLmNvbmZpZy5zZWxlY3RlZEl0ZW1EaXNwbGF5QnldKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnNldERpc3BsYXlWYWx1ZSh0aGlzLmNvbmZpZy5wbGFjZWhvbGRlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnNldERpc3BsYXlWYWx1ZShcIlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uVG91Y2hlZENhbGxiYWNrKCkgeyB9XHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoKSB7IH1cclxuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgaWQ9XCJ7e2NvbmZpZy5pZH19XCJcclxuICBjbGFzcz1cInVpIHNlbGVjdGlvbiBzZWFyY2ggZHJvcGRvd25cIlxyXG4gIChrZXl1cCk9XCJzZXRCdXN5KCRldmVudClcIlxyXG4gIFtuZ0NsYXNzXT1cInNldEF1dG9jb21wbGV0ZVZhbGlkYXRpb25DbGFzcygpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRlZmF1bHQgdGV4dFwiXHJcbiAgICBpZD1cInt7ZGVmYXVsdFRleHRJZH19XCJcclxuICAgIFtuZ0NsYXNzXT1cInNldElzQWN0aXZlQ2xhc3MoKVwiPlxyXG4gICAge3t2YWx1ZX19XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImlzQnVzeSAmJiBsb2FkaW5nQ2xhc3NcIlxyXG4gIGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cclxuICA8aSBbY2xhc3NdPVwibG9hZGluZ0NsYXNzXCI+PC9pPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gPGRpdiAqbmdJZj1cImlzQnVzeVwiXHJcbiAgY2xhc3M9XCJ1aSBhY3RpdmUgaW5saW5lIHNtYWxsIGxvYWRlclwiPlxyXG48L2Rpdj4gLS0+XHJcblxyXG48YnV0dG9uIGNsYXNzPVwidWkgaWNvbiBvbmx5IGJ1dHRvbiBidG4tZGVsZXRlXCJcclxuICAoY2xpY2spPVwiY2xlYXIoKVwiXHJcbiAgdGl0bGU9XCJ7e2NvbmZpZy5jbGVhck1lc3NhZ2V9fVwiXHJcbiAgW2Rpc2FibGVkXT1cImNvbmZpZy5kaXNhYmxlZFwiXHJcbiAgKm5nSWY9XCJjb25maWcuYWxsb3dDbGVhciAmJiBzZWxlY3RlZEl0ZW0gJiYgc2VsZWN0ZWRJdGVtLmlkXCI+XHJcbiAgPGkgY2xhc3M9XCJpY29uIHRyYXNoXCI+PC9pPlxyXG48L2J1dHRvbj4iXX0=