@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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0aS1kZXBvc2l0by5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiRDovUHJvZ2V0dGkvREFHL3NvcmdlbnRpL2dpdGxhYi10ZXJuaS9jb21tb24tY29tcG9uZW50LWxpYi9wcm9qZWN0cy9wb3J0YWwtY29tbW9uLWNvbXBvbmVudC1saWIvc3JjLyIsInNvdXJjZXMiOlsibGliL2RlcG9zaXRpL2NvbXBvbmVudHMvZGF0aS1kZXBvc2l0by9kYXRpLWRlcG9zaXRvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQWMsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNwRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXhGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFnQmhFLE1BQU0sT0FBTyxZQUFZO0lBeUZ4QixZQUNTLEdBQW1CLEVBQ25CLElBQXVCLEVBQ3ZCLGNBQThCO1FBRjlCLFFBQUcsR0FBSCxHQUFHLENBQWdCO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXpGL0IsYUFBUSxHQUFVO1lBQ3hCO2dCQUNDLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixpQkFBaUIsRUFBRSxPQUFPO2dCQUMxQixVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNsQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNwQyxrQkFBa0IsRUFBRSxPQUFPO2dCQUMzQixvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQzthQUM1QjtZQUNEO2dCQUNDLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixpQkFBaUIsRUFBRSxNQUFNO2dCQUN6QixVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNsQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNwQyxrQkFBa0IsRUFBRSxPQUFPO2dCQUMzQixvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQzthQUM1QjtZQUNEO2dCQUNDLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixpQkFBaUIsRUFBRSxRQUFRO2dCQUMzQixVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNsQyxZQUFZLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNwQyxrQkFBa0IsRUFBRSxPQUFPO2dCQUMzQixvQkFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQzthQUM1QjtTQUNGLENBQUE7UUFFRCxNQUFNO1FBQ04sa0JBQWtCO1FBQ2xCLDZCQUE2QjtRQUM3Qiw2QkFBNkI7UUFFcEIsaUJBQVksR0FDcEIsRUFBTyxDQUFDO1FBRUEsbUJBQWMsR0FDdEIsRUFBZ0MsQ0FBQztRQVNsQyxhQUFRLEdBQTZDLElBQUksWUFBWSxFQUVsRSxDQUFDO1FBR0osaUJBQVksR0FBNkMsSUFBSSxZQUFZLEVBRXRFLENBQUM7UUFHSixlQUFVLEdBQTZDLElBQUksWUFBWSxFQUVwRSxDQUFDO1FBT0osY0FBUyxHQUFXLFdBQVcsQ0FBQztRQUNoQyxZQUFPLEdBQVksS0FBSyxDQUFDO0lBeUJyQixDQUFDO0lBbEJMLHlCQUF5QixDQUFDLGFBQWE7UUFDdEMsT0FBTyxtREFBbUQ7YUFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQUEsRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFDTyxnQkFBZ0IsQ0FBQyxDQUFTO1FBQ2pDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELHNCQUFzQixDQUFDLGFBQWE7UUFDbkMsT0FBTyw4RUFBOEU7YUFDbkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFTRCxlQUFlO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0lBRUQsUUFBUTtRQUVQLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQ3hCO1lBQ0MsU0FBUyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUVyRixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUU1QyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUN0QyxDQUFDLENBQUMsRUFBRTtvQkFDSixDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsMEJBQTBCLEVBQUUsQ0FBQTtZQUM5QyxDQUFDLENBQUM7WUFDQSxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3ZGLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87b0JBQUUsT0FBTyxFQUFFLENBQUM7Z0JBRTVDLDhDQUE4QztnQkFDOUMsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDMUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLENBQUM7WUFDeEMsQ0FBQyxDQUFDO1lBQ0EsYUFBYSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQjtvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFFckQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztvQkFDdEMsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLDBCQUEwQixFQUFFLENBQUM7WUFDL0MsQ0FBQyxDQUFDO1lBQ0EsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNqRixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJO29CQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUV6QywyQ0FBMkM7Z0JBQzNDLFFBQVE7Z0JBQ1IsaURBQWlEO1lBQ2xELENBQUMsQ0FBQztTQUNGLENBQ0QsQ0FBQztRQUVGLElBQUksS0FBSyxHQUFZLElBQUksQ0FBQztRQUUxQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN2QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5Qiw0QkFBNEI7UUFDNUIsY0FBYztRQUNkLHFDQUFxQztRQUNyQyx1QkFBdUI7UUFDdkIsbUVBQW1FO1FBQ25FLG1DQUFtQztRQUNuQyx3QkFBd0I7UUFDeEIsd0RBQXdEO1FBQ3hELFNBQVM7UUFDVCxNQUFNO1FBQ04sS0FBSztRQUNMLEtBQUs7UUFFTCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDM0MsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFOztZQUNQLE1BQU0sSUFBSSxHQUFHLElBQUksMEJBQTBCLEVBQU8sQ0FBQztZQUNuRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNuRCxJQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLEVBQUM7Z0JBQ25ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzFFO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNoRSxJQUFHLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLGdCQUFnQixNQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxJQUFJLENBQUEsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLGdCQUFnQixTQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsS0FBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsZ0JBQWdCLENBQUEsQ0FBQywwQ0FBRSxnQkFBZ0IsQ0FBQzthQUN6RztZQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLG9DQUFvQztZQUNwQyxPQUFPLHFCQUFxQixDQUFDLEVBQUUsQ0FDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUM3RCxDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsK0NBQStDLEVBQUUsT0FBTyxDQUFDLENBQ3JFLENBQUM7SUFFSCxDQUFDO0lBRUQsT0FBTyxDQUFDLE1BQVc7UUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxRQUFRLENBQUMsTUFBVztRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFXO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsUUFBUSxDQUFDLE1BQVcsSUFBSSxDQUFDO0lBRXpCLFdBQVc7UUFDVixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZixNQUFNO1FBQ04saURBQWlEO1FBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSwwQkFBMEIsRUFBTyxDQUFDO0lBQzNELENBQUM7SUFFRCxXQUFXO1FBQ1YsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDaEM7SUFDRixDQUFDOzs7WUFqT0QsU0FBUyxTQUNUO2dCQUNDLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzNCLDBpSkFBNkM7O2FBRS9DOzs7WUFkTyxjQUFjO1lBUkMsaUJBQWlCO1lBT2hDLGNBQWM7OzsyQkFvRHJCLEtBQUs7NkJBR0wsS0FBSzt3QkFNTCxLQUFLO3VCQUdMLE1BQU07MkJBS04sTUFBTTt5QkFLTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUTyB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRpLWRlcG9zaXRvLWdpdWRpemlhcmlvLWR0byc7XHJcbmltcG9ydCB7IFJ0c0RUTyB9IGZyb20gJy4uLy4uL21vZGVscy9ydHMtZHRvJztcclxuaW1wb3J0IHsgQ29tcG9uZW50T3V0cHV0U3RhdHVzIH0gZnJvbSAnLi4vLi4vbm9ybWFsaXp6YXppb25lL2NvbXBvbmVudC1vdXRwdXQtc3RhdHVzJztcclxuaW1wb3J0IHsgRGVsZWdoZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kZWxlZ2hlLXNlcnZpY2VzL2RlbGVnaGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWVzc2FnZS5zZXJ2aWNlJztcclxuXHJcbnR5cGUgRGF0aURlcG9zaXRvR2VuZXJpYyA9IGtleW9mIERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPO1xyXG4vLyBUT0RPOiB1c2FyZSBSZWNvcmQ8LD4gcGVyIGkgZGl2ZXJzaSB0aXBpIGRpIERhdGlEZXBvc2l0b1xyXG5cclxuZXhwb3J0IHR5cGUgRGF0aURlcG9zaXRvVmlzaWJpbGl0eU1hc2sgPVxyXG5cdHsgW2sgaW4gRGF0aURlcG9zaXRvR2VuZXJpY106IGJvb2xlYW5cclxuXHR9O1xyXG5cclxuQENvbXBvbmVudChcclxuXHR7XHJcblx0XHRzZWxlY3RvcjogJ2xpYi1kYXRpLWRlcG9zaXRvJ1xyXG5cdFx0LCB0ZW1wbGF0ZVVybDogJy4vZGF0aS1kZXBvc2l0by5jb21wb25lbnQuaHRtbCdcclxuXHRcdCwgc3R5bGVVcmxzOiBbJy4vZGF0aS1kZXBvc2l0by5jb21wb25lbnQuY3NzJ11cclxuXHR9XHJcbilcclxuZXhwb3J0IGNsYXNzIERhdGlEZXBvc2l0bzxUIGV4dGVuZHMgRGF0aURlcG9zaXRvR2l1ZGl6aWFyaW9EVE8gfCBudWxsPlxyXG5cdGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG5cclxuXHRcdHB1YmxpYyByc3RfbW9jazogYW55W10gPSBbXHJcblx0XHRcdHtcclxuXHRcdFx0XHRcImNvZGljZUZpc2NhbGVcIjogXCJUUlwiLFxyXG5cdFx0XHRcdFwiY29kaWNlT3JkaW5hbnRlXCI6IFwiVGVybmlcIixcclxuXHRcdFx0XHRcImRhdGFGaW5lXCI6IG5ldyBEYXRlKCcxMC8wNi8yMDI1JyksXHJcblx0XHRcdFx0XCJkYXRhSW5pemlvXCI6IG5ldyBEYXRlKCcxMC8wNi8yMDI1JyksXHJcblx0XHRcdFx0XCJkZW5vbWluYXppb25lUlRTXCI6IFwiUlRTIDFcIixcclxuXHRcdFx0XHRcInByb3ZpbmNlQ29tcGV0ZW56YVwiOiBbXCJUUlwiXVxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0XCJjb2RpY2VGaXNjYWxlXCI6IFwiUk1cIixcclxuXHRcdFx0XHRcImNvZGljZU9yZGluYW50ZVwiOiBcIlJvbWFcIixcclxuXHRcdFx0XHRcImRhdGFGaW5lXCI6IG5ldyBEYXRlKCcxMC8wNi8yMDI1JyksXHJcblx0XHRcdFx0XCJkYXRhSW5pemlvXCI6IG5ldyBEYXRlKCcxMC8wNi8yMDI1JyksXHJcblx0XHRcdFx0XCJkZW5vbWluYXppb25lUlRTXCI6IFwiUlRTIDFcIixcclxuXHRcdFx0XHRcInByb3ZpbmNlQ29tcGV0ZW56YVwiOiBbXCJUUlwiXVxyXG5cdFx0XHR9LFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0XCJjb2RpY2VGaXNjYWxlXCI6IFwiTUlcIixcclxuXHRcdFx0XHRcImNvZGljZU9yZGluYW50ZVwiOiBcIk1pbGFub1wiLFxyXG5cdFx0XHRcdFwiZGF0YUZpbmVcIjogbmV3IERhdGUoJzEwLzA2LzIwMjUnKSxcclxuXHRcdFx0XHRcImRhdGFJbml6aW9cIjogbmV3IERhdGUoJzEwLzA2LzIwMjUnKSxcclxuXHRcdFx0XHRcImRlbm9taW5hemlvbmVSVFNcIjogXCJSVFMgMVwiLFxyXG5cdFx0XHRcdFwicHJvdmluY2VDb21wZXRlbnphXCI6IFtcIlRSXCJdXHJcblx0XHRcdH1cclxuXHRdXHJcblxyXG5cdC8vVE9ET1xyXG5cdC8vIERhdGlEZXBvc2l0b0RUT1xyXG5cdC8vIERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPXHJcblx0Ly8gRGF0aURlcG9zaXRvTm9Fc3Byb3ByaW9EVE9cclxuXHJcblx0QElucHV0KCkgZGF0aURlcG9zaXRvOiBUID1cclxuXHRcdHt9IGFzIFQ7XHJcblxyXG5cdEBJbnB1dCgpIHZpc2liaWxpdHlNYXNrOiBEYXRpRGVwb3NpdG9WaXNpYmlsaXR5TWFzayA9XHJcblx0XHR7fSBhcyBEYXRpRGVwb3NpdG9WaXNpYmlsaXR5TWFzaztcclxuXHJcblx0Ly8gQElucHV0KClcclxuXHQvLyBsaXN0YVJ0cyQ6IE9ic2VydmFibGU8QXJyYXk8UnRzRFRPPj47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0bGlzdGFSdHMkOiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRuZXh0U3RlcDogRXZlbnRFbWl0dGVyPERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPPiA9IG5ldyBFdmVudEVtaXR0ZXI8XHJcblx0XHREYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUT1xyXG5cdD4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0cHJldmlvdXNTdGVwOiBFdmVudEVtaXR0ZXI8RGF0aURlcG9zaXRvR2l1ZGl6aWFyaW9EVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxcclxuXHRcdERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPXHJcblx0PigpO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRzYWx2YUJvenphOiBFdmVudEVtaXR0ZXI8RGF0aURlcG9zaXRvR2l1ZGl6aWFyaW9EVE8+ID0gbmV3IEV2ZW50RW1pdHRlcjxcclxuXHRcdERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPXHJcblx0PigpO1xyXG5cclxuXHQvLyBUT0RPXHJcblx0Ly8gQElucHV0KClcclxuXHQvLyBydHMkOiBPYnNlcnZhYmxlPEFycmF5PFRpcG9sb2dpY2FEVE8+PjtcclxuXHJcblx0Zm9ybTogRm9ybUdyb3VwO1xyXG5cdGRpcmVjdGlvbjogc3RyaW5nID0gXCJib3RoLXdheXNcIjtcclxuXHRpc0ZpbmFsOiBib29sZWFuID0gZmFsc2U7XHJcblx0c3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG5cdHJ0cyQ6IE9ic2VydmFibGU8QXJyYXk8UnRzRFRPPj47XHJcblxyXG5cdF9ydHM6IEFycmF5PFJ0c0RUTz47XHJcblxyXG5cdGlzSW1wb3J0b0Zvcm1hdG9WYWxpZG9PTEQodmFsb3JlSW1wb3J0bykge1xyXG5cdFx0cmV0dXJuIC9eKD86WzAtOV0rfCg/OlswLTldezEsM31cXC4/KSspKD86LFswLTldezEsMn0pP+KCrD8kL1xyXG5cdFx0XHQudGVzdCh2YWxvcmVJbXBvcnRvKTs0MlxyXG5cdH1cclxuXHRwcml2YXRlIGN1cnJlbmN5VG9OdW1iZXIoczogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiBOdW1iZXIocy5yZXBsYWNlKC9cXC4vZywgJycpLnJlcGxhY2UoJywnLCAnLicpIHx8IHVuZGVmaW5lZCk7XHJcblx0fVxyXG5cclxuXHRpc0ltcG9ydG9Gb3JtYXRvVmFsaWRvKHZhbG9yZUltcG9ydG8pIHtcclxuXHRcdHJldHVybiAvXig/OjB8WzEtOV0oPzpbMC05XXswLDJ9XFwuWzAtOV17M30oPzpcXC5bMC05XXszfSkqfFswLTldKikpKD86LFswLTldezIsMn0p4oKsPyQvXHJcblx0XHRcdC50ZXN0KHZhbG9yZUltcG9ydG8pO1xyXG5cdH1cclxuXHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBtc2c6IE1lc3NhZ2VTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSBfcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuXHRcdHByaXZhdGUgZGVsZWdoZVNlcnZpY2U6IERlbGVnaGVTZXJ2aWNlLFxyXG5cdCkgeyB9XHJcblxyXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuX3JlZi5kZXRlY3RDaGFuZ2VzKClcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCkge1xyXG5cclxuXHRcdHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoXHJcblx0XHRcdHtcclxuXHRcdFx0XHQnY2F1c2FsZSc6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiAnJywgZGlzYWJsZWQ6ICF0aGlzLnZpc2liaWxpdHlNYXNrLmNhdXNhbGUgfSwgYyA9PiB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLnZpc2liaWxpdHlNYXNrLmNhdXNhbGUpIHJldHVybiB7fTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gU3RyaW5nKGMudmFsdWUgfHwgJycpLmxlbmd0aCA+IDBcclxuXHRcdFx0XHRcdFx0PyB7fVxyXG5cdFx0XHRcdFx0XHQ6IHsgJ3JlcXVpcmVkJzogJ0lsIGNhbXBvIMOoIG9iYmxpZ2F0b3Jpby4nIH1cclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdCwgJ2ltcG9ydG8nOiBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJycsIGRpc2FibGVkOiAhdGhpcy52aXNpYmlsaXR5TWFzay5pbXBvcnRvIH0sIGMgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKCF0aGlzLnZpc2liaWxpdHlNYXNrLmltcG9ydG8pIHJldHVybiB7fTtcclxuXHJcblx0XHRcdFx0XHQvLyByZXR1cm4gdGhpcy5pc0ltcG9ydG9Gb3JtYXRvVmFsaWRvKGMudmFsdWUpXHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5pc0ltcG9ydG9Gb3JtYXRvVmFsaWRvKGMudmFsdWUpXHJcblx0XHRcdFx0XHRcdD8ge31cclxuXHRcdFx0XHRcdFx0OiB7ICdwYXR0ZXJuJzogJ0Zvcm1hdG8gbm9uIHZhbGlkbycgfTtcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHRcdCwgJ3J0cy1pbm9sdHJvJzogbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogIXRoaXMudmlzaWJpbGl0eU1hc2suY29kaWNlUnRzSW5vbHRybyB9LCBjID0+IHtcclxuXHRcdFx0XHRcdGlmICghdGhpcy52aXNpYmlsaXR5TWFzay5jb2RpY2VSdHNJbm9sdHJvKSByZXR1cm4ge307XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIFN0cmluZyhjLnZhbHVlIHx8ICcnKS5sZW5ndGggPiAwXHJcblx0XHRcdFx0XHRcdD8ge31cclxuXHRcdFx0XHRcdFx0OiB7ICdyZXF1aXJlZCc6ICdJbCBjYW1wbyDDqCBvYmJsaWdhdG9yaW8uJyB9O1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdFx0LCAnbm90YSc6IG5ldyBGb3JtQ29udHJvbCh7IHZhbHVlOiAnJywgZGlzYWJsZWQ6ICF0aGlzLnZpc2liaWxpdHlNYXNrLm5vdGEgfSwgYyA9PiB7XHJcblx0XHRcdFx0XHRpZiAoIXRoaXMudmlzaWJpbGl0eU1hc2subm90YSkgcmV0dXJuIHt9O1xyXG5cclxuXHRcdFx0XHRcdC8vIHJldHVybiBTdHJpbmcoYy52YWx1ZSkudHJpbSgpLmxlbmd0aCA+IDBcclxuXHRcdFx0XHRcdC8vIFx0PyB7fVxyXG5cdFx0XHRcdFx0Ly8gXHQ6IHsgJ3JlcXVpcmVkJzogJ0lsIGNhbXBvIMOoIG9iYmxpZ2F0b3Jpby4nIH07XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0fVxyXG5cdFx0KTtcclxuXHJcblx0XHRsZXQgdmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHRcdGlmICghdGhpcy5kYXRpRGVwb3NpdG8pIHtcclxuXHRcdFx0dGhpcy5pbml0RGF0aURlcG9zaXRvKCk7XHJcblx0XHRcdHZhbGlkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5fcnRzID0gdGhpcy5yc3RfbW9jaztcclxuXHRcdHRoaXMubGlzdGFSdHMkID0gb2YodGhpcy5yc3RfbW9jayk7XHJcblx0XHR0aGlzLnJ0cyQgPSBvZih0aGlzLnJzdF9tb2NrKTtcclxuXHRcdC8vIHRoaXMubGlzdGFSdHMkLnN1YnNjcmliZShcclxuXHRcdC8vIFx0KHJ0cykgPT4ge1xyXG5cdFx0Ly8gXHRcdGNvbnNvbGUubG9nKCdbbGlzdGFSdHMkXScsIHJ0cyk7XHJcblx0XHQvLyBcdFx0aWYgKHJ0cyAhPSBudWxsKSB7XHJcblx0XHQvLyBcdFx0XHR0aGlzLnJ0cyQgPSB0aGlzLmRlbGVnaGVTZXJ2aWNlLmdldExpc3RSdHNDb2RpY2VSZWdpb25lKHJ0cyk7XHJcblx0XHQvLyBcdFx0XHR0aGlzLnJ0cyQuc3Vic2NyaWJlKF9ydHMgPT4ge1xyXG5cdFx0Ly8gXHRcdFx0XHR0aGlzLl9ydHMgPSBfcnRzO1xyXG5cdFx0Ly8gXHRcdFx0XHQvL2NvbnNvbGUubG9nKFwiX3J0c1wiICsgSlNPTi5zdHJpbmdpZnkodGhpcy5fcnRzKSlcclxuXHRcdC8vIFx0XHRcdH0pO1xyXG5cdFx0Ly8gXHRcdH1cclxuXHRcdC8vIFx0fVxyXG5cdFx0Ly8gKTtcclxuXHJcblx0XHR0aGlzLmZvcm0uY29udHJvbHNbJ2NhdXNhbGUnXS5zZXRWYWx1ZSh0aGlzLmRhdGlEZXBvc2l0by5jYXVzYWxlKTtcclxuXHRcdHRoaXMuZm9ybS5jb250cm9sc1snaW1wb3J0byddLnNldFZhbHVlKHRoaXMuZGF0aURlcG9zaXRvLmltcG9ydG8pO1xyXG5cdFx0dGhpcy5mb3JtLmNvbnRyb2xzWydydHMtaW5vbHRybyddLnNldFZhbHVlKHRoaXMuZGF0aURlcG9zaXRvLmNvZGljZVJ0c0lub2x0cm8pO1xyXG5cdFx0dGhpcy5mb3JtLmNvbnRyb2xzWydub3RhJ10uc2V0VmFsdWUodGhpcy5kYXRpRGVwb3NpdG8ubm90YSk7XHJcblxyXG5cdFx0Y29uc3QgY2hhbmdlcyQgPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUoXHJcblx0XHRcdG1hcChfID0+IHtcclxuXHRcdFx0XHRjb25zdCBkYXRpID0gbmV3IERhdGlEZXBvc2l0b0dpdWRpemlhcmlvRFRPKCkgYXMgVDtcclxuXHRcdFx0XHRkYXRpLmNhdXNhbGUgPSB0aGlzLmZvcm0uY29udHJvbHNbJ2NhdXNhbGUnXS52YWx1ZTtcclxuXHRcdFx0XHRpZih0aGlzLmZvcm0uY29udHJvbHNbJ2ltcG9ydG8nXS52YWx1ZSAhPSB1bmRlZmluZWQpe1xyXG5cdFx0XHRcdFx0ZGF0aS5pbXBvcnRvID0gdGhpcy5jdXJyZW5jeVRvTnVtYmVyKHRoaXMuZm9ybS5jb250cm9sc1snaW1wb3J0byddLnZhbHVlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZGF0aS5jb2RpY2VSdHNJbm9sdHJvID0gdGhpcy5mb3JtLmNvbnRyb2xzWydydHMtaW5vbHRybyddLnZhbHVlO1xyXG5cdFx0XHRcdGlmKGRhdGk/LmNvZGljZVJ0c0lub2x0cm8gJiYgdGhpcz8uX3J0cykge1xyXG5cdFx0XHRcdFx0ZGF0aS5kZW5vbWluYXppb25lUlRTID0gdGhpcy5fcnRzLmZpbmQoeCA9PiB4LmNvZGljZUZpc2NhbGUgPT0gZGF0aT8uY29kaWNlUnRzSW5vbHRybyk/LmRlbm9taW5hemlvbmVSVFM7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGRhdGkubm90YSA9IHRoaXMuZm9ybS5jb250cm9sc1snbm90YSddLnZhbHVlO1xyXG5cdFx0XHRcdHRoaXMuZGF0aURlcG9zaXRvID0gZGF0aTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIltkYXRpXVwiLCB0aGlzLmZvcm0pO1xyXG5cdFx0XHRcdHJldHVybiBDb21wb25lbnRPdXRwdXRTdGF0dXMub2YoXHJcblx0XHRcdFx0XHR0aGlzLmZvcm0udmFsaWQsIHRoaXMuZGF0aURlcG9zaXRvKTtcclxuXHRcdFx0fSksXHJcblx0XHRcdHN0YXJ0V2l0aChDb21wb25lbnRPdXRwdXRTdGF0dXMub2YodmFsaWQsIHRoaXMuZGF0aURlcG9zaXRvKSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24gPSBjaGFuZ2VzJC5zdWJzY3JpYmUobmV3RGF0aSA9PlxyXG5cdFx0XHRjb25zb2xlLmxvZygnW0RhdGlEZXBvc2l0b0NvbXBvbmVudF0gZGF0aVNwZWNpZmljaURlcG9zaXRvJywgbmV3RGF0aSlcclxuXHRcdCk7XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yd2FyZCgkZXZlbnQ6IGFueSkge1xyXG5cdFx0dGhpcy5uZXh0U3RlcC5lbWl0KHRoaXMuZGF0aURlcG9zaXRvKTtcclxuXHR9XHJcblxyXG5cdGJhY2t3YXJkKCRldmVudDogYW55KSB7XHJcblx0XHR0aGlzLnByZXZpb3VzU3RlcC5lbWl0KHRoaXMuZGF0aURlcG9zaXRvKTtcclxuXHR9XHJcblxyXG5cdG9uU2FsdmFCb3p6YSgkZXZlbnQ6IGFueSkge1xyXG5cdFx0dGhpcy5zYWx2YUJvenphLmVtaXQodGhpcy5kYXRpRGVwb3NpdG8pO1xyXG5cdH1cclxuXHJcblx0Y29tcGxldGUoJGV2ZW50OiBhbnkpIHsgfVxyXG5cclxuXHRpc0Zvcm1WYWxpZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmZvcm0udmFsaWQ7XHJcblx0fVxyXG5cclxuXHRpbml0RGF0aURlcG9zaXRvKCkge1xyXG5cdFx0Ly9UT0RPXHJcblx0XHQvL3RoaXMuZGF0aURlcG9zaXRvID0gbmV3IERhdGlEZXBvc2l0b0RUTygpIGFzIFQ7XHJcblx0XHR0aGlzLmRhdGlEZXBvc2l0byA9IG5ldyBEYXRpRGVwb3NpdG9HaXVkaXppYXJpb0RUTygpIGFzIFQ7XHJcblx0fVxyXG5cclxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xyXG5cdFx0XHR0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iXX0=