UNPKG

ng6-text-restrictions

Version:

This is a project for restrict the use of caracteres in forms inputs.

206 lines (199 loc) 15.1 kB
import { Directive, HostListener, NgModule } from '@angular/core'; import { NgControl } from '@angular/forms'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class AlphaMxDirective { /** * @param {?} ngControl */ constructor(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 * @param {?} event * @return {?} */ onModelChange(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 * @param {?} event * @return {?} */ keydownBackspace(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 * @param {?} event * @param {?} backSpace * @return {?} */ onInputChange(event, backSpace) { /** @type {?} */ let 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 = () => [ { type: NgControl } ]; AlphaMxDirective.propDecorators = { onModelChange: [{ type: HostListener, args: ['ngModelChange', ['$event'],] }], keydownBackspace: [{ type: HostListener, args: ['keydown.backspace', ['$event'],] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class DigitDirective { /** * @param {?} ngControl */ constructor(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 * @param {?} event * @return {?} */ onModelChange(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 * @param {?} event * @return {?} */ keydownBackspace(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 * @param {?} event * @param {?} backSpace * @return {?} */ onInputChange(event, backSpace) { /** @type {?} */ let 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 = () => [ { type: NgControl } ]; DigitDirective.propDecorators = { onModelChange: [{ type: HostListener, args: ['ngModelChange', ['$event'],] }], keydownBackspace: [{ type: HostListener, args: ['keydown.backspace', ['$event'],] }] }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ class Ng6TextRestrictionsModule { } Ng6TextRestrictionsModule.decorators = [ { type: NgModule, args: [{ imports: [], declarations: [ AlphaMxDirective, DigitDirective, ], exports: [ AlphaMxDirective, DigitDirective, ] },] }, ]; /** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmc2LXRleHQtcmVzdHJpY3Rpb25zLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZzYtdGV4dC1yZXN0cmljdGlvbnMvbGliL2FscGhhLW14L2FscGhhLW14LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmc2LXRleHQtcmVzdHJpY3Rpb25zL2xpYi9kaWdpdC9kaWdpdC5kaXJlY3RpdmUudHMiLCJuZzovL25nNi10ZXh0LXJlc3RyaWN0aW9ucy9saWIvbmc2LXRleHQtcmVzdHJpY3Rpb25zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thbGhBbHBoYU14XSdcbn0pXG5leHBvcnQgY2xhc3MgQWxwaGFNeERpcmVjdGl2ZSB7XG5cbiAgLyoqIEV4cHJlY2nDg8KzbiByZWd1bGFyIHF1ZSBzZSBldmFsdWEgKi9cbiAgcHVibGljIEFMUEhBX01YID0gJ14oW0EtWmEtesODwqHDg8Kpw4PCrcODwrPDg8K6w4PCscODwrzDg8KBw4PCicODwo3Dg8KTw4PCmsODwpHDg8KcIF0pKyQnO1xuICAvKiogIE51ZXZvIG9iamV0byBSZWdFeHAgKi9cbiAgcmVnRXhwID0gbmV3IFJlZ0V4cCh0aGlzLkFMUEhBX01YKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBldmVudG8gZGUgY2FtYmlvIGVuIGVsIGlucHV0IHkgc2UgZWplY3V0YSBsYSBmdW5jaW9uIG9uSW5wdXRDaGFuZ2UuXG4gICAqIHsqfSBldmVudCBWYWxvciBkZSBpbnB1dFxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gIG9uTW9kZWxDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoZXZlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5lamEgZWwgZXZlbnRvIGRlIHRlY2xhIGRlIHJldHJvY2VzbyBlbnZpYW5kbyB0cnVlIGNvbW8gc2VndW5kbyBwYXJhbWV0cm8uXG4gICAqIHsqfSBldmVudCBFdmVudG8gZGUgdGVjbGEgZGUgcmV0cm9jZXNvXG4gICAqIEBtZW1iZXJvZiBBbHBoYU14RGlyZWN0aXZlXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmJhY2tzcGFjZScsIFsnJGV2ZW50J10pXG4gIGtleWRvd25CYWNrc3BhY2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWEgbG9zIHBhcmFtZXRyb3MgY29uIFJlZ0V4cCB5IGFjdHVhbGl6YSBlbCBjb250ZW5pZG8gZGVsIGlucHV0XG4gICAqIHBvciBtZWRpbyBkZSBuZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvciwgc2kgZWwgdmFsb3Igbm8gZXMgdmFsaWRvIHNlIHJlbXBsYXphXG4gICAqIGVsIGNvbnRlbmlkbyBjb24gbGEgZnVuY2lvbiByZXBsYWNlLlxuICAgKiB7Kn0gZXZlbnQgVmFsb3IgcXVlIHNlIG9idGllbmUgZGVsIGlucHV0LlxuICAgKiB7Kn0gYmFja1NwYWNlIEJhbmRlcmEgdmFsb3IgdHJ1ZSBzaSBlbCBldmVudG8gZXMgZGVzYXRhZG8gcG9yIGVzdGEgdGVjbGEuXG4gICAqIEBtZW1iZXJvZiBBbHBoYU14RGlyZWN0aXZlXG4gICAqL1xuICBvbklucHV0Q2hhbmdlKGV2ZW50LCBiYWNrU3BhY2UpIHtcbiAgICBsZXQgbmV3VmFsOiBzdHJpbmc7XG4gICAgaWYgKGJhY2tTcGFjZSkge1xuICAgICAgbmV3VmFsID0gZXZlbnQ7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUobmV3VmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCh0aGlzLnJlZ0V4cC50ZXN0KGV2ZW50KSkpIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbCA9IGV2ZW50LnJlcGxhY2UoL1teQS1aYS16w4PCocODwqnDg8Ktw4PCs8ODwrrDg8Kxw4PCvMODwoHDg8KJw4PCjcODwpPDg8Kaw4PCkcODwpxcXHNdL2csICcnKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thbGhEaWdpdF0nXG59KVxuZXhwb3J0IGNsYXNzIERpZ2l0RGlyZWN0aXZlIHtcblxuICAvKiogRXhwcmVjacODwrNuIHJlZ3VsYXIgcXVlIHNlIGV2YWx1YSAqL1xuICBwdWJsaWMgRElHSVQgPSAnXlswLTldKiQnO1xuXG4gIC8qKiAgTnVldm8gb2JqZXRvIFJlZ0V4cCAqL1xuICByZWdFeHAgPSBuZXcgUmVnRXhwKHRoaXMuRElHSVQpO1xuXG4gIC8qKiBWYWxvciBpbmdyZXNhZG8gZW4gZWwgaW5wdXQgKi9cbiAgdmFsb3JBY3R1YWw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBldmVudG8gZGUgY2FtYmlvIGVuIGVsIGlucHV0IHkgc2UgZWplY3V0YSBsYSBmdW5jaW9uIG9uSW5wdXRDaGFuZ2UuXG4gICAqIHsqfSBldmVudCBWYWxvciBkZSBpbnB1dFxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gIG9uTW9kZWxDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMub25JbnB1dENoYW5nZShldmVudCwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZSh0aGlzLnZhbG9yQWN0dWFsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGVsIGV2ZW50byBkZSB0ZWNsYSBkZSByZXRyb2Nlc28gZW52aWFuZG8gdHJ1ZSBjb21vIHNlZ3VuZG8gcGFyYW1ldHJvLlxuICAgKiB7Kn0gZXZlbnQgRXZlbnRvIGRlIHRlY2xhIGRlIHJldHJvY2Vzb1xuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5iYWNrc3BhY2UnLCBbJyRldmVudCddKVxuICBrZXlkb3duQmFja3NwYWNlKGV2ZW50KSB7XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhIGxvcyBwYXJhbWV0cm9zIGNvbiBSZWdFeHAgeSBhY3R1YWxpemEgZWwgY29udGVuaWRvIGRlbCBpbnB1dFxuICAgKiBwb3IgbWVkaW8gZGUgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IsIHNpIGVsIHZhbG9yIG5vIGVzIHZhbGlkbyBzZSByZW1wbGF6YVxuICAgKiBlbCBjb250ZW5pZG8gY29uIGxhIGZ1bmNpb24gcmVwbGFjZS5cbiAgICogeyp9IGV2ZW50IFZhbG9yIHF1ZSBzZSBvYnRpZW5lIGRlbCBpbnB1dC5cbiAgICogeyp9IGJhY2tTcGFjZSBCYW5kZXJhIHZhbG9yIHRydWUgc2kgZWwgZXZlbnRvIGVzIGRlc2F0YWRvIHBvciBlc3RhIHRlY2xhLlxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgb25JbnB1dENoYW5nZShldmVudCwgYmFja1NwYWNlKSB7XG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nO1xuICAgIGlmIChiYWNrU3BhY2UpIHtcbiAgICAgIG5ld1ZhbCA9IGV2ZW50O1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgodGhpcy5yZWdFeHAudGVzdChldmVudCkpKSB7XG4gICAgICAgIHRoaXMudmFsb3JBY3R1YWwgPSBldmVudDtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKHRoaXMudmFsb3JBY3R1YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VmFsID0gZXZlbnQucmVwbGFjZSgvW14wLTldL2csICcnKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpZ2l0RGlyZWN0aXZlIH0gZnJvbSAnLi9kaWdpdC9kaWdpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWxwaGFNeERpcmVjdGl2ZSB9IGZyb20gJy4vYWxwaGEtbXgvYWxwaGEtbXguZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBBbHBoYU14RGlyZWN0aXZlLFxuICAgIERpZ2l0RGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQWxwaGFNeERpcmVjdGl2ZSxcbiAgICBEaWdpdERpcmVjdGl2ZSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZzZUZXh0UmVzdHJpY3Rpb25zTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7OztJQWNFLFlBQ1U7UUFBQSxjQUFTLEdBQVQsU0FBUzs7Ozt3QkFMRCw4QkFBOEI7Ozs7c0JBRXZDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7S0FJN0I7Ozs7Ozs7O0lBUUwsYUFBYSxDQUFDLEtBQUs7UUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbEM7Ozs7Ozs7O0lBUUQsZ0JBQWdCLENBQUMsS0FBSztRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzlDOzs7Ozs7Ozs7Ozs7SUFVRCxhQUFhLENBQUMsS0FBSyxFQUFFLFNBQVM7O1FBQzVCLElBQUksTUFBTSxDQUFTO1FBQ25CLElBQUksU0FBUyxFQUFFO1lBQ2IsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakQ7U0FDRjtLQUNGOzs7WUF2REYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxjQUFjO2FBQ3pCOzs7O1lBSlEsU0FBUzs7OzRCQXFCZixZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOytCQVV4QyxZQUFZLFNBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7Ozs7QUNqQy9DOzs7O0lBaUJFLFlBQ1U7UUFBQSxjQUFTLEdBQVQsU0FBUzs7OztxQkFUSixVQUFVOzs7O3NCQUdoQixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBTzFCOzs7Ozs7OztJQVFMLGFBQWEsQ0FBQyxLQUFLO1FBQ2pCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3RDtLQUNGOzs7Ozs7OztJQVFELGdCQUFnQixDQUFDLEtBQUs7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM5Qzs7Ozs7Ozs7Ozs7O0lBVUQsYUFBYSxDQUFDLEtBQUssRUFBRSxTQUFTOztRQUM1QixJQUFJLE1BQU0sQ0FBUztRQUNuQixJQUFJLFNBQVMsRUFBRTtZQUNiLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzNEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7S0FDRjs7O1lBaEVGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsWUFBWTthQUN2Qjs7OztZQUpRLFNBQVM7Ozs0QkF5QmYsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzsrQkFjeEMsWUFBWSxTQUFDLG1CQUFtQixFQUFFLENBQUMsUUFBUSxDQUFDOzs7Ozs7O0FDeEMvQzs7O1lBSUMsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRSxFQUNSO2dCQUNELFlBQVksRUFBRTtvQkFDWixnQkFBZ0I7b0JBQ2hCLGNBQWM7aUJBQ2Y7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLGdCQUFnQjtvQkFDaEIsY0FBYztpQkFDZjthQUNGOzs7Ozs7Ozs7Ozs7Ozs7In0=