ngx-mat-dropdown
Version:
Angular Dropdown with search/filter option
293 lines (291 loc) • 24.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/mat-dropdown.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, } from "@angular/core";
import { FormControl } from "@angular/forms";
import { MatSelect } from "@angular/material/select";
import { ReplaySubject, Subject } from "rxjs";
import { take, takeUntil } from "rxjs/operators";
import { DropdownSettingsModel } from "./dropdown-settings.model";
export class MatDropdownComponent {
constructor() {
this.dropdownCtrl = new FormControl();
this.appearance = "outline";
/**
* control for the MatSelect filter keyword
*/
this.FilterCtrl = new FormControl();
this.dropdownList = [];
this.onselectItems = new EventEmitter();
this.filteredBanks = new ReplaySubject(1);
/**
* Subject that emits when the component has been destroyed.
*/
this._onDestroy = new Subject();
}
/**
* @param {?} isTrue
* @return {?}
*/
set dropdownDisabled(isTrue) {
if (isTrue) {
this.dropdownCtrl.disable();
}
else {
this.dropdownCtrl.enable();
}
}
/**
* @param {?} list
* @return {?}
*/
set getdropdownList(list) {
if (list) {
this.dropdownList = list;
this.filteredBanks.next(list.slice());
}
else {
}
}
/**
* @param {?} evt
* @return {?}
*/
set onselect(evt) {
if (evt) {
this.selectedItems = evt;
// console.log(evt, this.preBind);
this.dropdownCtrl.setValue(evt);
}
else {
if (this.dropdownSettings.multiple) {
this.selectedItems = [];
}
else
this.selectedItems = null;
this.dropdownCtrl.setValue(evt);
}
}
/**
* @return {?}
*/
ngOnInit() {
// set intial value
// listen for search field value changes
this.FilterCtrl.valueChanges
.pipe(takeUntil(this._onDestroy))
.subscribe((/**
* @return {?}
*/
() => {
/** @type {?} */
let evt = this.FilterCtrl.value;
this._filter(evt);
}));
}
/**
* @private
* @param {?} evt
* @return {?}
*/
_filter(evt) {
if (evt)
this.filteredBanks.next(this.dropdownList.filter((/**
* @param {?} x
* @return {?}
*/
(x) => x[this.dropdownSettings.labelKey]
.toLowerCase()
.includes(evt.val.toLowerCase()))));
else
this.filteredBanks.next(this.dropdownList.slice());
}
/**
* @return {?}
*/
ngAfterViewInit() {
//this.dropdownCtrl.setValue(this.selectedItems);
if (!this.dropdownSettings.multiple)
this.setInitialValue();
}
/**
* @return {?}
*/
ngOnDestroy() {
this._onDestroy.next();
this._onDestroy.complete();
}
/**
* @private
* @return {?}
*/
setInitialValue() {
this.filteredBanks
.pipe(take(1), takeUntil(this._onDestroy))
.subscribe((/**
* @return {?}
*/
() => {
this.singleSelect.compareWith = (/**
* @param {?} a
* @param {?} b
* @return {?}
*/
(a, b) => {
if (a && b)
return (a[this.dropdownSettings.keyValue] ===
b[this.dropdownSettings.keyValue]);
});
}));
}
/**
* @param {?} evt
* @return {?}
*/
OnSelectedEvent(evt) {
this.onselectItems.emit(evt.source);
//if (evt.isUserInput) {
// this.onselectItems.emit(evt.source);
//} else {
// this.onselectItems.emit({ value: null });
//}
}
// multi
/**
* @param {?} checked
* @return {?}
*/
AllClicked(checked) {
//console.log(checked, this.multidropdownCtrl)
if (checked.checked) {
// this.multidropdownCtrl.patchValue([...this.dropdownList.map(item => item.key), 0]);
/** @type {?} */
let items = this.dropdownList.map((/**
* @param {?} item
* @return {?}
*/
(item) => item));
this.dropdownCtrl.setValue(items);
}
else {
// this.multidropdownCtrl.patchValue([]);
this.dropdownCtrl.setValue([]);
}
this.onselectItems.emit(this.dropdownCtrl);
}
/**
* @param {?} check
* @return {?}
*/
ischecked(check) {
/** @type {?} */
let selected = this.dropdownCtrl.value;
return (this.dropdownList &&
selected &&
selected.length > 0 &&
this.dropdownList.length == selected.length);
}
/**
* @return {?}
*/
isIndeterminate() {
/** @type {?} */
let selected = this.dropdownCtrl.value;
return (this.dropdownList &&
selected &&
selected.length > 0 &&
selected.length < this.dropdownList.length);
}
/**
* @return {?}
*/
openedChange() {
if (!this.innerSelectAll || !this.innerSelectAll.nativeElement) {
return;
}
/** @type {?} */
let SelectAllElement = this.innerSelectAll.nativeElement;
/** @type {?} */
let SelectAllPanelElement;
while ((SelectAllElement = SelectAllElement.parentElement)) {
if (SelectAllElement.classList.contains("mat-select-panel")) {
SelectAllPanelElement = SelectAllElement;
break;
}
}
if (SelectAllPanelElement) {
this.innerSelectAll.nativeElement.style.width =
SelectAllPanelElement.clientWidth + "px";
/** @type {?} */
let children = this.innerSelectAll.nativeElement.childNodes;
//if (children)
// children[0].childNodes[0].style.width = SelectallpanelElement.clientWidth + 'px';
}
}
}
MatDropdownComponent.decorators = [
{ type: Component, args: [{
selector: "ngx-mat-dropdown",
template: "<mat-form-field appearance=\"{{appearance}}\">\r\n <mat-label>{{dropdownSettings?.placeholder}}</mat-label>\r\n <mat-select disableOptionCentering [formControl]=\"dropdownCtrl\" [attr.id]=\"dropdownSettings?.id\" \r\n (selectionChange)=\"OnSelectedEvent($event)\"\r\n [placeholder]=\"dropdownSettings.placeholder \" \r\n #singleSelect [multiple]=\"dropdownSettings?.multiple\" \r\n matTooltip=\"{{selectedItems ? selectedItems[dropdownSettings.labelKey] : ''}}\"\r\n [multiple]=\"dropdownSettings?.multiple\">\r\n <mat-select-search [formControl]=\"FilterCtrl\" [multiple]=\"dropdownSettings?.multiple\" *ngIf=\"dropdownList.length > 5\"></mat-select-search>\r\n <div #innerSelectall [style.top.px]=\"dropdownList?.length <= 5 ? 0 : 44\" class=\"mat-select-all-inner\" *ngIf=\"dropdownList?.length !== 0 && dropdownSettings.multiple\" >\r\n <mat-checkbox class=\"mat-option mat-select-checkbox\" [disableRipple]=\"true\" [indeterminate]=\"isIndeterminate()\" [checked]=\"ischecked(check)\" (change)=\"AllClicked($event)\" #check>\r\n {{ check.checked ? ('Unselect All' ) : ('Select All' ) }}\r\n </mat-checkbox>\r\n </div>\r\n <mat-option *ngIf=\"dropdownList.length && !dropdownSettings.multiple\">None</mat-option>\r\n <mat-option *ngFor=\"let item of filteredBanks | async\" [value]=\"item\" \r\n matTooltip=\"{{item[dropdownSettings.labelKey]}}\">\r\n {{ item[dropdownSettings.labelKey] }}\r\n </mat-option>\r\n </mat-select>\r\n</mat-form-field>",
styles: [`
.mat-select-all-inner {
position: absolute;
top: 52px;
width: calc(100% + 3px);
background: white;
z-index: 100;
font-size: inherit;
box-shadow: none;
border-radius: 0;
-webkit-transform: translate3d(0,0,0);
}
`]
}] }
];
/** @nocollapse */
MatDropdownComponent.ctorParameters = () => [];
MatDropdownComponent.propDecorators = {
dropdownCtrl: [{ type: Input, args: ["ctrl",] }],
appearance: [{ type: Input }],
dropdownSettings: [{ type: Input, args: ["dropdownSettings",] }],
dropdownDisabled: [{ type: Input, args: ["disabled",] }],
getdropdownList: [{ type: Input, args: ["dropdownList",] }],
onselect: [{ type: Input, args: ["selectedItems",] }],
onselectItems: [{ type: Output, args: ["onselectItems",] }],
singleSelect: [{ type: ViewChild, args: ["singleSelect", { read: ElementRef },] }],
innerSelectAll: [{ type: ViewChild, args: ["innerSelectall", { read: ElementRef, static: true },] }]
};
if (false) {
/** @type {?} */
MatDropdownComponent.prototype.dropdownCtrl;
/** @type {?} */
MatDropdownComponent.prototype.appearance;
/**
* control for the MatSelect filter keyword
* @type {?}
*/
MatDropdownComponent.prototype.FilterCtrl;
/** @type {?} */
MatDropdownComponent.prototype.dropdownSettings;
/** @type {?} */
MatDropdownComponent.prototype.dropdownList;
/** @type {?} */
MatDropdownComponent.prototype.selectedItems;
/** @type {?} */
MatDropdownComponent.prototype.onselectItems;
/** @type {?} */
MatDropdownComponent.prototype.filteredBanks;
/** @type {?} */
MatDropdownComponent.prototype.singleSelect;
/** @type {?} */
MatDropdownComponent.prototype.innerSelectAll;
/**
* Subject that emits when the component has been destroyed.
* @type {?}
* @private
*/
MatDropdownComponent.prototype._onDestroy;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXQtZHJvcGRvd24vIiwic291cmNlcyI6WyJsaWIvbWF0LWRyb3Bkb3duLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsR0FDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFxQmxFLE1BQU0sT0FBTyxvQkFBb0I7SUFzRC9CO1FBcERPLGlCQUFZLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUMsZUFBVSxHQUFXLFNBQVMsQ0FBQzs7OztRQUVqQyxlQUFVLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFjbkQsaUJBQVksR0FBZSxFQUFFLENBQUM7UUF3Qkwsa0JBQWEsR0FFbEMsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV4QixrQkFBYSxHQUF5QixJQUFJLGFBQWEsQ0FBUSxDQUFDLENBQUMsQ0FBQzs7OztRQUtqRSxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUUxQixDQUFDOzs7OztJQTVDaEIsSUFDSSxnQkFBZ0IsQ0FBQyxNQUFlO1FBQ2xDLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM3QjthQUFNO1lBQ0wsSUFBSSxDQUFD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Ozs7O0lBaEQvRCw0Q0FDcUQ7O0lBQ3JELDBDQUF3Qzs7Ozs7SUFFeEMsMENBQW1EOztJQUVuRCxnREFDd0M7O0lBV3hDLDRDQUE4Qjs7SUFVOUIsNkNBQW1COztJQWNuQiw2Q0FFK0I7O0lBRS9CLDZDQUF5RTs7SUFDekUsNENBQXlFOztJQUN6RSw4Q0FDMkI7Ozs7OztJQUUzQiwwQ0FBeUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgTWF0U2VsZWN0IH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL3NlbGVjdFwiO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlLCB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IERyb3Bkb3duU2V0dGluZ3NNb2RlbCB9IGZyb20gXCIuL2Ryb3Bkb3duLXNldHRpbmdzLm1vZGVsXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJuZ3gtbWF0LWRyb3Bkb3duXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vbWF0LWRyb3Bkb3duLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlczogW2BcbiAgLm1hdC1zZWxlY3QtYWxsLWlubmVyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA1MnB4O1xuICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzcHgpO1xuICAgIFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBmb250LXNpemU6IGluaGVyaXQ7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG59XG5cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdERyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KFwiY3RybFwiKVxuICBwdWJsaWMgZHJvcGRvd25DdHJsOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBASW5wdXQoKSBhcHBlYXJhbmNlOiBzdHJpbmcgPSBcIm91dGxpbmVcIjtcbiAgLyoqIGNvbnRyb2wgZm9yIHRoZSBNYXRTZWxlY3QgZmlsdGVyIGtleXdvcmQgKi9cbiAgcHVibGljIEZpbHRlckN0cmw6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKCk7XG5cbiAgQElucHV0KFwiZHJvcGRvd25TZXR0aW5nc1wiKVxuICBkcm9wZG93blNldHRpbmdzOiBEcm9wZG93blNldHRpbmdzTW9kZWw7XG5cbiAgQElucHV0KFwiZGlzYWJsZWRcIilcbiAgc2V0IGRyb3Bkb3duRGlzYWJsZWQoaXNUcnVlOiBib29sZWFuKSB7XG4gICAgaWYgKGlzVHJ1ZSkge1xuICAgICAgdGhpcy5kcm9wZG93bkN0cmwuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyb3Bkb3duQ3RybC5lbmFibGUoKTtcbiAgICB9XG4gIH1cblxuICBkcm9wZG93bkxpc3Q6IEFycmF5PGFueT4gPSBbXTtcbiAgQElucHV0KFwiZHJvcGRvd25MaXN0XCIpXG4gIHNldCBnZXRkcm9wZG93bkxpc3QobGlzdDogYW55KSB7XG4gICAgaWYgKGxpc3QpIHtcbiAgICAgIHRoaXMuZHJvcGRvd25MaXN0ID0gbGlzdDtcbiAgICAgIHRoaXMuZmlsdGVyZWRCYW5rcy5uZXh0KGxpc3Quc2xpY2UoKSk7XG4gICAgfSBlbHNlIHtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RlZEl0ZW1zOiBhbnk7XG4gIEBJbnB1dChcInNlbGVjdGVkSXRlbXNcIilcbiAgc2V0IG9uc2VsZWN0KGV2dCkge1xuICAgIGlmIChldnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IGV2dDtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGV2dCwgdGhpcy5wcmVCaW5kKTtcbiAgICAgIHRoaXMuZHJvcGRvd25DdHJsLnNldFZhbHVlKGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmRyb3Bkb3duU2V0dGluZ3MubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG4gICAgICB9IGVsc2UgdGhpcy5zZWxlY3RlZEl0ZW1zID0gbnVsbDtcbiAgICAgIHRoaXMuZHJvcGRvd25DdHJsLnNldFZhbHVlKGV2dCk7XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoXCJvbnNlbGVjdEl0ZW1zXCIpIG9uc2VsZWN0SXRlbXM6IEV2ZW50RW1pdHRlcjxcbiAgICBPYmplY3RcbiAgPiA9IG5ldyBFdmVudEVtaXR0ZXI8T2JqZWN0PigpO1xuXG4gIHB1YmxpYyBmaWx0ZXJlZEJhbmtzOiBSZXBsYXlTdWJqZWN0PGFueVtdPiA9IG5ldyBSZXBsYXlTdWJqZWN0PGFueVtdPigxKTtcbiAgQFZpZXdDaGlsZChcInNpbmdsZVNlbGVjdFwiLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc2luZ2xlU2VsZWN0OiBNYXRTZWxlY3Q7XG4gIEBWaWV3Q2hpbGQoXCJpbm5lclNlbGVjdGFsbFwiLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBpbm5lclNlbGVjdEFsbDogRWxlbWVudFJlZjtcbiAgLyoqIFN1YmplY3QgdGhhdCBlbWl0cyB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gZGVzdHJveWVkLiAqL1xuICBwcml2YXRlIF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gc2V0IGludGlhbCB2YWx1ZVxuICAgIC8vIGxpc3RlbiBmb3Igc2VhcmNoIGZpZWxkIHZhbHVlIGNoYW5nZXNcbiAgICB0aGlzLkZpbHRlckN0cmwudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBsZXQgZXZ0ID0gdGhpcy5GaWx0ZXJDdHJsLnZhbHVlO1xuICAgICAgICB0aGlzLl9maWx0ZXIoZXZ0KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyKGV2dCkge1xuICAgIGlmIChldnQpXG4gICAgICB0aGlzLmZpbHRlcmVkQmFua3MubmV4dChcbiAgICAgICAgdGhpcy5kcm9wZG93bkxpc3QuZmlsdGVyKCh4KSA9PlxuICAgICAgICAgIHhbdGhpcy5kcm9wZG93blNldHRpbmdzLmxhYmVsS2V5XVxuICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgIC5pbmNsdWRlcyhldnQudmFsLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgZWxzZSB0aGlzLmZpbHRlcmVkQmFua3MubmV4dCh0aGlzLmRyb3Bkb3duTGlzdC5zbGljZSgpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvL3RoaXMuZHJvcGRvd25DdHJsLnNldFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG5cbiAgICBpZiAoIXRoaXMuZHJvcGRvd25TZXR0aW5ncy5tdWx0aXBsZSkgdGhpcy5zZXRJbml0aWFsVmFsdWUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5fb25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSBzZXRJbml0aWFsVmFsdWUoKSB7XG4gICAgdGhpcy5maWx0ZXJlZEJhbmtzXG4gICAgICAucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95KSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNpbmdsZVNlbGVjdC5jb21wYXJlV2l0aCA9IChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChhICYmIGIpXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBhW3RoaXMuZHJvcGRvd25TZXR0aW5ncy5rZXlWYWx1ZV0gPT09XG4gICAgICAgICAgICAgIGJbdGhpcy5kcm9wZG93blNldHRpbmdzLmtleVZhbHVlXVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgT25TZWxlY3RlZEV2ZW50KGV2dCkge1xuICAgIHRoaXMub25zZWxlY3RJdGVtcy5lbWl0KGV2dC5zb3VyY2UpO1xuICAgIC8vaWYgKGV2dC5pc1VzZXJJbnB1dCkge1xuICAgIC8vICAgIHRoaXMub25zZWxlY3RJdGVtcy5lbWl0KGV2dC5zb3VyY2UpO1xuICAgIC8vfSBlbHNlIHtcbiAgICAvLyAgICB0aGlzLm9uc2VsZWN0SXRlbXMuZW1pdCh7IHZhbHVlOiBudWxsIH0pO1xuICAgIC8vfVxuICB9XG5cbiAgLy8gbXVsdGlcbiAgQWxsQ2xpY2tlZChjaGVja2VkKSB7XG4gICAgLy9jb25zb2xlLmxvZyhjaGVja2VkLCB0aGlzLm11bHRpZHJvcGRvd25DdHJsKVxuICAgIGlmIChjaGVja2VkLmNoZWNrZWQpIHtcbiAgICAgIC8vIHRoaXMubXVsdGlkcm9wZG93bkN0cmwucGF0Y2hWYWx1ZShbLi4udGhpcy5kcm9wZG93bkxpc3QubWFwKGl0ZW0gPT4gaXRlbS5rZXkpLCAwXSk7XG4gICAgICBsZXQgaXRlbXMgPSB0aGlzLmRyb3Bkb3duTGlzdC5tYXAoKGl0ZW0pID0+IGl0ZW0pO1xuICAgICAgdGhpcy5kcm9wZG93bkN0cmwuc2V0VmFsdWUoaXRlbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzLm11bHRpZHJvcGRvd25DdHJsLnBhdGNoVmFsdWUoW10pO1xuICAgICAgdGhpcy5kcm9wZG93bkN0cmwuc2V0VmFsdWUoW10pO1xuICAgIH1cbiAgICB0aGlzLm9uc2VsZWN0SXRlbXMuZW1pdCh0aGlzLmRyb3Bkb3duQ3RybCk7XG4gIH1cbiAgaXNjaGVja2VkKGNoZWNrKTogYm9vbGVhbiB7XG4gICAgbGV0IHNlbGVjdGVkOiBhbnkgPSB0aGlzLmRyb3Bkb3duQ3RybC52YWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kcm9wZG93bkxpc3QgJiZcbiAgICAgIHNlbGVjdGVkICYmXG4gICAgICBzZWxlY3RlZC5sZW5ndGggPiAwICYmXG4gICAgICB0aGlzLmRyb3Bkb3duTGlzdC5sZW5ndGggPT0gc2VsZWN0ZWQubGVuZ3RoXG4gICAgKTtcbiAgfVxuICBpc0luZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG4gICAgbGV0IHNlbGVjdGVkOiBhbnkgPSB0aGlzLmRyb3Bkb3duQ3RybC52YWx1ZTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kcm9wZG93bkxpc3QgJiZcbiAgICAgIHNlbGVjdGVkICYmXG4gICAgICBzZWxlY3RlZC5sZW5ndGggPiAwICYmXG4gICAgICBzZWxlY3RlZC5sZW5ndGggPCB0aGlzLmRyb3Bkb3duTGlzdC5sZW5ndGhcbiAgICApO1xuICB9XG5cbiAgb3BlbmVkQ2hhbmdlKCkge1xuICAgIFxuICAgIGlmICghdGhpcy5pbm5lclNlbGVjdEFsbCB8fCAhdGhpcy5pbm5lclNlbGVjdEFsbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBTZWxlY3RBbGxFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuaW5uZXJTZWxlY3RBbGwubmF0aXZlRWxlbWVudDtcbiAgICBsZXQgU2VsZWN0QWxsUGFuZWxFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICB3aGlsZSAoKFNlbGVjdEFsbEVsZW1lbnQgPSBTZWxlY3RBbGxFbGVtZW50LnBhcmVudEVsZW1lbnQpKSB7XG4gICAgICBpZiAoU2VsZWN0QWxsRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJtYXQtc2VsZWN0LXBhbmVsXCIpKSB7XG4gICAgICAgIFNlbGVjdEFsbFBhbmVsRWxlbWVudCA9IFNlbGVjdEFsbEVsZW1lbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoU2VsZWN0QWxsUGFuZWxFbGVtZW50KSB7XG4gICAgICB0aGlzLmlubmVyU2VsZWN0QWxsLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPVxuICAgICAgICBTZWxlY3RBbGxQYW5lbEVsZW1lbnQuY2xpZW50V2lkdGggKyBcInB4XCI7XG4gICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLmlubmVyU2VsZWN0QWxsLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcztcbiAgICAgIC8vaWYgKGNoaWxkcmVuKVxuICAgICAgLy8gICAgY2hpbGRyZW5bMF0uY2hpbGROb2Rlc1swXS5zdHlsZS53aWR0aCA9IFNlbGVjdGFsbHBhbmVsRWxlbWVudC5jbGllbnRXaWR0aCArICdweCc7XG4gICAgfVxuICB9XG59XG4iXX0=