ng6-text-restrictions
Version:
This is a project for restrict the use of caracteres in forms inputs.
291 lines (284 loc) • 19.1 kB
JavaScript
import { Directive, HostListener, NgModule } from '@angular/core';
import { NgControl } from '@angular/forms';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var AlphaMxDirective = /** @class */ (function () {
function AlphaMxDirective(ngControl) {
this.ngControl = ngControl;
/**
* Expreción regular que se evalua
*/
this.ALPHA_MX = '^([A-Za-záéíóúñüÁÉÍÓÚÑÜ ])+$';
/**
* Nuevo objeto RegExp
*/
this.regExp = new RegExp(this.ALPHA_MX);
}
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* @memberof AlphaMxDirective
*/
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
AlphaMxDirective.prototype.onModelChange = /**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
this.onInputChange(event, false);
};
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* @memberof AlphaMxDirective
*/
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
AlphaMxDirective.prototype.keydownBackspace = /**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
this.onInputChange(event.target.value, true);
};
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* @memberof AlphaMxDirective
*/
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
AlphaMxDirective.prototype.onInputChange = /**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
function (event, backSpace) {
/** @type {?} */
var newVal;
if (backSpace) {
newVal = event;
this.ngControl.valueAccessor.writeValue(newVal);
}
else {
if ((this.regExp.test(event))) {
this.ngControl.valueAccessor.writeValue(event);
}
else {
newVal = event.replace(/[^A-Za-záéíóúñüÁÉÍÓÚÑÜ\s]/g, '');
this.ngControl.valueAccessor.writeValue(newVal);
}
}
};
AlphaMxDirective.decorators = [
{ type: Directive, args: [{
selector: '[alhAlphaMx]'
},] },
];
/** @nocollapse */
AlphaMxDirective.ctorParameters = function () { return [
{ type: NgControl }
]; };
AlphaMxDirective.propDecorators = {
onModelChange: [{ type: HostListener, args: ['ngModelChange', ['$event'],] }],
keydownBackspace: [{ type: HostListener, args: ['keydown.backspace', ['$event'],] }]
};
return AlphaMxDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var DigitDirective = /** @class */ (function () {
function DigitDirective(ngControl) {
this.ngControl = ngControl;
/**
* Expreción regular que se evalua
*/
this.DIGIT = '^[0-9]*$';
/**
* Nuevo objeto RegExp
*/
this.regExp = new RegExp(this.DIGIT);
}
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* @memberof AlphaMxDirective
*/
/**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
DigitDirective.prototype.onModelChange = /**
* Maneja evento de cambio en el input y se ejecuta la funcion onInputChange.
* {*} event Valor de input
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
if (event !== null) {
this.onInputChange(event, false);
}
else {
this.ngControl.valueAccessor.writeValue(this.valorActual);
}
};
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* @memberof AlphaMxDirective
*/
/**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
DigitDirective.prototype.keydownBackspace = /**
* Maneja el evento de tecla de retroceso enviando true como segundo parametro.
* {*} event Evento de tecla de retroceso
* \@memberof AlphaMxDirective
* @param {?} event
* @return {?}
*/
function (event) {
this.onInputChange(event.target.value, true);
};
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* @memberof AlphaMxDirective
*/
/**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
DigitDirective.prototype.onInputChange = /**
* Evalua los parametros con RegExp y actualiza el contenido del input
* por medio de ngControl.valueAccessor, si el valor no es valido se remplaza
* el contenido con la funcion replace.
* {*} event Valor que se obtiene del input.
* {*} backSpace Bandera valor true si el evento es desatado por esta tecla.
* \@memberof AlphaMxDirective
* @param {?} event
* @param {?} backSpace
* @return {?}
*/
function (event, backSpace) {
/** @type {?} */
var newVal;
if (backSpace) {
newVal = event;
this.ngControl.valueAccessor.writeValue(newVal);
}
else {
if ((this.regExp.test(event))) {
this.valorActual = event;
this.ngControl.valueAccessor.writeValue(this.valorActual);
}
else {
newVal = event.replace(/[^0-9]/g, '');
this.ngControl.valueAccessor.writeValue(newVal);
}
}
};
DigitDirective.decorators = [
{ type: Directive, args: [{
selector: '[alhDigit]'
},] },
];
/** @nocollapse */
DigitDirective.ctorParameters = function () { return [
{ type: NgControl }
]; };
DigitDirective.propDecorators = {
onModelChange: [{ type: HostListener, args: ['ngModelChange', ['$event'],] }],
keydownBackspace: [{ type: HostListener, args: ['keydown.backspace', ['$event'],] }]
};
return DigitDirective;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var Ng6TextRestrictionsModule = /** @class */ (function () {
function Ng6TextRestrictionsModule() {
}
Ng6TextRestrictionsModule.decorators = [
{ type: NgModule, args: [{
imports: [],
declarations: [
AlphaMxDirective,
DigitDirective,
],
exports: [
AlphaMxDirective,
DigitDirective,
]
},] },
];
return Ng6TextRestrictionsModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { AlphaMxDirective, DigitDirective, Ng6TextRestrictionsModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmc2LXRleHQtcmVzdHJpY3Rpb25zLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZzYtdGV4dC1yZXN0cmljdGlvbnMvbGliL2FscGhhLW14L2FscGhhLW14LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmc2LXRleHQtcmVzdHJpY3Rpb25zL2xpYi9kaWdpdC9kaWdpdC5kaXJlY3RpdmUudHMiLCJuZzovL25nNi10ZXh0LXJlc3RyaWN0aW9ucy9saWIvbmc2LXRleHQtcmVzdHJpY3Rpb25zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thbGhBbHBoYU14XSdcbn0pXG5leHBvcnQgY2xhc3MgQWxwaGFNeERpcmVjdGl2ZSB7XG5cbiAgLyoqIEV4cHJlY2nDg8KzbiByZWd1bGFyIHF1ZSBzZSBldmFsdWEgKi9cbiAgcHVibGljIEFMUEhBX01YID0gJ14oW0EtWmEtesODwqHDg8Kpw4PCrcODwrPDg8K6w4PCscODwrzDg8KBw4PCicODwo3Dg8KTw4PCmsODwpHDg8KcIF0pKyQnO1xuICAvKiogIE51ZXZvIG9iamV0byBSZWdFeHAgKi9cbiAgcmVnRXhwID0gbmV3IFJlZ0V4cCh0aGlzLkFMUEhBX01YKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBldmVudG8gZGUgY2FtYmlvIGVuIGVsIGlucHV0IHkgc2UgZWplY3V0YSBsYSBmdW5jaW9uIG9uSW5wdXRDaGFuZ2UuXG4gICAqIHsqfSBldmVudCBWYWxvciBkZSBpbnB1dFxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gIG9uTW9kZWxDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoZXZlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5lamEgZWwgZXZlbnRvIGRlIHRlY2xhIGRlIHJldHJvY2VzbyBlbnZpYW5kbyB0cnVlIGNvbW8gc2VndW5kbyBwYXJhbWV0cm8uXG4gICAqIHsqfSBldmVudCBFdmVudG8gZGUgdGVjbGEgZGUgcmV0cm9jZXNvXG4gICAqIEBtZW1iZXJvZiBBbHBoYU14RGlyZWN0aXZlXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmJhY2tzcGFjZScsIFsnJGV2ZW50J10pXG4gIGtleWRvd25CYWNrc3BhY2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWEgbG9zIHBhcmFtZXRyb3MgY29uIFJlZ0V4cCB5IGFjdHVhbGl6YSBlbCBjb250ZW5pZG8gZGVsIGlucHV0XG4gICAqIHBvciBtZWRpbyBkZSBuZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvciwgc2kgZWwgdmFsb3Igbm8gZXMgdmFsaWRvIHNlIHJlbXBsYXphXG4gICAqIGVsIGNvbnRlbmlkbyBjb24gbGEgZnVuY2lvbiByZXBsYWNlLlxuICAgKiB7Kn0gZXZlbnQgVmFsb3IgcXVlIHNlIG9idGllbmUgZGVsIGlucHV0LlxuICAgKiB7Kn0gYmFja1NwYWNlIEJhbmRlcmEgdmFsb3IgdHJ1ZSBzaSBlbCBldmVudG8gZXMgZGVzYXRhZG8gcG9yIGVzdGEgdGVjbGEuXG4gICAqIEBtZW1iZXJvZiBBbHBoYU14RGlyZWN0aXZlXG4gICAqL1xuICBvbklucHV0Q2hhbmdlKGV2ZW50LCBiYWNrU3BhY2UpIHtcbiAgICBsZXQgbmV3VmFsOiBzdHJpbmc7XG4gICAgaWYgKGJhY2tTcGFjZSkge1xuICAgICAgbmV3VmFsID0gZXZlbnQ7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUobmV3VmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCh0aGlzLnJlZ0V4cC50ZXN0KGV2ZW50KSkpIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbCA9IGV2ZW50LnJlcGxhY2UoL1teQS1aYS16w4PCocODwqnDg8Ktw4PCs8ODwrrDg8Kxw4PCvMODwoHDg8KJw4PCjcODwpPDg8Kaw4PCkcODwpxcXHNdL2csICcnKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thbGhEaWdpdF0nXG59KVxuZXhwb3J0IGNsYXNzIERpZ2l0RGlyZWN0aXZlIHtcblxuICAvKiogRXhwcmVjacODwrNuIHJlZ3VsYXIgcXVlIHNlIGV2YWx1YSAqL1xuICBwdWJsaWMgRElHSVQgPSAnXlswLTldKiQnO1xuXG4gIC8qKiAgTnVldm8gb2JqZXRvIFJlZ0V4cCAqL1xuICByZWdFeHAgPSBuZXcgUmVnRXhwKHRoaXMuRElHSVQpO1xuXG4gIC8qKiBWYWxvciBpbmdyZXNhZG8gZW4gZWwgaW5wdXQgKi9cbiAgdmFsb3JBY3R1YWw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBldmVudG8gZGUgY2FtYmlvIGVuIGVsIGlucHV0IHkgc2UgZWplY3V0YSBsYSBmdW5jaW9uIG9uSW5wdXRDaGFuZ2UuXG4gICAqIHsqfSBldmVudCBWYWxvciBkZSBpbnB1dFxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gIG9uTW9kZWxDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMub25JbnB1dENoYW5nZShldmVudCwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZSh0aGlzLnZhbG9yQWN0dWFsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGVsIGV2ZW50byBkZSB0ZWNsYSBkZSByZXRyb2Nlc28gZW52aWFuZG8gdHJ1ZSBjb21vIHNlZ3VuZG8gcGFyYW1ldHJvLlxuICAgKiB7Kn0gZXZlbnQgRXZlbnRvIGRlIHRlY2xhIGRlIHJldHJvY2Vzb1xuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5iYWNrc3BhY2UnLCBbJyRldmVudCddKVxuICBrZXlkb3duQmFja3NwYWNlKGV2ZW50KSB7XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhIGxvcyBwYXJhbWV0cm9zIGNvbiBSZWdFeHAgeSBhY3R1YWxpemEgZWwgY29udGVuaWRvIGRlbCBpbnB1dFxuICAgKiBwb3IgbWVkaW8gZGUgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IsIHNpIGVsIHZhbG9yIG5vIGVzIHZhbGlkbyBzZSByZW1wbGF6YVxuICAgKiBlbCBjb250ZW5pZG8gY29uIGxhIGZ1bmNpb24gcmVwbGFjZS5cbiAgICogeyp9IGV2ZW50IFZhbG9yIHF1ZSBzZSBvYnRpZW5lIGRlbCBpbnB1dC5cbiAgICogeyp9IGJhY2tTcGFjZSBCYW5kZXJhIHZhbG9yIHRydWUgc2kgZWwgZXZlbnRvIGVzIGRlc2F0YWRvIHBvciBlc3RhIHRlY2xhLlxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgb25JbnB1dENoYW5nZShldmVudCwgYmFja1NwYWNlKSB7XG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nO1xuICAgIGlmIChiYWNrU3BhY2UpIHtcbiAgICAgIG5ld1ZhbCA9IGV2ZW50O1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgodGhpcy5yZWdFeHAudGVzdChldmVudCkpKSB7XG4gICAgICAgIHRoaXMudmFsb3JBY3R1YWwgPSBldmVudDtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKHRoaXMudmFsb3JBY3R1YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VmFsID0gZXZlbnQucmVwbGFjZSgvW14wLTldL2csICcnKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpZ2l0RGlyZWN0aXZlIH0gZnJvbSAnLi9kaWdpdC9kaWdpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWxwaGFNeERpcmVjdGl2ZSB9IGZyb20gJy4vYWxwaGEtbXgvYWxwaGEtbXguZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBBbHBoYU14RGlyZWN0aXZlLFxuICAgIERpZ2l0RGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQWxwaGFNeERpcmVjdGl2ZSxcbiAgICBEaWdpdERpcmVjdGl2ZSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZzZUZXh0UmVzdHJpY3Rpb25zTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtJQWNFLDBCQUNVO1FBQUEsY0FBUyxHQUFULFNBQVM7Ozs7d0JBTEQsOEJBQThCOzs7O3NCQUV2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0tBSTdCOzs7Ozs7Ozs7Ozs7O0lBUUwsd0NBQWE7Ozs7Ozs7SUFEYixVQUNjLEtBQUs7UUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbEM7Ozs7Ozs7Ozs7Ozs7SUFRRCwyQ0FBZ0I7Ozs7Ozs7SUFEaEIsVUFDaUIsS0FBSztRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzlDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVVELHdDQUFhOzs7Ozs7Ozs7OztJQUFiLFVBQWMsS0FBSyxFQUFFLFNBQVM7O1FBQzVCLElBQUksTUFBTSxDQUFTO1FBQ25CLElBQUksU0FBUyxFQUFFO1lBQ2IsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakQ7U0FDRjtLQUNGOztnQkF2REYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO2lCQUN6Qjs7OztnQkFKUSxTQUFTOzs7Z0NBcUJmLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7bUNBVXhDLFlBQVksU0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7MkJBakMvQzs7Ozs7OztBQ0FBO0lBaUJFLHdCQUNVO1FBQUEsY0FBUyxHQUFULFNBQVM7Ozs7cUJBVEosVUFBVTs7OztzQkFHaEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQU8xQjs7Ozs7Ozs7Ozs7OztJQVFMLHNDQUFhOzs7Ozs7O0lBRGIsVUFDYyxLQUFLO1FBQ2pCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3RDtLQUNGOzs7Ozs7Ozs7Ozs7O0lBUUQseUNBQWdCOzs7Ozs7O0lBRGhCLFVBQ2lCLEtBQUs7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFVRCxzQ0FBYTs7Ozs7Ozs7Ozs7SUFBYixVQUFjLEtBQUssRUFBRSxTQUFTOztRQUM1QixJQUFJLE1BQU0sQ0FBUztRQUNuQixJQUFJLFNBQVMsRUFBRTtZQUNiLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzNEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7S0FDRjs7Z0JBaEVGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtpQkFDdkI7Ozs7Z0JBSlEsU0FBUzs7O2dDQXlCZixZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO21DQWN4QyxZQUFZLFNBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3lCQXhDL0M7Ozs7Ozs7QUNBQTs7OztnQkFJQyxRQUFRLFNBQUM7b0JBQ1IsT0FBTyxFQUFFLEVBQ1I7b0JBQ0QsWUFBWSxFQUFFO3dCQUNaLGdCQUFnQjt3QkFDaEIsY0FBYztxQkFDZjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsZ0JBQWdCO3dCQUNoQixjQUFjO3FCQUNmO2lCQUNGOztvQ0FmRDs7Ozs7Ozs7Ozs7Ozs7OyJ9