UNPKG

ngx-frappe-chart

Version:

A simple and easy to use angular wrapper on top of frappe for generating awesome graphs.

374 lines (362 loc) 32.3 kB
import { Component, Input, Directive, ElementRef, NgModule } from '@angular/core'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ var FrappeChartsHeatmapComponent = /** @class */ (function () { function FrappeChartsHeatmapComponent() { } FrappeChartsHeatmapComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-frappe-charts-heatmap', template: "\n <div\n ngxFrappeChartsHeatmap\n [title]=\"title\"\n [countLabel]=\"countLabel\"\n [discreteDomains]=\"discreteDomains\"\n [colors]=\"colors\"\n [data]=\"data\"\n ></div>\n " },] }, ]; FrappeChartsHeatmapComponent.propDecorators = { data: [{ type: Input }], title: [{ type: Input }], countLabel: [{ type: Input }], discreteDomains: [{ type: Input }], colors: [{ type: Input }] }; return FrappeChartsHeatmapComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ var FrappeChartsPercentageComponent = /** @class */ (function () { function FrappeChartsPercentageComponent() { } FrappeChartsPercentageComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-frappe-charts-percentage', template: "\n <div\n ngxFrappeChartsPercentage\n [title]=\"title\"\n [colors]=\"colors\"\n [height]=\"height\"\n [data]=\"data\"\n [type]=\"type\"\n [barOptions]=\"barOptions\"\n ></div>\n " },] }, ]; FrappeChartsPercentageComponent.propDecorators = { data: [{ type: Input }], title: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], type: [{ type: Input }], maxSlices: [{ type: Input }], barOptions: [{ type: Input }] }; return FrappeChartsPercentageComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ var FrappeChartsBarComponent = /** @class */ (function () { function FrappeChartsBarComponent() { } FrappeChartsBarComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-frappe-charts-bar', template: "\n <div\n ngxFrappeChartsAxis\n [title]=\"title\"\n [colors]=\"colors\"\n [height]=\"height\"\n [data]=\"data\"\n [type]=\"type\"\n [isNavigable]=\"isNavigable\"\n [valuesOverPoints]=\"valuesOverPoints\"\n [axisOptions]=\"axisOptions\"\n [tooltipOptions]=\"tooltipOptions\"\n [barOptions]=\"barOptions\"\n [lineOptions]=\"lineOptions\"\n [yMarkers]=\"yMarkers\"\n [yRegions]=\"yRegions\"\n ></div>\n " },] }, ]; FrappeChartsBarComponent.propDecorators = { data: [{ type: Input }], title: [{ type: Input }], type: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], isNavigable: [{ type: Input }], valuesOverPoints: [{ type: Input }], axisOptions: [{ type: Input }], tooltipOptions: [{ type: Input }], barOptions: [{ type: Input }], lineOptions: [{ type: Input }], yMarkers: [{ type: Input }], yRegions: [{ type: Input }] }; return FrappeChartsBarComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ // just to avoid error marked by editor. Optional declaration var FrappeChartsHeatmapDirective = /** @class */ (function () { function FrappeChartsHeatmapDirective(el) { this.el = el; this.type = 'heatmap'; } /** * @return {?} */ FrappeChartsHeatmapDirective.prototype.ngOnChanges = /** * @return {?} */ function () { /** @type {?} */ var chart = new frappe.Chart(this.el.nativeElement, this.getHeatmapInputs()); }; /** * @return {?} */ FrappeChartsHeatmapDirective.prototype.getHeatmapInputs = /** * @return {?} */ function () { /** @type {?} */ var heatmapobject = {}; heatmapobject['countLabel'] = this.countLabel; heatmapobject['discreteDomains'] = this.discreteDomains; heatmapobject['colors'] = this.colors; heatmapobject['type'] = this.type; heatmapobject['title'] = this.title; heatmapobject['data'] = this.data; return heatmapobject; }; FrappeChartsHeatmapDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxFrappeChartsHeatmap]' },] }, ]; FrappeChartsHeatmapDirective.ctorParameters = function () { return [ { type: ElementRef } ]; }; FrappeChartsHeatmapDirective.propDecorators = { title: [{ type: Input }], data: [{ type: Input }], countLabel: [{ type: Input }], discreteDomains: [{ type: Input }], colors: [{ type: Input }] }; return FrappeChartsHeatmapDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** @type {?} */ var FrappeChartsConstants = { chartType: { percentage: 'percentage', pie: 'pie', bar: 'bar', line: 'line', axismixed: 'axis-mixed' } }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ var FrappeChartsPercentageDirective = /** @class */ (function () { function FrappeChartsPercentageDirective(el) { this.el = el; } /** * @return {?} */ FrappeChartsPercentageDirective.prototype.ngOnChanges = /** * @return {?} */ function () { /** @type {?} */ var chart = new frappe.Chart(this.el.nativeElement, this.getPieInputs()); }; /** * @return {?} */ FrappeChartsPercentageDirective.prototype.getPieInputs = /** * @return {?} */ function () { /** @type {?} */ var pieobject = {}; pieobject['colors'] = this.colors; pieobject['type'] = this.type; pieobject['title'] = this.title; pieobject['data'] = this.data; pieobject['height'] = this.height; pieobject['maxSlices'] = this.maxSlices; this.addBarOptions(pieobject); return pieobject; }; /** * @param {?} pieobject * @return {?} */ FrappeChartsPercentageDirective.prototype.addBarOptions = /** * @param {?} pieobject * @return {?} */ function (pieobject) { if (this.type === FrappeChartsConstants.chartType.percentage) { pieobject['barOptions'] = this.barOptions; } }; FrappeChartsPercentageDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxFrappeChartsPercentage]' },] }, ]; FrappeChartsPercentageDirective.ctorParameters = function () { return [ { type: ElementRef } ]; }; FrappeChartsPercentageDirective.propDecorators = { title: [{ type: Input }], data: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], type: [{ type: Input }], maxSlices: [{ type: Input }], barOptions: [{ type: Input }] }; return FrappeChartsPercentageDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ var FrappeChartsAxisDirective = /** @class */ (function () { function FrappeChartsAxisDirective(el) { this.el = el; } /** * @return {?} */ FrappeChartsAxisDirective.prototype.ngOnChanges = /** * @return {?} */ function () { /** @type {?} */ var chart = new frappe.Chart(this.el.nativeElement, this.getAxisInputs()); }; /** * @return {?} */ FrappeChartsAxisDirective.prototype.getAxisInputs = /** * @return {?} */ function () { /** @type {?} */ var barObject = {}; barObject['colors'] = this.colors; barObject['type'] = this.type; barObject['title'] = this.title; barObject['height'] = this.height; barObject['isNavigable'] = this.isNavigable; barObject['valuesOverPoints'] = this.valuesOverPoints; barObject['axisOptions'] = this.axisOptions; barObject['tooltipOptions'] = this.tooltipOptions; this.addGraphData(barObject); this.addLineOptions(barObject); this.addBarOptions(barObject); return barObject; }; /** * @param {?} barObject * @return {?} */ FrappeChartsAxisDirective.prototype.addLineOptions = /** * @param {?} barObject * @return {?} */ function (barObject) { if (this.type === FrappeChartsConstants.chartType.line || this.type === FrappeChartsConstants.chartType.axismixed) { barObject['lineOptions'] = this.lineOptions; } }; /** * @param {?} barObject * @return {?} */ FrappeChartsAxisDirective.prototype.addBarOptions = /** * @param {?} barObject * @return {?} */ function (barObject) { if (this.type === FrappeChartsConstants.chartType.bar || this.type === FrappeChartsConstants.chartType.axismixed) { barObject['barOptions'] = this.barOptions; } }; /** * @param {?} barObject * @return {?} */ FrappeChartsAxisDirective.prototype.addGraphData = /** * @param {?} barObject * @return {?} */ function (barObject) { /** @type {?} */ var data = this.data; if (this.yMarkers) { data['yMarkers'] = this.yMarkers; } if (this.yRegions) { data['yRegions'] = this.yRegions; } barObject['data'] = data; }; FrappeChartsAxisDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxFrappeChartsAxis]' },] }, ]; FrappeChartsAxisDirective.ctorParameters = function () { return [ { type: ElementRef } ]; }; FrappeChartsAxisDirective.propDecorators = { data: [{ type: Input }], type: [{ type: Input }], title: [{ type: Input }], colors: [{ type: Input }], height: [{ type: Input }], isNavigable: [{ type: Input }], valuesOverPoints: [{ type: Input }], axisOptions: [{ type: Input }], tooltipOptions: [{ type: Input }], barOptions: [{ type: Input }], lineOptions: [{ type: Input }], yMarkers: [{ type: Input }], yRegions: [{ type: Input }] }; return FrappeChartsAxisDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ var FrappeChartsModule = /** @class */ (function () { function FrappeChartsModule() { } FrappeChartsModule.decorators = [ { type: NgModule, args: [{ imports: [], declarations: [ FrappeChartsHeatmapComponent, FrappeChartsPercentageComponent, FrappeChartsBarComponent, FrappeChartsHeatmapDirective, FrappeChartsPercentageDirective, FrappeChartsAxisDirective ], exports: [ FrappeChartsHeatmapComponent, FrappeChartsPercentageComponent, FrappeChartsBarComponent ] },] }, ]; return FrappeChartsModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ export { FrappeChartsHeatmapComponent, FrappeChartsPercentageComponent, FrappeChartsBarComponent, FrappeChartsModule, FrappeChartsAxisDirective as ɵc, FrappeChartsHeatmapDirective as ɵa, FrappeChartsPercentageDirective as ɵb }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZyYXBwZS1jaGFydC5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvY29tcG9uZW50cy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtcGVyY2VudGFnZS5jb21wb25lbnQudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2NvbXBvbmVudHMvZnJhcHBlLWNoYXJ0cy1iYXIuY29tcG9uZW50LnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtaGVhdG1hcC5kaXJlY3RpdmUudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2NvbnN0YW50cy9mcmFwcGUtY2hhcnRzLmNvbnN0YW50cy50cyIsIm5nOi8vbmd4LWZyYXBwZS1jaGFydC9saWIvZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLXBlcmNlbnRhZ2UuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtZnJhcHBlLWNoYXJ0L2xpYi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtYXhpcy5kaXJlY3RpdmUudHMiLCJuZzovL25neC1mcmFwcGUtY2hhcnQvbGliL2ZyYXBwZS1jaGFydHMubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhlYXRtYXBEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2hlYXRtYXAtZGF0YS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1mcmFwcGUtY2hhcnRzLWhlYXRtYXAnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG5neEZyYXBwZUNoYXJ0c0hlYXRtYXBcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbY291bnRMYWJlbF09XCJjb3VudExhYmVsXCJcbiAgICAgIFtkaXNjcmV0ZURvbWFpbnNdPVwiZGlzY3JldGVEb21haW5zXCJcbiAgICAgIFtjb2xvcnNdPVwiY29sb3JzXCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgID48L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNIZWF0bWFwQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogSGVhdG1hcERhdGFNb2RlbDtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvdW50TGFiZWw/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc2NyZXRlRG9tYWlucz86IG51bWJlcjtcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nWzVdO1xufVxuXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCYXJPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wZXJjZW50YWdlLWJhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEdyYXBoRGF0YU1vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaC1kYXRhLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWZyYXBwZS1jaGFydHMtcGVyY2VudGFnZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgbmd4RnJhcHBlQ2hhcnRzUGVyY2VudGFnZVxuICAgICAgW3RpdGxlXT1cInRpdGxlXCJcbiAgICAgIFtjb2xvcnNdPVwiY29sb3JzXCJcbiAgICAgIFtoZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxuICAgICAgW3R5cGVdPVwidHlwZVwiXG4gICAgICBbYmFyT3B0aW9uc109XCJiYXJPcHRpb25zXCJcbiAgICA+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzUGVyY2VudGFnZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIGRhdGE6IEdyYXBoRGF0YU1vZGVsO1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgY29sb3JzPzogc3RyaW5nW107XG4gIEBJbnB1dCgpIGhlaWdodD86IG51bWJlcjtcbiAgQElucHV0KCkgdHlwZT86IHN0cmluZzsgLy8gcGllICwgcGVyY2VudGFnZVxuICBASW5wdXQoKSBtYXhTbGljZXM/OiBudW1iZXI7IC8vIHJlc3RyaWN0IG51bWJlciBvZiBzbGljZXNcbiAgQElucHV0KCkgYmFyT3B0aW9ucz86IEJhck9wdGlvbnM7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBeGlzT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYXhpcy1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IFRvb2x0aXBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90b29sdGlwLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgQmFyT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYmFyLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgTGluZU9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2xpbmUtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBZTWFya2VycyB9IGZyb20gJy4uL2ludGVyZmFjZXMveS1tYXJrZXJzLm1vZGVsJztcbmltcG9ydCB7IFlSZWdpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy95LXJlZ2lvbnMubW9kZWwnO1xuaW1wb3J0IHsgR3JhcGhEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBoLWRhdGEubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZnJhcHBlLWNoYXJ0cy1iYXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIG5neEZyYXBwZUNoYXJ0c0F4aXNcbiAgICAgIFt0aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbY29sb3JzXT1cImNvbG9yc1wiXG4gICAgICBbaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgW2lzTmF2aWdhYmxlXT1cImlzTmF2aWdhYmxlXCJcbiAgICAgIFt2YWx1ZXNPdmVyUG9pbnRzXT1cInZhbHVlc092ZXJQb2ludHNcIlxuICAgICAgW2F4aXNPcHRpb25zXT1cImF4aXNPcHRpb25zXCJcbiAgICAgIFt0b29sdGlwT3B0aW9uc109XCJ0b29sdGlwT3B0aW9uc1wiXG4gICAgICBbYmFyT3B0aW9uc109XCJiYXJPcHRpb25zXCJcbiAgICAgIFtsaW5lT3B0aW9uc109XCJsaW5lT3B0aW9uc1wiXG4gICAgICBbeU1hcmtlcnNdPVwieU1hcmtlcnNcIlxuICAgICAgW3lSZWdpb25zXT1cInlSZWdpb25zXCJcbiAgICA+PC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgRnJhcHBlQ2hhcnRzQmFyQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGF0YTogR3JhcGhEYXRhTW9kZWw7XG4gIEBJbnB1dCgpIHRpdGxlPzogc3RyaW5nO1xuICBASW5wdXQoKSB0eXBlPzogc3RyaW5nO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyOyAvLyAyNDA7XG4gIEBJbnB1dCgpIGlzTmF2aWdhYmxlPzogYm9vbGVhbjsgLy8gZmFsc2U7XG4gIEBJbnB1dCgpIHZhbHVlc092ZXJQb2ludHM/OiBib29sZWFuOyAvLyBmYWxzZTtcbiAgQElucHV0KCkgYXhpc09wdGlvbnM/OiBBeGlzT3B0aW9ucztcbiAgQElucHV0KCkgdG9vbHRpcE9wdGlvbnM/OiBUb29sdGlwT3B0aW9ucztcbiAgQElucHV0KCkgYmFyT3B0aW9ucz86IEJhck9wdGlvbnM7XG4gIEBJbnB1dCgpIGxpbmVPcHRpb25zPzogTGluZU9wdGlvbnM7XG4gIEBJbnB1dCgpIHlNYXJrZXJzOiBZTWFya2Vyc1tdO1xuICBASW5wdXQoKSB5UmVnaW9uczogWVJlZ2lvbnNbXTtcbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIHZhciBmcmFwcGU6IGFueTsgLy8ganVzdCB0byBhdm9pZCBlcnJvciBtYXJrZWQgYnkgZWRpdG9yLiBPcHRpb25hbCBkZWNsYXJhdGlvblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RnJhcHBlQ2hhcnRzSGVhdG1hcF0nXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c0hlYXRtYXBEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB0aXRsZT86IHN0cmluZztcbiAgQElucHV0KCkgZGF0YTogYW55O1xuICBASW5wdXQoKSBjb3VudExhYmVsPzogc3RyaW5nO1xuICBASW5wdXQoKSBkaXNjcmV0ZURvbWFpbnM/OiBudW1iZXI7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1s1XTtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGUgPSAnaGVhdG1hcCc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge31cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBjb25zdCBjaGFydCA9IG5ldyBmcmFwcGUuQ2hhcnQoXG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0aGlzLmdldEhlYXRtYXBJbnB1dHMoKVxuICAgICk7XG4gIH1cblxuICBnZXRIZWF0bWFwSW5wdXRzKCk6IGFueSB7XG4gICAgY29uc3QgaGVhdG1hcG9iamVjdCA9IHt9O1xuICAgIGhlYXRtYXBvYmplY3RbJ2NvdW50TGFiZWwnXSA9IHRoaXMuY291bnRMYWJlbDtcbiAgICBoZWF0bWFwb2JqZWN0WydkaXNjcmV0ZURvbWFpbnMnXSA9IHRoaXMuZGlzY3JldGVEb21haW5zO1xuICAgIGhlYXRtYXBvYmplY3RbJ2NvbG9ycyddID0gdGhpcy5jb2xvcnM7XG4gICAgaGVhdG1hcG9iamVjdFsndHlwZSddID0gdGhpcy50eXBlO1xuICAgIGhlYXRtYXBvYmplY3RbJ3RpdGxlJ10gPSB0aGlzLnRpdGxlO1xuICAgIGhlYXRtYXBvYmplY3RbJ2RhdGEnXSA9IHRoaXMuZGF0YTtcbiAgICByZXR1cm4gaGVhdG1hcG9iamVjdDtcbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IEZyYXBwZUNoYXJ0c0NvbnN0YW50cyA9IHtcclxuICBjaGFydFR5cGU6IHtcclxuICAgIHBlcmNlbnRhZ2U6ICdwZXJjZW50YWdlJyxcclxuICAgIHBpZTogJ3BpZScsXHJcbiAgICBiYXI6ICdiYXInLFxyXG4gICAgbGluZTogJ2xpbmUnLFxyXG4gICAgYXhpc21peGVkOiAnYXhpcy1taXhlZCdcclxuICB9XHJcbn07XHJcbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2ZyYXBwZS1jaGFydHMuY29uc3RhbnRzJztcbmltcG9ydCB7IEJhck9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3BlcmNlbnRhZ2UtYmFyLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgR3JhcGhEYXRhTW9kZWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyYXBoLWRhdGEubW9kZWwnO1xuXG5kZWNsYXJlIHZhciBmcmFwcGU6IGFueTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VdJ1xufSlcbmV4cG9ydCBjbGFzcyBGcmFwcGVDaGFydHNQZXJjZW50YWdlRGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRhdGE6IEdyYXBoRGF0YU1vZGVsO1xuICBASW5wdXQoKSBjb2xvcnM/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgaGVpZ2h0PzogbnVtYmVyO1xuICBASW5wdXQoKSB0eXBlOiBzdHJpbmc7IC8vIHBpZSAsIHBlcmNlbnRhZ2VcbiAgQElucHV0KCkgbWF4U2xpY2VzPzogbnVtYmVyOyAvLyByZXN0cmljdCBudW1iZXIgb2Ygc2xpY2VzXG4gIEBJbnB1dCgpIGJhck9wdGlvbnM/OiBCYXJPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgZnJhcHBlLkNoYXJ0KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5nZXRQaWVJbnB1dHMoKSk7XG4gIH1cblxuICBnZXRQaWVJbnB1dHMoKTogYW55IHtcbiAgICBjb25zdCBwaWVvYmplY3QgPSB7fTtcbiAgICBwaWVvYmplY3RbJ2NvbG9ycyddID0gdGhpcy5jb2xvcnM7XG4gICAgcGllb2JqZWN0Wyd0eXBlJ10gPSB0aGlzLnR5cGU7XG4gICAgcGllb2JqZWN0Wyd0aXRsZSddID0gdGhpcy50aXRsZTtcbiAgICBwaWVvYmplY3RbJ2RhdGEnXSA9IHRoaXMuZGF0YTtcbiAgICBwaWVvYmplY3RbJ2hlaWdodCddID0gdGhpcy5oZWlnaHQ7XG4gICAgcGllb2JqZWN0WydtYXhTbGljZXMnXSA9IHRoaXMubWF4U2xpY2VzO1xuICAgIHRoaXMuYWRkQmFyT3B0aW9ucyhwaWVvYmplY3QpO1xuICAgIHJldHVybiBwaWVvYmplY3Q7XG4gIH1cblxuICBhZGRCYXJPcHRpb25zKHBpZW9iamVjdCkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09IEZyYXBwZUNoYXJ0c0NvbnN0YW50cy5jaGFydFR5cGUucGVyY2VudGFnZSkge1xuICAgICAgcGllb2JqZWN0WydiYXJPcHRpb25zJ10gPSB0aGlzLmJhck9wdGlvbnM7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQXhpc09wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2F4aXMtb3B0aW9ucy5tb2RlbCc7XG5pbXBvcnQgeyBUb29sdGlwT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdG9vbHRpcC1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IEJhck9wdGlvbnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Jhci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IExpbmVPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9saW5lLW9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgWU1hcmtlcnMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3ktbWFya2Vycy5tb2RlbCc7XG5pbXBvcnQgeyBZUmVnaW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMveS1yZWdpb25zLm1vZGVsJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c0NvbnN0YW50cyB9IGZyb20gJy4uL2NvbnN0YW50cy9mcmFwcGUtY2hhcnRzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBHcmFwaERhdGFNb2RlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3JhcGgtZGF0YS5tb2RlbCc7XG5cbmRlY2xhcmUgdmFyIGZyYXBwZTogYW55O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RnJhcHBlQ2hhcnRzQXhpc10nXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c0F4aXNEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBkYXRhOiBHcmFwaERhdGFNb2RlbDtcbiAgQElucHV0KCkgdHlwZTogc3RyaW5nOyAvLyAnbGluZSdcbiAgQElucHV0KCkgdGl0bGU/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbG9ycz86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBoZWlnaHQ/OiBudW1iZXI7IC8vIDI0MDtcbiAgQElucHV0KCkgaXNOYXZpZ2FibGU/OiBib29sZWFuOyAvLyBmYWxzZTtcbiAgQElucHV0KCkgdmFsdWVzT3ZlclBvaW50cz86IGJvb2xlYW47IC8vIGZhbHNlO1xuICBASW5wdXQoKSBheGlzT3B0aW9ucz86IEF4aXNPcHRpb25zO1xuICBASW5wdXQoKSB0b29sdGlwT3B0aW9ucz86IFRvb2x0aXBPcHRpb25zO1xuICBASW5wdXQoKSBiYXJPcHRpb25zPzogQmFyT3B0aW9ucztcbiAgQElucHV0KCkgbGluZU9wdGlvbnM/OiBMaW5lT3B0aW9ucztcbiAgQElucHV0KCkgeU1hcmtlcnM6IFlNYXJrZXJzW107XG4gIEBJbnB1dCgpIHlSZWdpb25zOiBZUmVnaW9uc1tdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoKSB7XG4gICAgY29uc3QgY2hhcnQgPSBuZXcgZnJhcHBlLkNoYXJ0KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgdGhpcy5nZXRBeGlzSW5wdXRzKCkpO1xuICB9XG5cbiAgZ2V0QXhpc0lucHV0cygpOiBhbnkge1xuICAgIGNvbnN0IGJhck9iamVjdCA9IHt9O1xuICAgIGJhck9iamVjdFsnY29sb3JzJ10gPSB0aGlzLmNvbG9ycztcbiAgICBiYXJPYmplY3RbJ3R5cGUnXSA9IHRoaXMudHlwZTtcbiAgICBiYXJPYmplY3RbJ3RpdGxlJ10gPSB0aGlzLnRpdGxlO1xuICAgIGJhck9iamVjdFsnaGVpZ2h0J10gPSB0aGlzLmhlaWdodDtcbiAgICBiYXJPYmplY3RbJ2lzTmF2aWdhYmxlJ10gPSB0aGlzLmlzTmF2aWdhYmxlO1xuICAgIGJhck9iamVjdFsndmFsdWVzT3ZlclBvaW50cyddID0gdGhpcy52YWx1ZXNPdmVyUG9pbnRzO1xuICAgIGJhck9iamVjdFsnYXhpc09wdGlvbnMnXSA9IHRoaXMuYXhpc09wdGlvbnM7XG4gICAgYmFyT2JqZWN0Wyd0b29sdGlwT3B0aW9ucyddID0gdGhpcy50b29sdGlwT3B0aW9ucztcblxuICAgIHRoaXMuYWRkR3JhcGhEYXRhKGJhck9iamVjdCk7XG4gICAgdGhpcy5hZGRMaW5lT3B0aW9ucyhiYXJPYmplY3QpO1xuICAgIHRoaXMuYWRkQmFyT3B0aW9ucyhiYXJPYmplY3QpO1xuXG4gICAgcmV0dXJuIGJhck9iamVjdDtcbiAgfVxuXG4gIGFkZExpbmVPcHRpb25zKGJhck9iamVjdCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gRnJhcHBlQ2hhcnRzQ29uc3RhbnRzLmNoYXJ0VHlwZS5saW5lIHx8XG4gICAgICB0aGlzLnR5cGUgPT09IEZyYXBwZUNoYXJ0c0NvbnN0YW50cy5jaGFydFR5cGUuYXhpc21peGVkXG4gICAgKSB7XG4gICAgICBiYXJPYmplY3RbJ2xpbmVPcHRpb25zJ10gPSB0aGlzLmxpbmVPcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIGFkZEJhck9wdGlvbnMoYmFyT2JqZWN0KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLmJhciB8fFxuICAgICAgdGhpcy50eXBlID09PSBGcmFwcGVDaGFydHNDb25zdGFudHMuY2hhcnRUeXBlLmF4aXNtaXhlZFxuICAgICkge1xuICAgICAgYmFyT2JqZWN0WydiYXJPcHRpb25zJ10gPSB0aGlzLmJhck9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgYWRkR3JhcGhEYXRhKGJhck9iamVjdCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGE7XG4gICAgaWYgKHRoaXMueU1hcmtlcnMpIHtcbiAgICAgIGRhdGFbJ3lNYXJrZXJzJ10gPSB0aGlzLnlNYXJrZXJzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnlSZWdpb25zKSB7XG4gICAgICBkYXRhWyd5UmVnaW9ucyddID0gdGhpcy55UmVnaW9ucztcbiAgICB9XG5cbiAgICBiYXJPYmplY3RbJ2RhdGEnXSA9IGRhdGE7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNIZWF0bWFwQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtaGVhdG1hcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzSGVhdG1hcERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9mcmFwcGUtY2hhcnRzLWhlYXRtYXAuZGlyZWN0aXZlJztcbmltcG9ydCB7IEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZnJhcHBlLWNoYXJ0cy1wZXJjZW50YWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNQZXJjZW50YWdlRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtcGVyY2VudGFnZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRnJhcHBlQ2hhcnRzQmFyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2ZyYXBwZS1jaGFydHMtYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGcmFwcGVDaGFydHNBeGlzRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2ZyYXBwZS1jaGFydHMtYXhpcy5kaXJlY3RpdmUnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNIZWF0bWFwRGlyZWN0aXZlLFxuICAgIEZyYXBwZUNoYXJ0c1BlcmNlbnRhZ2VEaXJlY3RpdmUsXG4gICAgRnJhcHBlQ2hhcnRzQXhpc0RpcmVjdGl2ZVxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgRnJhcHBlQ2hhcnRzSGVhdG1hcENvbXBvbmVudCxcbiAgICBGcmFwcGVDaGFydHNQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEZyYXBwZUNoYXJ0c0JhckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZyYXBwZUNoYXJ0c01vZHVsZSB7fVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0lBR0E7S0FtQkM7O2dCQW5CQSxTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsUUFBUSxFQUFFLHNOQVNUO2lCQUNGOzs7dUJBRUUsS0FBSzt3QkFDTCxLQUFLOzZCQUNMLEtBQUs7a0NBQ0wsS0FBSzt5QkFDTCxLQUFLOztJQUNSLG1DQUFDO0NBQUE7Ozs7OztBQ3RCRDtJQUlBO0tBc0JDOztnQkF0QkEsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFFBQVEsRUFBRSw4TkFVVDtpQkFDRjs7O3VCQUVFLEtBQUs7d0JBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUNMLEtBQUs7dUJBQ0wsS0FBSzs0QkFDTCxLQUFLOzZCQUNMLEtBQUs7O0lBQ1Isc0NBQUM7Q0FBQTs7Ozs7O0FDMUJEO0lBU0E7S0FtQ0M7O2dCQW5DQSxTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsUUFBUSxFQUFFLCtkQWlCVDtpQkFDRjs7O3VCQUVFLEtBQUs7d0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3lCQUNMLEtBQUs7eUJBQ0wsS0FBSzs4QkFDTCxLQUFLO21DQUNMLEtBQUs7OEJBQ0wsS0FBSztpQ0FDTCxLQUFLOzZCQUNMLEtBQUs7OEJBQ0wsS0FBSzsyQkFDTCxLQUFLOzJCQUNMLEtBQUs7O0lBQ1IsK0JBQUM7Q0FBQTs7Ozs7O0FDNUNEO0FBS0E7SUFXRSxzQ0FBb0IsRUFBYztRQUFkLE9BQUUsR0FBRixFQUFFLENBQVk7UUFG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