mgx-circular-progress-bar
Version:
A library for circular progress bars components, an elegant way to rappresent your percentages.
154 lines (153 loc) • 16.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, TemplateRef } from '@angular/core';
var MgxCircularProgressPieComponent = /** @class */ (function () {
function MgxCircularProgressPieComponent() {
/* Data section */
this.total = 1;
this.barValue = 0;
this.percentage = 0;
this.diameter = 150;
this.color = '#3282b8';
this.bgColor = '#eee';
this.bgSize = 10;
this.mgxPrefix = 'mgx-circular-progress-pie';
this.percentual = 0;
}
/**
* @return {?}
*/
MgxCircularProgressPieComponent.prototype.ngOnChanges = /**
* @return {?}
*/
function () {
this.showWarnings();
this.percentual = +this.percentage || (+this.barValue / +this.total) * 100;
this.percentual = isNaN(this.percentual) ? 0 : +this.percentual.toFixed(2);
if (this.percentual > 100) {
this.setSlice(1);
this.percentual = 100;
}
else {
this.setSlice(this.percentual / 100);
}
};
/**
* @param {?} percent
* @return {?}
*/
MgxCircularProgressPieComponent.prototype.setSlice = /**
* @param {?} percent
* @return {?}
*/
function (percent) {
var _a = tslib_1.__read(this.getCoordinatesForPercent(percent), 2), endX = _a[0], endY = _a[1];
/** @type {?} */
var largeArcFlag = percent > .5 ? 1 : 0;
this.pathData = [
"M 1 0",
"A 1 1 0 " + largeArcFlag + " 1 " + endX + " " + endY,
"L 0 0",
].join(' ');
};
/**
* @param {?} percent
* @return {?}
*/
MgxCircularProgressPieComponent.prototype.getCoordinatesForPercent = /**
* @param {?} percent
* @return {?}
*/
function (percent) {
/** @type {?} */
var x = Math.cos(2 * Math.PI * percent);
/** @type {?} */
var y = Math.sin(2 * Math.PI * percent);
return [x, y];
};
/**
* @return {?}
*/
MgxCircularProgressPieComponent.prototype.showWarnings = /**
* @return {?}
*/
function () {
if (!this.percentage || isNaN(this.percentage)) {
if (isNaN(this.barValue)) {
console.warn(this.mgxPrefix + " barValue: " + this.barValue);
}
else if (isNaN(this.total)) {
console.warn(this.mgxPrefix + " total: " + this.total);
}
else if (this.barValue > this.total) {
console.warn(this.mgxPrefix + " barValue: " + this.barValue + " is more than total: " + this.total);
}
}
};
/**
* @param {?=} reducer
* @return {?}
*/
MgxCircularProgressPieComponent.prototype.getFontSize = /**
* @param {?=} reducer
* @return {?}
*/
function (reducer) {
if (reducer === void 0) { reducer = 1; }
return (this.fontSize || (this.diameter / 4)) / reducer + "px";
};
MgxCircularProgressPieComponent.decorators = [
{ type: Component, args: [{
selector: 'mgx-circular-progress-pie',
template: "<div class=\"contain\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" x=\"0\" y=\"0\" [ngStyle]=\"{'width.px': diameter, 'height.px': diameter }\"\n viewBox=\"-1 -1 2 2\">\n <circle id=\"base-circle\" [attr.stroke]=\"bgColor\" [attr.fill]=\"bgColor\" cx=\"0\" cy=\"0\" [attr.r]=\"bgSize / 20\" />\n <path id=\"pie-path\" [attr.fill]=\"color\" [attr.d]=\"pathData\" rotate=\"50\"></path>\n </svg>\n <div class=\"label\">\n <ng-container *ngIf=\"contentTemplate; else projectContent\">\n <ng-template *ngTemplateOutlet=\"contentTemplate\"></ng-template>\n </ng-container>\n <ng-template #projectContent>\n <div #contentRef>\n <ng-content></ng-content>\n </div>\n <div *ngIf=\"!contentRef?.childNodes?.length\" [style.font-size]=\"getFontSize()\">\n {{percentual}}<span [style.font-size]=\"getFontSize(1.2)\">%</span>\n </div>\n </ng-template>\n </div>\n</div>",
styles: [".contain{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;box-sizing:border-box;position:relative}#path{transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg);transform-origin:center center;-webkit-transform-origin:center center;-ms-transform-origin:center center;-moz-transform-origin:center center;transition:stroke-dashoffset .3s ease-in-out;-webkit-transition:stroke-dashoffset .3s ease-in-out;-ms-transition:stroke-dashoffset .3s ease-in-out;-moz-transition:stroke-dashoffset .3s ease-in-out}#pie-path{transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-moz-transform:rotate(-90deg)}.label{position:absolute;top:0;right:0;bottom:0;left:0;display:-webkit-box;display:flex;flex-wrap:wrap;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;font-family:Kreon VariableFont;color:#7f8c8d}"]
},] },
];
/** @nocollapse */
MgxCircularProgressPieComponent.ctorParameters = function () { return []; };
MgxCircularProgressPieComponent.propDecorators = {
total: [{ type: Input }],
barValue: [{ type: Input }],
percentage: [{ type: Input }],
contentTemplate: [{ type: Input }],
diameter: [{ type: Input }],
fontSize: [{ type: Input }],
color: [{ type: Input }],
bgColor: [{ type: Input }],
bgSize: [{ type: Input }]
};
return MgxCircularProgressPieComponent;
}());
export { MgxCircularProgressPieComponent };
if (false) {
/** @type {?} */
MgxCircularProgressPieComponent.prototype.total;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.barValue;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.percentage;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.contentTemplate;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.diameter;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.fontSize;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.color;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.bgColor;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.bgSize;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.mgxPrefix;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.pathData;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.newPathData;
/** @type {?} */
MgxCircularProgressPieComponent.prototype.percentual;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWd4LWNpcmN1bGFyLXByb2dyZXNzLXBpZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tZ3gtY2lyY3VsYXItcHJvZ3Jlc3MtYmFyLyIsInNvdXJjZXMiOlsibGliL21neC1jaXJjdWxhci1wcm9ncmVzcy1waWUvbWd4LWNpcmN1bGFyLXByb2dyZXNzLXBpZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7O0lBOEN2RTs7cUJBakJ5QixDQUFDO3dCQUNFLENBQUM7MEJBQ0MsQ0FBQzt3QkFJSCxHQUFHO3FCQUVOLFNBQVM7dUJBQ1AsTUFBTTtzQkFDUCxFQUFFO3lCQUVSLDJCQUEyQjswQkFHMUIsQ0FBQztLQUVOOzs7O0lBRWhCLHFEQUFXOzs7SUFBWDtRQUVFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFM0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7U0FDdkI7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBQTtTQUNyQztLQUVGOzs7OztJQUVPLGtEQUFROzs7O2NBQUMsT0FBTztRQUN0QixvRUFBTyxZQUFJLEVBQUUsWUFBSSxDQUEyQzs7UUFDNUQsSUFBTSxZQUFZLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLE9BQU87WUFDUCxhQUFXLFlBQVksV0FBTSxJQUFJLFNBQUksSUFBTTtZQUMzQyxPQUFPO1NBQ1IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Ozs7OztJQUlOLGtFQUF3Qjs7OztjQUFDLE9BQU87O1FBQ3RDLElBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7O1FBQzFDLElBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7OztJQUdSLHNEQUFZOzs7O1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsT0FBTyxDQUFDLElBQUksQ0FBSSxJQUFJLENBQUMsU0FBUyxtQkFBYyxJQUFJLENBQUMsUUFBVSxDQUFDLENBQUM7YUFDOUQ7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUksSUFBSSxDQUFDLFNBQVMsZ0JBQVcsSUFBSSxDQUFDLEtBQU8sQ0FBQyxDQUFDO2FBQ3hEO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUksSUFBSSxDQUFDLFNBQVMsbUJBQWMsSUFBSSxDQUFDLFFBQVEsNkJBQXdCLElBQUksQ0FBQyxLQUFPLENBQUMsQ0FBQzthQUNoRztTQUNGOzs7Ozs7SUFHSCxxREFBVzs7OztJQUFYLFVBQVksT0FBbUI7UUFBbkIsd0JBQUEsRUFBQSxXQUFtQjtRQUM3QixNQUFNLENBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sT0FBSSxDQUFDO0tBQ2hFOztnQkE3RkYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwyQkFBMkI7b0JBQ3JDLFFBQVEsRUFBRSwrK0JBbUJMO29CQUNMLE1BQU0sRUFBRSxDQUFDLHlqQ0FBeWpDLENBQUM7aUJBQ3BrQzs7Ozs7d0JBSUUsS0FBSzsyQkFDTCxLQUFLOzZCQUNMLEtBQUs7a0NBR0wsS0FBSzsyQkFDTCxLQUFLOzJCQUNMLEtBQUs7d0JBQ0wsS0FBSzswQkFDTCxLQUFLO3lCQUNMLEtBQUs7OzBDQXZDUjs7U0EwQmEsK0JBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtZ3gtY2lyY3VsYXItcHJvZ3Jlc3MtcGllJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY29udGFpblwiPlxuICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHg9XCIwXCIgeT1cIjBcIiBbbmdTdHlsZV09XCJ7J3dpZHRoLnB4JzogZGlhbWV0ZXIsICdoZWlnaHQucHgnOiBkaWFtZXRlciB9XCJcbiAgICAgICAgdmlld0JveD1cIi0xIC0xIDIgMlwiPlxuICAgICAgICA8Y2lyY2xlIGlkPVwiYmFzZS1jaXJjbGVcIiBbYXR0ci5zdHJva2VdPVwiYmdDb2xvclwiIFthdHRyLmZpbGxdPVwiYmdDb2xvclwiIGN4PVwiMFwiIGN5PVwiMFwiIFthdHRyLnJdPVwiYmdTaXplIC8gMjBcIiAvPlxuICAgICAgICA8cGF0aCBpZD1cInBpZS1wYXRoXCIgW2F0dHIuZmlsbF09XCJjb2xvclwiIFthdHRyLmRdPVwicGF0aERhdGFcIiByb3RhdGU9XCI1MFwiPjwvcGF0aD5cbiAgICA8L3N2Zz5cbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRUZW1wbGF0ZTsgZWxzZSBwcm9qZWN0Q29udGVudFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcHJvamVjdENvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2ICNjb250ZW50UmVmPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb250ZW50UmVmPy5jaGlsZE5vZGVzPy5sZW5ndGhcIiBbc3R5bGUuZm9udC1zaXplXT1cImdldEZvbnRTaXplKClcIj5cbiAgICAgICAgICAgICAgICB7e3BlcmNlbnR1YWx9fTxzcGFuIFtzdHlsZS5mb250LXNpemVdPVwiZ2V0Rm9udFNpemUoMS4yKVwiPiYjMzc7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgLmNvbnRhaW57ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmV9I3BhdGh7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7LW1vei10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgY2VudGVyOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgY2VudGVyOy1tcy10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBjZW50ZXI7LW1vei10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBjZW50ZXI7dHJhbnNpdGlvbjpzdHJva2UtZGFzaG9mZnNldCAuM3MgZWFzZS1pbi1vdXQ7LXdlYmtpdC10cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IC4zcyBlYXNlLWluLW91dDstbXMtdHJhbnNpdGlvbjpzdHJva2UtZGFzaG9mZnNldCAuM3MgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IC4zcyBlYXNlLWluLW91dH0jcGllLXBhdGh7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7LW1vei10cmFuc2Zvcm06cm90YXRlKC05MGRlZyl9LmxhYmVse3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwOy13ZWJraXQtYm94LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LWZhbWlseTpLcmVvbiBWYXJpYWJsZUZvbnQ7Y29sb3I6IzdmOGM4ZH1gXVxufSlcbmV4cG9ydCBjbGFzcyBNZ3hDaXJjdWxhclByb2dyZXNzUGllQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICAvKiBEYXRhIHNlY3Rpb24gKi9cbiAgQElucHV0KCkgdG90YWw6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIGJhclZhbHVlOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwZXJjZW50YWdlOiBudW1iZXIgPSAwO1xuXG4gIC8qIERpc3BsYXkgc2VjdGlvbiAqL1xuICBASW5wdXQoKSBjb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGRpYW1ldGVyOiBudW1iZXIgPSAxNTA7XG4gIEBJbnB1dCgpIGZvbnRTaXplOiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmcgPSAnIzMyODJiOCc7XG4gIEBJbnB1dCgpIGJnQ29sb3I6IHN0cmluZyA9ICcjZWVlJztcbiAgQElucHV0KCkgYmdTaXplOiBudW1iZXIgPSAxMDtcbiAgXG4gIHByaXZhdGUgbWd4UHJlZml4ID0gJ21neC1jaXJjdWxhci1wcm9ncmVzcy1waWUnO1xuICBwYXRoRGF0YTogc3RyaW5nO1xuICBuZXdQYXRoRGF0YTogc3RyaW5nO1xuICBwZXJjZW50dWFsOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbiBcbiAgbmdPbkNoYW5nZXMoKSB7XG5cbiAgICB0aGlzLnNob3dXYXJuaW5ncygpO1xuXG4gICAgdGhpcy5wZXJjZW50dWFsID0gK3RoaXMucGVyY2VudGFnZSB8fCAoK3RoaXMuYmFyVmFsdWUgLyArdGhpcy50b3RhbCkgKiAxMDA7XG5cbiAgICB0aGlzLnBlcmNlbnR1YWwgPSBpc05hTih0aGlzLnBlcmNlbnR1YWwpID8gMCA6ICt0aGlzLnBlcmNlbnR1YWwudG9GaXhlZCgyKTtcbiAgICBpZiAodGhpcy5wZXJjZW50dWFsID4gMTAwKSB7XG4gICAgICB0aGlzLnNldFNsaWNlKDEpXG4gICAgICB0aGlzLnBlcmNlbnR1YWwgPSAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U2xpY2UodGhpcy5wZXJjZW50dWFsIC8gMTAwKVxuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTbGljZShwZXJjZW50KXtcbiAgICBjb25zdCBbZW5kWCwgZW5kWV0gPSB0aGlzLmdldENvb3JkaW5hdGVzRm9yUGVyY2VudChwZXJjZW50KTtcbiAgICBjb25zdCBsYXJnZUFyY0ZsYWcgPSBwZXJjZW50ID4gLjUgPyAxIDogMDtcbiAgICB0aGlzLnBhdGhEYXRhID0gWyBcbiAgICAgIGBNIDEgMGAsIC8vIE1vdmVcbiAgICAgIGBBIDEgMSAwICR7bGFyZ2VBcmNGbGFnfSAxICR7ZW5kWH0gJHtlbmRZfWAsIC8vIEFyY1xuICAgICAgYEwgMCAwYCwgLy8gTGluZVxuICAgIF0uam9pbignICcpOyBcbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRDb29yZGluYXRlc0ZvclBlcmNlbnQocGVyY2VudCkge1xuICAgIGNvbnN0IHggPSBNYXRoLmNvcygyICogTWF0aC5QSSAqIHBlcmNlbnQpO1xuICAgIGNvbnN0IHkgPSBNYXRoLnNpbigyICogTWF0aC5QSSAqIHBlcmNlbnQpO1xuICAgIHJldHVybiBbeCwgeV07XG4gIH1cblxuICBwcml2YXRlIHNob3dXYXJuaW5ncygpIHtcbiAgICBpZiAoIXRoaXMucGVyY2VudGFnZSB8fCBpc05hTih0aGlzLnBlcmNlbnRhZ2UpKSB7XG4gICAgICBpZiAoaXNOYU4odGhpcy5iYXJWYWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubWd4UHJlZml4fSBiYXJWYWx1ZTogJHt0aGlzLmJhclZhbHVlfWApO1xuICAgICAgfSBlbHNlIGlmIChpc05hTih0aGlzLnRvdGFsKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5tZ3hQcmVmaXh9IHRvdGFsOiAke3RoaXMudG90YWx9YCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYmFyVmFsdWUgPiB0aGlzLnRvdGFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm1neFByZWZpeH0gYmFyVmFsdWU6ICR7dGhpcy5iYXJWYWx1ZX0gaXMgbW9yZSB0aGFuIHRvdGFsOiAke3RoaXMudG90YWx9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Rm9udFNpemUocmVkdWNlcjogbnVtYmVyID0gMSkge1xuICAgIHJldHVybiBgJHsodGhpcy5mb250U2l6ZSB8fCAodGhpcy5kaWFtZXRlciAvIDQpKSAvIHJlZHVjZXJ9cHhgO1xuICB9XG59XG4iXX0=