sp-combo
Version:
# Angular sp-combo - Multiselect, Multiline and Autocomplete
166 lines • 19.1 kB
JavaScript
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}} :{{ getExtraValue(item,i) }}\r\n\r\n <span *ngIf=\"!last\">, </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=