UNPKG

@infordata-web/portal-common-component-lib

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.

188 lines 27.7 kB
import { Component, EventEmitter, Input, Output, } from "@angular/core"; import { FormControl, FormGroup, Validators } from "@angular/forms"; import { map, startWith, } from "rxjs/operators"; // TODO // import { FormUtils } from "src/app/utils/form-utils"; import { InfoAnagrafichePFDTO } from "../../models/info-anagrafiche-pf"; import { ComponentOutputStatus } from "../../normalizzazione/component-output-status"; import { CodiceFiscaleService } from "../../services/codice-fiscale/codice-fiscale.service"; import { DelegheService } from "../../services/deleghe-services/deleghe.service"; import { MessageService } from "../../services/message.service"; import { ValidationService } from "../../services/validation.service"; export class InfoPfComponent { constructor(msg, validationService, cfService, delegheService) { this.msg = msg; this.validationService = validationService; this.cfService = cfService; this.delegheService = delegheService; this.readOnly = false; this.validatorFormControl = false; this.done = new EventEmitter(); this.codiceRegione = ""; } ngOnInit() { // console.log('[InfoAnagrafichePFDTO]', this.infopf); this.form = new FormGroup({}); if (this.resetForm) { this.subscription = this.resetForm.subscribe(val => val ? this.pulisciForm() : ""); } if (!this.infopf) { this.initInfoPf(); } const cfValidators = [ Validators.required, ValidationService.pattern(ValidationService.codiceFiscale, "cfInvalidoFormalmente"), ]; if (this.cfDifferentFrom != null) { cfValidators.push(ValidationService.NotEquals(this.cfDifferentFrom, "cfDifferentRichiedente")); } const codiceFiscale = new FormControl({ value: this.infopf.codFiscale, disabled: false }, // cfValidators // this.validatorFormControl ? cfValidators: Validators.nullValidator, [ this.validatorFormControl ? Validators.required : Validators.nullValidator, ValidationService.pattern(ValidationService.codiceFiscale, "cfInvalidoFormalmente"), ] //TODO // [this.validationService.userValidator(TipiPersona.PERSONA_FISICA)] ); this.form.addControl("codiceFiscale", codiceFiscale); const nome = new FormControl({ value: this.infopf.nome, disabled: false }, [ // Validators.required, // ValidationService.ValidateName, this.validatorFormControl ? Validators.required : Validators.nullValidator, ValidationService.pattern(ValidationService.formatoName, "formatoName") ]); this.form.addControl("nome", nome); const cognome = new FormControl({ value: this.infopf.cognome, disabled: false }, [ //Validators.required, //ValidationService.ValidateName this.validatorFormControl ? Validators.required : Validators.nullValidator, ValidationService.pattern(ValidationService.formatoName, "formatoName") ]); this.form.addControl("cognome", cognome); // TODO // this.validationSub = codiceFiscale.valueChanges.pipe( // filter(val => val.length == 16), // auditTime(500) // ) // .pipe( // tap((_) => { // if (codiceFiscale.errors) { // delete codiceFiscale.errors["invalidCF"]; // } // }), // filter((cf) => codiceFiscale.valid), // switchMap((cf) => // //TODO // // this.cfService // // .validaCodiceFiscale$(cf, "F") // // .pipe(catchError((err) => empty())) // this.delegheService.getPersonaFiscaleCodiceFiscale(cf) // .pipe( // //TODO // // catchError((err) => empty()) // catchError(err => { // codiceFiscale.setErrors({ invalidCF: true }); // return EMPTY; // }) // ) // ), // tap((validationResult) => { // console.log('[validationResult]', validationResult); // // if (!validationResult.valid) { // if (validationResult == null) { // codiceFiscale.setErrors({ invalidCF: true }); // } else { // if (validationResult.residenza != undefined) { // this.codiceRegione = validationResult?.residenza?.regione?.sigla; // } // } // this.form.updateValueAndValidity(); // }) // ) // .subscribe(); const changes$ = this.form.valueChanges.pipe(map((_) => { this.removeSpace(this.form.controls["codiceFiscale"].value); const pf = new InfoAnagrafichePFDTO(); pf.codFiscale = this.form.controls["codiceFiscale"].value; pf.nome = this.form.controls["nome"].value; pf.cognome = this.form.controls["cognome"].value; pf.codiceRegione = this.codiceRegione; return pf; }), startWith(this.infopf), map((pf) => { // console.log( // "pf form valid", // FormUtils.getFormValidationErrors(this.form) // ); const status = ComponentOutputStatus.of(!this.form.invalid || this.readOnly == true, pf); // console.log("status", status); return status; })); this.pfSub = changes$.subscribe((_) => this.done.emit(_)); if (this.readOnly) { this.form.disable(); } } removeSpace(value) { var reWhiteSpace = /\s/g; if (reWhiteSpace.test(value)) { this.form.get('codiceFiscale').setValue(value.replace(reWhiteSpace, '')); } } ngOnDestroy() { if (this.pfSub) { this.pfSub.unsubscribe(); } if (this.validationSub) { this.validationSub.unsubscribe(); } if (this.subscription) { this.subscription.unsubscribe(); } } initInfoPf() { const infoPfNew = new InfoAnagrafichePFDTO(); //TODO // if (this.userDetail) { // infoPfNew.codFiscale = this.userDetail["fiscalNumber"]; // infoPfNew.cognome = this.userDetail["familyName"]; // infoPfNew.nome = this.userDetail["name"]; // } this.infopf = infoPfNew; } pulisciForm() { const keys = Object.keys(this.form.value); keys.forEach(key => { const control = this.form.get(key); control.setValue(""); }); } _resetForm() { var _a; (_a = this.form) === null || _a === void 0 ? void 0 : _a.reset(); } } InfoPfComponent.decorators = [ { type: Component, args: [{ selector: "lib-info-pf", template: "<form [formGroup]=\"form\">\r\n\t<div class=\"row my-2\">\r\n\t\t<div class=\"col-md-4\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{'required' | traduzione}}{{'codice-fiscale' | traduzione}}\" -->\r\n\t\t\t\t<input matInput placeholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'codice-fiscale' | traduzione}}\"\r\n\t\t\t\t\tformControlName=\"codiceFiscale\" uppercase style=\"text-transform: uppercase\" maxlength=\"16\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['codiceFiscale'].invalid\">\r\n\t\t\t\t\t{{msg.produceCFMessage(form.controls['codiceFiscale']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'codice-fiscale'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div class=\"col-md-4\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{'required' | traduzione}}{{'nome' | traduzione}}\" -->\r\n\t\t\t\t<input matInput placeholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'nome' | traduzione}}\"\r\n\t\t\t\t\tformControlName=\"nome\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['nome'].invalid\">\r\n\t\t\t\t\t{{msg.produceMessage('obbligatorio',form.controls['nome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'nome'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t\t<div class=\"col-md-4\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<!-- <input matInput placeholder=\"{{'required' | traduzione}}{{'cognome' | traduzione}}\" -->\r\n\t\t\t\t<input matInput placeholder=\"{{validatorFormControl ? ('required' | traduzione): ''}} {{'cognome' | traduzione}}\"\r\n\t\t\t\t\tformControlName=\"cognome\">\r\n\t\t\t\t<mat-error *ngIf=\"form.controls['cognome'].invalid\">\r\n\t\t\t\t\t{{msg.produceMessage('obbligatorio',form.controls['cognome']) | traduzione }}\r\n\t\t\t\t</mat-error>\r\n\t\t\t\t<mat-hint *infoTip=\"'cognome'\"></mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t</div>\r\n\t</div>\r\n</form>", styles: [""] },] } ]; InfoPfComponent.ctorParameters = () => [ { type: MessageService }, { type: ValidationService }, { type: CodiceFiscaleService }, { type: DelegheService } ]; InfoPfComponent.propDecorators = { infopf: [{ type: Input }], namespace: [{ type: Input }], cfDifferentFrom: [{ type: Input }], readOnly: [{ type: Input }], resetForm: [{ type: Input }], validatorFormControl: [{ type: Input }], done: [{ type: Output }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby1wZi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiRDovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi10ZXJuaS9jb21tb24tY29tcG9uZW50LWxpYi9wcm9qZWN0cy9wb3J0YWwtY29tbW9uLWNvbXBvbmVudC1saWIvc3JjLyIsInNvdXJjZXMiOlsibGliL2RlcG9zaXRpL2NvbW1vbi1jb21wb25lbnQvaW5mby1wZi9pbmZvLXBmLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVyRixPQUFPLEVBRU4sR0FBRyxFQUNILFNBQVMsR0FLVCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU87QUFDUCx3REFBd0Q7QUFDeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQU90RSxNQUFNLE9BQU8sZUFBZTtJQWlDM0IsWUFDUyxHQUFtQixFQUNuQixpQkFBb0MsRUFDcEMsU0FBK0IsRUFDL0IsY0FBOEI7UUFIOUIsUUFBRyxHQUFILEdBQUcsQ0FBZ0I7UUFDbkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixt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TCxLQUFLO21CQUdMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdENvbXBvbmVudCxcclxuXHRFdmVudEVtaXR0ZXIsXHJcblx0SW5wdXQsXHJcblx0T25EZXN0cm95LFxyXG5cdE9uSW5pdCxcclxuXHRPdXRwdXQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IG1lcmdlLCBTdWJzY3JpcHRpb24sIGVtcHR5LCBTdWJqZWN0LCBFTVBUWSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7XHJcblx0ZmlsdGVyLFxyXG5cdG1hcCxcclxuXHRzdGFydFdpdGgsXHJcblx0dGFwLFxyXG5cdHN3aXRjaE1hcCxcclxuXHRjYXRjaEVycm9yLFxyXG5cdGF1ZGl0VGltZSxcclxufSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuLy8gVE9ET1xyXG4vLyBpbXBvcnQgeyBGb3JtVXRpbHMgfSBmcm9tIFwic3JjL2FwcC91dGlscy9mb3JtLXV0aWxzXCI7XHJcbmltcG9ydCB7IEluZm9BbmFncmFmaWNoZVBGRFRPIH0gZnJvbSBcIi4uLy4uL21vZGVscy9pbmZvLWFuYWdyYWZpY2hlLXBmXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudE91dHB1dFN0YXR1cyB9IGZyb20gXCIuLi8uLi9ub3JtYWxpenphemlvbmUvY29tcG9uZW50LW91dHB1dC1zdGF0dXNcIjtcclxuaW1wb3J0IHsgQ29kaWNlRmlzY2FsZVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvY29kaWNlLWZpc2NhbGUvY29kaWNlLWZpc2NhbGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBEZWxlZ2hlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9kZWxlZ2hlLXNlcnZpY2VzL2RlbGVnaGUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9tZXNzYWdlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogXCJsaWItaW5mby1wZlwiLFxyXG5cdHRlbXBsYXRlVXJsOiBcIi4vaW5mby1wZi5jb21wb25lbnQuaHRtbFwiLFxyXG5cdHN0eWxlVXJsczogW1wiLi9pbmZvLXBmLmNvbXBvbmVudC5jc3NcIl0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBJbmZvUGZDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0aW5mb3BmOiBJbmZvQW5hZ3JhZmljaGVQRkRUTztcclxuXHJcblx0QElucHV0KClcclxuXHRuYW1lc3BhY2U6IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRjZkRpZmZlcmVudEZyb206IHN0cmluZztcclxuXHJcblx0QElucHV0KClcclxuXHRyZWFkT25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHJlc2V0Rm9ybTogU3ViamVjdDxib29sZWFuPjtcclxuXHJcblx0QElucHV0KClcclxuXHR2YWxpZGF0b3JGb3JtQ29udHJvbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRkb25lOiBFdmVudEVtaXR0ZXI8XHJcblx0XHRDb21wb25lbnRPdXRwdXRTdGF0dXM8SW5mb0FuYWdyYWZpY2hlUEZEVE8+XHJcblx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50T3V0cHV0U3RhdHVzPEluZm9BbmFncmFmaWNoZVBGRFRPPj4oKTtcclxuXHJcblx0Zm9ybTogRm9ybUdyb3VwO1xyXG5cdHBmU3ViOiBTdWJzY3JpcHRpb247XHJcblx0dmFsaWRhdGlvblN1YjogU3Vic2NyaXB0aW9uO1xyXG5cdHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRjb2RpY2VSZWdpb25lOiBzdHJpbmcgPSBcIlwiO1xyXG5cclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcml2YXRlIG1zZzogTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZSxcclxuXHRcdHByaXZhdGUgY2ZTZXJ2aWNlOiBDb2RpY2VGaXNjYWxlU2VydmljZSxcclxuXHRcdHByaXZhdGUgZGVsZWdoZVNlcnZpY2U6IERlbGVnaGVTZXJ2aWNlXHJcblx0KSB7IH1cclxuXHJcblx0bmdPbkluaXQoKSB7XHJcblxyXG5cdFx0Ly8gY29uc29sZS5sb2coJ1tJbmZvQW5hZ3JhZmljaGVQRkRUT10nLCB0aGlzLmluZm9wZik7XHJcblxyXG5cdFx0dGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XHJcblxyXG5cdFx0aWYgKHRoaXMucmVzZXRGb3JtKSB7XHJcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5yZXNldEZvcm0uc3Vic2NyaWJlKHZhbCA9PlxyXG5cdFx0XHRcdHZhbCA/IHRoaXMucHVsaXNjaUZvcm0oKSA6IFwiXCIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGhpcy5pbmZvcGYpIHtcclxuXHRcdFx0dGhpcy5pbml0SW5mb1BmKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY2ZWYWxpZGF0b3JzID0gW1xyXG5cdFx0XHRWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG5cdFx0XHRWYWxpZGF0aW9uU2VydmljZS5wYXR0ZXJuKFxyXG5cdFx0XHRcdFZhbGlkYXRpb25TZXJ2aWNlLmNvZGljZUZpc2NhbGUsXHJcblx0XHRcdFx0XCJjZkludmFsaWRvRm9ybWFsbWVudGVcIlxyXG5cdFx0XHQpLFxyXG5cdFx0XTtcclxuXHJcblx0XHRpZiAodGhpcy5jZkRpZmZlcmVudEZyb20gIT0gbnVsbCkge1xyXG5cdFx0XHRjZlZhbGlkYXRvcnMucHVzaChcclxuXHRcdFx0XHRWYWxpZGF0aW9uU2VydmljZS5Ob3RFcXVhbHMoXHJcblx0XHRcdFx0XHR0aGlzLmNmRGlmZmVyZW50RnJvbSxcclxuXHRcdFx0XHRcdFwiY2ZEaWZmZXJlbnRSaWNoaWVkZW50ZVwiXHJcblx0XHRcdFx0KVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnN0IGNvZGljZUZpc2NhbGUgPSBuZXcgRm9ybUNvbnRyb2woXHJcblx0XHRcdHsgdmFsdWU6IHRoaXMuaW5mb3BmLmNvZEZpc2NhbGUsIGRpc2FibGVkOiBmYWxzZSB9LFxyXG5cdFx0XHQvLyBjZlZhbGlkYXRvcnNcclxuXHRcdFx0Ly8gdGhpcy52YWxpZGF0b3JGb3JtQ29udHJvbCA/IGNmVmFsaWRhdG9yczogVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yLFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0dGhpcy52YWxpZGF0b3JGb3JtQ29udHJvbCA/IFZhbGlkYXRvcnMucmVxdWlyZWQgOiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3IsXHJcblx0XHRcdFx0VmFsaWRhdGlvblNlcnZpY2UucGF0dGVybihcclxuXHRcdFx0XHRcdFZhbGlkYXRpb25TZXJ2aWNlLmNvZGljZUZpc2NhbGUsXHJcblx0XHRcdFx0XHRcImNmSW52YWxpZG9Gb3JtYWxtZW50ZVwiXHJcblx0XHRcdFx0KSxcclxuXHRcdFx0XVxyXG5cdFx0XHQvL1RPRE9cclxuXHRcdFx0Ly8gW3RoaXMudmFsaWRhdGlvblNlcnZpY2UudXNlclZhbGlkYXRvcihUaXBpUGVyc29uYS5QRVJTT05BX0ZJU0lDQSldXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuZm9ybS5hZGRDb250cm9sKFwiY29kaWNlRmlzY2FsZVwiLCBjb2RpY2VGaXNjYWxlKTtcclxuXHJcblx0XHRjb25zdCBub21lID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6IHRoaXMuaW5mb3BmLm5vbWUsIGRpc2FibGVkOiBmYWxzZSB9LFxyXG5cdFx0XHRbXHJcblx0XHRcdFx0Ly8gVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuXHRcdFx0XHQvL1x0VmFsaWRhdGlvblNlcnZpY2UuVmFsaWRhdGVOYW1lLFxyXG5cdFx0XHRcdHRoaXMudmFsaWRhdG9yRm9ybUNvbnRyb2wgPyBWYWxpZGF0b3JzLnJlcXVpcmVkIDogVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yLFxyXG5cdFx0XHRcdFZhbGlkYXRpb25TZXJ2aWNlLnBhdHRlcm4oVmFsaWRhdGlvblNlcnZpY2UuZm9ybWF0b05hbWUsIFwiZm9ybWF0b05hbWVcIilcclxuXHRcdFx0XSk7XHJcblx0XHR0aGlzLmZvcm0uYWRkQ29udHJvbChcIm5vbWVcIiwgbm9tZSk7XHJcblxyXG5cdFx0Y29uc3QgY29nbm9tZSA9IG5ldyBGb3JtQ29udHJvbChcclxuXHRcdFx0eyB2YWx1ZTogdGhpcy5pbmZvcGYuY29nbm9tZSwgZGlzYWJsZWQ6IGZhbHNlIH0sXHJcblx0XHRcdFtcclxuXHRcdFx0XHQvL1ZhbGlkYXRvcnMucmVxdWlyZWQsXHJcblx0XHRcdFx0Ly9WYWxpZGF0aW9uU2VydmljZS5WYWxpZGF0ZU5hbWVcclxuXHRcdFx0XHR0aGlzLnZhbGlkYXRvckZvcm1Db250cm9sID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IFZhbGlkYXRvcnMubnVsbFZhbGlkYXRvcixcclxuXHRcdFx0XHRWYWxpZGF0aW9uU2VydmljZS5wYXR0ZXJuKFZhbGlkYXRpb25TZXJ2aWNlLmZvcm1hdG9OYW1lLCBcImZvcm1hdG9OYW1lXCIpXHJcblx0XHRcdF0pO1xyXG5cdFx0dGhpcy5mb3JtLmFkZENvbnRyb2woXCJjb2dub21lXCIsIGNvZ25vbWUpO1xyXG5cclxuXHRcdC8vIFRPRE9cclxuXHRcdC8vIHRoaXMudmFsaWRhdGlvblN1YiA9IGNvZGljZUZpc2NhbGUudmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHQvLyBcdGZpbHRlcih2YWwgPT4gdmFsLmxlbmd0aCA9PSAxNiksXHJcblx0XHQvLyBcdGF1ZGl0VGltZSg1MDApXHJcblx0XHQvLyApXHJcblx0XHQvLyBcdC5waXBlKFxyXG5cdFx0Ly8gXHRcdHRhcCgoXykgPT4ge1xyXG5cdFx0Ly8gXHRcdFx0aWYgKGNvZGljZUZpc2NhbGUuZXJyb3JzKSB7XHJcblx0XHQvLyBcdFx0XHRcdGRlbGV0ZSBjb2RpY2VGaXNjYWxlLmVycm9yc1tcImludmFsaWRDRlwiXTtcclxuXHRcdC8vIFx0XHRcdH1cclxuXHRcdC8vIFx0XHR9KSxcclxuXHRcdC8vIFx0XHRmaWx0ZXIoKGNmKSA9PiBjb2RpY2VGaXNjYWxlLnZhbGlkKSxcclxuXHRcdC8vIFx0XHRzd2l0Y2hNYXAoKGNmKSA9PlxyXG5cdFx0Ly8gXHRcdFx0Ly9UT0RPXHJcblx0XHQvLyBcdFx0XHQvLyB0aGlzLmNmU2VydmljZVxyXG5cdFx0Ly8gXHRcdFx0Ly8gXHQudmFsaWRhQ29kaWNlRmlzY2FsZSQoY2YsIFwiRlwiKVxyXG5cdFx0Ly8gXHRcdFx0Ly8gXHQucGlwZShjYXRjaEVycm9yKChlcnIpID0+IGVtcHR5KCkpKVxyXG5cdFx0Ly8gXHRcdFx0dGhpcy5kZWxlZ2hlU2VydmljZS5nZXRQZXJzb25hRmlzY2FsZUNvZGljZUZpc2NhbGUoY2YpXHJcblx0XHQvLyBcdFx0XHRcdC5waXBlKFxyXG5cdFx0Ly8gXHRcdFx0XHRcdC8vVE9ET1xyXG5cdFx0Ly8gXHRcdFx0XHRcdC8vIGNhdGNoRXJyb3IoKGVycikgPT4gZW1wdHkoKSlcclxuXHRcdC8vIFx0XHRcdFx0XHRjYXRjaEVycm9yKGVyciA9PiB7XHJcblx0XHQvLyBcdFx0XHRcdFx0XHRjb2RpY2VGaXNjYWxlLnNldEVycm9ycyh7IGludmFsaWRDRjogdHJ1ZSB9KTtcclxuXHRcdC8vIFx0XHRcdFx0XHRcdHJldHVybiBFTVBUWTtcclxuXHRcdC8vIFx0XHRcdFx0XHR9KVxyXG5cdFx0Ly8gXHRcdFx0XHQpXHJcblx0XHQvLyBcdFx0KSxcclxuXHRcdC8vIFx0XHR0YXAoKHZhbGlkYXRpb25SZXN1bHQpID0+IHtcclxuXHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKCdbdmFsaWRhdGlvblJlc3VsdF0nLCB2YWxpZGF0aW9uUmVzdWx0KTtcclxuXHRcdC8vIFx0XHRcdC8vIGlmICghdmFsaWRhdGlvblJlc3VsdC52YWxpZCkge1xyXG5cdFx0Ly8gXHRcdFx0aWYgKHZhbGlkYXRpb25SZXN1bHQgPT0gbnVsbCkge1xyXG5cdFx0Ly8gXHRcdFx0XHRjb2RpY2VGaXNjYWxlLnNldEVycm9ycyh7IGludmFsaWRDRjogdHJ1ZSB9KTtcclxuXHRcdC8vIFx0XHRcdH0gZWxzZSB7XHJcblx0XHQvLyBcdFx0XHRcdGlmICh2YWxpZGF0aW9uUmVzdWx0LnJlc2lkZW56YSAhPSB1bmRlZmluZWQpIHtcclxuXHRcdC8vIFx0XHRcdFx0XHR0aGlzLmNvZGljZVJlZ2lvbmUgPSB2YWxpZGF0aW9uUmVzdWx0Py5yZXNpZGVuemE/LnJlZ2lvbmU/LnNpZ2xhO1xyXG5cdFx0Ly8gXHRcdFx0XHR9XHJcblx0XHQvLyBcdFx0XHR9XHJcblx0XHQvLyBcdFx0XHR0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0Ly8gXHRcdH0pXHJcblx0XHQvLyBcdClcclxuXHRcdC8vIFx0LnN1YnNjcmliZSgpO1xyXG5cclxuXHRcdGNvbnN0IGNoYW5nZXMkID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRtYXAoKF8pID0+IHtcclxuXHRcdFx0XHR0aGlzLnJlbW92ZVNwYWNlKHRoaXMuZm9ybS5jb250cm9sc1tcImNvZGljZUZpc2NhbGVcIl0udmFsdWUpO1xyXG5cdFx0XHRcdGNvbnN0IHBmID0gbmV3IEluZm9BbmFncmFmaWNoZVBGRFRPKCk7XHJcblx0XHRcdFx0cGYuY29kRmlzY2FsZSA9IHRoaXMuZm9ybS5jb250cm9sc1tcImNvZGljZUZpc2NhbGVcIl0udmFsdWU7XHJcblx0XHRcdFx0cGYubm9tZSA9IHRoaXMuZm9ybS5jb250cm9sc1tcIm5vbWVcIl0udmFsdWU7XHJcblx0XHRcdFx0cGYuY29nbm9tZSA9IHRoaXMuZm9ybS5jb250cm9sc1tcImNvZ25vbWVcIl0udmFsdWU7XHJcblx0XHRcdFx0cGYuY29kaWNlUmVnaW9uZSA9IHRoaXMuY29kaWNlUmVnaW9uZTtcclxuXHRcdFx0XHRyZXR1cm4gcGY7XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRzdGFydFdpdGgodGhpcy5pbmZvcGYpLFxyXG5cdFx0XHRtYXAoKHBmKSA9PiB7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXHJcblx0XHRcdFx0Ly8gXHRcInBmIGZvcm0gdmFsaWRcIixcclxuXHRcdFx0XHQvLyBcdEZvcm1VdGlscy5nZXRGb3JtVmFsaWRhdGlvbkVycm9ycyh0aGlzLmZvcm0pXHJcblx0XHRcdFx0Ly8gKTtcclxuXHJcblx0XHRcdFx0Y29uc3Qgc3RhdHVzID0gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKFxyXG5cdFx0XHRcdFx0IXRoaXMuZm9ybS5pbnZhbGlkIHx8IHRoaXMucmVhZE9ubHkgPT0gdHJ1ZSxcclxuXHRcdFx0XHRcdHBmXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInN0YXR1c1wiLCBzdGF0dXMpO1xyXG5cdFx0XHRcdHJldHVybiBzdGF0dXM7XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMucGZTdWIgPSBjaGFuZ2VzJC5zdWJzY3JpYmUoKF8pID0+IHRoaXMuZG9uZS5lbWl0KF8pKTtcclxuXHJcblx0XHRpZiAodGhpcy5yZWFkT25seSkge1xyXG5cdFx0XHR0aGlzLmZvcm0uZGlzYWJsZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZW1vdmVTcGFjZSh2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR2YXIgcmVXaGl0ZVNwYWNlID0gL1xccy9nO1xyXG5cdFx0aWYgKHJlV2hpdGVTcGFjZS50ZXN0KHZhbHVlKSkge1xyXG5cdFx0XHR0aGlzLmZvcm0uZ2V0KCdjb2RpY2VGaXNjYWxlJykuc2V0VmFsdWUodmFsdWUucmVwbGFjZShyZVdoaXRlU3BhY2UsICcnKSk7IFxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5wZlN1Yikge1xyXG5cdFx0XHR0aGlzLnBmU3ViLnVuc3Vic2NyaWJlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMudmFsaWRhdGlvblN1Yikge1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRpb25TdWIudW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGluaXRJbmZvUGYoKSB7XHJcblx0XHRjb25zdCBpbmZvUGZOZXcgPSBuZXcgSW5mb0FuYWdyYWZpY2hlUEZEVE8oKTtcclxuXHRcdC8vVE9ET1xyXG5cdFx0Ly8gaWYgKHRoaXMudXNlckRldGFpbCkge1xyXG5cdFx0Ly8gXHRpbmZvUGZOZXcuY29kRmlzY2FsZSA9IHRoaXMudXNlckRldGFpbFtcImZpc2NhbE51bWJlclwiXTtcclxuXHRcdC8vIFx0aW5mb1BmTmV3LmNvZ25vbWUgPSB0aGlzLnVzZXJEZXRhaWxbXCJmYW1pbHlOYW1lXCJdO1xyXG5cdFx0Ly8gXHRpbmZvUGZOZXcubm9tZSA9IHRoaXMudXNlckRldGFpbFtcIm5hbWVcIl07XHJcblx0XHQvLyB9XHJcblx0XHR0aGlzLmluZm9wZiA9IGluZm9QZk5ldztcclxuXHR9XHJcblxyXG5cdHB1bGlzY2lGb3JtKCkge1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuZm9ybS52YWx1ZSk7XHJcblx0XHRrZXlzLmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0Y29uc3QgY29udHJvbDogQWJzdHJhY3RDb250cm9sID0gdGhpcy5mb3JtLmdldChrZXkpO1xyXG5cdFx0XHRjb250cm9sLnNldFZhbHVlKFwiXCIpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgX3Jlc2V0Rm9ybSgpIHtcclxuXHRcdHRoaXMuZm9ybT8ucmVzZXQoKTtcclxuXHR9XHJcbn0iXX0=