@mobsolutions/ngx-dadata
Version:
[](https://badge.fury.io/js/%40kolkov%2Fngx-dadata) [](https://travis-ci.org/kolkov/ngx-dadata) [![Coverage Stat
415 lines • 28.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, Renderer2, ViewChild } from '@angular/core';
import { DadataType, NgxDadataService } from './ngx-dadata.service';
import { Subject, timer } from 'rxjs';
import { debounce } from 'rxjs/operators';
import { DadataConfigDefault } from './dadata-config';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
var NGX_DADATA_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return NgxDadataComponent; })),
multi: true
};
/*const NGX_DADATA_VALIDATOR = {
provide: NG_VALIDATORS,
useExisting: forwardRef(() => NgxDadataComponent),
multi: true,
};*/
/**
* @param {?} value
* @return {?}
*/
export function createDaDataValidator(value) {
return (/**
* @param {?} c
* @return {?}
*/
function (c) {
/** @type {?} */
var err = {
rangeError: {
given: c.value,
expected: value,
}
};
return (c.value !== value) ? err : null;
});
}
var NgxDadataComponent = /** @class */ (function () {
function NgxDadataComponent(dataService, _r) {
this.dataService = dataService;
this._r = _r;
this.v = '';
this.currentFocus = -1;
this.data = [];
this.config = DadataConfigDefault;
this.disabled = null;
this.type = DadataType.address;
this.limit = DadataConfigDefault.limit;
this.placeholder = '';
this.selected = new EventEmitter();
this.inputString$ = new Subject();
// onSuggestionSelected = (value: string) => {};
this.onTouched = (/**
* @return {?}
*/
function () { });
this.propagateChange = (/**
* @return {?}
*/
function () { });
this.validateFn = (/**
* @return {?}
*/
function () { });
}
Object.defineProperty(NgxDadataComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this.v;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
if (v !== this.v) {
this.v = v;
this.propagateChange(v);
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxDadataComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
/*this.validateFn = createDaDataValidator(this._value);
this.propagateChange(this._value);*/
this.type = this.config.type;
this.dataService.setApiKey(this.apiKey ? this.apiKey : this.config.apiKey);
this.inputString$.pipe(debounce((/**
* @return {?}
*/
function () { return timer(_this.config.delay ? _this.config.delay : 500); }))).subscribe((/**
* @param {?} x
* @return {?}
*/
function (x) {
_this.dataService.getData(x, _this.type, _this.limit).subscribe((/**
* @param {?} y
* @return {?}
*/
function (y) {
_this.data = y.suggestions;
}));
}));
};
/**
* @param {?} changes
* @return {?}
*/
NgxDadataComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes.value) {
}
};
/**
* @param {?} value
* @return {?}
*/
NgxDadataComponent.prototype.getData = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.inputString$.next(value);
this.currentFocus = -1;
};
/**
* @param {?} e
* @param {?} item
* @return {?}
*/
NgxDadataComponent.prototype.onClick = /**
* @param {?} e
* @param {?} item
* @return {?}
*/
function (e, item) {
// e.preventDefault();
this.inputValue.nativeElement.value = item.value;
this.propagateChange(item.value);
this.inputValue.nativeElement.focus();
this.selectedSuggestion = item;
this.data = [];
this.currentFocus = -1;
// this.writeValue(item.value);
this.selected.emit(item);
// this.selectedData.emit(item.data);
// this.selectedString.emit(item.value);
};
/**
* @return {?}
*/
NgxDadataComponent.prototype.onOutsideClick = /**
* @return {?}
*/
function () {
this.data = [];
};
/**
* @return {?}
*/
NgxDadataComponent.prototype.onArrowDown = /**
* @return {?}
*/
function () {
this.removeFocus(this.currentFocus);
if (this.currentFocus >= this.data.length - 1) {
this.currentFocus = 0;
}
else {
this.currentFocus++;
}
this.setFocus(this.currentFocus);
};
/**
* @return {?}
*/
NgxDadataComponent.prototype.onArrowUp = /**
* @return {?}
*/
function () {
this.removeFocus(this.currentFocus);
if (this.currentFocus === 0) {
this.currentFocus = this.data.length - 1;
}
else {
this.currentFocus--;
}
this.setFocus(this.currentFocus);
};
/**
* @return {?}
*/
NgxDadataComponent.prototype.onEnter = /**
* @return {?}
*/
function () {
this.selectedSuggestion = this.data[this.currentFocus];
this.inputValue.nativeElement.value = this.selectedSuggestion.value;
this.data = [];
this.currentFocus = -1;
this.propagateChange(this.selectedSuggestion.value);
// this.writeValue(this.selectedSuggestion.value);
this.selected.emit(this.selectedSuggestion);
// this.selectedData.emit(this.selectedSuggestion.data);
// this.selectedString.emit(this.selectedSuggestion.value);
};
/**
* @param {?} id
* @return {?}
*/
NgxDadataComponent.prototype.setFocus = /**
* @param {?} id
* @return {?}
*/
function (id) {
/** @type {?} */
var activeEl = document.getElementById(id + 'item');
this._r.addClass(activeEl, 'active');
};
/**
* @param {?} id
* @return {?}
*/
NgxDadataComponent.prototype.removeFocus = /**
* @param {?} id
* @return {?}
*/
function (id) {
if (id !== -1) {
/** @type {?} */
var activeEl = document.getElementById(id + 'item');
this._r.removeClass(activeEl, 'active');
}
};
/**
* @param {?} value
* @return {?}
*/
NgxDadataComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== undefined) {
this.v = value;
}
// this.onSuggestionSelected(value);
};
/**
* Set the function to be called
* when the control receives a change event.
*
* @param fn a function
*/
/**
* Set the function to be called
* when the control receives a change event.
*
* @param {?} fn a function
* @return {?}
*/
NgxDadataComponent.prototype.registerOnChange = /**
* Set the function to be called
* when the control receives a change event.
*
* @param {?} fn a function
* @return {?}
*/
function (fn) {
// this.onSuggestionSelected = fn;
this.propagateChange = fn;
};
/**
* Set the function to be called
* when the control receives a touch event.
*
* @param fn a function
*/
/**
* Set the function to be called
* when the control receives a touch event.
*
* @param {?} fn a function
* @return {?}
*/
NgxDadataComponent.prototype.registerOnTouched = /**
* Set the function to be called
* when the control receives a touch event.
*
* @param {?} fn a function
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* Implements disabled state for this element
*
* @param isDisabled
*/
/**
* Implements disabled state for this element
*
* @param {?} isDisabled
* @return {?}
*/
NgxDadataComponent.prototype.setDisabledState = /**
* Implements disabled state for this element
*
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
alert('disabled!');
this.disabled = isDisabled;
};
NgxDadataComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-dadata',
template: "<div class=\"autocomplete\">\r\n <label for=\"address_input\"></label>\r\n <input [disabled]=\"disabled ? true : null\" type=\"text\" class=\"primary-input\" #inputValue (input)=\"getData(inputValue.value)\"\r\n [placeholder]=\"placeholder\" (keyup.ArrowDown)=\"onArrowDown()\" (keyup.ArrowUp)=\"onArrowUp()\"\r\n (keyup.Enter)=\"onEnter()\" spellcheck=\"false\" [(ngModel)]=\"value\" autocomplete=\"new-password\" />\r\n <div *ngIf=\"data.length\">\r\n <div class=\"autocomplete-items\">\r\n <div class=\"autocomplele-item\" *ngFor=\"let item of data;let i = index\" (click)=\"onClick($event, item)\" [id]=\"i+'item'\">\r\n {{item.value}}\r\n <ng-template [ngIf]=\"type==='party'\">\r\n <br/>\r\n <span>{{item.data?.inn}} {{item.data?.address?.value}}</span>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n",
providers: [NGX_DADATA_VALUE_ACCESSOR,],
styles: [".autocomplete{position:relative}.autocomplete-items{position:absolute;border:1px solid #d4d4d4;border-bottom:none;border-top:none;z-index:99;top:100%;left:0;right:0}.autocomplete-items .autocomplele-item{padding:5px 10px;cursor:pointer;background-color:#fff;border-bottom:1px solid #d4d4d4}.autocomplete-items .autocomplele-item:hover{background-color:#e9e9e9}.autocomplete-items .autocomplele-item.active{background-color:#1e90ff!important;color:#fff}.autocomplete-items .autocomplele-item span{color:#555;font-size:80%}"]
}] }
];
/** @nocollapse */
NgxDadataComponent.ctorParameters = function () { return [
{ type: NgxDadataService },
{ type: Renderer2 }
]; };
NgxDadataComponent.propDecorators = {
config: [{ type: Input }],
apiKey: [{ type: Input }],
disabled: [{ type: Input }],
type: [{ type: Input }],
limit: [{ type: Input }],
placeholder: [{ type: Input }],
selectedSuggestion: [{ type: Output }],
selected: [{ type: Output }],
inputValue: [{ type: ViewChild, args: ['inputValue' /*, { static: true }*/,] }],
onOutsideClick: [{ type: HostListener, args: ['document:click',] }]
};
return NgxDadataComponent;
}());
export { NgxDadataComponent };
if (false) {
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype.v;
/** @type {?} */
NgxDadataComponent.prototype.currentFocus;
/** @type {?} */
NgxDadataComponent.prototype.data;
/** @type {?} */
NgxDadataComponent.prototype.config;
/** @type {?} */
NgxDadataComponent.prototype.apiKey;
/** @type {?} */
NgxDadataComponent.prototype.disabled;
/** @type {?} */
NgxDadataComponent.prototype.type;
/** @type {?} */
NgxDadataComponent.prototype.limit;
/** @type {?} */
NgxDadataComponent.prototype.placeholder;
/** @type {?} */
NgxDadataComponent.prototype.selectedSuggestion;
/** @type {?} */
NgxDadataComponent.prototype.selected;
/** @type {?} */
NgxDadataComponent.prototype.inputValue;
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype.inputString$;
/** @type {?} */
NgxDadataComponent.prototype.onTouched;
/** @type {?} */
NgxDadataComponent.prototype.propagateChange;
/** @type {?} */
NgxDadataComponent.prototype.validateFn;
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype.dataService;
/**
* @type {?}
* @private
*/
NgxDadataComponent.prototype._r;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRhZGF0YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbW9ic29sdXRpb25zL25neC1kYWRhdGEvIiwic291cmNlcyI6WyJsaWIvbmd4LWRhZGF0YS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3hDLE9BQU8sRUFBZSxtQkFBbUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFBbUQsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFFN0YseUJBQXlCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVTs7O0lBQUMsY0FBTSxPQUFBLGtCQUFrQixFQUFsQixDQUFrQixFQUFDO0lBQ2pELEtBQUssRUFBRSxJQUFJO0NBQ1o7Ozs7Ozs7Ozs7QUFRRCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBSztJQUN6Qzs7OztJQUFPLFVBQUMsQ0FBYzs7WUFDZCxHQUFHLEdBQUc7WUFDVixVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNkLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1NBQ0Y7UUFFRCxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7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LHVDQUFxQjs7SUFDckIsNkNBQWdDOztJQUNoQyx3Q0FBMkI7Ozs7O0lBRWYseUNBQXFDOzs7OztJQUFFLGdDQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0RhZGF0YVR5cGUsIE5neERhZGF0YVNlcnZpY2V9IGZyb20gJy4vbmd4LWRhZGF0YS5zZXJ2aWNlJztcclxuaW1wb3J0IHtTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7ZGVib3VuY2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtEYWRhdGFSZXNwb25zZX0gZnJvbSAnLi9tb2RlbHMvZGFkYXRhLXJlc3BvbnNlJztcclxuaW1wb3J0IHtEYWRhdGFTdWdnZXN0aW9ufSBmcm9tICcuL21vZGVscy9zdWdnZXN0aW9uJztcclxuaW1wb3J0IHtEYWRhdGFDb25maWcsIERhZGF0YUNvbmZpZ0RlZmF1bHR9IGZyb20gJy4vZGFkYXRhLWNvbmZpZyc7XHJcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuY29uc3QgTkdYX0RBREFUQV9WQUxVRV9BQ0NFU1NPUiA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hEYWRhdGFDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG4vKmNvbnN0IE5HWF9EQURBVEFfVkFMSURBVE9SID0ge1xyXG4gIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmd4RGFkYXRhQ29tcG9uZW50KSxcclxuICBtdWx0aTogdHJ1ZSxcclxufTsqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhRGF0YVZhbGlkYXRvcih2YWx1ZSkge1xyXG4gIHJldHVybiAoYzogRm9ybUNvbnRyb2wpID0+IHtcclxuICAgIGNvbnN0IGVyciA9IHtcclxuICAgICAgcmFuZ2VFcnJvcjoge1xyXG4gICAgICAgIGdpdmVuOiBjLnZhbHVlLFxyXG4gICAgICAgIGV4cGVjdGVkOiB2YWx1ZSxcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gKGMudmFsdWUgIT09IHZhbHVlKSA/IGVyciA6IG51bGw7XHJcbiAgfTtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtZGFkYXRhJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmd4LWRhZGF0YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LWRhZGF0YS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW05HWF9EQURBVEFfVkFMVUVfQUNDRVNTT1IsIC8qTkdYX0RBREFUQV9WQUxJREFUT1IqL11cclxufSlcclxuZXhwb3J0IGNsYXNzIE5neERhZGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcyB7XHJcbiAgcHJpdmF0ZSB2OiBhbnkgPSAnJztcclxuICBjdXJyZW50Rm9jdXMgPSAtMTtcclxuXHJcbiAgZGF0YTogRGFkYXRhU3VnZ2VzdGlvbltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZzogRGFkYXRhQ29uZmlnID0gRGFkYXRhQ29uZmlnRGVmYXVsdDtcclxuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IG51bGw7XHJcbiAgQElucHV0KCkgdHlwZSA9IERhZGF0YVR5cGUuYWRkcmVzcztcclxuICBASW5wdXQoKSBsaW1pdCA9IERhZGF0YUNvbmZpZ0RlZmF1bHQubGltaXQ7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkU3VnZ2VzdGlvbjogRGFkYXRhU3VnZ2VzdGlvbjtcclxuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhZGF0YVN1Z2dlc3Rpb24+KCk7XHJcbiAgLy8gQE91dHB1dCgpIHNlbGVjdGVkRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8RGFEYXRhQWRkcmVzcyB8IERhRGF0YUZJTyB8IERhRGF0YUJhbmsgfCBEYURhdGFQYXJ0eSB8IERhRGF0YUVtYWlsPigpO1xyXG4gIC8vIEBPdXRwdXQoKSBzZWxlY3RlZFN0cmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG5cclxuICBAVmlld0NoaWxkKCdpbnB1dFZhbHVlJy8qLCB7IHN0YXRpYzogdHJ1ZSB9Ki8pIGlucHV0VmFsdWU6IEVsZW1lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgaW5wdXRTdHJpbmckID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG5cclxuICAvLyBvblN1Z2dlc3Rpb25TZWxlY3RlZCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7fTtcclxuICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcclxuICBwcm9wYWdhdGVDaGFuZ2U6IGFueSA9ICgpID0+IHt9O1xyXG4gIHZhbGlkYXRlRm46IGFueSA9ICgpID0+IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGFTZXJ2aWNlOiBOZ3hEYWRhdGFTZXJ2aWNlLCBwcml2YXRlIF9yOiBSZW5kZXJlcjIpIHtcclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudjtcclxuICB9XHJcblxyXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcclxuICAgIGlmICh2ICE9PSB0aGlzLnYpIHtcclxuICAgICAgdGhpcy52ID0gdjtcclxuICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2Uodik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8qdGhpcy52YWxpZGF0ZUZuID0gY3JlYXRlRGFEYXRhVmFsaWRhdG9yKHRoaXMuX3ZhbHVlKTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuX3ZhbHVlKTsqL1xyXG4gICAgdGhpcy50eXBlID0gdGhpcy5jb25maWcudHlwZTtcclxuICAgIHRoaXMuZGF0YVNlcnZpY2Uuc2V0QXBpS2V5KHRoaXMuYXBpS2V5ID8gdGhpcy5hcGlLZXkgOiB0aGlzLmNvbmZpZy5hcGlLZXkpO1xyXG4gICAgdGhpcy5pbnB1dFN0cmluZyQucGlwZShcclxuICAgICAgZGVib3VuY2UoKCkgPT4gdGltZXIodGhpcy5jb25maWcuZGVsYXkgPyB0aGlzLmNvbmZpZy5kZWxheSA6IDUwMCkpLFxyXG4gICAgKS5zdWJzY3JpYmUoeCA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YVNlcnZpY2UuZ2V0RGF0YSh4LCB0aGlzLnR5cGUsIHRoaXMubGltaXQpLnN1YnNjcmliZSgoeTogRGFkYXRhUmVzcG9uc2UpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGEgPSB5LnN1Z2dlc3Rpb25zO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKGNoYW5nZXMudmFsdWUpIHtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXREYXRhKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaW5wdXRTdHJpbmckLm5leHQodmFsdWUpO1xyXG4gICAgdGhpcy5jdXJyZW50Rm9jdXMgPSAtMTtcclxuICB9XHJcblxyXG4gIG9uQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogRGFkYXRhU3VnZ2VzdGlvbikge1xyXG4gICAgLy8gZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBpdGVtLnZhbHVlO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UoaXRlbS52YWx1ZSk7XHJcbiAgICB0aGlzLmlucHV0VmFsdWUubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24gPSBpdGVtO1xyXG4gICAgdGhpcy5kYXRhID0gW107XHJcbiAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IC0xO1xyXG5cclxuICAgIC8vIHRoaXMud3JpdGVWYWx1ZShpdGVtLnZhbHVlKTtcclxuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWREYXRhLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRTdHJpbmcuZW1pdChpdGVtLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICBvbk91dHNpZGVDbGljaygpIHtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgb25BcnJvd0Rvd24oKSB7XHJcbiAgICB0aGlzLnJlbW92ZUZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1cyA+PSB0aGlzLmRhdGEubGVuZ3RoIC0gMSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cysrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRGb2N1cyh0aGlzLmN1cnJlbnRGb2N1cyk7XHJcbiAgfVxyXG5cclxuICBvbkFycm93VXAoKSB7XHJcbiAgICB0aGlzLnJlbW92ZUZvY3VzKHRoaXMuY3VycmVudEZvY3VzKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGb2N1cyA9PT0gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGb2N1cyA9IHRoaXMuZGF0YS5sZW5ndGggLSAxO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50Rm9jdXMtLTtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0Rm9jdXModGhpcy5jdXJyZW50Rm9jdXMpO1xyXG4gIH1cclxuXHJcbiAgb25FbnRlcigpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gdGhpcy5kYXRhW3RoaXMuY3VycmVudEZvY3VzXTtcclxuICAgIHRoaXMuaW5wdXRWYWx1ZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWU7XHJcbiAgICB0aGlzLmRhdGEgPSBbXTtcclxuICAgIHRoaXMuY3VycmVudEZvY3VzID0gLTE7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnNlbGVjdGVkU3VnZ2VzdGlvbi52YWx1ZSk7XHJcbiAgICAvLyB0aGlzLndyaXRlVmFsdWUodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gICAgdGhpcy5zZWxlY3RlZC5lbWl0KHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uKTtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWREYXRhLmVtaXQodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24uZGF0YSk7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkU3RyaW5nLmVtaXQodGhpcy5zZWxlY3RlZFN1Z2dlc3Rpb24udmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc2V0Rm9jdXMoaWQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgYWN0aXZlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCArICdpdGVtJyk7XHJcbiAgICB0aGlzLl9yLmFkZENsYXNzKGFjdGl2ZUVsLCAnYWN0aXZlJyk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGb2N1cyhpZDogbnVtYmVyKSB7XHJcbiAgICBpZiAoaWQgIT09IC0xKSB7XHJcbiAgICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQgKyAnaXRlbScpO1xyXG4gICAgICB0aGlzLl9yLnJlbW92ZUNsYXNzKGFjdGl2ZUVsLCAnYWN0aXZlJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMudiA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3RlZCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZFxyXG4gICAqIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSBjaGFuZ2UgZXZlbnQuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gZm4gYSBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgLy8gdGhpcy5vblN1Z2dlc3Rpb25TZWxlY3RlZCA9IGZuO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkXHJcbiAgICogd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIHRvdWNoIGV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIGZuIGEgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wbGVtZW50cyBkaXNhYmxlZCBzdGF0ZSBmb3IgdGhpcyBlbGVtZW50XHJcbiAgICpcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZFxyXG4gICAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgYWxlcnQoJ2Rpc2FibGVkIScpO1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==