UNPKG

ngx-beautiful-charts

Version:
387 lines 33.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, ElementRef } from '@angular/core'; import { colorSchemes } from '../../constants/color-schemes'; import { MultiLineGraphService } from './multi-line-graph.service'; import { GlobalParametersService } from '../../global/global-parameters.service'; var MultiLineGraphComponent = /** @class */ (function () { function MultiLineGraphComponent(multiLineGraphService, globalParametersService, currentElement) { this.multiLineGraphService = multiLineGraphService; this.globalParametersService = globalParametersService; this.currentElement = currentElement; this.colorScheme = 'colorful'; this.minX = null; this.minY = null; this.maxX = null; this.maxY = null; this.customColorScheme = []; this.xPadding = 60; this.yPadding = this.xPadding / 2; this.transformedData = []; } /** * @return {?} */ MultiLineGraphComponent.prototype.setDimensions = /** * @return {?} */ function () { if (this.width && !this.height) this.height = this.width / 3; else if (!this.width && this.height) this.width = this.height * 3; else if (!this.width && !this.height) { /** @type {?} */ var host = this.currentElement.nativeElement; if (host.parentNode != null) { /** @type {?} */ var dims = host.parentNode.getBoundingClientRect(); this.width = dims.width; this.height = dims.width / 3; } } // console.log('---set dimensions---'); // console.log('width: ' + this.width); // console.log('height: ' + this.height); // console.log('--------------------'); }; /** * @return {?} */ MultiLineGraphComponent.prototype.setMinandMax = /** * @return {?} */ function () { if (this.minX == null) this.minX = Math.min.apply(Math, tslib_1.__spread(this.data.map((/** * @param {?} line * @return {?} */ function (line) { return Math.min.apply(Math, tslib_1.__spread(line.data.map((/** * @param {?} oneData * @return {?} */ function (oneData) { return oneData.x; })))); })))); if (this.maxX == null) this.maxX = Math.max.apply(Math, tslib_1.__spread(this.data.map((/** * @param {?} line * @return {?} */ function (line) { return Math.max.apply(Math, tslib_1.__spread(line.data.map((/** * @param {?} oneData * @return {?} */ function (oneData) { return oneData.x; })))); })))); if (this.minY == null) this.minY = Math.min.apply(Math, tslib_1.__spread(this.data.map((/** * @param {?} line * @return {?} */ function (line) { return Math.min.apply(Math, tslib_1.__spread(line.data.map((/** * @param {?} oneData * @return {?} */ function (oneData) { return oneData.y; })))); })))); if (this.maxY == null) this.maxY = Math.max.apply(Math, tslib_1.__spread(this.data.map((/** * @param {?} line * @return {?} */ function (line) { return Math.max.apply(Math, tslib_1.__spread(line.data.map((/** * @param {?} oneData * @return {?} */ function (oneData) { return oneData.y; })))); })))); }; /** * @return {?} */ MultiLineGraphComponent.prototype.transformData = /** * @return {?} */ function () { var e_1, _a, e_2, _b; this.transformedData = []; try { for (var _c = tslib_1.__values(this.data), _d = _c.next(); !_d.done; _d = _c.next()) { var singleLine = _d.value; /** @type {?} */ var lineData = void 0; lineData = []; try { for (var _e = tslib_1.__values(singleLine.data), _f = _e.next(); !_f.done; _f = _e.next()) { var point = _f.value; /** @type {?} */ var x = this.multiLineGraphService.transformX(point.x) + this.xPadding; /** @type {?} */ var y = this.multiLineGraphService.transformY(this.multiLineGraphService.maxY - point.y) + this.yPadding; /** @type {?} */ var toolTipX = x; /** @type {?} */ var toolTipY = y - 30; /** @type {?} */ var toolTip = point.info && (point.info !== '') ? 'block' : 'none'; lineData.push({ x: x, y: y, info: point.info, originalX: point.x, originalY: point.y, toolTipTranslate: 'translate(' + toolTipX + 'px, ' + toolTipY + 'px)', toolTip: toolTip }); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_f && !_f.done && (_b = _e.return)) _b.call(_e); } finally { if (e_2) throw e_2.error; } } this.transformedData.push({ name: singleLine.name, color: singleLine.color, data: lineData }); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } }; /** * @return {?} */ MultiLineGraphComponent.prototype.setLinePath = /** * @return {?} */ function () { var e_3, _a, e_4, _b; // console.log(this.printAllInput()); this.graphLinePaths = []; try { for (var _c = tslib_1.__values(this.transformedData), _d = _c.next(); !_d.done; _d = _c.next()) { var singleLine = _d.value; /** @type {?} */ var graphLinePath = 'M'; /** @type {?} */ var singleLineData = void 0; singleLineData = singleLine.data; singleLineData.sort((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return a.x < b.x ? -1 : a.x > b.x ? 1 : 0; })); try { for (var singleLineData_1 = tslib_1.__values(singleLineData), singleLineData_1_1 = singleLineData_1.next(); !singleLineData_1_1.done; singleLineData_1_1 = singleLineData_1.next()) { var point = singleLineData_1_1.value; // console.log(point); /** @type {?} */ var coordX = point.x; /** @type {?} */ var coordY = point.y; graphLinePath += ' ' + coordX + ' ' + coordY; // console.log(graphLinePath); } } catch (e_4_1) { e_4 = { error: e_4_1 }; } finally { try { if (singleLineData_1_1 && !singleLineData_1_1.done && (_b = singleLineData_1.return)) _b.call(singleLineData_1); } finally { if (e_4) throw e_4.error; } } this.graphLinePaths.push({ color: singleLine.color, path: graphLinePath }); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_3) throw e_3.error; } } }; /** * @return {?} */ MultiLineGraphComponent.prototype.setColors = /** * @return {?} */ function () { var e_5, _a; /** @type {?} */ var cnt = 0; try { for (var _b = tslib_1.__values(this.data), _c = _b.next(); !_c.done; _c = _b.next()) { var line = _c.value; if (!line.color) { if (this.customColorScheme.length > 0) { line.color = this.customColorScheme[cnt % this.customColorScheme.length]; } else { line.color = colorSchemes[this.colorScheme][cnt % 10]; } } cnt++; } } catch (e_5_1) { e_5 = { error: e_5_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_5) throw e_5.error; } } }; /** * @return {?} */ MultiLineGraphComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.componentID = this.globalParametersService.addNewComponent(); console.log('init..'); this.setDimensions(); this.setMinandMax(); this.setColors(); this.dataCopy = JSON.parse(JSON.stringify(this.data)); this.multiLineGraphService.setValues({ componentID: this.componentID, width: this.width, height: this.height, minX: this.minX, maxX: this.maxX, minY: this.minY, maxY: this.maxY, dataLength: this.data.length, xPadding: this.xPadding, yPadding: this.yPadding }); this.transformData(); this.setLinePath(); }; /** * @return {?} */ MultiLineGraphComponent.prototype.ngOnChanges = /** * @return {?} */ function () { console.log('changes..'); this.setMinandMax(); this.setColors(); this.dataCopy = JSON.parse(JSON.stringify(this.data)); this.multiLineGraphService.setValues({ componentID: this.componentID, width: this.width, height: this.height, minX: this.minX, maxX: this.maxX, minY: this.minY, maxY: this.maxY, dataLength: this.data.length, xPadding: this.xPadding, yPadding: this.yPadding }); this.transformData(); this.setLinePath(); }; MultiLineGraphComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-multi-line-graph', template: "<svg [attr.width]=\"width\" [attr.height]=\"height\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n <g ngx-mlg-chart-base [data]=\"data\"\n [gridPrecisionX]=\"gridPrecisionX\" [gridPrecisionY]=\"gridPrecisionY\"\n [xAxisTitle]=\"xAxisTitle\" [yAxisTitle]=\"yAxisTitle\"\n />\n \n\n <!-- <g *ngFor=\"let line of data\">\n <g ngx-line-graph chartBase=\"false\" [data]=\"line.data\" [minX]=\"0\" [maxX]=\"100\" \n [minY]=\"0\" [maxY]=\"50\" \n [gridPrecisionX]=\"10\" \n [gridPrecisionY]=\"10\"\n xAxisTitle=\"Time\"\n yAxisTitle=\"Distance\"\n [data]=\"data\"\n color=\"#ff4444\"\n\n [width]=\"beautifulChartsService.rectWidth\" [height]=\"beautifulChartsService.rectHeight\" [color]=\"line.color\" />\n </g> -->\n\n\n <path *ngFor=\"let singleLine of graphLinePaths\" class=\"line-path\"\n [attr.d]=\"singleLine.path\" fill=\"none\" [attr.stroke]=\"singleLine.color\"\n />\n \n \n <g *ngFor=\"let line of transformedData;\">\n <g id=\"component\" *ngFor=\"let point of line.data\">\n <circle class=\"point\" [attr.cx]=\"point.x\" [attr.cy]=\"point.y\" r=\"4\" [attr.fill]=\"line.color\">\n </circle>\n \n <g class=\"tooltip\" [ngStyle]=\"{'transform': point.toolTipTranslate, 'display': point.toolTip}\" \n opacity=\"0.9\">\n <rect rx=\"5\" width=\"100\" height=\"25\"></rect>\n <text x=\"15\" y=\"16\">{{ point.info }}</text>\n </g>\n </g>\n \n </g>\n\n</svg>", providers: [MultiLineGraphService], styles: [".line-path{opacity:.6;stroke-width:3;z-index:999999}.line-path:hover{opacity:1}.point{stroke:#fff;stroke-width:2px}.point:hover{stroke-width:.5}#component .tooltip{visibility:hidden}#component:hover .tooltip{visibility:visible;position:absolute}#component:hover:after .tooltip{position:relative;left:0;top:100%;white-space:nowrap}.tooltip text{fill:#eee;font-size:12px;font-family:sans-serif}.tooltip rect{fill:#222;stroke:#111}"] }] } ]; /** @nocollapse */ MultiLineGraphComponent.ctorParameters = function () { return [ { type: MultiLineGraphService }, { type: GlobalParametersService }, { type: ElementRef } ]; }; MultiLineGraphComponent.propDecorators = { data: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], colorScheme: [{ type: Input }], minX: [{ type: Input }], minY: [{ type: Input }], maxX: [{ type: Input }], maxY: [{ type: Input }], gridPrecisionX: [{ type: Input }], gridPrecisionY: [{ type: Input }], xAxisTitle: [{ type: Input }], yAxisTitle: [{ type: Input }], customColorScheme: [{ type: Input }] }; return MultiLineGraphComponent; }()); export { MultiLineGraphComponent }; if (false) { /** @type {?} */ MultiLineGraphComponent.prototype.data; /** @type {?} */ MultiLineGraphComponent.prototype.width; /** @type {?} */ MultiLineGraphComponent.prototype.height; /** @type {?} */ MultiLineGraphComponent.prototype.colorScheme; /** @type {?} */ MultiLineGraphComponent.prototype.minX; /** @type {?} */ MultiLineGraphComponent.prototype.minY; /** @type {?} */ MultiLineGraphComponent.prototype.maxX; /** @type {?} */ MultiLineGraphComponent.prototype.maxY; /** @type {?} */ MultiLineGraphComponent.prototype.gridPrecisionX; /** @type {?} */ MultiLineGraphComponent.prototype.gridPrecisionY; /** @type {?} */ MultiLineGraphComponent.prototype.xAxisTitle; /** @type {?} */ MultiLineGraphComponent.prototype.yAxisTitle; /** @type {?} */ MultiLineGraphComponent.prototype.customColorScheme; /** @type {?} */ MultiLineGraphComponent.prototype.componentID; /** @type {?} */ MultiLineGraphComponent.prototype.xPadding; /** @type {?} */ MultiLineGraphComponent.prototype.yPadding; /** @type {?} */ MultiLineGraphComponent.prototype.dataCopy; /** @type {?} */ MultiLineGraphComponent.prototype.graphLinePaths; /** @type {?} */ MultiLineGraphComponent.prototype.transformedData; /** @type {?} */ MultiLineGraphComponent.prototype.multiLineGraphService; /** * @type {?} * @private */ MultiLineGraphComponent.prototype.globalParametersService; /** * @type {?} * @private */ MultiLineGraphComponent.prototype.currentElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGluZS1ncmFwaC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYmVhdXRpZnVsLWNoYXJ0cy8iLCJzb3VyY2VzIjpbImxpYi9tdWx0aS1saW5lLWdyYXBoL211bHRpLWxpbmUtZ3JhcGguY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUdqRjtJQStHRSxpQ0FBbUIscUJBQTRDLEVBQzNDLHVCQUFnRCxFQUNoRCxjQUEwQjtRQUYzQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQzNDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBeUI7UUFDaEQsbUJBQWMsR0FBZCxjQUFjLENBQVk7UUF0R3JDLGdCQUFXLEdBQUcsVUFBVSxDQUFDO1FBQ3pCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFDcEIsU0FBSSxHQUFXLElBQUksQ0FBQztRQUNwQixTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLFNBQUksR0FBVyxJQUFJLENBQUM7UUFLcEIsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBRzFDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxhQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFHN0Isb0JBQWUsR0FBRyxFQUFFLENBQUM7SUF1RnJCLENBQUM7Ozs7SUFyRkQsK0NBQWE7OztJQUFiO1FBQ0UsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxL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Q0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7Z0JBOUtGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxtOUNBQWdEO29CQUVoRCxTQUFTLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQzs7aUJBQ25DOzs7O2dCQVRRLHFCQUFxQjtnQkFDckIsdUJBQXVCO2dCQUhjLFVBQVU7Ozt1QkFjckQsS0FBSzt3QkFDTCxLQUFLO3lCQUNMLEtBQUs7OEJBQ0wsS0FBSzt1QkFDTCxLQUFLO3VCQUNMLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLO2lDQUNMLEtBQUs7aUNBQ0wsS0FBSzs2QkFDTCxLQUFLOzZCQUNMLEtBQUs7b0NBQ0wsS0FBSzs7SUE0SlIsOEJBQUM7Q0FBQSxBQWhMRCxJQWdMQztTQTFLWSx1QkFBdUI7OztJQUVsQyx1Q0FBMkY7O0lBQzNGLHdDQUF1Qjs7SUFDdkIseUNBQXdCOztJQUN4Qiw4Q0FBa0M7O0lBQ2xDLHVDQUE2Qjs7SUFDN0IsdUNBQTZCOztJQUM3Qix1Q0FBNkI7O0lBQzdCLHVDQUE2Qjs7SUFDN0IsaURBQWdDOztJQUNoQyxpREFBZ0M7O0lBQ2hDLDZDQUE0Qjs7SUFDNUIsNkNBQTRCOztJQUM1QixvREFBMEM7O0lBRTFDLDhDQUFvQjs7SUFDcEIsMkNBQWM7O0lBQ2QsMkNBQTZCOztJQUM3QiwyQ0FBUzs7SUFDVCxpREFBZTs7SUFDZixrREFBcUI7O0lBb0ZULHdEQUFtRDs7Ozs7SUFDbkQsMERBQXdEOzs7OztJQUN4RCxpREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uQ2hhbmdlcywgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY29sb3JTY2hlbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbG9yLXNjaGVtZXMnO1xuaW1wb3J0IHsgTXVsdGlMaW5lR3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi9tdWx0aS1saW5lLWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9nbG9iYWwvZ2xvYmFsLXBhcmFtZXRlcnMuc2VydmljZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LW11bHRpLWxpbmUtZ3JhcGgnLFxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktbGluZS1ncmFwaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL211bHRpLWxpbmUtZ3JhcGguY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbTXVsdGlMaW5lR3JhcGhTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBNdWx0aUxpbmVHcmFwaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcblxuICBASW5wdXQoKSBkYXRhOiBbe25hbWU6IHN0cmluZywgY29sb3I6IHN0cmluZywgZGF0YTogW3t4OiBudW1iZXIsIHk6IG51bWJlciwgaW5mbzogYW55IH1dfV07XG4gIEBJbnB1dCgpIHdpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIGhlaWdodDogbnVtYmVyO1xuICBASW5wdXQoKSBjb2xvclNjaGVtZSA9ICdjb2xvcmZ1bCc7XG4gIEBJbnB1dCgpIG1pblg6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIG1pblk6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIG1heFg6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIG1heFk6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIGdyaWRQcmVjaXNpb25YOiBudW1iZXI7XG4gIEBJbnB1dCgpIGdyaWRQcmVjaXNpb25ZOiBudW1iZXI7XG4gIEBJbnB1dCgpIHhBeGlzVGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgeUF4aXNUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBjdXN0b21Db2xvclNjaGVtZTogc3RyaW5nW10gPSBbXTtcblxuICBjb21wb25lbnRJRDogbnVtYmVyO1xuICB4UGFkZGluZyA9IDYwO1xuICB5UGFkZGluZyA9IHRoaXMueFBhZGRpbmcgLyAyO1xuICBkYXRhQ29weTtcbiAgZ3JhcGhMaW5lUGF0aHM7XG4gIHRyYW5zZm9ybWVkRGF0YSA9IFtdO1xuXG4gIHNldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMud2lkdGggJiYgIXRoaXMuaGVpZ2h0KSB0aGlzLmhlaWdodCA9IHRoaXMud2lkdGggLyAzO1xuICAgIGVsc2UgaWYgKCF0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgKiAzO1xuICAgIGVsc2UgaWYgKCF0aGlzLndpZHRoICYmICF0aGlzLmhlaWdodCkge1xuICAgICAgY29uc3QgaG9zdCA9IHRoaXMuY3VycmVudEVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChob3N0LnBhcmVudE5vZGUgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkaW1zID0gaG9zdC5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB0aGlzLndpZHRoID0gZGltcy53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBkaW1zLndpZHRoIC8gMztcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJy0tLXNldCBkaW1lbnNpb25zLS0tJyk7XG4gICAgLy8gY29uc29sZS5sb2coJ3dpZHRoOiAnICsgdGhpcy53aWR0aCk7XG4gICAgLy8gY29uc29sZS5sb2coJ2hlaWdodDogJyArIHRoaXMuaGVpZ2h0KTtcbiAgICAvLyBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgfVxuXG4gIHNldE1pbmFuZE1heCgpIHtcbiAgICBpZiAodGhpcy5taW5YID09IG51bGwpIHRoaXMubWluWCA9IE1hdGgubWluKC4uLnRoaXMuZGF0YS5tYXAobGluZSA9PiBNYXRoLm1pbiguLi5saW5lLmRhdGEubWFwKG9uZURhdGEgPT4gb25lRGF0YS54KSkpKTtcbiAgICBpZiAodGhpcy5tYXhYID09IG51bGwpIHRoaXMubWF4WCA9IE1hdGgubWF4KC4uLnRoaXMuZGF0YS5tYXAobGluZSA9PiBNYXRoLm1heCguLi5saW5lLmRhdGEubWFwKG9uZURhdGEgPT4gb25lRGF0YS54KSkpKTtcbiAgICBpZiAodGhpcy5taW5ZID09IG51bGwpIHRoaXMubWluWSA9IE1hdGgubWluKC4uLnRoaXMuZGF0YS5tYXAobGluZSA9PiBNYXRoLm1pbiguLi5saW5lLmRhdGEubWFwKG9uZURhdGEgPT4gb25lRGF0YS55KSkpKTtcbiAgICBpZiAodGhpcy5tYXhZID09IG51bGwpIHRoaXMubWF4WSA9IE1hdGgubWF4KC4uLnRoaXMuZGF0YS5tYXAobGluZSA9PiBNYXRoLm1heCguLi5saW5lLmRhdGEubWFwKG9uZURhdGEgPT4gb25lRGF0YS55KSkpKTtcbiAgfVxuXG5cbiAgdHJhbnNmb3JtRGF0YSgpIHtcbiAgICB0aGlzLnRyYW5zZm9ybWVkRGF0YSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2luZ2xlTGluZSBvZiB0aGlzLmRhdGEpIHtcbiAgICAgIGxldCBsaW5lRGF0YTtcblxuICAgICAgbGluZURhdGEgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2luZ2xlTGluZS5kYXRhKSB7XG4gICAgICAgIGNvbnN0IHggPSB0aGlzLm11bHRpTGluZUdyYXBoU2VydmljZS50cmFuc2Zvcm1YKHBvaW50LngpICsgdGhpcy54UGFkZGluZztcbiAgICAgICAgY29uc3QgeSA9IHRoaXMubXVsdGlMaW5lR3JhcGhTZXJ2aWNlLnRyYW5zZm9ybVkodGhpcy5tdWx0aUxpbmVHcmFwaFNlcnZpY2UubWF4WSAtIHBvaW50LnkpICsgdGhpcy55UGFkZGluZztcbiAgICAgICAgY29uc3QgdG9vbFRpcFggPSB4O1xuICAgICAgICBjb25zdCB0b29sVGlwWSA9IHkgLSAzMDtcbiAgICAgICAgY29uc3QgdG9vbFRpcCA9IHBvaW50LmluZm8gJiYgKHBvaW50LmluZm8gIT09ICcnKSA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIGxpbmVEYXRhLnB1c2goe1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgICBpbmZvOiBwb2ludC5pbmZvLFxuICAgICAgICAgIG9yaWdpbmFsWDogcG9pbnQueCxcbiAgICAgICAgICBvcmlnaW5hbFk6IHBvaW50LnksXG4gICAgICAgICAgdG9vbFRpcFRyYW5zbGF0ZTogJ3RyYW5zbGF0ZSgnICsgdG9vbFRpcFggKyAncHgsICcgKyB0b29sVGlwWSArICdweCknLFxuICAgICAgICAgIHRvb2xUaXBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyYW5zZm9ybWVkRGF0YS5wdXNoKHtcbiAgICAgICAgbmFtZTogc2luZ2xlTGluZS5uYW1lLFxuICAgICAgICBjb2xvcjogc2luZ2xlTGluZS5jb2xvcixcbiAgICAgICAgZGF0YTogbGluZURhdGFcbiAgICAgIH0pO1xuXG4gICAgfVxuICB9XG5cbiAgc2V0TGluZVBhdGgoKSB7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5wcmludEFsbElucHV0KCkpO1xuICAgIHRoaXMuZ3JhcGhMaW5lUGF0aHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNpbmdsZUxpbmUgb2YgdGhpcy50cmFuc2Zvcm1lZERhdGEpIHtcbiAgICAgIGxldCBncmFwaExpbmVQYXRoID0gJ00nO1xuICAgICAgbGV0IHNpbmdsZUxpbmVEYXRhO1xuICAgICAgc2luZ2xlTGluZURhdGEgPSBzaW5nbGVMaW5lLmRhdGE7XG4gICAgICBzaW5nbGVMaW5lRGF0YS5zb3J0KChhLCBiKSA9PiBhLnggPCBiLnggPyAtMSA6IGEueCA+IGIueCA/IDEgOiAwKTtcbiAgICAgIGZvciAoY29uc3QgcG9pbnQgb2Ygc2luZ2xlTGluZURhdGEpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2cocG9pbnQpO1xuICAgICAgICBjb25zdCBjb29yZFggPSBwb2ludC54O1xuICAgICAgICBjb25zdCBjb29yZFkgPSBwb2ludC55O1xuXG4gICAgICAgIGdyYXBoTGluZVBhdGggKz0gJyAnICsgY29vcmRYICsgJyAnICsgY29vcmRZO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGdyYXBoTGluZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmdyYXBoTGluZVBhdGhzLnB1c2goe1xuICAgICAgICBjb2xvcjogc2luZ2xlTGluZS5jb2xvcixcbiAgICAgICAgcGF0aDogZ3JhcGhMaW5lUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbXVsdGlMaW5lR3JhcGhTZXJ2aWNlOiBNdWx0aUxpbmVHcmFwaFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgZ2xvYmFsUGFyYW1ldGVyc1NlcnZpY2U6IEdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGN1cnJlbnRFbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gIH1cblxuICBzZXRDb2xvcnMoKSB7XG4gICAgbGV0IGNudCA9IDA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIHRoaXMuZGF0YSkge1xuICAgICAgaWYgKCFsaW5lLmNvbG9yKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsaW5lLmNvbG9yID0gdGhpcy5jdXN0b21Db2xvclNjaGVtZVtjbnQgJSB0aGlzLmN1c3RvbUNvbG9yU2NoZW1lLmxlbmd0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluZS5jb2xvciA9IGNvbG9yU2NoZW1lc1t0aGlzLmNvbG9yU2NoZW1lXVtjbnQgJSAxMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNudCsrO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29tcG9uZW50SUQgPSB0aGlzLmdsb2JhbFBhcmFtZXRlcnNTZXJ2aWNlLmFkZE5ld0NvbXBvbmVudCgpO1xuICAgIGNvbnNvbGUubG9nKCdpbml0Li4nKTtcbiAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLnNldE1pbmFuZE1heCgpO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5kYXRhQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7XG4gICAgdGhpcy5tdWx0aUxpbmVHcmFwaFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgbWluWDogdGhpcy5taW5YLFxuICAgICAgbWF4WDogdGhpcy5tYXhYLFxuICAgICAgbWluWTogdGhpcy5taW5ZLFxuICAgICAgbWF4WTogdGhpcy5tYXhZLFxuICAgICAgZGF0YUxlbmd0aDogdGhpcy5kYXRhLmxlbmd0aCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmdcbiAgICB9KTtcblxuICAgIHRoaXMudHJhbnNmb3JtRGF0YSgpO1xuICAgIHRoaXMuc2V0TGluZVBhdGgoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCkge1xuICAgIGNvbnNvbGUubG9nKCdjaGFuZ2VzLi4nKTtcbiAgICB0aGlzLnNldE1pbmFuZE1heCgpO1xuICAgIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgdGhpcy5kYXRhQ29weSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7XG4gICAgdGhpcy5tdWx0aUxpbmVHcmFwaFNlcnZpY2Uuc2V0VmFsdWVzKHtcbiAgICAgIGNvbXBvbmVudElEOiB0aGlzLmNvbXBvbmVudElELFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgbWluWDogdGhpcy5taW5YLFxuICAgICAgbWF4WDogdGhpcy5tYXhYLFxuICAgICAgbWluWTogdGhpcy5taW5ZLFxuICAgICAgbWF4WTogdGhpcy5tYXhZLFxuICAgICAgZGF0YUxlbmd0aDogdGhpcy5kYXRhLmxlbmd0aCxcbiAgICAgIHhQYWRkaW5nOiB0aGlzLnhQYWRkaW5nLFxuICAgICAgeVBhZGRpbmc6IHRoaXMueVBhZGRpbmdcbiAgICB9KTtcblxuICAgIHRoaXMudHJhbnNmb3JtRGF0YSgpO1xuICAgIHRoaXMuc2V0TGluZVBhdGgoKTtcbiAgfVxuXG59XG4iXX0=