chi-app-lib
Version:
This is a custom component (input dropdown grid textarea map captcha) published to npm.
463 lines • 33.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, forwardRef, Output, EventEmitter, ElementRef, ViewChild, ChangeDetectorRef } from '@angular/core';
import { FormControl, Validators, NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
var noop = (/**
* @return {?}
*/
function () {
});
var ɵ0 = noop;
/**
* Error when invalid control is dirty or touched
*/
var /**
* Error when invalid control is dirty or touched
*/
MyErrorStateMatcher = /** @class */ (function () {
function MyErrorStateMatcher() {
}
/**
* @param {?} control
* @param {?} form
* @return {?}
*/
MyErrorStateMatcher.prototype.isErrorState = /**
* @param {?} control
* @param {?} form
* @return {?}
*/
function (control, form) {
return !!(control && control.invalid && (control.dirty || control.touched));
};
return MyErrorStateMatcher;
}());
/**
* Error when invalid control is dirty or touched
*/
export { MyErrorStateMatcher };
/** @type {?} */
export var CHI_INPUT_COMPONENT_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return ChiInputComponent; })),
multi: true
};
var ChiInputComponent = /** @class */ (function () {
function ChiInputComponent(cdRef) {
this.cdRef = cdRef;
this.type = 'text';
this.direction = 'rtl';
this.floatLabel = 'auto'; // never
// never
this.pattern = '';
this.petternMessage = 'رقم غیر صحیح!';
this.showValidatorMessage = true;
this.showSuffix = false;
this.suffixIcon = 'close';
this.suffixClicked = new EventEmitter();
this.isValid = new EventEmitter();
this.matcher = new MyErrorStateMatcher();
this.id = 'chi-input' + this.idGenerator();
this.element = new FormControl('');
// 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;
this.faNumberToEn = (/**
* @param {?} value
* @return {?}
*/
function (value) {
if (!value) {
return value;
}
/** @type {?} */
var d = '';
/** @type {?} */
var a = '۰۱۲۳۴۵۶۷۸۹';
/** @type {?} */
var b = '0123456789';
/** @type {?} */
var c = value.toString();
for (var i = 0, len = c.length; i < len; i++) {
d += b[a.indexOf(c[i])] || c[i];
}
return d;
});
this.toPersianChar = (/**
* @param {?} value
* @return {?}
*/
function (value) {
if (!value) {
return value;
}
/** @type {?} */
var arabicChars = ['ي', 'ك', 'ى'];
/** @type {?} */
var persianChars = ['ی', 'ک', 'ی'];
for (var i = 0, charsLen = arabicChars.length; i < charsLen; i++) {
value = value.replace(new RegExp(arabicChars[i], 'g'), persianChars[i]);
}
return value;
});
}
Object.defineProperty(ChiInputComponent.prototype, "value", {
//
// get accessor
get:
//
// get accessor
/**
* @return {?}
*/
function () {
return this.toPersianChar(this.faNumberToEn(this.innerValue));
},
// set accessor including call the onchange callback
set:
// set accessor including call the onchange callback
/**
* @param {?} v
* @return {?}
*/
function (v) {
var _this = this;
if (v !== this.innerValue) {
this.innerValue = v;
this.onChangeCallback(v);
setTimeout((/**
* @param {?} _
* @return {?}
*/
function (_) {
_this.isValid.emit(_this.element.valid);
}), 100);
}
},
enumerable: true,
configurable: true
});
// Set touched on blur
// Set touched on blur
/**
* @param {?} validate
* @return {?}
*/
ChiInputComponent.prototype.onBlur =
// Set touched on blur
/**
* @param {?} validate
* @return {?}
*/
function (validate) {
this.onTouchedCallback();
this.isValid.emit(this.element.valid);
};
// From ControlValueAccessor interface
// From ControlValueAccessor interface
/**
* @param {?} value
* @return {?}
*/
ChiInputComponent.prototype.writeValue =
// From ControlValueAccessor interface
/**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
if (value !== this.innerValue) {
this.innerValue = value;
setTimeout((/**
* @param {?} _
* @return {?}
*/
function (_) {
_this.isValid.emit(_this.element.valid);
}), 100);
}
};
// From ControlValueAccessor interface
// From ControlValueAccessor interface
/**
* @param {?} fn
* @return {?}
*/
ChiInputComponent.prototype.registerOnChange =
// From ControlValueAccessor interface
/**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
};
// From ControlValueAccessor interface
// From ControlValueAccessor interface
/**
* @param {?} fn
* @return {?}
*/
ChiInputComponent.prototype.registerOnTouched =
// From ControlValueAccessor interface
/**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCallback = fn;
};
/**
* @param {?} event
* @param {?} validate
* @return {?}
*/
ChiInputComponent.prototype.changedInput = /**
* @param {?} event
* @param {?} validate
* @return {?}
*/
function (event, validate) {
var _this = this;
setTimeout((/**
* @param {?} _
* @return {?}
*/
function (_) {
_this.isValid.emit(_this.element.valid);
}), 100);
};
/**
* @param {?} validate
* @return {?}
*/
ChiInputComponent.prototype.onFocused = /**
* @param {?} validate
* @return {?}
*/
function (validate) {
this.isValid.emit(this.element.valid);
};
/**
* @return {?}
*/
ChiInputComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.required && this.minLength && this.maxLength && this.pattern) {
this.element = new FormControl('', [
Validators.required,
Validators.pattern(this.pattern),
Validators.minLength(this.minLength),
Validators.maxLength(this.maxLength)
]);
}
else if (this.required && !this.minLength && !this.maxLength && !this.pattern) {
this.element = new FormControl('', [Validators.required]);
}
else if (!this.required && !this.minLength && !this.maxLength && this.pattern) {
this.element = new FormControl('', [Validators.maxLength(this.maxLength)]);
}
else if (!this.required && this.minLength && !this.maxLength && !this.pattern) {
this.element = new FormControl('', [Validators.minLength(this.minLength)]);
}
else if (!this.required && !this.minLength && this.maxLength && !this.pattern) {
this.element = new FormControl('', [Validators.maxLength(this.maxLength)]);
}
else if (!this.required && this.minLength && this.maxLength && !this.pattern) {
this.element = new FormControl('', [Validators.maxLength(this.maxLength), Validators.minLength(this.minLength)]);
}
};
/**
* @param {?} changes
* @return {?}
*/
ChiInputComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
/** @type {?} */
var name = changes.isDirty;
if ((name || {})['currentValue']) {
this.element.markAsDirty({ onlySelf: true });
}
};
/**
* @return {?}
*/
ChiInputComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.focuse) {
this.inputEl.nativeElement.focus();
this.cdRef.detectChanges();
}
};
/**
* @return {?}
*/
ChiInputComponent.prototype.getErrorMessage = /**
* @return {?}
*/
function () {
return this.element.hasError('required') ? ' لا يمكن أن يكون هذا الحقل فارغًا!' :
this.element.hasError('pattern') ? this.petternMessage :
this.element.hasError('minlength') ? ' حداقل ' + this.minLength + ' کاراکتر وارد نمایید!' :
this.element.hasError('maxlength') ? ' حداکثر ' + this.maxLength + ' کاراکتر وارد نمایید!' :
'';
};
/**
* @param {?} val
* @return {?}
*/
ChiInputComponent.prototype.suffixClick = /**
* @param {?} val
* @return {?}
*/
function (val) {
// if (this.element.invalid && this.suffixIcon !== 'close') {
// return;
// }
if (this.suffixIcon === 'close') {
this.value = '';
}
this.suffixClicked.emit({ value: val, action: this.suffixIcon });
};
/**
* @return {?}
*/
ChiInputComponent.prototype.idGenerator = /**
* @return {?}
*/
function () {
/** @type {?} */
var number = Math.random();
number.toString(36);
return number.toString(36).substr(2, 9);
};
ChiInputComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-chi-input',
template: "<div class=\"element-container\" [ngClass]=\"className\" dir=\"{{direction}}\">\n <mat-form-field [hideRequiredMarker]=\"true\" floatLabel=\"{{floatLabel}}\">\n <input matInput\n id=\"{{id}}\"\n #input\n placeholder=\"{{placeHolder}}\"\n [formControl]=\"element\"\n required=\"{{required}}\"\n type=\"{{type}}\"\n [readonly]=\"readonly\"\n [(ngModel)]=\"value\"\n [minlength]=\"minLength\"\n [maxlength]=\"maxLength\"\n pattern=\"{{pattern}}\"\n (ngModelChange)=\"changedInput($event,element.valid)\"\n (focus)=\"onFocused(element.valid)\"\n (blur)=\"onBlur(element.valid)\"\n [errorStateMatcher]=\"matcher\">\n <button mat-button *ngIf=\"showSuffix\" matSuffix mat-icon-button aria-label=\"Clear\"\n [disabled]=\"!element.value\"\n (click)=\"suffixClick(value)\">\n <mat-icon>{{suffixIcon}}</mat-icon>\n </button>\n <mat-hint align=\"start\" *ngIf=\"hintText\"><strong>{{hintText}}</strong></mat-hint>\n <mat-error *ngIf=\"element.invalid&&showValidatorMessage\">{{getErrorMessage()}}</mat-error>\n </mat-form-field>\n</div>\n",
providers: [CHI_INPUT_COMPONENT_CONTROL_VALUE_ACCESSOR],
styles: [".element-container{display:flex;flex-direction:column}.element-container>*{width:100%}"]
}] }
];
/** @nocollapse */
ChiInputComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef }
]; };
ChiInputComponent.propDecorators = {
type: [{ type: Input }],
direction: [{ type: Input }],
floatLabel: [{ type: Input }],
pattern: [{ type: Input }],
petternMessage: [{ type: Input }],
className: [{ type: Input }],
readonly: [{ type: Input }],
required: [{ type: Input }],
placeHolder: [{ type: Input }],
hintText: [{ type: Input }],
minLength: [{ type: Input }],
maxLength: [{ type: Input }],
showValidatorMessage: [{ type: Input }],
showSuffix: [{ type: Input }],
suffixIcon: [{ type: Input }],
isDirty: [{ type: Input }],
focuse: [{ type: Input }],
suffixClicked: [{ type: Output }],
isValid: [{ type: Output }],
inputEl: [{ type: ViewChild, args: ['input', { static: false },] }]
};
return ChiInputComponent;
}());
export { ChiInputComponent };
if (false) {
/** @type {?} */
ChiInputComponent.prototype.type;
/** @type {?} */
ChiInputComponent.prototype.direction;
/** @type {?} */
ChiInputComponent.prototype.floatLabel;
/** @type {?} */
ChiInputComponent.prototype.pattern;
/** @type {?} */
ChiInputComponent.prototype.petternMessage;
/** @type {?} */
ChiInputComponent.prototype.className;
/** @type {?} */
ChiInputComponent.prototype.readonly;
/** @type {?} */
ChiInputComponent.prototype.required;
/** @type {?} */
ChiInputComponent.prototype.placeHolder;
/** @type {?} */
ChiInputComponent.prototype.hintText;
/** @type {?} */
ChiInputComponent.prototype.minLength;
/** @type {?} */
ChiInputComponent.prototype.maxLength;
/** @type {?} */
ChiInputComponent.prototype.showValidatorMessage;
/** @type {?} */
ChiInputComponent.prototype.showSuffix;
/** @type {?} */
ChiInputComponent.prototype.suffixIcon;
/** @type {?} */
ChiInputComponent.prototype.isDirty;
/** @type {?} */
ChiInputComponent.prototype.focuse;
/** @type {?} */
ChiInputComponent.prototype.suffixClicked;
/** @type {?} */
ChiInputComponent.prototype.isValid;
/** @type {?} */
ChiInputComponent.prototype.name;
/** @type {?} */
ChiInputComponent.prototype.matcher;
/** @type {?} */
ChiInputComponent.prototype.id;
/** @type {?} */
ChiInputComponent.prototype.element;
/** @type {?} */
ChiInputComponent.prototype.inputEl;
/**
* @type {?}
* @private
*/
ChiInputComponent.prototype.innerValue;
/**
* @type {?}
* @private
*/
ChiInputComponent.prototype.onTouchedCallback;
/**
* @type {?}
* @private
*/
ChiInputComponent.prototype.onChangeCallback;
/** @type {?} */
ChiInputComponent.prototype.faNumberToEn;
/** @type {?} */
ChiInputComponent.prototype.toPersianChar;
/**
* @type {?}
* @private
*/
ChiInputComponent.prototype.cdRef;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NoaS1hcHAtbGliLyIsInNvdXJjZXMiOlsibGliL2NoaS1pbnB1dC9jaGktaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFVLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFDaEMsVUFBVSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFDbkUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFdBQVcsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBRTNDLE1BQU0sZ0JBQWdCLENBQUM7O0lBR2xCLElBQUk7OztBQUFHO0FBQ2IsQ0FBQyxDQUFBOzs7OztBQUdEOzs7O0lBQUE7SUFJQSxDQUFDOzs7Ozs7SUFIQywwQ0FBWTs7Ozs7SUFBWixVQUFhLE9BQTJCLEVBQUUsSUFBd0M7UUFDaEYsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBRSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxBQUpELElBSUM7Ozs7OztBQUVELE1BQU0sS0FBTywwQ0FBMEMsR0FBUTtJQUM3RCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxjQUFNLE9BQUEsaUJBQWlCLEVBQWpCLENBQWlCLEVBQUM7SUFDaEQsS0FBSyxFQUFFLElBQUk7Q0FDWjtBQUVEO0lBNEZFLDJCQUFvQixLQUF3QjtRQUF4QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQXBGbkMsU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUNkLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLFFBQVE7O1FBQzdCLFlBQU8sR0FBRyxFQUFF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a0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBmb3J3YXJkUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgU2ltcGxlQ2hhbmdlcywgU2ltcGxlQ2hhbmdlLFxuICBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycywgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gIE5nRm9ybVxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0Vycm9yU3RhdGVNYXRjaGVyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7XG59O1xuXG4vKiogRXJyb3Igd2hlbiBpbnZhbGlkIGNvbnRyb2wgaXMgZGlydHkgb3IgdG91Y2hlZCovXG5leHBvcnQgY2xhc3MgTXlFcnJvclN0YXRlTWF0Y2hlciBpbXBsZW1lbnRzIEVycm9yU3RhdGVNYXRjaGVyIHtcbiAgaXNFcnJvclN0YXRlKGNvbnRyb2w6IEZvcm1Db250cm9sIHwgbnVsbCwgZm9ybTogRm9ybUdyb3VwRGlyZWN0aXZlIHwgTmdGb3JtIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIShjb250cm9sICYmIGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCBjb250cm9sLnRvdWNoZWQgKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IENISV9JTlBVVF9DT01QT05FTlRfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2hpSW5wdXRDb21wb25lbnQpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNoaS1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGktaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGktaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbQ0hJX0lOUFVUX0NPTVBPTkVOVF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBDaGlJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KCkgdHlwZSA9ICd0ZXh0JztcbiAgQElucHV0KCkgZGlyZWN0aW9uID0gJ3J0bCc7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWwgPSAnYXV0byc7IC8vIG5ldmVyXG4gIEBJbnB1dCgpIHBhdHRlcm4gPSAnJztcbiAgQElucHV0KCkgcGV0dGVybk1lc3NhZ2UgPSAn2LHZgtmFINi624zYsSDYtdit24zYrSEnO1xuICBASW5wdXQoKSBjbGFzc05hbWU7XG4gIEBJbnB1dCgpIHJlYWRvbmx5O1xuICBASW5wdXQoKSByZXF1aXJlZDtcbiAgQElucHV0KCkgcGxhY2VIb2xkZXI7XG4gIEBJbnB1dCgpIGhpbnRUZXh0O1xuICBASW5wdXQoKSBtaW5MZW5ndGg7XG4gIEBJbnB1dCgpIG1heExlbmd0aDtcbiAgQElucHV0KCkgc2hvd1ZhbGlkYXRvck1lc3NhZ2UgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93U3VmZml4ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1ZmZpeEljb24gPSAnY2xvc2UnO1xuICBASW5wdXQoKSBpc0RpcnR5O1xuICBASW5wdXQoKSBmb2N1c2U7XG4gIEBPdXRwdXQoKSBzdWZmaXhDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBpc1ZhbGlkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBuYW1lO1xuICBtYXRjaGVyID0gbmV3IE15RXJyb3JTdGF0ZU1hdGNoZXIoKTtcbiAgaWQgPSAnY2hpLWlucHV0JyArIHRoaXMuaWRHZW5lcmF0b3IoKTtcbiAgZWxlbWVudCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGlucHV0RWw6IEVsZW1lbnRSZWY7XG4gIC8vIFRoZSBpbnRlcm5hbCBkYXRhIG1vZGVsXG4gIHByaXZhdGUgaW5uZXJWYWx1ZTogYW55ID0gJyc7XG5cbiAgLy8gUGxhY2Vob2xkZXJzIGZvciB0aGUgY2FsbGJhY2tzIHdoaWNoIGFyZSBsYXRlciBwcm92aWRlZFxuICAvLyBieSB0aGUgQ29udHJvbCBWYWx1ZSBBY2Nlc3NvclxuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgLy9cbiAgLy8gZ2V0IGFjY2Vzc29yXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLnRvUGVyc2lhbkNoYXIodGhpcy5mYU51bWJlclRvRW4odGhpcy5pbm5lclZhbHVlKSk7XG4gIH1cblxuICAvLyBzZXQgYWNjZXNzb3IgaW5jbHVkaW5nIGNhbGwgdGhlIG9uY2hhbmdlIGNhbGxiYWNrXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5pbm5lclZhbHVlKSB7XG4gICAgICB0aGlzLmlubmVyVmFsdWUgPSB2O1xuICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgICAgc2V0VGltZW91dChfID0+IHtcbiAgICAgICAgdGhpcy5pc1ZhbGlkLmVtaXQodGhpcy5lbGVtZW50LnZhbGlkKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IHRvdWNoZWQgb24gYmx1clxuICBvbkJsdXIodmFsaWRhdGUpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5pc1ZhbGlkLmVtaXQodGhpcy5lbGVtZW50LnZhbGlkKTtcbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5pbm5lclZhbHVlKSB7XG4gICAgICB0aGlzLmlubmVyVmFsdWUgPSB2YWx1ZTtcbiAgICAgIHNldFRpbWVvdXQoXyA9PiB7XG4gICAgICAgIHRoaXMuaXNWYWxpZC5lbWl0KHRoaXMuZWxlbWVudC52YWxpZCk7XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgLy8gRnJvbSBDb250cm9sVmFsdWVBY2Nlc3NvciBpbnRlcmZhY2VcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIGNoYW5nZWRJbnB1dChldmVudCwgdmFsaWRhdGUpIHtcbiAgICBzZXRUaW1lb3V0KF8gPT4ge1xuICAgICAgdGhpcy5pc1ZhbGlkLmVtaXQodGhpcy5lbGVtZW50LnZhbGlkKTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgb25Gb2N1c2VkKHZhbGlkYXRlKSB7XG4gICAgdGhpcy5pc1ZhbGlkLmVtaXQodGhpcy5lbGVtZW50LnZhbGlkKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIGlmICh0aGlzLnJlcXVpcmVkICYmIHRoaXMubWluTGVuZ3RoICYmIHRoaXMubWF4TGVuZ3RoICYmIHRoaXMucGF0dGVybikge1xuICAgICAgdGhpcy5lbGVtZW50ID0gbmV3IEZvcm1Db250cm9sKCcnLCBbXG4gICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgIFZhbGlkYXRvcnMucGF0dGVybih0aGlzLnBhdHRlcm4pLFxuICAgICAgICBWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm1pbkxlbmd0aCksXG4gICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4TGVuZ3RoKV0sXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZXF1aXJlZCAmJiAhdGhpcy5taW5MZW5ndGggJiYgIXRoaXMubWF4TGVuZ3RoICYmICF0aGlzLnBhdHRlcm4pIHtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnJlcXVpcmVkICYmICF0aGlzLm1pbkxlbmd0aCAmJiAhdGhpcy5tYXhMZW5ndGggJiYgdGhpcy5wYXR0ZXJuKSB7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heExlbmd0aCldKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnJlcXVpcmVkICYmIHRoaXMubWluTGVuZ3RoICYmICF0aGlzLm1heExlbmd0aCAmJiAhdGhpcy5wYXR0ZXJuKSB7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm1pbkxlbmd0aCldKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnJlcXVpcmVkICYmICF0aGlzLm1pbkxlbmd0aCAmJiB0aGlzLm1heExlbmd0aCAmJiAhdGhpcy5wYXR0ZXJuKSB7XG4gICAgICB0aGlzLmVsZW1lbnQgPSBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heExlbmd0aCldKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnJlcXVpcmVkICYmIHRoaXMubWluTGVuZ3RoICYmIHRoaXMubWF4TGVuZ3RoICYmICF0aGlzLnBhdHRlcm4pIHtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG5ldyBGb3JtQ29udHJvbCgnJywgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4TGVuZ3RoKSwgVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW5MZW5ndGgpXSk7XG4gICAgfVxuXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgbmFtZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5pc0RpcnR5O1xuICAgIGlmICgobmFtZSB8fCB7fSlbJ2N1cnJlbnRWYWx1ZSddKSB7XG4gICAgICB0aGlzLmVsZW1lbnQubWFya0FzRGlydHkoe29ubHlTZWxmOiB0cnVlfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICh0aGlzLmZvY3VzZSkge1xuICAgICAgdGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGdldEVycm9yTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Lmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJyDZhNinINmK2YXZg9mGINij2YYg2YrZg9mI2YYg2YfYsNinINin2YTYrdmC2YQg2YHYp9ix2LrZi9inIScgOlxuICAgICAgdGhpcy5lbGVtZW50Lmhhc0Vycm9yKCdwYXR0ZXJuJykgPyB0aGlzLnBldHRlcm5NZXNzYWdlIDpcbiAgICAgICAgdGhpcy5lbGVtZW50Lmhhc0Vycm9yKCdtaW5sZW5ndGgnKSA/ICcg2K3Yr9in2YLZhCAnICsgdGhpcy5taW5MZW5ndGggKyAnINqp2KfYsdin2qnYqtixINmI2KfYsdivINmG2YXYp9uM24zYryEnIDpcbiAgICAgICAgICB0aGlzLmVsZW1lbnQuaGFzRXJyb3IoJ21heGxlbmd0aCcpID8gJyDYrdiv2Kfaqdir2LEgJyArIHRoaXMubWF4TGVuZ3RoICsgJyDaqdin2LHYp9qp2KrYsSDZiNin2LHYryDZhtmF2KfbjNuM2K8hJyA6XG4gICAgICAgICAgICAnJztcbiAgfVxuXG4gIHN1ZmZpeENsaWNrKHZhbCkge1xuICAgIC8vIGlmICh0aGlzLmVsZW1lbnQuaW52YWxpZCAmJiB0aGlzLnN1ZmZpeEljb24gIT09ICdjbG9zZScpIHtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuc3VmZml4SWNvbiA9PT0gJ2Nsb3NlJykge1xuICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgIH1cbiAgICB0aGlzLnN1ZmZpeENsaWNrZWQuZW1pdCh7dmFsdWU6IHZhbCwgYWN0aW9uOiB0aGlzLnN1ZmZpeEljb259KTtcbiAgfVxuXG4gIGlkR2VuZXJhdG9yKCkge1xuICAgIGNvbnN0IG51bWJlciA9IE1hdGgucmFuZG9tKCk7XG4gICAgbnVtYmVyLnRvU3RyaW5nKDM2KTtcbiAgICByZXR1cm4gbnVtYmVyLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSk7XG4gIH1cblxuICBmYU51bWJlclRvRW4gPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGxldCBkID0gJyc7XG4gICAgY29uc3QgYSA9ICfbsNux27Lbs9u027Xbttu327jbuScsIGIgPSAnMDEyMzQ1Njc4OScsIGMgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkICs9IGJbYS5pbmRleE9mKGNbaV0pXSB8fCBjW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZDtcbiAgfVxuICB0b1BlcnNpYW5DaGFyID0gKHZhbHVlKSA9PiB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBhcmFiaWNDaGFycyA9IFsn2YonLCAn2YMnLCAn2YknXSxcbiAgICAgIHBlcnNpYW5DaGFycyA9IFsn24wnLCAn2qknLCAn24wnXTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBjaGFyc0xlbiA9IGFyYWJpY0NoYXJzLmxlbmd0aDsgaSA8IGNoYXJzTGVuOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGFyYWJpY0NoYXJzW2ldLCAnZycpLCBwZXJzaWFuQ2hhcnNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxufVxuIl19