UNPKG

ngx-beautiful-charts

Version:
333 lines 26.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; // @Injectable({ // providedIn: BeautifulChartsModule // }) var // @Injectable({ // providedIn: BeautifulChartsModule // }) GanttChartService = /** @class */ (function () { function GanttChartService() { this.monthNames = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; } /** * @return {?} */ GanttChartService.prototype.computeRectDimensions = /** * @return {?} */ function () { this.rectWidth = this.width - this.xPadding * 2 - 150; this.rectHeight = this.ganttPhases.length * 60; }; /** * @return {?} */ GanttChartService.prototype.computeLegionDimensions = /** * @return {?} */ function () { /** @type {?} */ var noOfLines = Math.ceil(this.data.length / 3); this.legionWidth = this.width - this.xPadding * 2 - 150; this.legionHeight = 40 + 40 * noOfLines; }; /** * @param {?} x * @return {?} */ GanttChartService.prototype.transformX = /** * @param {?} x * @return {?} */ function (x) { return this.rectWidth * x / (this.maxX - this.minX); }; /** * @return {?} */ GanttChartService.prototype.computeLegion = /** * @return {?} */ function () { /** @type {?} */ var noOfLines = Math.ceil(this.data.length / 3); this.legion = []; /** @type {?} */ var cnt = 0; for (var line = 0; line < noOfLines; line++) { /** @type {?} */ var legionLine = []; for (var i = 0; i < 3; i++) { if (this.ganttTeams[cnt]) legionLine.push(this.ganttTeams[cnt]); cnt++; } this.legion.push(legionLine); } // console.log(this.legion); }; /** * @param {?} d * @return {?} */ GanttChartService.prototype.transformGanttDate = /** * @param {?} d * @return {?} */ function (d) { /** @type {?} */ var oneDay = 24 * 60 * 60 * 1000; /** @type {?} */ var daysSinceMinDate = Math.round(Math.abs((new Date(d).getTime() - (new Date(this.ganttMinDate)).getTime()) / (oneDay))); return this.rectWidth * daysSinceMinDate / (this.maxX - this.minX); }; /** * @param {?} factor * @param {?} num * @return {?} */ GanttChartService.prototype.closestMultipleLessThanEqualTo = /** * @param {?} factor * @param {?} num * @return {?} */ function (factor, num) { if (num % factor === 0) return num; else return this.closestMultipleLessThanEqualTo(factor, num - 1); }; /** * @param {?} factor * @param {?} num * @return {?} */ GanttChartService.prototype.closestMultipleMoreThanEqualTo = /** * @param {?} factor * @param {?} num * @return {?} */ function (factor, num) { if (num % factor === 0) return num; else return this.closestMultipleMoreThanEqualTo(factor, num + 1); }; /** * @param {?} __0 * @return {?} */ GanttChartService.prototype.setValues = /** * @param {?} __0 * @return {?} */ function (_a) { var e_1, _b, e_2, _c, e_3, _d; var componentID = _a.componentID, width = _a.width, xPadding = _a.xPadding, yPadding = _a.yPadding, data = _a.data; this.componentID = componentID; this.width = width; this.xPadding = xPadding; this.yPadding = yPadding; this.data = data; // console.log('service color scheme: ' + this.colorScheme) /** @type {?} */ var froms = []; /** @type {?} */ var tos = []; /** @type {?} */ var phases = new Set(); this.ganttTeams = []; try { // this.setColors(); // console.log(this.data); for (var _e = tslib_1.__values(this.data), _f = _e.next(); !_f.done; _f = _e.next()) { var team = _f.value; this.ganttTeams.push({ name: team.name, color: team.color }); try { for (var _g = tslib_1.__values(Object.keys(team.timelines)), _h = _g.next(); !_h.done; _h = _g.next()) { var phase = _h.value; phases.add(phase); try { for (var _j = tslib_1.__values(team.timelines[phase]), _k = _j.next(); !_k.done; _k = _j.next()) { var timeline = _k.value; froms.push(timeline.from); tos.push(timeline.to); } } catch (e_3_1) { e_3 = { error: e_3_1 }; } finally { try { if (_k && !_k.done && (_d = _j.return)) _d.call(_j); } finally { if (e_3) throw e_3.error; } } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_h && !_h.done && (_c = _g.return)) _c.call(_g); } finally { if (e_2) throw e_2.error; } } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_f && !_f.done && (_b = _e.return)) _b.call(_e); } finally { if (e_1) throw e_1.error; } } this.ganttPhases = Array.from(phases); // console.log('phase timelines: '); // console.log(this.phaseTimelines); /** @type {?} */ var minDate = froms.reduce((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return new Date(a) < new Date(b) ? a : b; })); /** @type {?} */ var maxDate = tos.reduce((/** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { return new Date(a) > new Date(b) ? a : b; })); this.ganttMinDate = minDate; this.ganttMaxDate = maxDate; // console.log(this.ganttMinDate + ' - ' + this.ganttMaxDate); /** @type {?} */ var noOfLines = Math.ceil(this.data.length / 3); this.height = this.ganttPhases.length * 60 + this.yPadding * 3 + 100 + 40 + 30 * noOfLines; /** @type {?} */ var oneDay = 24 * 60 * 60 * 1000; this.ganttDateRange = Math.round(Math.abs((new Date(this.ganttMaxDate).getTime() - new Date(this.ganttMinDate).getTime()) / (oneDay))); // console.log('Date Range: '); // console.log(this.ganttDateRange); this.minX = 0; // this.maxX = this.ganttDateRange; /** @type {?} */ var flag = 0; /** @type {?} */ var qts = 1; /** @type {?} */ var gridPrecisionX = 0; while (flag === 0) { if (this.ganttDateRange <= 90 * qts) { gridPrecisionX = 7 * qts; flag = 1; break; } else { qts = qts + 1; } } this.maxX = this.closestMultipleMoreThanEqualTo(7 * qts, this.ganttDateRange); this.ganttMaxDate = this.addDays(this.ganttMinDate, this.maxX); this.computeRectDimensions(); this.computeLegionDimensions(); this.computeLegion(); // this.printAll(); }; /** * @param {?} date * @param {?} days * @return {?} */ GanttChartService.prototype.addDays = /** * @param {?} date * @param {?} days * @return {?} */ function (date, days) { /** @type {?} */ var newdate = new Date(date); newdate.setDate((new Date(date)).getDate() + days); /** @type {?} */ var day = newdate.getDate(); /** @type {?} */ var monthIndex = newdate.getMonth(); /** @type {?} */ var year = newdate.getFullYear(); return this.monthNames[monthIndex] + ' ' + day + ', ' + year; }; /** * @return {?} */ GanttChartService.prototype.printAll = /** * @return {?} */ function () { console.log('line-graph-service'); console.log('component ID: ' + this.componentID); console.log('width: ' + this.width); console.log('height: ' + this.height); console.log('xPadding: ' + this.xPadding); console.log('yPadding: ' + this.yPadding); console.log('rectWidth: ' + this.rectWidth); console.log('rectHeight: ' + this.rectHeight); }; return GanttChartService; }()); // @Injectable({ // providedIn: BeautifulChartsModule // }) export { GanttChartService }; if (false) { /** @type {?} */ GanttChartService.prototype.width; /** @type {?} */ GanttChartService.prototype.height; /** @type {?} */ GanttChartService.prototype.ganttTeams; /** @type {?} */ GanttChartService.prototype.ganttPhases; /** @type {?} */ GanttChartService.prototype.phaseTimelines; /** @type {?} */ GanttChartService.prototype.legion; /** @type {?} */ GanttChartService.prototype.ganttMinDate; /** @type {?} */ GanttChartService.prototype.ganttMaxDate; /** @type {?} */ GanttChartService.prototype.ganttDateRange; /** @type {?} */ GanttChartService.prototype.xPadding; /** @type {?} */ GanttChartService.prototype.yPadding; /** @type {?} */ GanttChartService.prototype.componentID; /** @type {?} */ GanttChartService.prototype.data; /** @type {?} */ GanttChartService.prototype.rectWidth; /** @type {?} */ GanttChartService.prototype.rectHeight; /** @type {?} */ GanttChartService.prototype.legionWidth; /** @type {?} */ GanttChartService.prototype.legionHeight; /** @type {?} */ GanttChartService.prototype.minX; /** @type {?} */ GanttChartService.prototype.maxX; /** @type {?} */ GanttChartService.prototype.monthNames; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQtY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1iZWF1dGlmdWwtY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2dhbnR0LWNoYXJ0L2dhbnR0LWNoYXJ0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQTs7Ozs7SUE4QkU7UUFQQSxlQUFVLEdBQUc7WUFDWCxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU87WUFDOUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTTtZQUM5QixRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVM7WUFDaEMsVUFBVSxFQUFFLFVBQVU7U0FDdkIsQ0FBQztJQUVjLENBQUM7Ozs7SUFFakIsaURBQXFCOzs7SUFBckI7UUFDRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2pELENBQUM7Ozs7SUFFRCxtREFBdUI7OztJQUF2Qjs7WUFDUSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBQzFDLENBQUM7Ozs7O0lBRUQsc0NBQVU7Ozs7SUFBVixVQUFXLENBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FB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SSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNILHdCQUFDO0FBQUQsQ0FBQyxBQWhMRCxJQWdMQzs7Ozs7OztJQTlLQyxrQ0FBYzs7SUFDZCxtQ0FBZTs7SUFDZix1Q0FBdUI7O0lBQ3ZCLHdDQUF3Qjs7SUFDeEIsMkNBQWU7O0lBQ2YsbUNBQU87O0lBQ1AseUNBQWE7O0lBQ2IseUNBQWE7O0lBQ2IsMkNBQXVCOztJQUN2QixxQ0FBaUI7O0lBQ2pCLHFDQUFpQjs7SUFDakIsd0NBQW9COztJQUNwQixpQ0FBVTs7SUFFVixzQ0FBa0I7O0lBQ2xCLHVDQUFtQjs7SUFDbkIsd0NBQW9COztJQUNwQix5Q0FBcUI7O0lBQ3JCLGlDQUFhOztJQUNiLGlDQUFhOztJQUViLHVDQUtFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVhdXRpZnVsQ2hhcnRzTW9kdWxlIH0gZnJvbSAnLi4vYmVhdXRpZnVsLWNoYXJ0cy5tb2R1bGUnO1xuaW1wb3J0IHsgY29sb3JTY2hlbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NvbG9yLXNjaGVtZXMnO1xuXG4vLyBASW5qZWN0YWJsZSh7XG4vLyAgIHByb3ZpZGVkSW46IEJlYXV0aWZ1bENoYXJ0c01vZHVsZVxuLy8gfSlcbmV4cG9ydCBjbGFzcyBHYW50dENoYXJ0U2VydmljZSB7XG5cbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGdhbnR0VGVhbXM6IEFycmF5PGFueT47XG4gIGdhbnR0UGhhc2VzOiBBcnJheTxhbnk+O1xuICBwaGFzZVRpbWVsaW5lcztcbiAgbGVnaW9uO1xuICBnYW50dE1pbkRhdGU7XG4gIGdhbnR0TWF4RGF0ZTtcbiAgZ2FudHREYXRlUmFuZ2U6IG51bWJlcjtcbiAgeFBhZGRpbmc6IG51bWJlcjtcbiAgeVBhZGRpbmc6IG51bWJlcjtcbiAgY29tcG9uZW50SUQ6IG51bWJlcjtcbiAgZGF0YTogYW55O1xuXG4gIHJlY3RXaWR0aDogbnVtYmVyO1xuICByZWN0SGVpZ2h0OiBudW1iZXI7XG4gIGxlZ2lvbldpZHRoOiBudW1iZXI7XG4gIGxlZ2lvbkhlaWdodDogbnVtYmVyO1xuICBtaW5YOiBudW1iZXI7XG4gIG1heFg6IG51bWJlcjtcblxuICBtb250aE5hbWVzID0gW1xuICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJyxcbiAgICAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsXG4gICAgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsXG4gICAgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ1xuICBdO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgY29tcHV0ZVJlY3REaW1lbnNpb25zKCkge1xuICAgIHRoaXMucmVjdFdpZHRoID0gdGhpcy53aWR0aCAtIHRoaXMueFBhZGRpbmcgKiAyIC0gMTUwO1xuICAgIHRoaXMucmVjdEhlaWdodCA9IHRoaXMuZ2FudHRQaGFzZXMubGVuZ3RoICogNjA7XG4gIH1cblxuICBjb21wdXRlTGVnaW9uRGltZW5zaW9ucygpIHtcbiAgICBjb25zdCBub09mTGluZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLmxlbmd0aCAvIDMpO1xuICAgIHRoaXMubGVnaW9uV2lkdGggPSB0aGlzLndpZHRoIC0gdGhpcy54UGFkZGluZyAqIDIgLSAxNTA7XG4gICAgdGhpcy5sZWdpb25IZWlnaHQgPSA0MCArIDQwICogbm9PZkxpbmVzO1xuICB9XG5cbiAgdHJhbnNmb3JtWCh4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5yZWN0V2lkdGggKiB4IC8gKHRoaXMubWF4WCAtIHRoaXMubWluWCk7XG4gIH1cblxuICBjb21wdXRlTGVnaW9uKCkge1xuICAgIGNvbnN0IG5vT2ZMaW5lcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy5sZWdpb24gPSBbXTtcbiAgICBsZXQgY250ID0gMDtcbiAgICBmb3IgKGxldCBsaW5lID0gMDsgbGluZSA8IG5vT2ZMaW5lczsgbGluZSsrKSB7XG4gICAgICBjb25zdCBsZWdpb25MaW5lID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5nYW50dFRlYW1zW2NudF0pIGxlZ2lvbkxpbmUucHVzaCh0aGlzLmdhbnR0VGVhbXNbY250XSk7XG4gICAgICAgIGNudCsrO1xuICAgICAgfVxuICAgICAgdGhpcy5sZWdpb24ucHVzaChsZWdpb25MaW5lKTtcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5sZWdpb24pO1xuICB9XG5cbiAgdHJhbnNmb3JtR2FudHREYXRlKGQpIHtcbiAgICBjb25zdCBvbmVEYXkgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGNvbnN0IGRheXNTaW5jZU1pbkRhdGUgPSBNYXRoLnJvdW5kKE1hdGguYWJzKFxuICAgICAgICAobmV3IERhdGUoZCkuZ2V0VGltZSgpXG4gICAgICAgIC0gKG5ldyBEYXRlKHRoaXMuZ2FudHRNaW5EYXRlKSkuZ2V0VGltZSgpXG4gICAgICAgICkgLyAob25lRGF5KSkpO1xuICAgIHJldHVybiB0aGlzLnJlY3RXaWR0aCAqIGRheXNTaW5jZU1pbkRhdGUgLyAodGhpcy5tYXhYIC0gdGhpcy5taW5YKTtcbiAgfVxuXG4gIGNsb3Nlc3RNdWx0aXBsZUxlc3NUaGFuRXF1YWxUbyhmYWN0b3IsIG51bSkge1xuICAgIGlmIChudW0gJSBmYWN0b3IgPT09IDApIHJldHVybiBudW07XG4gICAgZWxzZSByZXR1cm4gdGhpcy5jbG9zZXN0TXVsdGlwbGVMZXNzVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0gLSAxKTtcbiAgfVxuXG4gIGNsb3Nlc3RNdWx0aXBsZU1vcmVUaGFuRXF1YWxUbyhmYWN0b3IsIG51bSkge1xuICAgIGlmIChudW0gJSBmYWN0b3IgPT09IDApIHJldHVybiBudW07XG4gICAgZWxzZSByZXR1cm4gdGhpcy5jbG9zZXN0TXVsdGlwbGVNb3JlVGhhbkVxdWFsVG8oZmFjdG9yLCBudW0gKyAxKTtcbiAgfVxuXG5cbiAgc2V0VmFsdWVzKHtcbiAgICBjb21wb25lbnRJRDogY29tcG9uZW50SUQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIHhQYWRkaW5nOiB4UGFkZGluZyxcbiAgICB5UGFkZGluZzogeVBhZGRpbmcsXG4gICAgZGF0YTogZGF0YVxuICB9KSB7XG4gICAgdGhpcy5jb21wb25lbnRJRCA9IGNvbXBvbmVudElEO1xuICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICB0aGlzLnhQYWRkaW5nID0geFBhZGRpbmc7XG4gICAgdGhpcy55UGFkZGluZyA9IHlQYWRkaW5nO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgLy8gY29uc29sZS5sb2coJ3NlcnZpY2UgY29sb3Igc2NoZW1lOiAnICsgdGhpcy5jb2xvclNjaGVtZSlcblxuICAgIGNvbnN0IGZyb21zID0gW107XG4gICAgY29uc3QgdG9zID0gW107XG4gICAgY29uc3QgcGhhc2VzID0gbmV3IFNldCgpO1xuICAgIHRoaXMuZ2FudHRUZWFtcyA9IFtdO1xuICAgIC8vIHRoaXMuc2V0Q29sb3JzKCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5kYXRhKTtcbiAgICBmb3IgKGNvbnN0IHRlYW0gb2YgdGhpcy5kYXRhKSB7XG4gICAgICB0aGlzLmdhbnR0VGVhbXMucHVzaCh7bmFtZTogdGVhbS5uYW1lLCBjb2xvcjogdGVhbS5jb2xvcn0pO1xuICAgICAgZm9yIChjb25zdCBwaGFzZSBvZiBPYmplY3Qua2V5cyh0ZWFtLnRpbWVsaW5lcykpIHtcbiAgICAgICAgcGhhc2VzLmFkZChwaGFzZSk7XG4gICAgICAgIGZvciAoY29uc3QgdGltZWxpbmUgb2YgdGVhbS50aW1lbGluZXNbcGhhc2VdKSB7XG4gICAgICAgICAgZnJvbXMucHVzaCh0aW1lbGluZS5mcm9tKTtcbiAgICAgICAgICB0b3MucHVzaCh0aW1lbGluZS50byk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5nYW50dFBoYXNlcyA9IEFycmF5LmZyb20ocGhhc2VzKTtcblxuICAgIC8vIGNvbnNvbGUubG9nKCdwaGFzZSB0aW1lbGluZXM6ICcpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMucGhhc2VUaW1lbGluZXMpO1xuXG4gICAgY29uc3QgbWluRGF0ZSA9IGZyb21zLnJlZHVjZSgoYSwgYikgPT4gbmV3IERhdGUoYSkgPCBuZXcgRGF0ZShiKSA/IGEgOiBiICk7XG4gICAgY29uc3QgbWF4RGF0ZSA9IHRvcy5yZWR1Y2UoKGEsIGIpID0+IG5ldyBEYXRlKGEpID4gbmV3IERhdGUoYikgPyBhIDogYiApO1xuXG4gICAgdGhpcy5nYW50dE1pbkRhdGUgPSBtaW5EYXRlO1xuICAgIHRoaXMuZ2FudHRNYXhEYXRlID0gbWF4RGF0ZTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmdhbnR0TWluRGF0ZSArICcgLSAnICsgdGhpcy5nYW50dE1heERhdGUpO1xuICAgIGNvbnN0IG5vT2ZMaW5lcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy5oZWlnaHQgPSB0aGlzLmdhbnR0UGhhc2VzLmxlbmd0aCAqIDYwICsgdGhpcy55UGFkZGluZyAqIDMgKyAxMDAgKyA0MCArIDMwICogbm9PZkxpbmVzO1xuXG4gICAgY29uc3Qgb25lRGF5ID0gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICB0aGlzLmdhbnR0RGF0ZVJhbmdlID0gTWF0aC5yb3VuZChNYXRoLmFicyhcbiAgICAgICAgKG5ldyBEYXRlKHRoaXMuZ2FudHRNYXhEYXRlKS5nZXRUaW1lKClcbiAgICAgICAgLSBuZXcgRGF0ZSh0aGlzLmdhbnR0TWluRGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICkgLyAob25lRGF5KSkpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdEYXRlIFJhbmdlOiAnKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmdhbnR0RGF0ZVJhbmdlKTtcbiAgICB0aGlzLm1pblggPSAwO1xuICAgIC8vIHRoaXMubWF4WCA9IHRoaXMuZ2FudHREYXRlUmFuZ2U7XG4gICAgbGV0IGZsYWcgPSAwO1xuICAgIGxldCBxdHMgPSAxO1xuICAgIGxldCBncmlkUHJlY2lzaW9uWCA9IDA7XG4gICAgd2hpbGUgKGZsYWcgPT09IDApIHtcbiAgICAgIGlmICh0aGlzLmdhbnR0RGF0ZVJhbmdlIDw9IDkwICogcXRzKSB7XG4gICAgICAgIGdyaWRQcmVjaXNpb25YID0gNyAqIHF0cztcbiAgICAgICAgZmxhZyA9IDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHsgcXRzID0gcXRzICsgMTsgfVxuICAgIH1cblxuICAgIHRoaXMubWF4WCA9IHRoaXMuY2xvc2VzdE11bHRpcGxlTW9yZVRoYW5FcXVhbFRvKDcgKiBxdHMsIHRoaXMuZ2FudHREYXRlUmFuZ2UpO1xuICAgIHRoaXMuZ2FudHRNYXhEYXRlID0gdGhpcy5hZGREYXlzKHRoaXMuZ2FudHRNaW5EYXRlLCB0aGlzLm1heFgpO1xuXG4gICAgdGhpcy5jb21wdXRlUmVjdERpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmNvbXB1dGVMZWdpb25EaW1lbnNpb25zKCk7XG4gICAgdGhpcy5jb21wdXRlTGVnaW9uKCk7XG4gICAgLy8gdGhpcy5wcmludEFsbCgpO1xuICB9XG5cbiAgYWRkRGF5cyhkYXRlLCBkYXlzOiBudW1iZXIpIHtcbiAgICBjb25zdCBuZXdkYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgbmV3ZGF0ZS5zZXREYXRlKChuZXcgRGF0ZShkYXRlKSkuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgY29uc3QgZGF5ID0gbmV3ZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IG5ld2RhdGUuZ2V0TW9udGgoKTtcbiAgICBjb25zdCB5ZWFyID0gbmV3ZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG5cbiAgICByZXR1cm4gdGhpcy5tb250aE5hbWVzW21vbnRoSW5kZXhdICsgJyAnICsgZGF5ICsgJywgJyArIHllYXI7XG4gIH1cblxuICBwcmludEFsbCgpIHtcbiAgICBjb25zb2xlLmxvZygnbGluZS1ncmFwaC1zZXJ2aWNlJyk7XG4gICAgY29uc29sZS5sb2coJ2NvbXBvbmVudCBJRDogJyArIHRoaXMuY29tcG9uZW50SUQpO1xuICAgIGNvbnNvbGUubG9nKCd3aWR0aDogJyArIHRoaXMud2lkdGgpO1xuICAgIGNvbnNvbGUubG9nKCdoZWlnaHQ6ICcgKyB0aGlzLmhlaWdodCk7XG4gICAgY29uc29sZS5sb2coJ3hQYWRkaW5nOiAnICsgdGhpcy54UGFkZGluZyk7XG4gICAgY29uc29sZS5sb2coJ3lQYWRkaW5nOiAnICsgdGhpcy55UGFkZGluZyk7XG4gICAgY29uc29sZS5sb2coJ3JlY3RXaWR0aDogJyArIHRoaXMucmVjdFdpZHRoKTtcbiAgICBjb25zb2xlLmxvZygncmVjdEhlaWdodDogJyArIHRoaXMucmVjdEhlaWdodCk7XG4gIH1cbn1cbiJdfQ==