UNPKG

@iotize/ionic

Version:

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

142 lines 25.9 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Input, NgZone, PLATFORM_ID, ViewChild, } from '@angular/core'; import { ModalController } from '@ionic/angular'; import { BarHorizontal2DComponent, BarVertical2DComponent, BaseChartComponent, LegendPosition, } from '@swimlane/ngx-charts'; import { ChartDataModel } from '../ChartDataModel'; import { dataWithSeriesToCsv } from '../ExportDataFormat'; 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-charts"; import * as i4 from "../../ui-directive/export-data.directive"; export class BarChartStackedComponent extends BaseChartComponent { constructor(myChartElement, zone, cd, platformId, modalController) { super(myChartElement, zone, cd, platformId); this.modalController = modalController; this.legendPosition = LegendPosition.Below; this.showExportButton = false; this.legend = true; this.colorScheme = { domain: [ '#5DADE2', '#9B59B6', '#F39C12', '#5AA454', '#A10A28', '#C7B42C', '#AAAAAA', ], }; this.orientation = 'vertical'; this.showDetails = false; this.noBarWhenZero = false; this.showXAxis = true; this.showYAxis = true; this.history = false; this.valueCountLimit = 10; this.results = [ { name: '---', series: [ { name: '---', value: 0, extra: 0, }, ], }, ]; this.scrollableChart = false; this.chartModel = new ChartDataModel(); } set label(indexOrArray) { this.chartModel.initLabel(indexOrArray); } set data(results) { this.results = results; } createExportedData() { return dataWithSeriesToCsv(this.results); } onSelect(event) { if (typeof event === 'object') { if (this.showDetails) { this.chartModel .showDetail(event, this.modalController, TapVariableDataPopupComponent) .catch((err) => { console.log(err); }); } } } ngAfterViewChecked() { if (!this.scrollableChart) { this.widthChart = this.divContainer.nativeElement.offsetWidth; this.heightChart = this.divContainer.nativeElement.offsetHeight; } this.cd.detectChanges(); } resizeToScroll(size, seriesSize) { if (this.orientation === 'vertical') { if (this.divContainer.nativeElement.offsetWidth <= size * 50 * seriesSize) { this.barChartVer.view = [ size * 50 * seriesSize, this.divContainer.nativeElement.offsetHeight, ]; } } else if (this.orientation === 'horizontal') { if (this.divContainer.nativeElement.offsetHeight <= size * 50 * seriesSize) { this.barChartHor.view = [ this.divContainer.nativeElement.offsetWidth, size * 50 * seriesSize, ]; } } } ngOnDestroy() { this.subscription?.unsubscribe(); this.chartModel.destroyCurrentSub(); } } /** @nocollapse */ BarChartStackedComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BarChartStackedComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: i1.ModalController }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ BarChartStackedComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: BarChartStackedComponent, selector: "iotize-dashboard-bar-chart-stacked", inputs: { orientation: "orientation", showDetails: "showDetails", noBarWhenZero: "noBarWhenZero", showXAxis: "showXAxis", showYAxis: "showYAxis", history: "history", valueCountLimit: "valueCountLimit", label: "label", data: "data", scrollableChart: "scrollableChart" }, viewQueries: [{ propertyName: "divContainer", first: true, predicate: ["containerRef"], descendants: true }, { propertyName: "barChartHor", first: true, predicate: ["barChartHor"], descendants: true }, { propertyName: "barChartVer", first: true, predicate: ["barChartVer"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\n [ngClass]=\"\n scrollableChart\n ? orientation === 'vertical'\n ? 'verticalContainer'\n : 'horizontalContainer'\n : {}\n \"\n>\n <div\n #containerRef\n [ngClass]=\"\n legendPosition === 'below' && legend ? 'belowLegend' : 'rightLegend'\n \"\n [ngSwitch]=\"orientation\"\n style=\"position: relative\"\n >\n <ngx-charts-bar-horizontal-stacked\n *ngSwitchCase=\"'horizontal'\"\n #barChartHor\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [xAxis]=\"showXAxis\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-horizontal-stacked>\n <ngx-charts-bar-vertical-stacked\n *ngSwitchCase=\"'vertical'\"\n #barChartVer\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"showXAxis\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-vertical-stacked>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n *ngIf=\"showExportButton\"\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n </div>\n</div>\n", styles: ["::ng-deep .horizontal-legend{overflow:auto!important}.belowLegend{max-height:50vh;width:100%;min-width:100%;margin-bottom:60px}.rightLegend{max-height:50vh;width:100%}#exportFabButton{position:absolute;top:10px;right:10px}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}.verticalContainer{overflow-y:hidden;overflow-x:auto;max-height:60vh}.horizontalContainer{overflow-x:hidden;overflow-y:auto;max-height:60vh}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.BarHorizontalStackedComponent, selector: "ngx-charts-bar-horizontal-stacked", inputs: ["legend", "legendTitle", "legendPosition", "xAxis", "yAxis", "showXAxisLabel", "showYAxisLabel", "xAxisLabel", "yAxisLabel", "tooltipDisabled", "gradient", "showGridLines", "activeEntries", "schemeType", "trimXAxisTicks", "trimYAxisTicks", "rotateXAxisTicks", "maxXAxisTickLength", "maxYAxisTickLength", "xAxisTickFormatting", "yAxisTickFormatting", "xAxisTicks", "yAxisTicks", "barPadding", "roundDomains", "xScaleMax", "showDataLabel", "dataLabelFormatting", "noBarWhenZero", "wrapTicks"], outputs: ["activate", "deactivate"] }, { kind: "component", type: i3.BarVerticalStackedComponent, selector: "ngx-charts-bar-vertical-stacked", inputs: ["legend", "legendTitle", "legendPosition", "xAxis", "yAxis", "showXAxisLabel", "showYAxisLabel", "xAxisLabel", "yAxisLabel", "tooltipDisabled", "gradient", "showGridLines", "activeEntries", "schemeType", "trimXAxisTicks", "trimYAxisTicks", "rotateXAxisTicks", "maxXAxisTickLength", "maxYAxisTickLength", "xAxisTickFormatting", "yAxisTickFormatting", "xAxisTicks", "yAxisTicks", "barPadding", "roundDomains", "yScaleMax", "showDataLabel", "dataLabelFormatting", "noBarWhenZero", "wrapTicks"], outputs: ["activate", "deactivate"] }, { 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 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BarChartStackedComponent, decorators: [{ type: Component, args: [{ selector: 'iotize-dashboard-bar-chart-stacked', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n [ngClass]=\"\n scrollableChart\n ? orientation === 'vertical'\n ? 'verticalContainer'\n : 'horizontalContainer'\n : {}\n \"\n>\n <div\n #containerRef\n [ngClass]=\"\n legendPosition === 'below' && legend ? 'belowLegend' : 'rightLegend'\n \"\n [ngSwitch]=\"orientation\"\n style=\"position: relative\"\n >\n <ngx-charts-bar-horizontal-stacked\n *ngSwitchCase=\"'horizontal'\"\n #barChartHor\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [xAxis]=\"showXAxis\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-horizontal-stacked>\n <ngx-charts-bar-vertical-stacked\n *ngSwitchCase=\"'vertical'\"\n #barChartVer\n [view]=\"[containerRef.offsetWidth, containerRef.offsetHeight]\"\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [legend]=\"legend\"\n [legendPosition]=\"legendPosition\"\n [noBarWhenZero]=\"noBarWhenZero\"\n [xAxis]=\"showXAxis\"\n [yAxis]=\"showYAxis\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-bar-vertical-stacked>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n *ngIf=\"showExportButton\"\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n </div>\n</div>\n", styles: ["::ng-deep .horizontal-legend{overflow:auto!important}.belowLegend{max-height:50vh;width:100%;min-width:100%;margin-bottom:60px}.rightLegend{max-height:50vh;width:100%}#exportFabButton{position:absolute;top:10px;right:10px}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}.verticalContainer{overflow-y:hidden;overflow-x:auto;max-height:60vh}.horizontalContainer{overflow-x:hidden;overflow-y:auto;max-height:60vh}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: i1.ModalController }]; }, propDecorators: { divContainer: [{ type: ViewChild, args: ['containerRef'] }], barChartHor: [{ type: ViewChild, args: ['barChartHor'] }], barChartVer: [{ type: ViewChild, args: ['barChartVer'] }], orientation: [{ type: Input }], showDetails: [{ type: Input }], noBarWhenZero: [{ type: Input }], showXAxis: [{ type: Input }], showYAxis: [{ type: Input }], history: [{ type: Input }], valueCountLimit: [{ type: Input }], label: [{ type: Input }], data: [{ type: Input }], scrollableChart: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLWNoYXJ0LXN0YWNrZWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW90aXplLWlvbmljL21vbml0b3Jpbmcvc3JjL2xpYi91aS1jb21wb25lbnRzL2Jhci1jaGFydC1zdGFja2VkL2Jhci1jaGFydC1zdGFja2VkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9iYXItY2hhcnQtc3RhY2tlZC9iYXItY2hhcnQtc3RhY2tlZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3RCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsY0FBYyxFQUFtQixNQUFNLG1CQUFtQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTFELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7QUFRN0csTUFBTSxPQUFPLHdCQUNYLFNBQVEsa0JBQWtCO0lBTzFCLFlBQ0UsY0FBK0IsRUFDL0IsSUFBWSxFQUNaLEVBQXFCLEVBQ0EsVUFBa0IsRUFDaEMsZUFBZ0M7UUFFdkMsS0FBSyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFVB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QyxZQUFZO2dCQUM1QyxJQUFJLEdBQUcsRUFBRSxHQUFHLFVBQVUsRUFDdEI7Z0JBQ0EsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUc7b0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFdBQVc7b0JBQzNDLElBQUksR0FBRyxFQUFFLEdBQUcsVUFBVTtpQkFDdkIsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ3RDLENBQUM7O3lJQWpKVSx3QkFBd0IsbUdBWXpCLFdBQVc7NkhBWlYsd0JBQXdCLHVwQkNoQ3JDLDBuREF5REE7NEZEekJhLHdCQUF3QjtrQkFOcEMsU0FBUzsrQkFDRSxvQ0FBb0MsbUJBRzdCLHVCQUF1QixDQUFDLE1BQU07OzBCQWM1QyxNQUFNOzJCQUFDLFdBQVc7MEVBUk0sWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNDLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYTtnQkFDRSxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBaUN4QixXQUFXO3NCQURWLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLGFBQWE7c0JBRFosS0FBSztnQkFJTixTQUFTO3NCQURSLEtBQUs7Z0JBSU4sU0FBUztzQkFEUixLQUFLO2dCQUlOLE9BQU87c0JBRE4sS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBSUYsS0FBSztzQkFEUixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBaUJHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdDaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtcbiAgQmFySG9yaXpvbnRhbDJEQ29tcG9uZW50LFxuICBCYXJWZXJ0aWNhbDJEQ29tcG9uZW50LFxuICBCYXNlQ2hhcnRDb21wb25lbnQsXG4gIExlZ2VuZFBvc2l0aW9uLFxufSBmcm9tICdAc3dpbWxhbmUvbmd4LWNoYXJ0cyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoYXJ0RGF0YU1vZGVsLCBDaGFydElucHV0TXV0bGkgfSBmcm9tICcuLi9DaGFydERhdGFNb2RlbCc7XG5pbXBvcnQgeyBkYXRhV2l0aFNlcmllc1RvQ3N2IH0gZnJvbSAnLi4vRXhwb3J0RGF0YUZvcm1hdCc7XG5pbXBvcnQgeyBPbkNoYXJ0U2VsZWN0RXZlbnQgfSBmcm9tICcuLi9zaGFyZWQtdHlwZXMnO1xuaW1wb3J0IHsgVGFwVmFyaWFibGVEYXRhUG9wdXBDb21wb25lbnQgfSBmcm9tICcuLi90YXAtdmFyaWFibGUtZGF0YS1wb3B1cC90YXAtdmFyaWFibGUtZGF0YS1wb3B1cC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpb3RpemUtZGFzaGJvYXJkLWJhci1jaGFydC1zdGFja2VkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jhci1jaGFydC1zdGFja2VkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYmFyLWNoYXJ0LXN0YWNrZWQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEJhckNoYXJ0U3RhY2tlZENvbXBvbmVudFxuICBleHRlbmRzIEJhc2VDaGFydENvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0NoZWNrZWQsIE9uRGVzdHJveVxue1xuICBAVmlld0NoaWxkKCdjb250YWluZXJSZWYnKSBkaXZDb250YWluZXIhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdiYXJDaGFydEhvcicpIGJhckNoYXJ0SG9yITogQmFySG9yaXpvbnRhbDJEQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdiYXJDaGFydFZlcicpIGJhckNoYXJ0VmVyITogQmFyVmVydGljYWwyRENvbXBvbmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBteUNoYXJ0RWxlbWVudDogRWxlbWVudFJlZjxhbnk+LFxuICAgIHpvbmU6IE5nWm9uZSxcbiAgICBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogc3RyaW5nLFxuICAgIHB1YmxpYyBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlclxuICApIHtcbiAgICBzdXBlcihteUNoYXJ0RWxlbWVudCwgem9uZSwgY2QsIHBsYXRmb3JtSWQpO1xuICB9XG5cbiAgbGVnZW5kUG9zaXRpb246IExlZ2VuZFBvc2l0aW9uID0gTGVnZW5kUG9zaXRpb24uQmVsb3c7XG5cbiAgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGV4cG9ydGVkRmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgbGVnZW5kOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb2xvclNjaGVtZSA9IHtcbiAgICBkb21haW46IFtcbiAgICAgICcjNURBREUyJyxcbiAgICAgICcjOUI1OUI2JyxcbiAgICAgICcjRjM5QzEyJyxcbiAgICAgICcjNUFBNDU0JyxcbiAgICAgICcjQTEwQTI4JyxcbiAgICAgICcjQzdCNDJDJyxcbiAgICAgICcjQUFBQUFBJyxcbiAgICBdLFxuICB9O1xuXG4gIEBJbnB1dCgpXG4gIG9yaWVudGF0aW9uOiBzdHJpbmcgPSAndmVydGljYWwnO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dEZXRhaWxzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgbm9CYXJXaGVuWmVybzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dYQXhpcyA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2hvd1lBeGlzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBoaXN0b3J5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgdmFsdWVDb3VudExpbWl0ID0gMTA7XG5cbiAgQElucHV0KClcbiAgc2V0IGxhYmVsKGluZGV4T3JBcnJheTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBGdW5jdGlvbikge1xuICAgIHRoaXMuY2hhcnRNb2RlbC5pbml0TGFiZWwoaW5kZXhPckFycmF5KTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkYXRhKHJlc3VsdHM6IENoYXJ0SW5wdXRNdXRsaVtdKSB7XG4gICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0cztcbiAgfVxuXG4gIHJlc3VsdHM6IENoYXJ0SW5wdXRNdXRsaVtdID0gW1xuICAgIHtcbiAgICAgIG5hbWU6ICctLS0nLFxuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnLS0tJyxcbiAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICBleHRyYTogMCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXTtcblxuICBASW5wdXQoKSBzY3JvbGxhYmxlQ2hhcnQgPSBmYWxzZTtcblxuICB3aWR0aENoYXJ0PzogbnVtYmVyO1xuICBoZWlnaHRDaGFydD86IG51bWJlcjtcblxuICBwcml2YXRlIGNoYXJ0TW9kZWw6IENoYXJ0RGF0YU1vZGVsID0gbmV3IENoYXJ0RGF0YU1vZGVsKCk7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY3JlYXRlRXhwb3J0ZWREYXRhKCkge1xuICAgIHJldHVybiBkYXRhV2l0aFNlcmllc1RvQ3N2KHRoaXMucmVzdWx0cyk7XG4gIH1cblxuICBvblNlbGVjdChldmVudDogT25DaGFydFNlbGVjdEV2ZW50KSB7XG4gICAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0aGlzLnNob3dEZXRhaWxzKSB7XG4gICAgICAgIHRoaXMuY2hhcnRNb2RlbFxuICAgICAgICAgIC5zaG93RGV0YWlsKFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICB0aGlzLm1vZGFsQ29udHJvbGxlcixcbiAgICAgICAgICAgIFRhcFZhcmlhYmxlRGF0YVBvcHVwQ29tcG9uZW50XG4gICAgICAgICAgKVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2Nyb2xsYWJsZUNoYXJ0KSB7XG4gICAgICB0aGlzLndpZHRoQ2hhcnQgPSB0aGlzLmRpdkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgdGhpcy5oZWlnaHRDaGFydCA9IHRoaXMuZGl2Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgIH1cbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHJlc2l6ZVRvU2Nyb2xsKHNpemU6IG51bWJlciwgc2VyaWVzU2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMub3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA8PVxuICAgICAgICBzaXplICogNTAgKiBzZXJpZXNTaXplXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5iYXJDaGFydFZlci52aWV3ID0gW1xuICAgICAgICAgIHNpemUgKiA1MCAqIHNlcmllc1NpemUsXG4gICAgICAgICAgdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQsXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5kaXZDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPD1cbiAgICAgICAgc2l6ZSAqIDUwICogc2VyaWVzU2l6ZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYmFyQ2hhcnRIb3IudmlldyA9IFtcbiAgICAgICAgICB0aGlzLmRpdkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgICAgIHNpemUgKiA1MCAqIHNlcmllc1NpemUsXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jaGFydE1vZGVsLmRlc3Ryb3lDdXJyZW50U3ViKCk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgW25nQ2xhc3NdPVwiXG4gICAgc2Nyb2xsYWJsZUNoYXJ0XG4gICAgICA/IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnXG4gICAgICAgID8gJ3ZlcnRpY2FsQ29udGFpbmVyJ1xuICAgICAgICA6ICdob3Jpem9udGFsQ29udGFpbmVyJ1xuICAgICAgOiB7fVxuICBcIlxuPlxuICA8ZGl2XG4gICAgI2NvbnRhaW5lclJlZlxuICAgIFtuZ0NsYXNzXT1cIlxuICAgICAgbGVnZW5kUG9zaXRpb24gPT09ICdiZWxvdycgJiYgbGVnZW5kID8gJ2JlbG93TGVnZW5kJyA6ICdyaWdodExlZ2VuZCdcbiAgICBcIlxuICAgIFtuZ1N3aXRjaF09XCJvcmllbnRhdGlvblwiXG4gICAgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIlxuICA+XG4gICAgPG5neC1jaGFydHMtYmFyLWhvcml6b250YWwtc3RhY2tlZFxuICAgICAgKm5nU3dpdGNoQ2FzZT1cIidob3Jpem9udGFsJ1wiXG4gICAgICAjYmFyQ2hhcnRIb3JcbiAgICAgIFt2aWV3XT1cIltjb250YWluZXJSZWYub2Zmc2V0V2lkdGgsIGNvbnRhaW5lclJlZi5vZmZzZXRIZWlnaHRdXCJcbiAgICAgIFtzY2hlbWVdPVwiY29sb3JTY2hlbWVcIlxuICAgICAgW3Jlc3VsdHNdPVwicmVzdWx0c1wiXG4gICAgICBbbGVnZW5kXT1cImxlZ2VuZFwiXG4gICAgICBbbGVnZW5kUG9zaXRpb25dPVwibGVnZW5kUG9zaXRpb25cIlxuICAgICAgW3hBeGlzXT1cInNob3dYQXhpc1wiXG4gICAgICBbbm9CYXJXaGVuWmVyb109XCJub0JhcldoZW5aZXJvXCJcbiAgICAgIFt5QXhpc109XCJzaG93WUF4aXNcIlxuICAgICAgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgICA+XG4gICAgPC9uZ3gtY2hhcnRzLWJhci1ob3Jpem9udGFsLXN0YWNrZWQ+XG4gICAgPG5neC1jaGFydHMtYmFyLXZlcnRpY2FsLXN0YWNrZWRcbiAgICAgICpuZ1N3aXRjaENhc2U9XCIndmVydGljYWwnXCJcbiAgICAgICNiYXJDaGFydFZlclxuICAgICAgW3ZpZXddPVwiW2NvbnRhaW5lclJlZi5vZmZzZXRXaWR0aCwgY29udGFpbmVyUmVmLm9mZnNldEhlaWdodF1cIlxuICAgICAgW3NjaGVtZV09XCJjb2xvclNjaGVtZVwiXG4gICAgICBbcmVzdWx0c109XCJyZXN1bHRzXCJcbiAgICAgIFtsZWdlbmRdPVwibGVnZW5kXCJcbiAgICAgIFtsZWdlbmRQb3NpdGlvbl09XCJsZWdlbmRQb3NpdGlvblwiXG4gICAgICBbbm9CYXJXaGVuWmVyb109XCJub0JhcldoZW5aZXJvXCJcbiAgICAgIFt4QXhpc109XCJzaG93WEF4aXNcIlxuICAgICAgW3lBeGlzXT1cInNob3dZQXhpc1wiXG4gICAgICAoc2VsZWN0KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICAgID5cbiAgICA8L25neC1jaGFydHMtYmFyLXZlcnRpY2FsLXN0YWNrZWQ+XG4gICAgPGlvbi1mYWItYnV0dG9uXG4gICAgICBpZD1cImV4cG9ydEZhYkJ1dHRvblwiXG4gICAgICBzaXplPVwic21hbGxcIlxuICAgICAgdGFwRXhwb3J0RGF0YVxuICAgICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgICAgIFtkYXRhVG9FeHBvcnRdPVwiY3JlYXRlRXhwb3J0ZWREYXRhLmJpbmQodGhpcylcIlxuICAgICAgW2V4cG9ydGVkRmlsZU5hbWVdPVwiZXhwb3J0ZWRGaWxlTmFtZVwiXG4gICAgPlxuICAgICAgPGlvbi1pY29uIG5hbWU9XCJkb3dubG9hZFwiPjwvaW9uLWljb24+XG4gICAgPC9pb24tZmFiLWJ1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==