mgx-circular-progress-bar
Version:
A library for circular progress bars components, an elegant way to rappresent your percentages.
152 lines (151 loc) • 15.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, TemplateRef } from '@angular/core';
export class MgxCircularProgressPieComponent {
constructor() {
/* 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 {?}
*/
ngOnChanges() {
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 {?}
*/
setSlice(percent) {
const [endX, endY] = this.getCoordinatesForPercent(percent);
/** @type {?} */
const largeArcFlag = percent > .5 ? 1 : 0;
this.pathData = [
`M 1 0`,
// Move
`A 1 1 0 ${largeArcFlag} 1 ${endX} ${endY}`,
`L 0 0`,
].join(' ');
}
/**
* @param {?} percent
* @return {?}
*/
getCoordinatesForPercent(percent) {
/** @type {?} */
const x = Math.cos(2 * Math.PI * percent);
/** @type {?} */
const y = Math.sin(2 * Math.PI * percent);
return [x, y];
}
/**
* @return {?}
*/
showWarnings() {
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 {?}
*/
getFontSize(reducer = 1) {
return `${(this.fontSize || (this.diameter / 4)) / reducer}px`;
}
}
MgxCircularProgressPieComponent.decorators = [
{ type: Component, args: [{
selector: 'mgx-circular-progress-pie',
template: `<div class="contain">
<svg xmlns="http://www.w3.org/2000/svg" x="0" y="0" [ngStyle]="{'width.px': diameter, 'height.px': diameter }"
viewBox="-1 -1 2 2">
<circle id="base-circle" [attr.stroke]="bgColor" [attr.fill]="bgColor" cx="0" cy="0" [attr.r]="bgSize / 20" />
<path id="pie-path" [attr.fill]="color" [attr.d]="pathData" rotate="50"></path>
</svg>
<div class="label">
<ng-container *ngIf="contentTemplate; else projectContent">
<ng-template *ngTemplateOutlet="contentTemplate"></ng-template>
</ng-container>
<ng-template #projectContent>
<div #contentRef>
<ng-content></ng-content>
</div>
<div *ngIf="!contentRef?.childNodes?.length" [style.font-size]="getFontSize()">
{{percentual}}<span [style.font-size]="getFontSize(1.2)">%</span>
</div>
</ng-template>
</div>
</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 = () => [];
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 }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWd4LWNpcmN1bGFyLXByb2dyZXNzLXBpZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tZ3gtY2lyY3VsYXItcHJvZ3Jlc3MtYmFyLyIsInNvdXJjZXMiOlsibGliL21neC1jaXJjdWxhci1wcm9ncmVzcy1waWUvbWd4LWNpcmN1bGFyLXByb2dyZXNzLXBpZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQTBCekUsTUFBTTtJQW9CSjs7cUJBakJ5QixDQUFDO3dCQUNFLENBQUM7MEJBQ0MsQ0FBQzt3QkFJSCxHQUFHO3FCQUVOLFNBQVM7dUJBQ1AsTUFBTTtzQkFDUCxFQUFFO3lCQUVSLDJCQUEyQjswQkFHMUIsQ0FBQztLQUVOOzs7O0lBRWhCLFdBQVc7UUFFVCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRTNFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO1NBQ3ZCO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUE7U0FDckM7S0FFRjs7Ozs7SUFFTyxRQUFRLENBQUMsT0FBTztRQUN0QixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7UUFDNUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLE9BQU87O1lBQ1AsV0FBVyxZQUFZLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRTtZQUMzQyxPQUFPO1NBQ1IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Ozs7OztJQUlOLHdCQUF3QixDQUFDLE9BQU87O1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7O1FBQzFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzs7OztJQUdSLFlBQVk7UUFDbEIsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsY0FBYyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUM5RDtZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLFdBQVcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDeEQ7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLGNBQWMsSUFBSSxDQUFDLFFBQVEsd0JBQXdCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ2hHO1NBQ0Y7Ozs7OztJQUdILFdBQVcsQ0FBQyxVQUFrQixDQUFDO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQztLQUNoRTs7O1lBN0ZGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMkJBQTJCO2dCQUNyQyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkw7Z0JBQ0wsTUFBTSxFQUFFLENBQUMseWpDQUF5akMsQ0FBQzthQUNwa0M7Ozs7O29CQUlFLEtBQUs7dUJBQ0wsS0FBSzt5QkFDTCxLQUFLOzhCQUdMLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLO29CQUNMLEtBQUs7c0JBQ0wsS0FBSztxQkFDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtZ3gtY2lyY3VsYXItcHJvZ3Jlc3MtcGllJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiY29udGFpblwiPlxuICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHg9XCIwXCIgeT1cIjBcIiBbbmdTdHlsZV09XCJ7J3dpZHRoLnB4JzogZGlhbWV0ZXIsICdoZWlnaHQucHgnOiBkaWFtZXRlciB9XCJcbiAgICAgICAgdmlld0JveD1cIi0xIC0xIDIgMlwiPlxuICAgICAgICA8Y2lyY2xlIGlkPVwiYmFzZS1jaXJjbGVcIiBbYXR0ci5zdHJva2VdPVwiYmdDb2xvclwiIFthdHRyLmZpbGxdPVwiYmdDb2xvclwiIGN4PVwiMFwiIGN5PVwiMFwiIFthdHRyLnJdPVwiYmdTaXplIC8gMjBcIiAvPlxuICAgICAgICA8cGF0aCBpZD1cInBpZS1wYXRoXCIgW2F0dHIuZmlsbF09XCJjb2xvclwiIFthdHRyLmRdPVwicGF0aERhdGFcIiByb3RhdGU9XCI1MFwiPjwvcGF0aD5cbiAgICA8L3N2Zz5cbiAgICA8ZGl2IGNsYXNzPVwibGFiZWxcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRUZW1wbGF0ZTsgZWxzZSBwcm9qZWN0Q29udGVudFwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjcHJvamVjdENvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2ICNjb250ZW50UmVmPlxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb250ZW50UmVmPy5jaGlsZE5vZGVzPy5sZW5ndGhcIiBbc3R5bGUuZm9udC1zaXplXT1cImdldEZvbnRTaXplKClcIj5cbiAgICAgICAgICAgICAgICB7e3BlcmNlbnR1YWx9fTxzcGFuIFtzdHlsZS5mb250LXNpemVdPVwiZ2V0Rm9udFNpemUoMS4yKVwiPiYjMzc7PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgLmNvbnRhaW57ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmV9I3BhdGh7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7LW1vei10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgY2VudGVyOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgY2VudGVyOy1tcy10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBjZW50ZXI7LW1vei10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBjZW50ZXI7dHJhbnNpdGlvbjpzdHJva2UtZGFzaG9mZnNldCAuM3MgZWFzZS1pbi1vdXQ7LXdlYmtpdC10cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IC4zcyBlYXNlLWluLW91dDstbXMtdHJhbnNpdGlvbjpzdHJva2UtZGFzaG9mZnNldCAuM3MgZWFzZS1pbi1vdXQ7LW1vei10cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IC4zcyBlYXNlLWluLW91dH0jcGllLXBhdGh7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOy1tcy10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7LW1vei10cmFuc2Zvcm06cm90YXRlKC05MGRlZyl9LmxhYmVse3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7Ym90dG9tOjA7bGVmdDowO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwOy13ZWJraXQtYm94LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LWZhbWlseTpLcmVvbiBWYXJpYWJsZUZvbnQ7Y29sb3I6IzdmOGM4ZH1gXVxufSlcbmV4cG9ydCBjbGFzcyBNZ3hDaXJjdWxhclByb2dyZXNzUGllQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcblxuICAvKiBEYXRhIHNlY3Rpb24gKi9cbiAgQElucHV0KCkgdG90YWw6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpIGJhclZhbHVlOiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBwZXJjZW50YWdlOiBudW1iZXIgPSAwO1xuXG4gIC8qIERpc3BsYXkgc2VjdGlvbiAqL1xuICBASW5wdXQoKSBjb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGRpYW1ldGVyOiBudW1iZXIgPSAxNTA7XG4gIEBJbnB1dCgpIGZvbnRTaXplOiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9yOiBzdHJpbmcgPSAnIzMyODJiOCc7XG4gIEBJbnB1dCgpIGJnQ29sb3I6IHN0cmluZyA9ICcjZWVlJztcbiAgQElucHV0KCkgYmdTaXplOiBudW1iZXIgPSAxMDtcbiAgXG4gIHByaXZhdGUgbWd4UHJlZml4ID0gJ21neC1jaXJjdWxhci1wcm9ncmVzcy1waWUnO1xuICBwYXRoRGF0YTogc3RyaW5nO1xuICBuZXdQYXRoRGF0YTogc3RyaW5nO1xuICBwZXJjZW50dWFsOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cbiBcbiAgbmdPbkNoYW5nZXMoKSB7XG5cbiAgICB0aGlzLnNob3dXYXJuaW5ncygpO1xuXG4gICAgdGhpcy5wZXJjZW50dWFsID0gK3RoaXMucGVyY2VudGFnZSB8fCAoK3RoaXMuYmFyVmFsdWUgLyArdGhpcy50b3RhbCkgKiAxMDA7XG5cbiAgICB0aGlzLnBlcmNlbnR1YWwgPSBpc05hTih0aGlzLnBlcmNlbnR1YWwpID8gMCA6ICt0aGlzLnBlcmNlbnR1YWwudG9GaXhlZCgyKTtcbiAgICBpZiAodGhpcy5wZXJjZW50dWFsID4gMTAwKSB7XG4gICAgICB0aGlzLnNldFNsaWNlKDEpXG4gICAgICB0aGlzLnBlcmNlbnR1YWwgPSAxMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0U2xpY2UodGhpcy5wZXJjZW50dWFsIC8gMTAwKVxuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBzZXRTbGljZShwZXJjZW50KXtcbiAgICBjb25zdCBbZW5kWCwgZW5kWV0gPSB0aGlzLmdldENvb3JkaW5hdGVzRm9yUGVyY2VudChwZXJjZW50KTtcbiAgICBjb25zdCBsYXJnZUFyY0ZsYWcgPSBwZXJjZW50ID4gLjUgPyAxIDogMDtcbiAgICB0aGlzLnBhdGhEYXRhID0gWyBcbiAgICAgIGBNIDEgMGAsIC8vIE1vdmVcbiAgICAgIGBBIDEgMSAwICR7bGFyZ2VBcmNGbGFnfSAxICR7ZW5kWH0gJHtlbmRZfWAsIC8vIEFyY1xuICAgICAgYEwgMCAwYCwgLy8gTGluZVxuICAgIF0uam9pbignICcpOyBcbiAgfVxuXG5cbiAgcHJpdmF0ZSBnZXRDb29yZGluYXRlc0ZvclBlcmNlbnQocGVyY2VudCkge1xuICAgIGNvbnN0IHggPSBNYXRoLmNvcygyICogTWF0aC5QSSAqIHBlcmNlbnQpO1xuICAgIGNvbnN0IHkgPSBNYXRoLnNpbigyICogTWF0aC5QSSAqIHBlcmNlbnQpO1xuICAgIHJldHVybiBbeCwgeV07XG4gIH1cblxuICBwcml2YXRlIHNob3dXYXJuaW5ncygpIHtcbiAgICBpZiAoIXRoaXMucGVyY2VudGFnZSB8fCBpc05hTih0aGlzLnBlcmNlbnRhZ2UpKSB7XG4gICAgICBpZiAoaXNOYU4odGhpcy5iYXJWYWx1ZSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMubWd4UHJlZml4fSBiYXJWYWx1ZTogJHt0aGlzLmJhclZhbHVlfWApO1xuICAgICAgfSBlbHNlIGlmIChpc05hTih0aGlzLnRvdGFsKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7dGhpcy5tZ3hQcmVmaXh9IHRvdGFsOiAke3RoaXMudG90YWx9YCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYmFyVmFsdWUgPiB0aGlzLnRvdGFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLm1neFByZWZpeH0gYmFyVmFsdWU6ICR7dGhpcy5iYXJWYWx1ZX0gaXMgbW9yZSB0aGFuIHRvdGFsOiAke3RoaXMudG90YWx9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Rm9udFNpemUocmVkdWNlcjogbnVtYmVyID0gMSkge1xuICAgIHJldHVybiBgJHsodGhpcy5mb250U2l6ZSB8fCAodGhpcy5kaWFtZXRlciAvIDQpKSAvIHJlZHVjZXJ9cHhgO1xuICB9XG59XG4iXX0=