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.

152 lines 29.1 kB
import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core"; import { FormGroup } from "@angular/forms"; import { combineLatest, merge, Observable, Subject } from "rxjs"; import { debounceTime, map, scan, shareReplay, startWith, tap, withLatestFrom } from "rxjs/operators"; import { Tuple } from "../../models/tuple"; import { TipiDocumento } from "../../constants/tipi-documenti"; import { Modals } from "../../utils/modals"; import { Azione, GenericModalData } from "../../common-component/generic-modal/generic-modal-data"; export class DocumentazioneComponent { constructor(modals) { this.modals = modals; //TODO this.allegatiMock = [{ chiaveCollegamento: "7afe2d6c-5757-4684-91fc-387c7c15dbf6", dataCreazione: "2021-01-08", dataInizioStaging: "2021-01-08", dataStaging: "2021-01-08", dataValidazione: null, descrizione: "Test request10", idCreatore: "1", idDocumento: "ad397ac0-f017-48e1-98fb-3e4c514adbdb", idIstanza: "2380b34a-4b2d-4a9b-896b-ba4a27cdbf7f", jsonMetadati: "", nome: "fileditest10.txt", proprietario: { tipoProprietario: "PF", idProprietario: "1", idSottoProprietario: null }, statiDocumento: [{ idDocumento: "ad397ac0-f017-48e1-98fb-3e4c514adbdb", stato: "DOC_VALID", dataCambiamentoStato: "2021-01-08", nota: null, lastState: true }], tipoDocumento: { id: "e617df75-0c3b-41a6-b7a0-c514ede2e9ee", codice: "CU", descrizione: "Certifcazione Unica" }, tipoServizio: { id: "f2c7415f-5a20-4f14-a379-d07d0d1cbd9a", codice: "CU", descrizione: "Certificazione Unica" }, url: "/v1/documento/ad397ac0-f017-48e1-98fb-3e4c514adbdb/download" }]; this.nextStep = new EventEmitter(); this.salvaBozza = new EventEmitter(); this.previousStep = new EventEmitter(); this.direction = "both-ways"; this.isFinal = false; this.avantiClicks$ = new Subject(); this.indietroClicks$ = new Subject(); } ngOnInit() { this.form = new FormGroup({}); if (!this.documenti) { this.initDocumnetazione(); } this.addFiles$ = new Subject(); this.removeFile$ = new Subject(); this.removeFile$.subscribe(console.log); //------Si accumulano i documenti validi da inviare------- const adds$ = this.addFiles$.pipe(map((file) => (acc) => { if (file.file != null) { if (!file.file.name.toLowerCase().endsWith(".pdf")) { // this.modals.failure(["Si prega di inserire solamente file in formato pdf"]); this.modals.openConfirm(this.buildErrore("Si prega di inserire solamente file in formato pdf")); return acc; } if (file.file.size == 0) { // this.modals.failure(["Si prega di non inserire file vuoti"]); this.modals.openConfirm(this.buildErrore("zero-file-size")); return acc; } const fileExists = acc.find(loaded => loaded.file.name === file.file.name) != null; if (fileExists) { // this.modals.failure(["Si prega di inserire un file diverso da quelli che sono stati inserti"]); this.modals.openConfirm(this.buildErrore("Si prega di inserire un file diverso da quelli che sono stati inseriti")); return acc; } this.caricaDocumenti.resetForm(); } //console.log("[file]", [...acc, file]); return [...acc, file]; })); this.nomeColonne$ = new Observable(ob => ob.next(["nr._Documento", "tipo_Documento", "data_Documento", "tipologia_emittente", "organo_emittente", "obbligatorio"])); this.mappatura$ = this.addFiles$.pipe(map(file => Object.keys(file[0]))); const removals$ = this.removeFile$.pipe(map((index) => (acc) => { return acc.filter((_, i) => index !== i); })); this.files$ = merge(adds$, removals$).pipe(scan((acc, op) => op(acc), []), startWith([]), tap(_ => console.log("[DocumentazioneComponent] - metadatiDocumenti", _)), shareReplay()); this.viewList$ = this.files$.pipe(map(files => files.length > 0)); const presentAndMissing$ = combineLatest([this.files$, this.tipologieDocumento$]) .pipe(map(([files, tipologieDocumento]) => { const tipiDoc = tipologieDocumento ? tipologieDocumento.filter((t) => t.codice != TipiDocumento.ALTRO) : []; const missing = tipiDoc.filter((tipoDoc) => { const typeFound = files.find((file) => file.tipoDocumento.codice == tipoDoc.codice); return typeFound ? false : true; }); return Tuple.of(files, missing); }), shareReplay()); //scrivere l'errore this.hasMissingFileTypes$ = presentAndMissing$.pipe(map((t) => t._2.length > 0), startWith(false)); // //scrivere l'errore this.missingFileTypes$ = presentAndMissing$.pipe(map((t) => t._2)); //emettere lista dei file caricati const present$ = presentAndMissing$.pipe(map((t) => t._1)); this.subscription = this.avantiClicks$ .pipe(debounceTime(250), withLatestFrom(present$), // tap(([_, present]) => console.log("[present]", present)), tap(([_, present]) => this.nextStep.emit(present))) .subscribe(); this.tipologieDocumentoAll$ = this.tipologieDocumento$; } ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } } forward($event) { this.avantiClicks$.next($event); } backward(_) { this.previousStep.emit([]); } complete(_) { } onSalvaBozza(_) { this.salvaBozza.emit([]); } initDocumnetazione() { this.documenti = new Array(); } buildErrore(msg) { const data = new GenericModalData(); data.title = 'dialogTitleError'; data.paragrafi = [msg ]; const noOp = new Azione('ko'); noOp.testo = 'KO'; data.azioni = [noOp]; return data; } } DocumentazioneComponent.decorators = [ { type: Component, args: [{ selector: 'lib-documentazione', template: "<div class=\"row\" class=\"mt-3 mb-5\">\r\n\t<mat-expansion-panel class=\"panel\" [expanded]=\"true\" [formGroup]=\"form\">\r\n <mat-expansion-panel-header\r\n [collapsedHeight]=\"'48px'\"\r\n [expandedHeight]=\"'48px'\"\r\n class=\"custom-header\"\r\n >\r\n <mat-panel-title>\r\n <h3 class=\"h5 mb-0\"><info-tip-label label=\"documentazione\"></info-tip-label></h3>\r\n </mat-panel-title>\r\n </mat-expansion-panel-header>\r\n\t<div class=\"col-12\">\r\n\t\t<br>\r\n\t\t<div class=\"row\">\r\n\t\t\t<div class=\"col-12 mb-3\">\r\n\t\t\t\t<h3 class=\"h5 mb-0\"><info-tip-label label=\"documentazione-da-allegare\"></info-tip-label></h3>\r\n\t\t\t\t<div class=\"divider\"></div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<lib-carica-documenti\r\n\t\t\t[tipologieDocumento]=\"tipologieDocumentoAll$ | async\"\r\n\t\t\t[tipologieTipiEmittenti$]=\"tipologieTipiEmittenti$\"\r\n\t\t\t(onFileAdded)=\"addFiles$.next($event)\"\r\n\t\t\t#caricaDocumenti\r\n\t\t>\r\n\t\t</lib-carica-documenti>\r\n\t</div>\r\n\t<div class=\"col-12\" *ngIf=\"viewList$ | async\">\r\n\t\t<div class=\"d-flex border-bottom align-items-baseline mb-3\">\r\n\t\t\t<h3 class=\"h5 mb-0\">{{'documentazione-inserita' | traduzione}}</h3>\r\n\t\t</div>\r\n\t</div>\r\n\t<div class=\"col-12\" *ngIf=\"viewList$ | async\">\r\n\t\t<lib-tabella-documenti [files$]=\"files$\" (indiceSelezionato)=\"removeFile$.next($event)\">\r\n\t\t</lib-tabella-documenti>\r\n\t</div>\r\n\t<div class=\"col-md-12\">\r\n\t\t<mat-error *ngIf=\"hasMissingFileTypes$ | async\">\r\n\t\t\t<p class=\"h6 mt-4\">{{'documenti-mancanti' | traduzione}}</p>\r\n\t\t\t<p *ngFor=\"let missing of missingFileTypes$ | async\">\r\n\t\t\t\t{{ missing.descrizione }}\r\n\t\t\t</p>\r\n\t\t</mat-error>\r\n\t</div>\r\n\t</mat-expansion-panel>\r\n\t<div class=\"mt-4\"></div>\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(goForward)=\"forward($event)\"\r\n\t\t(goBackward)=\"backward($event)\"\r\n\t\t(goBackward)=\"complete($event)\"\r\n\t\t(salvaBozza)=\"onSalvaBozza($event)\"\r\n\t\t[isContainerValid]=\"!(hasMissingFileTypes$ | async)\"\r\n\t>\r\n\t</lib-stepper-navigator>\r\n</div>\r\n", styles: [""] },] } ]; DocumentazioneComponent.ctorParameters = () => [ { type: Modals } ]; DocumentazioneComponent.propDecorators = { documenti: [{ type: Input }], tipologieDocumento$: [{ type: Input }], tipologieTipiEmittenti$: [{ type: Input }], nextStep: [{ type: Output }], salvaBozza: [{ type: Output }], previousStep: [{ type: Output }], caricaDocumenti: [{ type: ViewChild, args: ['caricaDocumenti',] }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnRhemlvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IkQ6L1Byb2dldHRpL0RBRy9zb3JnZW50aS9naXRsYWItdGVybmkvY29tbW9uLWNvbXBvbmVudC1saWIvcHJvamVjdHMvcG9ydGFsLWNvbW1vbi1jb21wb25lbnQtbGliL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9kZXBvc2l0aS9jb21wb25lbnRzL2RvY3VtZW50YXppb25lL2RvY3VtZW50YXppb25lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHekMsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUU3RSxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEcsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHMUMsT0FBTyxFQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHlEQUF5RCxDQUFDO0FBUWpHLE1BQU0sT0FBTyx1QkFBdUI7SUFnRW5DLFlBQXNCLE1BQWM7UUFBZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBNURwQyxNQUFNO1FBQ04saUJBQVksR0FBRyxDQUFDO2dCQUNmLGtCQUFrQixFQUFFLHNDQUFzQztnQkFDMUQsYUFBYSxFQUFFLFlBQVk7Z0JB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aUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7Rm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtEb2N1bWVudG9EVE99IGZyb20gXCIuLi8uLi9tb2RlbHMvZG9jdW1lbnRvLWR0b1wiO1xyXG5pbXBvcnQge1RpcG9Eb2N1bWVudG99IGZyb20gXCIuLi8uLi9tb2RlbHMvdGlwby1kb2N1bWVudG9cIjtcclxuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBtZXJnZSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge05ld0ZpbGV9IGZyb20gXCIuL25ldy1maWxlXCI7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBtYXAsIHNjYW4sIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHRhcCwgd2l0aExhdGVzdEZyb219IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQge1R1cGxlfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3R1cGxlXCI7XHJcbmltcG9ydCB7VGlwaURvY3VtZW50b30gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy90aXBpLWRvY3VtZW50aVwiO1xyXG5pbXBvcnQge01vZGFsc30gZnJvbSBcIi4uLy4uL3V0aWxzL21vZGFsc1wiO1xyXG5pbXBvcnQge1RpcG9sb2dpY2FEVE99IGZyb20gXCIuLi8uLi9tb2RlbHMvdGlwb2xvZ2ljYS1kLXQtb1wiO1xyXG5pbXBvcnQge1RpcG9Eb2N1bWVudG9EVE99IGZyb20gXCIuLi8uLi9tb2RlbHMvdGlwby1kb2N1bWVudG8uZHRvXCI7XHJcbmltcG9ydCB7QXppb25lLCBHZW5lcmljTW9kYWxEYXRhfSBmcm9tIFwiLi4vLi4vY29tbW9uLWNvbXBvbmVudC9nZW5lcmljLW1vZGFsL2dlbmVyaWMtbW9kYWwtZGF0YVwiO1xyXG5pbXBvcnQgeyBDYXJpY2FEb2N1bWVudGlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2RvY3VtZW50YXppb25lL2NhcmljYS1kb2N1bWVudGkvY2FyaWNhLWRvY3VtZW50aS5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdsaWItZG9jdW1lbnRhemlvbmUnLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9kb2N1bWVudGF6aW9uZS5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vZG9jdW1lbnRhemlvbmUuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEb2N1bWVudGF6aW9uZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG5cdGZvcm06IEZvcm1Hcm91cDtcclxuXHJcblx0Ly9UT0RPXHJcblx0YWxsZWdhdGlNb2NrID0gW3tcclxuXHRcdGNoaWF2ZUNvbGxlZ2FtZW50bzogXCI3YWZlMmQ2Yy01NzU3LTQ2ODQtOTFmYy0zODdjN2MxNWRiZjZcIixcclxuXHRcdGRhdGFDcmVhemlvbmU6IFwiMjAyMS0wMS0wOFwiLFxyXG5cdFx0ZGF0YUluaXppb1N0YWdpbmc6IFwiMjAyMS0wMS0wOFwiLFxyXG5cdFx0ZGF0YVN0YWdpbmc6IFwiMjAyMS0wMS0wOFwiLFxyXG5cdFx0ZGF0YVZhbGlkYXppb25lOiBudWxsLFxyXG5cdFx0ZGVzY3JpemlvbmU6IFwiVGVzdCByZXF1ZXN0MTBcIixcclxuXHRcdGlkQ3JlYXRvcmU6IFwiMVwiLFxyXG5cdFx0aWREb2N1bWVudG86IFwiYWQzOTdhYzAtZjAxNy00OGUxLTk4ZmItM2U0YzUxNGFkYmRiXCIsXHJcblx0XHRpZElzdGFuemE6IFwiMjM4MGIzNGEtNGIyZC00YTliLTg5NmItYmE0YTI3Y2RiZjdmXCIsXHJcblx0XHRqc29uTWV0YWRhdGk6IFwiXCIsXHJcblx0XHRub21lOiBcImZpbGVkaXRlc3QxMC50eHRcIixcclxuXHRcdHByb3ByaWV0YXJpbzogeyB0aXBvUHJvcHJpZXRhcmlvOiBcIlBGXCIsIGlkUHJvcHJpZXRhcmlvOiBcIjFcIiwgaWRTb3R0b1Byb3ByaWV0YXJpbzogbnVsbCB9LFxyXG5cdFx0c3RhdGlEb2N1bWVudG86IFt7IGlkRG9jdW1lbnRvOiBcImFkMzk3YWMwLWYwMTctNDhlMS05OGZiLTNlNGM1MTRhZGJkYlwiLCBzdGF0bzogXCJET0NfVkFMSURcIiwgZGF0YUNhbWJpYW1lbnRvU3RhdG86IFwiMjAyMS0wMS0wOFwiLCBub3RhOiBudWxsLCBsYXN0U3RhdGU6IHRydWUgfV0sXHJcblx0XHR0aXBvRG9jdW1lbnRvOiB7IGlkOiBcImU2MTdkZjc1LTBjM2ItNDFhNi1iN2EwLWM1MTRlZGUyZTllZVwiLCBjb2RpY2U6IFwiQ1VcIiwgZGVzY3JpemlvbmU6IFwiQ2VydGlmY2F6aW9uZSBVbmljYVwiIH0sXHJcblx0XHR0aXBvU2Vydml6aW86IHsgaWQ6IFwiZjJjNzQxNWYtNWEyMC00ZjE0LWEzNzktZDA3ZDBkMWNiZDlhXCIsIGNvZGljZTogXCJDVVwiLCBkZXNjcml6aW9uZTogXCJDZXJ0aWZpY2F6aW9uZSBVbmljYVwiIH0sXHJcblx0XHR1cmw6IFwiL3YxL2RvY3VtZW50by9hZDM5N2FjMC1mMDE3LTQ4ZTEtOThmYi0zZTRjNTE0YWRiZGIvZG93bmxvYWRcIlxyXG5cdH1dXHJcblxyXG5cdC8vVE9ET1xyXG5cdC8vIEBJbnB1dCgpXHJcblx0Ly8gZG9jdW1lbnRhemlvbmU6IEFycmF5PERvY3VtZW50b0RUTz47XHJcblxyXG5cdEBJbnB1dCgpXHJcblx0ZG9jdW1lbnRpOiBBcnJheTxEb2N1bWVudG9EVE8+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHRpcG9sb2dpZURvY3VtZW50byQ6IE9ic2VydmFibGU8QXJyYXk8VGlwb0RvY3VtZW50b0RUTz4+O1xyXG5cclxuXHRASW5wdXQoKVxyXG5cdHRpcG9sb2dpZVRpcGlFbWl0dGVudGkkOiBPYnNlcnZhYmxlPEFycmF5PFRpcG9sb2dpY2FEVE8+PjtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0bmV4dFN0ZXAgPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PE5ld0ZpbGU+PigpO1xyXG5cclxuXHRAT3V0cHV0KClcclxuXHRzYWx2YUJvenphID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxOZXdGaWxlPj4oKTtcclxuXHJcblx0QE91dHB1dCgpXHJcblx0cHJldmlvdXNTdGVwID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxOZXdGaWxlPj4oKTtcclxuXHJcblx0QFZpZXdDaGlsZCgnY2FyaWNhRG9jdW1lbnRpJylcclxuXHRjYXJpY2FEb2N1bWVudGk6IENhcmljYURvY3VtZW50aUNvbXBvbmVudDtcclxuXHJcblx0YWRkRmlsZXMkOiBTdWJqZWN0PE5ld0ZpbGU+O1xyXG5cdHJlbW92ZUZpbGUkOiBTdWJqZWN0PG51bWJlcj47XHJcblx0ZmlsZXMkOiBPYnNlcnZhYmxlPEFycmF5PE5ld0ZpbGU+PjtcclxuXHR2aWV3TGlzdCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblx0dGlwb2xvZ2llRG9jdW1lbnRvQWxsJDogT2JzZXJ2YWJsZTxBcnJheTxUaXBvRG9jdW1lbnRvRFRPPj47XHJcblx0aGFzTWlzc2luZ0ZpbGVUeXBlcyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XHJcblx0bWlzc2luZ0ZpbGVUeXBlcyQ6IE9ic2VydmFibGU8QXJyYXk8VGlwb0RvY3VtZW50bz4+O1xyXG5cdGRpcmVjdGlvbiA9IFwiYm90aC13YXlzXCI7XHJcblx0aXNGaW5hbCA9IGZhbHNlO1xyXG5cdGF2YW50aUNsaWNrcyQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblx0bm9tZUNvbG9ubmUkOiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xyXG5cdG1hcHBhdHVyYSQ6IE9ic2VydmFibGU8QXJyYXk8c3RyaW5nPj47XHJcblx0aW5kaWV0cm9DbGlja3MkID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cdHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbW9kYWxzOiBNb2RhbHMpIHsgfVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHJcblx0XHR0aGlzLmZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuXHJcblx0XHRpZiAoIXRoaXMuZG9jdW1lbnRpKSB7XHJcblx0XHRcdHRoaXMuaW5pdERvY3VtbmV0YXppb25lKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5hZGRGaWxlcyQgPSBuZXcgU3ViamVjdCgpO1xyXG5cdFx0dGhpcy5yZW1vdmVGaWxlJCA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG5cdFx0dGhpcy5yZW1vdmVGaWxlJC5zdWJzY3JpYmUoY29uc29sZS5sb2cpO1xyXG5cclxuXHRcdC8vLS0tLS0tU2kgYWNjdW11bGFubyBpIGRvY3VtZW50aSB2YWxpZGkgZGEgaW52aWFyZS0tLS0tLS1cclxuXHRcdGNvbnN0IGFkZHMkID0gdGhpcy5hZGRGaWxlcyQucGlwZShcclxuXHRcdFx0bWFwKChmaWxlOiBOZXdGaWxlKSA9PiAoYWNjOiBBcnJheTxOZXdGaWxlPikgPT4ge1xyXG5cdFx0XHRcdGlmIChmaWxlLmZpbGUgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0aWYgKCFmaWxlLmZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFwiLnBkZlwiKSkge1xyXG5cdFx0XHRcdFx0XHQvLyB0aGlzLm1vZGFscy5mYWlsdXJlKFtcIlNpIHByZWdhIGRpIGluc2VyaXJlIHNvbGFtZW50ZSBmaWxlIGluIGZvcm1hdG8gcGRmXCJdKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5tb2RhbHMub3BlbkNvbmZpcm0odGhpcy5idWlsZEVycm9yZShcIlNpIHByZWdhIGRpIGluc2VyaXJlIHNvbGFtZW50ZSBmaWxlIGluIGZvcm1hdG8gcGRmXCIpKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGFjYztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGlmIChmaWxlLmZpbGUuc2l6ZSA9PSAwKSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMubW9kYWxzLmZhaWx1cmUoW1wiU2kgcHJlZ2EgZGkgbm9uIGluc2VyaXJlIGZpbGUgdnVvdGlcIl0pO1xyXG5cdFx0XHRcdFx0XHR0aGlzLm1vZGFscy5vcGVuQ29uZmlybSh0aGlzLmJ1aWxkRXJyb3JlKFwiemVyby1maWxlLXNpemVcIikpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWNjO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc3QgZmlsZUV4aXN0cyA9IGFjYy5maW5kKGxvYWRlZCA9PiBsb2FkZWQuZmlsZS5uYW1lID09PSBmaWxlLmZpbGUubmFtZSkgIT0gbnVsbDtcclxuXHRcdFx0XHRcdGlmIChmaWxlRXhpc3RzKSB7XHJcblx0XHRcdFx0XHRcdC8vIHRoaXMubW9kYWxzLmZhaWx1cmUoW1wiU2kgcHJlZ2EgZGkgaW5zZXJpcmUgdW4gZmlsZSBkaXZlcnNvIGRhIHF1ZWxsaSBjaGUgc29ubyBzdGF0aSBpbnNlcnRpXCJdKTtcclxuXHRcdFx0XHRcdFx0dGhpcy5tb2RhbHMub3BlbkNvbmZpcm0odGhpcy5idWlsZEVycm9yZShcIlNpIHByZWdhIGRpIGluc2VyaXJlIHVuIGZpbGUgZGl2ZXJzbyBkYSBxdWVsbGkgY2hlIHNvbm8gc3RhdGkgaW5zZXJpdGlcIikpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gYWNjO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuY2FyaWNhRG9jdW1lbnRpLnJlc2V0Rm9ybSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKFwiW2ZpbGVdXCIsIFsuLi5hY2MsIGZpbGVdKTtcclxuXHRcdFx0XHRyZXR1cm4gWy4uLmFjYywgZmlsZV07XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMubm9tZUNvbG9ubmUkID1cclxuXHRcdFx0bmV3IE9ic2VydmFibGUob2IgPT4gb2IubmV4dChbXCJuci5fRG9jdW1lbnRvXCIsIFwidGlwb19Eb2N1bWVudG9cIiwgXCJkYXRhX0RvY3VtZW50b1wiLCBcInRpcG9sb2dpYV9lbWl0dGVudGVcIiwgXCJvcmdhbm9fZW1pdHRlbnRlXCIsIFwib2JibGlnYXRvcmlvXCJdKSk7XHJcblxyXG5cdFx0dGhpcy5tYXBwYXR1cmEkID0gdGhpcy5hZGRGaWxlcyQucGlwZShtYXAoZmlsZSA9PiBPYmplY3Qua2V5cyhmaWxlWzBdKSkpXHJcblxyXG5cdFx0Y29uc3QgcmVtb3ZhbHMkID0gdGhpcy5yZW1vdmVGaWxlJC5waXBlKFxyXG5cdFx0XHRtYXAoKGluZGV4OiBudW1iZXIpID0+IChhY2M6IEFycmF5PE5ld0ZpbGU+KSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIGFjYy5maWx0ZXIoKF8sIGkpID0+IGluZGV4ICE9PSBpKTtcclxuXHRcdFx0fSlcclxuXHRcdCk7XHJcblxyXG5cdFx0dGhpcy5maWxlcyQgPSBtZXJnZShhZGRzJCwgcmVtb3ZhbHMkKS5waXBlKFxyXG5cdFx0XHRzY2FuKChhY2MsIG9wKSA9PiBvcChhY2MpLCBbXSksXHJcblx0XHRcdHN0YXJ0V2l0aChbXSksXHJcblx0XHRcdHRhcChfID0+IGNvbnNvbGUubG9nKFwiW0RvY3VtZW50YXppb25lQ29tcG9uZW50XSAtIG1ldGFkYXRpRG9jdW1lbnRpXCIsIF8pKSxcclxuXHRcdFx0c2hhcmVSZXBsYXkoKVxyXG5cdFx0KTtcclxuXHJcblx0XHR0aGlzLnZpZXdMaXN0JCA9IHRoaXMuZmlsZXMkLnBpcGUobWFwKGZpbGVzID0+IGZpbGVzLmxlbmd0aCA+IDApKTtcclxuXHJcblx0XHRjb25zdCBwcmVzZW50QW5kTWlzc2luZyQgPSBjb21iaW5lTGF0ZXN0KFxyXG5cdFx0XHRbdGhpcy5maWxlcyQsIHRoaXMudGlwb2xvZ2llRG9jdW1lbnRvJF1cclxuXHRcdClcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0bWFwKChbZmlsZXMsIHRpcG9sb2dpZURvY3VtZW50b10pID0+IHtcclxuXHRcdFx0XHRcdGNvbnN0IHRpcGlEb2MgPSB0aXBvbG9naWVEb2N1bWVudG9cclxuXHRcdFx0XHRcdFx0PyB0aXBvbG9naWVEb2N1bWVudG8uZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdCh0KSA9PiB0LmNvZGljZSAhPSBUaXBpRG9jdW1lbnRvLkFMVFJPXHJcblx0XHRcdFx0XHRcdClcclxuXHRcdFx0XHRcdFx0OiBbXTtcclxuXHJcblx0XHRcdFx0XHRjb25zdCBtaXNzaW5nID0gdGlwaURvYy5maWx0ZXIoKHRpcG9Eb2MpID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgdHlwZUZvdW5kID0gZmlsZXMuZmluZChcclxuXHRcdFx0XHRcdFx0XHQoZmlsZSkgPT4gZmlsZS50aXBvRG9jdW1lbnRvLmNvZGljZSA9PSB0aXBvRG9jLmNvZGljZVxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHlwZUZvdW5kID8gZmFsc2UgOiB0cnVlO1xyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIFR1cGxlLm9mKGZpbGVzLCBtaXNzaW5nKTtcclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0XHRzaGFyZVJlcGxheSgpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0Ly9zY3JpdmVyZSBsJ2Vycm9yZVxyXG5cdFx0dGhpcy5oYXNNaXNzaW5nRmlsZVR5cGVzJCA9IHByZXNlbnRBbmRNaXNzaW5nJC5waXBlKFxyXG5cdFx0XHRtYXAoKHQpID0+IHQuXzIubGVuZ3RoID4gMCksXHJcblx0XHRcdHN0YXJ0V2l0aChmYWxzZSlcclxuXHRcdCk7XHJcblxyXG5cdFx0Ly8gLy9zY3JpdmVyZSBsJ2Vycm9yZVxyXG5cdFx0dGhpcy5taXNzaW5nRmlsZVR5cGVzJCA9IHByZXNlbnRBbmRNaXNzaW5nJC5waXBlKG1hcCgodCkgPT4gdC5fMikpO1xyXG5cclxuXHRcdC8vZW1ldHRlcmUgbGlzdGEgZGVpIGZpbGUgY2FyaWNhdGlcclxuXHRcdGNvbnN0IHByZXNlbnQkID0gcHJlc2VudEFuZE1pc3NpbmckLnBpcGUobWFwKCh0KSA9PiB0Ll8xKSk7XHJcblxyXG5cdFx0dGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmF2YW50aUNsaWNrcyRcclxuXHRcdFx0LnBpcGUoXHJcblx0XHRcdFx0ZGVib3VuY2VUaW1lKDI1MCksXHJcblx0XHRcdFx0d2l0aExhdGVzdEZyb20ocHJlc2VudCQpLFxyXG5cdFx0XHRcdC8vIHRhcCgoW18sIHByZXNlbnRdKSA9PiBjb25zb2xlLmxvZyhcIltwcmVzZW50XVwiLCBwcmVzZW50KSksXHJcblx0XHRcdFx0dGFwKChbXywgcHJlc2VudF0pID0+IHRoaXMubmV4dFN0ZXAuZW1pdChwcmVzZW50KSlcclxuXHRcdFx0KVxyXG5cdFx0XHQuc3Vic2NyaWJlKCk7XHJcblxyXG5cdFx0dGhpcy50aXBvbG9naWVEb2N1bWVudG9BbGwkID0gdGhpcy50aXBvbG9naWVEb2N1bWVudG8kO1xyXG5cdH1cclxuXHJcblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZvcndhcmQoJGV2ZW50OiBhbnkpIHtcclxuXHRcdHRoaXMuYXZhbnRpQ2xpY2tzJC5uZXh0KCRldmVudCk7XHJcblx0fVxyXG5cclxuXHRiYWNrd2FyZChfOiBhbnkpIHtcclxuXHRcdHRoaXMucHJldmlvdXNTdGVwLmVtaXQoW10pO1xyXG5cdH1cclxuXHJcblx0Y29tcGxldGUoXzogYW55KSB7IH1cclxuXHJcblx0b25TYWx2YUJvenphKF86IGFueSkge1xyXG5cdFx0dGhpcy5zYWx2YUJvenphLmVtaXQoW10pO1xyXG5cdH1cclxuXHJcblx0aW5pdERvY3VtbmV0YXppb25lKCkge1xyXG5cdFx0dGhpcy5kb2N1bWVudGkgPSBuZXcgQXJyYXk8RG9jdW1lbnRvRFRPPigpO1xyXG5cdH1cclxuXHJcblx0YnVpbGRFcnJvcmUobXNnOiBzdHJpbmcpOiBHZW5lcmljTW9kYWxEYXRhIHtcclxuXHRcdGNvbnN0IGRhdGEgPSBuZXcgR2VuZXJpY01vZGFsRGF0YSgpO1xyXG5cclxuXHRcdGRhdGEudGl0bGUgPSAnZGlhbG9nVGl0bGVFcnJvcic7XHJcblx0XHRkYXRhLnBhcmFncmFmaSA9XHJcblx0XHRcdFsgbXNnXHJcblx0XHRcdF07XHJcblx0XHRjb25zdCBub09wID0gbmV3IEF6aW9uZSgna28nKTtcclxuXHRcdG5vT3AudGVzdG8gPSAnS08nO1xyXG5cclxuXHRcdGRhdGEuYXppb25pID0gW25vT3BdO1xyXG5cdFx0cmV0dXJuIGRhdGE7XHJcblx0fVxyXG5cclxufVxyXG4iXX0=