@asi-ngtools/lib
Version:
This project is a little components library, simple to use, which will help you to simplify your project.
281 lines (280 loc) • 22.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { DefaultControlValueAccessor } from './../common/default-control-value-accessor';
import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms';
import { Component, forwardRef, Input, ElementRef, ViewChild, Renderer2 } from '@angular/core';
import { debounceTime } from 'rxjs/operators';
import { Subject } from 'rxjs';
export class AsiInputNumberComponent extends DefaultControlValueAccessor {
/**
* @param {?} renderer
* @param {?} elementRef
*/
constructor(renderer, elementRef) {
super();
this.renderer = renderer;
this.elementRef = elementRef;
/**
* Label position
*/
this.labelPosition = 'top';
/**
* Increment value when click on + or -
*/
this.step = 1;
/**
* Allow you to disable the input
*/
this.disableInput = false;
/**
* Allow you to hide the action button
*/
this.hideAction = false;
/**
* Delay before value change
*/
this.delay = 0;
/**
* Number regex
*/
this.pattern = new RegExp('^-?[0-9]*[,\.]{0,1}[0-9]{0,2}$');
/**
* pattern used to managed typed value, if this pattern is true the 'value' will be the last valide one
*/
this.toleratePattern = new RegExp('^[0-9]*[,\.]{1}$');
/**
* use a non decimal pattern '^-?[0-9]*$'
*/
this.noDecimal = false;
this.inputControl = new FormControl();
this.outputDelayValue = new Subject();
}
/**
* @return {?}
*/
ngOnInit() {
if (this.noDecimal) {
this.pattern = new RegExp('^-?[0-9]*$');
}
this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition);
this.inputControl.valueChanges.subscribe((value) => {
if (value === '' || value == null) {
this.outputDelayValue.next(null);
this.oldValideValue = null;
return;
}
/** @type {?} */
const tolerateValue = !this.noDecimal && this.toleratePattern.test(value);
/** @type {?} */
const minusPossible = (this.min == null || this.min < 0) && value.length === 1 && value.indexOf('-') !== -1;
value = value.replace(',', '\.');
if (this.pattern.test(value)) {
if (!isNaN(Number(value))) {
// The value is a number
if (!(this.max != null && value > this.max)
&& !(this.min != null && value < this.min) && !tolerateValue) {
this.outputDelayValue.next(Number(value));
if (Number(value) !== 0) {
this.oldValideValue = value;
}
else {
this.oldValideValue = 0;
}
return;
}
}
else if (minusPossible) {
this.outputDelayValue.next(null);
this.oldValideValue = value;
return;
}
}
if (!tolerateValue && !minusPossible) {
this.inputControl.setValue(this.oldValideValue, { emitEvent: false });
}
else {
this.oldValideValue = value;
this.inputControl.setValue(value, { emitEvent: false });
}
});
this.outputDelayValue.pipe(debounceTime(this.delay)).subscribe((value) => {
this.value = value;
});
if (this.stepIncrease == null) {
this.stepIncrease = this.step;
}
if (this.stepDecrease == null) {
this.stepDecrease = this.step;
}
}
/**
* @return {?}
*/
increase() {
if (this.inputControl.value == null || this.inputControl.value === '') {
this.inputControl.setValue(this.stepIncrease + '');
}
else {
/** @type {?} */
const number = Number(this.inputControl.value);
this.inputControl.setValue(number + this.stepIncrease + '');
}
}
/**
* @return {?}
*/
decrease() {
if (this.inputControl.value == null || this.inputControl.value === '') {
this.inputControl.setValue(-this.stepDecrease + '');
}
else {
/** @type {?} */
const number = Number(this.inputControl.value);
this.inputControl.setValue(number - this.stepDecrease + '');
}
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value != null && this.pattern.test(value)) {
this.inputControl.setValue(value, { emitEvent: false });
this._value = value;
}
else {
this.inputControl.setValue(null, { emitEvent: false });
this._value = null;
}
this.oldValideValue = this._value;
}
}
AsiInputNumberComponent.decorators = [
{ type: Component, args: [{
selector: 'asi-input-number',
host: { 'class': 'asi-component asi-input-number' },
template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\n<div class=\"number-select\">\n <asi-button *ngIf=\"!hideAction\" class=\"minus\" size=\"mini\" [disabled]=\"disabled\" type=\"button\" (click)=\"decrease()\">-</asi-button>\n <input #input [attr.disabled]=\"disabled || disableInput ? '' : null\"\n [attr.id]=\"id\" [attr.name]=\"name\" type=\"text\" class=\"asi-focus-error\" [formControl]=\"inputControl\" />\n <asi-button *ngIf=\"!hideAction\" class=\"plus\" size=\"mini\" [disabled]=\"disabled\" type=\"button\" (click)=\"increase()\">+</asi-button>\n</div>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => AsiInputNumberComponent),
multi: true
}
]
}] }
];
/** @nocollapse */
AsiInputNumberComponent.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef }
];
AsiInputNumberComponent.propDecorators = {
id: [{ type: Input }],
name: [{ type: Input }],
label: [{ type: Input }],
labelPosition: [{ type: Input }],
step: [{ type: Input }],
stepIncrease: [{ type: Input }],
stepDecrease: [{ type: Input }],
disableInput: [{ type: Input }],
hideAction: [{ type: Input }],
min: [{ type: Input }],
max: [{ type: Input }],
delay: [{ type: Input }],
pattern: [{ type: Input }],
toleratePattern: [{ type: Input }],
noDecimal: [{ type: Input }],
inputElm: [{ type: ViewChild, args: ['input',] }]
};
if (false) {
/**
* html id
* @type {?}
*/
AsiInputNumberComponent.prototype.id;
/**
* html name
* @type {?}
*/
AsiInputNumberComponent.prototype.name;
/**
* Label to display (is translated)
* @type {?}
*/
AsiInputNumberComponent.prototype.label;
/**
* Label position
* @type {?}
*/
AsiInputNumberComponent.prototype.labelPosition;
/**
* Increment value when click on + or -
* @type {?}
*/
AsiInputNumberComponent.prototype.step;
/**
* Increment value when click on +
* @type {?}
*/
AsiInputNumberComponent.prototype.stepIncrease;
/**
* Decrement value when click on -
* @type {?}
*/
AsiInputNumberComponent.prototype.stepDecrease;
/**
* Allow you to disable the input
* @type {?}
*/
AsiInputNumberComponent.prototype.disableInput;
/**
* Allow you to hide the action button
* @type {?}
*/
AsiInputNumberComponent.prototype.hideAction;
/**
* Min value
* @type {?}
*/
AsiInputNumberComponent.prototype.min;
/**
* Max value
* @type {?}
*/
AsiInputNumberComponent.prototype.max;
/**
* Delay before value change
* @type {?}
*/
AsiInputNumberComponent.prototype.delay;
/**
* Number regex
* @type {?}
*/
AsiInputNumberComponent.prototype.pattern;
/**
* pattern used to managed typed value, if this pattern is true the 'value' will be the last valide one
* @type {?}
*/
AsiInputNumberComponent.prototype.toleratePattern;
/**
* use a non decimal pattern '^-?[0-9]*$'
* @type {?}
*/
AsiInputNumberComponent.prototype.noDecimal;
/** @type {?} */
AsiInputNumberComponent.prototype.inputElm;
/** @type {?} */
AsiInputNumberComponent.prototype.inputControl;
/** @type {?} */
AsiInputNumberComponent.prototype.oldValideValue;
/** @type {?} */
AsiInputNumberComponent.prototype.outputDelayValue;
/** @type {?} */
AsiInputNumberComponent.prototype.renderer;
/** @type {?} */
AsiInputNumberComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWlucHV0LW51bWJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWlucHV0LW51bWJlci9hc2ktaW5wdXQtbnVtYmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQVUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWUvQixNQUFNLDhCQUErQixTQUFRLDJCQUEyQjs7Ozs7SUFvRHRFLFlBQW9CLFFBQW1CLEVBQzdCO1FBQ1IsS0FBSyxFQUFFLENBQUM7UUFGVSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQzdCLGVBQVUsR0FBVixVQUFVOzs7OzZCQTNDMkUsS0FBSzs7OztvQkFHcEYsQ0FBQzs7Ozs0QkFTTyxLQUFLOzs7OzBCQUdQLEtBQUs7Ozs7cUJBU1YsQ0FBQzs7Ozt1QkFHQyxJQUFJLE1BQU0sQ0FBQyxnQ0FBZ0MsQ0FBQzs7OzsrQkFHcEMsSUFBSSxNQUFNLENBQUMsa0JBQWtCLENBQUM7Ozs7eUJBR3BDLEtBQUs7NEJBSVgsSUFBSSxXQUFXLEVBQUU7Z0NBR2IsSUFBSSxPQUFPLEVBQVU7S0FLdkM7Ozs7SUFFRCxRQUFRO1FBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE1BQU0s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RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUNwQixDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO1NBQzlCO1FBRUQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUMvQjtLQUNGOzs7O0lBRUQsUUFBUTtRQUNOLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDcEQ7UUFBQyxJQUFJLENBQUMsQ0FBQzs7WUFDTixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUM3RDtLQUNGOzs7O0lBRUQsUUFBUTtRQUNOLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNyRDtRQUFDLElBQUksQ0FBQyxDQUFDOztZQUNOLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQzdEO0tBQ0Y7Ozs7O0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDckI7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0tBQ25DOzs7WUE3SkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRTtnQkFDbkQscW1CQUE4QztnQkFDOUMsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7d0JBQ3RELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7WUFoQnFFLFNBQVM7WUFBeEMsVUFBVTs7O2lCQW9COUMsS0FBSzttQkFFTCxLQUFLO29CQUdMLEtBQUs7NEJBRUwsS0FBSzttQkFHTCxLQUFLOzJCQUdMLEtBQUs7MkJBR0wsS0FBSzsyQkFHTCxLQUFLO3lCQUdMLEtBQUs7a0JBR0wsS0FBSztrQkFHTCxLQUFLO29CQUdMLEtBQUs7c0JBR0wsS0FBSzs4QkFHTCxLQUFLO3dCQUdMLEtBQUs7dUJBRUwsU0FBUyxTQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuLy4uL2NvbW1vbi9kZWZhdWx0LWNvbnRyb2wtdmFsdWUtYWNjZXNzb3InO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBmb3J3YXJkUmVmLCBJbnB1dCwgRWxlbWVudFJlZiwgT25Jbml0LCBWaWV3Q2hpbGQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FzaS1pbnB1dC1udW1iZXInLFxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1pbnB1dC1udW1iZXInIH0sXG4gIHRlbXBsYXRlVXJsOiAnYXNpLWlucHV0LW51bWJlci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpSW5wdXROdW1iZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXNpSW5wdXROdW1iZXJDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIC8qKiBodG1sIGlkICovXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIC8qKiBodG1sIG5hbWUgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcblxuICAvKiogSW5jcmVtZW50IHZhbHVlIHdoZW4gY2xpY2sgb24gKyBvciAtICovXG4gIEBJbnB1dCgpIHN0ZXAgPSAxO1xuXG4gIC8qKiBJbmNyZW1lbnQgdmFsdWUgd2hlbiBjbGljayBvbiArICovXG4gIEBJbnB1dCgpIHN0ZXBJbmNyZWFzZTogbnVtYmVyO1xuXG4gIC8qKiBEZWNyZW1lbnQgdmFsdWUgd2hlbiBjbGljayBvbiAtICovXG4gIEBJbnB1dCgpIHN0ZXBEZWNyZWFzZTogbnVtYmVyO1xuXG4gIC8qKiBBbGxvdyB5b3UgdG8gZGlzYWJsZSB0aGUgaW5wdXQgKi9cbiAgQElucHV0KCkgZGlzYWJsZUlucHV0ID0gZmFsc2U7XG5cbiAgLyoqIEFsbG93IHlvdSB0byBoaWRlIHRoZSBhY3Rpb24gYnV0dG9uICovXG4gIEBJbnB1dCgpIGhpZGVBY3Rpb24gPSBmYWxzZTtcblxuICAvKiogTWluIHZhbHVlICovXG4gIEBJbnB1dCgpIG1pbjogbnVtYmVyO1xuXG4gIC8qKiBNYXggdmFsdWUgKi9cbiAgQElucHV0KCkgbWF4OiBudW1iZXI7XG5cbiAgLyoqIERlbGF5IGJlZm9yZSB2YWx1ZSBjaGFuZ2UgKi9cbiAgQElucHV0KCkgZGVsYXkgPSAwO1xuXG4gIC8qKiBOdW1iZXIgcmVnZXggKi9cbiAgQElucHV0KCkgcGF0dGVybiA9IG5ldyBSZWdFeHAoJ14tP1swLTldKlssXFwuXXswLDF9WzAtOV17MCwyfSQnKTtcblxuICAvKiogcGF0dGVybiB1c2VkIHRvIG1hbmFnZWQgdHlwZWQgdmFsdWUsIGlmIHRoaXMgcGF0dGVybiBpcyB0cnVlIHRoZSAndmFsdWUnIHdpbGwgYmUgdGhlIGxhc3QgdmFsaWRlIG9uZSAqL1xuICBASW5wdXQoKSB0b2xlcmF0ZVBhdHRlcm4gPSBuZXcgUmVnRXhwKCdeWzAtOV0qWyxcXC5dezF9JCcpO1xuXG4gIC8qKiB1c2UgYSBub24gZGVjaW1hbCBwYXR0ZXJuICdeLT9bMC05XSokJyAqL1xuICBASW5wdXQoKSBub0RlY2ltYWwgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcpIGlucHV0RWxtOiBFbGVtZW50UmVmO1xuXG4gIGlucHV0Q29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBwcml2YXRlIG9sZFZhbGlkZVZhbHVlOiBhbnk7XG5cbiAgb3V0cHV0RGVsYXlWYWx1ZSA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLm5vRGVjaW1hbCkge1xuICAgICAgdGhpcy5wYXR0ZXJuID0gbmV3IFJlZ0V4cCgnXi0/WzAtOV0qJCcpO1xuICAgIH1cblxuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdsYWJlbC0nICsgdGhpcy5sYWJlbFBvc2l0aW9uKTtcblxuICAgIHRoaXMuaW5wdXRDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vdXRwdXREZWxheVZhbHVlLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMub2xkVmFsaWRlVmFsdWUgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvbGVyYXRlVmFsdWUgPSAhdGhpcy5ub0RlY2ltYWwgJiYgdGhpcy50b2xlcmF0ZVBhdHRlcm4udGVzdCh2YWx1ZSk7XG4gICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgYSBtaW51cyBhbmQgaXMgYXV0aG9yaXplZFxuICAgICAgY29uc3QgbWludXNQb3NzaWJsZSA9ICh0aGlzLm1pbiA9PSBudWxsIHx8IHRoaXMubWluIDwgMCkgJiYgdmFsdWUubGVuZ3RoID09PSAxICYmIHZhbHVlLmluZGV4T2YoJy0nKSAhPT0gLTE7XG5cbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnLCcsICdcXC4nKTtcblxuICAgICAgaWYgKHRoaXMucGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICBpZiAoIWlzTmFOKE51bWJlcih2YWx1ZSkpKSB7XG4gICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIGEgbnVtYmVyXG4gICAgICAgICAgaWYgKCEodGhpcy5tYXggIT0gbnVsbCAmJiB2YWx1ZSA+IHRoaXMubWF4KVxuICAgICAgICAgICAgJiYgISh0aGlzLm1pbiAhPSBudWxsICYmIHZhbHVlIDwgdGhpcy5taW4pICYmICF0b2xlcmF0ZVZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dERlbGF5VmFsdWUubmV4dChOdW1iZXIodmFsdWUpKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIodmFsdWUpICE9PSAwKSB7XG4gICAgICAgICAgICAgIHRoaXMub2xkVmFsaWRlVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMub2xkVmFsaWRlVmFsdWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChtaW51c1Bvc3NpYmxlKSB7XG4gICAgICAgICAgdGhpcy5vdXRwdXREZWxheVZhbHVlLm5leHQobnVsbCk7XG4gICAgICAgICAgdGhpcy5vbGRWYWxpZGVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRvbGVyYXRlVmFsdWUgJiYgIW1pbnVzUG9zc2libGUpIHtcbiAgICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUodGhpcy5vbGRWYWxpZGVWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbGRWYWxpZGVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5vdXRwdXREZWxheVZhbHVlLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuZGVsYXkpKS5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zdGVwSW5jcmVhc2UgPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGVwSW5jcmVhc2UgPSB0aGlzLnN0ZXBcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGVwRGVjcmVhc2UgPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdGVwRGVjcmVhc2UgPSB0aGlzLnN0ZXA7XG4gICAgfVxuICB9XG5cbiAgaW5jcmVhc2UoKSB7XG4gICAgaWYgKHRoaXMuaW5wdXRDb250cm9sLnZhbHVlID09IG51bGwgfHwgdGhpcy5pbnB1dENvbnRyb2wudmFsdWUgPT09ICcnKSB7XG4gICAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSh0aGlzLnN0ZXBJbmNyZWFzZSArICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyKHRoaXMuaW5wdXRDb250cm9sLnZhbHVlKTtcbiAgICAgIHRoaXMuaW5wdXRDb250cm9sLnNldFZhbHVlKG51bWJlciArIHRoaXMuc3RlcEluY3JlYXNlICsgJycpO1xuICAgIH1cbiAgfVxuXG4gIGRlY3JlYXNlKCkge1xuICAgIGlmICh0aGlzLmlucHV0Q29udHJvbC52YWx1ZSA9PSBudWxsIHx8IHRoaXMuaW5wdXRDb250cm9sLnZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUoLXRoaXMuc3RlcERlY3JlYXNlICsgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBudW1iZXIgPSBOdW1iZXIodGhpcy5pbnB1dENvbnRyb2wudmFsdWUpO1xuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUobnVtYmVyIC0gdGhpcy5zdGVwRGVjcmVhc2UgKyAnJyk7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdGhpcy5wYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB0aGlzLmlucHV0Q29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbnB1dENvbnRyb2wuc2V0VmFsdWUobnVsbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLm9sZFZhbGlkZVZhbHVlID0gdGhpcy5fdmFsdWU7XG4gIH1cbn1cbiJdfQ==