New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

ng2-charts

Package Overview
Dependencies
Maintainers
1
Versions
99
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ng2-charts - npm Package Compare versions

Comparing version 2.0.4 to 2.1.0

495

bundles/ng2-charts.umd.js

@@ -21,2 +21,14 @@ (function (global, factory) {

***************************************************************************** */
var __assign = function () {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __read(o, n) {

@@ -289,3 +301,14 @@ var m = typeof Symbol === "function" && o[Symbol.iterator];

this.chartHover = new i0.EventEmitter();
this.initFlag = false;
this.old = {
dataExists: false,
dataLength: 0,
datasetsExists: false,
datasetsLength: 0,
datasetsDataObjects: [],
datasetsDataLengths: [],
colorsExists: false,
colors: [],
labelsExist: false,
labels: [],
};
this.subs = [];

@@ -329,6 +352,3 @@ }

this.ctx = this.element.nativeElement.getContext('2d');
this.initFlag = true;
if (this.data || this.datasets) {
this.refresh();
}
this.refresh();
this.subs.push(this.themeService.colorschemesOptions.subscribe(( /**

@@ -353,2 +373,229 @@ * @param {?} r

/**
* @return {?}
*/
BaseChartDirective.prototype.ngDoCheck = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.chart) {
return;
}
/** @type {?} */
var updateRequired = UpdateType.Default;
/** @type {?} */
var wantUpdate = ( /**
* @param {?} x
* @return {?}
*/function (x) {
updateRequired = x > updateRequired ? x : updateRequired;
});
if (!!this.data !== this.old.dataExists) {
this.propagateDataToDatasets(this.data);
this.old.dataExists = !!this.data;
wantUpdate(UpdateType.Update);
}
if (this.data && this.data.length !== this.old.dataLength) {
this.old.dataLength = this.data && this.data.length || 0;
wantUpdate(UpdateType.Update);
}
if (!!this.datasets !== this.old.datasetsExists) {
this.old.datasetsExists = !!this.datasets;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.length !== this.old.datasetsLength) {
this.old.datasetsLength = this.datasets && this.datasets.length || 0;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter(( /**
* @param {?} x
* @param {?} i
* @return {?}
*/function (x, i) { return x.data !== _this.old.datasetsDataObjects[i]; })).length) {
this.old.datasetsDataObjects = this.datasets.map(( /**
* @param {?} x
* @return {?}
*/function (x) { return x.data; }));
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter(( /**
* @param {?} x
* @param {?} i
* @return {?}
*/function (x, i) { return x.data.length !== _this.old.datasetsDataLengths[i]; })).length) {
this.old.datasetsDataLengths = this.datasets.map(( /**
* @param {?} x
* @return {?}
*/function (x) { return x.data.length; }));
wantUpdate(UpdateType.Update);
}
if (!!this.colors !== this.old.colorsExists) {
this.old.colorsExists = !!this.colors;
this.updateColors();
wantUpdate(UpdateType.Update);
}
// This smells of inefficiency, might need to revisit this
if (this.colors && this.colors.filter(( /**
* @param {?} x
* @param {?} i
* @return {?}
*/function (x, i) { return !_this.colorsEqual(x, _this.old.colors[i]); })).length) {
this.old.colors = this.colors.map(( /**
* @param {?} x
* @return {?}
*/function (x) { return _this.copyColor(x); }));
this.updateColors();
wantUpdate(UpdateType.Update);
}
if (!!this.labels !== this.old.labelsExist) {
this.old.labelsExist = !!this.labels;
wantUpdate(UpdateType.Update);
}
if (this.labels && this.labels.filter(( /**
* @param {?} x
* @param {?} i
* @return {?}
*/function (x, i) { return !_this.labelsEqual(x, _this.old.labels[i]); })).length) {
this.old.labels = this.labels.map(( /**
* @param {?} x
* @return {?}
*/function (x) { return _this.copyLabel(x); }));
wantUpdate(UpdateType.Update);
}
switch (( /** @type {?} */(updateRequired))) {
case UpdateType.Default:
break;
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
this.refresh();
break;
}
};
/**
* @param {?} a
* @return {?}
*/
BaseChartDirective.prototype.copyLabel = /**
* @param {?} a
* @return {?}
*/
function (a) {
if (Array.isArray(a)) {
return __spread(a);
}
return a;
};
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
BaseChartDirective.prototype.labelsEqual = /**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
return Array.isArray(a) === Array.isArray(b)
&& (Array.isArray(a) || a === b)
&& (!Array.isArray(a) || a.length === b.length)
&& (!Array.isArray(a) || a.filter(( /**
* @param {?} x
* @param {?} i
* @return {?}
*/function (x, i) { return x !== b[i]; })).length === 0);
};
/**
* @param {?} a
* @return {?}
*/
BaseChartDirective.prototype.copyColor = /**
* @param {?} a
* @return {?}
*/
function (a) {
/** @type {?} */
var rc = {
backgroundColor: a.backgroundColor,
borderWidth: a.borderWidth,
borderColor: a.borderColor,
borderCapStyle: a.borderCapStyle,
borderDash: a.borderDash,
borderDashOffset: a.borderDashOffset,
borderJoinStyle: a.borderJoinStyle,
pointBorderColor: a.pointBorderColor,
pointBackgroundColor: a.pointBackgroundColor,
pointBorderWidth: a.pointBorderWidth,
pointRadius: a.pointRadius,
pointHoverRadius: a.pointHoverRadius,
pointHitRadius: a.pointHitRadius,
pointHoverBackgroundColor: a.pointHoverBackgroundColor,
pointHoverBorderColor: a.pointHoverBorderColor,
pointHoverBorderWidth: a.pointHoverBorderWidth,
pointStyle: a.pointStyle,
hoverBackgroundColor: a.hoverBackgroundColor,
hoverBorderColor: a.hoverBorderColor,
hoverBorderWidth: a.hoverBorderWidth,
};
return rc;
};
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
BaseChartDirective.prototype.colorsEqual = /**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
if (!a !== !b) {
return false;
}
return !a || a.backgroundColor === b.backgroundColor
&& (a.borderWidth === b.borderWidth)
&& (a.borderColor === b.borderColor)
&& (a.borderCapStyle === b.borderCapStyle)
&& (a.borderDash === b.borderDash)
&& (a.borderDashOffset === b.borderDashOffset)
&& (a.borderJoinStyle === b.borderJoinStyle)
&& (a.pointBorderColor === b.pointBorderColor)
&& (a.pointBackgroundColor === b.pointBackgroundColor)
&& (a.pointBorderWidth === b.pointBorderWidth)
&& (a.pointRadius === b.pointRadius)
&& (a.pointHoverRadius === b.pointHoverRadius)
&& (a.pointHitRadius === b.pointHitRadius)
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor)
&& (a.pointHoverBorderColor === b.pointHoverBorderColor)
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth)
&& (a.pointStyle === b.pointStyle)
&& (a.hoverBackgroundColor === b.hoverBackgroundColor)
&& (a.hoverBorderColor === b.hoverBorderColor)
&& (a.hoverBorderWidth === b.hoverBorderWidth);
};
/**
* @return {?}
*/
BaseChartDirective.prototype.updateColors = /**
* @return {?}
*/
function () {
var _this = this;
this.datasets.forEach(( /**
* @param {?} elm
* @param {?} index
* @return {?}
*/function (elm, index) {
if (_this.colors && _this.colors[index]) {
Object.assign(elm, _this.colors[index]);
}
else {
Object.assign(elm, getColors(_this.chartType, index, elm.data.length), __assign({}, elm));
}
}));
};
/**
* @param {?} changes

@@ -362,44 +609,45 @@ * @return {?}

function (changes) {
if (this.initFlag) {
/** @type {?} */
var updateRequired_1 = UpdateType.Default;
/** @type {?} */
var wantUpdate = ( /**
* @param {?} x
* @return {?}
*/function (x) {
updateRequired_1 = x > updateRequired_1 ? x : updateRequired_1;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) {
if (changes.data) {
this.updateChartData(changes.data.currentValue);
}
else {
this.updateChartData(changes.datasets.currentValue);
}
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('labels')) {
/** @type {?} */
var updateRequired = UpdateType.Default;
/** @type {?} */
var wantUpdate = ( /**
* @param {?} x
* @return {?}
*/function (x) {
updateRequired = x > updateRequired ? x : updateRequired;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') && changes.data.currentValue) {
this.propagateDataToDatasets(changes.data.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) {
this.propagateDatasetsToData(changes.datasets.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('labels')) {
if (this.chart) {
this.chart.data.labels = changes.labels.currentValue;
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
if (this.chart) {
this.chart.config.options.legend.display = changes.legend.currentValue;
this.chart.generateLegend();
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch (( /** @type {?} */(updateRequired_1))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch (( /** @type {?} */(updateRequired))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
};

@@ -433,3 +681,5 @@ /**

function (duration, lazy) {
return this.chart.update(duration, lazy);
if (this.chart) {
return this.chart.update(duration, lazy);
}
};

@@ -471,10 +721,8 @@ /**

/**
* @param {?} ctx
* @return {?}
*/
BaseChartDirective.prototype.getChartBuilder = /**
* @param {?} ctx
BaseChartDirective.prototype.getChartConfiguration = /**
* @return {?}
*/
function (ctx /*, data:any[], options:any*/) {
function () {
var _this = this;

@@ -517,3 +765,3 @@ /** @type {?} */

data: {
labels: this.labels,
labels: this.labels || [],
datasets: datasets

@@ -524,2 +772,15 @@ },

};
return chartConfig;
};
/**
* @param {?} ctx
* @return {?}
*/
BaseChartDirective.prototype.getChartBuilder = /**
* @param {?} ctx
* @return {?}
*/
function (ctx /*, data:any[], options:any*/) {
/** @type {?} */
var chartConfig = this.getChartConfiguration();
return new chartJs.Chart(ctx, chartConfig);

@@ -581,17 +842,2 @@ };

* @private
* @param {?} v
* @return {?}
*/
BaseChartDirective.prototype.isChartDataSetsArray = /**
* @private
* @param {?} v
* @return {?}
*/
function (v) {
/** @type {?} */
var elm = v[0];
return (typeof (elm) === 'object') && 'data' in elm;
};
/**
* @private
* @param {?} label

@@ -631,6 +877,26 @@ * @return {?}

* @private
* @param {?} datasets
* @return {?}
*/
BaseChartDirective.prototype.propagateDatasetsToData = /**
* @private
* @param {?} datasets
* @return {?}
*/
function (datasets) {
this.data = this.datasets.map(( /**
* @param {?} r
* @return {?}
*/function (r) { return r.data; }));
if (this.chart) {
this.chart.data.datasets = datasets;
}
this.updateColors();
};
/**
* @private
* @param {?} newDataValues
* @return {?}
*/
BaseChartDirective.prototype.updateChartData = /**
BaseChartDirective.prototype.propagateDataToDatasets = /**
* @private

@@ -642,5 +908,5 @@ * @param {?} newDataValues

var _this = this;
if (this.isChartDataSetsArray(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach(( /**
if (this.isMultiDataSet(newDataValues)) {
if (this.datasets && newDataValues.length === this.datasets.length) {
this.datasets.forEach(( /**
* @param {?} dataset

@@ -650,19 +916,2 @@ * @param {?} i

*/function (dataset, i) {
dataset.data = newDataValues[i].data;
if (newDataValues[i].label) {
dataset.label = newDataValues[i].label;
}
}));
}
else {
this.chart.data.datasets = __spread(newDataValues);
}
}
else if (!this.isSingleDataSet(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach(( /**
* @param {?} dataset
* @param {?} i
* @return {?}
*/function (dataset, i) {
dataset.data = newDataValues[i];

@@ -672,3 +921,3 @@ }));

else {
this.chart.data.datasets = newDataValues.map(( /**
this.datasets = newDataValues.map(( /**
* @param {?} data

@@ -680,19 +929,20 @@ * @param {?} index

}));
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
}
else {
this.chart.data.datasets[0].data = newDataValues;
}
this.chart.data.datasets.forEach(( /**
* @param {?} elm
* @param {?} index
* @return {?}
*/function (elm, index) {
if (_this.colors && _this.colors[index]) {
Object.assign(elm, _this.colors[index]);
if (!this.datasets) {
this.datasets = [{ data: newDataValues }];
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
else {
Object.assign(elm, getColors(_this.chartType, index, elm.data.length));
this.datasets[0].data = newDataValues;
this.datasets.splice(1); // Remove all elements but the first
}
}));
}
this.updateColors();
};

@@ -704,3 +954,3 @@ /**

*/
BaseChartDirective.prototype.isSingleDataSet = /**
BaseChartDirective.prototype.isMultiDataSet = /**
* @private

@@ -711,3 +961,3 @@ * @param {?} data

function (data) {
return !Array.isArray(data[0]);
return Array.isArray(data[0]);
};

@@ -723,43 +973,14 @@ /**

function () {
var _this = this;
/** @type {?} */
var datasets = void 0;
// in case if datasets is not provided, but data is present
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) {
if (!this.isSingleDataSet(this.data)) {
datasets = this.data.map(( /**
* @param {?} data
* @param {?} index
* @return {?}
*/function (data, index) {
return { data: data, label: _this.joinLabel(_this.labels[index]) || "Label " + index };
}));
}
else {
datasets = [{ data: this.data, label: "Label 0" }];
}
if (!this.datasets && !this.data) {
throw new Error("ng-charts configuration error, data or datasets field are required to render chart " + this.chartType);
}
if (this.datasets && this.datasets.length ||
(datasets && datasets.length)) {
datasets = (this.datasets || datasets)
.map(( /**
* @param {?} elm
* @param {?} index
* @return {?}
*/function (elm, index) {
/** @type {?} */
var newElm = Object.assign({}, elm);
if (_this.colors && _this.colors.length) {
Object.assign(newElm, _this.colors[index]);
}
else {
Object.assign(newElm, getColors(_this.chartType, index, newElm.data.length));
}
return newElm;
}));
// If `datasets` is defined, use it over the `data` property.
if (this.datasets) {
this.propagateDatasetsToData(this.datasets);
return this.datasets;
}
if (!datasets) {
throw new Error("ng-charts configuration error,\n data or datasets field are required to render chart " + this.chartType);
if (this.data) {
this.propagateDataToDatasets(this.data);
return this.datasets;
}
return datasets;
};

@@ -783,3 +1004,5 @@ /**

}
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
if (this.ctx) {
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
}
};

@@ -786,0 +1009,0 @@ BaseChartDirective.decorators = [

@@ -1,2 +0,2 @@

!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("chart.js"),require("@angular/core"),require("rxjs"),require("lodash")):"function"==typeof define&&define.amd?define("ng2-charts",["exports","chart.js","@angular/core","rxjs","lodash"],e):e(t["ng2-charts"]={},t.chart_js,t.ng.core,t.rxjs,t._)}(this,function(t,i,r,e,s){"use strict";function o(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var a,n,o=r.call(t),i=[];try{for(;(void 0===e||0<e--)&&!(a=o.next()).done;)i.push(a.value)}catch(s){n={error:s}}finally{try{a&&!a.done&&(r=o["return"])&&r.call(o)}finally{if(n)throw n.error}}return i}var a=[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]];function c(t,e,r){if("pie"===t||"doughnut"===t)return u(d(r));if("polarArea"===t)return function a(t){return{backgroundColor:t.map(function(t){return h(t,.6)}),borderColor:t.map(function(t){return h(t,1)}),hoverBackgroundColor:t.map(function(t){return h(t,.8)}),hoverBorderColor:t.map(function(t){return h(t,1)})}}(d(r));if("line"===t||"radar"===t)return function n(t){return{backgroundColor:h(t,.4),borderColor:h(t,1),pointBackgroundColor:h(t,1),pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:h(t,.8)}}(p(e));if("bar"===t||"horizontalBar"===t)return function o(t){return{backgroundColor:h(t,.6),borderColor:h(t,1),hoverBackgroundColor:h(t,.8),hoverBorderColor:h(t,1)}}(p(e));if("bubble"===t)return u(d(r));if("scatter"===t)return u(d(r));throw new Error("getColors - Unsupported chart type "+t)}function h(t,e){return"rgba("+t.concat(e).join(",")+")"}function n(t,e){return Math.floor(Math.random()*(e-t+1))+t}function u(t){return{backgroundColor:t.map(function(t){return h(t,.6)}),borderColor:t.map(function(){return"#fff"}),pointBackgroundColor:t.map(function(t){return h(t,1)}),pointBorderColor:t.map(function(){return"#fff"}),pointHoverBackgroundColor:t.map(function(t){return h(t,1)}),pointHoverBorderColor:t.map(function(t){return h(t,1)})}}function l(){return[n(0,255),n(0,255),n(0,255)]}function p(t){return a[t]||l()}function d(t){for(var e=new Array(t),r=0;r<t;r++)e[r]=a[r]||l();return e}var f=function(){function t(){this.pColorschemesOptions={},this.colorschemesOptions=new e.BehaviorSubject({})}return t.prototype.setColorschemesOptions=function(t){this.pColorschemesOptions=t,this.colorschemesOptions.next(t)},t.prototype.getColorschemesOptions=function(){return this.pColorschemesOptions},t.decorators=[{type:r.Injectable,args:[{providedIn:"root"}]}],t.ctorParameters=function(){return[]},t.ngInjectableDef=r.defineInjectable({factory:function(){return new t},token:t,providedIn:"root"}),t}(),g={Default:0,Update:1,Refresh:2};g[g.Default]="Default",g[g.Update]="Update",g[g.Refresh]="Refresh";var y=function(){function t(t,e){this.element=t,this.themeService=e,this.options={},this.chartClick=new r.EventEmitter,this.chartHover=new r.EventEmitter,this.initFlag=!1,this.subs=[]}return t.registerPlugin=function(t){i.Chart.plugins.register(t)},t.unregisterPlugin=function(t){i.Chart.plugins.unregister(t)},t.prototype.ngOnInit=function(){var e=this;this.ctx=this.element.nativeElement.getContext("2d"),this.initFlag=!0,(this.data||this.datasets)&&this.refresh(),this.subs.push(this.themeService.colorschemesOptions.subscribe(function(t){return e.themeChanged(t)}))},t.prototype.themeChanged=function(t){this.refresh()},t.prototype.ngOnChanges=function(t){if(this.initFlag){var e=g.Default,r=function(t){e=e<t?t:e};switch((t.hasOwnProperty("data")||t.hasOwnProperty("datasets"))&&(t.data?this.updateChartData(t.data.currentValue):this.updateChartData(t.datasets.currentValue),r(g.Update)),t.hasOwnProperty("labels")&&(this.chart.data.labels=t.labels.currentValue,r(g.Update)),t.hasOwnProperty("legend")&&(this.chart.config.options.legend.display=t.legend.currentValue,this.chart.generateLegend(),r(g.Update)),t.hasOwnProperty("options")&&r(g.Refresh),e){case g.Update:this.update();break;case g.Refresh:case g.Default:this.refresh()}}},t.prototype.ngOnDestroy=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.subs.forEach(function(t){return t.unsubscribe()})},t.prototype.update=function(t,e){return this.chart.update(t,e)},t.prototype.hideDataset=function(t,e){this.chart.getDatasetMeta(t).hidden=e,this.chart.update()},t.prototype.isDatasetHidden=function(t){return this.chart.getDatasetMeta(t).hidden},t.prototype.toBase64Image=function(){return this.chart.toBase64Image()},t.prototype.getChartBuilder=function(t){var r=this,e=this.getDatasets(),a=Object.assign({},this.options);!1===this.legend&&(a.legend={display:!1}),a.hover=a.hover||{},a.hover.onHover||(a.hover.onHover=function(t,e){e&&!e.length||r.chartHover.emit({event:t,active:e})}),a.onClick||(a.onClick=function(t,e){r.chartClick.emit({event:t,active:e})});var n=this.smartMerge(a,this.themeService.getColorschemesOptions()),o={type:this.chartType,data:{labels:this.labels,datasets:e},plugins:this.plugins,options:n};return new i.Chart(t,o)},t.prototype.smartMerge=function(r,a,n){var o=this;if(void 0===n&&(n=0),0===n&&(r=s.cloneDeep(r)),Object.keys(a).forEach(function(e){if(Array.isArray(a[e])){var t=r[e];t&&t.forEach(function(t){o.smartMerge(t,a[e][0],n+1)})}else"object"==typeof a[e]?(e in r||(r[e]={}),o.smartMerge(r[e],a[e],n+1)):r[e]=a[e]}),0===n)return r},t.prototype.isChartDataSetsArray=function(t){var e=t[0];return"object"==typeof e&&"data"in e},t.prototype.isMultiLineLabel=function(t){return Array.isArray(t)},t.prototype.joinLabel=function(t){return t?this.isMultiLineLabel(t)?t.join(" "):t:null},t.prototype.updateChartData=function(r){var a=this;this.isChartDataSetsArray(r)?r.length===this.chart.data.datasets.length?this.chart.data.datasets.forEach(function(t,e){t.data=r[e].data,r[e].label&&(t.label=r[e].label)}):this.chart.data.datasets=function n(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(o(arguments[e]));return t}(r):this.isSingleDataSet(r)?this.chart.data.datasets[0].data=r:r.length===this.chart.data.datasets.length?this.chart.data.datasets.forEach(function(t,e){t.data=r[e]}):this.chart.data.datasets=r.map(function(t,e){return{data:t,label:a.joinLabel(a.labels[e])||"Label "+e}}),this.chart.data.datasets.forEach(function(t,e){a.colors&&a.colors[e]?Object.assign(t,a.colors[e]):Object.assign(t,c(a.chartType,e,t.data.length))})},t.prototype.isSingleDataSet=function(t){return!Array.isArray(t[0])},t.prototype.getDatasets=function(){var a=this,t=void 0;if((!this.datasets||!this.datasets.length&&this.data&&this.data.length)&&(t=this.isSingleDataSet(this.data)?[{data:this.data,label:"Label 0"}]:this.data.map(function(t,e){return{data:t,label:a.joinLabel(a.labels[e])||"Label "+e}})),(this.datasets&&this.datasets.length||t&&t.length)&&(t=(this.datasets||t).map(function(t,e){var r=Object.assign({},t);return a.colors&&a.colors.length?Object.assign(r,a.colors[e]):Object.assign(r,c(a.chartType,e,r.data.length)),r})),!t)throw new Error("ng-charts configuration error,\n data or datasets field are required to render chart "+this.chartType);return t},t.prototype.refresh=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.chart=this.getChartBuilder(this.ctx)},t.decorators=[{type:r.Directive,args:[{selector:"canvas[baseChart]",exportAs:"base-chart"}]}],t.ctorParameters=function(){return[{type:r.ElementRef},{type:f}]},t.propDecorators={data:[{type:r.Input}],datasets:[{type:r.Input}],labels:[{type:r.Input}],options:[{type:r.Input}],chartType:[{type:r.Input}],colors:[{type:r.Input}],legend:[{type:r.Input}],plugins:[{type:r.Input}],chartClick:[{type:r.Output}],chartHover:[{type:r.Output}]},t}(),b=function(){function t(){}return t.decorators=[{type:r.NgModule,args:[{declarations:[y],imports:[],exports:[y]}]}],t}();t.ChartsModule=b,t.BaseChartDirective=y,t.defaultColors=a,t.ThemeService=f,Object.defineProperty(t,"__esModule",{value:!0})});
!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("chart.js"),require("@angular/core"),require("rxjs"),require("lodash")):"function"==typeof define&&define.amd?define("ng2-charts",["exports","chart.js","@angular/core","rxjs","lodash"],r):r(t["ng2-charts"]={},t.chart_js,t.ng.core,t.rxjs,t._)}(this,function(t,e,o,r,n){"use strict";var a=function(){return(a=Object.assign||function(t){for(var r,e=1,o=arguments.length;e<o;e++)for(var a in r=arguments[e])Object.prototype.hasOwnProperty.call(r,a)&&(t[a]=r[a]);return t}).apply(this,arguments)};function s(t,r){var e="function"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var o,a,s=e.call(t),n=[];try{for(;(void 0===r||0<r--)&&!(o=s.next()).done;)n.push(o.value)}catch(i){a={error:i}}finally{try{o&&!o.done&&(e=s["return"])&&e.call(s)}finally{if(a)throw a.error}}return n}var i=[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]];function h(t,r,e){if("pie"===t||"doughnut"===t)return l(f(e));if("polarArea"===t)return function o(t){return{backgroundColor:t.map(function(t){return d(t,.6)}),borderColor:t.map(function(t){return d(t,1)}),hoverBackgroundColor:t.map(function(t){return d(t,.8)}),hoverBorderColor:t.map(function(t){return d(t,1)})}}(f(e));if("line"===t||"radar"===t)return function a(t){return{backgroundColor:d(t,.4),borderColor:d(t,1),pointBackgroundColor:d(t,1),pointBorderColor:"#fff",pointHoverBackgroundColor:"#fff",pointHoverBorderColor:d(t,.8)}}(p(r));if("bar"===t||"horizontalBar"===t)return function s(t){return{backgroundColor:d(t,.6),borderColor:d(t,1),hoverBackgroundColor:d(t,.8),hoverBorderColor:d(t,1)}}(p(r));if("bubble"===t)return l(f(e));if("scatter"===t)return l(f(e));throw new Error("getColors - Unsupported chart type "+t)}function d(t,r){return"rgba("+t.concat(r).join(",")+")"}function u(t,r){return Math.floor(Math.random()*(r-t+1))+t}function l(t){return{backgroundColor:t.map(function(t){return d(t,.6)}),borderColor:t.map(function(){return"#fff"}),pointBackgroundColor:t.map(function(t){return d(t,1)}),pointBorderColor:t.map(function(){return"#fff"}),pointHoverBackgroundColor:t.map(function(t){return d(t,1)}),pointHoverBorderColor:t.map(function(t){return d(t,1)})}}function c(){return[u(0,255),u(0,255),u(0,255)]}function p(t){return i[t]||c()}function f(t){for(var r=new Array(t),e=0;e<t;e++)r[e]=i[e]||c();return r}var g=function(){function t(){this.pColorschemesOptions={},this.colorschemesOptions=new r.BehaviorSubject({})}return t.prototype.setColorschemesOptions=function(t){this.pColorschemesOptions=t,this.colorschemesOptions.next(t)},t.prototype.getColorschemesOptions=function(){return this.pColorschemesOptions},t.decorators=[{type:o.Injectable,args:[{providedIn:"root"}]}],t.ctorParameters=function(){return[]},t.ngInjectableDef=o.defineInjectable({factory:function(){return new t},token:t,providedIn:"root"}),t}(),y={Default:0,Update:1,Refresh:2};y[y.Default]="Default",y[y.Update]="Update",y[y.Refresh]="Refresh";var b=function(){function t(t,r){this.element=t,this.themeService=r,this.options={},this.chartClick=new o.EventEmitter,this.chartHover=new o.EventEmitter,this.old={dataExists:!1,dataLength:0,datasetsExists:!1,datasetsLength:0,datasetsDataObjects:[],datasetsDataLengths:[],colorsExists:!1,colors:[],labelsExist:!1,labels:[]},this.subs=[]}return t.registerPlugin=function(t){e.Chart.plugins.register(t)},t.unregisterPlugin=function(t){e.Chart.plugins.unregister(t)},t.prototype.ngOnInit=function(){var r=this;this.ctx=this.element.nativeElement.getContext("2d"),this.refresh(),this.subs.push(this.themeService.colorschemesOptions.subscribe(function(t){return r.themeChanged(t)}))},t.prototype.themeChanged=function(t){this.refresh()},t.prototype.ngDoCheck=function(){var e=this;if(this.chart){var r=y.Default,t=function(t){r=r<t?t:r};switch(!!this.data!==this.old.dataExists&&(this.propagateDataToDatasets(this.data),this.old.dataExists=!!this.data,t(y.Update)),this.data&&this.data.length!==this.old.dataLength&&(this.old.dataLength=this.data&&this.data.length||0,t(y.Update)),!!this.datasets!==this.old.datasetsExists&&(this.old.datasetsExists=!!this.datasets,t(y.Update)),this.datasets&&this.datasets.length!==this.old.datasetsLength&&(this.old.datasetsLength=this.datasets&&this.datasets.length||0,t(y.Update)),this.datasets&&this.datasets.filter(function(t,r){return t.data!==e.old.datasetsDataObjects[r]}).length&&(this.old.datasetsDataObjects=this.datasets.map(function(t){return t.data}),t(y.Update)),this.datasets&&this.datasets.filter(function(t,r){return t.data.length!==e.old.datasetsDataLengths[r]}).length&&(this.old.datasetsDataLengths=this.datasets.map(function(t){return t.data.length}),t(y.Update)),!!this.colors!==this.old.colorsExists&&(this.old.colorsExists=!!this.colors,this.updateColors(),t(y.Update)),this.colors&&this.colors.filter(function(t,r){return!e.colorsEqual(t,e.old.colors[r])}).length&&(this.old.colors=this.colors.map(function(t){return e.copyColor(t)}),this.updateColors(),t(y.Update)),!!this.labels!==this.old.labelsExist&&(this.old.labelsExist=!!this.labels,t(y.Update)),this.labels&&this.labels.filter(function(t,r){return!e.labelsEqual(t,e.old.labels[r])}).length&&(this.old.labels=this.labels.map(function(t){return e.copyLabel(t)}),t(y.Update)),r){case y.Default:break;case y.Update:this.update();break;case y.Refresh:this.refresh()}}},t.prototype.copyLabel=function(t){return Array.isArray(t)?function e(){for(var t=[],r=0;r<arguments.length;r++)t=t.concat(s(arguments[r]));return t}(t):t},t.prototype.labelsEqual=function(t,e){return Array.isArray(t)===Array.isArray(e)&&(Array.isArray(t)||t===e)&&(!Array.isArray(t)||t.length===e.length)&&(!Array.isArray(t)||0===t.filter(function(t,r){return t!==e[r]}).length)},t.prototype.copyColor=function(t){return{backgroundColor:t.backgroundColor,borderWidth:t.borderWidth,borderColor:t.borderColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,pointBorderColor:t.pointBorderColor,pointBackgroundColor:t.pointBackgroundColor,pointBorderWidth:t.pointBorderWidth,pointRadius:t.pointRadius,pointHoverRadius:t.pointHoverRadius,pointHitRadius:t.pointHitRadius,pointHoverBackgroundColor:t.pointHoverBackgroundColor,pointHoverBorderColor:t.pointHoverBorderColor,pointHoverBorderWidth:t.pointHoverBorderWidth,pointStyle:t.pointStyle,hoverBackgroundColor:t.hoverBackgroundColor,hoverBorderColor:t.hoverBorderColor,hoverBorderWidth:t.hoverBorderWidth}},t.prototype.colorsEqual=function(t,r){return!t==!r&&(!t||t.backgroundColor===r.backgroundColor&&t.borderWidth===r.borderWidth&&t.borderColor===r.borderColor&&t.borderCapStyle===r.borderCapStyle&&t.borderDash===r.borderDash&&t.borderDashOffset===r.borderDashOffset&&t.borderJoinStyle===r.borderJoinStyle&&t.pointBorderColor===r.pointBorderColor&&t.pointBackgroundColor===r.pointBackgroundColor&&t.pointBorderWidth===r.pointBorderWidth&&t.pointRadius===r.pointRadius&&t.pointHoverRadius===r.pointHoverRadius&&t.pointHitRadius===r.pointHitRadius&&t.pointHoverBackgroundColor===r.pointHoverBackgroundColor&&t.pointHoverBorderColor===r.pointHoverBorderColor&&t.pointHoverBorderWidth===r.pointHoverBorderWidth&&t.pointStyle===r.pointStyle&&t.hoverBackgroundColor===r.hoverBackgroundColor&&t.hoverBorderColor===r.hoverBorderColor&&t.hoverBorderWidth===r.hoverBorderWidth)},t.prototype.updateColors=function(){var e=this;this.datasets.forEach(function(t,r){e.colors&&e.colors[r]?Object.assign(t,e.colors[r]):Object.assign(t,h(e.chartType,r,t.data.length),a({},t))})},t.prototype.ngOnChanges=function(t){var r=y.Default,e=function(t){r=r<t?t:r};switch(t.hasOwnProperty("data")&&t.data.currentValue&&(this.propagateDataToDatasets(t.data.currentValue),e(y.Update)),t.hasOwnProperty("datasets")&&t.datasets.currentValue&&(this.propagateDatasetsToData(t.datasets.currentValue),e(y.Update)),t.hasOwnProperty("labels")&&(this.chart&&(this.chart.data.labels=t.labels.currentValue),e(y.Update)),t.hasOwnProperty("legend")&&(this.chart&&(this.chart.config.options.legend.display=t.legend.currentValue,this.chart.generateLegend()),e(y.Update)),t.hasOwnProperty("options")&&e(y.Refresh),r){case y.Update:this.update();break;case y.Refresh:case y.Default:this.refresh()}},t.prototype.ngOnDestroy=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.subs.forEach(function(t){return t.unsubscribe()})},t.prototype.update=function(t,r){if(this.chart)return this.chart.update(t,r)},t.prototype.hideDataset=function(t,r){this.chart.getDatasetMeta(t).hidden=r,this.chart.update()},t.prototype.isDatasetHidden=function(t){return this.chart.getDatasetMeta(t).hidden},t.prototype.toBase64Image=function(){return this.chart.toBase64Image()},t.prototype.getChartConfiguration=function(){var e=this,t=this.getDatasets(),r=Object.assign({},this.options);!1===this.legend&&(r.legend={display:!1}),r.hover=r.hover||{},r.hover.onHover||(r.hover.onHover=function(t,r){r&&!r.length||e.chartHover.emit({event:t,active:r})}),r.onClick||(r.onClick=function(t,r){e.chartClick.emit({event:t,active:r})});var o=this.smartMerge(r,this.themeService.getColorschemesOptions());return{type:this.chartType,data:{labels:this.labels||[],datasets:t},plugins:this.plugins,options:o}},t.prototype.getChartBuilder=function(t){var r=this.getChartConfiguration();return new e.Chart(t,r)},t.prototype.smartMerge=function(e,o,a){var s=this;if(void 0===a&&(a=0),0===a&&(e=n.cloneDeep(e)),Object.keys(o).forEach(function(r){if(Array.isArray(o[r])){var t=e[r];t&&t.forEach(function(t){s.smartMerge(t,o[r][0],a+1)})}else"object"==typeof o[r]?(r in e||(e[r]={}),s.smartMerge(e[r],o[r],a+1)):e[r]=o[r]}),0===a)return e},t.prototype.isMultiLineLabel=function(t){return Array.isArray(t)},t.prototype.joinLabel=function(t){return t?this.isMultiLineLabel(t)?t.join(" "):t:null},t.prototype.propagateDatasetsToData=function(t){this.data=this.datasets.map(function(t){return t.data}),this.chart&&(this.chart.data.datasets=t),this.updateColors()},t.prototype.propagateDataToDatasets=function(e){var o=this;this.isMultiDataSet(e)?this.datasets&&e.length===this.datasets.length?this.datasets.forEach(function(t,r){t.data=e[r]}):(this.datasets=e.map(function(t,r){return{data:t,label:o.joinLabel(o.labels[r])||"Label "+r}}),this.chart&&(this.chart.data.datasets=this.datasets)):this.datasets?(this.datasets[0].data=e,this.datasets.splice(1)):(this.datasets=[{data:e}],this.chart&&(this.chart.data.datasets=this.datasets)),this.updateColors()},t.prototype.isMultiDataSet=function(t){return Array.isArray(t[0])},t.prototype.getDatasets=function(){if(!this.datasets&&!this.data)throw new Error("ng-charts configuration error, data or datasets field are required to render chart "+this.chartType);return this.datasets?(this.propagateDatasetsToData(this.datasets),this.datasets):this.data?(this.propagateDataToDatasets(this.data),this.datasets):void 0},t.prototype.refresh=function(){this.chart&&(this.chart.destroy(),this.chart=void 0),this.ctx&&(this.chart=this.getChartBuilder(this.ctx))},t.decorators=[{type:o.Directive,args:[{selector:"canvas[baseChart]",exportAs:"base-chart"}]}],t.ctorParameters=function(){return[{type:o.ElementRef},{type:g}]},t.propDecorators={data:[{type:o.Input}],datasets:[{type:o.Input}],labels:[{type:o.Input}],options:[{type:o.Input}],chartType:[{type:o.Input}],colors:[{type:o.Input}],legend:[{type:o.Input}],plugins:[{type:o.Input}],chartClick:[{type:o.Output}],chartHover:[{type:o.Output}]},t}(),C=function(){function t(){}return t.decorators=[{type:o.NgModule,args:[{declarations:[b],imports:[],exports:[b]}]}],t}();t.ChartsModule=C,t.BaseChartDirective=b,t.defaultColors=i,t.ThemeService=g,Object.defineProperty(t,"__esModule",{value:!0})});
//# sourceMappingURL=ng2-charts.umd.min.js.map

@@ -10,2 +10,28 @@ /**

import * as _ from 'lodash';
/**
* @record
*/
function OldState() { }
if (false) {
/** @type {?} */
OldState.prototype.dataExists;
/** @type {?} */
OldState.prototype.dataLength;
/** @type {?} */
OldState.prototype.datasetsExists;
/** @type {?} */
OldState.prototype.datasetsLength;
/** @type {?} */
OldState.prototype.datasetsDataObjects;
/** @type {?} */
OldState.prototype.datasetsDataLengths;
/** @type {?} */
OldState.prototype.colorsExists;
/** @type {?} */
OldState.prototype.colors;
/** @type {?} */
OldState.prototype.labelsExist;
/** @type {?} */
OldState.prototype.labels;
}
/** @enum {number} */

@@ -31,3 +57,14 @@ const UpdateType = {

this.chartHover = new EventEmitter();
this.initFlag = false;
this.old = {
dataExists: false,
dataLength: 0,
datasetsExists: false,
datasetsLength: 0,
datasetsDataObjects: [],
datasetsDataLengths: [],
colorsExists: false,
colors: [],
labelsExist: false,
labels: [],
};
this.subs = [];

@@ -55,6 +92,3 @@ }

this.ctx = this.element.nativeElement.getContext('2d');
this.initFlag = true;
if (this.data || this.datasets) {
this.refresh();
}
this.refresh();
this.subs.push(this.themeService.colorschemesOptions.subscribe((/**

@@ -75,49 +109,264 @@ * @param {?} r

/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (this.initFlag) {
/** @type {?} */
let updateRequired = UpdateType.Default;
/** @type {?} */
const wantUpdate = (/**
ngDoCheck() {
if (!this.chart) {
return;
}
/** @type {?} */
let updateRequired = UpdateType.Default;
/** @type {?} */
const wantUpdate = (/**
* @param {?} x
* @return {?}
*/
(x) => {
updateRequired = x > updateRequired ? x : updateRequired;
});
if (!!this.data !== this.old.dataExists) {
this.propagateDataToDatasets(this.data);
this.old.dataExists = !!this.data;
wantUpdate(UpdateType.Update);
}
if (this.data && this.data.length !== this.old.dataLength) {
this.old.dataLength = this.data && this.data.length || 0;
wantUpdate(UpdateType.Update);
}
if (!!this.datasets !== this.old.datasetsExists) {
this.old.datasetsExists = !!this.datasets;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.length !== this.old.datasetsLength) {
this.old.datasetsLength = this.datasets && this.datasets.length || 0;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => x.data !== this.old.datasetsDataObjects[i])).length) {
this.old.datasetsDataObjects = this.datasets.map((/**
* @param {?} x
* @return {?}
*/
(x) => {
updateRequired = x > updateRequired ? x : updateRequired;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) {
if (changes.data) {
this.updateChartData(changes.data.currentValue);
}
else {
this.updateChartData(changes.datasets.currentValue);
}
wantUpdate(UpdateType.Update);
x => x.data));
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => x.data.length !== this.old.datasetsDataLengths[i])).length) {
this.old.datasetsDataLengths = this.datasets.map((/**
* @param {?} x
* @return {?}
*/
x => x.data.length));
wantUpdate(UpdateType.Update);
}
if (!!this.colors !== this.old.colorsExists) {
this.old.colorsExists = !!this.colors;
this.updateColors();
wantUpdate(UpdateType.Update);
}
// This smells of inefficiency, might need to revisit this
if (this.colors && this.colors.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => !this.colorsEqual(x, this.old.colors[i]))).length) {
this.old.colors = this.colors.map((/**
* @param {?} x
* @return {?}
*/
x => this.copyColor(x)));
this.updateColors();
wantUpdate(UpdateType.Update);
}
if (!!this.labels !== this.old.labelsExist) {
this.old.labelsExist = !!this.labels;
wantUpdate(UpdateType.Update);
}
if (this.labels && this.labels.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => !this.labelsEqual(x, this.old.labels[i]))).length) {
this.old.labels = this.labels.map((/**
* @param {?} x
* @return {?}
*/
x => this.copyLabel(x)));
wantUpdate(UpdateType.Update);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Default:
break;
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
this.refresh();
break;
}
}
/**
* @param {?} a
* @return {?}
*/
copyLabel(a) {
if (Array.isArray(a)) {
return [...a];
}
return a;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
labelsEqual(a, b) {
return true
&& Array.isArray(a) === Array.isArray(b)
&& (Array.isArray(a) || a === b)
&& (!Array.isArray(a) || a.length === b.length)
&& (!Array.isArray(a) || a.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => x !== b[i])).length === 0);
}
/**
* @param {?} a
* @return {?}
*/
copyColor(a) {
/** @type {?} */
const rc = {
backgroundColor: a.backgroundColor,
borderWidth: a.borderWidth,
borderColor: a.borderColor,
borderCapStyle: a.borderCapStyle,
borderDash: a.borderDash,
borderDashOffset: a.borderDashOffset,
borderJoinStyle: a.borderJoinStyle,
pointBorderColor: a.pointBorderColor,
pointBackgroundColor: a.pointBackgroundColor,
pointBorderWidth: a.pointBorderWidth,
pointRadius: a.pointRadius,
pointHoverRadius: a.pointHoverRadius,
pointHitRadius: a.pointHitRadius,
pointHoverBackgroundColor: a.pointHoverBackgroundColor,
pointHoverBorderColor: a.pointHoverBorderColor,
pointHoverBorderWidth: a.pointHoverBorderWidth,
pointStyle: a.pointStyle,
hoverBackgroundColor: a.hoverBackgroundColor,
hoverBorderColor: a.hoverBorderColor,
hoverBorderWidth: a.hoverBorderWidth,
};
return rc;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
colorsEqual(a, b) {
if (!a !== !b) {
return false;
}
return !a || true
&& (a.backgroundColor === b.backgroundColor)
&& (a.borderWidth === b.borderWidth)
&& (a.borderColor === b.borderColor)
&& (a.borderCapStyle === b.borderCapStyle)
&& (a.borderDash === b.borderDash)
&& (a.borderDashOffset === b.borderDashOffset)
&& (a.borderJoinStyle === b.borderJoinStyle)
&& (a.pointBorderColor === b.pointBorderColor)
&& (a.pointBackgroundColor === b.pointBackgroundColor)
&& (a.pointBorderWidth === b.pointBorderWidth)
&& (a.pointRadius === b.pointRadius)
&& (a.pointHoverRadius === b.pointHoverRadius)
&& (a.pointHitRadius === b.pointHitRadius)
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor)
&& (a.pointHoverBorderColor === b.pointHoverBorderColor)
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth)
&& (a.pointStyle === b.pointStyle)
&& (a.hoverBackgroundColor === b.hoverBackgroundColor)
&& (a.hoverBorderColor === b.hoverBorderColor)
&& (a.hoverBorderWidth === b.hoverBorderWidth);
}
/**
* @return {?}
*/
updateColors() {
this.datasets.forEach((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
(elm, index) => {
if (this.colors && this.colors[index]) {
Object.assign(elm, this.colors[index]);
}
if (changes.hasOwnProperty('labels')) {
else {
Object.assign(elm, getColors(this.chartType, index, elm.data.length), Object.assign({}, elm));
}
}));
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
let updateRequired = UpdateType.Default;
/** @type {?} */
const wantUpdate = (/**
* @param {?} x
* @return {?}
*/
(x) => {
updateRequired = x > updateRequired ? x : updateRequired;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') && changes.data.currentValue) {
this.propagateDataToDatasets(changes.data.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) {
this.propagateDatasetsToData(changes.datasets.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('labels')) {
if (this.chart) {
this.chart.data.labels = changes.labels.currentValue;
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
if (this.chart) {
this.chart.config.options.legend.display = changes.legend.currentValue;
this.chart.generateLegend();
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
}

@@ -144,3 +393,5 @@ /**

update(duration, lazy) {
return this.chart.update(duration, lazy);
if (this.chart) {
return this.chart.update(duration, lazy);
}
}

@@ -170,6 +421,5 @@ /**

/**
* @param {?} ctx
* @return {?}
*/
getChartBuilder(ctx /*, data:any[], options:any*/) {
getChartConfiguration() {
/** @type {?} */

@@ -213,3 +463,3 @@ const datasets = this.getDatasets();

data: {
labels: this.labels,
labels: this.labels || [],
datasets

@@ -220,2 +470,11 @@ },

};
return chartConfig;
}
/**
* @param {?} ctx
* @return {?}
*/
getChartBuilder(ctx /*, data:any[], options:any*/) {
/** @type {?} */
const chartConfig = this.getChartConfiguration();
return new chartJs.Chart(ctx, chartConfig);

@@ -269,12 +528,2 @@ }

* @private
* @param {?} v
* @return {?}
*/
isChartDataSetsArray(v) {
/** @type {?} */
const elm = v[0];
return (typeof (elm) === 'object') && 'data' in elm;
}
/**
* @private
* @param {?} label

@@ -304,9 +553,25 @@ * @return {?}

* @private
* @param {?} datasets
* @return {?}
*/
propagateDatasetsToData(datasets) {
this.data = this.datasets.map((/**
* @param {?} r
* @return {?}
*/
r => r.data));
if (this.chart) {
this.chart.data.datasets = datasets;
}
this.updateColors();
}
/**
* @private
* @param {?} newDataValues
* @return {?}
*/
updateChartData(newDataValues) {
if (this.isChartDataSetsArray(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach((/**
propagateDataToDatasets(newDataValues) {
if (this.isMultiDataSet(newDataValues)) {
if (this.datasets && newDataValues.length === this.datasets.length) {
this.datasets.forEach((/**
* @param {?} dataset

@@ -317,20 +582,2 @@ * @param {?} i

(dataset, i) => {
dataset.data = newDataValues[i].data;
if (newDataValues[i].label) {
dataset.label = newDataValues[i].label;
}
}));
}
else {
this.chart.data.datasets = [...newDataValues];
}
}
else if (!this.isSingleDataSet(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach((/**
* @param {?} dataset
* @param {?} i
* @return {?}
*/
(dataset, i) => {
dataset.data = newDataValues[i];

@@ -340,3 +587,3 @@ }));

else {
this.chart.data.datasets = newDataValues.map((/**
this.datasets = newDataValues.map((/**
* @param {?} data

@@ -349,20 +596,20 @@ * @param {?} index

}));
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
}
else {
this.chart.data.datasets[0].data = newDataValues;
}
this.chart.data.datasets.forEach((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
(elm, index) => {
if (this.colors && this.colors[index]) {
Object.assign(elm, this.colors[index]);
if (!this.datasets) {
this.datasets = [{ data: newDataValues }];
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
else {
Object.assign(elm, getColors(this.chartType, index, elm.data.length));
this.datasets[0].data = newDataValues;
this.datasets.splice(1); // Remove all elements but the first
}
}));
}
this.updateColors();
}

@@ -374,4 +621,4 @@ /**

*/
isSingleDataSet(data) {
return !Array.isArray(data[0]);
isMultiDataSet(data) {
return Array.isArray(data[0]);
}

@@ -383,45 +630,14 @@ /**

getDatasets() {
/** @type {?} */
let datasets = void 0;
// in case if datasets is not provided, but data is present
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) {
if (!this.isSingleDataSet(this.data)) {
datasets = this.data.map((/**
* @param {?} data
* @param {?} index
* @return {?}
*/
(data, index) => {
return { data, label: this.joinLabel(this.labels[index]) || `Label ${index}` };
}));
}
else {
datasets = [{ data: this.data, label: `Label 0` }];
}
if (!this.datasets && !this.data) {
throw new Error(`ng-charts configuration error, data or datasets field are required to render chart ${this.chartType}`);
}
if (this.datasets && this.datasets.length ||
(datasets && datasets.length)) {
datasets = (this.datasets || datasets)
.map((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
(elm, index) => {
/** @type {?} */
const newElm = Object.assign({}, elm);
if (this.colors && this.colors.length) {
Object.assign(newElm, this.colors[index]);
}
else {
Object.assign(newElm, getColors(this.chartType, index, newElm.data.length));
}
return newElm;
}));
// If `datasets` is defined, use it over the `data` property.
if (this.datasets) {
this.propagateDatasetsToData(this.datasets);
return this.datasets;
}
if (!datasets) {
throw new Error(`ng-charts configuration error,
data or datasets field are required to render chart ${this.chartType}`);
if (this.data) {
this.propagateDataToDatasets(this.data);
return this.datasets;
}
return datasets;
}

@@ -441,3 +657,5 @@ /**

}
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
if (this.ctx) {
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
}
}

@@ -498,3 +716,3 @@ }

*/
BaseChartDirective.prototype.initFlag;
BaseChartDirective.prototype.old;
/**

@@ -516,2 +734,2 @@ * @type {?}

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jaGFydC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZzItY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2Jhc2UtY2hhcnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUlULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7O0lBWTFCLFVBQU87SUFDUCxTQUFNO0lBQ04sVUFBTzs7Ozs7QUFRVCxNQUFNLE9BQU8sa0JBQWtCOzs7OztJQThCN0IsWUFDVSxPQUFtQixFQUNuQixZQUEwQjtRQUQxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBNUJwQixZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQU1sQyxlQUFVLEdBQXdELElBQUksWUFBWSxFQUFFLENBQUM7UUFDckYsZUFBVSxHQUFzRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSTVGLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsU0FBSSxHQUFtQixFQUFFLENBQUM7SUFnQjlCLENBQUM7Ozs7OztJQVhFLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBaUQ7UUFDNUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7O0lBRU0sTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQWlEO1FBQzlFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FB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QyxHQUFHLENBQUEsd0JBQXdCLENBQUMsQ0FBQztJQUN0RSxDQUFDOzs7WUF4U0YsU0FBUyxTQUFDOztnQkFFVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUUsWUFBWTthQUN2Qjs7OztZQTdCQyxVQUFVO1lBTUgsWUFBWTs7O21CQXlCbEIsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7c0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkFDTCxLQUFLO3lCQUVMLE1BQU07eUJBQ04sTUFBTTs7OztJQVZQLGtDQUEyQzs7SUFDM0Msc0NBQWtEOztJQUNsRCxvQ0FBZ0M7O0lBQ2hDLHFDQUFtRDs7SUFDbkQsdUNBQTZDOztJQUM3QyxvQ0FBZ0M7O0lBQ2hDLG9DQUFnQzs7SUFDaEMscUNBQXFFOztJQUVyRSx3Q0FBc0c7O0lBQ3RHLHdDQUFvRzs7SUFFcEcsaUNBQW1COztJQUNuQixtQ0FBb0I7Ozs7O0lBQ3BCLHNDQUF5Qjs7Ozs7SUFFekIsa0NBQWtDOzs7OztJQWNoQyxxQ0FBMkI7Ozs7O0lBQzNCLDBDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgRWxlbWVudFJlZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBjaGFydEpzIGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgZ2V0Q29sb3JzIH0gZnJvbSAnLi9nZXQtY29sb3JzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuL2NvbG9yJztcclxuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi90aGVtZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmV4cG9ydCB0eXBlIFNpbmdsZURhdGFTZXQgPSAobnVtYmVyW10gfCBjaGFydEpzLkNoYXJ0UG9pbnRbXSk7XHJcbmV4cG9ydCB0eXBlIE11bHRpRGF0YVNldCA9IChudW1iZXJbXSB8IGNoYXJ0SnMuQ2hhcnRQb2ludFtdKVtdO1xyXG5leHBvcnQgdHlwZSBTaW5nbGVPck11bHRpRGF0YVNldCA9IFNpbmdsZURhdGFTZXQgfCBNdWx0aURhdGFTZXQ7XHJcblxyXG5leHBvcnQgdHlwZSBQbHVnaW5TZXJ2aWNlR2xvYmFsUmVnaXN0cmF0aW9uQW5kT3B0aW9ucyA9IGNoYXJ0SnMuUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbiAmIGNoYXJ0SnMuUGx1Z2luU2VydmljZVJlZ2lzdHJhdGlvbk9wdGlvbnM7XHJcbmV4cG9ydCB0eXBlIFNpbmdsZUxpbmVMYWJlbCA9IHN0cmluZztcclxuZXhwb3J0IHR5cGUgTXVsdGlMaW5lTGFiZWwgPSBzdHJpbmdbXTtcclxuZXhwb3J0IHR5cGUgTGFiZWwgPSBTaW5nbGVMaW5lTGFiZWwgfCBNdWx0aUxpbmVMYWJlbDtcclxuXHJcbmVudW0gVXBkYXRlVHlwZSB7XHJcbiAgRGVmYXVsdCxcclxuICBVcGRhdGUsXHJcbiAgUmVmcmVzaFxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdjYW52YXNbYmFzZUNoYXJ0XScsXHJcbiAgZXhwb3J0QXM6ICdiYXNlLWNoYXJ0J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFzZUNoYXJ0RGlyZWN0aXZlIGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBASW5wdXQoKSBwdWJsaWMgZGF0YTogU2luZ2xlT3JNdWx0aURhdGFTZXQ7XHJcbiAgQElucHV0KCkgcHVibGljIGRhdGFzZXRzOiBjaGFydEpzLkNoYXJ0RGF0YVNldHNbXTtcclxuICBASW5wdXQoKSBwdWJsaWMgbGFiZWxzOiBMYWJlbFtdO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBjaGFydEpzLkNoYXJ0T3B0aW9ucyA9IHt9O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjaGFydFR5cGU6IGNoYXJ0SnMuQ2hhcnRUeXBlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xvcnM6IENvbG9yW107XHJcbiAgQElucHV0KCkgcHVibGljIGxlZ2VuZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBwdWJsaWMgcGx1Z2luczogUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbkFuZE9wdGlvbnNbXTtcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFydENsaWNrOiBFdmVudEVtaXR0ZXI8eyBldmVudD86IE1vdXNlRXZlbnQsIGFjdGl2ZT86IHt9W10gfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFydEhvdmVyOiBFdmVudEVtaXR0ZXI8eyBldmVudDogTW91c2VFdmVudCwgYWN0aXZlOiB7fVtdIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBwdWJsaWMgY3R4OiBzdHJpbmc7XHJcbiAgcHVibGljIGNoYXJ0OiBDaGFydDtcclxuICBwcml2YXRlIGluaXRGbGFnID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgYSBwbHVnaW4uXHJcbiAgICovXHJcbiAgcHVibGljIHN0YXRpYyByZWdpc3RlclBsdWdpbihwbHVnaW46IFBsdWdpblNlcnZpY2VHbG9iYWxSZWdpc3RyYXRpb25BbmRPcHRpb25zKSB7XHJcbiAgICBjaGFydEpzLkNoYXJ0LnBsdWdpbnMucmVnaXN0ZXIocGx1Z2luKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgdW5yZWdpc3RlclBsdWdpbihwbHVnaW46IFBsdWdpblNlcnZpY2VHbG9iYWxSZWdpc3RyYXRpb25BbmRPcHRpb25zKSB7XHJcbiAgICBjaGFydEpzLkNoYXJ0LnBsdWdpbnMudW5yZWdpc3RlcihwbHVnaW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmN0eCA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldENvbnRleHQoJzJkJyk7XHJcbiAgICB0aGlzLmluaXRGbGFnID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLmRhdGEgfHwgdGhpcy5kYXRhc2V0cykge1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3Vicy5wdXNoKHRoaXMudGhlbWVTZXJ2aWNlLmNvbG9yc2NoZW1lc09wdGlvbnMuc3Vic2NyaWJlKHIgPT4gdGhpcy50aGVtZUNoYW5nZWQocikpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGhlbWVDaGFuZ2VkKG9wdGlvbnM6IHt9KSB7XHJcbiAgICB0aGlzLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy5pbml0RmxhZykge1xyXG4gICAgICBsZXQgdXBkYXRlUmVxdWlyZWQgPSBVcGRhdGVUeXBlLkRlZmF1bHQ7XHJcbiAgICAgIGNvbnN0IHdhbnRVcGRhdGUgPSAoeDogVXBkYXRlVHlwZSkgPT4ge1xyXG4gICAgICAgIHVwZGF0ZVJlcXVpcmVkID0geCA+IHVwZGF0ZVJlcXVpcmVkID8geCA6IHVwZGF0ZVJlcXVpcmVkO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNoYW5nZXMgYXJlIGluIHRoZSBkYXRhIG9yIGRhdGFzZXRzIG9yIGxhYmVscyBvciBsZWdlbmRcclxuXHJcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdkYXRhJykgfHwgY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnZGF0YXNldHMnKSkge1xyXG4gICAgICAgIGlmIChjaGFuZ2VzLmRhdGEpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ2hhcnREYXRhKGNoYW5nZXMuZGF0YS5jdXJyZW50VmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNoYXJ0RGF0YShjaGFuZ2VzLmRhdGFzZXRzLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xhYmVscycpKSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmxhYmVscyA9IGNoYW5nZXMubGFiZWxzLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdsZWdlbmQnKSkge1xyXG4gICAgICAgIHRoaXMuY2hhcnQuY29uZmlnLm9wdGlvbnMubGVnZW5kLmRpc3BsYXkgPSBjaGFuZ2VzLmxlZ2VuZC5jdXJyZW50VmFsdWU7XHJcbiAgICAgICAgdGhpcy5jaGFydC5nZW5lcmF0ZUxlZ2VuZCgpO1xyXG5cclxuICAgICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKSkge1xyXG4gICAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5SZWZyZXNoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3dpdGNoICh1cGRhdGVSZXF1aXJlZCBhcyBVcGRhdGVUeXBlKSB7XHJcbiAgICAgICAgY2FzZSBVcGRhdGVUeXBlLlVwZGF0ZTpcclxuICAgICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFVwZGF0ZVR5cGUuUmVmcmVzaDpcclxuICAgICAgICBjYXNlIFVwZGF0ZVR5cGUuRGVmYXVsdDpcclxuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnQuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmNoYXJ0ID0gdm9pZCAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdWJzLmZvckVhY2goeCA9PiB4LnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZShkdXJhdGlvbj86IGFueSwgbGF6eT86IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnQudXBkYXRlKGR1cmF0aW9uLCBsYXp5KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlRGF0YXNldChpbmRleDogbnVtYmVyLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaW5kZXgpLmhpZGRlbiA9IGhpZGRlbjtcclxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEYXRhc2V0SGlkZGVuKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KS5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9CYXNlNjRJbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnQudG9CYXNlNjRJbWFnZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYXJ0QnVpbGRlcihjdHg6IHN0cmluZy8qLCBkYXRhOmFueVtdLCBvcHRpb25zOmFueSovKTogQ2hhcnQge1xyXG4gICAgY29uc3QgZGF0YXNldHMgPSB0aGlzLmdldERhdGFzZXRzKCk7XHJcblxyXG4gICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3B0aW9ucyk7XHJcbiAgICBpZiAodGhpcy5sZWdlbmQgPT09IGZhbHNlKSB7XHJcbiAgICAgIG9wdGlvbnMubGVnZW5kID0geyBkaXNwbGF5OiBmYWxzZSB9O1xyXG4gICAgfVxyXG4gICAgLy8gaG9vayBmb3Igb25Ib3ZlciBhbmQgb25DbGljayBldmVudHNcclxuICAgIG9wdGlvbnMuaG92ZXIgPSBvcHRpb25zLmhvdmVyIHx8IHt9O1xyXG4gICAgaWYgKCFvcHRpb25zLmhvdmVyLm9uSG92ZXIpIHtcclxuICAgICAgb3B0aW9ucy5ob3Zlci5vbkhvdmVyID0gKGV2ZW50OiBNb3VzZUV2ZW50LCBhY3RpdmU6IHt9W10pID0+IHtcclxuICAgICAgICBpZiAoYWN0aXZlICYmICFhY3RpdmUubGVuZ3RoKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2hhcnRIb3Zlci5lbWl0KHsgZXZlbnQsIGFjdGl2ZSB9KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW9wdGlvbnMub25DbGljaykge1xyXG4gICAgICBvcHRpb25zLm9uQ2xpY2sgPSAoZXZlbnQ/OiBNb3VzZUV2ZW50LCBhY3RpdmU/OiB7fVtdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGFydENsaWNrLmVtaXQoeyBldmVudCwgYWN0aXZlIH0pO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB0aGlzLnNtYXJ0TWVyZ2Uob3B0aW9ucywgdGhpcy50aGVtZVNlcnZpY2UuZ2V0Q29sb3JzY2hlbWVzT3B0aW9ucygpKTtcclxuXHJcbiAgICBjb25zdCBjaGFydENvbmZpZzogY2hhcnRKcy5DaGFydENvbmZpZ3VyYXRpb24gPSB7XHJcbiAgICAgIHR5cGU6IHRoaXMuY2hhcnRUeXBlLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgbGFiZWxzOiB0aGlzLmxhYmVscyxcclxuICAgICAgICBkYXRhc2V0c1xyXG4gICAgICB9LFxyXG4gICAgICBwbHVnaW5zOiB0aGlzLnBsdWdpbnMsXHJcbiAgICAgIG9wdGlvbnM6IG1lcmdlZE9wdGlvbnMsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgY2hhcnRKcy5DaGFydChjdHgsIGNoYXJ0Q29uZmlnKTtcclxuICB9XHJcblxyXG4gIHNtYXJ0TWVyZ2Uob3B0aW9uczogYW55LCBvdmVycmlkZXM6IGFueSwgbGV2ZWw6IG51bWJlciA9IDApOiBhbnkge1xyXG4gICAgaWYgKGxldmVsID09PSAwKSB7XHJcbiAgICAgIG9wdGlvbnMgPSBfLmNsb25lRGVlcChvcHRpb25zKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGtleXNUb1VwZGF0ZSA9IE9iamVjdC5rZXlzKG92ZXJyaWRlcyk7XHJcbiAgICBrZXlzVG9VcGRhdGUuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvdmVycmlkZXNba2V5XSkpIHtcclxuICAgICAgICBjb25zdCBhcnJheUVsZW1lbnRzID0gb3B0aW9uc1trZXldO1xyXG4gICAgICAgIGlmIChhcnJheUVsZW1lbnRzKSB7XHJcbiAgICAgICAgICBhcnJheUVsZW1lbnRzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc21hcnRNZXJnZShyLCBvdmVycmlkZXNba2V5XVswXSwgbGV2ZWwgKyAxKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKG92ZXJyaWRlc1trZXldKSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICBpZiAoIShrZXkgaW4gb3B0aW9ucykpIHtcclxuICAgICAgICAgIG9wdGlvbnNba2V5XSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNtYXJ0TWVyZ2Uob3B0aW9uc1trZXldLCBvdmVycmlkZXNba2V5XSwgbGV2ZWwgKyAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHRpb25zW2tleV0gPSBvdmVycmlkZXNba2V5XTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAobGV2ZWwgPT09IDApIHtcclxuICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzQ2hhcnREYXRhU2V0c0FycmF5KHY6IFNpbmdsZU9yTXVsdGlEYXRhU2V0IHwgY2hhcnRKcy5DaGFydERhdGFTZXRzW10pOiB2IGlzIGNoYXJ0SnMuQ2hhcnREYXRhU2V0c1tdIHtcclxuICAgIGNvbnN0IGVsbSA9IHZbMF07XHJcbiAgICByZXR1cm4gKHR5cGVvZiAoZWxtKSA9PT0gJ29iamVjdCcpICYmICdkYXRhJyBpbiBlbG07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTXVsdGlMaW5lTGFiZWwobGFiZWw6IExhYmVsKTogbGFiZWwgaXMgTXVsdGlMaW5lTGFiZWwge1xyXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobGFiZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBqb2luTGFiZWwobGFiZWw6IExhYmVsKTogc3RyaW5nIHtcclxuICAgIGlmICghbGFiZWwpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pc011bHRpTGluZUxhYmVsKGxhYmVsKSkge1xyXG4gICAgICByZXR1cm4gbGFiZWwuam9pbignICcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVDaGFydERhdGEobmV3RGF0YVZhbHVlczogU2luZ2xlT3JNdWx0aURhdGFTZXQgfCBjaGFydEpzLkNoYXJ0RGF0YVNldHNbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNDaGFydERhdGFTZXRzQXJyYXkobmV3RGF0YVZhbHVlcykpIHtcclxuICAgICAgaWYgKG5ld0RhdGFWYWx1ZXMubGVuZ3RoID09PSB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzLmZvckVhY2goKGRhdGFzZXQsIGk6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgZGF0YXNldC5kYXRhID0gbmV3RGF0YVZhbHVlc1tpXS5kYXRhO1xyXG4gICAgICAgICAgaWYgKG5ld0RhdGFWYWx1ZXNbaV0ubGFiZWwpIHtcclxuICAgICAgICAgICAgZGF0YXNldC5sYWJlbCA9IG5ld0RhdGFWYWx1ZXNbaV0ubGFiZWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID0gWy4uLm5ld0RhdGFWYWx1ZXNdO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2luZ2xlRGF0YVNldChuZXdEYXRhVmFsdWVzKSkge1xyXG4gICAgICBpZiAobmV3RGF0YVZhbHVlcy5sZW5ndGggPT09IHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZGF0YXNldCwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBkYXRhc2V0LmRhdGEgPSBuZXdEYXRhVmFsdWVzW2ldO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9IG5ld0RhdGFWYWx1ZXMubWFwKChkYXRhOiBudW1iZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHsgZGF0YSwgbGFiZWw6IHRoaXMuam9pbkxhYmVsKHRoaXMubGFiZWxzW2luZGV4XSkgfHwgYExhYmVsICR7aW5kZXh9YCB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbMF0uZGF0YSA9IG5ld0RhdGFWYWx1ZXM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaCgoZWxtLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5jb2xvcnMgJiYgdGhpcy5jb2xvcnNbaW5kZXhdKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbG0sIHRoaXMuY29sb3JzW2luZGV4XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihlbG0sIGdldENvbG9ycyh0aGlzLmNoYXJ0VHlwZSwgaW5kZXgsIGVsbS5kYXRhLmxlbmd0aCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNTaW5nbGVEYXRhU2V0KGRhdGE6IFNpbmdsZU9yTXVsdGlEYXRhU2V0KTogZGF0YSBpcyBTaW5nbGVEYXRhU2V0IHtcclxuICAgIHJldHVybiAhQXJyYXkuaXNBcnJheShkYXRhWzBdKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RGF0YXNldHMoKSB7XHJcbiAgICBsZXQgZGF0YXNldHM6IGNoYXJ0SnMuQ2hhcnREYXRhU2V0c1tdID0gdm9pZCAwO1xyXG4gICAgLy8gaW4gY2FzZSBpZiBkYXRhc2V0cyBpcyBub3QgcHJvdmlkZWQsIGJ1dCBkYXRhIGlzIHByZXNlbnRcclxuICAgIGlmICghdGhpcy5kYXRhc2V0cyB8fCAhdGhpcy5kYXRhc2V0cy5sZW5ndGggJiYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGEubGVuZ3RoKSkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNTaW5nbGVEYXRhU2V0KHRoaXMuZGF0YSkpIHtcclxuICAgICAgICBkYXRhc2V0cyA9IHRoaXMuZGF0YS5tYXAoKGRhdGE6IG51bWJlcltdLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4geyBkYXRhLCBsYWJlbDogdGhpcy5qb2luTGFiZWwodGhpcy5sYWJlbHNbaW5kZXhdKSB8fCBgTGFiZWwgJHtpbmRleH1gIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YXNldHMgPSBbeyBkYXRhOiB0aGlzLmRhdGEsIGxhYmVsOiBgTGFiZWwgMGAgfV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhc2V0cyAmJiB0aGlzLmRhdGFzZXRzLmxlbmd0aCB8fFxyXG4gICAgICAoZGF0YXNldHMgJiYgZGF0YXNldHMubGVuZ3RoKSkge1xyXG4gICAgICBkYXRhc2V0cyA9ICh0aGlzLmRhdGFzZXRzIHx8IGRhdGFzZXRzKVxyXG4gICAgICAgIC5tYXAoKGVsbTogY2hhcnRKcy5DaGFydERhdGFTZXRzLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBuZXdFbG06IGNoYXJ0SnMuQ2hhcnREYXRhU2V0cyA9IE9iamVjdC5hc3NpZ24oe30sIGVsbSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb2xvcnMgJiYgdGhpcy5jb2xvcnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxtLCB0aGlzLmNvbG9yc1tpbmRleF0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihuZXdFbG0sIGdldENvbG9ycyh0aGlzLmNoYXJ0VHlwZSwgaW5kZXgsIG5ld0VsbS5kYXRhLmxlbmd0aCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG5ld0VsbTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWRhdGFzZXRzKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbmctY2hhcnRzIGNvbmZpZ3VyYXRpb24gZXJyb3IsXHJcbiAgICAgIGRhdGEgb3IgZGF0YXNldHMgZmllbGQgYXJlIHJlcXVpcmVkIHRvIHJlbmRlciBjaGFydCAke3RoaXMuY2hhcnRUeXBlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBkYXRhc2V0cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaCgpIHtcclxuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlc3BvbnNpdmUpIHtcclxuICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlZnJlc2goKSwgNTApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHRvZG86IHJlbW92ZSB0aGlzIGxpbmUsIGl0IGlzIHByb2R1Y2luZyBmbGlja2VyaW5nXHJcbiAgICBpZiAodGhpcy5jaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5jaGFydCA9IHZvaWQgMDtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhcnQgPSB0aGlzLmdldENoYXJ0QnVpbGRlcih0aGlzLmN0eC8qLCBkYXRhLCB0aGlzLm9wdGlvbnMqLyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jaGFydC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZzItY2hhcnRzLyIsInNvdXJjZXMiOlsibGliL2Jhc2UtY2hhcnQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUlULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsR0FHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7OztBQVc1Qix1QkFXQzs7O0lBVkMsOEJBQW9COztJQUNwQiw4QkFBbUI7O0lBQ25CLGtDQUF3Qjs7SUFDeEIsa0NBQXVCOztJQUN2Qix1Q0FBMkI7O0lBQzNCLHVDQUE4Qjs7SUFDOUIsZ0NBQXNCOztJQUN0QiwwQkFBZ0I7O0lBQ2hCLCtCQUFxQjs7SUFDckIsMEJBQWdCOzs7O0lBSWhCLFVBQU87SUFDUCxTQUFNO0lBQ04sVUFBTzs7Ozs7QUFRVCxNQUFNLE9BQU8sa0JBQWtCOzs7OztJQTBDN0IsWUFDVSxPQUFtQixFQUNuQixZQUEwQjtRQUQxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBeENwQixZQUFPLEdBQXlCLEVBQUUsQ0FBQztRQU1sQyxlQUFVLEdBQXdELElBQUksWUFBWSxFQUFFLENBQUM7UUFDckYsZUFBVSxHQUFzRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBSzVGLFFBQUcsR0FBYTtZQUN0QixVQUFVLEVBQUUsS0FBSztZQUNqQixVQUFVLEVBQUUsQ0FBQztZQUNiLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLG1CQUFtQixF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VSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07Ozs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDdEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUMsQ0FBQztZQUU5RCxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQy9CO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTs7Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDN0csSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUM7WUFFckUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFdEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRXBCLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0I7UUFFRCwwREFBMEQ7UUFDMUQsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTs7Ozs7UUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sRUFBRTtZQUNoRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUUxRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFcEIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUU7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFckMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMvQjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07Ozs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDaEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFB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QUMsR0FBRyxDQUFBLHdCQUF3QixDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDOzs7WUFsZEYsU0FBUyxTQUFDOztnQkFFVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUUsWUFBWTthQUN2Qjs7OztZQTNDQyxVQUFVO1lBT0gsWUFBWTs7O21CQXNDbEIsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7c0JBQ0wsS0FBSzt3QkFDTCxLQUFLO3FCQUNMLEtBQUs7cUJBQ0wsS0FBSztzQkFDTCxLQUFLO3lCQUVMLE1BQU07eUJBQ04sTUFBTTs7OztJQVZQLGtDQUEyQzs7SUFDM0Msc0NBQWtEOztJQUNsRCxvQ0FBZ0M7O0lBQ2hDLHFDQUFtRDs7SUFDbkQsdUNBQTZDOztJQUM3QyxvQ0FBZ0M7O0lBQ2hDLG9DQUFnQzs7SUFDaEMscUNBQXFFOztJQUVyRSx3Q0FBc0c7O0lBQ3RHLHdDQUFvRzs7SUFFcEcsaUNBQW1COztJQUNuQixtQ0FBb0I7Ozs7O0lBRXBCLGlDQVdFOzs7OztJQUVGLGtDQUFrQzs7Ozs7SUFjaEMscUNBQTJCOzs7OztJQUMzQiwwQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBEb0NoZWNrLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBjaGFydEpzIGZyb20gJ2NoYXJ0LmpzJztcclxuaW1wb3J0IHsgZ2V0Q29sb3JzIH0gZnJvbSAnLi9nZXQtY29sb3JzJztcclxuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuL2NvbG9yJztcclxuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnLi90aGVtZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuXHJcbmV4cG9ydCB0eXBlIFNpbmdsZURhdGFTZXQgPSAobnVtYmVyW10gfCBjaGFydEpzLkNoYXJ0UG9pbnRbXSk7XHJcbmV4cG9ydCB0eXBlIE11bHRpRGF0YVNldCA9IChudW1iZXJbXSB8IGNoYXJ0SnMuQ2hhcnRQb2ludFtdKVtdO1xyXG5leHBvcnQgdHlwZSBTaW5nbGVPck11bHRpRGF0YVNldCA9IFNpbmdsZURhdGFTZXQgfCBNdWx0aURhdGFTZXQ7XHJcblxyXG5leHBvcnQgdHlwZSBQbHVnaW5TZXJ2aWNlR2xvYmFsUmVnaXN0cmF0aW9uQW5kT3B0aW9ucyA9IGNoYXJ0SnMuUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbiAmIGNoYXJ0SnMuUGx1Z2luU2VydmljZVJlZ2lzdHJhdGlvbk9wdGlvbnM7XHJcbmV4cG9ydCB0eXBlIFNpbmdsZUxpbmVMYWJlbCA9IHN0cmluZztcclxuZXhwb3J0IHR5cGUgTXVsdGlMaW5lTGFiZWwgPSBzdHJpbmdbXTtcclxuZXhwb3J0IHR5cGUgTGFiZWwgPSBTaW5nbGVMaW5lTGFiZWwgfCBNdWx0aUxpbmVMYWJlbDtcclxuXHJcbmludGVyZmFjZSBPbGRTdGF0ZSB7XHJcbiAgZGF0YUV4aXN0czogYm9vbGVhbjtcclxuICBkYXRhTGVuZ3RoOiBudW1iZXI7XHJcbiAgZGF0YXNldHNFeGlzdHM6IGJvb2xlYW47XHJcbiAgZGF0YXNldHNMZW5ndGg6IG51bWJlcjtcclxuICBkYXRhc2V0c0RhdGFPYmplY3RzOiBhbnlbXTtcclxuICBkYXRhc2V0c0RhdGFMZW5ndGhzOiBudW1iZXJbXTtcclxuICBjb2xvcnNFeGlzdHM6IGJvb2xlYW47XHJcbiAgY29sb3JzOiBDb2xvcltdO1xyXG4gIGxhYmVsc0V4aXN0OiBib29sZWFuO1xyXG4gIGxhYmVsczogTGFiZWxbXTtcclxufVxyXG5cclxuZW51bSBVcGRhdGVUeXBlIHtcclxuICBEZWZhdWx0LFxyXG4gIFVwZGF0ZSxcclxuICBSZWZyZXNoXHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ2NhbnZhc1tiYXNlQ2hhcnRdJyxcclxuICBleHBvcnRBczogJ2Jhc2UtY2hhcnQnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlQ2hhcnREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3ksIERvQ2hlY2sge1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBkYXRhOiBTaW5nbGVPck11bHRpRGF0YVNldDtcclxuICBASW5wdXQoKSBwdWJsaWMgZGF0YXNldHM6IGNoYXJ0SnMuQ2hhcnREYXRhU2V0c1tdO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBsYWJlbHM6IExhYmVsW107XHJcbiAgQElucHV0KCkgcHVibGljIG9wdGlvbnM6IGNoYXJ0SnMuQ2hhcnRPcHRpb25zID0ge307XHJcbiAgQElucHV0KCkgcHVibGljIGNoYXJ0VHlwZTogY2hhcnRKcy5DaGFydFR5cGU7XHJcbiAgQElucHV0KCkgcHVibGljIGNvbG9yczogQ29sb3JbXTtcclxuICBASW5wdXQoKSBwdWJsaWMgbGVnZW5kOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBwbHVnaW5zOiBQbHVnaW5TZXJ2aWNlR2xvYmFsUmVnaXN0cmF0aW9uQW5kT3B0aW9uc1tdO1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIGNoYXJ0Q2xpY2s6IEV2ZW50RW1pdHRlcjx7IGV2ZW50PzogTW91c2VFdmVudCwgYWN0aXZlPzoge31bXSB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgcHVibGljIGNoYXJ0SG92ZXI6IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBNb3VzZUV2ZW50LCBhY3RpdmU6IHt9W10gfT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHB1YmxpYyBjdHg6IHN0cmluZztcclxuICBwdWJsaWMgY2hhcnQ6IENoYXJ0O1xyXG5cclxuICBwcml2YXRlIG9sZDogT2xkU3RhdGUgPSB7XHJcbiAgICBkYXRhRXhpc3RzOiBmYWxzZSxcclxuICAgIGRhdGFMZW5ndGg6IDAsXHJcbiAgICBkYXRhc2V0c0V4aXN0czogZmFsc2UsXHJcbiAgICBkYXRhc2V0c0xlbmd0aDogMCxcclxuICAgIGRhdGFzZXRzRGF0YU9iamVjdHM6IFtdLFxyXG4gICAgZGF0YXNldHNEYXRhTGVuZ3RoczogW10sXHJcbiAgICBjb2xvcnNFeGlzdHM6IGZhbHNlLFxyXG4gICAgY29sb3JzOiBbXSxcclxuICAgIGxhYmVsc0V4aXN0OiBmYWxzZSxcclxuICAgIGxhYmVsczogW10sXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhIHBsdWdpbi5cclxuICAgKi9cclxuICBwdWJsaWMgc3RhdGljIHJlZ2lzdGVyUGx1Z2luKHBsdWdpbjogUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbkFuZE9wdGlvbnMpIHtcclxuICAgIGNoYXJ0SnMuQ2hhcnQucGx1Z2lucy5yZWdpc3RlcihwbHVnaW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyB1bnJlZ2lzdGVyUGx1Z2luKHBsdWdpbjogUGx1Z2luU2VydmljZUdsb2JhbFJlZ2lzdHJhdGlvbkFuZE9wdGlvbnMpIHtcclxuICAgIGNoYXJ0SnMuQ2hhcnQucGx1Z2lucy51bnJlZ2lzdGVyKHBsdWdpbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlLFxyXG4gICkgeyB9XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY3R4ID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgdGhpcy5zdWJzLnB1c2godGhpcy50aGVtZVNlcnZpY2UuY29sb3JzY2hlbWVzT3B0aW9ucy5zdWJzY3JpYmUociA9PiB0aGlzLnRoZW1lQ2hhbmdlZChyKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0aGVtZUNoYW5nZWQob3B0aW9uczoge30pIHtcclxuICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCB1cGRhdGVSZXF1aXJlZCA9IFVwZGF0ZVR5cGUuRGVmYXVsdDtcclxuICAgIGNvbnN0IHdhbnRVcGRhdGUgPSAoeDogVXBkYXRlVHlwZSkgPT4ge1xyXG4gICAgICB1cGRhdGVSZXF1aXJlZCA9IHggPiB1cGRhdGVSZXF1aXJlZCA/IHggOiB1cGRhdGVSZXF1aXJlZDtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCEhdGhpcy5kYXRhICE9PSB0aGlzLm9sZC5kYXRhRXhpc3RzKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlRGF0YVRvRGF0YXNldHModGhpcy5kYXRhKTtcclxuXHJcbiAgICAgIHRoaXMub2xkLmRhdGFFeGlzdHMgPSAhIXRoaXMuZGF0YTtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLmxlbmd0aCAhPT0gdGhpcy5vbGQuZGF0YUxlbmd0aCkge1xyXG4gICAgICB0aGlzLm9sZC5kYXRhTGVuZ3RoID0gdGhpcy5kYXRhICYmIHRoaXMuZGF0YS5sZW5ndGggfHwgMDtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghIXRoaXMuZGF0YXNldHMgIT09IHRoaXMub2xkLmRhdGFzZXRzRXhpc3RzKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzRXhpc3RzID0gISF0aGlzLmRhdGFzZXRzO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YXNldHMgJiYgdGhpcy5kYXRhc2V0cy5sZW5ndGggIT09IHRoaXMub2xkLmRhdGFzZXRzTGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzTGVuZ3RoID0gdGhpcy5kYXRhc2V0cyAmJiB0aGlzLmRhdGFzZXRzLmxlbmd0aCB8fCAwO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YXNldHMgJiYgdGhpcy5kYXRhc2V0cy5maWx0ZXIoKHgsIGkpID0+IHguZGF0YSAhPT0gdGhpcy5vbGQuZGF0YXNldHNEYXRhT2JqZWN0c1tpXSkubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzRGF0YU9iamVjdHMgPSB0aGlzLmRhdGFzZXRzLm1hcCh4ID0+IHguZGF0YSk7XHJcblxyXG4gICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRhc2V0cyAmJiB0aGlzLmRhdGFzZXRzLmZpbHRlcigoeCwgaSkgPT4geC5kYXRhLmxlbmd0aCAhPT0gdGhpcy5vbGQuZGF0YXNldHNEYXRhTGVuZ3Roc1tpXSkubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMub2xkLmRhdGFzZXRzRGF0YUxlbmd0aHMgPSB0aGlzLmRhdGFzZXRzLm1hcCh4ID0+IHguZGF0YS5sZW5ndGgpO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhdGhpcy5jb2xvcnMgIT09IHRoaXMub2xkLmNvbG9yc0V4aXN0cykge1xyXG4gICAgICB0aGlzLm9sZC5jb2xvcnNFeGlzdHMgPSAhIXRoaXMuY29sb3JzO1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVDb2xvcnMoKTtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoaXMgc21lbGxzIG9mIGluZWZmaWNpZW5jeSwgbWlnaHQgbmVlZCB0byByZXZpc2l0IHRoaXNcclxuICAgIGlmICh0aGlzLmNvbG9ycyAmJiB0aGlzLmNvbG9ycy5maWx0ZXIoKHgsIGkpID0+ICF0aGlzLmNvbG9yc0VxdWFsKHgsIHRoaXMub2xkLmNvbG9yc1tpXSkpLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLm9sZC5jb2xvcnMgPSB0aGlzLmNvbG9ycy5tYXAoeCA9PiB0aGlzLmNvcHlDb2xvcih4KSk7XHJcblxyXG4gICAgICB0aGlzLnVwZGF0ZUNvbG9ycygpO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCEhdGhpcy5sYWJlbHMgIT09IHRoaXMub2xkLmxhYmVsc0V4aXN0KSB7XHJcbiAgICAgIHRoaXMub2xkLmxhYmVsc0V4aXN0ID0gISF0aGlzLmxhYmVscztcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmxhYmVscyAmJiB0aGlzLmxhYmVscy5maWx0ZXIoKHgsIGkpID0+ICF0aGlzLmxhYmVsc0VxdWFsKHgsIHRoaXMub2xkLmxhYmVsc1tpXSkpLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLm9sZC5sYWJlbHMgPSB0aGlzLmxhYmVscy5tYXAoeCA9PiB0aGlzLmNvcHlMYWJlbCh4KSk7XHJcblxyXG4gICAgICB3YW50VXBkYXRlKFVwZGF0ZVR5cGUuVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHVwZGF0ZVJlcXVpcmVkIGFzIFVwZGF0ZVR5cGUpIHtcclxuICAgICAgY2FzZSBVcGRhdGVUeXBlLkRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgVXBkYXRlVHlwZS5VcGRhdGU6XHJcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBVcGRhdGVUeXBlLlJlZnJlc2g6XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb3B5TGFiZWwoYTogTGFiZWwpOiBMYWJlbCB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xyXG4gICAgICByZXR1cm4gWy4uLmFdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbiAgfVxyXG5cclxuICBsYWJlbHNFcXVhbChhOiBMYWJlbCwgYjogTGFiZWwpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgICAgICYmIEFycmF5LmlzQXJyYXkoYSkgPT09IEFycmF5LmlzQXJyYXkoYilcclxuICAgICAgJiYgKEFycmF5LmlzQXJyYXkoYSkgfHwgYSA9PT0gYilcclxuICAgICAgJiYgKCFBcnJheS5pc0FycmF5KGEpIHx8IGEubGVuZ3RoID09PSBiLmxlbmd0aClcclxuICAgICAgJiYgKCFBcnJheS5pc0FycmF5KGEpIHx8IGEuZmlsdGVyKCh4LCBpKSA9PiB4ICE9PSBiW2ldKS5sZW5ndGggPT09IDApXHJcbiAgICAgIDtcclxuICB9XHJcblxyXG4gIGNvcHlDb2xvcihhOiBDb2xvcik6IENvbG9yIHtcclxuICAgIGNvbnN0IHJjOiBDb2xvciA9IHtcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBhLmJhY2tncm91bmRDb2xvcixcclxuICAgICAgYm9yZGVyV2lkdGg6IGEuYm9yZGVyV2lkdGgsXHJcbiAgICAgIGJvcmRlckNvbG9yOiBhLmJvcmRlckNvbG9yLFxyXG4gICAgICBib3JkZXJDYXBTdHlsZTogYS5ib3JkZXJDYXBTdHlsZSxcclxuICAgICAgYm9yZGVyRGFzaDogYS5ib3JkZXJEYXNoLFxyXG4gICAgICBib3JkZXJEYXNoT2Zmc2V0OiBhLmJvcmRlckRhc2hPZmZzZXQsXHJcbiAgICAgIGJvcmRlckpvaW5TdHlsZTogYS5ib3JkZXJKb2luU3R5bGUsXHJcbiAgICAgIHBvaW50Qm9yZGVyQ29sb3I6IGEucG9pbnRCb3JkZXJDb2xvcixcclxuICAgICAgcG9pbnRCYWNrZ3JvdW5kQ29sb3I6IGEucG9pbnRCYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgIHBvaW50Qm9yZGVyV2lkdGg6IGEucG9pbnRCb3JkZXJXaWR0aCxcclxuICAgICAgcG9pbnRSYWRpdXM6IGEucG9pbnRSYWRpdXMsXHJcbiAgICAgIHBvaW50SG92ZXJSYWRpdXM6IGEucG9pbnRIb3ZlclJhZGl1cyxcclxuICAgICAgcG9pbnRIaXRSYWRpdXM6IGEucG9pbnRIaXRSYWRpdXMsXHJcbiAgICAgIHBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3I6IGEucG9pbnRIb3ZlckJhY2tncm91bmRDb2xvcixcclxuICAgICAgcG9pbnRIb3ZlckJvcmRlckNvbG9yOiBhLnBvaW50SG92ZXJCb3JkZXJDb2xvcixcclxuICAgICAgcG9pbnRIb3ZlckJvcmRlcldpZHRoOiBhLnBvaW50SG92ZXJCb3JkZXJXaWR0aCxcclxuICAgICAgcG9pbnRTdHlsZTogYS5wb2ludFN0eWxlLFxyXG4gICAgICBob3ZlckJhY2tncm91bmRDb2xvcjogYS5ob3ZlckJhY2tncm91bmRDb2xvcixcclxuICAgICAgaG92ZXJCb3JkZXJDb2xvcjogYS5ob3ZlckJvcmRlckNvbG9yLFxyXG4gICAgICBob3ZlckJvcmRlcldpZHRoOiBhLmhvdmVyQm9yZGVyV2lkdGgsXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiByYztcclxuICB9XHJcblxyXG4gIGNvbG9yc0VxdWFsKGE6IENvbG9yLCBiOiBDb2xvcikge1xyXG4gICAgaWYgKCFhICE9PSAhYikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIWEgfHwgdHJ1ZVxyXG4gICAgICAmJiAoYS5iYWNrZ3JvdW5kQ29sb3IgPT09IGIuYmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAmJiAoYS5ib3JkZXJXaWR0aCA9PT0gYi5ib3JkZXJXaWR0aClcclxuICAgICAgJiYgKGEuYm9yZGVyQ29sb3IgPT09IGIuYm9yZGVyQ29sb3IpXHJcbiAgICAgICYmIChhLmJvcmRlckNhcFN0eWxlID09PSBiLmJvcmRlckNhcFN0eWxlKVxyXG4gICAgICAmJiAoYS5ib3JkZXJEYXNoID09PSBiLmJvcmRlckRhc2gpXHJcbiAgICAgICYmIChhLmJvcmRlckRhc2hPZmZzZXQgPT09IGIuYm9yZGVyRGFzaE9mZnNldClcclxuICAgICAgJiYgKGEuYm9yZGVySm9pblN0eWxlID09PSBiLmJvcmRlckpvaW5TdHlsZSlcclxuICAgICAgJiYgKGEucG9pbnRCb3JkZXJDb2xvciA9PT0gYi5wb2ludEJvcmRlckNvbG9yKVxyXG4gICAgICAmJiAoYS5wb2ludEJhY2tncm91bmRDb2xvciA9PT0gYi5wb2ludEJhY2tncm91bmRDb2xvcilcclxuICAgICAgJiYgKGEucG9pbnRCb3JkZXJXaWR0aCA9PT0gYi5wb2ludEJvcmRlcldpZHRoKVxyXG4gICAgICAmJiAoYS5wb2ludFJhZGl1cyA9PT0gYi5wb2ludFJhZGl1cylcclxuICAgICAgJiYgKGEucG9pbnRIb3ZlclJhZGl1cyA9PT0gYi5wb2ludEhvdmVyUmFkaXVzKVxyXG4gICAgICAmJiAoYS5wb2ludEhpdFJhZGl1cyA9PT0gYi5wb2ludEhpdFJhZGl1cylcclxuICAgICAgJiYgKGEucG9pbnRIb3ZlckJhY2tncm91bmRDb2xvciA9PT0gYi5wb2ludEhvdmVyQmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAmJiAoYS5wb2ludEhvdmVyQm9yZGVyQ29sb3IgPT09IGIucG9pbnRIb3ZlckJvcmRlckNvbG9yKVxyXG4gICAgICAmJiAoYS5wb2ludEhvdmVyQm9yZGVyV2lkdGggPT09IGIucG9pbnRIb3ZlckJvcmRlcldpZHRoKVxyXG4gICAgICAmJiAoYS5wb2ludFN0eWxlID09PSBiLnBvaW50U3R5bGUpXHJcbiAgICAgICYmIChhLmhvdmVyQmFja2dyb3VuZENvbG9yID09PSBiLmhvdmVyQmFja2dyb3VuZENvbG9yKVxyXG4gICAgICAmJiAoYS5ob3ZlckJvcmRlckNvbG9yID09PSBiLmhvdmVyQm9yZGVyQ29sb3IpXHJcbiAgICAgICYmIChhLmhvdmVyQm9yZGVyV2lkdGggPT09IGIuaG92ZXJCb3JkZXJXaWR0aClcclxuICAgICAgO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ29sb3JzKCkge1xyXG4gICAgdGhpcy5kYXRhc2V0cy5mb3JFYWNoKChlbG0sIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmNvbG9ycyAmJiB0aGlzLmNvbG9yc1tpbmRleF0pIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGVsbSwgdGhpcy5jb2xvcnNbaW5kZXhdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGVsbSwgZ2V0Q29sb3JzKHRoaXMuY2hhcnRUeXBlLCBpbmRleCwgZWxtLmRhdGEubGVuZ3RoKSwgeyAuLi5lbG0gfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGxldCB1cGRhdGVSZXF1aXJlZCA9IFVwZGF0ZVR5cGUuRGVmYXVsdDtcclxuICAgIGNvbnN0IHdhbnRVcGRhdGUgPSAoeDogVXBkYXRlVHlwZSkgPT4ge1xyXG4gICAgICB1cGRhdGVSZXF1aXJlZCA9IHggPiB1cGRhdGVSZXF1aXJlZCA/IHggOiB1cGRhdGVSZXF1aXJlZDtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNoYW5nZXMgYXJlIGluIHRoZSBkYXRhIG9yIGRhdGFzZXRzIG9yIGxhYmVscyBvciBsZWdlbmRcclxuXHJcbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnZGF0YScpICYmIGNoYW5nZXMuZGF0YS5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgdGhpcy5wcm9wYWdhdGVEYXRhVG9EYXRhc2V0cyhjaGFuZ2VzLmRhdGEuY3VycmVudFZhbHVlKTtcclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdkYXRhc2V0cycpICYmIGNoYW5nZXMuZGF0YXNldHMuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlRGF0YXNldHNUb0RhdGEoY2hhbmdlcy5kYXRhc2V0cy5jdXJyZW50VmFsdWUpO1xyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xhYmVscycpKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5kYXRhLmxhYmVscyA9IGNoYW5nZXMubGFiZWxzLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlVwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ2xlZ2VuZCcpKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgICAgdGhpcy5jaGFydC5jb25maWcub3B0aW9ucy5sZWdlbmQuZGlzcGxheSA9IGNoYW5nZXMubGVnZW5kLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgICB0aGlzLmNoYXJ0LmdlbmVyYXRlTGVnZW5kKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHdhbnRVcGRhdGUoVXBkYXRlVHlwZS5VcGRhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdvcHRpb25zJykpIHtcclxuICAgICAgd2FudFVwZGF0ZShVcGRhdGVUeXBlLlJlZnJlc2gpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodXBkYXRlUmVxdWlyZWQgYXMgVXBkYXRlVHlwZSkge1xyXG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuVXBkYXRlOlxyXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgVXBkYXRlVHlwZS5SZWZyZXNoOlxyXG4gICAgICBjYXNlIFVwZGF0ZVR5cGUuRGVmYXVsdDpcclxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnQuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLmNoYXJ0ID0gdm9pZCAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdWJzLmZvckVhY2goeCA9PiB4LnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZShkdXJhdGlvbj86IGFueSwgbGF6eT86IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhcnQudXBkYXRlKGR1cmF0aW9uLCBsYXp5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoaWRlRGF0YXNldChpbmRleDogbnVtYmVyLCBoaWRkZW46IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEoaW5kZXgpLmhpZGRlbiA9IGhpZGRlbjtcclxuICAgIHRoaXMuY2hhcnQudXBkYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNEYXRhc2V0SGlkZGVuKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KS5oaWRkZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9CYXNlNjRJbWFnZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhcnQudG9CYXNlNjRJbWFnZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYXJ0Q29uZmlndXJhdGlvbigpOiBjaGFydEpzLkNoYXJ0Q29uZmlndXJhdGlvbiB7XHJcbiAgICBjb25zdCBkYXRhc2V0cyA9IHRoaXMuZ2V0RGF0YXNldHMoKTtcclxuXHJcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcclxuICAgIGlmICh0aGlzLmxlZ2VuZCA9PT0gZmFsc2UpIHtcclxuICAgICAgb3B0aW9ucy5sZWdlbmQgPSB7IGRpc3BsYXk6IGZhbHNlIH07XHJcbiAgICB9XHJcbiAgICAvLyBob29rIGZvciBvbkhvdmVyIGFuZCBvbkNsaWNrIGV2ZW50c1xyXG4gICAgb3B0aW9ucy5ob3ZlciA9IG9wdGlvbnMuaG92ZXIgfHwge307XHJcbiAgICBpZiAoIW9wdGlvbnMuaG92ZXIub25Ib3Zlcikge1xyXG4gICAgICBvcHRpb25zLmhvdmVyLm9uSG92ZXIgPSAoZXZlbnQ6IE1vdXNlRXZlbnQsIGFjdGl2ZToge31bXSkgPT4ge1xyXG4gICAgICAgIGlmIChhY3RpdmUgJiYgIWFjdGl2ZS5sZW5ndGgpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jaGFydEhvdmVyLmVtaXQoeyBldmVudCwgYWN0aXZlIH0pO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghb3B0aW9ucy5vbkNsaWNrKSB7XHJcbiAgICAgIG9wdGlvbnMub25DbGljayA9IChldmVudD86IE1vdXNlRXZlbnQsIGFjdGl2ZT86IHt9W10pID0+IHtcclxuICAgICAgICB0aGlzLmNoYXJ0Q2xpY2suZW1pdCh7IGV2ZW50LCBhY3RpdmUgfSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHRoaXMuc21hcnRNZXJnZShvcHRpb25zLCB0aGlzLnRoZW1lU2VydmljZS5nZXRDb2xvcnNjaGVtZXNPcHRpb25zKCkpO1xyXG5cclxuICAgIGNvbnN0IGNoYXJ0Q29uZmlnOiBjaGFydEpzLkNoYXJ0Q29uZmlndXJhdGlvbiA9IHtcclxuICAgICAgdHlwZTogdGhpcy5jaGFydFR5cGUsXHJcbiAgICAgIGRhdGE6IHtcclxuICAgICAgICBsYWJlbHM6IHRoaXMubGFiZWxzIHx8IFtdLFxyXG4gICAgICAgIGRhdGFzZXRzXHJcbiAgICAgIH0sXHJcbiAgICAgIHBsdWdpbnM6IHRoaXMucGx1Z2lucyxcclxuICAgICAgb3B0aW9uczogbWVyZ2VkT3B0aW9ucyxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGNoYXJ0Q29uZmlnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoYXJ0QnVpbGRlcihjdHg6IHN0cmluZy8qLCBkYXRhOmFueVtdLCBvcHRpb25zOmFueSovKTogQ2hhcnQge1xyXG4gICAgY29uc3QgY2hhcnRDb25maWcgPSB0aGlzLmdldENoYXJ0Q29uZmlndXJhdGlvbigpO1xyXG4gICAgcmV0dXJuIG5ldyBjaGFydEpzLkNoYXJ0KGN0eCwgY2hhcnRDb25maWcpO1xyXG4gIH1cclxuXHJcbiAgc21hcnRNZXJnZShvcHRpb25zOiBhbnksIG92ZXJyaWRlczogYW55LCBsZXZlbDogbnVtYmVyID0gMCk6IGFueSB7XHJcbiAgICBpZiAobGV2ZWwgPT09IDApIHtcclxuICAgICAgb3B0aW9ucyA9IF8uY2xvbmVEZWVwKG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5c1RvVXBkYXRlID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKTtcclxuICAgIGtleXNUb1VwZGF0ZS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG92ZXJyaWRlc1trZXldKSkge1xyXG4gICAgICAgIGNvbnN0IGFycmF5RWxlbWVudHMgPSBvcHRpb25zW2tleV07XHJcbiAgICAgICAgaWYgKGFycmF5RWxlbWVudHMpIHtcclxuICAgICAgICAgIGFycmF5RWxlbWVudHMuZm9yRWFjaChyID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zbWFydE1lcmdlKHIsIG92ZXJyaWRlc1trZXldWzBdLCBsZXZlbCArIDEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiAob3ZlcnJpZGVzW2tleV0pID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIGlmICghKGtleSBpbiBvcHRpb25zKSkge1xyXG4gICAgICAgICAgb3B0aW9uc1trZXldID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc21hcnRNZXJnZShvcHRpb25zW2tleV0sIG92ZXJyaWRlc1trZXldLCBsZXZlbCArIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG92ZXJyaWRlc1trZXldO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChsZXZlbCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNNdWx0aUxpbmVMYWJlbChsYWJlbDogTGFiZWwpOiBsYWJlbCBpcyBNdWx0aUxpbmVMYWJlbCB7XHJcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShsYWJlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGpvaW5MYWJlbChsYWJlbDogTGFiZWwpOiBzdHJpbmcge1xyXG4gICAgaWYgKCFsYWJlbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzTXVsdGlMaW5lTGFiZWwobGFiZWwpKSB7XHJcbiAgICAgIHJldHVybiBsYWJlbC5qb2luKCcgJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbGFiZWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByb3BhZ2F0ZURhdGFzZXRzVG9EYXRhKGRhdGFzZXRzOiBjaGFydEpzLkNoYXJ0RGF0YVNldHNbXSkge1xyXG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhc2V0cy5tYXAociA9PiByLmRhdGEpO1xyXG4gICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzID0gZGF0YXNldHM7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUNvbG9ycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwcm9wYWdhdGVEYXRhVG9EYXRhc2V0cyhuZXdEYXRhVmFsdWVzOiBTaW5nbGVPck11bHRpRGF0YVNldCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNNdWx0aURhdGFTZXQobmV3RGF0YVZhbHVlcykpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YXNldHMgJiYgbmV3RGF0YVZhbHVlcy5sZW5ndGggPT09IHRoaXMuZGF0YXNldHMubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cy5mb3JFYWNoKChkYXRhc2V0LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGRhdGFzZXQuZGF0YSA9IG5ld0RhdGFWYWx1ZXNbaV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9IG5ld0RhdGFWYWx1ZXMubWFwKChkYXRhOiBudW1iZXJbXSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHsgZGF0YSwgbGFiZWw6IHRoaXMuam9pbkxhYmVsKHRoaXMubGFiZWxzW2luZGV4XSkgfHwgYExhYmVsICR7aW5kZXh9YCB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLmNoYXJ0KSB7XHJcbiAgICAgICAgICB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHMgPSB0aGlzLmRhdGFzZXRzO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCF0aGlzLmRhdGFzZXRzKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cyA9IFt7IGRhdGE6IG5ld0RhdGFWYWx1ZXMgfV07XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhcnQpIHtcclxuICAgICAgICAgIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0cyA9IHRoaXMuZGF0YXNldHM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGF0YXNldHNbMF0uZGF0YSA9IG5ld0RhdGFWYWx1ZXM7XHJcbiAgICAgICAgdGhpcy5kYXRhc2V0cy5zcGxpY2UoMSk7IC8vIFJlbW92ZSBhbGwgZWxlbWVudHMgYnV0IHRoZSBmaXJzdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUNvbG9ycygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc011bHRpRGF0YVNldChkYXRhOiBTaW5nbGVPck11bHRpRGF0YVNldCk6IGRhdGEgaXMgTXVsdGlEYXRhU2V0IHtcclxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGFbMF0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXREYXRhc2V0cygpIHtcclxuICAgIGlmICghdGhpcy5kYXRhc2V0cyAmJiAhdGhpcy5kYXRhKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbmctY2hhcnRzIGNvbmZpZ3VyYXRpb24gZXJyb3IsIGRhdGEgb3IgZGF0YXNldHMgZmllbGQgYXJlIHJlcXVpcmVkIHRvIHJlbmRlciBjaGFydCAke3RoaXMuY2hhcnRUeXBlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIGBkYXRhc2V0c2AgaXMgZGVmaW5lZCwgdXNlIGl0IG92ZXIgdGhlIGBkYXRhYCBwcm9wZXJ0eS5cclxuICAgIGlmICh0aGlzLmRhdGFzZXRzKSB7XHJcbiAgICAgIHRoaXMucHJvcGFnYXRlRGF0YXNldHNUb0RhdGEodGhpcy5kYXRhc2V0cyk7XHJcbiAgICAgIHJldHVybiB0aGlzLmRhdGFzZXRzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgdGhpcy5wcm9wYWdhdGVEYXRhVG9EYXRhc2V0cyh0aGlzLmRhdGEpO1xyXG4gICAgICByZXR1cm4gdGhpcy5kYXRhc2V0cztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaCgpIHtcclxuICAgIC8vIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnJlc3BvbnNpdmUpIHtcclxuICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlZnJlc2goKSwgNTApO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIHRvZG86IHJlbW92ZSB0aGlzIGxpbmUsIGl0IGlzIHByb2R1Y2luZyBmbGlja2VyaW5nXHJcbiAgICBpZiAodGhpcy5jaGFydCkge1xyXG4gICAgICB0aGlzLmNoYXJ0LmRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5jaGFydCA9IHZvaWQgMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmN0eCkge1xyXG4gICAgICB0aGlzLmNoYXJ0ID0gdGhpcy5nZXRDaGFydEJ1aWxkZXIodGhpcy5jdHgvKiwgZGF0YSwgdGhpcy5vcHRpb25zKi8pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=

@@ -249,3 +249,14 @@ import { Chart } from 'chart.js';

this.chartHover = new EventEmitter();
this.initFlag = false;
this.old = {
dataExists: false,
dataLength: 0,
datasetsExists: false,
datasetsLength: 0,
datasetsDataObjects: [],
datasetsDataLengths: [],
colorsExists: false,
colors: [],
labelsExist: false,
labels: [],
};
this.subs = [];

@@ -273,6 +284,3 @@ }

this.ctx = this.element.nativeElement.getContext('2d');
this.initFlag = true;
if (this.data || this.datasets) {
this.refresh();
}
this.refresh();
this.subs.push(this.themeService.colorschemesOptions.subscribe((/**

@@ -293,49 +301,262 @@ * @param {?} r

/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (this.initFlag) {
/** @type {?} */
let updateRequired = UpdateType.Default;
/** @type {?} */
const wantUpdate = (/**
ngDoCheck() {
if (!this.chart) {
return;
}
/** @type {?} */
let updateRequired = UpdateType.Default;
/** @type {?} */
const wantUpdate = (/**
* @param {?} x
* @return {?}
*/
(x) => {
updateRequired = x > updateRequired ? x : updateRequired;
});
if (!!this.data !== this.old.dataExists) {
this.propagateDataToDatasets(this.data);
this.old.dataExists = !!this.data;
wantUpdate(UpdateType.Update);
}
if (this.data && this.data.length !== this.old.dataLength) {
this.old.dataLength = this.data && this.data.length || 0;
wantUpdate(UpdateType.Update);
}
if (!!this.datasets !== this.old.datasetsExists) {
this.old.datasetsExists = !!this.datasets;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.length !== this.old.datasetsLength) {
this.old.datasetsLength = this.datasets && this.datasets.length || 0;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => x.data !== this.old.datasetsDataObjects[i])).length) {
this.old.datasetsDataObjects = this.datasets.map((/**
* @param {?} x
* @return {?}
*/
(x) => {
updateRequired = x > updateRequired ? x : updateRequired;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) {
if (changes.data) {
this.updateChartData(changes.data.currentValue);
}
else {
this.updateChartData(changes.datasets.currentValue);
}
wantUpdate(UpdateType.Update);
x => x.data));
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => x.data.length !== this.old.datasetsDataLengths[i])).length) {
this.old.datasetsDataLengths = this.datasets.map((/**
* @param {?} x
* @return {?}
*/
x => x.data.length));
wantUpdate(UpdateType.Update);
}
if (!!this.colors !== this.old.colorsExists) {
this.old.colorsExists = !!this.colors;
this.updateColors();
wantUpdate(UpdateType.Update);
}
// This smells of inefficiency, might need to revisit this
if (this.colors && this.colors.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => !this.colorsEqual(x, this.old.colors[i]))).length) {
this.old.colors = this.colors.map((/**
* @param {?} x
* @return {?}
*/
x => this.copyColor(x)));
this.updateColors();
wantUpdate(UpdateType.Update);
}
if (!!this.labels !== this.old.labelsExist) {
this.old.labelsExist = !!this.labels;
wantUpdate(UpdateType.Update);
}
if (this.labels && this.labels.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => !this.labelsEqual(x, this.old.labels[i]))).length) {
this.old.labels = this.labels.map((/**
* @param {?} x
* @return {?}
*/
x => this.copyLabel(x)));
wantUpdate(UpdateType.Update);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Default:
break;
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
this.refresh();
break;
}
}
/**
* @param {?} a
* @return {?}
*/
copyLabel(a) {
if (Array.isArray(a)) {
return [...a];
}
return a;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
labelsEqual(a, b) {
return Array.isArray(a) === Array.isArray(b)
&& (Array.isArray(a) || a === b)
&& (!Array.isArray(a) || a.length === b.length)
&& (!Array.isArray(a) || a.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
(x, i) => x !== b[i])).length === 0);
}
/**
* @param {?} a
* @return {?}
*/
copyColor(a) {
/** @type {?} */
const rc = {
backgroundColor: a.backgroundColor,
borderWidth: a.borderWidth,
borderColor: a.borderColor,
borderCapStyle: a.borderCapStyle,
borderDash: a.borderDash,
borderDashOffset: a.borderDashOffset,
borderJoinStyle: a.borderJoinStyle,
pointBorderColor: a.pointBorderColor,
pointBackgroundColor: a.pointBackgroundColor,
pointBorderWidth: a.pointBorderWidth,
pointRadius: a.pointRadius,
pointHoverRadius: a.pointHoverRadius,
pointHitRadius: a.pointHitRadius,
pointHoverBackgroundColor: a.pointHoverBackgroundColor,
pointHoverBorderColor: a.pointHoverBorderColor,
pointHoverBorderWidth: a.pointHoverBorderWidth,
pointStyle: a.pointStyle,
hoverBackgroundColor: a.hoverBackgroundColor,
hoverBorderColor: a.hoverBorderColor,
hoverBorderWidth: a.hoverBorderWidth,
};
return rc;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
colorsEqual(a, b) {
if (!a !== !b) {
return false;
}
return !a || a.backgroundColor === b.backgroundColor
&& (a.borderWidth === b.borderWidth)
&& (a.borderColor === b.borderColor)
&& (a.borderCapStyle === b.borderCapStyle)
&& (a.borderDash === b.borderDash)
&& (a.borderDashOffset === b.borderDashOffset)
&& (a.borderJoinStyle === b.borderJoinStyle)
&& (a.pointBorderColor === b.pointBorderColor)
&& (a.pointBackgroundColor === b.pointBackgroundColor)
&& (a.pointBorderWidth === b.pointBorderWidth)
&& (a.pointRadius === b.pointRadius)
&& (a.pointHoverRadius === b.pointHoverRadius)
&& (a.pointHitRadius === b.pointHitRadius)
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor)
&& (a.pointHoverBorderColor === b.pointHoverBorderColor)
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth)
&& (a.pointStyle === b.pointStyle)
&& (a.hoverBackgroundColor === b.hoverBackgroundColor)
&& (a.hoverBorderColor === b.hoverBorderColor)
&& (a.hoverBorderWidth === b.hoverBorderWidth);
}
/**
* @return {?}
*/
updateColors() {
this.datasets.forEach((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
(elm, index) => {
if (this.colors && this.colors[index]) {
Object.assign(elm, this.colors[index]);
}
if (changes.hasOwnProperty('labels')) {
else {
Object.assign(elm, getColors(this.chartType, index, elm.data.length), Object.assign({}, elm));
}
}));
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
/** @type {?} */
let updateRequired = UpdateType.Default;
/** @type {?} */
const wantUpdate = (/**
* @param {?} x
* @return {?}
*/
(x) => {
updateRequired = x > updateRequired ? x : updateRequired;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') && changes.data.currentValue) {
this.propagateDataToDatasets(changes.data.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) {
this.propagateDatasetsToData(changes.datasets.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('labels')) {
if (this.chart) {
this.chart.data.labels = changes.labels.currentValue;
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
if (this.chart) {
this.chart.config.options.legend.display = changes.legend.currentValue;
this.chart.generateLegend();
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
}

@@ -362,3 +583,5 @@ /**

update(duration, lazy) {
return this.chart.update(duration, lazy);
if (this.chart) {
return this.chart.update(duration, lazy);
}
}

@@ -388,6 +611,5 @@ /**

/**
* @param {?} ctx
* @return {?}
*/
getChartBuilder(ctx /*, data:any[], options:any*/) {
getChartConfiguration() {
/** @type {?} */

@@ -431,3 +653,3 @@ const datasets = this.getDatasets();

data: {
labels: this.labels,
labels: this.labels || [],
datasets

@@ -438,2 +660,11 @@ },

};
return chartConfig;
}
/**
* @param {?} ctx
* @return {?}
*/
getChartBuilder(ctx /*, data:any[], options:any*/) {
/** @type {?} */
const chartConfig = this.getChartConfiguration();
return new Chart(ctx, chartConfig);

@@ -487,12 +718,2 @@ }

* @private
* @param {?} v
* @return {?}
*/
isChartDataSetsArray(v) {
/** @type {?} */
const elm = v[0];
return (typeof (elm) === 'object') && 'data' in elm;
}
/**
* @private
* @param {?} label

@@ -522,9 +743,25 @@ * @return {?}

* @private
* @param {?} datasets
* @return {?}
*/
propagateDatasetsToData(datasets) {
this.data = this.datasets.map((/**
* @param {?} r
* @return {?}
*/
r => r.data));
if (this.chart) {
this.chart.data.datasets = datasets;
}
this.updateColors();
}
/**
* @private
* @param {?} newDataValues
* @return {?}
*/
updateChartData(newDataValues) {
if (this.isChartDataSetsArray(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach((/**
propagateDataToDatasets(newDataValues) {
if (this.isMultiDataSet(newDataValues)) {
if (this.datasets && newDataValues.length === this.datasets.length) {
this.datasets.forEach((/**
* @param {?} dataset

@@ -535,20 +772,2 @@ * @param {?} i

(dataset, i) => {
dataset.data = newDataValues[i].data;
if (newDataValues[i].label) {
dataset.label = newDataValues[i].label;
}
}));
}
else {
this.chart.data.datasets = [...newDataValues];
}
}
else if (!this.isSingleDataSet(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach((/**
* @param {?} dataset
* @param {?} i
* @return {?}
*/
(dataset, i) => {
dataset.data = newDataValues[i];

@@ -558,3 +777,3 @@ }));

else {
this.chart.data.datasets = newDataValues.map((/**
this.datasets = newDataValues.map((/**
* @param {?} data

@@ -567,20 +786,20 @@ * @param {?} index

}));
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
}
else {
this.chart.data.datasets[0].data = newDataValues;
}
this.chart.data.datasets.forEach((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
(elm, index) => {
if (this.colors && this.colors[index]) {
Object.assign(elm, this.colors[index]);
if (!this.datasets) {
this.datasets = [{ data: newDataValues }];
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
else {
Object.assign(elm, getColors(this.chartType, index, elm.data.length));
this.datasets[0].data = newDataValues;
this.datasets.splice(1); // Remove all elements but the first
}
}));
}
this.updateColors();
}

@@ -592,4 +811,4 @@ /**

*/
isSingleDataSet(data) {
return !Array.isArray(data[0]);
isMultiDataSet(data) {
return Array.isArray(data[0]);
}

@@ -601,45 +820,14 @@ /**

getDatasets() {
/** @type {?} */
let datasets = void 0;
// in case if datasets is not provided, but data is present
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) {
if (!this.isSingleDataSet(this.data)) {
datasets = this.data.map((/**
* @param {?} data
* @param {?} index
* @return {?}
*/
(data, index) => {
return { data, label: this.joinLabel(this.labels[index]) || `Label ${index}` };
}));
}
else {
datasets = [{ data: this.data, label: `Label 0` }];
}
if (!this.datasets && !this.data) {
throw new Error(`ng-charts configuration error, data or datasets field are required to render chart ${this.chartType}`);
}
if (this.datasets && this.datasets.length ||
(datasets && datasets.length)) {
datasets = (this.datasets || datasets)
.map((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
(elm, index) => {
/** @type {?} */
const newElm = Object.assign({}, elm);
if (this.colors && this.colors.length) {
Object.assign(newElm, this.colors[index]);
}
else {
Object.assign(newElm, getColors(this.chartType, index, newElm.data.length));
}
return newElm;
}));
// If `datasets` is defined, use it over the `data` property.
if (this.datasets) {
this.propagateDatasetsToData(this.datasets);
return this.datasets;
}
if (!datasets) {
throw new Error(`ng-charts configuration error,
data or datasets field are required to render chart ${this.chartType}`);
if (this.data) {
this.propagateDataToDatasets(this.data);
return this.datasets;
}
return datasets;
}

@@ -659,3 +847,5 @@ /**

}
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
if (this.ctx) {
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
}
}

@@ -662,0 +852,0 @@ }

@@ -1,4 +0,4 @@

import { __spread } from 'tslib';
import { __spread, __assign } from 'tslib';
import { Chart } from 'chart.js';
import { Injectable, NgModule, EventEmitter, Directive, ElementRef, Input, Output, defineInjectable } from '@angular/core';
import { Injectable, NgModule, defineInjectable, EventEmitter, Directive, ElementRef, Input, Output } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@@ -254,3 +254,14 @@ import { cloneDeep } from 'lodash';

this.chartHover = new EventEmitter();
this.initFlag = false;
this.old = {
dataExists: false,
dataLength: 0,
datasetsExists: false,
datasetsLength: 0,
datasetsDataObjects: [],
datasetsDataLengths: [],
colorsExists: false,
colors: [],
labelsExist: false,
labels: [],
};
this.subs = [];

@@ -294,6 +305,3 @@ }

this.ctx = this.element.nativeElement.getContext('2d');
this.initFlag = true;
if (this.data || this.datasets) {
this.refresh();
}
this.refresh();
this.subs.push(this.themeService.colorschemesOptions.subscribe((/**

@@ -319,2 +327,240 @@ * @param {?} r

/**
* @return {?}
*/
BaseChartDirective.prototype.ngDoCheck = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.chart) {
return;
}
/** @type {?} */
var updateRequired = UpdateType.Default;
/** @type {?} */
var wantUpdate = (/**
* @param {?} x
* @return {?}
*/
function (x) {
updateRequired = x > updateRequired ? x : updateRequired;
});
if (!!this.data !== this.old.dataExists) {
this.propagateDataToDatasets(this.data);
this.old.dataExists = !!this.data;
wantUpdate(UpdateType.Update);
}
if (this.data && this.data.length !== this.old.dataLength) {
this.old.dataLength = this.data && this.data.length || 0;
wantUpdate(UpdateType.Update);
}
if (!!this.datasets !== this.old.datasetsExists) {
this.old.datasetsExists = !!this.datasets;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.length !== this.old.datasetsLength) {
this.old.datasetsLength = this.datasets && this.datasets.length || 0;
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
function (x, i) { return x.data !== _this.old.datasetsDataObjects[i]; })).length) {
this.old.datasetsDataObjects = this.datasets.map((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.data; }));
wantUpdate(UpdateType.Update);
}
if (this.datasets && this.datasets.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
function (x, i) { return x.data.length !== _this.old.datasetsDataLengths[i]; })).length) {
this.old.datasetsDataLengths = this.datasets.map((/**
* @param {?} x
* @return {?}
*/
function (x) { return x.data.length; }));
wantUpdate(UpdateType.Update);
}
if (!!this.colors !== this.old.colorsExists) {
this.old.colorsExists = !!this.colors;
this.updateColors();
wantUpdate(UpdateType.Update);
}
// This smells of inefficiency, might need to revisit this
if (this.colors && this.colors.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
function (x, i) { return !_this.colorsEqual(x, _this.old.colors[i]); })).length) {
this.old.colors = this.colors.map((/**
* @param {?} x
* @return {?}
*/
function (x) { return _this.copyColor(x); }));
this.updateColors();
wantUpdate(UpdateType.Update);
}
if (!!this.labels !== this.old.labelsExist) {
this.old.labelsExist = !!this.labels;
wantUpdate(UpdateType.Update);
}
if (this.labels && this.labels.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
function (x, i) { return !_this.labelsEqual(x, _this.old.labels[i]); })).length) {
this.old.labels = this.labels.map((/**
* @param {?} x
* @return {?}
*/
function (x) { return _this.copyLabel(x); }));
wantUpdate(UpdateType.Update);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Default:
break;
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
this.refresh();
break;
}
};
/**
* @param {?} a
* @return {?}
*/
BaseChartDirective.prototype.copyLabel = /**
* @param {?} a
* @return {?}
*/
function (a) {
if (Array.isArray(a)) {
return __spread(a);
}
return a;
};
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
BaseChartDirective.prototype.labelsEqual = /**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
return Array.isArray(a) === Array.isArray(b)
&& (Array.isArray(a) || a === b)
&& (!Array.isArray(a) || a.length === b.length)
&& (!Array.isArray(a) || a.filter((/**
* @param {?} x
* @param {?} i
* @return {?}
*/
function (x, i) { return x !== b[i]; })).length === 0);
};
/**
* @param {?} a
* @return {?}
*/
BaseChartDirective.prototype.copyColor = /**
* @param {?} a
* @return {?}
*/
function (a) {
/** @type {?} */
var rc = {
backgroundColor: a.backgroundColor,
borderWidth: a.borderWidth,
borderColor: a.borderColor,
borderCapStyle: a.borderCapStyle,
borderDash: a.borderDash,
borderDashOffset: a.borderDashOffset,
borderJoinStyle: a.borderJoinStyle,
pointBorderColor: a.pointBorderColor,
pointBackgroundColor: a.pointBackgroundColor,
pointBorderWidth: a.pointBorderWidth,
pointRadius: a.pointRadius,
pointHoverRadius: a.pointHoverRadius,
pointHitRadius: a.pointHitRadius,
pointHoverBackgroundColor: a.pointHoverBackgroundColor,
pointHoverBorderColor: a.pointHoverBorderColor,
pointHoverBorderWidth: a.pointHoverBorderWidth,
pointStyle: a.pointStyle,
hoverBackgroundColor: a.hoverBackgroundColor,
hoverBorderColor: a.hoverBorderColor,
hoverBorderWidth: a.hoverBorderWidth,
};
return rc;
};
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
BaseChartDirective.prototype.colorsEqual = /**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) {
if (!a !== !b) {
return false;
}
return !a || a.backgroundColor === b.backgroundColor
&& (a.borderWidth === b.borderWidth)
&& (a.borderColor === b.borderColor)
&& (a.borderCapStyle === b.borderCapStyle)
&& (a.borderDash === b.borderDash)
&& (a.borderDashOffset === b.borderDashOffset)
&& (a.borderJoinStyle === b.borderJoinStyle)
&& (a.pointBorderColor === b.pointBorderColor)
&& (a.pointBackgroundColor === b.pointBackgroundColor)
&& (a.pointBorderWidth === b.pointBorderWidth)
&& (a.pointRadius === b.pointRadius)
&& (a.pointHoverRadius === b.pointHoverRadius)
&& (a.pointHitRadius === b.pointHitRadius)
&& (a.pointHoverBackgroundColor === b.pointHoverBackgroundColor)
&& (a.pointHoverBorderColor === b.pointHoverBorderColor)
&& (a.pointHoverBorderWidth === b.pointHoverBorderWidth)
&& (a.pointStyle === b.pointStyle)
&& (a.hoverBackgroundColor === b.hoverBackgroundColor)
&& (a.hoverBorderColor === b.hoverBorderColor)
&& (a.hoverBorderWidth === b.hoverBorderWidth);
};
/**
* @return {?}
*/
BaseChartDirective.prototype.updateColors = /**
* @return {?}
*/
function () {
var _this = this;
this.datasets.forEach((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
function (elm, index) {
if (_this.colors && _this.colors[index]) {
Object.assign(elm, _this.colors[index]);
}
else {
Object.assign(elm, getColors(_this.chartType, index, elm.data.length), __assign({}, elm));
}
}));
};
/**
* @param {?} changes

@@ -328,45 +574,46 @@ * @return {?}

function (changes) {
if (this.initFlag) {
/** @type {?} */
var updateRequired_1 = UpdateType.Default;
/** @type {?} */
var wantUpdate = (/**
* @param {?} x
* @return {?}
*/
function (x) {
updateRequired_1 = x > updateRequired_1 ? x : updateRequired_1;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') || changes.hasOwnProperty('datasets')) {
if (changes.data) {
this.updateChartData(changes.data.currentValue);
}
else {
this.updateChartData(changes.datasets.currentValue);
}
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('labels')) {
/** @type {?} */
var updateRequired = UpdateType.Default;
/** @type {?} */
var wantUpdate = (/**
* @param {?} x
* @return {?}
*/
function (x) {
updateRequired = x > updateRequired ? x : updateRequired;
});
// Check if the changes are in the data or datasets or labels or legend
if (changes.hasOwnProperty('data') && changes.data.currentValue) {
this.propagateDataToDatasets(changes.data.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('datasets') && changes.datasets.currentValue) {
this.propagateDatasetsToData(changes.datasets.currentValue);
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('labels')) {
if (this.chart) {
this.chart.data.labels = changes.labels.currentValue;
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('legend')) {
if (this.chart) {
this.chart.config.options.legend.display = changes.legend.currentValue;
this.chart.generateLegend();
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch ((/** @type {?} */ (updateRequired_1))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
wantUpdate(UpdateType.Update);
}
if (changes.hasOwnProperty('options')) {
wantUpdate(UpdateType.Refresh);
}
switch ((/** @type {?} */ (updateRequired))) {
case UpdateType.Update:
this.update();
break;
case UpdateType.Refresh:
case UpdateType.Default:
this.refresh();
break;
}
};

@@ -401,3 +648,5 @@ /**

function (duration, lazy) {
return this.chart.update(duration, lazy);
if (this.chart) {
return this.chart.update(duration, lazy);
}
};

@@ -439,10 +688,8 @@ /**

/**
* @param {?} ctx
* @return {?}
*/
BaseChartDirective.prototype.getChartBuilder = /**
* @param {?} ctx
BaseChartDirective.prototype.getChartConfiguration = /**
* @return {?}
*/
function (ctx /*, data:any[], options:any*/) {
function () {
var _this = this;

@@ -487,3 +734,3 @@ /** @type {?} */

data: {
labels: this.labels,
labels: this.labels || [],
datasets: datasets

@@ -494,2 +741,15 @@ },

};
return chartConfig;
};
/**
* @param {?} ctx
* @return {?}
*/
BaseChartDirective.prototype.getChartBuilder = /**
* @param {?} ctx
* @return {?}
*/
function (ctx /*, data:any[], options:any*/) {
/** @type {?} */
var chartConfig = this.getChartConfiguration();
return new Chart(ctx, chartConfig);

@@ -551,17 +811,2 @@ };

* @private
* @param {?} v
* @return {?}
*/
BaseChartDirective.prototype.isChartDataSetsArray = /**
* @private
* @param {?} v
* @return {?}
*/
function (v) {
/** @type {?} */
var elm = v[0];
return (typeof (elm) === 'object') && 'data' in elm;
};
/**
* @private
* @param {?} label

@@ -601,6 +846,27 @@ * @return {?}

* @private
* @param {?} datasets
* @return {?}
*/
BaseChartDirective.prototype.propagateDatasetsToData = /**
* @private
* @param {?} datasets
* @return {?}
*/
function (datasets) {
this.data = this.datasets.map((/**
* @param {?} r
* @return {?}
*/
function (r) { return r.data; }));
if (this.chart) {
this.chart.data.datasets = datasets;
}
this.updateColors();
};
/**
* @private
* @param {?} newDataValues
* @return {?}
*/
BaseChartDirective.prototype.updateChartData = /**
BaseChartDirective.prototype.propagateDataToDatasets = /**
* @private

@@ -612,5 +878,5 @@ * @param {?} newDataValues

var _this = this;
if (this.isChartDataSetsArray(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach((/**
if (this.isMultiDataSet(newDataValues)) {
if (this.datasets && newDataValues.length === this.datasets.length) {
this.datasets.forEach((/**
* @param {?} dataset

@@ -621,20 +887,2 @@ * @param {?} i

function (dataset, i) {
dataset.data = newDataValues[i].data;
if (newDataValues[i].label) {
dataset.label = newDataValues[i].label;
}
}));
}
else {
this.chart.data.datasets = __spread(newDataValues);
}
}
else if (!this.isSingleDataSet(newDataValues)) {
if (newDataValues.length === this.chart.data.datasets.length) {
this.chart.data.datasets.forEach((/**
* @param {?} dataset
* @param {?} i
* @return {?}
*/
function (dataset, i) {
dataset.data = newDataValues[i];

@@ -644,3 +892,3 @@ }));

else {
this.chart.data.datasets = newDataValues.map((/**
this.datasets = newDataValues.map((/**
* @param {?} data

@@ -653,20 +901,20 @@ * @param {?} index

}));
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
}
else {
this.chart.data.datasets[0].data = newDataValues;
}
this.chart.data.datasets.forEach((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
function (elm, index) {
if (_this.colors && _this.colors[index]) {
Object.assign(elm, _this.colors[index]);
if (!this.datasets) {
this.datasets = [{ data: newDataValues }];
if (this.chart) {
this.chart.data.datasets = this.datasets;
}
}
else {
Object.assign(elm, getColors(_this.chartType, index, elm.data.length));
this.datasets[0].data = newDataValues;
this.datasets.splice(1); // Remove all elements but the first
}
}));
}
this.updateColors();
};

@@ -678,3 +926,3 @@ /**

*/
BaseChartDirective.prototype.isSingleDataSet = /**
BaseChartDirective.prototype.isMultiDataSet = /**
* @private

@@ -685,3 +933,3 @@ * @param {?} data

function (data) {
return !Array.isArray(data[0]);
return Array.isArray(data[0]);
};

@@ -697,45 +945,14 @@ /**

function () {
var _this = this;
/** @type {?} */
var datasets = void 0;
// in case if datasets is not provided, but data is present
if (!this.datasets || !this.datasets.length && (this.data && this.data.length)) {
if (!this.isSingleDataSet(this.data)) {
datasets = this.data.map((/**
* @param {?} data
* @param {?} index
* @return {?}
*/
function (data, index) {
return { data: data, label: _this.joinLabel(_this.labels[index]) || "Label " + index };
}));
}
else {
datasets = [{ data: this.data, label: "Label 0" }];
}
if (!this.datasets && !this.data) {
throw new Error("ng-charts configuration error, data or datasets field are required to render chart " + this.chartType);
}
if (this.datasets && this.datasets.length ||
(datasets && datasets.length)) {
datasets = (this.datasets || datasets)
.map((/**
* @param {?} elm
* @param {?} index
* @return {?}
*/
function (elm, index) {
/** @type {?} */
var newElm = Object.assign({}, elm);
if (_this.colors && _this.colors.length) {
Object.assign(newElm, _this.colors[index]);
}
else {
Object.assign(newElm, getColors(_this.chartType, index, newElm.data.length));
}
return newElm;
}));
// If `datasets` is defined, use it over the `data` property.
if (this.datasets) {
this.propagateDatasetsToData(this.datasets);
return this.datasets;
}
if (!datasets) {
throw new Error("ng-charts configuration error,\n data or datasets field are required to render chart " + this.chartType);
if (this.data) {
this.propagateDataToDatasets(this.data);
return this.datasets;
}
return datasets;
};

@@ -759,3 +976,5 @@ /**

}
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
if (this.ctx) {
this.chart = this.getChartBuilder(this.ctx /*, data, this.options*/);
}
};

@@ -762,0 +981,0 @@ BaseChartDirective.decorators = [

@@ -1,2 +0,2 @@

import { OnDestroy, OnChanges, OnInit, EventEmitter, ElementRef, SimpleChanges } from '@angular/core';
import { OnDestroy, OnChanges, OnInit, EventEmitter, ElementRef, SimpleChanges, DoCheck } from '@angular/core';
import * as chartJs from 'chart.js';

@@ -12,3 +12,3 @@ import { Color } from './color';

export declare type Label = SingleLineLabel | MultiLineLabel;
export declare class BaseChartDirective implements OnDestroy, OnChanges, OnInit, OnDestroy {
export declare class BaseChartDirective implements OnDestroy, OnChanges, OnInit, OnDestroy, DoCheck {
private element;

@@ -34,3 +34,3 @@ private themeService;

chart: Chart;
private initFlag;
private old;
private subs;

@@ -45,2 +45,8 @@ /**

private themeChanged;
ngDoCheck(): void;
copyLabel(a: Label): Label;
labelsEqual(a: Label, b: Label): boolean;
copyColor(a: Color): Color;
colorsEqual(a: Color, b: Color): boolean;
updateColors(): void;
ngOnChanges(changes: SimpleChanges): void;

@@ -52,11 +58,12 @@ ngOnDestroy(): void;

toBase64Image(): string;
getChartConfiguration(): chartJs.ChartConfiguration;
getChartBuilder(ctx: string): Chart;
smartMerge(options: any, overrides: any, level?: number): any;
private isChartDataSetsArray;
private isMultiLineLabel;
private joinLabel;
private updateChartData;
private isSingleDataSet;
private propagateDatasetsToData;
private propagateDataToDatasets;
private isMultiDataSet;
private getDatasets;
private refresh;
}

@@ -1,1 +0,1 @@

{"__symbolic":"module","version":4,"metadata":{"ChartsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":3,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"BaseChartDirective"}],"imports":[],"exports":[{"__symbolic":"reference","name":"BaseChartDirective"}]}]}],"members":{}},"SingleDataSet":{"__symbolic":"interface"},"MultiDataSet":{"__symbolic":"interface"},"SingleOrMultiDataSet":{"__symbolic":"interface"},"PluginServiceGlobalRegistrationAndOptions":{"__symbolic":"interface"},"SingleLineLabel":{"__symbolic":"interface"},"MultiLineLabel":{"__symbolic":"interface"},"Label":{"__symbolic":"interface"},"BaseChartDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":33,"character":1},"arguments":[{"selector":"canvas[baseChart]","exportAs":"base-chart"}]}],"members":{"data":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":39,"character":3}}]}],"datasets":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":40,"character":3}}]}],"labels":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":41,"character":3}}]}],"options":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":42,"character":3}}]}],"chartType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":43,"character":3}}]}],"colors":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":44,"character":3}}]}],"legend":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":45,"character":3}}]}],"plugins":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":46,"character":3}}]}],"chartClick":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":48,"character":3}}]}],"chartHover":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":49,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":69,"character":21},{"__symbolic":"reference","name":"ThemeService"}]}],"ngOnInit":[{"__symbolic":"method"}],"themeChanged":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"update":[{"__symbolic":"method"}],"hideDataset":[{"__symbolic":"method"}],"isDatasetHidden":[{"__symbolic":"method"}],"toBase64Image":[{"__symbolic":"method"}],"getChartBuilder":[{"__symbolic":"method"}],"smartMerge":[{"__symbolic":"method"}],"isChartDataSetsArray":[{"__symbolic":"method"}],"isMultiLineLabel":[{"__symbolic":"method"}],"joinLabel":[{"__symbolic":"method"}],"updateChartData":[{"__symbolic":"method"}],"isSingleDataSet":[{"__symbolic":"method"}],"getDatasets":[{"__symbolic":"method"}],"refresh":[{"__symbolic":"method"}]}},"Color":{"__symbolic":"interface"},"Colors":{"__symbolic":"interface"},"defaultColors":[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]],"ThemeService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":4,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"setColorschemesOptions":[{"__symbolic":"method"}],"getColorschemesOptions":[{"__symbolic":"method"}]},"statics":{"ngInjectableDef":{}}}},"origins":{"ChartsModule":"./lib/charts.module","SingleDataSet":"./lib/base-chart.directive","MultiDataSet":"./lib/base-chart.directive","SingleOrMultiDataSet":"./lib/base-chart.directive","PluginServiceGlobalRegistrationAndOptions":"./lib/base-chart.directive","SingleLineLabel":"./lib/base-chart.directive","MultiLineLabel":"./lib/base-chart.directive","Label":"./lib/base-chart.directive","BaseChartDirective":"./lib/base-chart.directive","Color":"./lib/color","Colors":"./lib/colors","defaultColors":"./lib/default-colors","ThemeService":"./lib/theme.service"},"importAs":"ng2-charts"}
{"__symbolic":"module","version":4,"metadata":{"ChartsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":3,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"BaseChartDirective"}],"imports":[],"exports":[{"__symbolic":"reference","name":"BaseChartDirective"}]}]}],"members":{}},"SingleDataSet":{"__symbolic":"interface"},"MultiDataSet":{"__symbolic":"interface"},"SingleOrMultiDataSet":{"__symbolic":"interface"},"PluginServiceGlobalRegistrationAndOptions":{"__symbolic":"interface"},"SingleLineLabel":{"__symbolic":"interface"},"MultiLineLabel":{"__symbolic":"interface"},"Label":{"__symbolic":"interface"},"BaseChartDirective":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":47,"character":1},"arguments":[{"selector":"canvas[baseChart]","exportAs":"base-chart"}]}],"members":{"data":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":53,"character":3}}]}],"datasets":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":54,"character":3}}]}],"labels":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":55,"character":3}}]}],"options":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":56,"character":3}}]}],"chartType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3}}]}],"colors":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":58,"character":3}}]}],"legend":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":59,"character":3}}]}],"plugins":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3}}]}],"chartClick":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":62,"character":3}}]}],"chartHover":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":63,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":95,"character":21},{"__symbolic":"reference","name":"ThemeService"}]}],"ngOnInit":[{"__symbolic":"method"}],"themeChanged":[{"__symbolic":"method"}],"ngDoCheck":[{"__symbolic":"method"}],"copyLabel":[{"__symbolic":"method"}],"labelsEqual":[{"__symbolic":"method"}],"copyColor":[{"__symbolic":"method"}],"colorsEqual":[{"__symbolic":"method"}],"updateColors":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"update":[{"__symbolic":"method"}],"hideDataset":[{"__symbolic":"method"}],"isDatasetHidden":[{"__symbolic":"method"}],"toBase64Image":[{"__symbolic":"method"}],"getChartConfiguration":[{"__symbolic":"method"}],"getChartBuilder":[{"__symbolic":"method"}],"smartMerge":[{"__symbolic":"method"}],"isMultiLineLabel":[{"__symbolic":"method"}],"joinLabel":[{"__symbolic":"method"}],"propagateDatasetsToData":[{"__symbolic":"method"}],"propagateDataToDatasets":[{"__symbolic":"method"}],"isMultiDataSet":[{"__symbolic":"method"}],"getDatasets":[{"__symbolic":"method"}],"refresh":[{"__symbolic":"method"}]}},"Color":{"__symbolic":"interface"},"Colors":{"__symbolic":"interface"},"defaultColors":[[255,99,132],[54,162,235],[255,206,86],[231,233,237],[75,192,192],[151,187,205],[220,220,220],[247,70,74],[70,191,189],[253,180,92],[148,159,177],[77,83,96]],"ThemeService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":4,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"setColorschemesOptions":[{"__symbolic":"method"}],"getColorschemesOptions":[{"__symbolic":"method"}]},"statics":{"ngInjectableDef":{}}}},"origins":{"ChartsModule":"./lib/charts.module","SingleDataSet":"./lib/base-chart.directive","MultiDataSet":"./lib/base-chart.directive","SingleOrMultiDataSet":"./lib/base-chart.directive","PluginServiceGlobalRegistrationAndOptions":"./lib/base-chart.directive","SingleLineLabel":"./lib/base-chart.directive","MultiLineLabel":"./lib/base-chart.directive","Label":"./lib/base-chart.directive","BaseChartDirective":"./lib/base-chart.directive","Color":"./lib/color","Colors":"./lib/colors","defaultColors":"./lib/default-colors","ThemeService":"./lib/theme.service"},"importAs":"ng2-charts"}
{
"name": "ng2-charts",
"version": "2.0.4",
"version": "2.1.0",
"peerDependencies": {

@@ -5,0 +5,0 @@ "@angular/common": "^7.2.0",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc