UNPKG

sp-combo

Version:

# Angular sp-combo - Multiselect, Multiline and Autocomplete

166 lines 19.1 kB
import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from "@angular/forms"; const noop = () => { }; const ɵ0 = noop; export class SpComboComponent { constructor() { this.isDisabled = false; this.isMultiSelect = false; this.isLoading = false; this.closeOnSelect = true; this.isSelectByGroup = false; this.isSelectByGroupAsModel = false; this.selectedRow = new EventEmitter(); this.changeFn = new EventEmitter(); this.blurFn = new EventEmitter(); this.focusFn = new EventEmitter(); this.extraLbl = []; this.extraVal = []; this.searchFild = []; //The internal data model this.innerValue = ""; //Placeholders for the callbacks which are later provided //by the Control Value Accessor this.onTouchedCallback = noop; this.onChangeCallback = noop; } //get accessor get value() { return this.innerValue; } //set accessor including call the onchange callback set value(v) { if (v !== this.innerValue) { this.innerValue = v; this.onChangeCallback(v); } } //Set touched on blur onBlur() { this.onTouchedCallback(); if (this.blurFn != null) this.blurFn.emit(); } //From ControlValueAccessor interface writeValue(value) { if (value !== this.innerValue) { this.innerValue = value; } } //From ControlValueAccessor interface registerOnChange(fn) { this.onChangeCallback = fn; } //From ControlValueAccessor interface registerOnTouched(fn) { this.onTouchedCallback = fn; } onChange($event) { // this.selectedRow.emit($event); this.selectedRow.emit($event); if (this.changeFn != null) this.changeFn.emit(); } findExtra(term, lst) { this.searchFild.forEach(itm => { return lst[itm].toLowerCase().indexOf(term) > -1; }); } onSearch(trm, lst, a) { // var term = trm.term.toLowerCase(); // return ( // this.displayList[this.displayField].toLowerCase().indexOf(term) > -1 || // this.findExtra(term) // ); // this.ab = this.searchFild[0]; // return this.displayList[this.displayField].toLowerCase().indexOf(term) > -1 || this.displayList[this.ab].toLowerCase().indexOf(term) > -1 ; // var ac = this.displayList[this.displayField]; // var vd = this.displayList[this.ab]; // return this.displayList[this.displayField].toLowerCase().indexOf(term) > -1 ; // return this.displayList[this.ab].toLowerCase().indexOf(term) > -1 ; // this.displayList.forEach(lst => { // var m = lst[this.ab].toLowerCase().indexOf(term); // return lst[this.ab].toLowerCase().indexOf(term) > -1; // }); var term = trm.toLowerCase(); // return ( lst[this.displayField].toLowerCase().indexOf(term) > -1 || this.findExtra(term, lst) ); // return ( // lst[this.displayField].toLowerCase().indexOf(term) > -1 || // lst[this.searchFields].toLowerCase().indexOf(term) > -1 // ); } onFocus(fn) { if (this.focusFn != null) this.focusFn.emit(); } selectAll() { this.value = this.displayList.map(x => x[this.selectedValue]); } unselectAll() { this.value = []; } ngOnInit() { if (this.extraValues) this.extraVal = this.extraValues.split(","); if (this.extraLables) this.extraLbl = this.extraLables.split(","); } ngOnChanges(changes) { if (!this.placeHolder) this.placeHolder = ""; if (this.extraValues) this.extraVal = this.extraValues.split(","); if (this.extraLables) this.extraLbl = this.extraLables.split(","); } getExtraValue(item, idx) { if (this.extraVal.length > idx) { var ef = this.extraVal[idx].split("."); var val = item; var id = 0; for (var a of ef) { val = val[a]; id += 1; if (id == ef.length) { return val; } } } else { return item; } } } SpComboComponent.decorators = [ { type: Component, args: [{ selector: 'sp-combo', template: "<sp-select [placeholder]=\"placeHolder\" [items]=\"displayList\" [bindLabel]=\"displayField\" [bindValue]=\"selectedValue\"\r\n [(ngModel)]=\"value\" (change)=\"onChange($event)\" (blur)=\"onBlur()\" [multiple]=\"isMultiSelect\" [loading]=\"isLoading\"\r\n [groupBy]=\"groupBy\" [closeOnSelect]=\"closeOnSelect\" [selectableGroup]=\"isSelectByGroup\" [disabled]=\"isDisabled\"\r\n [selectableGroupAsModel]=\"isSelectByGroupAsModel\" (focus)=\"onFocus($event)\">\r\n\r\n <ng-template ng-optgroup-tmp let-item=\"item\" *ngIf=\"groupBy!=null && groupBy!=undefined\">\r\n {{item[groupBy] | uppercase}}\r\n <!-- {{item[groupBy] }} -->\r\n </ng-template>\r\n\r\n <ng-template ng-option-tmp let-item=\"item\">\r\n {{item[displayField]}} <br />\r\n\r\n <small *ngFor=\"let lbl of extraLbl; let i = index; let last = last;\">\r\n\r\n {{lbl}}&nbsp;:{{ getExtraValue(item,i) }}\r\n\r\n <span *ngIf=\"!last\">,&nbsp;</span>\r\n </small>\r\n\r\n <ng-template ng-header-tmp *ngIf=\"isMultiSelect==true\">\r\n <button (click)=\"selectAll()\" class=\"btn btn-sm btn-secondary\">Select all</button>\r\n <button (click)=\"unselectAll()\" class=\"btn btn-sm btn-secondary\">Unselect all</button>\r\n </ng-template>\r\n\r\n <ng-template ng-footer-tmp *ngIf=\"isMultiSelect && value!=undefined\">\r\n Selected Count: {{value.length}}\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n</sp-select>\r\n\r\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => SpComboComponent), multi: true } ] },] } ]; SpComboComponent.ctorParameters = () => []; SpComboComponent.propDecorators = { placeHolder: [{ type: Input }], displayList: [{ type: Input }], displayField: [{ type: Input }], selectedValue: [{ type: Input }], extraLables: [{ type: Input }], extraValues: [{ type: Input }], isDisabled: [{ type: Input }], isMultiSelect: [{ type: Input }], isLoading: [{ type: Input }], groupBy: [{ type: Input }], closeOnSelect: [{ type: Input }], isSelectByGroup: [{ type: Input }], isSelectByGroupAsModel: [{ type: Input }], selectedRow: [{ type: Output }], changeFn: [{ type: Output }], blurFn: [{ type: Output }], focusFn: [{ type: Output }] }; export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3AtY29tYm8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ikc6L1Byb2plY3RzL1BhdGlsIExpYnJhcnkvcGF0aWwtbGlicmFyeS9wcm9qZWN0cy9zcC1jb21iby9zcmMvIiwic291cmNlcyI6WyJsaWIvc3AtY29tYm8uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQTRCLFVBQVUsRUFDckYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7QUFhdkIsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQjtRQVFTLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFNUIsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUczQixrQkFBYSxHQUFZLElBQUksQ0FBQztRQUM5QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFFdkMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ25DLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ2pDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRzVDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUdoQix5QkFBeUI7UUFDakIsZUFBVSxHQUFRLEVBQUUsQ0FBQztRQUU3Qix5REFBeUQ7UUFDekQsK0JBQStCO1FBQ3ZCLHNCQUFpQixHQUFlLElBQUksQ0FBQztRQUNyQyxxQkFBZ0IsR0FBcUIsSUFBSSxDQUFDO0lBbkNsQyxD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Z0JBQ3hDLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDO3dCQUMvQyxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjthQUNGOzs7OzBCQUtFLEtBQUs7MEJBQ0wsS0FBSzsyQkFDTCxLQUFLOzRCQUNMLEtBQUs7MEJBQ0wsS0FBSzswQkFDTCxLQUFLO3lCQUNMLEtBQUs7NEJBRUwsS0FBSzt3QkFDTCxLQUFLO3NCQUVMLEtBQUs7NEJBQ0wsS0FBSzs4QkFDTCxLQUFLO3FDQUNMLEtBQUs7MEJBRUwsTUFBTTt1QkFDTixNQUFNO3FCQUNOLE1BQU07c0JBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcywgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5jb25zdCBub29wID0gKCkgPT4geyB9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcC1jb21ibycsXG4gIHRlbXBsYXRlVXJsOiAnLi9zcC1jb21iby5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU3BDb21ib0NvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBTcENvbWJvQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIEBJbnB1dCgpIHBsYWNlSG9sZGVyPzogc3RyaW5nO1xuICBASW5wdXQoKSBkaXNwbGF5TGlzdDogYW55W107XG4gIEBJbnB1dCgpIGRpc3BsYXlGaWVsZDogc3RyaW5nO1xuICBASW5wdXQoKSBzZWxlY3RlZFZhbHVlOiBhbnk7XG4gIEBJbnB1dCgpIGV4dHJhTGFibGVzPzogc3RyaW5nO1xuICBASW5wdXQoKSBleHRyYVZhbHVlcz86IHN0cmluZztcbiAgQElucHV0KCkgaXNEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGlzTXVsdGlTZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIEBJbnB1dCgpIHNlYXJjaEZpZWxkcz86IHN0cmluZztcbiAgQElucHV0KCkgZ3JvdXBCeT86IHN0cmluZztcbiAgQElucHV0KCkgY2xvc2VPblNlbGVjdDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGlzU2VsZWN0QnlHcm91cDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1NlbGVjdEJ5R3JvdXBBc01vZGVsOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHNlbGVjdGVkUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjaGFuZ2VGbiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgYmx1ckZuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBmb2N1c0ZuID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cblxuICBleHRyYUxibCA9IFtdO1xuICBleHRyYVZhbCA9IFtdO1xuICBzZWFyY2hGaWxkID0gW107XG5cblxuICAvL1RoZSBpbnRlcm5hbCBkYXRhIG1vZGVsXG4gIHByaXZhdGUgaW5uZXJWYWx1ZTogYW55ID0gXCJcIjtcblxuICAvL1BsYWNlaG9sZGVycyBmb3IgdGhlIGNhbGxiYWNrcyB3aGljaCBhcmUgbGF0ZXIgcHJvdmlkZWRcbiAgLy9ieSB0aGUgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcblxuICAvL2dldCBhY2Nlc3NvclxuICBnZXQgdmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuaW5uZXJWYWx1ZTsgfVxuXG4gIC8vc2V0IGFjY2Vzc29yIGluY2x1ZGluZyBjYWxsIHRoZSBvbmNoYW5nZSBjYWxsYmFja1xuICBzZXQgdmFsdWUodjogYW55KSB7XG4gICAgaWYgKHYgIT09IHRoaXMuaW5uZXJWYWx1ZSkge1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdjtcbiAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICB9XG4gIH1cblxuICAvL1NldCB0b3VjaGVkIG9uIGJsdXJcbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICBcbiAgICBpZiAodGhpcy5ibHVyRm4gIT0gbnVsbCkgdGhpcy5ibHVyRm4uZW1pdCgpO1xuICAgIFxuICB9XG5cbiAgLy9Gcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuaW5uZXJWYWx1ZSkge1xuICAgICAgdGhpcy5pbm5lclZhbHVlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy9Gcm9tIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIC8vRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIG9uQ2hhbmdlKCRldmVudCkge1xuICAgIC8vIHRoaXMuc2VsZWN0ZWRSb3cuZW1pdCgkZXZlbnQpO1xuICAgIHRoaXMuc2VsZWN0ZWRSb3cuZW1pdCgkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuY2hhbmdlRm4gIT0gbnVsbCkgdGhpcy5jaGFuZ2VGbi5lbWl0KCk7XG5cbiAgfVxuXG4gIGZpbmRFeHRyYSh0ZXJtLCBsc3QpIHtcbiAgICB0aGlzLnNlYXJjaEZpbGQuZm9yRWFjaChpdG0gPT4ge1xuICAgICAgcmV0dXJuIGxzdFtpdG1dLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xO1xuICAgIH0pO1xuICB9XG5cbiAgb25TZWFyY2godHJtLCBsc3QsIGEpIHtcbiAgICAvLyB2YXIgdGVybSA9IHRybS50ZXJtLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyByZXR1cm4gKFxuICAgIC8vICAgdGhpcy5kaXNwbGF5TGlzdFt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRlcm0pID4gLTEgfHxcbiAgICAvLyAgIHRoaXMuZmluZEV4dHJhKHRlcm0pXG4gICAgLy8gKTtcbiAgICAvLyB0aGlzLmFiID0gdGhpcy5zZWFyY2hGaWxkWzBdO1xuICAgIC8vIHJldHVybiB0aGlzLmRpc3BsYXlMaXN0W3RoaXMuZGlzcGxheUZpZWxkXS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGVybSkgPiAtMSB8fCB0aGlzLmRpc3BsYXlMaXN0W3RoaXMuYWJdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xIDtcbiAgICAvLyB2YXIgYWMgPSB0aGlzLmRpc3BsYXlMaXN0W3RoaXMuZGlzcGxheUZpZWxkXTtcbiAgICAvLyB2YXIgdmQgPSB0aGlzLmRpc3BsYXlMaXN0W3RoaXMuYWJdO1xuXG4gICAgLy8gcmV0dXJuIHRoaXMuZGlzcGxheUxpc3RbdGhpcy5kaXNwbGF5RmllbGRdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xICA7XG4gICAgLy8gcmV0dXJuICB0aGlzLmRpc3BsYXlMaXN0W3RoaXMuYWJdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xIDtcblxuICAgIC8vIHRoaXMuZGlzcGxheUxpc3QuZm9yRWFjaChsc3QgPT4ge1xuICAgIC8vICAgdmFyIG0gPSBsc3RbdGhpcy5hYl0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRlcm0pO1xuXG4gICAgLy8gICByZXR1cm4gbHN0W3RoaXMuYWJdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xO1xuICAgIC8vIH0pO1xuXG4gICAgdmFyIHRlcm0gPSB0cm0udG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIHJldHVybiAoIGxzdFt0aGlzLmRpc3BsYXlGaWVsZF0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRlcm0pID4gLTEgfHwgdGhpcy5maW5kRXh0cmEodGVybSwgbHN0KSApO1xuICAgIC8vIHJldHVybiAoXG4gICAgLy8gICBsc3RbdGhpcy5kaXNwbGF5RmllbGRdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xIHx8XG4gICAgLy8gICBsc3RbdGhpcy5zZWFyY2hGaWVsZHNdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtKSA+IC0xXG4gICAgLy8gKTtcbiAgfVxuXG4gIG9uRm9jdXMoZm46IGFueSkge1xuICAgIGlmICh0aGlzLmZvY3VzRm4gIT0gbnVsbCkgdGhpcy5mb2N1c0ZuLmVtaXQoKTtcbiAgfVxuXG4gIHNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5kaXNwbGF5TGlzdC5tYXAoeCA9PiB4W3RoaXMuc2VsZWN0ZWRWYWx1ZV0pO1xuICB9XG5cbiAgdW5zZWxlY3RBbGwoKSB7XG4gICAgdGhpcy52YWx1ZSA9IFtdO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMuZXh0cmFWYWx1ZXMpXG4gICAgICB0aGlzLmV4dHJhVmFsID0gdGhpcy5leHRyYVZhbHVlcy5zcGxpdChcIixcIik7XG5cbiAgICBpZiAodGhpcy5leHRyYUxhYmxlcylcbiAgICAgIHRoaXMuZXh0cmFMYmwgPSB0aGlzLmV4dHJhTGFibGVzLnNwbGl0KFwiLFwiKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblxuICAgIGlmICghdGhpcy5wbGFjZUhvbGRlcilcbiAgICAgIHRoaXMucGxhY2VIb2xkZXIgPSBcIlwiO1xuXG4gICAgaWYgKHRoaXMuZXh0cmFWYWx1ZXMpXG4gICAgICB0aGlzLmV4dHJhVmFsID0gdGhpcy5leHRyYVZhbHVlcy5zcGxpdChcIixcIik7XG5cbiAgICBpZiAodGhpcy5leHRyYUxhYmxlcylcbiAgICAgIHRoaXMuZXh0cmFMYmwgPSB0aGlzLmV4dHJhTGFibGVzLnNwbGl0KFwiLFwiKTtcblxuICB9XG5cbiAgZ2V0RXh0cmFWYWx1ZShpdGVtLCBpZHgpIHtcbiAgICBpZiAodGhpcy5leHRyYVZhbC5sZW5ndGggPiBpZHgpIHtcbiAgICAgIHZhciBlZiA9IHRoaXMuZXh0cmFWYWxbaWR4XS5zcGxpdChcIi5cIik7XG5cbiAgICAgIHZhciB2YWwgPSBpdGVtO1xuXG4gICAgICB2YXIgaWQgPSAwO1xuXG4gICAgICBmb3IgKHZhciBhIG9mIGVmKSB7XG4gICAgICAgIHZhbCA9IHZhbFthXTtcblxuICAgICAgICBpZCArPSAxO1xuICAgICAgICBpZiAoaWQgPT0gZWYubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG5cbiAgfVxuXG5cblxuXG59XG4iXX0=