UNPKG

reports-hyper74

Version:

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

93 lines 22 kB
import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core'; import { sharedGridLayout } from '../utils/sharedLayOut'; import * as i0 from "@angular/core"; import * as i1 from "../reports.service"; import * as i2 from "@angular/common"; import * as i3 from "@angular/material/card"; import * as i4 from "@angular/material/icon"; import * as i5 from "@angular/material/grid-list"; import * as i6 from "@angular/material/form-field"; import * as i7 from "@angular/material/datepicker"; import * as i8 from "@angular/material/select"; import * as i9 from "@angular/material/core"; import * as i10 from "@angular/material/button"; import * as i11 from "@angular/forms"; import * as i12 from "@angular/material/input"; export class ReportDetailsComponent { constructor(reportService, datepipe) { this.reportService = reportService; this.datepipe = datepipe; this.$subs = []; this.breakpoint = 3; this.onExecuteFired = new EventEmitter(); this.backClicked = new EventEmitter(); } ngOnInit() { this.breakpoint = sharedGridLayout(); this.loadReportFilters(); } onResize(event) { this.breakpoint = sharedGridLayout(true, event); } loadReportFilters() { const sub1 = this.reportService .getReportWithFilters(this.loadReportDetailFilters, this.reportId) .subscribe((res) => { this.reportDetails = res; }); this.$subs.push(sub1); } ngOnDestroy() { this.$subs.forEach((item) => item.unsubscribe()); } validateAndConvertData() { var _a, _b; if (this.reportDetails && this.reportDetails.reportFilters) { for (let i = 0; i < ((_b = (_a = this.reportDetails) === null || _a === void 0 ? void 0 : _a.reportFilters) === null || _b === void 0 ? void 0 : _b.length); i++) { this.reportDetails.reportFilters[i].value = this.reportDetails.reportFilters[i].dataType.toLocaleLowerCase() === 'date' ? this.datepipe.transform(this.reportDetails.reportFilters[i].value, 'yyyy-MM-dd') : this.reportDetails.reportFilters[i].value; } } return true; } execute() { var _a; if ((_a = this.executeForm) === null || _a === void 0 ? void 0 : _a.invalid) { this.executeForm.form.markAllAsTouched(); return; } this.validateAndConvertData(); sessionStorage.setItem('executeForm', JSON.stringify(this.reportDetails.reportFilters)); sessionStorage.setItem('reportName', this.reportDetails.name); this.onExecuteFired.emit({ fired: true }); } onBackClicked() { this.backClicked.emit({ back: true }); } } ReportDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ReportDetailsComponent, deps: [{ token: i1.ReportsService }, { token: i2.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); ReportDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: ReportDetailsComponent, selector: "lib-report-details", inputs: { reportId: "reportId", loadReportDetailFilters: "loadReportDetailFilters" }, outputs: { onExecuteFired: "onExecuteFired", backClicked: "backClicked" }, viewQueries: [{ propertyName: "executeForm", first: true, predicate: ["f"], descendants: true }], ngImport: i0, template: "<mat-card class=\"example-card\">\n <mat-card-title><mat-icon (click)=\"onBackClicked()\" class=\"back-btn\">arrow_back</mat-icon> {{reportDetails?.name}}</mat-card-title>\n <mat-card-subtitle>{{reportDetails?.descreption}}</mat-card-subtitle>\n <mat-card-content *ngIf=\"reportDetails\">\n <form name=\"form\" #f=\"ngForm\" novalidate >\n <mat-grid-list class=\"mt-2\" [cols]=\"breakpoint\" (window:resize)=\"onResize($event)\" rowHeight=\"100px\">\n <mat-grid-tile *ngFor=\"let filter of reportDetails.reportFilters\">\n <mat-form-field class=\"form-field\" appearance=\"outline\" *ngIf=\"filter.dataType.toLowerCase() == 'date' \">\n <mat-label class=\"form-label\">{{filter.name}} </mat-label>\n <input matInput [matDatepicker]=\"picker\" #date=\"ngModel\"\n [name]=\"filter.name\" [(ngModel)]=\"filter.value\" [required]=\"filter.required\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n\n </mat-form-field>\n\n <mat-form-field class=\"form-field\" appearance=\"outline\" *ngIf=\"filter.dataType.toLowerCase() == 'text' \">\n <mat-label class=\"form-label\">{{filter.name}} </mat-label>\n <input matInput *ngIf=\"filter.dataType.toLowerCase() == 'text' \" [name]=\"filter.name\"\n [(ngModel)]=\"filter.value\" [required]=\"filter.required\">\n </mat-form-field>\n <mat-form-field class=\"form-field\" appearance=\"outline\" *ngIf=\"filter.dataType.toLowerCase() == 'number' \">\n <mat-label class=\"form-label\">{{filter.name}} </mat-label>\n <input matInput type=\"number\" [name]=\"filter.name\"\n [(ngModel)]=\"filter.value\" [required]=\"filter.required\" >\n </mat-form-field>\n\n <mat-form-field class=\"form-field\" appearance=\"outline\"\n *ngIf=\"filter.dataType.toLowerCase() == 'query' || filter.dataType.toLowerCase() ==='lookup'\">\n <mat-label class=\"form-label\">{{filter.name}} </mat-label>\n <mat-select *ngIf=\"filter.dataType.toLowerCase() == 'query' || filter.dataType.toLowerCase() ==='lookup'\"\n [name]=\"filter.name\" [(ngModel)]=\"filter.value\" [required]=\"filter.required\">\n <mat-option *ngFor=\"let option of filter.lookUps\" [value]=\"option.id\">{{option.name}}</mat-option>\n </mat-select>\n </mat-form-field>\n </mat-grid-tile>\n </mat-grid-list>\n </form>\n <button type=\"submit\" mat-button class=\"viewButton\" (click)=\"execute()\">Execute</button>\n\n </mat-card-content>\n</mat-card>\n", styles: [".example-card{height:100%;width:100%;border-radius:8px}.back-btn{vertical-align:sub;color:#f60;cursor:pointer}.mat-form-field{width:93%}.viewButton{background:#FF6600;color:#fff}\n"], components: [{ type: i3.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i5.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["tabIndex", "disabled", "for", "aria-label", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i9.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i10.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i3.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i11.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.MatLabel, selector: "mat-label" }, { type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i11.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.MatSuffix, selector: "[matSuffix]" }, { type: i11.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ReportDetailsComponent, decorators: [{ type: Component, args: [{ selector: 'lib-report-details', templateUrl: './report-details.component.html', styleUrls: ['./report-details.component.css'], // encapsulation: ViewEncapsulation.None, }] }], ctorParameters: function () { return [{ type: i1.ReportsService }, { type: i2.DatePipe }]; }, propDecorators: { reportId: [{ type: Input }], executeForm: [{ type: ViewChild, args: ['f'] }], loadReportDetailFilters: [{ type: Input }], onExecuteFired: [{ type: Output }], backClicked: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy9zcmMvbGliL3JlcG9ydC1kZXRhaWxzL3JlcG9ydC1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMvc3JjL2xpYi9yZXBvcnQtZGV0YWlscy9yZXBvcnQtZGV0YWlscy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFVdkQsTUFBTSxPQUFPLHNCQUFzQjtJQVVqQyxZQUNVLGFBQTZCLEVBQzdCLFFBQWtCO1FBRGxCLGtCQUFhLEdBQWIsYUFBYSxDQUFnQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBVjVCLFVBQUssR0FBbUIsRUFBRSxDQUFDO1FBRTNCLGVBQVUsR0FBVyxDQUFDLENBQUM7UUFHYixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQzVELGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7SUFNbkUsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsVUFBVSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFVO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxpQkFBaUI7UUFDZixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYTthQUM1QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUNqRSxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxzQkFBc0I7O1FBQ3BCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRTtZQUMxRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUcsTUFBQSxNQUFBLElBQUksQ0FBQyxhQUFhLDBDQUFFLGFBQWEsMENBQUUsTUFBTSxDQUFBLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7b0JBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTt3QkFDaEUsTUFBTTt3QkFDSixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFDekMsWUFBWSxDQUNaO3dCQUNGLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7YUFDakQ7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU87O1FBQ0wsSUFBSSxNQUFBLElBQUksQ0FBQyxXQUFXLDBDQUFFLE9BQU8sRUFBRTtZQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLGNBQWMsQ0FBQyxPQUFPLENBQ3BCLGFBQWEsRUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQ2pELENBQUM7UUFDRixjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7O29IQXRFVSxzQkFBc0I7d0dBQXRCLHNCQUFzQiw2VEN0Qm5DLHVzRkEwQ0E7NEZEcEJhLHNCQUFzQjtrQkFObEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixXQUFXLEVBQUUsaUNBQWlDO29CQUM5QyxTQUFTLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQztvQkFDOUMseUNBQXlDO2lCQUN6Qzs0SEFJVSxRQUFRO3NCQUFoQixLQUFLO2dCQUVVLFdBQVc7c0JBQTFCLFNBQVM7dUJBQUMsR0FBRztnQkFDTCx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7TmdGb3JtfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge3NoYXJlZEdyaWRMYXlvdXR9IGZyb20gJy4uL3V0aWxzL3NoYXJlZExheU91dCc7XG5pbXBvcnQge1JlcG9ydHNTZXJ2aWNlfSBmcm9tICcuLi9yZXBvcnRzLnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRlUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLXJlcG9ydC1kZXRhaWxzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcG9ydC1kZXRhaWxzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVwb3J0LWRldGFpbHMuY29tcG9uZW50LmNzcyddLFxuIC8vIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFJlcG9ydERldGFpbHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHJlcG9ydERldGFpbHM6IGFueTtcbiAgJHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gIEBJbnB1dCgpIHJlcG9ydElkOiBudW1iZXI7XG4gIGJyZWFrcG9pbnQ6IG51bWJlciA9IDM7XG4gIEBWaWV3Q2hpbGQoJ2YnKSBleGVjdXRlRm9ybTogTmdGb3JtO1xuICBASW5wdXQoKSBsb2FkUmVwb3J0RGV0YWlsRmlsdGVyczogc3RyaW5nO1xuICBAT3V0cHV0KCkgb25FeGVjdXRlRmlyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBiYWNrQ2xpY2tlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlcG9ydFNlcnZpY2U6IFJlcG9ydHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZXBpcGU6IERhdGVQaXBlXG4gICkge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5icmVha3BvaW50ID0gc2hhcmVkR3JpZExheW91dCgpO1xuICAgIHRoaXMubG9hZFJlcG9ydEZpbHRlcnMoKTtcbiAgfVxuXG4gIG9uUmVzaXplKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJyZWFrcG9pbnQgPSBzaGFyZWRHcmlkTGF5b3V0KHRydWUsIGV2ZW50KTtcbiAgfVxuXG4gIGxvYWRSZXBvcnRGaWx0ZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHN1YjEgPSB0aGlzLnJlcG9ydFNlcnZpY2VcbiAgICAgIC5nZXRSZXBvcnRXaXRoRmlsdGVycyh0aGlzLmxvYWRSZXBvcnREZXRhaWxGaWx0ZXJzLCB0aGlzLnJlcG9ydElkKVxuICAgICAgLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIHRoaXMucmVwb3J0RGV0YWlscyA9IHJlcztcbiAgICAgIH0pO1xuICAgIHRoaXMuJHN1YnMucHVzaChzdWIxKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuJHN1YnMuZm9yRWFjaCgoaXRlbSkgPT4gaXRlbS51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIHZhbGlkYXRlQW5kQ29udmVydERhdGEoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucmVwb3J0RGV0YWlscyAmJiB0aGlzLnJlcG9ydERldGFpbHMucmVwb3J0RmlsdGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlcG9ydERldGFpbHM/LnJlcG9ydEZpbHRlcnM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMucmVwb3J0RGV0YWlscy5yZXBvcnRGaWx0ZXJzW2ldLnZhbHVlID1cbiAgICAgICAgICB0aGlzLnJlcG9ydERldGFpbHMucmVwb3J0RmlsdGVyc1tpXS5kYXRhVHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpID09PVxuICAgICAgICAgICdkYXRlJ1xuICAgICAgICAgICAgPyB0aGlzLmRhdGVwaXBlLnRyYW5zZm9ybShcbiAgICAgICAgICAgICAgdGhpcy5yZXBvcnREZXRhaWxzLnJlcG9ydEZpbHRlcnNbaV0udmFsdWUsXG4gICAgICAgICAgICAgICd5eXl5LU1NLWRkJ1xuICAgICAgICAgICAgKSFcbiAgICAgICAgICAgIDogdGhpcy5yZXBvcnREZXRhaWxzLnJlcG9ydEZpbHRlcnNbaV0udmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZXhlY3V0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leGVjdXRlRm9ybT8uaW52YWxpZCkge1xuICAgICAgdGhpcy5leGVjdXRlRm9ybS5mb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZUFuZENvbnZlcnREYXRhKCk7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICdleGVjdXRlRm9ybScsXG4gICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnJlcG9ydERldGFpbHMucmVwb3J0RmlsdGVycylcbiAgICApO1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3JlcG9ydE5hbWUnLCB0aGlzLnJlcG9ydERldGFpbHMubmFtZSk7XG4gICAgdGhpcy5vbkV4ZWN1dGVGaXJlZC5lbWl0KHtmaXJlZDogdHJ1ZX0pO1xuICB9XG5cbiAgb25CYWNrQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmJhY2tDbGlja2VkLmVtaXQoe2JhY2s6IHRydWV9KTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkIGNsYXNzPVwiZXhhbXBsZS1jYXJkXCI+XG4gIDxtYXQtY2FyZC10aXRsZT48bWF0LWljb24gKGNsaWNrKT1cIm9uQmFja0NsaWNrZWQoKVwiIGNsYXNzPVwiYmFjay1idG5cIj5hcnJvd19iYWNrPC9tYXQtaWNvbj4ge3tyZXBvcnREZXRhaWxzPy5uYW1lfX08L21hdC1jYXJkLXRpdGxlPlxuICA8bWF0LWNhcmQtc3VidGl0bGU+e3tyZXBvcnREZXRhaWxzPy5kZXNjcmVwdGlvbn19PC9tYXQtY2FyZC1zdWJ0aXRsZT5cbiAgPG1hdC1jYXJkLWNvbnRlbnQgKm5nSWY9XCJyZXBvcnREZXRhaWxzXCI+XG4gICAgPGZvcm0gbmFtZT1cImZvcm1cIiAgI2Y9XCJuZ0Zvcm1cIiBub3ZhbGlkYXRlID5cbiAgICAgIDxtYXQtZ3JpZC1saXN0IGNsYXNzPVwibXQtMlwiIFtjb2xzXT1cImJyZWFrcG9pbnRcIiAod2luZG93OnJlc2l6ZSk9XCJvblJlc2l6ZSgkZXZlbnQpXCIgcm93SGVpZ2h0PVwiMTAwcHhcIj5cbiAgICAgICAgPG1hdC1ncmlkLXRpbGUgKm5nRm9yPVwibGV0IGZpbHRlciBvZiByZXBvcnREZXRhaWxzLnJlcG9ydEZpbHRlcnNcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLWZpZWxkXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiAqbmdJZj1cImZpbHRlci5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpID09ICdkYXRlJyBcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3tmaWx0ZXIubmFtZX19IDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cInBpY2tlclwiICNkYXRlPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZmlsdGVyLm5hbWVcIiBbKG5nTW9kZWwpXT1cImZpbHRlci52YWx1ZVwiIFtyZXF1aXJlZF09XCJmaWx0ZXIucmVxdWlyZWRcIj5cbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwicGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlcj48L21hdC1kYXRlcGlja2VyPlxuXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZvcm0tZmllbGRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiICpuZ0lmPVwiZmlsdGVyLmRhdGFUeXBlLnRvTG93ZXJDYXNlKCkgPT0gJ3RleHQnIFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57e2ZpbHRlci5uYW1lfX0gPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgKm5nSWY9XCJmaWx0ZXIuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSA9PSAndGV4dCcgXCIgW25hbWVdPVwiZmlsdGVyLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyLnZhbHVlXCIgW3JlcXVpcmVkXT1cImZpbHRlci5yZXF1aXJlZFwiPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZm9ybS1maWVsZFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgKm5nSWY9XCJmaWx0ZXIuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSA9PSAnbnVtYmVyJyBcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3tmaWx0ZXIubmFtZX19IDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBbbmFtZV09XCJmaWx0ZXIubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXIudmFsdWVcIiBbcmVxdWlyZWRdPVwiZmlsdGVyLnJlcXVpcmVkXCIgPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJmb3JtLWZpZWxkXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImZpbHRlci5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpID09ICdxdWVyeScgfHwgZmlsdGVyLmRhdGFUeXBlLnRvTG93ZXJDYXNlKCkgPT09J2xvb2t1cCdcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3tmaWx0ZXIubmFtZX19IDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgKm5nSWY9XCJmaWx0ZXIuZGF0YVR5cGUudG9Mb3dlckNhc2UoKSA9PSAncXVlcnknIHx8IGZpbHRlci5kYXRhVHlwZS50b0xvd2VyQ2FzZSgpID09PSdsb29rdXAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImZpbHRlci5uYW1lXCIgWyhuZ01vZGVsKV09XCJmaWx0ZXIudmFsdWVcIiBbcmVxdWlyZWRdPVwiZmlsdGVyLnJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZmlsdGVyLmxvb2tVcHNcIiBbdmFsdWVdPVwib3B0aW9uLmlkXCI+e3tvcHRpb24ubmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICA8L2Zvcm0+XG4gICAgPGJ1dHRvbiAgdHlwZT1cInN1Ym1pdFwiIG1hdC1idXR0b24gY2xhc3M9XCJ2aWV3QnV0dG9uXCIgKGNsaWNrKT1cImV4ZWN1dGUoKVwiPkV4ZWN1dGU8L2J1dHRvbj5cblxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPlxuIl19