@codice-progressio/input-validaciones
Version:
Validaciones básicas para reacives forms
142 lines • 17.1 kB
JavaScript
import { Component, Input } from "@angular/core";
import * as i0 from "@angular/core";
export class InputValidacionesComponent {
_campo = null;
mensaje = {};
/**
* El control con el que se haran las comprobaciones.
*
* @type {AbstractControl}
* @memberof ValidacionInputsComponent
*/
set campo(value) {
this._campo = value;
if (value) {
this.mensaje = {
required: () => {
return `Este campo es obligatorio`;
},
min: this.min.bind(this),
max: this.max.bind(this),
notInteger: () => {
return `Se necesita un número entero positivo`;
},
invalidNumber: () => {
return `No es un número
válido`;
},
tamanoMinimo: this.tamanoMinimo.bind(this),
minlength: this.minlength.bind(this),
maxlength: this.maxlength.bind(this),
general: this.general.bind(this),
email: () => {
return "Correo no valido";
},
"Mask error": () => "Hay un error en el formato (mask)",
};
}
}
get campo() {
return this._campo;
}
/**
* Un texto especial que se quiera mostrar. Este no se valida.
*
* @type {string}
* @memberof ValidacionInputsComponent
*/
especial = null;
/**
* Define si se salta la validacion del touch para mostrar
* siempre la validacion aunque el usuario no interactue con el
* control.
*
* @type {boolean}
* @memberof ValidacionInputsComponent
*/
directo = false;
debug = false;
constructor() { }
ngOnInit() { }
min() {
return `El valor mínimo permitido es ${this.cge("min").min}`;
}
max() {
return `El máximo permitido es ${this.cge("max").max}`;
}
tamanoMinimo() {
let cantidad = this.cge("tamanoMinimo").minimo > 1 ? "" : "un ";
let campo = this.cge("tamanoMinimo").minimo > 1 ? "campos" : "campo";
return `Debes seleccionar por lo menos ${cantidad} ${campo}`;
}
minlength() {
let campo = this.cge("minlength");
let cantidadCar = campo.requiredLength;
let faltan = cantidadCar - campo.actualLength;
let conjuncion = cantidadCar > 1 ? cantidadCar : "un ";
let caracteres = cantidadCar > 1 ? "caracteres" : "caracter";
return `Debes escribir por lo menos ${conjuncion} ${caracteres}. (Faltan ${faltan})`;
}
maxlength() {
let campo = this.cge("maxlength");
let cantidadCar = campo.requiredLength;
let sobran = campo.actualLength - cantidadCar;
let conjuncion = cantidadCar > 1 ? cantidadCar : "un ";
let caracteres = cantidadCar > 1 ? "caracteres" : "caracter";
return `El máximo es ${conjuncion} ${caracteres}. (Sobran ${sobran})`;
}
general() {
return this.cge("general").mensaje;
}
cge(a) {
return this.campo.getError(a);
}
che(a) {
if (!this.campo)
return false;
return this.campo.hasError(a);
}
listaDeErrores() {
if (!this.campo)
return [];
if (!this.campo.errors)
return [];
return Object.keys(this.campo.errors);
}
/**
* Comprueba si el campo a sido tocado si directo no a sido
* puesto como true. Si ha sido puesto como true retorna true
* directamete.
*
* @returns True si ha sido tocado o directo esta como true.
* @memberof ValidacionInputsComponent
*/
touched() {
if (this.directo)
return true;
if (this.campo) {
return this.campo.touched;
}
return false;
}
obtenerMensaje(key) {
if (this.mensaje.hasOwnProperty(key))
return this.mensaje[key]();
return `Mensaje no definido para ${key}`;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: InputValidacionesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.1", type: InputValidacionesComponent, selector: "codice-validaciones", inputs: { campo: "campo", especial: "especial", directo: "directo", debug: "debug" }, ngImport: i0, template: "<!-- <ng-container *ngIf=\"campo && touched()\">\r\n <ng-container *ngFor=\"let error of listaDeErrores()\">\r\n <div class=\"text-danger \">\r\n <i class=\"fas fa-times\"></i>\r\n {{ obtenerMensaje(error) }}\r\n </div>\r\n </ng-container>\r\n\r\n <pre *ngIf=\"debug\">{{ campo?.errors | json }}</pre>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"especial\">\r\n <span class=\"form-text text-danger\">\r\n <i class=\"fas fa-times animated tada\"></i> {{ especial }}.</span\r\n >\r\n</ng-container> -->\r\n" });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: InputValidacionesComponent, decorators: [{
type: Component,
args: [{ selector: "codice-validaciones", template: "<!-- <ng-container *ngIf=\"campo && touched()\">\r\n <ng-container *ngFor=\"let error of listaDeErrores()\">\r\n <div class=\"text-danger \">\r\n <i class=\"fas fa-times\"></i>\r\n {{ obtenerMensaje(error) }}\r\n </div>\r\n </ng-container>\r\n\r\n <pre *ngIf=\"debug\">{{ campo?.errors | json }}</pre>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"especial\">\r\n <span class=\"form-text text-danger\">\r\n <i class=\"fas fa-times animated tada\"></i> {{ especial }}.</span\r\n >\r\n</ng-container> -->\r\n" }]
}], ctorParameters: () => [], propDecorators: { campo: [{
type: Input
}], especial: [{
type: Input
}], directo: [{
type: Input
}], debug: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdmFsaWRhY2lvbmVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0LXZhbGlkYWNpb25lcy9zcmMvbGliL2lucHV0LXZhbGlkYWNpb25lcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnB1dC12YWxpZGFjaW9uZXMvc3JjL2xpYi9pbnB1dC12YWxpZGFjaW9uZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUE7O0FBT3hELE1BQU0sT0FBTywwQkFBMEI7SUFDckMsTUFBTSxHQUFvQixJQUFJLENBQUE7SUFFOUIsT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUNaOzs7OztPQUtHO0lBQ0gsSUFBYSxLQUFLLENBQUMsS0FBc0I7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7UUFFbkIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxPQUFPLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFLEdBQUcsRUFBRTtvQkFDYixPQUFPLDJCQUEyQixDQUFBO2dCQUNwQyxDQUFDO2dCQUNELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxHQUFHLEVBQUU7b0JBQ2YsT0FBTyx1Q0FBdUMsQ0FBQTtnQkFDaEQsQ0FBQztnQkFDRCxhQUFhLEVBQUUsR0FBRyxFQUFFO29CQUNsQixPQUFPO2VBQ0YsQ0FBQTtnQkFDUCxDQUFDO2dCQUNELFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQzFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLEtBQUssRUFBRSxHQUFHLEVBQUU7b0JBQ1YsT0FBTyxrQkFBa0IsQ0FBQTtnQkFDM0IsQ0FBQztnQkFFRCxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsbUNBQW1DO2FBQ3hELENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUNwQixDQUFDO0lBQ0Q7Ozs7O09BS0c7SUFDTSxRQUFRLEdBQVcsSUFBSSxDQUFBO0lBRWhDOzs7Ozs7O09BT0c7SUFDTSxPQUFPLEdBQVksS0FBSyxDQUFBO0lBRXhCLEtBQUssR0FBWSxLQUFLLENBQUE7SUFFL0IsZ0JBQWUsQ0FBQztJQUVoQixRQUFRLEtBQUksQ0FBQztJQUViLEdBQUc7UUFDRCxPQUFPLGdDQUFnQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO0lBQzlELENBQUM7SUFFRCxHQUFHO1FBQ0QsT0FBTywwQkFBMEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUN4RCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFDL0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtRQUNwRSxPQUFPLGtDQUFrQyxRQUFRLElBQUksS0FBSyxFQUFFLENBQUE7SUFDOUQsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2pDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUE7UUFDdEMsSUFBSSxNQUFNLEdBQUcsV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUE7UUFDN0MsSUFBSSxVQUFVLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFDdEQsSUFBSSxVQUFVLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFDNUQsT0FBTywrQkFBK0IsVUFBVSxJQUFJLFVBQVUsYUFBYSxNQUFNLEdBQUcsQ0FBQTtJQUN0RixDQUFDO0lBQ0QsU0FBUztRQUNQLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDakMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQTtRQUN0QyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQTtRQUM3QyxJQUFJLFVBQVUsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUN0RCxJQUFJLFVBQVUsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtRQUM1RCxPQUFPLGlCQUFpQixVQUFVLElBQUksVUFBVSxhQUFhLE1BQU0sR0FBRyxDQUFBO0lBQ3hFLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUNwQyxDQUFDO0lBRUQsR0FBRyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFFRCxHQUFHLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFBO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDL0IsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUE7UUFDakMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzdCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQTtRQUMzQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsY0FBYyxDQUFDLEdBQVc7UUFDeEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQTtRQUVoRSxPQUFPLDRCQUE0QixHQUFHLEVBQUUsQ0FBQTtJQUMxQyxDQUFDO3VHQXpJVSwwQkFBMEI7MkZBQTFCLDBCQUEwQixpSkNQdkMsc2hCQWdCQTs7MkZEVGEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNFLHFCQUFxQjt3REFhbEIsS0FBSztzQkFBakIsS0FBSztnQkF1Q0csUUFBUTtzQkFBaEIsS0FBSztnQkFVRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCJcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImNvZGljZS12YWxpZGFjaW9uZXNcIixcbiAgdGVtcGxhdGVVcmw6IFwiaW5wdXQtdmFsaWRhY2lvbmVzLmNvbXBvbmVudC5odG1sXCIsXG59KVxuZXhwb3J0IGNsYXNzIElucHV0VmFsaWRhY2lvbmVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgX2NhbXBvOiBBYnN0cmFjdENvbnRyb2wgPSBudWxsXG5cbiAgbWVuc2FqZSA9IHt9XG4gIC8qKlxuICAgKiBFbCBjb250cm9sIGNvbiBlbCBxdWUgc2UgaGFyYW4gbGFzIGNvbXByb2JhY2lvbmVzLlxuICAgKlxuICAgKiBAdHlwZSB7QWJzdHJhY3RDb250cm9sfVxuICAgKiBAbWVtYmVyb2YgVmFsaWRhY2lvbklucHV0c0NvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGNhbXBvKHZhbHVlOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICB0aGlzLl9jYW1wbyA9IHZhbHVlXG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMubWVuc2FqZSA9IHtcbiAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gYEVzdGUgY2FtcG8gZXMgb2JsaWdhdG9yaW9gXG4gICAgICAgIH0sXG4gICAgICAgIG1pbjogdGhpcy5taW4uYmluZCh0aGlzKSxcbiAgICAgICAgbWF4OiB0aGlzLm1heC5iaW5kKHRoaXMpLFxuICAgICAgICBub3RJbnRlZ2VyOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGBTZSBuZWNlc2l0YSB1biBuw7ptZXJvIGVudGVybyBwb3NpdGl2b2BcbiAgICAgICAgfSxcbiAgICAgICAgaW52YWxpZE51bWJlcjogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgTm8gZXMgdW4gbsO6bWVyb1xuICAgICAgICB2w6FsaWRvYFxuICAgICAgICB9LFxuICAgICAgICB0YW1hbm9NaW5pbW86IHRoaXMudGFtYW5vTWluaW1vLmJpbmQodGhpcyksXG4gICAgICAgIG1pbmxlbmd0aDogdGhpcy5taW5sZW5ndGguYmluZCh0aGlzKSxcbiAgICAgICAgbWF4bGVuZ3RoOiB0aGlzLm1heGxlbmd0aC5iaW5kKHRoaXMpLFxuICAgICAgICBnZW5lcmFsOiB0aGlzLmdlbmVyYWwuYmluZCh0aGlzKSxcbiAgICAgICAgZW1haWw6ICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gXCJDb3JyZW8gbm8gdmFsaWRvXCJcbiAgICAgICAgfSxcblxuICAgICAgICBcIk1hc2sgZXJyb3JcIjogKCkgPT4gXCJIYXkgdW4gZXJyb3IgZW4gZWwgZm9ybWF0byAobWFzaylcIixcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY2FtcG8oKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5fY2FtcG9cbiAgfVxuICAvKipcbiAgICogVW4gdGV4dG8gZXNwZWNpYWwgcXVlIHNlIHF1aWVyYSBtb3N0cmFyLiBFc3RlIG5vIHNlIHZhbGlkYS5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQG1lbWJlcm9mIFZhbGlkYWNpb25JbnB1dHNDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpIGVzcGVjaWFsOiBzdHJpbmcgPSBudWxsXG5cbiAgLyoqXG4gICAqIERlZmluZSBzaSBzZSBzYWx0YSBsYSB2YWxpZGFjaW9uIGRlbCB0b3VjaCBwYXJhIG1vc3RyYXJcbiAgICogc2llbXByZSBsYSB2YWxpZGFjaW9uIGF1bnF1ZSBlbCB1c3VhcmlvIG5vIGludGVyYWN0dWUgY29uIGVsXG4gICAqIGNvbnRyb2wuXG4gICAqXG4gICAqIEB0eXBlIHtib29sZWFufVxuICAgKiBAbWVtYmVyb2YgVmFsaWRhY2lvbklucHV0c0NvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0bzogYm9vbGVhbiA9IGZhbHNlXG5cbiAgQElucHV0KCkgZGVidWc6IGJvb2xlYW4gPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpIHt9XG5cbiAgbWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBFbCB2YWxvciBtw61uaW1vIHBlcm1pdGlkbyBlcyAke3RoaXMuY2dlKFwibWluXCIpLm1pbn1gXG4gIH1cblxuICBtYXgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEVsIG3DoXhpbW8gcGVybWl0aWRvIGVzICR7dGhpcy5jZ2UoXCJtYXhcIikubWF4fWBcbiAgfVxuXG4gIHRhbWFub01pbmltbygpOiBzdHJpbmcge1xuICAgIGxldCBjYW50aWRhZCA9IHRoaXMuY2dlKFwidGFtYW5vTWluaW1vXCIpLm1pbmltbyA+IDEgPyBcIlwiIDogXCJ1biBcIlxuICAgIGxldCBjYW1wbyA9IHRoaXMuY2dlKFwidGFtYW5vTWluaW1vXCIpLm1pbmltbyA+IDEgPyBcImNhbXBvc1wiIDogXCJjYW1wb1wiXG4gICAgcmV0dXJuIGBEZWJlcyBzZWxlY2Npb25hciBwb3IgbG8gbWVub3MgJHtjYW50aWRhZH0gJHtjYW1wb31gXG4gIH1cblxuICBtaW5sZW5ndGgoKTogc3RyaW5nIHtcbiAgICBsZXQgY2FtcG8gPSB0aGlzLmNnZShcIm1pbmxlbmd0aFwiKVxuICAgIGxldCBjYW50aWRhZENhciA9IGNhbXBvLnJlcXVpcmVkTGVuZ3RoXG4gICAgbGV0IGZhbHRhbiA9IGNhbnRpZGFkQ2FyIC0gY2FtcG8uYWN0dWFsTGVuZ3RoXG4gICAgbGV0IGNvbmp1bmNpb24gPSBjYW50aWRhZENhciA+IDEgPyBjYW50aWRhZENhciA6IFwidW4gXCJcbiAgICBsZXQgY2FyYWN0ZXJlcyA9IGNhbnRpZGFkQ2FyID4gMSA/IFwiY2FyYWN0ZXJlc1wiIDogXCJjYXJhY3RlclwiXG4gICAgcmV0dXJuIGBEZWJlcyBlc2NyaWJpciBwb3IgbG8gbWVub3MgJHtjb25qdW5jaW9ufSAke2NhcmFjdGVyZXN9LiAoRmFsdGFuICR7ZmFsdGFufSlgXG4gIH1cbiAgbWF4bGVuZ3RoKCk6IHN0cmluZyB7XG4gICAgbGV0IGNhbXBvID0gdGhpcy5jZ2UoXCJtYXhsZW5ndGhcIilcbiAgICBsZXQgY2FudGlkYWRDYXIgPSBjYW1wby5yZXF1aXJlZExlbmd0aFxuICAgIGxldCBzb2JyYW4gPSBjYW1wby5hY3R1YWxMZW5ndGggLSBjYW50aWRhZENhclxuICAgIGxldCBjb25qdW5jaW9uID0gY2FudGlkYWRDYXIgPiAxID8gY2FudGlkYWRDYXIgOiBcInVuIFwiXG4gICAgbGV0IGNhcmFjdGVyZXMgPSBjYW50aWRhZENhciA+IDEgPyBcImNhcmFjdGVyZXNcIiA6IFwiY2FyYWN0ZXJcIlxuICAgIHJldHVybiBgRWwgbcOheGltbyBlcyAgJHtjb25qdW5jaW9ufSAke2NhcmFjdGVyZXN9LiAoU29icmFuICR7c29icmFufSlgXG4gIH1cblxuICBnZW5lcmFsKCkge1xuICAgIHJldHVybiB0aGlzLmNnZShcImdlbmVyYWxcIikubWVuc2FqZVxuICB9XG5cbiAgY2dlKGEpIHtcbiAgICByZXR1cm4gdGhpcy5jYW1wby5nZXRFcnJvcihhKVxuICB9XG5cbiAgY2hlKGEpIHtcbiAgICBpZiAoIXRoaXMuY2FtcG8pIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0aGlzLmNhbXBvLmhhc0Vycm9yKGEpXG4gIH1cblxuICBsaXN0YURlRXJyb3JlcygpIHtcbiAgICBpZiAoIXRoaXMuY2FtcG8pIHJldHVybiBbXVxuICAgIGlmICghdGhpcy5jYW1wby5lcnJvcnMpIHJldHVybiBbXVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmNhbXBvLmVycm9ycylcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wcnVlYmEgc2kgZWwgY2FtcG8gYSBzaWRvIHRvY2FkbyBzaSBkaXJlY3RvIG5vIGEgc2lkb1xuICAgKiBwdWVzdG8gY29tbyB0cnVlLiBTaSBoYSBzaWRvIHB1ZXN0byBjb21vIHRydWUgcmV0b3JuYSB0cnVlXG4gICAqIGRpcmVjdGFtZXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUcnVlIHNpIGhhIHNpZG8gdG9jYWRvIG8gZGlyZWN0byBlc3RhIGNvbW8gdHJ1ZS5cbiAgICogQG1lbWJlcm9mIFZhbGlkYWNpb25JbnB1dHNDb21wb25lbnRcbiAgICovXG4gIHRvdWNoZWQoKSB7XG4gICAgaWYgKHRoaXMuZGlyZWN0bykgcmV0dXJuIHRydWVcbiAgICBpZiAodGhpcy5jYW1wbykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FtcG8udG91Y2hlZFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIG9idGVuZXJNZW5zYWplKGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5tZW5zYWplLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiB0aGlzLm1lbnNhamVba2V5XSgpXG5cbiAgICByZXR1cm4gYE1lbnNhamUgbm8gZGVmaW5pZG8gcGFyYSAke2tleX1gXG4gIH1cbn1cbiIsIjwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbXBvICYmIHRvdWNoZWQoKVwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGVycm9yIG9mIGxpc3RhRGVFcnJvcmVzKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlciBcIj5cclxuICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgIHt7IG9idGVuZXJNZW5zYWplKGVycm9yKSB9fVxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxwcmUgKm5nSWY9XCJkZWJ1Z1wiPnt7IGNhbXBvPy5lcnJvcnMgfCBqc29uIH19PC9wcmU+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImVzcGVjaWFsXCI+XHJcbiAgPHNwYW4gY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1kYW5nZXJcIj5cclxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGFuaW1hdGVkIHRhZGFcIj48L2k+IHt7IGVzcGVjaWFsIH19Ljwvc3BhblxyXG4gID5cclxuPC9uZy1jb250YWluZXI+IC0tPlxyXG4iXX0=