@infordata-web/portal-common-component-lib
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.14.
185 lines • 31.9 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, Input, Output } from '@angular/core';
import { FormControl, FormGroup } from '@angular/forms';
import { of } from 'rxjs';
import { map, startWith } from 'rxjs/operators';
import { DatiDepositoGiudiziarioDTO } from '../../models/dati-deposito-giudiziario-dto';
import { ComponentOutputStatus } from '../../normalizzazione/component-output-status';
import { DelegheService } from '../../services/deleghe-services/deleghe.service';
import { MessageService } from '../../services/message.service';
export class DatiDeposito {
constructor(msg, _ref, delegheService) {
this.msg = msg;
this._ref = _ref;
this.delegheService = delegheService;
this.rst_mock = [
{
"codiceFiscale": "TR",
"codiceOrdinante": "Terni",
"dataFine": new Date('10/06/2025'),
"dataInizio": new Date('10/06/2025'),
"denominazioneRTS": "RTS 1",
"provinceCompetenza": ["TR"]
},
{
"codiceFiscale": "RM",
"codiceOrdinante": "Roma",
"dataFine": new Date('10/06/2025'),
"dataInizio": new Date('10/06/2025'),
"denominazioneRTS": "RTS 1",
"provinceCompetenza": ["TR"]
},
{
"codiceFiscale": "MI",
"codiceOrdinante": "Milano",
"dataFine": new Date('10/06/2025'),
"dataInizio": new Date('10/06/2025'),
"denominazioneRTS": "RTS 1",
"provinceCompetenza": ["TR"]
}
];
//TODO
// DatiDepositoDTO
// DatiDepositoGiudiziarioDTO
// DatiDepositoNoEsproprioDTO
this.datiDeposito = {};
this.visibilityMask = {};
this.nextStep = new EventEmitter();
this.previousStep = new EventEmitter();
this.salvaBozza = new EventEmitter();
this.direction = "both-ways";
this.isFinal = false;
}
isImportoFormatoValidoOLD(valoreImporto) {
return /^(?:[0-9]+|(?:[0-9]{1,3}\.?)+)(?:,[0-9]{1,2})?€?$/
.test(valoreImporto);
42;
}
currencyToNumber(s) {
return Number(s.replace(/\./g, '').replace(',', '.') || undefined);
}
isImportoFormatoValido(valoreImporto) {
return /^(?:0|[1-9](?:[0-9]{0,2}\.[0-9]{3}(?:\.[0-9]{3})*|[0-9]*))(?:,[0-9]{2,2})€?$/
.test(valoreImporto);
}
ngAfterViewInit() {
this._ref.detectChanges();
}
ngOnInit() {
this.form = new FormGroup({
'causale': new FormControl({ value: '', disabled: !this.visibilityMask.causale }, c => {
if (!this.visibilityMask.causale)
return {};
return String(c.value || '').length > 0
? {}
: { 'required': 'Il campo è obbligatorio.' };
}),
'importo': new FormControl({ value: '', disabled: !this.visibilityMask.importo }, c => {
if (!this.visibilityMask.importo)
return {};
// return this.isImportoFormatoValido(c.value)
return this.isImportoFormatoValido(c.value)
? {}
: { 'pattern': 'Formato non valido' };
}),
'rts-inoltro': new FormControl({ value: '', disabled: !this.visibilityMask.codiceRtsInoltro }, c => {
if (!this.visibilityMask.codiceRtsInoltro)
return {};
return String(c.value || '').length > 0
? {}
: { 'required': 'Il campo è obbligatorio.' };
}),
'nota': new FormControl({ value: '', disabled: !this.visibilityMask.nota }, c => {
if (!this.visibilityMask.nota)
return {};
// return String(c.value).trim().length > 0
// ? {}
// : { 'required': 'Il campo è obbligatorio.' };
})
});
let valid = true;
if (!this.datiDeposito) {
this.initDatiDeposito();
valid = false;
}
this._rts = this.rst_mock;
this.listaRts$ = of(this.rst_mock);
this.rts$ = of(this.rst_mock);
// this.listaRts$.subscribe(
// (rts) => {
// console.log('[listaRts$]', rts);
// if (rts != null) {
// this.rts$ = this.delegheService.getListRtsCodiceRegione(rts);
// this.rts$.subscribe(_rts => {
// this._rts = _rts;
// //console.log("_rts" + JSON.stringify(this._rts))
// });
// }
// }
// );
this.form.controls['causale'].setValue(this.datiDeposito.causale);
this.form.controls['importo'].setValue(this.datiDeposito.importo);
this.form.controls['rts-inoltro'].setValue(this.datiDeposito.codiceRtsInoltro);
this.form.controls['nota'].setValue(this.datiDeposito.nota);
const changes$ = this.form.valueChanges.pipe(map(_ => {
var _a;
const dati = new DatiDepositoGiudiziarioDTO();
dati.causale = this.form.controls['causale'].value;
if (this.form.controls['importo'].value != undefined) {
dati.importo = this.currencyToNumber(this.form.controls['importo'].value);
}
dati.codiceRtsInoltro = this.form.controls['rts-inoltro'].value;
if ((dati === null || dati === void 0 ? void 0 : dati.codiceRtsInoltro) && (this === null || this === void 0 ? void 0 : this._rts)) {
dati.denominazioneRTS = (_a = this._rts.find(x => x.codiceFiscale == (dati === null || dati === void 0 ? void 0 : dati.codiceRtsInoltro))) === null || _a === void 0 ? void 0 : _a.denominazioneRTS;
}
dati.nota = this.form.controls['nota'].value;
this.datiDeposito = dati;
// console.log("[dati]", this.form);
return ComponentOutputStatus.of(this.form.valid, this.datiDeposito);
}), startWith(ComponentOutputStatus.of(valid, this.datiDeposito)));
this.subscription = changes$.subscribe(newDati => console.log('[DatiDepositoComponent] datiSpecificiDeposito', newDati));
}
forward($event) {
this.nextStep.emit(this.datiDeposito);
}
backward($event) {
this.previousStep.emit(this.datiDeposito);
}
onSalvaBozza($event) {
this.salvaBozza.emit(this.datiDeposito);
}
complete($event) { }
isFormValid() {
return this.form.valid;
}
initDatiDeposito() {
//TODO
//this.datiDeposito = new DatiDepositoDTO() as T;
this.datiDeposito = new DatiDepositoGiudiziarioDTO();
}
ngOnDestroy() {
if (this.subscription) {
this.subscription.unsubscribe();
}
}
}
DatiDeposito.decorators = [
{ type: Component, args: [{
selector: 'lib-dati-deposito',
template: "<div class=\"mt-3 mb-5\">\r\n\t\t<mat-expansion-panel class=\"panel\" [expanded]=\"true\">\r\n\t\t\t<mat-expansion-panel-header [collapsedHeight]=\"'48px'\" [expandedHeight]=\"'48px'\" class=\"custom-header\">\r\n\t\t\t\t<mat-panel-title>\r\n\t\t\t\t\t<h3 class=\"h5 mb-0\"><info-tip-label label=\"dati-deposito\"></info-tip-label></h3>\r\n\t\t\t\t</mat-panel-title>\r\n\t\t\t</mat-expansion-panel-header>\r\n\t\t\t<form [formGroup]=\"form\">\r\n\t\t\t\t<div class=\"collapse-body mt-2\">\r\n\t\t\t\t\t<div class=\"row\" *ngIf=\"visibilityMask.causale\">\r\n\t\t\t\t\t\t<div class=\"col-md-12\">\r\n\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t<input matInput\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"{{ 'required' | traduzione }}{{ 'dati-deposito-causale' | traduzione }}\"\r\n\t\t\t\t\t\t\t\t\tformControlName=\"causale\"\r\n\t\t\t\t\t\t\t\t\tmaxlength=\"127\"\r\n\t\t\t\t\t\t\t\t\t#testoCausale>\r\n\t\t\t\t\t\t\t\t<mat-error *ngIf=\"form.touched && form.controls['causale'].invalid\">\r\n\t\t\t\t\t\t\t\t\t{{ msg.produceMessage('required', form.controls['causale']) | traduzione }}\r\n\t\t\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t\t\t\t<mat-hint *infoTip=\"'dati-deposito-causale'\"></mat-hint>\r\n\t\t\t\t\t\t\t\t<mat-hint align=\"end\">{{testoCausale.value.length}} / 127</mat-hint>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"row\">\r\n\t\t\t\t\t\t<div class=\"col-md-4\" *ngIf=\"visibilityMask.importo\">\r\n\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t<input matInput\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"{{'required' | traduzione }}{{'inserire-importo' | traduzione}}\"\r\n\t\t\t\t\t\t\t\t\tformControlName=\"importo\">\r\n\t\t\t\t\t\t\t\t\t<span matPrefix>€</span>\r\n\t\t\t\t\t\t\t\t<mat-error *ngIf=\"form.touched && form.controls['importo'].invalid\">\r\n\t\t\t\t\t\t\t\t\t{{ msg.produceMessage('required', form.controls['importo']) | traduzione }}\r\n\t\t\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t\t\t\t<mat-hint *infoTip=\"'inserire-importo'\"></mat-hint>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"col-md-4\" *ngIf=\"visibilityMask.codiceRtsInoltro\">\r\n\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t<mat-label>{{ 'required' | traduzione }}{{ 'dati-deposito-rts-inoltro' | traduzione }}</mat-label>\r\n\t\t\t\t\t\t\t\t<mat-select placeholder=\"{{'seleziona' | traduzione}}\" formControlName=\"rts-inoltro\">\r\n\t\t\t\t\t\t\t\t\t<mat-option\r\n\t\t\t\t\t\t\t\t\t\t*ngFor=\"let rts of rts$ | async\"\r\n\t\t\t\t\t\t\t\t\t\t[value]=\"rts.codiceFiscale\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{{ rts.denominazioneRTS }}\r\n\t\t\t\t\t\t\t\t\t</mat-option>\r\n\t\t\t\t\t\t\t\t\t<!-- <mat-option\r\n\t\t\t\t\t\t\t\t\t\t*ngFor=\"let rts of listaRts\"\r\n\t\t\t\t\t\t\t\t\t\t[value]=\"rts.codiceFiscale\"\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{{ rts.codiceFiscale }}\r\n\t\t\t\t\t\t\t\t</mat-option> -->\r\n\t\t\t\t\t\t\t\t</mat-select>\r\n\t\t\t\t\t\t\t\t<mat-error *ngIf=\"form.controls['rts-inoltro'].invalid\">\r\n\t\t\t\t\t\t\t\t\t{{ msg.produceMessage('required', form.controls['rts-inoltro']) | traduzione }}\r\n\t\t\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t\t\t\t<mat-hint *infoTip=\"'dati-deposito-rts-inoltro'\"></mat-hint>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class=\"row\" *ngIf=\"visibilityMask.nota\">\r\n\t\t\t\t\t\t<div class=\"col-md-12\">\r\n\t\t\t\t\t\t\t<mat-form-field>\r\n\t\t\t\t\t\t\t\t<textarea \r\n\t\t\t\t\t\t\t\t matInput\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"{{ 'dati-deposito-nota' | traduzione }}\"\r\n\t\t\t\t\t\t\t\t\tformControlName=\"nota\"\r\n\t\t\t\t\t\t\t\t\tmaxlength=\"511\"\r\n\t\t\t\t\t\t\t\t\t#testo>\r\n\t\t\t\t\t\t\t\t</textarea>\r\n\t\t\t\t\t\t\t\t<mat-error *ngIf=\"form.touched && form.controls['nota'].invalid\">\r\n\t\t\t\t\t\t\t\t\t{{ msg.produceMessage('required', form.controls['nota']) | traduzione }}\r\n\t\t\t\t\t\t\t\t</mat-error>\r\n\t\t\t\t\t\t\t\t<mat-hint *infoTip=\"'dati-deposito-nota'\"></mat-hint>\r\n\t\t\t\t\t\t\t\t<mat-hint align=\"end\">{{testo.value.length}} / 511</mat-hint>\r\n\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</form>\r\n\t\t</mat-expansion-panel>\r\n\t<lib-stepper-navigator\r\n\t\t[form]=\"form\"\r\n\t\t[direction]=\"direction\"\r\n\t\t[isFinal]=\"isFinal\"\r\n\t\t[isContainerValid]=\"isFormValid()\"\r\n\t\t(goForward)=\"forward($event)\"\r\n\t\t(goBackward)=\"backward($event)\"\r\n\t\t(salvaBozza)=\"onSalvaBozza($event)\"\r\n\t\t(complete)=\"complete($event)\"\r\n\t>\r\n\t</lib-stepper-navigator>\r\n</div>\r\n",
styles: [".mat-card{border-radius:0!important;border-top:5px solid #0a2644}.divider{background-color:#737373;height:1px;width:100%}.mat-form-field-appearance-fill .mat-form-field-flex{background-color:#fff!important}.mat-select-value{max-width:100%;width:100%!important}"]
},] }
];
DatiDeposito.ctorParameters = () => [
{ type: MessageService },
{ type: ChangeDetectorRef },
{ type: DelegheService }
];
DatiDeposito.propDecorators = {
datiDeposito: [{ type: Input }],
visibilityMask: [{ type: Input }],
listaRts$: [{ type: Input }],
nextStep: [{ type: Output }],
previousStep: [{ type: Output }],
salvaBozza: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0aS1kZXBvc2l0by5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi1zb2Z0d2FyZWZhY3RvcnkvY29tbW9uLWNvbXBvbmVudC1saWIvcHJvamVjdHMvcG9ydGFsLWNvbW1vbi1jb21wb25lbnQtbGliL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kZXBvc2l0aS9jb21wb25lbnRzL2RhdGktZGVwb3NpdG8vZGF0aS1kZXBvc2l0by5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFjLEVBQUUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV4RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBZ0JoRSxNQUFNLE9BQU8sWUFBWTtJQXlGeEIsWUFDUyxHQUFtQixFQUNuQixJQUF1QixFQUN2QixjQUE4QjtRQUY5QixRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQUNuQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUF6Ri9CLGFBQVEsR0FBVTtZQUN4QjtnQkFDQyxlQUFlLEVBQUUsSUFBSTtnQkFDckIsaUJBQWlCLEVBQUUsT0FBTztn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LENBQUMsRUFBRSxDQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxFQUFFLE9BQU8sQ0FBQyxDQUNyRSxDQUFDO0lBRUgsQ0FBQztJQUVELE9BQU8sQ0FBQyxNQUFXO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQVc7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxZQUFZLENBQUMsTUFBVztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFXLElBQUksQ0FBQztJQUV6QixXQUFXO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2YsTUFBTTtRQUNOLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksMEJBQTBCLEVBQU8sQ0FBQztJQUMzRCxDQUFDO0lBRUQsV0FBVztRQUNWLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2hDO0lBQ0YsQ0FBQzs7O1lBak9ELFNBQVMsU0FDVDtnQkFDQyxRQUFRLEVBQUUsbUJBQW1CO2dCQUMzQiwwaUpBQTZDOzthQUUvQzs7O1lBZE8sY0FBYztZQVJDLGlCQUFpQjtZQU9oQyxjQUFjOzs7MkJBb0RyQixLQUFLOzZCQUdMLEtBQUs7d0JBTUwsS0FBSzt1QkFHTCxNQUFNOzJCQUtOLE1BQU07eUJBS04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGF0aURlcG9zaXRvR2l1ZGl6aWFyaW9EVE8gfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0aS1kZXBvc2l0by1naXVkaXppYXJpby1kdG8nO1xyXG5pbXBvcnQgeyBSdHNEVE8gfSBmcm9tICcuLi8uLi9tb2RlbHMvcnRzLWR0byc7XHJcbmltcG9ydCB7IENvbXBvbmVudE91dHB1dFN0YXR1cyB9IGZyb20gJy4uLy4uL25vcm1hbGl6emF6aW9uZS9jb21wb25lbnQtb3V0cHV0LXN0YXR1cyc7XHJcbmltcG9ydCB7IERlbGVnaGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGVsZWdoZS1zZXJ2aWNlcy9kZWxlZ2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21lc3NhZ2Uuc2VydmljZSc7XHJcblxyXG50eXBlIERhdGlEZXBvc2l0b0dlbmVyaWMgPSBrZXlvZiBEYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUTztcclxuLy8gVE9ETzogdXNhcmUgUmVjb3JkPCw+IHBlciBpIGRpdmVyc2kgdGlwaSBkaSBEYXRpRGVwb3NpdG9cclxuXHJcbmV4cG9ydCB0eXBlIERhdGlEZXBvc2l0b1Zpc2liaWxpdHlNYXNrID1cclxuXHR7IFtrIGluIERhdGlEZXBvc2l0b0dlbmVyaWNdOiBib29sZWFuXHJcblx0fTtcclxuXHJcbkBDb21wb25lbnQoXHJcblx0e1xyXG5cdFx0c2VsZWN0b3I6ICdsaWItZGF0aS1kZXBvc2l0bydcclxuXHRcdCwgdGVtcGxhdGVVcmw6ICcuL2RhdGktZGVwb3NpdG8uY29tcG9uZW50Lmh0bWwnXHJcblx0XHQsIHN0eWxlVXJsczogWycuL2RhdGktZGVwb3NpdG8uY29tcG9uZW50LmNzcyddXHJcblx0fVxyXG4pXHJcbmV4cG9ydCBjbGFzcyBEYXRpRGVwb3NpdG88VCBleHRlbmRzIERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPIHwgbnVsbD5cclxuXHRpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuXHJcblx0XHRwdWJsaWMgcnN0X21vY2s6IGFueVtdID0gW1xyXG5cdFx0XHR7XHJcblx0XHRcdFx0XCJjb2RpY2VGaXNjYWxlXCI6IFwiVFJcIixcclxuXHRcdFx0XHRcImNvZGljZU9yZGluYW50ZVwiOiBcIlRlcm5pXCIsXHJcblx0XHRcdFx0XCJkYXRhRmluZVwiOiBuZXcgRGF0ZSgnMTAvMDYvMjAyNScpLFxyXG5cdFx0XHRcdFwiZGF0YUluaXppb1wiOiBuZXcgRGF0ZSgnMTAvMDYvMjAyNScpLFxyXG5cdFx0XHRcdFwiZGVub21pbmF6aW9uZVJUU1wiOiBcIlJUUyAxXCIsXHJcblx0XHRcdFx0XCJwcm92aW5jZUNvbXBldGVuemFcIjogW1wiVFJcIl1cclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdFwiY29kaWNlRmlzY2FsZVwiOiBcIlJNXCIsXHJcblx0XHRcdFx0XCJjb2RpY2VPcmRpbmFudGVcIjogXCJSb21hXCIsXHJcblx0XHRcdFx0XCJkYXRhRmluZVwiOiBuZXcgRGF0ZSgnMTAvMDYvMjAyNScpLFxyXG5cdFx0XHRcdFwiZGF0YUluaXppb1wiOiBuZXcgRGF0ZSgnMTAvMDYvMjAyNScpLFxyXG5cdFx0XHRcdFwiZGVub21pbmF6aW9uZVJUU1wiOiBcIlJUUyAxXCIsXHJcblx0XHRcdFx0XCJwcm92aW5jZUNvbXBldGVuemFcIjogW1wiVFJcIl1cclxuXHRcdFx0fSxcclxuXHRcdFx0e1xyXG5cdFx0XHRcdFwiY29kaWNlRmlzY2FsZVwiOiBcIk1JXCIsXHJcblx0XHRcdFx0XCJjb2RpY2VPcmRpbmFudGVcIjogXCJNaWxhbm9cIixcclxuXHRcdFx0XHRcImRhdGFGaW5lXCI6IG5ldyBEYXRlKCcxMC8wNi8yMDI1JyksXHJcblx0XHRcdFx0XCJkYXRhSW5pemlvXCI6IG5ldyBEYXRlKCcxMC8wNi8yMDI1JyksXHJcblx0XHRcdFx0XCJkZW5vbWluYXppb25lUlRTXCI6IFwiUlRTIDFcIixcclxuXHRcdFx0XHRcInByb3ZpbmNlQ29tcGV0ZW56YVwiOiBbXCJUUlwiXVxyXG5cdFx0XHR9XHJcblx0XVxyXG5cclxuXHQvL1RPRE9cclxuXHQvLyBEYXRpRGVwb3NpdG9EVE9cclxuXHQvLyBEYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUT1xyXG5cdC8vIERhdGlEZXBvc2l0b05vRXNwcm9wcmlvRFRPXHJcblxyXG5cdEBJbnB1dCgpIGRhdGlEZXBvc2l0bzogVCA9XHJcblx0XHR7fSBhcyBUO1xyXG5cclxuXHRASW5wdXQoKSB2aXNpYmlsaXR5TWFzazogRGF0aURlcG9zaXRvVmlzaWJpbGl0eU1hc2sgPVxyXG5cdFx0e30gYXMgRGF0aURlcG9zaXRvVmlzaWJpbGl0eU1hc2s7XHJcblxyXG5cdC8vIEBJbnB1dCgpXHJcblx0Ly8gbGlzdGFSdHMkOiBPYnNlcnZhYmxlPEFycmF5PFJ0c0RUTz4+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdGxpc3RhUnRzJDogT2JzZXJ2YWJsZTxBcnJheTxzdHJpbmc+PjtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0bmV4dFN0ZXA6IEV2ZW50RW1pdHRlcjxEYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUTz4gPSBuZXcgRXZlbnRFbWl0dGVyPFxyXG5cdFx0RGF0aURlcG9zaXRvR2l1ZGl6aWFyaW9EVE9cclxuXHQ+KCk7XHJcblxyXG5cdEBPdXRwdXQoKVxyXG5cdHByZXZpb3VzU3RlcDogRXZlbnRFbWl0dGVyPERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPPiA9IG5ldyBFdmVudEVtaXR0ZXI8XHJcblx0XHREYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUT1xyXG5cdD4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0c2FsdmFCb3p6YTogRXZlbnRFbWl0dGVyPERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPPiA9IG5ldyBFdmVudEVtaXR0ZXI8XHJcblx0XHREYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUT1xyXG5cdD4oKTtcclxuXHJcblx0Ly8gVE9ET1xyXG5cdC8vIEBJbnB1dCgpXHJcblx0Ly8gcnRzJDogT2JzZXJ2YWJsZTxBcnJheTxUaXBvbG9naWNhRFRPPj47XHJcblxyXG5cdGZvcm06IEZvcm1Hcm91cDtcclxuXHRkaXJlY3Rpb246IHN0cmluZyA9IFwiYm90aC13YXlzXCI7XHJcblx0aXNGaW5hbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cdHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRydHMkOiBPYnNlcnZhYmxlPEFycmF5PFJ0c0RUTz4+O1xyXG5cclxuXHRfcnRzOiBBcnJheTxSdHNEVE8+O1xyXG5cclxuXHRpc0ltcG9ydG9Gb3JtYXRvVmFsaWRvT0xEKHZhbG9yZUltcG9ydG8pIHtcclxuXHRcdHJldHVybiAvXig/OlswLTldK3woPzpbMC05XXsxLDN9XFwuPykrKSg/OixbMC05XXsxLDJ9KT/igqw/JC9cclxuXHRcdFx0LnRlc3QodmFsb3JlSW1wb3J0byk7NDJcclxuXHR9XHJcblx0cHJpdmF0ZSBjdXJyZW5jeVRvTnVtYmVyKHM6IHN0cmluZyk6IG51bWJlciB7XHJcblx0XHRyZXR1cm4gTnVtYmVyKHMucmVwbGFjZSgvXFwuL2csICcnKS5yZXBsYWNlKCcsJywgJy4nKSB8fCB1bmRlZmluZWQpO1xyXG5cdH1cclxuXHJcblx0aXNJbXBvcnRvRm9ybWF0b1ZhbGlkbyh2YWxvcmVJbXBvcnRvKSB7XHJcblx0XHRyZXR1cm4gL14oPzowfFsxLTldKD86WzAtOV17MCwyfVxcLlswLTldezN9KD86XFwuWzAtOV17M30pKnxbMC05XSopKSg/OixbMC05XXsyLDJ9KeKCrD8kL1xyXG5cdFx0XHQudGVzdCh2YWxvcmVJbXBvcnRvKTtcclxuXHR9XHJcblxyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByaXZhdGUgbXNnOiBNZXNzYWdlU2VydmljZSxcclxuXHRcdHByaXZhdGUgX3JlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcblx0XHRwcml2YXRlIGRlbGVnaGVTZXJ2aWNlOiBEZWxlZ2hlU2VydmljZSxcclxuXHQpIHsgfVxyXG5cclxuXHRuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLl9yZWYuZGV0ZWN0Q2hhbmdlcygpXHJcblx0fVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHJcblx0XHR0aGlzLmZvcm0gPSBuZXcgRm9ybUdyb3VwKFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0J2NhdXNhbGUnOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiAhdGhpcy52aXNpYmlsaXR5TWFzay5jYXVzYWxlIH0sIGMgPT4ge1xyXG5cclxuXHRcdFx0XHRcdGlmICghdGhpcy52aXNpYmlsaXR5TWFzay5jYXVzYWxlKSByZXR1cm4ge307XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIFN0cmluZyhjLnZhbHVlIHx8ICcnKS5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdD8ge31cclxuXHRcdFx0XHRcdFx0OiB7ICdyZXF1aXJlZCc6ICdJbCBjYW1wbyDDqCBvYmJsaWdhdG9yaW8uJyB9XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQsICdpbXBvcnRvJzogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogIXRoaXMudmlzaWJpbGl0eU1hc2suaW1wb3J0byB9LCBjID0+IHtcclxuXHRcdFx0XHRcdGlmICghdGhpcy52aXNpYmlsaXR5TWFzay5pbXBvcnRvKSByZXR1cm4ge307XHJcblxyXG5cdFx0XHRcdFx0Ly8gcmV0dXJuIHRoaXMuaXNJbXBvcnRvRm9ybWF0b1ZhbGlkbyhjLnZhbHVlKVxyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuaXNJbXBvcnRvRm9ybWF0b1ZhbGlkbyhjLnZhbHVlKVxyXG5cdFx0XHRcdFx0XHQ/IHt9XHJcblx0XHRcdFx0XHRcdDogeyAncGF0dGVybic6ICdGb3JtYXRvIG5vbiB2YWxpZG8nIH07XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQsICdydHMtaW5vbHRybyc6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiAnJywgZGlzYWJsZWQ6ICF0aGlzLnZpc2liaWxpdHlNYXNrLmNvZGljZVJ0c0lub2x0cm8gfSwgYyA9PiB7XHJcblx0XHRcdFx0XHRpZiAoIXRoaXMudmlzaWJpbGl0eU1hc2suY29kaWNlUnRzSW5vbHRybykgcmV0dXJuIHt9O1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiBTdHJpbmcoYy52YWx1ZSB8fCAnJykubGVuZ3RoID4gMFxyXG5cdFx0XHRcdFx0XHQ/IHt9XHJcblx0XHRcdFx0XHRcdDogeyAncmVxdWlyZWQnOiAnSWwgY2FtcG8gw6ggb2JibGlnYXRvcmlvLicgfTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdCwgJ25vdGEnOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiAhdGhpcy52aXNpYmlsaXR5TWFzay5ub3RhIH0sIGMgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLnZpc2liaWxpdHlNYXNrLm5vdGEpIHJldHVybiB7fTtcclxuXHJcblx0XHRcdFx0XHQvLyByZXR1cm4gU3RyaW5nKGMudmFsdWUpLnRyaW0oKS5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHQvLyBcdD8ge31cclxuXHRcdFx0XHRcdC8vIFx0OiB7ICdyZXF1aXJlZCc6ICdJbCBjYW1wbyDDqCBvYmJsaWdhdG9yaW8uJyB9O1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdH1cclxuXHRcdCk7XHJcblxyXG5cdFx0bGV0IHZhbGlkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0XHRpZiAoIXRoaXMuZGF0aURlcG9zaXRvKSB7XHJcblx0XHRcdHRoaXMuaW5pdERhdGlEZXBvc2l0bygpO1xyXG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMuX3J0cyA9IHRoaXMucnN0X21vY2s7XHJcblx0XHR0aGlzLmxpc3RhUnRzJCA9IG9mKHRoaXMucnN0X21vY2spO1xyXG5cdFx0dGhpcy5ydHMkID0gb2YodGhpcy5yc3RfbW9jayk7XHJcblx0XHQvLyB0aGlzLmxpc3RhUnRzJC5zdWJzY3JpYmUoXHJcblx0XHQvLyBcdChydHMpID0+IHtcclxuXHRcdC8vIFx0XHRjb25zb2xlLmxvZygnW2xpc3RhUnRzJF0nLCBydHMpO1xyXG5cdFx0Ly8gXHRcdGlmIChydHMgIT0gbnVsbCkge1xyXG5cdFx0Ly8gXHRcdFx0dGhpcy5ydHMkID0gdGhpcy5kZWxlZ2hlU2VydmljZS5nZXRMaXN0UnRzQ29kaWNlUmVnaW9uZShydHMpO1xyXG5cdFx0Ly8gXHRcdFx0dGhpcy5ydHMkLnN1YnNjcmliZShfcnRzID0+IHtcclxuXHRcdC8vIFx0XHRcdFx0dGhpcy5fcnRzID0gX3J0cztcclxuXHRcdC8vIFx0XHRcdFx0Ly9jb25zb2xlLmxvZyhcIl9ydHNcIiArIEpTT04uc3RyaW5naWZ5KHRoaXMuX3J0cykpXHJcblx0XHQvLyBcdFx0XHR9KTtcclxuXHRcdC8vIFx0XHR9XHJcblx0XHQvLyBcdH1cclxuXHRcdC8vICk7XHJcblxyXG5cdFx0dGhpcy5mb3JtLmNvbnRyb2xzWydjYXVzYWxlJ10uc2V0VmFsdWUodGhpcy5kYXRpRGVwb3NpdG8uY2F1c2FsZSk7XHJcblx0XHR0aGlzLmZvcm0uY29udHJvbHNbJ2ltcG9ydG8nXS5zZXRWYWx1ZSh0aGlzLmRhdGlEZXBvc2l0by5pbXBvcnRvKTtcclxuXHRcdHRoaXMuZm9ybS5jb250cm9sc1sncnRzLWlub2x0cm8nXS5zZXRWYWx1ZSh0aGlzLmRhdGlEZXBvc2l0by5jb2RpY2VSdHNJbm9sdHJvKTtcclxuXHRcdHRoaXMuZm9ybS5jb250cm9sc1snbm90YSddLnNldFZhbHVlKHRoaXMuZGF0aURlcG9zaXRvLm5vdGEpO1xyXG5cclxuXHRcdGNvbnN0IGNoYW5nZXMkID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHRtYXAoXyA9PiB7XHJcblx0XHRcdFx0Y29uc3QgZGF0aSA9IG5ldyBEYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUTygpIGFzIFQ7XHJcblx0XHRcdFx0ZGF0aS5jYXVzYWxlID0gdGhpcy5mb3JtLmNvbnRyb2xzWydjYXVzYWxlJ10udmFsdWU7XHJcblx0XHRcdFx0aWYodGhpcy5mb3JtLmNvbnRyb2xzWydpbXBvcnRvJ10udmFsdWUgIT0gdW5kZWZpbmVkKXtcclxuXHRcdFx0XHRcdGRhdGkuaW1wb3J0byA9IHRoaXMuY3VycmVuY3lUb051bWJlcih0aGlzLmZvcm0uY29udHJvbHNbJ2ltcG9ydG8nXS52YWx1ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGRhdGkuY29kaWNlUnRzSW5vbHRybyA9IHRoaXMuZm9ybS5jb250cm9sc1sncnRzLWlub2x0cm8nXS52YWx1ZTtcclxuXHRcdFx0XHRpZihkYXRpPy5jb2RpY2VSdHNJbm9sdHJvICYmIHRoaXM/Ll9ydHMpIHtcclxuXHRcdFx0XHRcdGRhdGkuZGVub21pbmF6aW9uZVJUUyA9IHRoaXMuX3J0cy5maW5kKHggPT4geC5jb2RpY2VGaXNjYWxlID09IGRhdGk/LmNvZGljZVJ0c0lub2x0cm8pPy5kZW5vbWluYXppb25lUlRTO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRkYXRpLm5vdGEgPSB0aGlzLmZvcm0uY29udHJvbHNbJ25vdGEnXS52YWx1ZTtcclxuXHRcdFx0XHR0aGlzLmRhdGlEZXBvc2l0byA9IGRhdGk7XHJcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJbZGF0aV1cIiwgdGhpcy5mb3JtKTtcclxuXHRcdFx0XHRyZXR1cm4gQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKFxyXG5cdFx0XHRcdFx0dGhpcy5mb3JtLnZhbGlkLCB0aGlzLmRhdGlEZXBvc2l0byk7XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRzdGFydFdpdGgoQ29tcG9uZW50T3V0cHV0U3RhdHVzLm9mKHZhbGlkLCB0aGlzLmRhdGlEZXBvc2l0bykpXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMuc3Vic2NyaXB0aW9uID0gY2hhbmdlcyQuc3Vic2NyaWJlKG5ld0RhdGkgPT5cclxuXHRcdFx0Y29uc29sZS5sb2coJ1tEYXRpRGVwb3NpdG9Db21wb25lbnRdIGRhdGlTcGVjaWZpY2lEZXBvc2l0bycsIG5ld0RhdGkpXHJcblx0XHQpO1xyXG5cclxuXHR9XHJcblxyXG5cdGZvcndhcmQoJGV2ZW50OiBhbnkpIHtcclxuXHRcdHRoaXMubmV4dFN0ZXAuZW1pdCh0aGlzLmRhdGlEZXBvc2l0byk7XHJcblx0fVxyXG5cclxuXHRiYWNrd2FyZCgkZXZlbnQ6IGFueSkge1xyXG5cdFx0dGhpcy5wcmV2aW91c1N0ZXAuZW1pdCh0aGlzLmRhdGlEZXBvc2l0byk7XHJcblx0fVxyXG5cclxuXHRvblNhbHZhQm96emEoJGV2ZW50OiBhbnkpIHtcclxuXHRcdHRoaXMuc2FsdmFCb3p6YS5lbWl0KHRoaXMuZGF0aURlcG9zaXRvKTtcclxuXHR9XHJcblxyXG5cdGNvbXBsZXRlKCRldmVudDogYW55KSB7IH1cclxuXHJcblx0aXNGb3JtVmFsaWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5mb3JtLnZhbGlkO1xyXG5cdH1cclxuXHJcblx0aW5pdERhdGlEZXBvc2l0bygpIHtcclxuXHRcdC8vVE9ET1xyXG5cdFx0Ly90aGlzLmRhdGlEZXBvc2l0byA9IG5ldyBEYXRpRGVwb3NpdG9EVE8oKSBhcyBUO1xyXG5cdFx0dGhpcy5kYXRpRGVwb3NpdG8gPSBuZXcgRGF0aURlcG9zaXRvR2l1ZGl6aWFyaW9EVE8oKSBhcyBUO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuIl19