@neocomplexx/ngx-neo-completer
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.
362 lines • 39.3 kB
JavaScript
'use strict';
import { __decorate, __metadata } from "tslib";
import { ChangeDetectorRef, Component, Input, Output, EventEmitter, ViewChild, forwardRef, ElementRef } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';
import { CtrCompleter } from '../directives/ctr-completer';
import { CompleterService } from '../services/completer-service';
import { MAX_CHARS, MIN_SEARCH_LENGTH, PAUSE, TEXT_SEARCHING, TEXT_NO_RESULTS } from '../globals';
var noop = function () { };
var ɵ0 = noop;
var COMPLETER_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return CompleterCmp; }),
multi: true
};
var CompleterCmp = /** @class */ (function () {
function CompleterCmp(completerService, cdr) {
this.completerService = completerService;
this.cdr = cdr;
this.inputName = '';
this.inputId = '';
this.pause = PAUSE;
this.minSearchLength = MIN_SEARCH_LENGTH;
this.maxChars = MAX_CHARS;
this.overrideSuggested = false;
this.clearSelected = false;
this.clearUnselected = false;
this.fillHighlighted = true;
this.placeholder = '';
this.autoMatch = false;
this.disableInput = false;
this.autofocus = false;
this.openOnFocus = false;
this.openOnClick = false;
this.selectOnClick = false;
this.autoHighlight = false;
this.autoSelectOnEnter = true;
this.selected = new EventEmitter();
this.highlighted = new EventEmitter();
// tslint:disable:no-output-rename
this.blurEvent = new EventEmitter();
this.click = new EventEmitter();
this.focusEvent = new EventEmitter();
this.opened = new EventEmitter();
this.keyup = new EventEmitter();
this.keydown = new EventEmitter();
this.searchStr = '';
this.control = new FormControl('');
this.displaySearching = true;
this.displayNoResults = true;
this._textNoResults = TEXT_NO_RESULTS;
this._textSearching = TEXT_SEARCHING;
this._onTouchedCallback = noop;
this._onChangeCallback = noop;
this._focus = false;
this._open = false;
}
Object.defineProperty(CompleterCmp.prototype, "value", {
get: function () { return this.searchStr; },
set: function (v) {
if (v !== this.searchStr) {
this.searchStr = v;
}
// Propagate the change in any case
this._onChangeCallback(v);
},
enumerable: true,
configurable: true
});
CompleterCmp.prototype.ngAfterViewInit = function () {
if (this.autofocus) {
this._focus = true;
}
};
CompleterCmp.prototype.ngAfterViewChecked = function () {
var _this = this;
if (this._focus) {
setTimeout(function () {
_this.ctrInput.nativeElement.focus();
_this._focus = false;
}, 0);
}
};
CompleterCmp.prototype.onTouched = function () {
this._onTouchedCallback();
};
CompleterCmp.prototype.writeValue = function (value) {
this.searchStr = value;
};
CompleterCmp.prototype.registerOnChange = function (fn) {
this._onChangeCallback = fn;
};
CompleterCmp.prototype.registerOnTouched = function (fn) {
this._onTouchedCallback = fn;
};
CompleterCmp.prototype.setDisabledState = function (isDisabled) {
this.disableInput = isDisabled;
};
Object.defineProperty(CompleterCmp.prototype, "datasource", {
set: function (source) {
if (source) {
if (source instanceof Array) {
this.dataService = this.completerService.local(source);
}
else if (typeof (source) === 'string') {
this.dataService = this.completerService.remote(source);
}
else {
this.dataService = source;
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(CompleterCmp.prototype, "textNoResults", {
set: function (text) {
if (this._textNoResults !== text) {
this._textNoResults = text;
this.displayNoResults = !!this._textNoResults && this._textNoResults !== 'false';
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(CompleterCmp.prototype, "textSearching", {
set: function (text) {
if (this._textSearching !== text) {
this._textSearching = text;
this.displaySearching = !!this._textSearching && this._textSearching !== 'false';
}
},
enumerable: true,
configurable: true
});
CompleterCmp.prototype.ngOnInit = function () {
var _this = this;
this.completer.selected.subscribe(function (item) {
_this.selected.emit(item);
});
this.completer.highlighted.subscribe(function (item) {
_this.highlighted.emit(item);
});
this.completer.opened.subscribe(function (isOpen) {
_this._open = isOpen;
_this.opened.emit(isOpen);
});
};
CompleterCmp.prototype.onBlur = function () {
this.blurEvent.emit();
this.onTouched();
this.cdr.detectChanges();
};
CompleterCmp.prototype.onFocus = function () {
this.focusEvent.emit();
this.onTouched();
};
CompleterCmp.prototype.onClick = function (event) {
this.click.emit(event);
this.onTouched();
};
CompleterCmp.prototype.onKeyup = function (event) {
this.keyup.emit(event);
};
CompleterCmp.prototype.onKeydown = function (event) {
this.keydown.emit(event);
};
CompleterCmp.prototype.onChange = function (value) {
this.value = value;
};
CompleterCmp.prototype.open = function () {
this.completer.open();
};
CompleterCmp.prototype.close = function () {
this.completer.clear();
};
CompleterCmp.prototype.focus = function () {
if (this.ctrInput) {
this.ctrInput.nativeElement.focus();
}
else {
this._focus = true;
}
};
CompleterCmp.prototype.blur = function () {
if (this.ctrInput) {
this.ctrInput.nativeElement.blur();
}
else {
this._focus = false;
}
};
CompleterCmp.prototype.isOpen = function () {
return this._open;
};
CompleterCmp.ctorParameters = function () { return [
{ type: CompleterService },
{ type: ChangeDetectorRef }
]; };
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "dataService", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "inputName", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "inputId", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "pause", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "minSearchLength", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "maxChars", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "overrideSuggested", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "clearSelected", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "clearUnselected", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "fillHighlighted", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "placeholder", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], CompleterCmp.prototype, "matchClass", void 0);
__decorate([
Input(),
__metadata("design:type", Number)
], CompleterCmp.prototype, "fieldTabindex", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autoMatch", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "disableInput", void 0);
__decorate([
Input(),
__metadata("design:type", String)
], CompleterCmp.prototype, "inputClass", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autofocus", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "openOnFocus", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "openOnClick", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "selectOnClick", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "initialValue", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autoHighlight", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "autoSelectOnEnter", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "selected", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "highlighted", void 0);
__decorate([
Output('blur'),
__metadata("design:type", Object)
], CompleterCmp.prototype, "blurEvent", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "click", void 0);
__decorate([
Output('focus'),
__metadata("design:type", Object)
], CompleterCmp.prototype, "focusEvent", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], CompleterCmp.prototype, "opened", void 0);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], CompleterCmp.prototype, "keyup", void 0);
__decorate([
Output(),
__metadata("design:type", EventEmitter)
], CompleterCmp.prototype, "keydown", void 0);
__decorate([
ViewChild(CtrCompleter, { static: true }),
__metadata("design:type", CtrCompleter)
], CompleterCmp.prototype, "completer", void 0);
__decorate([
ViewChild('ctrInput', { static: true }),
__metadata("design:type", ElementRef)
], CompleterCmp.prototype, "ctrInput", void 0);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], CompleterCmp.prototype, "datasource", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], CompleterCmp.prototype, "textNoResults", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], CompleterCmp.prototype, "textSearching", null);
CompleterCmp = __decorate([
Component({
// tslint:disable:max-line-length
selector: 'neo-completer',
template: "\n <div class=\"completer-holder\" ctrCompleter>\n <input #ctrInput [attr.id]=\"inputId.length > 0 ? inputId : null\" type=\"search\" class=\"completer-input\" ctrInput [ngClass]=\"inputClass\"\n [(ngModel)]=\"searchStr\" (ngModelChange)=\"onChange($event)\" [attr.name]=\"inputName\" [placeholder]=\"placeholder\"\n [attr.maxlength]=\"maxChars\" [tabindex]=\"fieldTabindex\" [disabled]=\"disableInput\"\n [clearSelected]=\"clearSelected\" [clearUnselected]=\"clearUnselected\"\n [overrideSuggested]=\"overrideSuggested\" [openOnFocus]=\"openOnFocus\" [fillHighlighted]=\"fillHighlighted\"\n [openOnClick]=\"openOnClick\" [selectOnClick]=\"selectOnClick\" [autoSelectOnEnter]=\"autoSelectOnEnter\"\n (blur)=\"onBlur()\" (focus)=\"onFocus()\" (keyup)=\"onKeyup($event)\" (keydown)=\"onKeydown($event)\" (click)=\"onClick($event)\"\n autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\" />\n\n <div class=\"completer-dropdown-holder\"\n *ctrList=\"dataService;\n minSearchLength: minSearchLength;\n pause: pause;\n autoMatch: autoMatch;\n initialValue: initialValue;\n autoHighlight: autoHighlight;\n displaySearching: displaySearching;\n let items = results;\n let searchActive = searching;\n let isInitialized = searchInitialized;\n let isOpen = isOpen;\">\n <div class=\"completer-dropdown\" ctrDropdown *ngIf=\"isInitialized && isOpen && (( items?.length > 0|| (displayNoResults && !searchActive)) || (searchActive && displaySearching))\">\n <div *ngIf=\"searchActive && displaySearching\" class=\"completer-searching\">{{_textSearching}}</div>\n <div *ngIf=\"!searchActive && (!items || items?.length === 0)\" class=\"completer-no-results\">{{_textNoResults}}</div>\n <div class=\"completer-row-wrapper\" *ngFor=\"let item of items; let rowIndex=index\">\n <div class=\"completer-row\" [ctrRow]=\"rowIndex\" [dataItem]=\"item\">\n <div *ngIf=\"item.image || item.image === ''\" class=\"completer-image-holder\">\n <img *ngIf=\"item.image != ''\" src=\"{{item.image}}\" class=\"completer-image\" />\n <div *ngIf=\"item.image === ''\" class=\"completer-image-default\"></div>\n </div>\n <div class=\"completer-item-text\" [ngClass]=\"{'completer-item-text-image': item.image || item.image === '' }\">\n <completer-list-item class=\"completer-title\" [text]=\"item.title\" [matchClass]=\"matchClass\" [searchStr]=\"searchStr\" [type]=\"'title'\"></completer-list-item>\n <completer-list-item *ngIf=\"item.description && item.description != ''\" class=\"completer-description\" [text]=\"item.description\"\n [matchClass]=\"matchClass\" [searchStr]=\"searchStr\" [type]=\"'description'\">\n </completer-list-item>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n ",
providers: [COMPLETER_CONTROL_VALUE_ACCESSOR],
styles: [".completer-dropdown{border-radius:0;width:calc(100% - 30px);cursor:pointer;z-index:9999;position:absolute;background-color:#fff;max-height:200px;height:200px;overflow-y:auto;overflow-x:hidden;border:1px solid #ececec}.completer-row{color:#000;width:100%;padding:5px 12px}.completer-selected-row{background-color:#add8e6;color:#fff}.completer-description{font-size:14px}.completer-image-default{width:16px;height:16px;background-image:url(demo/res/img/default.png)}.completer-image-holder{float:left;width:10%}.completer-item-text-image{float:right;width:90%}"]
})
// tslint:disable-next-line:component-class-suffix
,
__metadata("design:paramtypes", [CompleterService, ChangeDetectorRef])
], CompleterCmp);
return CompleterCmp;
}());
export { CompleterCmp };
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxldGVyLWNtcC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLWNvbXBsZXRlci8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2NvbXBsZXRlci1jbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUNiLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0gsT0FBTyxFQUF3QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRyxJQUFNLElBQUksR0FBRyxjQUFRLENBQUMsQ0FBQzs7QUFFdkIsSUFBTSxnQ0FBZ0MsR0FBRztJQUNyQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLFlBQVksRUFBWixDQUFZLENBQUM7SUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBc0RGO0lBa0RJLHNCQUFvQixnQkFBa0MsRUFBVSxHQUFzQjtRQUFsRSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFoRHRFLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNkLG9CQUFlLEdBQUcsaUJBQWlCLENBQUM7UUFDcEMsYUFBUSxHQUFH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RXJFO1FBREMsS0FBSyxFQUFFOzs7a0RBV1A7SUFHRDtRQURDLEtBQUssRUFBRTs7O3FEQU1QO0lBR0Q7UUFEQyxLQUFLLEVBQUU7OztxREFNUDtJQS9IUSxZQUFZO1FBbkR4QixTQUFTLENBQUM7WUFDUCxpQ0FBaUM7WUFDakMsUUFBUSxFQUFFLGVBQWU7WUFDekIsUUFBUSxFQUFFLG02R0EyQ1Q7WUFFRCxTQUFTLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQzs7U0FDaEQsQ0FBQztRQUNGLGtEQUFrRDs7eUNBbURSLGdCQUFnQixFQUFlLGlCQUFpQjtPQWxEN0UsWUFBWSxDQXFNeEI7SUFBRCxtQkFBQztDQUFBLEFBck1ELElBcU1DO1NBck1ZLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBBZnRlclZpZXdJbml0LCBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEN0ckNvbXBsZXRlciB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvY3RyLWNvbXBsZXRlcic7XG5pbXBvcnQgeyBDb21wbGV0ZXJEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY29tcGxldGVyLWRhdGEnO1xuaW1wb3J0IHsgQ29tcGxldGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbXBsZXRlci1zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBsZXRlckl0ZW0gfSBmcm9tICcuL2NvbXBsZXRlci1pdGVtJztcbmltcG9ydCB7IE1BWF9DSEFSUywgTUlOX1NFQVJDSF9MRU5HVEgsIFBBVVNFLCBURVhUX1NFQVJDSElORywgVEVYVF9OT19SRVNVTFRTIH0gZnJvbSAnLi4vZ2xvYmFscyc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07XG5cbmNvbnN0IENPTVBMRVRFUl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENvbXBsZXRlckNtcCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cblxuQENvbXBvbmVudCh7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgc2VsZWN0b3I6ICduZW8tY29tcGxldGVyJyxcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLWhvbGRlclwiIGN0ckNvbXBsZXRlcj5cbiAgICAgICAgICAgIDxpbnB1dCAjY3RySW5wdXQgW2F0dHIuaWRdPVwiaW5wdXRJZC5sZW5ndGggPiAwID8gaW5wdXRJZCA6IG51bGxcIiB0eXBlPVwic2VhcmNoXCIgY2xhc3M9XCJjb21wbGV0ZXItaW5wdXRcIiBjdHJJbnB1dCBbbmdDbGFzc109XCJpbnB1dENsYXNzXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFN0clwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIiBbYXR0ci5uYW1lXT1cImlucHV0TmFtZVwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgW2F0dHIubWF4bGVuZ3RoXT1cIm1heENoYXJzXCIgW3RhYmluZGV4XT1cImZpZWxkVGFiaW5kZXhcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZUlucHV0XCJcbiAgICAgICAgICAgICAgICBbY2xlYXJTZWxlY3RlZF09XCJjbGVhclNlbGVjdGVkXCIgW2NsZWFyVW5zZWxlY3RlZF09XCJjbGVhclVuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtvdmVycmlkZVN1Z2dlc3RlZF09XCJvdmVycmlkZVN1Z2dlc3RlZFwiIFtvcGVuT25Gb2N1c109XCJvcGVuT25Gb2N1c1wiIFtmaWxsSGlnaGxpZ2h0ZWRdPVwiZmlsbEhpZ2hsaWdodGVkXCJcbiAgICAgICAgICAgICAgICBbb3Blbk9uQ2xpY2tdPVwib3Blbk9uQ2xpY2tcIiBbc2VsZWN0T25DbGlja109XCJzZWxlY3RPbkNsaWNrXCIgW2F1dG9TZWxlY3RPbkVudGVyXT1cImF1dG9TZWxlY3RPbkVudGVyXCJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiIChmb2N1cyk9XCJvbkZvY3VzKClcIiAoa2V5dXApPVwib25LZXl1cCgkZXZlbnQpXCIgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIGF1dG9jYXBpdGFsaXplPVwib2ZmXCIgLz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1kcm9wZG93bi1ob2xkZXJcIlxuICAgICAgICAgICAgICAgICpjdHJMaXN0PVwiZGF0YVNlcnZpY2U7XG4gICAgICAgICAgICAgICAgICAgIG1pblNlYXJjaExlbmd0aDogbWluU2VhcmNoTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBwYXVzZTogcGF1c2U7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9NYXRjaDogYXV0b01hdGNoO1xuICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWU6IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYXV0b0hpZ2hsaWdodDogYXV0b0hpZ2hsaWdodDtcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVNlYXJjaGluZzogZGlzcGxheVNlYXJjaGluZztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEFjdGl2ZSA9IHNlYXJjaGluZztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSW5pdGlhbGl6ZWQgPSBzZWFyY2hJbml0aWFsaXplZDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzT3BlbiA9IGlzT3BlbjtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGxldGVyLWRyb3Bkb3duXCIgY3RyRHJvcGRvd24gKm5nSWY9XCJpc0luaXRpYWxpemVkICYmIGlzT3BlbiAmJiAoKCBpdGVtcz8ubGVuZ3RoID4gMHx8IChkaXNwbGF5Tm9SZXN1bHRzICYmICFzZWFyY2hBY3RpdmUpKSB8fCAoc2VhcmNoQWN0aXZlICYmIGRpc3BsYXlTZWFyY2hpbmcpKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2VhcmNoQWN0aXZlICYmIGRpc3BsYXlTZWFyY2hpbmdcIiBjbGFzcz1cImNvbXBsZXRlci1zZWFyY2hpbmdcIj57e190ZXh0U2VhcmNoaW5nfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzZWFyY2hBY3RpdmUgJiYgKCFpdGVtcyB8fCBpdGVtcz8ubGVuZ3RoID09PSAwKVwiIGNsYXNzPVwiY29tcGxldGVyLW5vLXJlc3VsdHNcIj57e190ZXh0Tm9SZXN1bHRzfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBsZXRlci1yb3ctd3JhcHBlclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgcm93SW5kZXg9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItcm93XCIgW2N0clJvd109XCJyb3dJbmRleFwiIFtkYXRhSXRlbV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uaW1hZ2UgfHwgaXRlbS5pbWFnZSA9PT0gJydcIiBjbGFzcz1cImNvbXBsZXRlci1pbWFnZS1ob2xkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIml0ZW0uaW1hZ2UgIT0gJydcIiBzcmM9XCJ7e2l0ZW0uaW1hZ2V9fVwiIGNsYXNzPVwiY29tcGxldGVyLWltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uaW1hZ2UgPT09ICcnXCIgY2xhc3M9XCJjb21wbGV0ZXItaW1hZ2UtZGVmYXVsdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wbGV0ZXItaXRlbS10ZXh0XCIgW25nQ2xhc3NdPVwieydjb21wbGV0ZXItaXRlbS10ZXh0LWltYWdlJzogaXRlbS5pbWFnZSB8fCBpdGVtLmltYWdlID09PSAnJyB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21wbGV0ZXItbGlzdC1pdGVtIGNsYXNzPVwiY29tcGxldGVyLXRpdGxlXCIgW3RleHRdPVwiaXRlbS50aXRsZVwiIFttYXRjaENsYXNzXT1cIm1hdGNoQ2xhc3NcIiBbc2VhcmNoU3RyXT1cInNlYXJjaFN0clwiIFt0eXBlXT1cIid0aXRsZSdcIj48L2NvbXBsZXRlci1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb21wbGV0ZXItbGlzdC1pdGVtICpuZ0lmPVwiaXRlbS5kZXNjcmlwdGlvbiAmJiBpdGVtLmRlc2NyaXB0aW9uICE9ICcnXCIgY2xhc3M9XCJjb21wbGV0ZXItZGVzY3JpcHRpb25cIiBbdGV4dF09XCJpdGVtLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRjaENsYXNzXT1cIm1hdGNoQ2xhc3NcIiBbc2VhcmNoU3RyXT1cInNlYXJjaFN0clwiIFt0eXBlXT1cIidkZXNjcmlwdGlvbidcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb21wbGV0ZXItbGlzdC1pdGVtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIGAsXG4gICAgc3R5bGVVcmxzOiBbJ2NvbXBsZXRlci1jbXAuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW0NPTVBMRVRFUl9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxufSlcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQ29tcGxldGVyQ21wIGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgQElucHV0KCkgcHVibGljIGRhdGFTZXJ2aWNlOiBDb21wbGV0ZXJEYXRhO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbnB1dE5hbWUgPSAnJztcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5wdXRJZCA9ICcnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwYXVzZSA9IFBBVVNFO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtaW5TZWFyY2hMZW5ndGggPSBNSU5fU0VBUkNIX0xFTkdUSDtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4Q2hhcnMgPSBNQVhfQ0hBUlM7XG4gICAgQElucHV0KCkgcHVibGljIG92ZXJyaWRlU3VnZ2VzdGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGNsZWFyU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2xlYXJVbnNlbGVjdGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGZpbGxIaWdobGlnaHRlZCA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlaG9sZGVyID0gJyc7XG4gICAgQElucHV0KCkgcHVibGljIG1hdGNoQ2xhc3M6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgZmllbGRUYWJpbmRleDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhdXRvTWF0Y2ggPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZUlucHV0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGlucHV0Q2xhc3M6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b2ZvY3VzID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIG9wZW5PbkZvY3VzID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIG9wZW5PbkNsaWNrID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIHNlbGVjdE9uQ2xpY2sgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5pdGlhbFZhbHVlOiBhbnk7XG4gICAgQElucHV0KCkgcHVibGljIGF1dG9IaWdobGlnaHQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgYXV0b1NlbGVjdE9uRW50ZXIgPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcGxldGVySXRlbT4oKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIGhpZ2hsaWdodGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb21wbGV0ZXJJdGVtPigpO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLW91dHB1dC1yZW5hbWVcbiAgICBAT3V0cHV0KCdibHVyJykgcHVibGljIGJsdXJFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIGNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIEBPdXRwdXQoJ2ZvY3VzJykgcHVibGljIGZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBrZXl1cDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBrZXlkb3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBWaWV3Q2hpbGQoQ3RyQ29tcGxldGVyLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgY29tcGxldGVyOiBDdHJDb21wbGV0ZXI7XG4gICAgQFZpZXdDaGlsZCgnY3RySW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgY3RySW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBwdWJsaWMgc2VhcmNoU3RyID0gJyc7XG4gICAgcHVibGljIGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xuICAgIHB1YmxpYyBkaXNwbGF5U2VhcmNoaW5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgZGlzcGxheU5vUmVzdWx0cyA9IHRydWU7XG4gICAgcHVibGljIF90ZXh0Tm9SZXN1bHRzID0gVEVYVF9OT19SRVNVTFRTO1xuICAgIHB1YmxpYyBfdGV4dFNlYXJjaGluZyA9IFRFWFRfU0VBUkNISU5HO1xuXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgX29uQ2hhbmdlQ2FsbGJhY2s6IChfOiBhbnkpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgX2ZvY3VzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfb3BlbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wbGV0ZXJTZXJ2aWNlOiBDb21wbGV0ZXJTZXJ2aWNlLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gICAgZ2V0IHZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLnNlYXJjaFN0cjsgfVxuXG4gICAgc2V0IHZhbHVlKHY6IGFueSkge1xuICAgICAgICBpZiAodiAhPT0gdGhpcy5zZWFyY2hTdHIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcm9wYWdhdGUgdGhlIGNoYW5nZSBpbiBhbnkgY2FzZVxuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9mb2N1cykge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHJJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uVG91Y2hlZCgpIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2VhcmNoU3RyID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUlucHV0ID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZGF0YXNvdXJjZShzb3VyY2U6IENvbXBsZXRlckRhdGEgfCBzdHJpbmcgfCBBcnJheTxhbnk+KSB7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSB0aGlzLmNvbXBsZXRlclNlcnZpY2UubG9jYWwoc291cmNlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIChzb3VyY2UpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSB0aGlzLmNvbXBsZXRlclNlcnZpY2UucmVtb3RlKHNvdXJjZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdGV4dE5vUmVzdWx0cyh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RleHROb1Jlc3VsdHMgIT09IHRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHROb1Jlc3VsdHMgPSB0ZXh0O1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5Tm9SZXN1bHRzID0gISF0aGlzLl90ZXh0Tm9SZXN1bHRzICYmIHRoaXMuX3RleHROb1Jlc3VsdHMgIT09ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgdGV4dFNlYXJjaGluZyh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RleHRTZWFyY2hpbmcgIT09IHRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3RleHRTZWFyY2hpbmcgPSB0ZXh0O1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5U2VhcmNoaW5nID0gISF0aGlzLl90ZXh0U2VhcmNoaW5nICYmIHRoaXMuX3RleHRTZWFyY2hpbmcgIT09ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLnNlbGVjdGVkLnN1YnNjcmliZSgoaXRlbTogQ29tcGxldGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5lbWl0KGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb21wbGV0ZXIuaGlnaGxpZ2h0ZWQuc3Vic2NyaWJlKChpdGVtOiBDb21wbGV0ZXJJdGVtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkLmVtaXQoaXRlbSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbXBsZXRlci5vcGVuZWQuc3Vic2NyaWJlKChpc09wZW46IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29wZW4gPSBpc09wZW47XG4gICAgICAgICAgICB0aGlzLm9wZW5lZC5lbWl0KGlzT3Blbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkZvY3VzKCkge1xuICAgICAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdCgpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5jbGljay5lbWl0KGV2ZW50KTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25LZXl1cChldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMua2V5dXAuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5ZG93bihldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMua2V5ZG93bi5lbWl0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25DaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW4oKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLm9wZW4oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuY29tcGxldGVyLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZvY3VzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdHJJbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5jdHJJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYmx1cigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3RySW5wdXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3RySW5wdXQubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1cyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGlzT3BlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wZW47XG4gICAgfVxufVxuIl19