UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

162 lines 26.1 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core'; import { ModalController } from '@ionic/angular'; import { ColumnMode } from '@swimlane/ngx-datatable'; import { BehaviorSubject, Subject, combineLatest } from 'rxjs'; import { switchMap, takeUntil } from 'rxjs/operators'; import { MonitoringAppGenComponent } from '../../metadata/decorators'; import { ChartDataModel, } from '../ChartDataModel'; import { TapVariableDataPopupComponent } from '../tap-variable-data-popup/tap-variable-data-popup.component'; import * as i0 from "@angular/core"; import * as i1 from "@ionic/angular"; import * as i2 from "@angular/common"; import * as i3 from "@swimlane/ngx-datatable"; import * as i4 from "../../ui-directive/export-data.directive"; const TABLE_LIMIT = 10; let TapVariableTableComponent = class TapVariableTableComponent { set history(enable) { this._history.next(enable); } set valueCountLimit(limit) { if (limit === undefined) { limit = 30; } this._valueCountLimit.next(limit); } set label(indexOrArray) { this.chartModel.initLabel(indexOrArray); } set variable(variableOrArray) { this.multiple = !!Array.isArray(variableOrArray); this.input = this.chartModel.initVariable(variableOrArray); } set input(inputs) { this._input.next(inputs); } columnsPushForEachKey(key) { console.log('DEBUG columnsPushForEachKey', key, this.columns); if (this.history && key === 'name') { this.columns.push({ prop: key, name: !this.nameLabel ? this.history ? 'Time' : 'Name' : this.nameLabel, sortable: true, }); } else if (key === 'value') { this.columns.push({ prop: key, name: this.valueLabel, sortable: true }); } else if (key !== 'extra') { this.columns.push({ prop: key, name: key, sortable: true }); } } constructor(modalController, cdr) { this.modalController = modalController; this.cdr = cdr; this.rows = []; this.chartModel = new ChartDataModel(); this.loadingIndicator = true; this.reorderable = false; this.columnMode = ColumnMode.force; this.limit = TABLE_LIMIT; this.valueLabel = 'Value'; this.showExportButton = false; this._history = new BehaviorSubject(true); this._valueCountLimit = new BehaviorSubject(30); this.destroyed = new Subject(); this._input = new BehaviorSubject([]); this.multiple = false; } createExportedData() { return this.rows; } ngAfterViewInit() { this.darkModeStatus = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; combineLatest([this._valueCountLimit, this._input, this._history]) .pipe(takeUntil(this.destroyed), switchMap(([valueCountLimit, input, history]) => { this.chartModel.destroyCurrentSub(); if (this.multiple) { return this.chartModel.defineMultiInputStream(input); } else { return this.chartModel.defineInputStreamSingle(input, history, valueCountLimit, true); } })) .subscribe((result) => { this.resultToTableData(result); }); } resultToTableData(result) { this.rows = result; this.columns = []; const jsonData = JSON.parse(JSON.stringify(this.rows[0])); for (const key of Object.keys(jsonData)) { if (key === 'series') { jsonData['series'].forEach((k) => this.columnsPushForEachKey(k.name)); } else { this.columnsPushForEachKey(key); } } this.loadingIndicator = false; this.cdr.detectChanges(); } onSelect(event) { if (typeof event === 'object') { this.chartModel .showDetail(event, this.modalController, TapVariableDataPopupComponent) .catch((err) => { console.warn(err); }); } } ngOnDestroy() { this.chartModel.destroyCurrentSub(); this.destroyed.next(); this.destroyed.complete(); } }; /** @nocollapse */ TapVariableTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableTableComponent, deps: [{ token: i1.ModalController }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TapVariableTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TapVariableTableComponent, selector: "tap-variable-table", inputs: { loadingIndicator: "loadingIndicator", reorderable: "reorderable", columnMode: "columnMode", limit: "limit", valueLabel: "valueLabel", nameLabel: "nameLabel", history: "history", valueCountLimit: "valueCountLimit", showExportButton: "showExportButton", exportedFileName: "exportedFileName", label: "label", variable: "variable", input: "input" }, ngImport: i0, template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "component", type: i1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: i4.ExportDataDirective, selector: "[tapExportData]", inputs: ["exportedFileName", "dataToExport", "format"], outputs: ["exportDataError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); TapVariableTableComponent = __decorate([ MonitoringAppGenComponent({}), __metadata("design:paramtypes", [ModalController, ChangeDetectorRef]) ], TapVariableTableComponent); export { TapVariableTableComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TapVariableTableComponent, decorators: [{ type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'tap-variable-table', template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"] }] }], ctorParameters: function () { return [{ type: i1.ModalController }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { loadingIndicator: [{ type: Input }], reorderable: [{ type: Input }], columnMode: [{ type: Input }], limit: [{ type: Input }], valueLabel: [{ type: Input }], nameLabel: [{ type: Input }], history: [{ type: Input }], valueCountLimit: [{ type: Input }], showExportButton: [{ type: Input }], exportedFileName: [{ type: Input }], label: [{ type: Input }], variable: [{ type: Input }], input: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGNBQWMsR0FJZixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7QUFFN0csTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBU2hCLElBQU0seUJBQXlCLEdBQS9CLE1BQU0seUJBQXlCO0lBMEJwQyxJQUNJLE9BQU8sQ0FBQyxNQUFlO1FBQ3pCLElBQUksQ0FBQyxRQUFR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ckM7U0FsS1kseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBTnJDLFNBQVM7c0NBQ1MsdUJBQXVCLENBQUMsTUFBTSxZQUNyQyxvQkFBb0I7c0lBYTlCLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLFdBQVc7c0JBRFYsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSUYsT0FBTztzQkFEVixLQUFLO2dCQU1GLGVBQWU7c0JBRGxCLEtBQUs7Z0JBU04sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSUYsS0FBSztzQkFEUixLQUFLO2dCQWdCRixRQUFRO3NCQURYLEtBQUs7Z0JBWUYsS0FBSztzQkFEUixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQWJzdHJhY3RWYXJpYWJsZSB9IGZyb20gJ0Bpb3RpemUvdGFwL2RhdGEnO1xuaW1wb3J0IHsgQ29sdW1uTW9kZSB9IGZyb20gJ0Bzd2ltbGFuZS9uZ3gtZGF0YXRhYmxlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbWV0YWRhdGEvZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBDaGFydERhdGFNb2RlbCxcbiAgQ2hhcnRJbnB1dFNpbmdsZSxcbiAgQ2hhcnRJbnB1dFN0cmVhbVZhcixcbiAgQ2hhcnRJbnB1dFRhYmxlLFxufSBmcm9tICcuLi9DaGFydERhdGFNb2RlbCc7XG5pbXBvcnQgeyBPbkNoYXJ0U2VsZWN0RXZlbnQgfSBmcm9tICcuLi9zaGFyZWQtdHlwZXMnO1xuaW1wb3J0IHsgVGFwVmFyaWFibGVEYXRhUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi90YXAtdmFyaWFibGUtZGF0YS1wb3B1cC90YXAtdmFyaWFibGUtZGF0YS1wb3B1cC5jb21wb25lbnQnO1xuXG5jb25zdCBUQUJMRV9MSU1JVCA9IDEwO1xuXG5ATW9uaXRvcmluZ0FwcEdlbkNvbXBvbmVudCh7fSlcbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc2VsZWN0b3I6ICd0YXAtdmFyaWFibGUtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhcFZhcmlhYmxlVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICByb3dzOiBDaGFydElucHV0U2luZ2xlW10gfCBDaGFydElucHV0VGFibGVbXSA9IFtdO1xuXG4gIGNvbHVtbnMhOiBhbnlbXTtcbiAgZGFya01vZGVTdGF0dXM/OiBib29sZWFuO1xuXG4gIHByaXZhdGUgY2hhcnRNb2RlbDogQ2hhcnREYXRhTW9kZWwgPSBuZXcgQ2hhcnREYXRhTW9kZWwoKTtcblxuICBASW5wdXQoKVxuICBsb2FkaW5nSW5kaWNhdG9yID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICByZW9yZGVyYWJsZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGNvbHVtbk1vZGUgPSBDb2x1bW5Nb2RlLmZvcmNlO1xuXG4gIEBJbnB1dCgpXG4gIGxpbWl0OiBudW1iZXIgPSBUQUJMRV9MSU1JVDtcblxuICBASW5wdXQoKVxuICB2YWx1ZUxhYmVsID0gJ1ZhbHVlJztcblxuICBASW5wdXQoKVxuICBuYW1lTGFiZWw/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IGhpc3RvcnkoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faGlzdG9yeS5uZXh0KGVuYWJsZSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWVDb3VudExpbWl0KGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGltaXQgPSAzMDtcbiAgICB9XG4gICAgdGhpcy5fdmFsdWVDb3VudExpbWl0Lm5leHQobGltaXQpO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGV4cG9ydGVkRmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IGxhYmVsKGluZGV4T3JBcnJheTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBGdW5jdGlvbikge1xuICAgIHRoaXMuY2hhcnRNb2RlbC5pbml0TGFiZWwoaW5kZXhPckFycmF5KTtcbiAgfVxuXG4gIHByaXZhdGUgX2hpc3RvcnkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuXG4gIHByaXZhdGUgX3ZhbHVlQ291bnRMaW1pdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigzMCk7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgX2lucHV0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFydElucHV0U3RyZWFtVmFyW10+KFtdKTtcblxuICBwcml2YXRlIG11bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IHZhcmlhYmxlKFxuICAgIHZhcmlhYmxlT3JBcnJheTpcbiAgICAgIHwgQWJzdHJhY3RWYXJpYWJsZTxudW1iZXIgfCBudW1iZXJbXT5cbiAgICAgIHwgQWJzdHJhY3RWYXJpYWJsZTxudW1iZXIgfCBudW1iZXJbXT5bXVxuICAgICAgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy5tdWx0aXBsZSA9ICEhQXJyYXkuaXNBcnJheSh2YXJpYWJsZU9yQXJyYXkpO1xuICAgIHRoaXMuaW5wdXQgPSB0aGlzLmNoYXJ0TW9kZWwuaW5pdFZhcmlhYmxlKHZhcmlhYmxlT3JBcnJheSk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXQoaW5wdXRzOiBDaGFydElucHV0U3RyZWFtVmFyW10pIHtcbiAgICB0aGlzLl9pbnB1dC5uZXh0KGlucHV0cyk7XG4gIH1cblxuICBjb2x1bW5zUHVzaEZvckVhY2hLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZygnREVCVUcgY29sdW1uc1B1c2hGb3JFYWNoS2V5Jywga2V5LCB0aGlzLmNvbHVtbnMpO1xuICAgIGlmICh0aGlzLmhpc3RvcnkgJiYga2V5ID09PSAnbmFtZScpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgcHJvcDoga2V5LFxuICAgICAgICBuYW1lOiAhdGhpcy5uYW1lTGFiZWxcbiAgICAgICAgICA/IHRoaXMuaGlzdG9yeVxuICAgICAgICAgICAgPyAnVGltZSdcbiAgICAgICAgICAgIDogJ05hbWUnXG4gICAgICAgICAgOiB0aGlzLm5hbWVMYWJlbCxcbiAgICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3ZhbHVlJykge1xuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goeyBwcm9wOiBrZXksIG5hbWU6IHRoaXMudmFsdWVMYWJlbCwgc29ydGFibGU6IHRydWUgfSk7XG4gICAgfSBlbHNlIGlmIChrZXkgIT09ICdleHRyYScpIHtcbiAgICAgIHRoaXMuY29sdW1ucy5wdXNoKHsgcHJvcDoga2V5LCBuYW1lOiBrZXksIHNvcnRhYmxlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7fVxuXG4gIGNyZWF0ZUV4cG9ydGVkRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGFya01vZGVTdGF0dXMgPVxuICAgICAgd2luZG93Lm1hdGNoTWVkaWEgJiZcbiAgICAgIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcztcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLl92YWx1ZUNvdW50TGltaXQsIHRoaXMuX2lucHV0LCB0aGlzLl9oaXN0b3J5XSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxuICAgICAgICBzd2l0Y2hNYXAoKFt2YWx1ZUNvdW50TGltaXQsIGlucHV0LCBoaXN0b3J5XSkgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhcnRNb2RlbC5kZXN0cm95Q3VycmVudFN1YigpO1xuICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFydE1vZGVsLmRlZmluZU11bHRpSW5wdXRTdHJlYW0oaW5wdXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFydE1vZGVsLmRlZmluZUlucHV0U3RyZWFtU2luZ2xlKFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgaGlzdG9yeSxcbiAgICAgICAgICAgICAgdmFsdWVDb3VudExpbWl0LFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLnJlc3VsdFRvVGFibGVEYXRhKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlc3VsdFRvVGFibGVEYXRhKHJlc3VsdDogYW55KSB7XG4gICAgdGhpcy5yb3dzID0gcmVzdWx0O1xuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLnJvd3NbMF0pKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhqc29uRGF0YSkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdzZXJpZXMnKSB7XG4gICAgICAgIGpzb25EYXRhWydzZXJpZXMnXS5mb3JFYWNoKChrOiB7IG5hbWU6IHN0cmluZyB9KSA9PlxuICAgICAgICAgIHRoaXMuY29sdW1uc1B1c2hGb3JFYWNoS2V5KGsubmFtZSlcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29sdW1uc1B1c2hGb3JFYWNoS2V5KGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9hZGluZ0luZGljYXRvciA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uU2VsZWN0KGV2ZW50OiBPbkNoYXJ0U2VsZWN0RXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5jaGFydE1vZGVsXG4gICAgICAgIC5zaG93RGV0YWlsKGV2ZW50LCB0aGlzLm1vZGFsQ29udHJvbGxlciwgVGFwVmFyaWFibGVEYXRhUG9wdXBDb21wb25lbnQpXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnRNb2RlbC5kZXN0cm95Q3VycmVudFN1YigpO1xuICAgIHRoaXMuZGVzdHJveWVkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICB9XG59XG4iLCI8ZGl2IHN0eWxlPVwicG9zaXRpb246IHJlbGF0aXZlXCI+XG4gIDxuZ3gtZGF0YXRhYmxlXG4gICAgW25nQ2xhc3NdPVwiZGFya01vZGVTdGF0dXMgPyAnZGFyaycgOiAnbWF0ZXJpYWwnXCJcbiAgICBbcm93c109XCJyb3dzXCJcbiAgICBbbG9hZGluZ0luZGljYXRvcl09XCJsb2FkaW5nSW5kaWNhdG9yXCJcbiAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcbiAgICBbY29sdW1uTW9kZV09XCJjb2x1bW5Nb2RlXCJcbiAgICBbaGVhZGVySGVpZ2h0XT1cIjUwXCJcbiAgICBbZm9vdGVySGVpZ2h0XT1cIjUwXCJcbiAgICBbcm93SGVpZ2h0XT1cIjUwXCJcbiAgICBbcmVvcmRlcmFibGVdPVwicmVvcmRlcmFibGVcIlxuICAgIFtzY3JvbGxiYXJIXT1cInRydWVcIlxuICAgIFtsaW1pdF09XCJsaW1pdFwiXG4gID5cbiAgPC9uZ3gtZGF0YXRhYmxlPlxuICA8IS0tXG4gICAgICAgIFt0YXJnZXRNYXJrZXJUZW1wbGF0ZV09XCJ0YXJnZXRNYXJrZXJUZW1wbGF0ZVwiXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjdGFyZ2V0TWFya2VyVGVtcGxhdGUgbGV0LWNsYXNzPVwiY2xhc3NcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cImNsYXNzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbiBkYXRhdGFibGUtaWNvbi1kb3duXCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiaWNvbiBkYXRhdGFibGUtaWNvbi11cFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIC0tPlxuXG4gIDxpb24tZmFiLWJ1dHRvblxuICAgIGlkPVwiZXhwb3J0RmFiQnV0dG9uXCJcbiAgICBzaXplPVwic21hbGxcIlxuICAgIHRhcEV4cG9ydERhdGFcbiAgICBbZGF0YVRvRXhwb3J0XT1cImNyZWF0ZUV4cG9ydGVkRGF0YS5iaW5kKHRoaXMpXCJcbiAgICBbZXhwb3J0ZWRGaWxlTmFtZV09XCJleHBvcnRlZEZpbGVOYW1lXCJcbiAgICAqbmdJZj1cInNob3dFeHBvcnRCdXR0b25cIlxuICA+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZFwiPjwvaW9uLWljb24+XG4gIDwvaW9uLWZhYi1idXR0b24+XG48L2Rpdj5cbiJdfQ==