/*! * chartjs-plugin-datalabels v2.2.0 * https://chartjs-plugin-datalabels.netlify.app * (c) 2017-2022 chartjs-plugin-datalabels contributors * Released under the MIT license */ !(function (t, e) { 'object' == typeof exports && 'undefined' != typeof module ? (module.exports = e(require('chart.js/helpers'), require('chart.js'))) : 'function' == typeof define && define.amd ? define(['chart.js/helpers', 'chart.js'], e) : ((t = 'undefined' != typeof globalThis ? globalThis : t || self).ChartDataLabels = e(t.Chart.helpers, t.Chart)); })(this, function (t, e) { 'use strict'; var r = (function () { if ('undefined' != typeof window) { if (window.devicePixelRatio) return window.devicePixelRatio; var t = window.screen; if (t) return (t.deviceXDPI || 1) / (t.logicalXDPI || 1); } return 1; })(), a = function (e) { var r, a = []; for (e = [].concat(e); e.length; ) 'string' == typeof (r = e.pop()) ? a.unshift.apply(a, r.split('\n')) : Array.isArray(r) ? e.push.apply(e, r) : t.isNullOrUndef(e) || a.unshift('' + r); return a; }, o = function (t, e, r) { var a, o = [].concat(e), n = o.length, i = t.font, l = 0; for (t.font = r.string, a = 0; a < n; ++a) l = Math.max(t.measureText(o[a]).width, l); return (t.font = i), { height: n * r.lineHeight, width: l }; }, n = function (t, e, r) { return Math.max(t, Math.min(e, r)); }, i = function (t, e) { var r, a, o, n, i = t.slice(), l = []; for (r = 0, o = e.length; r < o; ++r) (n = e[r]), -1 === (a = i.indexOf(n)) ? l.push([n, 1]) : i.splice(a, 1); for (r = 0, o = i.length; r < o; ++r) l.push([i[r], -1]); return l; }; function l(t, e) { var r = e.x, a = e.y; if (null === r) return { x: 0, y: -1 }; if (null === a) return { x: 1, y: 0 }; var o = t.x - r, n = t.y - a, i = Math.sqrt(o * o + n * n); return { x: i ? o / i : 0, y: i ? n / i : -1 }; } function s(t, e, r) { var a = 0; return ( t < r.left ? (a |= 1) : t > r.right && (a |= 2), e < r.top ? (a |= 8) : e > r.bottom && (a |= 4), a ); } function u(t, e) { var r, a, o = e.anchor, n = t; return ( e.clamp && (n = (function (t, e) { for ( var r, a, o, n = t.x0, i = t.y0, l = t.x1, u = t.y1, d = s(n, i, e), c = s(l, u, e); d | c && !(d & c); ) 8 & (r = d || c) ? ((a = n + ((l - n) * (e.top - i)) / (u - i)), (o = e.top)) : 4 & r ? ((a = n + ((l - n) * (e.bottom - i)) / (u - i)), (o = e.bottom)) : 2 & r ? ((o = i + ((u - i) * (e.right - n)) / (l - n)), (a = e.right)) : 1 & r && ((o = i + ((u - i) * (e.left - n)) / (l - n)), (a = e.left)), r === d ? (d = s((n = a), (i = o), e)) : (c = s((l = a), (u = o), e)); return { x0: n, x1: l, y0: i, y1: u }; })(n, e.area)), 'start' === o ? ((r = n.x0), (a = n.y0)) : 'end' === o ? ((r = n.x1), (a = n.y1)) : ((r = (n.x0 + n.x1) / 2), (a = (n.y0 + n.y1) / 2)), (function (t, e, r, a, o) { switch (o) { case 'center': r = a = 0; break; case 'bottom': (r = 0), (a = 1); break; case 'right': (r = 1), (a = 0); break; case 'left': (r = -1), (a = 0); break; case 'top': (r = 0), (a = -1); break; case 'start': (r = -r), (a = -a); break; case 'end': break; default: (o *= Math.PI / 180), (r = Math.cos(o)), (a = Math.sin(o)); } return { x: t, y: e, vx: r, vy: a }; })(r, a, t.vx, t.vy, e.align) ); } var d = function (t, e) { var r = (t.startAngle + t.endAngle) / 2, a = Math.cos(r), o = Math.sin(r), n = t.innerRadius, i = t.outerRadius; return u( { x0: t.x + a * n, y0: t.y + o * n, x1: t.x + a * i, y1: t.y + o * i, vx: a, vy: o, }, e ); }, c = function (t, e) { var r = l(t, e.origin), a = r.x * t.options.radius, o = r.y * t.options.radius; return u( { x0: t.x - a, y0: t.y - o, x1: t.x + a, y1: t.y + o, vx: r.x, vy: r.y, }, e ); }, h = function (t, e) { var r = l(t, e.origin), a = t.x, o = t.y, n = 0, i = 0; return ( t.horizontal ? ((a = Math.min(t.x, t.base)), (n = Math.abs(t.base - t.x))) : ((o = Math.min(t.y, t.base)), (i = Math.abs(t.base - t.y))), u({ x0: a, y0: o + i, x1: a + n, y1: o, vx: r.x, vy: r.y }, e) ); }, f = function (t, e) { var r = l(t, e.origin); return u( { x0: t.x, y0: t.y, x1: t.x + (t.width || 0), y1: t.y + (t.height || 0), vx: r.x, vy: r.y, }, e ); }, x = function (t) { return Math.round(t * r) / r; }; function y(t, e) { var r = e.chart.getDatasetMeta(e.datasetIndex).vScale; if (!r) return null; if (void 0 !== r.xCenter && void 0 !== r.yCenter) return { x: r.xCenter, y: r.yCenter }; var a = r.getBasePixel(); return t.horizontal ? { x: a, y: null } : { x: null, y: a }; } function v(t, e, r) { var a = r.backgroundColor, o = r.borderColor, n = r.borderWidth; (a || (o && n)) && (t.beginPath(), (function (t, e, r, a, o, n) { var i = Math.PI / 2; if (n) { var l = Math.min(n, o / 2, a / 2), s = e + l, u = r + l, d = e + a - l, c = r + o - l; t.moveTo(e, u), s < d && u < c ? (t.arc(s, u, l, -Math.PI, -i), t.arc(d, u, l, -i, 0), t.arc(d, c, l, 0, i), t.arc(s, c, l, i, Math.PI)) : s < d ? (t.moveTo(s, r), t.arc(d, u, l, -i, i), t.arc(s, u, l, i, Math.PI + i)) : u < c ? (t.arc(s, u, l, -Math.PI, 0), t.arc(s, c, l, 0, Math.PI)) : t.arc(s, u, l, -Math.PI, Math.PI), t.closePath(), t.moveTo(e, r); } else t.rect(e, r, a, o); })( t, x(e.x) + n / 2, x(e.y) + n / 2, x(e.w) - n, x(e.h) - n, r.borderRadius ), t.closePath(), a && ((t.fillStyle = a), t.fill()), o && n && ((t.strokeStyle = o), (t.lineWidth = n), (t.lineJoin = 'miter'), t.stroke())); } function b(t, e, r) { var a = t.shadowBlur, o = r.stroked, n = x(r.x), i = x(r.y), l = x(r.w); o && t.strokeText(e, n, i, l), r.filled && (a && o && (t.shadowBlur = 0), t.fillText(e, n, i, l), a && o && (t.shadowBlur = a)); } var _ = function (t, e, r, a) { var o = this; (o._config = t), (o._index = a), (o._model = null), (o._rects = null), (o._ctx = e), (o._el = r); }; t.merge(_.prototype, { _modelize: function (r, a, n, i) { var l, s = this, u = s._index, x = t.toFont(t.resolve([n.font, {}], i, u)), v = t.resolve([n.color, e.defaults.color], i, u); return { align: t.resolve([n.align, 'center'], i, u), anchor: t.resolve([n.anchor, 'center'], i, u), area: i.chart.chartArea, backgroundColor: t.resolve([n.backgroundColor, null], i, u), borderColor: t.resolve([n.borderColor, null], i, u), borderRadius: t.resolve([n.borderRadius, 0], i, u), borderWidth: t.resolve([n.borderWidth, 0], i, u), clamp: t.resolve([n.clamp, !1], i, u), clip: t.resolve([n.clip, !1], i, u), color: v, display: r, font: x, lines: a, offset: t.resolve([n.offset, 4], i, u), opacity: t.resolve([n.opacity, 1], i, u), origin: y(s._el, i), padding: t.toPadding(t.resolve([n.padding, 4], i, u)), positioner: ((l = s._el), l instanceof e.ArcElement ? d : l instanceof e.PointElement ? c : l instanceof e.BarElement ? h : f), rotation: t.resolve([n.rotation, 0], i, u) * (Math.PI / 180), size: o(s._ctx, a, x), textAlign: t.resolve([n.textAlign, 'start'], i, u), textShadowBlur: t.resolve([n.textShadowBlur, 0], i, u), textShadowColor: t.resolve([n.textShadowColor, v], i, u), textStrokeColor: t.resolve([n.textStrokeColor, v], i, u), textStrokeWidth: t.resolve([n.textStrokeWidth, 0], i, u), }; }, update: function (e) { var r, o, n, i = this, l = null, s = null, u = i._index, d = i._config, c = t.resolve([d.display, !0], e, u); c && ((r = e.dataset.data[u]), (o = t.valueOrDefault(t.callback(d.formatter, [r, e]), r)), (n = t.isNullOrUndef(o) ? [] : a(o)).length && (s = (function (t) { var e = t.borderWidth || 0, r = t.padding, a = t.size.height, o = t.size.width, n = -o / 2, i = -a / 2; return { frame: { x: n - r.left - e, y: i - r.top - e, w: o + r.width + 2 * e, h: a + r.height + 2 * e, }, text: { x: n, y: i, w: o, h: a }, }; })((l = i._modelize(c, n, d, e))))), (i._model = l), (i._rects = s); }, geometry: function () { return this._rects ? this._rects.frame : {}; }, rotation: function () { return this._model ? this._model.rotation : 0; }, visible: function () { return this._model && this._model.opacity; }, model: function () { return this._model; }, draw: function (t, e) { var r, a = t.ctx, o = this._model, i = this._rects; this.visible() && (a.save(), o.clip && ((r = o.area), a.beginPath(), a.rect(r.left, r.top, r.right - r.left, r.bottom - r.top), a.clip()), (a.globalAlpha = n(0, o.opacity, 1)), a.translate(x(e.x), x(e.y)), a.rotate(o.rotation), v(a, i.frame, o), (function (t, e, r, a) { var o, n = a.textAlign, i = a.color, l = !!i, s = a.font, u = e.length, d = a.textStrokeColor, c = a.textStrokeWidth, h = d && c; if (u && (l || h)) for ( r = (function (t, e, r) { var a = r.lineHeight, o = t.w, n = t.x; return ( 'center' === e ? (n += o / 2) : ('end' !== e && 'right' !== e) || (n += o), { h: a, w: o, x: n, y: t.y + a / 2 } ); })(r, n, s), t.font = s.string, t.textAlign = n, t.textBaseline = 'middle', t.shadowBlur = a.textShadowBlur, t.shadowColor = a.textShadowColor, l && (t.fillStyle = i), h && ((t.lineJoin = 'round'), (t.lineWidth = c), (t.strokeStyle = d)), o = 0, u = e.length; o < u; ++o ) b(t, e[o], { stroked: h, filled: l, w: r.w, x: r.x, y: r.y + r.h * o, }); })(a, o.lines, i.text, o), a.restore()); }, }); var p = Number.MIN_SAFE_INTEGER || -9007199254740991, g = Number.MAX_SAFE_INTEGER || 9007199254740991; function m(t, e, r) { var a = Math.cos(r), o = Math.sin(r), n = e.x, i = e.y; return { x: n + a * (t.x - n) - o * (t.y - i), y: i + o * (t.x - n) + a * (t.y - i), }; } function w(t, e) { var r, a, o, n, i, l = g, s = p, u = e.origin; for (r = 0; r < t.length; ++r) (o = (a = t[r]).x - u.x), (n = a.y - u.y), (i = e.vx * o + e.vy * n), (l = Math.min(l, i)), (s = Math.max(s, i)); return { min: l, max: s }; } function M(t, e) { var r = e.x - t.x, a = e.y - t.y, o = Math.sqrt(r * r + a * a); return { vx: (e.x - t.x) / o, vy: (e.y - t.y) / o, origin: t, ln: o }; } var k = function () { (this._rotation = 0), (this._rect = { x: 0, y: 0, w: 0, h: 0 }); }; function $(t, e, r) { var a = e.positioner(t, e), o = a.vx, n = a.vy; if (!o && !n) return { x: a.x, y: a.y }; var i = r.w, l = r.h, s = e.rotation, u = Math.abs((i / 2) * Math.cos(s)) + Math.abs((l / 2) * Math.sin(s)), d = Math.abs((i / 2) * Math.sin(s)) + Math.abs((l / 2) * Math.cos(s)), c = 1 / Math.max(Math.abs(o), Math.abs(n)); return ( (u *= o * c), (d *= n * c), (u += e.offset * o), (d += e.offset * n), { x: a.x + u, y: a.y + d } ); } t.merge(k.prototype, { center: function () { var t = this._rect; return { x: t.x + t.w / 2, y: t.y + t.h / 2 }; }, update: function (t, e, r) { (this._rotation = r), (this._rect = { x: e.x + t.x, y: e.y + t.y, w: e.w, h: e.h }); }, contains: function (t) { var e = this, r = e._rect; return !( (t = m(t, e.center(), -e._rotation)).x < r.x - 1 || t.y < r.y - 1 || t.x > r.x + r.w + 2 || t.y > r.y + r.h + 2 ); }, intersects: function (t) { var e, r, a, o = this._points(), n = t._points(), i = [M(o[0], o[1]), M(o[0], o[3])]; for ( this._rotation !== t._rotation && i.push(M(n[0], n[1]), M(n[0], n[3])), e = 0; e < i.length; ++e ) if ( ((r = w(o, i[e])), (a = w(n, i[e])), r.max < a.min || a.max < r.min) ) return !1; return !0; }, _points: function () { var t = this, e = t._rect, r = t._rotation, a = t.center(); return [ m({ x: e.x, y: e.y }, a, r), m({ x: e.x + e.w, y: e.y }, a, r), m({ x: e.x + e.w, y: e.y + e.h }, a, r), m({ x: e.x, y: e.y + e.h }, a, r), ]; }, }); var C = { prepare: function (t) { var e, r, a, o, n, i = []; for (e = 0, a = t.length; e < a; ++e) for (r = 0, o = t[e].length; r < o; ++r) (n = t[e][r]), i.push(n), (n.$layout = { _box: new k(), _hidable: !1, _visible: !0, _set: e, _idx: n._index, }); return ( i.sort(function (t, e) { var r = t.$layout, a = e.$layout; return r._idx === a._idx ? a._set - r._set : a._idx - r._idx; }), this.update(i), i ); }, update: function (t) { var e, r, a, o, n, i = !1; for (e = 0, r = t.length; e < r; ++e) (o = (a = t[e]).model()), ((n = a.$layout)._hidable = o && 'auto' === o.display), (n._visible = a.visible()), (i |= n._hidable); i && (function (t) { var e, r, a, o, n, i, l; for (e = 0, r = t.length; e < r; ++e) (o = (a = t[e]).$layout)._visible && ((l = new Proxy(a._el, { get: (t, e) => t.getProps([e], !0)[e], })), (n = a.geometry()), (i = $(l, a.model(), n)), o._box.update(i, n, a.rotation())); (function (t, e) { var r, a, o, n; for (r = t.length - 1; r >= 0; --r) for (o = t[r].$layout, a = r - 1; a >= 0 && o._visible; --a) (n = t[a].$layout)._visible && o._box.intersects(n._box) && e(o, n); })(t, function (t, e) { var r = t._hidable, a = e._hidable; (r && a) || a ? (e._visible = !1) : r && (t._visible = !1); }); })(t); }, lookup: function (t, e) { var r, a; for (r = t.length - 1; r >= 0; --r) if ((a = t[r].$layout) && a._visible && a._box.contains(e)) return t[r]; return null; }, draw: function (t, e) { var r, a, o, n, i, l; for (r = 0, a = e.length; r < a; ++r) (n = (o = e[r]).$layout)._visible && ((i = o.geometry()), (l = $(o._el, o.model(), i)), n._box.update(l, i, o.rotation()), o.draw(t, l)); }, }, P = '$default'; function S(e, r, a, o) { if (r) { var n, i = a.$context, l = a.$groups; r[l._set] && (n = r[l._set][l._key]) && !0 === t.callback(n, [i, o]) && ((e.$datalabels._dirty = !0), a.update(i)); } } function I(t, e) { var r, a, o = t.$datalabels, n = o._listeners; if (n.enter || n.leave) { if ('mousemove' === e.type) a = C.lookup(o._labels, e); else if ('mouseout' !== e.type) return; (r = o._hovered), (o._hovered = a), (function (t, e, r, a, o) { var n, i; (r || a) && (r ? (a ? r !== a && (i = n = !0) : (i = !0)) : (n = !0), i && S(t, e.leave, r, o), n && S(t, e.enter, a, o)); })(t, n, r, a, e); } } return { id: 'datalabels', defaults: { align: 'center', anchor: 'center', backgroundColor: null, borderColor: null, borderRadius: 0, borderWidth: 0, clamp: !1, clip: !1, color: void 0, display: !0, font: { family: void 0, lineHeight: 1.2, size: void 0, style: void 0, weight: null, }, formatter: function (e) { if (t.isNullOrUndef(e)) return null; var r, a, o, n = e; if (t.isObject(e)) if (t.isNullOrUndef(e.label)) if (t.isNullOrUndef(e.r)) for (n = '', o = 0, a = (r = Object.keys(e)).length; o < a; ++o) n += (0 !== o ? ', ' : '') + r[o] + ': ' + e[r[o]]; else n = e.r; else n = e.label; return '' + n; }, labels: void 0, listeners: {}, offset: 4, opacity: 1, padding: { top: 4, right: 4, bottom: 4, left: 4 }, rotation: 0, textAlign: 'start', textStrokeColor: void 0, textStrokeWidth: 0, textShadowBlur: 0, textShadowColor: void 0, }, beforeInit: function (t) { t.$datalabels = { _actives: [] }; }, beforeUpdate: function (t) { var e = t.$datalabels; (e._listened = !1), (e._listeners = {}), (e._datasets = []), (e._labels = []); }, afterDatasetUpdate: function (e, r, a) { var o, n, i, l, s, u, d, c, h = r.index, f = e.$datalabels, x = (f._datasets[h] = []), y = e.isDatasetVisible(h), v = e.data.datasets[h], b = (function (e, r) { var a, o, n, i = e.datalabels, l = []; return !1 === i ? null : (!0 === i && (i = {}), (r = t.merge({}, [r, i])), (o = r.labels || {}), (n = Object.keys(o)), delete r.labels, n.length ? n.forEach(function (e) { o[e] && l.push(t.merge({}, [r, o[e], { _key: e }])); }) : l.push(r), (a = l.reduce(function (e, r) { return ( t.each(r.listeners || {}, function (t, a) { (e[a] = e[a] || {}), (e[a][r._key || P] = t); }), delete r.listeners, e ); }, {})), { labels: l, listeners: a }); })(v, a), p = r.meta.data || [], g = e.ctx; for (g.save(), o = 0, i = p.length; o < i; ++o) if ( (((d = p[o]).$datalabels = []), y && d && e.getDataVisibility(o) && !d.skip) ) for (n = 0, l = b.labels.length; n < l; ++n) (u = (s = b.labels[n])._key), ((c = new _(s, g, d, o)).$groups = { _set: h, _key: u || P }), (c.$context = { active: !1, chart: e, dataIndex: o, dataset: v, datasetIndex: h, }), c.update(c.$context), d.$datalabels.push(c), x.push(c); g.restore(), t.merge(f._listeners, b.listeners, { merger: function (t, e, a) { (e[t] = e[t] || {}), (e[t][r.index] = a[t]), (f._listened = !0); }, }); }, afterUpdate: function (t) { t.$datalabels._labels = C.prepare(t.$datalabels._datasets); }, afterDatasetsDraw: function (t) { C.draw(t, t.$datalabels._labels); }, beforeEvent: function (t, e) { if (t.$datalabels._listened) { var r = e.event; switch (r.type) { case 'mousemove': case 'mouseout': I(t, r); break; case 'click': !(function (t, e) { var r = t.$datalabels, a = r._listeners.click, o = a && C.lookup(r._labels, e); o && S(t, a, o, e); })(t, r); } } }, afterEvent: function (t) { var e, r, a, o, n, l, s, u = t.$datalabels, d = u._actives, c = (u._actives = t.getActiveElements()), h = i(d, c); for (e = 0, r = h.length; e < r; ++e) if ((n = h[e])[1]) for ( a = 0, o = (s = n[0].element.$datalabels || []).length; a < o; ++a ) ((l = s[a]).$context.active = 1 === n[1]), l.update(l.$context); (u._dirty || h.length) && (C.update(u._labels), t.render()), delete u._dirty; }, }; });